我的职业生涯

我的职业生涯 (by chen shu)

回顾我在上海的IT职业生涯是一件有趣的事情。

为什么会转行

11年前我做了一个改变我人生的重要决定,那就是参加计算机自学考试。从此我从文科毕业生转变成了一个计算机专业的学生,两年以后,又从在扬州卖人寿保险的销售员变成了在上海张江开发区写程序的程序员。当时我做出这个决定,是因为我觉得我更适合研究一些东西,天性喜欢研究自然科学而不是人际关系。很显然,计算机专业是非常适合我的,因为只要有一台电脑就可以自己学习。

为什么会选择C++

在我将要完成所有考试科目的时候,我意识到,文凭不代表能力,必须掌握一门语言,才能找到工作。当时的选择似乎并不多,VB大行其道,VC也很普及。我的想法很简单,VC较难,会的人自然会少,竞争也少。至于自己能不能学的会么,我对自己有信心。

从MFC开始到COM+

通过学习候捷的<<深入浅出MFC>>,<<MFC Programming Language>>,<<Windows程序设计>>等书,我已经熟练掌握了MFC编程技巧,并且为我当时的公司(上海飞天空间遥感科技有限公司)完成了第一个项目,那是一个GIS桌面应用程序。所有的代码都写在客户端,MFC程序直接访问数据库。这时候公司的领导希望搞三层架构的C/S系统,CTO是来自美国耶鲁大学的博士后,并且曾经在波音公司工作过一段时间。经过一番讨论,决定使用COM+。虽然我这个项目只有我一个人,也不是公司的重点项目,但是我还是利用业余时间进行了技术研究,从ATL的基本使用,COM的基本概念,DCOM的安全概念,最后到COM+。这真是一个巨大的挑战,从此以后,我进行了大量的阅读和测试,同时吸收其他项目组的经验和教训。两年以后,终于摸清楚了一系列关键问题,比如套间,对象池,远程调用,事件订阅。两年间,我开发的项目都逐步的添加了COM+的特性,最终形成了一个比较完整的模型,公司内部称之为SarstGIS。从那以后,在需要C/S架构的GIS项目中,程序员的工作都是在SarstGIS的源代码上进行修改,对功能进行删减。同时也学习了当时最新的VC库,ATL Server,学会了如何用VC编写网站和Web service.在飞天公司及其独立出来的成生科技公司,我从一个普通的程序员,逐渐成长为项目经理,最后担任技术部经理。

新的进步

进入龙软公司,是为了在更高的平台上提升自己的技术,同时也希望看看大规模软件开发的管理和开发方式。进入龙软的第一天,就加班到凌晨。很显然,我所在的这个新团队遇到了麻烦。龙软的TechExcel部门专门为美国TechExcel公司服务,TechExcel公司的所有软件都是用MFC编写的桌面应用程序,这些程序直接访问数据库。但是当互联网急剧发展的时候,TechExcel希望能够将他的软件都转变成三层结构。在我来之前,方案已经选定,采用C++编写一个TXRecordSet库,所有接口基本上和CRecordset一样。流程是这样的,所有程序不再使用CRecordSet,而调用TXRecordSet,TXRecordSet库可以通过调用WebService获得数据,WebService采用C#编写,用ADO.net访问数据库。这个方案的好处是,上百万行的程序绝大多数情况下只需要采用文本替换的方式,即将CRecordSet替换成TXRecordset,然后重新编译,就能够顺利地转换成三层架构的程序。节省了大量的时间和成本。一个三个人的小组为此努力,但是性能遇到了严重的问题,即使在局域网上,性能也很糟糕。首先,ADO.net读取的数据利用C#的API直接将结果记录集序列化成XML流,然后在网络上传递的方式效率太低。因为XML流中存在大量的冗余信息,比如字段名和类型都使用XML tag表示,这样算下了,有效数据只占到10%不到。其次,TXRecordSet解析XML流采用了DOM模型,众所周知,这个性能是很差的.我提出的方案就是在SOAP协议中传递BLOB,BLOB是一个二进制流,内部的协议我们自己定义,可以借鉴TCP通信自定义协议的方式,header里面传递结果记录集的字段信息,body里面传递具体的数据。TXRecordSet则定义了自己的二维表格,通过使用vector< vector<boost::any> >的方式,不再使用DOM模型。最后,我一个人重写了全部代码,性能估计提高了20倍左右。直到很多年后的今天,TechExcel仍然在使用这个库。
由于有机会承担这种底层库的开发,我花了很多时间重点研究C++模型,设计模式,C#,同时也深入的运用STL和Boost库以及其他的著名库,比如ACE,Loki等。在那个时候,我意识到,或许COM很难,但是对于技术领域来讲,仍然有很多值得探索的伟大的东西,我的眼里不再只有COM。

向Linux出发

龙软另一个对日部门专门负责开发Linux和Unix下面的证券交易服务系统。我早就对这种神秘的编程方式垂涎已久。开发都不用IDE的,光这一点就让我憧憬。龙软的对日部门一直也碰到性能问题,他们的BFL负责网络通信和多线程部分,但是性能相当不好。四年了,这个问题还没有解决。终于,龙软将我调到了对日部门,负责对BFL的性能优化。我对Linux环境完全陌生,这时候,程序员的友谊给了我帮助,卢平、李春治、徐硕和叶丰给了我不少帮助。尤其是卢平,亲手教我使用Emacs,这成为以后我成为一个Emacs man的原因。
对ACE,Loki和Boost的研究,帮助了我。我仔细调查了BFL的一切基础类:智能指针,多线程模型,BString等等,甚至为这个类库写了一个文档,介绍该类库的设计,使用,优缺点。两个月后,一个性能改善很大的版本被开发出来。BFL的最大问题按照严重程度排列:
1)采用第三方库进行数据打包和解包。这个第三方库的性能有严重的问题,事实上当我换成了ACE的打包/解包方式后,性能的最主要问题已经被消除。
2)所有的基础类都被设计成了多线程安全,也就意味着里面有大量的线程安全操作。事实上,这完全没有必要,应该由程序员自己来决定什么情况下使用互斥量、信号量等,什么时候完全不用。这种假定程序员不能自己正确处理多线程的假设,最终导致了BFL出现了严重的性能问题。
我的结论是,BFL其实更本就不应该存在,ACE已经足够好了,花时间研究如何运用ACE,比自己开发一个跨平台的网络通信和多线程库要划算的多。因为所有BFL想做的,ACE都已经有了,而且做得更好。更何况,我们还有STL,Boost和Loki呢。

Java

我的大学同学邀请我去了一家对日外包公司(龙的信息)做主管。这是一家主要用Java开发的公司,我对J2EE并不熟悉,但是很快就发现它和COM+有相同的设计目的。只是J2EE更多的运用在Web开发上面,在这里,我开始学习Java,学习了Servlet,JSP,Struts,JSF,icefaces等技术,同时继续研究UBuntu,对公司的服务器进行了调整,建立了路由器,svn服务器和FTP服务器。也参与了一些C++项目。当你已经精通了C++的时候,学习其他的语言其实并不难,惟一的障碍可能就是你愿不愿意学的问题。

美国人的传统

2009年,龙的公司受到金融危机的冲击,我家里母亲中风,哥哥生病,一连串的事情发生。我回到了扬州,陪陪家里人,照顾儿子,暂时失业中。没多久,就接到了来自美国的电话,一个美国硅谷的创业小公司正在中国寻找资深工程师帮他们开发一些核心业务。于是,我认识了Adam。这个神秘的美国人,是该公司众所周知的难以合作的高手。他是一个命令行风格的程序员,无论是C++,Java还是Ruby开发,都用VI和脚本。幸亏我有Emacs和UBuntu的基础,还能够跟上他的脚步。我从他那里学到了使用Ant构建自己的项目。很快我进了一步,我开始使用更好的Maven2构建自己的项目。从此,开发Java的时候,Eclipse和NetBeans已经再也不需要了。
这段时间,我接触到了大量的开源项目,如:proftpd,MyBatis,Log4j,Apache Commons Logging,MySQL,TestNG等等。我发现了很多开源项目的开发者都和Adam一样,不依赖于任何的IDE。我称之为美国人的传统。对我而言,这并不可怕,相反很有趣,因为此时我已经是一个Emacs man.
这篇回忆文章就是我用Emacs+muse写成的。

你可能感兴趣的:(职业生涯)