《程序员》:请谈谈您所定位的程序员应该有哪些技能?您是怎样理解程序员七种武器的?

  ==============

  周爱民:一般来说,剑客用剑、刀客用刀,所以所谓七种武器,用在手上的,或许也一件两件。但如果以技巧、技法论,却不是一件两件兵器可以胜出江湖的。例如不懂刀的剑客,遇到用刀的人时便不知道如何刺击了。因为要先知其长短,才能避强而击弱。

  不懂刀的剑客与不懂剑的刀客对打起来,大概会如同演舞一般,各练各的招式。

  所以,的程序员或程序高手并不是通晓七种武器的全才,必然是精通其一,且概知其它。与江湖不同的是,我们事实上并不拿一种武器去与拿另一种武器的人比斗。我们的对象是一个软件,或者某个工程。我们要克“敌”制胜,而敌是死物,不是活人。换言之,我们了解这些技术方法的目的,并不是要站到擂台上去比较谁懂得多,或者谁精通什么。我们只是要做一个软件或者具体的工程,那么所谓技术方法,只要对这个软件或工程有效即可。因此,用汇编写内核的人不必看不上用C写协议层的人,用C++写平台应用的,也不必看不上用SQL写脚本的人。放在一个团队里,汇编、C、C++和SQL在一个项目里可能各有其用,非得让这些人分个高下出来,终是项目的失败。

  任何的一种工具都有使用它的境界。很多人看不到这一点,而轻视其它语言或者工具。例如SQL,几乎所有使用高级语言(我当然不是说它比别的语言好而显得“高级”,而只是存在着这么一个分类)的开发人员都认为SQL是“一种相当简单的脚本”。但事实上,我的朋友中有能把SQL用到出神入化的,他能由SQL的写法来推断数据库设计的失败,或者反过来,为特定的数据库系统写出优化的SQL。重要的是,这个朋友会针对不同的存取环境、网络结构而设计特定的数据库和SQL,以达到优。

  的程序员是对工具没有偏见的、能适应场合活用语言的人;而程序高手则基于这个前提,并专精其一,进而通一晓十的人。

  《程序员》:您认为什么是程序员的基本技能?哪些是重要的?

  ==============

  周爱民:“七种武器”中,数据结构是成为真正的程序员的基础,而面向对象思想则是门径。

  程序员能否在软件开发这条道路上走下去,很大程度上取决于他对数据结构的了解。任何一种新的语言,或者任何一种新的体系结构的出现,都可以在数据结构上找到相关的解释。

  因此,程序员如果能精通数据结构,那么相当于拥有了“以不变应万变”的资本。对此,《人月神话》中用一句话指出了关键:“数据的表现形式是编程的根本”。

  对象是数据结构抽象的一种,但并不是的一种。从这个角度上来说,对象并不是的编程之道。我曾经说,人造卫星也是在面向过程的时代上的天。也是说,面向过程也可以组织足够复杂的程序。

  然而,所有这些都并不能否认面向对象的价值。面向对象是对事物的本体特性与行为特性的高度抽象,它将数据结构从“死的内存”变成了“活的物件”。面向对象的思想使我们在增强对现实的表达能力的同时,避免了复杂数据结构带来的藕合。由面向对象、信息隐藏和接口抽象三个相关联的概念,构成了整个软件体系设计的理论基础。这三个概念中,面向对象是与软件开发人员关系密切,容易理解的,因此它是使你成为真正的程序员,以及从程序员走向程序设计师的佳门径。

  《程序员》:如果用一个问题来测试一个人是不是程序高手,您会怎样问?

  ==============

  周爱民:我的问题是:你参与或组织过怎样的开源项目,如何评价它?

  在程序高手这个级别上,能脱颖而出的是那种有合作能力的、思想开放的人才,而绝不是技术高下的简单辨别。而观察他对开源项目的经验和兴趣,是一种不错的方式。

  这里说的不是“把源代码公开”是开源项目了。我说的是真正有组织的、持续的、公开源码的项目运作。之所以做这么多的限定条件,是因为现在很多人都已经接受了“源码公开”的思想,但这仅表明这个人有了分享的精神,并不表明他有组织和管理项目的能力。开源项目的生命力是在项目管理者在长时间的维护过程中得以延续的,同样的,项目管理者也在这个过程中历练了自己的技能与心性。而这些,正是高手在成长中不可或缺的要素。

  《程序员》:您在成为一个的开发人员过程中,哪几个阶段是让您难忘的?