恐龙技术生存体验(四 大开眼界)

来源:互联网 发布:淘宝信息与实际不符 编辑:程序博客网 时间:2024/05/05 09:54

回顾我在研究所的几年工作,技术上的收获就是端正了工作态度,树立了质量意识,了解了行业背景,学习了开发知识。但是那时基础不牢、能力不足,工作中时常迷惘,不知如何如何解决问题。

抱着解决这些问题的期望,我在本科毕业后的第四年,离职去读了研究生。

本来想换个方向换个领域,但是很不幸的还是去做航天课题,要做一个跑在卫星上的软件。虽然不知道以后要干什么,但是我知道基础很重要,选课的时候我挑了很多基础理论课,想弥补薄弱的基础。在北航体会到了智商被碾压吊打,尤其是面对比自己小四五岁的同学时,心情复杂。

选课的时候先弥补了自己在计算理论、数理逻辑、抽象代数、图论、算法、编译器等等方面的劣势。我的导师很牛,但是负责这个课题的老师没有行业背景,组里的学生们更没啥经验,前期都是吃我在研究所里时积累的老本,挺郁闷。不知道这样下去毕业后怎么办。后来时来运转换了一个搞软件理论的老师,我从中受益良多。我读了Knuth的TAOCP,然后做题,很累,但是很幸运的发现了书中的一个bug,拿到了传说中Knuth的支票。之后还看了一些当时挺时髦的模型检测(model checking),难而且好像也没什么需要开发设计的事情,遂放弃。

算法虽好,程序怎么编,以后可能还得靠coding吃饭啊。之前我就认准了GOF是骗子,就得想别的辙,怎么才能提高自己编码能力呢?

江湖人言,协议栈、操作系统、数据库和编译器是最复杂的软件。我就都翻了一遍,想偷师学艺。多数操作系统要触碰各种硬件,调驱动和DSP的经验让我感觉无聊;同样对通信协议和数据库无感;只剩下编译器,或许有可能感兴趣,据说又是理论与实践结合最紧密的,既能提高理论水平还能学编程序,多好。

于是我就买书读书,看代码。那时我买了读了几乎能买到的所有编译器原理与实现的书,看了N多电子书,词法语法分析、静态分析、代码生成优化,逼着自己看,有一些是远古时代的英文电子书的配套代码也能编译运行,仍然非常有价值。那些代码看不懂就查资料,记不住就抄,就这样我抄了好几个编译器的代码,慢慢理解了。

编译器生成目标码,后面还有优化,运行时系统,流水线调度等等,必然要面向具体机器,这就和操作系统的问题一样了要面对很现实而枯燥的硬件,所以很自然的,我就把这个问题丢给了虚拟机。这样编译器直接生成虚拟机代码,虚拟机使用native提供的功能接口运行即可。然后就研究了虚拟机的原理和实现,继续查资料抄代码。读这些编译器、虚拟机代码之前,我从不知道C程序还可以那么写,这么做的收获非常非常大。研究生阶段,我检讨自己画界面的无用功,从没碰过界面开发。

找毕业论文方向找了很久,最后在老师指导下找了个研究点,使用静态分析和动态分析去解决,使用的都是编译器和运行时环境中的技术,实现了一个静态分析器和一个运行支撑库。上位机用Linux,下位机用VxWorks。从技术上来讲这是个很对胃口的课题。

这个东东的代码量虽然很少(没有图形界面,分析器是控制台程序),但是对我而言从这个过程,初步掌握了从发现问题、到调查研究问题、直至提方案设想、做实验验证,反复迭代的做研究啃骨头的方法;快速学习理论和技术的方法以及运用理论、技术解决问题的能力得到极大提高。

很快顺利结题,我还有一年才毕业,小论文已写好,就等着写大论文毕业了。无所事事我就去一个公司做了实习,因为这边给我很高的实习工资,去了才知道是做一个重要的没有界面的动态库模块,其实我并不感兴趣,也没觉得有多大意义,只是因为自己年纪大了,想提前挣点钱补贴家用,单纯为了钱去工作。比起编译器虚拟机甚至我的那个小的运行支撑库,这个提供服务的通信模块其实不复杂,只是要学一些新知识和新的开发技术,实习了半年多模块写完了完成任务交差,就回学校写论文答辩了。

在北航计算机读研是个让我大开眼界豁然开朗的过程,理论上我知道了软件开发的边界的什么,可以很坦然的分析哪些问题是技术能解决的,哪些是不能解决的;实践中我掌握了严谨的解决问题的方法:如何分析问题、从理论上提出并证明多种解决方案、做实验分析验证。

0 0
原创粉丝点击