Wednesday, April 29, 2009

系统程序员成长计划-序

转载时请注明出处和作者联系方式

文章出处:http://www.limodev.cn/blog
作者联系方式:李先静

写作背景

在经历过几个大型的,失败的项目之后,我终于明白没有什么比高素质的程序员更能决定项目的成功了,无论什么过程,什么编程语言和开发工具,离开了高 素质的程序员,什么都是白费力气。毫无疑问,人是软件开发中最重要的因素,但不是每个人都重要,不是什么样的人都重要,只有那些高素质的程序员和那些对项 目有突出贡献的人才是重要的。

不过高素质的程序员并不多见,所以从我开始带人之际,就在思考团队成员培养的问题。我做过很多尝试,从小组内学习到整个部门一起上大课,最后又回到 对个人单独的辅导;从通过codreview做现场教育到制定过一个宏伟的培训计划,最后又回到一个朴素的培训过程。其中遇到了很多问题,开始是培训不够 系统,效果不甚理想,后来又因为计划过于”宏伟”而无法实施,直到最后行成一个朴素的,切实可行的培训方案,中间经过了好几年时间,直到去年,整个计划才 趋于完善。我把这个培训计划称为系统程序员成长计划,这就是我在这个系列中要写的。

培训内容不是来源于某本书,毕业八年来,我坚持不断的看书,家中放了7大储物箱,有300多本不同类型的书籍,其中囊括了大部分经典的IT图书。当 然也不是全部内容都来源书本,这几年我在开源软件吸取了大量的营养,一些思想和经验在broncho项目中也有充分的发挥,可以说是理论,经验和实践的结 合。但我不尝试阐述什么高深的道理,相反我是针对应届毕业生和业余爱好者写的,目的是要让初学者进阶为一个专业的程序员。

为什么叫 系统程序员成长计划?程序员的范围太广了, 虽然软件开发有很多相似之处,但是隔行如隔山,比如对于目前炙手可热的WEB开发,我完全是外行。想什么都讲一点,结果是什么都没有讲清楚,所以我得把培 训计划限定在我熟悉的范围之内。先定义一下系统程序员:从事操作系统内核、DBMS、GUI系统,基础函数库,应用程序框架,编译器和虚拟机等基础软件开 发的程序员。这些培训同样适用于桌面软件和智能手机软件开发,我想对其它软件开发也会有一些启发作用。

草莓酱定律与果酱定律。第一次在咨询的奥秘中看到草莓酱定律时,我觉得非常有意思。当然这个系列也无法脱离草莓酱定律的魔法,利用这个系列中的内 容,我手把手的教了十多个同事,收到了良好的效果。当有数百个读者读这些文章时,我不敢期望有同样的效果。不过在果酱定律的鼓励下,我相信这个系列中至少 有部分内容的价值不会因为读者群的增大而消失,所以最终决定写出来。

中心思想

软件开发的困难在哪里?对于这个问题,不同的人有不同的答案,同一个人在不同职业阶段也会有不同的答案。作为一个系统程序员来说,我认为软件开发有两大难点:

一是控制软件的复杂度。软件的复杂度越来越高,而人类的智力基本保持不变,如何以有限的智力去控制无限膨胀的复杂度?我经历过几个大型项目,也分析 过不少现有的开源软件,我得出一个结论:没有单个难题和技术细节是我们无法搞定的,而所有这些问题出现在一个项目中时,其呈指数增长的复杂度往往让我们束 手无策。

二是隔离变化。用户需求在变化,应用环境在变化,新技术不断涌现,所有这些都要求软件开发能够射中移动的目标。即使是开发基础平台软件,在超过几年 时间的开发周期之后,需求的变化也是相当惊人的。需求变化并不可怕,关键在于变化对系统的影响,如果牵一发而动全身,一点小小的变化可能对系统造成致命的 影响。

为了解决这两个问题,方法学家们几十年来不断努力,他们发明或改进软件的开发过程和设计方法。系统程序员面对的基础软件通常都是大型的复杂的软件,其通用性也要求能容纳更多变化,解决这两个问题也是系统程序员成长计划的主要目标。

文章特色

以引导读者思考为主。培训可以制造合格的程序员,却无法造就一流的高手。培训是一个被动的过程,我们都知道在大学里听课的效果,我不希望本系列文章 的成为单纯的培训教材,相反我们要变被动为主动,最大限度的提高学习的效果。大多数情况下,我先提出问题让读者去思考,让读者自己尝试去解决,能不能解决 这个问题不重要,重要的是在思考中提升自己。如果读者在一定时间无法找到解决问题的方法,后面会有专业程序员的参考做法(或许不是最优的)。

以简单的例子讲述复杂的设计方法。我曾经制定一个宏伟的培训计划,结果失败了,原因是我忘记了我在走路之前也艰难的爬行过。这次我吸取了教训,用简 单的示例讲述复杂的设计方法,而且不对读者的背景太多假设。里面不会出现复杂的数据结构和算法,也不会引入大型软件来唬人。即有足够的挑战,不会让读者感 到乏味;又一切尽在掌握之中,不会因为挫折而打击积极性。

技术能力与工作态度并重。古人说德才兼备者才是君子。同样,做一流的程序员,也要德才兼修才行。当我手把手的教别人的时候,我不但希望他能学会我讲 的知识点,更希望他能学习我的工作态度和作为程序员的道德素养。当然有些东西只可意会不可言传,未必能用文字表达出来,不管怎样这是我的初衷之一。

读者群

这个系列完全是针对初学者写的,初学者包括在校学生、应届毕业生和其他业余爱好者。我面试过很多应届毕业生,他们大多数都不具备编程能力,唯一的优 势就是对基本理论有一知半解的了解。本系列文章就是为他们量身定制的,经历十几个人的实践,取得令人满意的效果,大多数人在开始一行代码都写不出,到培训 结束时一般都能独立开发/维护一些几千行的小模块。本系列文章并不是金钥匙,最终学习的效果与个人的悟性和努力密切相关,但不管怎样,只要读完这些文章, 你都会有不小收获的。

如何使用

温伯格说过,医生的药方包括药物和服药的方法,两者缺一不可。同样的教材,不同的学习方法,效果也有很大差别。对于本系列文章的服用方法,我的建议 是,对于文中提出的问题,先自己想办法去解决,可以查资料,至少经过两三个小时的思考之后,再继续阅读,最后再按学到的方法独立写一遍,学习编程一定要多 写多练,否则效果会大打折扣。

Enjoy it!