精明的程序员——小程大爱
虚伪的大项目
在参加软件学院研究中心面试的时候,老师们问我有什么项目经历。记得我当时的回答是这样的:“我的项目经历主要是在Intel公司的一年实习经历,这期间主要参与了两个项目,第一个是做Meego上的多媒体框架,第二个项目是Chromium对html5视频的支持。”
老师们听后没有什么反应,但是能够感觉到他们对我的经历非常满意。一个本科生有一些实践经历就已经比较难得了,是在Intel实习,何况是Meego、Chromium、html5这么火(当时Meego正火)的几个大项目。
而实际情况是怎样呢?在Intel,写过一个Meego上的Gstreamer插件,用来解码dvb字幕,勉强也能算是多媒体。Chromium对html5视频的支持呢,本来就有。只是当时Meego上的Chromium播放视频的时候,显示位置不正确,我的任务就是把这个位置调正确。只是这样的小事,我就可以和一个外行说,我做过Meego,做过Html5,做过Chromium。而且,由于确实在完成这些小功能期间对上下文有所了解(例如,对Chromium的代码确实了解过一些),也不会被老师问倒。
面试结果不错,很顺利的进入了研究中心。在研究中心参加的项目十分夺人眼球,有“国家自然科学基金”,“国家科技重大专项”。我很兴奋的参加了一个“重大专项”,结果做了一年各种很水的项目。博客前面也有记录过,所谓对基于移动平台的AVS编解码支持,就是写一个Android上的播放器;所谓与教育部合作的基于云计算的儿童画板,就是在Android平板上写一个画图的软件。因为各种Android的程序,加上开了一门Android编程的课程,实验室还挂着Google重点合作实验室的牌子。
每次项目快要到截止日期,或者有领导来检查的时候。老师就会说,“我看你们也做不完了,即使做完了也没有人家市面上的软件好。创新在哪里?特色在哪里?还不如干脆借用一下别人的。”于是我们又会忙碌于各种画图标,改logo的任务。在界面右下角加一行软件学院的字样,一个Android应用就为我所用了。我也很无奈,但是相信在学校做项目,这种事情会常常发生。
在Intel做的项目庞大,但是作为一个实习生,我能亲手接触到的只是很不核心的冰山一角。在实验室做的各种国家的重大项目,徒有一个庞大的标题,实际内容却很虚。在这个过程中,自己学到了多少东西呢?当然,它确实能让我的简历增一点光。
记得之前认识一些在上海交大的同学,他们实验室参与国家军方外包的一些项目,甚至有人做航母上的无线网络;中科大的一个同学告诉我,他们和华为合作的项目其实非常水;记得我的母校南大,也有一个国家Linux重点实验室,只不过是摆着几排电脑的一个房间,没有听说对Linux有什么贡献。我深谙每一个大项目背后,“国家-xx部门-高校-院系-实验室-大导师-小导师-学生”,这条链上每个单元之间的各种利益关系。培养优秀的学生本应是学校的本职目标,如今却在这复杂的利益关系里,显得极其微不足道。
给力的小程序
研一学校有一门讲操作系统的课程,老师给同学们介绍了一个非常小的操作系统,名叫nachos。整个学期,老师要求学生们,在这个操作系统上做一些实验。它是一个用来教学的操作系统,由于它非常小,而且可以被修改、跟踪、调试,所以同学们很快地熟悉了操作系统必备的方方面面,并且通过一些小作业,学生很快就熟悉了线程调度,内存管理等核心部分的代码。这对于很多学生来说,他们第一次阅读操作系统的调度器和虚拟内存的代码。修过这门课的学生每一个人的评价都是:能学到很多东西。那时由于Android正火,实验室有个分析Android系统的项目,包括分析启动过程和安全框架,老师分配给几个同学去做。虽然Android的开源项目,但是由于复杂度很高,同学直接通过读代码很难得到什么分析结果。好在Android有很多参考资料,拼拼凑凑也算是有了些结果。但我觉得,相比那些学习nachos的同学,分析Android系统的同学的学习效果并不理想。
我对小程序的喜爱,不是偶然形成的。读过很多讲C++与设计模式的经典书籍,作者皆是业内知名元老级人物。我本以为他们参与的都是一些,什么导弹发射,航空航天之类的大工程。没想到有很多类似打印表单、局域网几台机器通信这样的小项目。我特别喜欢在GoF23中,在一个文档交换格式的阅读器中,或一个图形绘制程序中,作者能够从这样一个个小程序中找出很重要的设计经验。
自踏入计算机领域以来,让我收获最大的一个项目,是在南大电子系做的一个三维重建的项目。项目不大,更不是什么“国家重大”,它很难入选我简历中的项目经历栏。但是这个系统中的每一个小的算法,都是通过看一篇篇的论文,去理解、去实现、去改进、去使用。比起在做Android应用的时候,调用一些API拼凑出来的一个“国家重大”,学到的东西要多很多。
《C++沉思录》的作者说:
我们很容易就会注意到:很多最成功的、最有名的软件最初是由少数人开发出来的。这些软件后来可能逐渐成长,然而,令人吃惊的是许多真正的赢家都是从小系统做起的。UNIX操作系统就是最好的例子,C编程语言也是。其他的例子还包括:电子表格、Basic和FORTRAN编程语言、MS-DOS和IBM的VM/370操作系统。VM/370尤其有趣,因为它完全是在IBM正规生产线之外发展起来的。尽管IBM多年来一直不提倡客户使用VM/370,但该操作系统仍牢牢占据IBM大型机的主流市场。
同样令人吃惊的是,很多大项目的最终结果却表现平平。我实在不愿意在公共场合指手画脚,但是我想你自己也应该能举出大量的例子来。
谨慎的选择
我只想纠正一些程序员对项目大小的偏见,并不希望矫枉过正。有人觉得自己学东西重要,也有人觉得敲门砖比真实力更重要。还是要看场合,学东西的时候,不要盲目崇拜大的项目,要更关注那些简单而核心的知识;在类似应聘的场合,是允许渲染自己的。所以,如果有“国家重大xxx”的经历,也未尝不可加在简历中。读大学的时候,不乏有很多同学在基础知识还不扎实的情况下,去IBM、Intel这样很大的公司实习,去跑一些测试脚本,记录结果。相比在学校好好读书听课,这样的学习方式真的很差。有很多例子表明,可能应聘的时候,有大公司实习经历的同学更受欢迎;刚开始工作的时候,有点经验的学生也会显得很能干;但是往往到三四十岁的时候,坐在更高位置上的人都是那些读过更多书的人。
如果在学校做项目,也不要因为立项的标题中,有“国家”,“重大”,“航天”,“国防”等等字眼就会觉得它多么牛、多么高端,项目大不见得不水。
不要看到某个时代很火的几个名词,“高性能”,“大数据”,“云计算”,“虚拟化”,就觉得自己从事的这个项目是比别人更先进,更重要的知识一定是那些不会火红一时的概念,而是那些看似陈旧的多年不变的原理。
更不能因为合作方有“Intel”、“IBM”、“微软”、“华为”、“百度”、“腾讯”这样的大公司的名字而感到自己能接触到他们的核心。公司的目的都是盈利,与其合作等于为其打工。尤其是外企,老外不会把最重要的技术放在中国的分公司,或者交给一个中国的高校。
把心态放平,不要盲目崇拜。在哪里写代码都是写代码,给谁打工都是打工。对我们而言,自己能够收获多少东西,才是最重要的。