转行4年
五月,是个特别的月份,承载了很多特别的回忆,这个月有生日纪念日、也有失恋纪念日。其中5月18日,是我转行IT的日子。
入行前
时间回到2015年,我还在KXXXXl时,我还在做着类似画图机器的重复工作。我和大学室友一起校招进入这个公司,但是他一个月跑回本行,做电气设计。我不知道下一步怎么,只是凭着兴趣,用着大学自学的Python写些图纸处理的小程序。
那家公司的业务是,承接母公司的脏活,做些没什么技术含量的画图工作。我那时做得最多的部分,是叫Cable Routing,描述在船上连接设备的电缆的布线,工作输出内容是各个电缆架的断面图图纸。工作流程是电缆架断面编号、统计各条电缆经过的断面到一份Excel表格、画每个编号的断面图。这里面最后一部分的工作,是很无聊的,具体就是在一个|______|
形状上堆代表电缆的圈圈。
那时用的制图软件是AutoCAD,可以做一些二次开发,不过用的是Lisp。我没用过Lisp,那时懂点语法的语言是C/Processing/Python,因为大学时用PyQt写过一个小软件,所以打算用Python写个帮助工作的小软件。
画图时,好像是要在Excel使用Filter筛选出电缆编号、查电缆类型、查电缆直径、画圈圈~~。后面的工作会在每个编号重复,真是浪费生命,所以我第一个版本做的,是一个把电缆的图形数据直接弄到剪贴板的小软件,里面设计AutoCAD文件格式、系统剪贴板处理这些内容。
这个小软件出来,得到部门Leader的赞赏和同事们的认可,我挺开心的,继续下一步。在第二版,做了一个读取Excel,按断面编号生成断面图形的功能。最后的第三版,做到把全部图纸连同边框,一次性几十张图纸全部生成。最后一版做出来后,效果真的很夸张,平常一个人几周的工作,电脑可以几分钟给出。虽然还需要人工做些微调,但是效率的提升、图纸质量的提高,使得每个同一部门的同事都会来用这个软件,因为摸鱼时间能多很多。
我在写小软件方面的成功,使我越发讨厌这份低效重复的工作。看着那些老同事们年复一年日复一日画圈圈,然后我写个垃圾软件都分分钟吊打他们的工作效率,我为什么还要呆在这个随时能被软件技术淘汰的职位上呢?而且KXXXXl也有意迁到武汉节省人力,我这份工作一定呆不久了。因为是在深圳,IT公司的集中地,而且我也算是写过几行代码,所以萌生了转行的想法。
在2014年5月1日,我冒着雨去广州和同学聚一聚,期间聊了很多和职业发展有关的话题。夜晚我回到深圳,无眠,半夜刷招聘网站,投了几家听都没听过的、明显是连小作坊都不如的公司,其中有现在的公司。那时那刻,是我24岁生日,我给自己的生日礼物,是转行的决定。
得到回应的是现在的公司,CTO约我到花园城的星巴克聊了很久,聊了过去的工作、我写的小软件、一些明显放水的面试题。后来还留了一个爬数据到本地,然后用Django输出查询页面的Assignment,没什么难度地完成了。后来也得到了转行的机会,契机也许是之前研究过Boost Python。
第一份工作
入职后,我的第一份工作,是用Boost Python封装DLL。这份工作也不算太难,平时努力学习点API和DEMO,无惊无险完成工作。我面试时是Python Django职位,后来公司让我转前端,我也没什么想法地同意,自己对这个行业还是不太熟悉,没有考虑到前后端职业发展的区别,但是也没什么资本say no吧。
转前端后的第一份工作,是接手一个Angular.js应用。它是另外一位创始人在写,用来显示一些策略绩效、持仓、成交、委托数据。我接手后,也添加了账户、风控、回测功能,Angular.js写起来还算熟练,不过工作内容倒是没什么太大亮点,或者说,有一部分还完成得挺丑的。其中有一个展示下单信号的功能,需要在曲线上展示股票买卖纪录。我选用了Highchart来输出曲线(忘了是收益率还是行情),然后用Highchart的画图API画买卖信号点。受限于Highchart,这个功能做出来我自己都觉得效果不太好,也感受到背后的一些评价。
刚好我碰到了TradingView,它的图表功能相当惊艳,因为TradingView的图表没有开源,我萌生了自己写图表的想法。我研究了React-Stockchart还有Techan,它们的核心代码都是基于d3的,所以我也学了点d3d的内容,了解了图表的组成和实现。
我理解React-Stockchart的代码,改写成一个支持信号展示的版本,然后在公司的一个新项目里试了一下,效果还是不太好,对于缩放/动态加载这样的功能,实现起来挺困难。后来我花了一个月的业余时间,自己从零写了自己的图表,命名为nila,韭菜的意思😀。替换了原来那个,效果好一点吧,当然比起TradingView还差很远。
后来了解到了数字货币网站OKCoin, 他们的图表居然没混淆,赶紧保存了一份,不过后面离职了就没再研究。
第二份工作
因为发薪的原因,我选择的跳槽。我当时的求职策略挺鲁莽的,什么准备都没有就直接投了,面了几家吧,一家业务不感兴趣,一家要求ES5,一家和面试官气场不合,最后进了BXXXo。
进BXXXo时挺慌的,因为那里有四地的团队,香港,台湾,深圳,美国。深圳Office是新组建,暂时在思微租了间小房间办公。因为刚组建,我是第一个招来的,除了我就只有飞来飞去的CTO,所以开始时Office只有我一人,自己点外卖自己吃。至于前端,之前台湾的都走了,还有香港的一位,平时也接触少吧。
我碰到的第一个困难是在网络。公司用了Atlassian全家桶,我的科学上网技能得到很大锻炼。我第二个困难是,所谓的敏捷开发模式。这家公司采取了每天StandUp Meeting, 每周Sprint Meeting, 自己开发估时这些操作,我一直都很不适应。特别是在Sprint Meeting上,PM分派任务估时,很多全新问题完全没有头绪,而且加上取悦他人的自卑心态,我总是少估了时间,然后都加班完成。
我的第一次通宵加班,是在这家公司。这家公司为Jamie’s Italian提供系统,但是居然交给外包开发,然后上线前夕,竟然需要我这边去完成功能。我接受外包代码后就懵了,因为完全看不懂啊!他们的写法从来没见过,后来才知道,那是函数式编程。我硬着头皮理解代码理解业务,勉强完成老板的要求。因为要陪着现场支持一起完成上线测试,我和CTO还有iOS同事加班到第二天五点,而且还是两次,我觉得这是人生中最能吹的经历。
在那家公司,我还经历了严重加班。开始时香港老板不来深圳,下班时间还不算晚,后来换了大的Office,老板经常来,在背后看着改代码那种。之前还能七八点下班,现在经常是十二点下班,我都成了出租车常客了。算起来,十点半上班,十二点下班,扣除吃饭时间,每天工作12小时。这样的压力下,而且因为吃饭不定时,我是胖了一些,而且感觉身体透支也挺严重的。
。期间最大的成就是,把外包写得性能极差的React应用的部分页面,用Canvas替换。虽然这只是个临时的Workaround,而且也许后来的人接手困难,但没办法,我的元旦假期就耗在这上面,提前做完提前放假。因为被外包的FP代码虐过,我在这方面的功力有所增长。
三个月吧,我就想走了,因为气氛极其压抑。后面投了一家,要降薪,没去,然后之前的CTO找我,说是融资了,让我回去,然后平薪回去。
第三份工作
这次是二进宫,我给CTO报自己最新的薪水时,他沉默了,因为是我离开时的两倍。他还是答应了,后面在招聘新员工时,他还想找高级前端,也许因为价钱太低,那个高级前端没来,幸好。
不过我这边也得也得展示一下能力。新项目是之前的Angular.js应用加一个编辑器功能,调研时根据开发体验,在VSCode和Atom之间选了VSCode进行二次开发;普通页面方面选了Vue,因为CTO看中了ElementUI,说是可以提高效率。
凭借这次的VSCode二次开发,我对它的源码有了相当多的了解,学习了优秀的架构设计;而且也对Electron应用开发有了很大心得,之前两次工作中接触的Elctron开发内容,只能算是玩具级别。
另一方面,我重拾之前的图表开发,我打算以TradingView为目标,从零写起。我研究了Okcoin的图表,主要是多Series叠加的实现,扩展出一套自己的架构。值得一提的是,这套架构是从VSCode源码改出来的。
因为后端完全不考虑指标数据的提供,我得自己实现这部分。TradingView有一套PineScript来实现指标计算,所以我也考虑实现自己的DSL。因为不是科班出身,编译原理这一块完全没系统学习过,为了求方便,参考PineScript的方案,用ANTLR来实现。我参考了部分JS和Python的语法,定义了一套DSL来实现指标计算。其中核心的部分,是来自OKCoin的指标计算的代码。
然后图表最后的难题是Canvas绘图,我打算做得和TradingView一样,支持负责的绘图功能,所以鼠标事件要完整支持。研究了一下EChart和其他几个会图库,我实现了自己会图库,功能不太强,但是够我的图表使用了。
最后图表按TradingView的主要功能做出来,辅助绘图、周期切换、动态加载、信号展示,这些功能全抄了,后面在一个数字货币项目使用,效果还行。然后继续改进,按照国情,增加日内分时图在新的仿真项目还有最近的改版里面使用。这个功能做得挺辛苦,因为后端API太难用了。
我现在这份工作,也收获了一下项目管理的经验,人员分配,工时安排,节点规划,进度监督这些。在这个草台班子里,科学的管理是最缺的,因为项目延期是家常便饭。个人摸鱼角度来说挺爽,至于对公司发展来说嘛,又是另一回事了。
未来
下回分解