最近在换工作,无意之中在MacTalk微信公众号上看到池建强推荐100offer这个新出的招聘网站。上去看了一下,是一个专门为程序员而准备的招聘网站,比较符合程序员们的审美风格。尝试这把自己的简历更新上去。基本信息和工作经历都好说,从其它招聘网站上Copy过来就ok啦,但最后有一项叫技术总结,大致意思就是介绍一下自己的技术发展经历,遇到过的技术难题的结果过程,自己业余时间开发过哪些open项目,等等。这个是其它招聘网站上没有的项目,自己也感觉蛮有参考价值的,今天就在这里简单的总结一下吧。

我大学时的专业是计算机科学与技术,虽说是师范类的院校,但作为正儿八经的计算机专业,像什么数据结构、计算机网络、高等数学、离散数学、数字逻辑、计算机组成原理、编译原理、操作系统、软件工程、数据库原理、计算方法、人工智能、微机原理等课程还是玩的七荤八素的,但好歹为以后的职业生涯打下点基础。除此之外,就是编程语言的学习,学校开设的课程有汇编语言、Pascal语言和C++语言,我自学了Basic/VB语言和C语言。Pascal语言作为教学语言还是很合适的,中规中矩,容易培养规范的编程习惯。但因为后来没有往Delphi方向发展,所以Pascal语言也就只限于我的第一门高级语言了,毕业之后就再没有用过,但至今对它规范的语言风格记忆犹新。上学时我最热衷的语言是Basic/VB语言,清楚记得我和一个同学为了自学Basic/VB语言,到学校附近的私人计算机室废寝忘食练习的画面。做出来一些东西后,就非常的自豪,俨然在同学们中间已经成了编程高手一样。现在看来,当时做的东西简单丑陋,不值一提,但好歹也为自己最初的技术积累奠定了一点根基,后来我的毕业设计就是使用VB语言完成的。

毕业后就去了河南宝丰一高当老师,教高一、高二年级的计算机课,同时在教务处任职,做一名普通的教务员。这两年多时间里,除了正常的教学和教务工作外,要说我在专业技能有什么长足进步的话,那就是对C/C++语言的坚持学习,坚持学习C++/MFC/ATL编程。因为觉得教务处的工作太繁琐,占用我大量的时间,呆了一年后我就申请离开了,只担任计算机的教学工作。这样我就有了充足的学习时间,开始在C++/MFC/ATL编程上下功夫,看一些经典的书,并做了大量的实践练习。梦想着有一天到北京上海这样的大城市工作,做自己喜欢的事情。

梦想很快实现了。在2006年2月,我终于下定决心辞去了学校的公职——俗称的铁饭碗,决绝的北上,来到了北京,来到了这个梦想开始的地方。

很快我就找到了在北京的第一份工作——北京卡斯特信息系统技术有限公司,这是一家既做自己产品又做外包的小公司。我在公司里做了半年后就被外派到佳能(Canon)公司,没想到在那里一呆就是两年。2006-2008年的两年时间里,我就是呆在位于中关村银谷大厦的这家日企企业的研发中心。过后我才意识到这是对我的职业生涯来说至关重要的两年,我非常庆幸这样的一段职业经历,也很感激它!在那里,我完整的参与了KNLP项目的设计、研发和测试过程,而且是以我认为的当时业界最标准、最人性的软件开发流程完成的。我的C/C++/MFC技能在那里得到了一次质的提升,虽然之前看了很多的书和做了很多练习,但自己练习和真正做项目是有很大区别的,特使是在这样一家全球性的IT公司里。核心的底层模块都是用C语言完成的,而且要求跨平台运行,所以在这里也首次接触了Linux下做开发的相关知识,首次使用VIM+GCC+GDB的组合方式来开发调试程序。从此让我跟VIM结下了很深的缘分,后来我的很多代码都是在VIM下完成的。上层的UI是用C++/MFC/ATL完成的,以库的方式调用底层核心的模块。这个项目整整做了两年,在当时的我看来,这是一个很大的项目,用到了C/C++/MFC/ATL等编程技术,使用了模块化的设计架构,采用了典型的瀑布型开发模式,从需求、设计、编码、单元测试、结合测试,到最终的产品发布,都给了我全新的体验。不管是从单纯的语言技能上,还是架构设计上,还是软件开发流程上,还是团队之间的协作上,都让我对软件研发的整体理解上升了一个层次。我很感激它,感激佳能研发中心,也感激卡斯特公司给我了这样一次机会。

KNLP项目完成后,我就回到了原公司。卡斯特公司的情况已经不容乐观,本身的产品没有很好的市场发展,外包业务也在萎缩,再加上公司上层的人员架构发生了很大的变化,导致公司已经奄奄一息了。很多同事都选择了离开。我回到公司只呆了半年,期间零零星星的做了一些小项目,最终也选择了离开。离开三个月后,卡斯特公司倒闭了。我仍然很怀念她,不只是她是我来北京的第一家公司,不只是她给了我去佳能研发中心那次机会,还因为我生命中的那三年时光。

因为之前公司给我造成的心理影响,觉得小公司还是不靠谱,所以在选择第二家公司时就希望找一个规模大的。后来就应聘去了亿阳信通股份有限公司。亿阳信通有自己的软件园,有自己的办公大楼,有自己的餐厅,有自己的班车,我认为这算是一家很大的公司了。但人生就是这样,你所想的跟你所经历的总是会有偏差。亿阳信通虽然是一家大公司,但过后仔细一想,在那里获取的技能就是一个——Perl语言。

我当时去的部门,是做电信、移动等业务分析的,就是把硬件设备采集到的话单数据进行分析、存储、汇总、页面展现等。底层模块中很大一部分都是做数据分析处理的,但看了之后我才发现,那么庞大的一个数据处理系统,竟然是构架在Perl语言之上的,可能当时架构设计者认为Perl是动态语言,易于开发,易于维护,易于扩展。这个想法原本也是不错的,但任何系统,当达到一定的规模后,易于扩展和易于维护都变得不是那么容易的事情了,除非有特别牛掰的框架设计,像Apache,虽然规模庞大,但框架设计清晰,模块化扩展方便,所以这么多年来项目一直稳健发展。Perl语言并不是很适合构建很大规模的软件系统,特别是在处理性能上存在瓶颈。当然了,这些都是后见之明,当时的我也只能投身于这个Perl怪兽的怀抱了,在上面做一些模块开发。我去亿阳信通之前学习过Perl语言,但只限于写一些系统维护、文本处理脚本,这么大规模的模块化perl编程,还没有接触过。所以,在亿阳信通的两年里,倒是让我的perl编程技术有了很大的提升。这也为后来自己开发开源项目奠定了基础。

不过到第二年,公司领导也可能觉得原先的数据处理系统在性能上差强人意,就让我们组针对特殊项目开发独立的数据处理模块,使用C/C++语言来完成。当时开发的数据解析程序是运行在Solaris系统上,我先在自己的Ubuntu笔记本上开发完成,然后移植到Solaris系统上调试运行。因为Solaris系统跟我们平时使用的计算机CPU架构是不一样的,我们通常使用的x86架构的计算机,CPU编码的方式是小端(Little-Endian),而Solaris系统是大端编码的(Big-Endian)。这是当时开发过程中特别注意的一个方面,从中也让我理解了小端编码和大端编码的区别。

在亿阳信通的两年里,我开始接触开源项目,自己也尝试写一些开源的程序,这对我技术上的成长也是有很大帮助的,比如Linux下Gtk图形开发技术,就是在写开源程序的过程中掌握的,实际工作中并没有用到。当时还没有github,还是google code的代码仓库,我就在上面先后发布了三款开源的软件:

  1. gCRT: 远程主机连接工具,类似于putty和SecureCRT的功能,使用gtk2-perl技术开发。这我工作中实际用到的工具,因为经常在ubuntu上做开发,同时要经常使用telnet/ssh连接其它Unix/Linux服务器,但在Ubuntu上当时没有找到称心如意的工具,所以就自己动手开发了一个。

  2. lovf5: Follow5微博客户端,使用gtk2-perl技术开发。因为当时Follow5刚推出不久,在小众人群里还很有市场,我也跟着玩了一段时间。后来感觉在Web上更新查看消息不方便,就想在自己的Ubuntu桌面上开发一款程序,通过Follow5提供的API来查看更新微博消息,所以就自己动手开发了一个基于Gnome/Gtk2的客户端。

  3. fwitux:Follow5微博客户端,使用c/gtk2技术开发。因为之前基于gtk2-perl技术开发的Folow5客户端在执行效率上不够理想,所以后来就基于网上的一个开源软件twitux给改造成了Follow5的客户端。

因为当时我醉心于Linux/Ubuntu, 所以开发的open软件都是运行在Linux/Ubuntu之上的。正是基于自己对开源项目的热爱,我在工作之余掌握了Gnome/Gtk的相关技术,可以独立开发Linux下的UI程序。

后来,公司要跟IBM进行战略合作,但雷声大雨点小。我们项目组按照部署要跟IBM进行合作,对他们的产品做二次开发,满足国内业务的需求。但合作的进展很缓慢,有一段时间,我整天都在AIX系统下敲各种命令——系统管理的、数据库的、安装的Shell,卸载的Shell,更新的Shell。搞的很崩溃,我知道我是时候要离开了。

我接着加盟的公司叫吉大正元信息技术股份有限公司,总部在长春,北京这里是它的研究院。当时吉大正元研究院正准备开发一款身份认证与数据代理网关的产品,加紧搜罗人才,而我刚好从亿阳信通离职,很快就受邀加盟了吉大正元研究院。我入职的第二个星期,研发网关产品的整个团队就被拉到怀柔雁栖湖畔山脚下的一个小楼内进行封闭开发,没想到一呆就是五个多月。提起封闭开发,可能很多人会觉得很苦很枯燥,但后来跟一起封闭开发过的兄弟谈起,都很怀念那段时光,我也是。封闭开发相当于给程序员们提供了一个理想的编程环境,尽量排除外界因素的打扰,全身心地专注在产品研发上。这对于程序员的职业成长来说,实际上是很好的事情。

产品研发分为两个组——Java开发组和C开发组。因为数据代理网关对大并发和数据代理性能上都有很高的要求,所以服务器端的核心代理模块全都采用C语言来完成,Java模块只是用来做后台管理和登录会话管理等。我最开始是跟另一个同事负责整个服务器端C模块的设计和开发工作,任务还是很紧张的,基本上除了平时的吃喝拉撒睡之外,其它的时间全部都是在讨论设计和敲代码了。当时公司已经决定在这次封闭开发中采用敏捷开发模式,这也是我首次接触敏捷开发理念和敏捷实践,什么迭代开发、故事墙、结对编程,自动化构建,自动化部署,自动化测试等等,都为我打开了一个新奇的视野,让我看到跟之前传统的开发模式完全不一样的场景。所以说,在封闭的这半年里,是我职业生涯中又一个快速提升的关键期,能跟他媲美的就是在佳能研发中心的那两年。那次让我对传统的瀑布开发模型有了深刻的理解和认识,这次让我对敏捷的开发模型有了直接而深刻的接触和实践。我很感激这两次机会。

封闭的后期,服务器端的模块都开发完毕后,我们也开始转向客户端的开发。这也是敏捷开发理念——代码集体所有权,任何人在任何时候都可以在系统中的任何位置更改任何代码,每个成员都有更改代码的权利,所有人对所有代码负责。正是基于这样的敏捷理念,让单个的程序员不再固守于单个的模块,而是要对整个系统的架构设计清楚明了,要对各个模块的设计和编码了然于胸,这样才能做到想修改哪个地方的代码就可以修改哪个地方的代码而不至于给系统造成灾难。

封闭开发结束后,网关产品的核心功能都已完成,之后就是对产品不断完善和修复bug的过程。在这一个过程的开始,就已经把产品推向了市场,然后不断的完善功能,修复Bug,以快速迭代的方式发布新版本。这就是敏捷中快速发布,而不像传统的软件发布那样等一切就绪了再发布产品。传统的软件发布反应迟缓,错失机会。而敏捷的发布模式却可以在核心功能和最小需求完成的情况下,快速推向市场,让市场和用户来检验产品,提出新需求,发现问题,从而快速有效的完善产品,持续不断的发布新版本。

在吉大正元研究院的三年零五个月的职业生涯中,我成长了很多。我接触和学习了敏捷开发理念,掌握和实践了敏捷开发活动,分析了很多的网络协议,对网络编程的理解和实践达到了一个新的高度,对Linux下的大并发多线程高性能的服务器开发有了深刻的理解和项目积累,对Linux的防火墙iptables的使用开始得心应手,对一些开源软件——apache, openssl, openvpn的借鉴让我的设计能力得到了很大的提升。我很庆幸,我为吉大正元的发展作出了我作为职业程序员的贡献,但同时也让我自己获得了成长。我认为这就是我们漫漫职业生涯中上下求索的意义!