本科:理论知识和汇编语言
我接触编程其实很晚,是大学的时候。那时候其实喜欢数学,少年班可以自由选专业,当时差点选了数学,然而不太喜欢寝室另一个铁定学数学的妹子,我又是那种不喜欢一个人有多远就躲多远的那种,所以干脆选了计算机。加上当时班上选计算机的女生就我一个,另几个男生都是特别投缘的几个哥们儿,所以很开心地就去学计算机了。另外那时候校园 BBS 正火,我也是玩的不亦乐乎,觉得学计算机至少上网的机会多很多(当时是那么觉得的)。所以学计算机这事就这么愉快地决定了。
等到真的开始上专业课,发现自己其实理论很强、动手却比较弱。所有专业课里面的理论课,像数据结构、算法、数理逻辑、编译原理、体系结构什么的几乎都是满分。但是每门课的大作业和要动手搭系统的部分,都有点无从下手,做的也慢,也不感兴趣。好在当时人缘好,上机作业总有人 “帮忙”,加上当时大学对动手能力要求也并不算很高(现在想起来)。所以也是混成个假学霸的样子。
本科的毕业设计是要进实验室做东西的。当时稀里糊涂怎么就进了一个体系结构的实验室,做嵌入式系统的指令集设计。需要写一些汇编,跑一些实验。但是并不需要做大的软件工程。所以当时感觉自己还是理论远远高于实践(总想起天龙八部里面的王语嫣那种人,说啥都知道点,就是自己做不出来。)
其实本科阶段,真的就一个字:混。
硕士阶段:各种底层系统、编译器、函数式语言
科大申请出国就像当时很多学校的同学没事考个四六级证书一样,每个人都不用太去想,跟着大环境就开始折腾托福、GRE。当时你要问我为什么出国,不过是因为觉得周围小伙伴都申请的热火朝天,自己也不能落后。
稀里糊涂的,居然也就被 Rice 录取了。按博士入学的。但是美国很多研究生院在拿博士学位前是需要拿个硕士学位的。所以这里会有一个硕士阶段。
我的导师是做程序语言设计的,也就意味着成天和编译器、解释器、语法器打交道。而且他的方向是函数式语言(Functional Programming Language)。主要用的是 OCaml。
美国硕士阶段需要重修几乎所有的专业课。而且对动手能力的要求极高。
所以硕士那三年,我差点没死过去。
理论部分完全没有问题。而所有的大作业、大项目,一开始做起来,可能要花别人两三倍的时间。加上本来课业就重,还有科研项目要做。因为拿的全额奖学金,还有很大的心理压力。总之当时的感觉每一天都在 Push 自己的极限。好在那时候是真的年轻身体好,一天平均睡四五个小时也能熬的过来。几乎没有任何的课余时间,寝室楼、系楼两点一线。大学那种轻松的状态一去不复返。感觉每一天,都是当三天来用的。
好在也活过来了,不过这三年是我真的 “会” 写程序的开始。可以自己一个人从头到尾搭各种简单的系统:网络相关的、算法相关的、分布式相关的……尤其是编译器相关的。但是大部分做的还是比较偏底层的。
实习:Matlab、Controller、Simulator、C++
读硕士阶段的暑假会去大公司做实习生。当时因为在 Houston,所以两次实习去了同一家石油公司:Schlumberger。做的项目是给井底的机器人写控制算法。因为硬件很贵,出不得错,所以每个程序会在 Matlab 上用 Simulator 先做各种测试。就是那个时候把 Matlab 用的纯熟,也了解了一些大公司的软件工程和开发流程。对一些软硬件协同设计也有了更进一步的了解。
博士阶段:数据分析、数据建模、Python、C++
我读硕士阶段的导师后来因为个人原因离开了 Rice。所以我跟了另一个做 BioInfomatics 的导师继续我的博士阶段。他主要做的是 DNA Sequenece 和 蛋白质网络相关的研究。因此我的课业很大程序上就是大数据建模和数据分析。也会用到一定的机器学习,但是主要还是无监督算法。因为数据处理需要采集和预处理,所以当时每天要写很多的 Python 程序。而实际的数据建模和分析因为数据量太大,一般语言性能不够好,所以使用的 C++。
入职初期:Web Server、Search Backend、Ruby、Java
真正开始工作后,我的文章里提的比较多了,做过搜索和支付,主要用 Ruby 和 Java。
其实最开始的时候心里很虚,因为觉得自己碰过的东西其实和互联网没什么关系,却突然进了互联网的领域。总感觉自己什么都不会。开始的时候也确实是什么都不会。所以那个时候每天都压力都很大,每天也加班,因为和别人差距太大了。不过可能毕竟很多计算机技术相关的知识是相通的,慢慢地似乎发现很多以前了解的知识和学到的技巧,还是可以应用到解决问题中的。
说着轻松,其实也是经历了很长时间很有挫败感的阶段,才慢慢好起来。
所以呢?
有人问过我:“你觉得学 XXX 有没有用?” 这叫我怎么说?我自己就学了一堆 “没用” 的东西啊。我不会的东西很多。我会、但是用不上的东西也很多。
花了这么多年,才认识到这一点。最大的收获,不过是现在可以坦然面对工作上很多不会的东西。很多用不上的东西,了解个大概也就放下了,因为精力实在有限。工作真的需要的,那就去学呗。毕竟,我会的,有用的东西并不多。