程序猿往事

  大童  |   on Monday, January 19, 2015  |  3548   |  8 minutes

97年上大学,学的Fortran77,一门面向过程语言。Fortran算较早的高级编程语言,提供了丰富的内嵌函数库,工程和数值计算领域曾经广泛应用。后来出来fortran90/95,据说支持派生数据类型,也就是结构体,为设计数据结构适用大型软件提供了方便。

大学毕业后,就没有再使用。Fortran现在来看比较落后,但在当时,作为编程启蒙还是相当不错的。

2003年开始用C++/C编程,逐步学习C++/C语言,做桌面应用,可视化用用QT,跨平台。 C++在当时确实打开了一扇窗户,OOP观念实在先进。写程序除了抽象思维,还和现实世界有了更多链接,OOP概念就是现实世界的语言描述。如果说原来面向过程编程是记流水账,想到哪里写到哪里,那么OOP就是写小说,更多考虑架构及内生关系;面向过程特点是线性的,零散的,重复的;OOP强调抽象组合、有机的、复用的,解耦的。C则便于写出快速精炼的函数,C语言专家往往强调C语言是完全不同于C++语言,有其他语言不可替代性,诚然不虚,但对一般使用者,除非要写面向底层高并发高性能特殊应用或组件,应用层面C++已经完全可以取代C语言,况且硬件资源限制越来越不是问题了,高效才是关键,另外C语言的内存管理需要程序猿考虑,对于新手来说实在是一趟艰难的冒险之旅。

说说QT,是一家叫奇趣科技的芬兰公司几个程序员开发,后来被诺基亚收购。完全开源,源代码写的非常规范易读,绝不故弄玄虚,大量的注释(当然是英文),是学习C++上上好的源码。QT并不是一个玩具,最早在Fedora上标配的桌面KDE全部用QT写,如此大型的桌面项目,全面检验了QT的成产力和成熟度。QT的文档化做的非常好,Tutorial和Practice做的很好,我至今印象深刻的是Tutoral中Step By Step例程是实现一架动态的加农炮;QT的注释也相当完备,无论入门还是高阶用户都能从中得到有效指南,C++本身有较好的封装和解耦特性,QT在此基础上采用Slot/Signal的机制,该机制进一步把实现者和使用者进行解耦。

在Linux下写代码,有些类似瑞士军刀式工具,可以大大提高效率,比如用的较多awk和perl,awk脚本特点是灵活小巧,能够高效支撑文本处理,也支持正则;perl相比awk,提供了各类高级特性,尤其突出的是强大数据结构和天生文本匹配能力。perl可以写出简单oneliner代码,也支持写出复杂软件,perl信奉条条大路通罗马的哲学,用不同的方法实现同一需求。perl作者larry wall是自然语言家,所以perl很多表达类似写作,这点是perl的优势,可以写出灵活多变的程序,很多程序体现作者乍现的灵感。但这也是问题,perl代码常常会显得晦涩难懂,这在当前开源盛行注重产出和生产力作坊式或生产线模式下,是尤其不友好。开源和流水线对让代码可理解易阅读性要求较高,沟通成本要低,造轮子要少,晦涩难懂的好代码往往成为一堆无人问津的数字垃圾。我相信Python作者一定领悟到perl的前车之鉴,python坚持简单,清晰,与perl理念相反,python提倡只用一种方法来完成一件事。这实在是设计哲学范畴,孰优孰略很难界定,perl见证了兴衰,python终于后来居上,从另一个角度印证了传播性在语言设计中重要性。

突然想起当年学python的一桩小事,2007年某天我决定用python写点东西,于是我翻了下python手册,大概了解了数据类型、控制结构、文件处理。从哪里着手呢,从熟悉的工作吧,当时我正在实现一个用仿真通信系统用户模型,语音通信模型里用户到达符合泊松分布,用户使用时间符合指数分布,在数据通信里涉及类型更多,我们用马可夫链来计算概率,用蒙特卡洛算法模拟大量用户请求事件来输出系统指标 。算法是同事刘伟写的,北大高材生,这哥们大抵是个数学家,大约2012年移民韩国搞5G去了。我当时已经完成C++实现, 并达到预期效果。 这个软件的大部分底层C代码是Michael Mandell写的,我们叫他老孟博士,美国人,UT首席科学家,原来波音公司的首席科学家,的确NB闪闪,难以企及。回到python,于是就拿这个还热乎又有一定复杂度的应用来练手,大约花了一周业余时间写好算法代码,问题是这个python的应用运行的概率结果就是不对,这个问题又大约花了2天业余时间加部分工作时间,还是没有解决,绝望之下放弃了python。

之后在大约2008年左右开始用JAVA写WEB应用,原因是当时MVC架构的Struts给web编写提供了相当便捷性,代码结构清晰,与数据库oracle交互的采用基于JDBC封装的Hibernate持久层中间件,屏蔽了原生SQL,而是用一系列Bean来交互存储数据,用起来也是相当顺手。此外,apache有个叫mina的NIO框架免去自己写异步通信的烦恼,这个mina的作者也是后来netty的作者,厉害。C++转JAVA基本上没什么门槛,跨平台也更加方便,工具集更加友好,开发环境搭建更容易,开源资源更加丰富,入门容易。丰富资源和活跃社区意味着程序很多时候只需要复制黏贴修改,用JAVA作为开发语言的软件公司越来越多,JAVA长期徘徊在语言排行榜第一位置,JAVA程序员供不应求,工作容易找,薪水水平高,又助推小孩们学JAVA,这种现象似乎现在也出现在Python上。可这么容易写一个东西,类似堆几块积木,想必缺乏内在生命力?

大部分软件大咖,是以写代码为乐,写代码对他们来只是另一种游戏而已–一种思维游戏,他们甚至在写代码过程进入所谓的心流状态,Linus Torvalds传记说他linux时状态,就是:编程――睡觉――编程――睡觉――编程――吃饭――编程――睡觉――编程――洗澡――编程……,一切编程之外就是简化到维持生命必须,我想他必定是体验到规则之下自由创造的乐趣。我不知道其他大部分程序猿写代码的状态,但对我来说,大多数时间,并没有体验到自由创造的乐趣,编程对于我更多的是苦役,这不是说我不能集中精力沉浸其中,而是,常常沉溺细节,而无法构建一个恢弘的大教堂,我们所做更多的是重复性而非创造性的工作。这让我想起小时候,帮父亲家具作坊搬木头,劳累又厌倦。大约在2012年后,我基本上告别编程,也切断由此带来的烦恼。当然,偶尔会写点perl来自动化分析工作,那算不上编程。

这么多年,软件业已呈现出星河日月之势,编程已经交织到我们的生活当之,只是我们不自知而已,代码构筑虚拟世界的触角会延伸渗入物质世界中,侵蚀软硬的边界,甚至未来,世界的形态根本就可能由虚拟之物构成,我们所珍视,精神层面的东西都可以是一片算法而已。如此想来,我们是不是当及早了解一二,以在我们变得更老而探索之力消逝的时候仍然可以理解这个世界。

老孟

2008-05-29

老孟姓名孟凡克,原名Michael Mandell,地道美国人。 老孟2002年离开美国波音公司chief Scientist岗位,再之前在美国军工企业Hughes Space and Communications公司也是Chif Scientist。

第一份工作,老孟第一个面试官,大抵问了些诸如正弦曲线、数值算法之类的数学问题。

老孟喜欢与人聊天,喜欢平仄不分的音调,援引简单的中国小诗,摆弄汉字四字成语,常让我想起美国版孔乙己。老孟喜欢拿用滑动铅笔在废纸片上涂画汉字。老孟的日常爱好和后来的中文精进,推想老孟刚来中国时中文应该还比较烂。老孟的本地化进程不止在语言上。老孟在某老小区居住,据说该小区的大爷、大妈和老孟都挺熟的,碰到老孟都会寒暄几句。腰间别一手机并加套,在这里流行过,又不流行了,不知老孟是因为流行还行因为方便。

与老孟一起工作始于2003年,参与老孟主导开发的一个项目,项目组总共就5人,一起干了4年不到。2006年老孟调去深圳做WiMAX芯片开发。期间,老孟的建议和指点虽寥寥数语却总能起到指点迷津。

老孟头衔很多,孟老师、孟博士、专家、首席科学家……,这些头衔对于老孟,都是货真价实无虚假成分的。我看,老孟本质上是一个程序员,老孟具有一个好程序员的特质,老孟有扎实的数学基础,严谨的思维,对未知东西热烈的好奇,热情的付出。老孟写的代码,简洁清晰富逻辑、具美感,折射出其深厚的编码素养。但老孟代码注释极少,有注释处也是极其精炼,对于阅读者是一个不小挑战,极不符合开源精神。这种个人英雄主义的做派,我猜想一定程度上受美国当时Linus等人影响,另一方面可能跟原来波音和休斯军工背景有一定关系。

老孟性情温和、或者说随和、或者说亲和更贴近些。在中国几年,老孟已深谙中庸之道,不知是品性使然,还是被国人中庸感染。其实,和他一起工作的很多中国人都不那么中庸了。