有位老朋友曾经说过一句精彩的话:“软件与软件之间的差异,不会比软件与大白菜之间的差异来得小。”是的,按照我们的设想,在信息化时代的末期,软件将无处不在。一个逻辑常识:外延越宽,内涵越窄。当软件的外延宽泛到无所不包的时候,如何期望两个“软件开发者”能够有共同的语词,如何期望他们用这些共同的语词来营造一种文化?
这时,一本书出现在我的脑海中:Gerald Weinberg的《程序开发心理学》(清华大学出版社即出)。在阅读这本书时,我注意到一个有趣的现象:Weinberg老先生不断地强调“专业程序员”与“业余程序员”之间的分野。在他看来,尽管都是用C或者Fortran(这本书有些年头了,现在我们或许应该说“C++或者Java”)编写程序,但业余的编程爱好者与专业的软件开发者有着天壤之别。例如,校园里的“编程高手”或者计算机系的高材生,如果没有在软件企业中做过项目开发,他就只能是一个业余程序员。因为软件开发最重要的,并不是一时一地的技术,而是——套用老先生的话——心理因素。尽管PC的普及极大地模糊了“业余”与“专业”的界限,但“业余程序员……就程序开发的理论与实践侃侃而谈”仍然是“最令专业程序员们反感的”。“毋庸讳言,二者之间的差别也是客观存在的。”
这就是了。试图从技术、从应用的角度找到程序员之间的共同话语,这本身就是一次错误的尝试。专业程序员之间必定有某种共通之处,但那必定不是他们掌握的技术或者他们面对的应用领域,而是他们作为专业程序员所具备的那种心理素质,以及他们从事专业软件开发时求解问题的方式。举个最常见的例子:业余程序员总爱讨论“Java与C++哪个好”这样的话题,甚至常常可以把问题上升到计算理论、哲学思辨一类的高层次;但在专业程序员的眼里,这根本是一个伪问题——专业程序员考虑的是在用户允许的成本条件下按时交付用户需要的软件产品,而当范围、应用域、时间、成本等诸元确定之后,几乎从来不会出现语言抉择的问题。毕竟Java与C++适宜的应用域交集极小。
作出“业余”和“专业”的划分,我们已经在厘清“程序员文化”的道路上迈出了可喜的第一步。另一位成名多年的软件开发者、技术顾问Pete McBreen则走得更远。在他的《软件工艺》(即将由人民邮电出版社出版)一书中,McBreen借用工艺学的传统,提出了“学徒——技师——工匠”(apprentice-journeyman-craftsman)的三级划分。在他看来,大学文凭早已不能作为鉴别毕业生水平的标准,SCJP一类的认证考试代表了“six-pack”式的廉价货(six-pack指美国常见的一种廉价批发滞销啤酒的方式),外面的培训班根本教不出真正有用的东西。惟有软件开发者本身的声望——reputation,如果阅读这本《软件工艺》,你会不断地看到这个词——能够证明他的实力。软件开发者要想获得更高层次的认可,也只有靠自己在低层次的打拼,获得足够的声望。
不知道你是否喜欢这种论调?在计算机系里混了四年的学生、自己写过几个小程序考了一张MCSD或者SCJP的“编程高手”、参加了三个月“软件工程师班”培训的学员……当他们毫无顾虑地把自己称为“程序员”或者“软件工程师”时,当他们与从业多年的程序员(至少在表面上)无法区分时,我相信这是对整个行业的损害,也是对他们自身的损害。《中华读书报》的读者,如果你恰好不是IT业内人士,请想想你对于程序员这个人群的整体印象,相信你的观点能够证明我的结论。
所以,在我看来,这才是“程序员文化”的正道:划分人群的标准不是Java、C++、.NET……,而是“专业”与“业余”、是“学徒——技师——工匠”。惟其如此,同一人群才能真正拥有共同的话语;惟其如此,希望进入这个文化群体的人才能找到正确的方向——看看现在的初学者们吧,“Java与C#,我应该学哪一个?”,难道你认为他们这样真的能一窥程序员文化的堂奥吗?