Fullstack Engineers

199x 年左右我初中,那会普遍流行的还是 dos 系统,公众对计算机的理解也就是一个打字设备,代替以前用油墨的方式印刷的。我有一个舅舅,那会大学(应该是专科)已经毕业了,他在青岛那边学习的就是计算机相关的专业,回我们那边之后分配到了一个公家单位,主要的工作也是打字。

dos 下面制表用 CCED,录入用五笔,还有 UCDOS 之类的中文 console。那个时候流行的就是学习五笔,然后就是录入软件制表软件这些。

那个时候我就表现出了对这些事情的兴趣,自己背五笔编码码,练习五笔,还学自己习过 foxbase。很多的银行的那种黑窗口操作界面就是基于 foxbase 的。那会玩的比较多的游戏是仙剑和红警。

不过那个时候基于公众对这个东西的认识就是打字,以及游戏,所以基本很不看好这样的一个职业。农村人报考大学的时候优先还是财经什么的觉得似乎可以有铁饭碗的专业。

我那会找了一本 foxbase 的书自己看,里面也有编程的部分,基本上第一章我就看不下去了。对于 a = 1 + 2 这样的表达式我还可以理解,但是对于 a = a + 1 这样的我就理解不能了,也没有人可以去问,所以当时第一章后面有一道题目是计算 1 到 100 累加的结果,我就想破头都想不明白除了一个一个加还有什么简单的方法,递归什么的就更加不明白了。这样基本就卡第一章了。

上了大学之后,开始学 c 语言有机房,就各种控制不住了,自从去机房学会了 MUD 有一段时间玩的废寝忘食的,为了一直占着机器,还需要同学中午给去送饭,一呆就是一天。

不过业余时间也还是学习了一些其他知识的,分区装系统,做网页。最开始是联系了一个书商出一套 Office 之类的书,我们的做法就是找几本其他书拿来抄一下,所以那会也叫攥书,而这些书主要的卖点也就是针对最新的版本,也不像是 C 语言那样谭浩强有绝对的权威,所以基本上都是这么个模式,我后面带动了全班很多同学攥书,我们宿舍的几个都搞了几本书,赚个零花钱。后面还搞了一些做网页的书什么的。

毕业的时候找工作,赶上互联网第一波泡沫,我们专业还是非 CS 的,所以找相关工作不好找,我拿到 2 个 offer,一个是相对来说还和专业挂钩,是搞集成电路的,另一个就是出版社,为了北京户口,选择了出版社。

出版社做编辑和写书不一样,而且发现本身也还是对技术工作感兴趣,所以慢慢的开始把办公室的网络维护什么的接管了。国企里面都是多一事不如少一事,我主动承担其他人巴不得呢。利用空闲时间,搞了一台 pc,把出版社的邮件服务器用 Qmail 自己搭了一个,还有出版社的网站也自己写了一个 demo,那会购买还没这么方便,需要自己去银行汇款的。像什么反垃圾邮件,防火墙什么的这些都折腾折腾。还试过 freebsd,发现没有 rh 好玩。

这样搞了几年,自己也觉得没什么意思了。就从出版社出来了。找了一个上地那边的搞外包的公司。当时面试的是一个台湾人,还挺有好感的。去了之后发现是 it 部门,那台湾哥们搭了一个 openldap 觉得挺嗨,我觉得好像也没啥,自己弄了一个虚拟机花了几天弄了一个类似的出来。后面干了1,2周之后,对方觉得我不合适,干活干不到正点上面,弄的我也很郁闷,因为没人和我说过需要做什么,我就只好干点看到的力所能及的。

期间也面试了一些比较好的单位,但是都是因为经验不足没搞定,因为我毕竟之前就是业余的维护一台我自己搞的服务器而已。

后面换了一家做手机 SP 服务的,就是提供一些彩铃啊,wap 站什么的。过去做运维人员,这个岗位只有一个人,我去的时候前一个要离职了我过去接手,而那个人也是接手没多久,所以后面出一些问题的时候我还时不时得找第一个人。这家我去的时候还有几十台服务器,奈何这个行业慢慢的不行了,服务器基本在慢慢回收中。来了这里之后自己也开始思考这么多机器如何运维的问题,包括监控,备份什么的。后面自己搞了 nagios,写了一个通用的监控脚本,还自己给一台办公室服务器接了一个插卡的猫用来发报警短信。用这个猫还做了简单的可以交互的小工具,比如查天气,重启服务什么的。

基本上来了半年多把监控什么的梳理好了,因为业务萎缩的缘故,平时就没什么事情了。后面就是学习 shell 脚本什么的,学了一些编程的东西。慢慢没意思之后,一个朋友推荐去 yahoo 做运维。去他们部门面试没通过,后面换了一个其他部门通过了。

去了 yahoo 之后才明白大厂是怎么搞运维的,各种工具,分工。也是梳理清楚这边的监控之后,没事情做了,开始参与写程序。那边用的很多工具都是 perl 写的,似乎大部分牛逼的都是老美弄的,中国这边就是用户,很多东西出了问题都需要和老美沟通解决。

在那边后面有一段时间 leader 是一个 oracle DBA,所以慢慢的也开始接触了一些 oracle 的东西,学习了一下 SQL。那会我们部门有职位就是做统计需求的,解决方式就是写一堆 shell 脚本和 SQL。所以后面有岗位变化的时候,我就鬼使神差的去搞统计去了。因为似乎并不难做。

这样后面 yahoo 中国完蛋到了淘宝量子统计的时候,也就不做运维了,开始做统计,学习 hadoop,hive 这些,那会还看了一段时间的遗传算法,当时是想在业务里面用来尝试推断用户喜好的。后面因为打算给当时的网站功能改版,因为小团队,也没几个人,所以统计做完之后,又开始参与网站的开发,写 javascript。又了解了一堆 jquery 的东西。

之后到了去哪儿之后,开始继续搞统计觉得没什么意思,就开始搞广告系统开发。因为我知道一个公司的广告部门是最爽的,赚钱哗哗的,成本还不被人注意。这个系统当时我们好几个人一起弄的,技术方面使用了 perl,python,lua,c,SQL,java,开发的时候大家各自用自己擅长或者这个领域比较省事的技术做的,开发好之后大家把对接到一起。

这个系统后续的问题也很明显,其中某个组件有问题的时候,如果负责人不在,那其他人比较难搞。这个系统随着人员变更,慢慢的就变的比较难维护了。当然我觉得比较难的原因不是系统设计的问题,是因为后续维护人员的技术能力问题。但是国内公司能持续的有那么厉害人做这个事情恐怕也不多,一般优秀的会慢慢的上升离开。

这样在去哪儿这边我慢慢的开始负责数据库维护(因为我有一些运维经验),移动端的服务 APP 和网站(因为当时没有其他人做,我牵头做的),广告系统(因为其他人慢慢的离开流失,这系统慢慢的也就我比较熟悉全部组件的运作逻辑了),一些数据统计工作(因为我以前做过这个方面的事情)。

所以离开去哪儿的时候,我基本上各方面的事情都捣鼓过,各方面都清楚一些,比初学者肯定是知道的多,但是我自己认为都不算是专家。我是属于把技能树点乱的类型,没有在一棵树下面持续挖掘,而是种了一堆树。当然这也可以是某种职业生涯发展的方向,这样的人也不是说在这个社会找不到可以发挥的地方。

乱糟糟回忆了一堆,主要是想说,知识都是相关的,很多时候如果你想做好一个事情,你可能是必须要弄明白他周边的另外十个,而这个时候你可能都不是专家。

比如就算做运维,简单的时候可能使用好别人写好的工具就可以了,但是一旦遇到问题自己又没有 debug 代码的能力,那么只能去求助能看懂代码的人,这个时候就很低效。

比如从开发角度看,语言使用比如用 django 写个 view 什么的,元类,装饰器,迭代器,多线程这些,必要的时候还需要使用 c 封装一些调用提升速度。还需要了解数据库,model 和数据库的关系,数据库自己的特性,索引,约束,联合查询,聚合这些。写好代码还需要了解持续集成,发布回滚环境区分,自动化测试。发布之后,如果想要服务稳定,还需要弄明白负载均衡冗余,数据库备份,主从,数据库出问题了恢复,DNS 切换。如果往深了研究,这里面每一个点都可以有那么一位专家来研究,我觉得一个人是不可能把这些东西都弄明白的,弄明白也就是皮毛。

所以全栈?呵呵,我理解的全栈是不可能有人做到的。知识迭代这么快,就算有人现在大致都弄明白了,他如果不持续的在各方面更新的话,很快也会再次落伍。

不过倒是可以有专家/科学家工程师,就是某一个领域研究比较深入的人,比如看过 python 源码,发过补丁,可以按照自己需求去实现 python 垃圾回收功能等等。不是停留在应用使用上面,或者参与过现有框架的一些开发等。这样的人通常不管去哪个领域,给一些时间都可以比较深入的进入钻研。