再论"业余"和"专业"
----致力职业化 提高成功力
文档版本
版本
创建时间
创建人
备注
1.0.0926.1
2003-9-26
郑昀
第一稿
1.0.0927.1
2003-9-27
郑昀
第二稿
SQWebMail之烂
外面比较盛行的一种qmail的Web界面,是SQWebMail,还算是比较受人追捧的,而且框架搭也算是好的。
但你看看他的源代码。不说别的,只要看主程序sqwebmail.c的源代码就知道了,严格说,这整个工程一点也不符合软件工程编码规范。
sqwebmail-3.3.1文件夹下有818个文件,27个子文件夹,但是注释呢,命名规范呢?其中代码耦合性也太强,动一发而牵全身,很不好维护。这竟然是一帮大学里的教授后来改进的版本,一砣:
/*
** Copyright 1998 - 2001 Double Precision, Inc. See COPYING for
** distribution information.
*/
static void do_output_form_loop(FILE *f)
{
if (strcmp(kw, "a") == 0)
{
…
}
else if (strcmp(kw, "d") == 0)
{
…
}
else if (strcmp(kw, "D") == 0)
{
…
}
else if (strcmp(kw, "G") == 0)
{
…
}
else if (strcmp(kw, "r") == 0)
{
…
}
else if (strcmp(kw, "s") == 0)
{
….
微软的源代码
让我们再来看看微软的源代码,这个源代码大家机器上都有,不是什么秘密,就在C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC下面,看看人家怎么做的,再看看sqWebMail。
咱们不讨论算法意义上的有无漏洞,兹为了说明代码的可读性,举一个最简单的例子,微软的工程师是这么写一个strlen的经典实现:
/***
*strlen.c - contains strlen() routine
*
* Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* strlen returns the length of a null-terminated string,
* not including the null byte itself.
*
*******************************************************************************/
#include <cruntime.h>
#include <string.h>
#ifdef _MSC_VER
#pragma function(strlen)
#endif /* _MSC_VER */
/***
*strlen - return the length of a null-terminated string
*
*Purpose:
* Finds the length in bytes of the given string, not including
* the final null character.
*
*Entry:
* const char * str - string whose length is to be computed
*
*Exit:
* length of the string "str", exclusive of the final null byte
*
*Exceptions:
*
*******************************************************************************/
size_t __cdecl strlen (
const char * str
)
{
const char *eos = str;
while( *eos++ ) ;
return( (int)(eos - str - 1) );
}
当然,微软的STL实现版本是公认的可读性差,我也看不过眼,换了STLPort了事。
想跟Microsoft,Oracle,CA,IBM竞争吗?
在我看来,我不管你是什么软件公司,管你是什么主义战士,就一个原则,要是不会写文档,不会写注释,写个函数连个输入输出异常注释都没有,那你就别在这行混了,不够丢人现眼的。有时间也翻翻软件工程,软件管理的书,看看那个书上赞成软件没有注释,没有文档?
花钱买享受,这是人生的一个基本原则,干吗在那里吭哧吭哧一代人又一代人反复看着同一批糟糕的源代码,还给自己脸上贴金“源代码剖析”,那是因为你不剖析都不行。简直就是浪费生命。公司要赚钱,要快。没本事写注释的人就开掉,没本事遵循软件工程的人就开掉,这就是我的原则。想加入CMM的行列吗?最起码你的公司要过ISO9001吧?
你们公司有吗?就靠没注释没文档?能过吗?能够跟Microsoft,Oracle,CA,IBM竞争吗?
自由软件的“自由”含义:
自由软件,一般指遵循GPL或LGPL规则的程序。GPL或LGPL规则要求源代码公开,并且允许你在遵循GPL或LGPL的情况下享有共享和修改自由软件的自由。
当我们谈到自由软件(free software)时,我们指的是自由而不是价格。我们的GNU通用公共许可证决意保证你有发布自由软件的自由(如果你愿意,你可以对此项服务收取一定的费用);保证你能收到源程序或者在你需要时能得到它;保证你能修改软件或将它的一部分用于新的自由软件;而且还保证你知道你能做这些事情。
首先,GPL规则中并没有要求软件的维护者一定要提供详细的文档和注释(而且我找了几个著名的自由软件源代码看了一下,注释还是有的,只不过没有详细到每行代码都有的地步。)。我认为详细的文档和注释作者是作为服务提供的,而服务是要收费的。国内的第一个开源软件项目Minigui(一个极好的中文图形界面,可以只有2兆大小),他提供源代码和用户使用说明的详细文档,至于开发文档和函数库说明,他会收取600元的费用。我认为这个价格只是个成本价,假如你连这点费用都不肯付的话,那就没什么好说的了。
至于微软,由于你根本就见不到源代码,所以根本不存在为他的文档和注释发愁的情况。不要说你们公司能见到部分源码,你们是微软的合作伙伴,那别的人呢?而自由软件的源码是对所有人开放的。更何况你们也只能见到一小部分源码而已。而且微软决不会允许你把他的产品移植到别的操作系统上或一些新的机器上的,这些工作只有他自己才能做,因为你见不到所有的相关源代码。而自由软件就可以,你可以把他移植到任何一个操作系统上,包括windows。一个新的cpu芯片出来,没多久就会有一个黑客把linux移植上去,而这个黑客并不是linux的维护者,为什么他可以作到这样的事呢,因为自由软件是源码公开的。
我认为微软之所以提供详细的文档和接口说明,部分原因是他不提供源代码,不得不这么做,否则别人就没有任何办法去使用他的产品了。当然了,微软产品的简单易用是出了名的。可是由于你没有源码,很多时候为了达到某个目的,除了微软替你去做,你是根本无法完成的。例如高性能和新的功能。你难道可以命令微软去做这一切么?
所以,不要对自由软件有这么大的意见。假如你想要详细的文档,你可以购买他们的服务。如果维护者不是某个公司,而是个人行为的话,你可以和他本人联系(一般他都会留下e_mail),也许他不收费就会提供给你的,即使收费,我想也不会比微软更贵的!
做Coding,还是多一点职业道德
专业做Coding,还是多一点职业道德,多看看软件工程的书。想想如果是你开公司,你难道会鼓励你手下的人不写注释,不写文档吗?
有机会的话,读读《Code Complete》(http://www.csdn.net/develop/Read_Article.asp?Id=10997),这本几十年前的书,就已经说得很明白了:
交流和合作
真正优秀的程序员应学会怎样和别人工作和娱乐,编写可读代码是对程序员作为组中一员的要求之一。
计算机也就同其它人一样能读懂你的代码,但是它要比其它人更能阅读质量差的代码。作为可读性原则,你应将修改你的代码的人时刻记在心上。开发程序首先应同程序员交流,其次则是和计算机交流。
绝大多数高水平程序员喜欢使自己程序的可读性强,并抽出充足的时间这样作。虽然只有一些人能坚持到底,而且其中一些人还是高水平的代码编写者,对开发中程序员级别的了解,有助于解释什么地方适合于此原则:
级别1:初学者
初学者是能使用一种语言基本能力的程序员,这样的人能够使用子程序、循环、条件语句和其它许多语言特征。
级别2:中间者
中间级程序员有使用多种语言的能力,并且至少非常熟悉某一种语言。
级别3:专家
编程专家对其语言或环境或对这二者有着很深的造诣,这种级别的程序员对公司有价值的,而且有些程序员往往就停留在这个水平上。
级别4:大师
大师有着专家那样的专业知识,并能意识到编程只是15%和计算机交流,其余85%是和人打交道。一般程序员只有30%的时间甚至更少。大师所编写的代码与其说是给计算机看倒不如说是给人看的。真正的大师级程序员所编写的代码是十分清晰易懂的,而且他们注意建立有关文档。他们也不想浪费其精力去重建本来用一句注释就能说清楚的代码段的逻辑结构。
一位不强调可读性的高水平代码者可能停留在级别3的水平上,但是问题还不止如此。依作者本人的经验,人们编写不可读代码的主要原因在于他们所编代码质量较差。他们并不是自言自语地说:“我所编代码不好,所以我要使其难以读懂”,而是他们并不能完整地理解自己的代码以致于不能使其是可读的,这就使他们只能停留在1或2级的水平上。我所见的最差的代码是由一个任何人看了她的程序后都会望而生畏的人所编写的。最终,她的上司威胁说如她再不改正就要解雇她。她的代码是不作注释的,并且其程序中充满了如x,xx,xxx,xx1和xx2这样的全局变量。她的代码给了她大量的机会显示她的改错能力。
记住我们是专业程序员,我们的视角一定要和业余的区分开来。
我们不是自由软件工作者。
我们是靠这个赚钱的。
所以,你用不着替他们辩护。因为你天生应该喜欢让你赚到更多钱的事物。
我赞同微软的商业运作方式。我赞同付费服务。因为我也是靠这个吃饭的。
不管是微软,还是IBM,都有许多这方面的专家现身说法,多读读这些人的书。别相信那些小公司的或者在校的学生,有时候他们的话是毒药,会毒害你的心灵,蒙蔽你的双眼,让你看不清楚商业社会里面的游戏规则。
"业余"和"专业"
下面摘录透明采访软件思想家Gerald Weinberg的访谈摘录,在http://www.umlchina.net/touming.html:
"业余"和"专业"
"程序开发"这个词所蕴含的行为方式是无穷无尽的。
一位业余程序员可能刚刚用六条语句写就了一个BASIC程序,可以用来求解二次方程的根,便开始就程序开发的理论与实践侃侃而谈--最令专业程序员们反感的,莫过于此。
--《程序开发心理学》,第7章
《程》:我注意到您多次强调"业余程序员"和"专业程序员"之间的差异……
GW:因为我认为这是一个非常重要的观念。并不是"以编程为生的人"就有资格自称"专业程序员"的,但真正对软件学科起到推动作用的全然是专业程序员。这并非贬低业余程序员,任何一门学科都有业余爱好者,这无可厚非。但有必要划清业余选手和专业选手之间的界限,这样业余选手也能找到自己努力的方向。
《程》:可是,如今软件的范围如此宽泛。从政府机关到航天飞机,从移动电话到超级市场,到处都有软件。各种软件之间的差异如此巨大,我们又该如何区分专业程序员和业余程序员呢?
GW:在我看来,首先应该考虑的是他们编程的目的。如果只是为一己私利而编程,如果编程的结果对别人毫无影响,这就是业余程序员的编程方式。
举个例子吧,计算机系的研究生在知识的深度和广度上都已经相当不错了,但他们通常只是为自己编程--为了学习、或者为了拿到学位,所以他们仍旧只是业余程序员。如果他们在学习之余还有一份工作,为别人开发实际使用的软件,这时他们就是专业程序员。
请记住,专业程序员未必都很出色,业余程序员也可能出类拔萃,但他们编程的目的是不同的,这决定了他们之间本质性的差异。
《程》:自从知道您对"专业"和"业余"的划分之后,我就一直想了解您对共享软件(share-ware)的看法。很多年轻程序员怀着淘金梦去做共享软件,您认为共享软件对于软件行业有什么贡献?
GW:几乎所有的共享软件都是垃圾。虽然商业软件和开源软件也有不少垃圾,但共享软件几乎全是垃圾。我曾经试用过一些共享软件,但仅仅是尝试而已。如果我要掏钱买一个软件来用,我一定要求有一家值得信赖的公司为它提供支持。至少在美国,值得信赖的软件公司并不多。很多公司开张不到五年就倒闭,然后他们的顾客再也得不到任何支持。而共享软件,它们的用户能得到的保障就更少了。不,至少我不会去买这样不可靠的软件。
如果从软件行业的角度来说,共享软件给年轻人们灌输了很糟糕的习惯,让他们以一种业余选手的方式工作。共享软件的作者们习惯于单打独斗,总是凭着自己的爱好工作,这种牛仔式的工作方式至少是缺乏专业精神的。
小结
我的想法就是,共享软件或者帮别人打零工的制作流程,给了年轻气盛的程序员们一种缺少项目管理的开发环境,这是不太好的修炼方式,容易走火入魔。
“即使是一个不够完美的东西,在某个特定时期也有他存在的价值”,这个辩证法我当然同意。但是我认为一个项目的源代码最基本的构成因素就是代码和注释和文档,这是三要素,如果没有这些东西,就像生下个儿子却没有JJ一样,根本就没有面世的必要。所以这不是完美不完美的问题。
开源项目和商业软件,如果不遵守基本项目生存规则,无论其中有多么高的高手参与,一样会失败。
我赞同商业开发模式,但不反对开源,如果做得好,我们也会拿来主义。如果做得只是一个徒有代码和功能的开源项目,那我觉得他会走向衰亡。看看SourceFouge上的那么多东西,真正有几个能够为商业社会所采用?几率有多大?其实像有着优秀项目的人,如果归拢到公司里,可能会有更大的发展。因为商业公司有足够的财力推广,有足够的人力包装。
欢迎指正和讨论。
本文档所包含的信息代表了在发布之日,zhengyun_ustc对所讨论问题的当前看法。
本文档仅供参考。
用户必须遵守所有适用的版权法。在不对版权法所规定的权利加以限制的情况下,如未得到 zhengyun_ustc和CSDN.Net明确的书面许可,不得出于任何目的、以任何形式或手段(电子的、机械的、影印、录制等等)复制、传播本文的任何部分,也不得将其存储或引入到检索系统中。
Thank CJW
Written by zhengyun_ustc ( at ) hotmail.com