程序员的德行
(文章来源:登龙门人力资源网络
作者:赵月旺 2003.06.12)
程序员一定要除了基本的道行修炼外。更重要的是德行修炼。德行=合作能力或沟通能力。对于规模大,生命周期长(特别是衍生生命周期长)的软件项目而言,德行更重要。
德行的标准
软件开发离不开企业,企业的文化决定着程序员的行为规范,比较理想的企业文化是:
沟通方式开放、自由、平等,个人长期发展和企业发展的有限度统一。这样的企业文化,必然会造就具有长远眼光和冒险精神的将帅之才。
这方面的楷模是微软公司,该公司全球员工平均年龄只有28岁,无论在全球的哪家公司,微软评判人才的标准都是相同的。挑选员工的第一标准是应聘者是否具有良好的品德。微软认为,良好的品质是职业道德的基础。其次,看应聘者解决问题的能力如何,在面对困难时是退缩,还是勇往直前,因为实际工作中常有新问题需要解决。第三,要测试应聘者有没有快速学习的能力,日新月异的技术发展要求有快速学习能力。另外,团队精神、责任心、工作热情、创新精神和独立工作能力都是必须的。
好的企业文化熏陶出来的程序员,必然是关注个人长远发展的职业精英,这样的程序员必然会较早地设定自己的职业发展管道。比如:
管理序列:程序员->项目管理人员->中级管理人员->高级管理人员;
技术序列:程序员->高级程序员->需求分析师\\架构工程师\\质量管理;
市场序列:程序员->售前支持->销售;
与这样的个人职业发展管道相适应的个人技能是:
——软件基础理论扎实;
——系统分析与设计能力较强;
——具有熟练的系统开发、系统测试与系统维护技术和管理技能;
——较强的项目管理能力和交流与组织协调能力;
——在企业既能适应软件产品研发,又能适应项目管理岗位;
——具备独立工作能力和创新意识。
在项目开发过程中,有效沟通非常重要,沟通的形式多种多样,除了常见的几种方式外,下面讲几种比较有特点的沟通方式:
* 历史和现在
如何最大程度地挖掘过去成果的价值,需要讲过去的成果(算法,code,设计思想等)进行再组织,使之可以被快速检索。
* 标准化
“最好的沟通是没有沟通”,通过标准化的技术手段,使个人的输出可以被他人非常容易地了解,这样可以避免沟通带来的效率低下。
* 技术一致性
软件技术的发展,使得程序员这个职业需要不断细分,这带来的最大问题是不同技术间的互通问题。为此,在程序开发过程中,需要不断进行的技术预研变得越来越重要。并且,只要满足功能需求,就采用最简单的实现技术。
* 简单性
程序规模变得越来越庞大的同时,修正Bug的代价程指数级增长。因此,尽量少用比较容易犯错误的编程技术(比如C语言的指针),尽量采用简单(牺牲效率)的算法,接口间尽量少一些“合并点”,将是非常有价值的。
不良的德行
尽管国内程序员有一些普遍的优点:比如有雄心壮志,面对困难时比较坚毅,理论基础、尤其是数学功底扎实,编程能力强,吃苦耐劳、讲纪律、讲服从等。
而缺点也是突出的:创新精神不足,做事缺乏主动,独立从事研究的能力弱,对很多事没有主见,而且有想法不直接说,对新知识了解不够,不善于与人交流,缺乏合作精神。
还有一些缺点:不诚实——表现在答应了的事不去做;贪小便宜——用公司设备办私事;不够踏实——急功近利,擅长做表面文章。
这些不良德行在实际的程序开发中表现如下:
* 滥用不变量,以自己模块调试通过为最高目的
大家知道,程序中到处存在着“瓶颈”,这些瓶颈是造成程序运行时不稳定的最重要的因素之一。比方说,在模块接口间定义了一个用常数开辟的内存空间。消除这些瓶颈要从几个方面入手:
——采用技术手段减少不变量的使用,不要给别人造成麻烦;
——集中使用不变量,方便自己的上司作出Bug修正决定;
——应用各种异常捕获机制,在不变量导致的异常出现点进行精确定位;
* 不尊重文档,契约意识淡薄
应该把文档看成法律合同,要认真书写,完全彻底地遵守。并且,一旦发现定义模糊的地方,应该及时通报作者进行适当修正。
* 不写或少写注释,小农思想严重
程序是共有的,模块是不能独活的,注释可以帮助测试人员和维护人员的工作,并且,特别利于软件重用,最大限度地延长模块的生命周期;
* 不关心他人的进度,个人利益高于以前
开发进度的平衡是一个项目成功的重要标志。个人的能力是不平衡的,每个人的工作量也是不平衡的。关心他人的进度,并在适当时机施以援手,将最大程度地消除开发进度中“人的瓶颈”。要知道:团队成功是个人成功的前提;
*
不借鉴他人的闪光点,偏重技术,忽视德行,难成大器
创新分精神创新和内容创新。有一个有趣的现象,大家大概都经历过,比如:A在他负责的模块内用了一个算法,得到领导表扬;B就另外写一个算法,可能B的算法要好,但,站在整个项目的角度看,B的行为是有害的,因为他损害了沟通的效率(领导要分别看两个算法,测试员要策两种算法,维护人员就更苦了)。
企业的德行
IT界普遍认为国内IT教育在课程设置上存在不足,比如课程陈旧,学生的动手能力差,缺乏实践经验。很多企业抱怨,学生到了企业后,不好用,企业不得不再培训一段时间才能用,所以,很多企业不愿选择应届生,而喜欢从社会上招聘。实际上是这样吗?
这实际上反映了国内软件企业的规模比较小,偏重只有较短生命周期的应用软件开发,所以,这些企业在自身资源有限和发展定位上的“鼠目寸光”决定了他们对人才需求的的急功近利。
实际上,培养刚从学校出来的大学生是最合适的人才选拔方式。学生刚刚踏上社会,对职业的理解可以从0开始塑造,这样建立起来的团队特别整齐。这可以从每年跨国公司的校园招聘会上得到证明。
作者简介:
雷年胜 大唐永创科技发展有限责任公司技术总监
大唐永创从事网络安全、网络管理软硬件产品开发
e-mail: lei_niansheng@sina.com
程序员的七种武器
作者:雷年胜 本文选自:赛迪网 2003年02月11日
信息技术的发展时间虽然不长,但其爆炸式的发展速度使信息技术迅速覆盖社会和人类生活的各个角落。程序员们是这场信息化浪潮的见证者之一,更是其中的主要参与者,这是时代赋予每个程序员的机会和责任。
信息技术的更新速度是惊人的,程序员的职业生涯则是一个要求不断学习的过程,永远不能固步自封。本人在工作期间曾看见过很多程序员只要有闲暇时间就浏览一些没有太大作用的网页,在网上聊天,打游戏,浪费了大量的时间,十分不可取。而另外一种情况是,IT技术的日新月异使很多程序员眼花缭乱,什么都想学,却又不知从何学起,今天看看这个,明天学学那个,贪多不熟。
虽然IT技术发展迅速,但很多技术都是有规律可循,一些基本的概念、原理和方法还很通用,可以举一反三。本人根据自己的体会和经验,向那些刚刚踏入IT行业的新程序员们或正在迷茫的程序员们推荐程序员必须掌握的七种武器,有了这七种武器,虽不敢说笑傲江湖,但将自己立于不败之地还是可以的。
第一种武器:开发工具
至少熟练掌握两到三种开发工具的使用,这是程序员的立身之本,其中C/C++和JAVA是我重点推荐的开发工具,C/C++以其高效率和高度的灵活性成为开发工具中的利器,很多系统级的软件还是用C/C++编写。而JAVA的跨平台和与WEB很好的结合是JAVA的优势所在,而本人对SUN公司的“网络即计算机”的概念相当欣赏,并相信JAVA即其相关的技术集JAVA
One会成为未来的主流开发工具之一。其次,如果能掌握一种简便的可视化开发工具,如VB,PowerBuilder,Delphi,C++
Builder,则更好,这些开发工具减小了开发难度,并能够强化程序员对象模型的概念。另外,需要掌握基本的脚本语言,如shell,perl等,至少能读懂这些脚本代码。
第二种武器:数据库
为什么数据库是如此重要?很多应用程序都是以数据库的数据为中心,而数据库的产品也有不少,其中关系型数据库仍是主流形式,所以程序员至少熟练掌握一两种数据库,对关系型数据库的关键元素要非常清楚,要熟练掌握SQL的基本语法。虽然很多数据库产品提供了可视化的数据库管理工具,但SQL是基础,是通用的数据库操作方法。如果没有机会接触商业数据库系统,可以使用免费的数据库产品是一个不错的选择,如mySQL,
Postgres等。
第三种武器:操作系统
当前主流的操作系统是Windows,Linux/Unix,熟练地使用这些操作系统是必须的,但只有这些还远远不够。要想成为一个真正的编程高手,需要深入了解操作系统,了解它的内存管理机制、进程/线程调度、信号、内核对象、系统调用、协议栈实现等。Linux作为开发源码的操作系统,是一个很好的学习平台,Linux几乎具备了所有现代操作系统的特征。虽然Windows系统的内核实现机制的资料较少,但通过互联网还是能获取不少资料。只有对操作系统有一定的了解后,你会发现自己上了一个新的台阶。
第四种武器:网络协议TCP/IP
在互联网如此普及的今天,如果您还没有对互联网的支撑协议TCP/IP协议栈有很好的掌握,就需要迅速补上这一课,网络技术已改变了软件运行的模式,从最早的客户/服务器结构,到今天的WEB
Services,再到未来的网格计算,这一切都离不开以TCP/IP协议栈为基础的网络协议支持,所以,深入掌握TCP/IP协议是非常必要的。至少,你需要了解ISO七层协议模型,IP/UDP/TCP/HTTP等常用协议的原理和三次握手机制。
第五种武器:DCOM/CORBA/XML/WEB
Services
随着技术的发展,软件与网络的无缝结合是必然趋势,软件系统的位置无关性是未来计算模式的重要特征之一,DCOM/CORBA是当前两大主流的分布计算的中间件平台,DCOM是微软COM(组件对象模型)的扩展,而CORBA是OMG支持的规范。程序员需要做的不仅仅是利用商业的开发平台来开发软件,而是要理解这些技术的初衷,即为什么需要这项技术,如果你能理解了这一点,再回头看这些技术的具体实现,就如庖丁解牛,迎刃而解。XML/WebServices重要性不言而喻,XML以其结构化的表示方法和超强的表达能力被喻为互联网上的“世界语”,是分布计算的基石之一。
第六种武器:软件工程与CMM
现代大型软件系统的开发中,工程化的开发控制取代个人英雄主义,成为软件系统成功的保证,一个编程高手并不一定是一个优秀的程序员,一个优秀的程序员是将出色的编程能力和开发技巧同严格的软件工程思想有机结合,编程只是软件生命周期中的其中一环,优秀的程序员应该掌握软件开发各个阶段的基本技能,如市场分析,可行性分析,需求分析,结构设计,详细设计,软件测试等。一句话可以概括我的看法:“创意无限,流程保证”。
第七种武器:强烈的好奇心
什么才是一个程序员的终极武器呢,那就是强烈的好奇心和学习精神。没有比强烈的好奇心和学习精神更好的武器了,它是程序员们永攀高峰的源泉和动力所在。
一点小小的体会与程序员们分享。
程序员的七宗“罪”
作者:雷年胜 本文选自:赛迪网 2003年02月24日
虽然软件工程的思想已被绝大部分程序员所接受,但要将这种思想转化为软件开发过程中的种种自觉行为却不是一件很容易的事。究其原因,有很多因素,如很多程序员缺乏专业化的训练,重技巧,轻规范,包括一些计算机专业科班出身的程序员也存在这种问题;再如很多公司只注重软件产品的开发结果,不注重开发过程,客观上也影响了程序员的目标取向。如此种种,使很多中国的软件公司难以迈上一个新的台阶,发展壮大也就无从谈起。程序员们作为软件产品的创造者,当然也难辞其咎。
下面所列不过是产品开发过程中诸多问题中的其中几个,也许你不会犯这样的错,我还是引用一句老话:“有则改之,无则加勉”。
一宗罪:以偏概全
大家都知道,在对一种产品决定立项开发前,都需要进行产品开发的可行性进行分析,而其中的市场分析至关重要,其实市场分析无外乎三点,一是要开发的产品是有市场需求的,二是公司有能力获取这份市场,三是公司能从产品中获益(不一定是指赚钱,如公司战略利益等)。看似简单的几点,想要完全弄清楚决非易事,所以很多产品的市场分析容易“以偏概全”,如通过个别用户的特定要求或报刊杂志的片面报道将产品市场无限扩大(分析人员自己想象的),技术驱动而忽略用户需求和成本(如铱星计划)等,至使产品开发完后没有预期的市场效果。想要全面而准确地的进行产品的市场分析确实是很不容易,需要平时的积累和理性的分析思考,不能靠撞大运。
二宗罪:画猫成虎
大家也许有这样的经历,产品开发完毕交付用户使用后,用户总是不满意,如不符合他们的使用习惯,功能设置不合理等。所以产品的需求分析是如此重要,没有正确的需求,软件开发得再好,技术再先进,也不过是当摆设的花瓶。程序员们,尤其是系统分析员容易犯的第二宗罪就是“画猫成虎”,曲解了用户的要求。一份好的需求分析不是简单地将用户的每个具体的需求点记录下来,而是要洞察用户每个具体要求背后的动机,将分散的需求点串成一个有机的整体,基于需求并“超越需求”。一个好的系统分析员不仅是一位软件专家,还要是一个出色的领域知识专家和沟通者。
三宗罪:好大喜功
项目延期好象是软件开发一个必经的步骤。项目经理在制定开发计划时,往往过于乐观,每个开发阶段都按最乐观的估计来计算开发时间,而没有充分考虑到软件开发的特殊性和不可预见性,程序员可能都有这样的经历,一个非常小的BUG可能要耽误很长的时间,使开发进行不下去。所以项目经理切忌“好大喜功”,因为项目的不断延期会打击项目成员的信心和士气,久而久之,会使大家产生一种惯性:项目延期是正常的。当然,这也不能完全怪罪项目经理们,因为在国内,很多项目计划都是采用倒排序的方法,即先确定产品交付的时间表,再依次倒推测试、实现、设计和分析所需的时间,而整个开发的时间往往是那些从没实际开发过产品的领导来拍脑袋决定的。
四宗罪:只顾眼前
即便是最优秀的系统分析员也不能保证所提供的软件系统需求不会变化,所以软件设计人员要充分考虑这一点,不能仅仅"只顾眼前"的需求,还要有一定的前瞻性,满足可预见的未来需求,软件系统的可扩展性和可维护性对于一个大型、复杂、长生命周期的软件系统来说至关重要。打个比方理解一下软件的可扩展性,给一个10岁的孩子做一条裤子(需求),你不能将裤子的长度裁减得刚刚与孩子的身高合适(设计/实现),因为孩子长身体很快,到他11岁时裤子已经短了(需求变化),有两种方法解决,一是将短了的裤子丢弃,重做一条(重新开发系统),但成本很高;二是将在裤腿上接上一段接着穿,但不美观且不宜操作(维护成本高)。而最恰当的做法是将裤子裁减得稍长过现在的要求,将长的部分反缝在裤腿里,等孩子长高后,拆线将原来长的部分放下一点就可以了(扩展方便),既方便又不失美观。可见,可扩展性并非软件系统专利,裁缝们早已理解了这一点并付与实践。
五宗罪:得过且过
软件设计需要通过软件实现成为最终的产品,优秀的设计需要靠一行一行的代码体现,而有些程序员对软件实现的态度是,最小满足原则,“得过且过”,对于系统的容错性,安全性,效率考虑甚少,满足基本功能即可,没有持续改进的态度和精神。
六宗罪:自我安慰
产品实现是否达到设计要求在公司内部需要测试验证,严格的测试对于保证软件产品的质量是必须的,而出于时间、资金等缘故,很多软件产品并没有经过严格的测试就已交付给用户使用,程序员们总是善于"自我安慰":应该没问题吧。"想当然"不能消除缺陷,只有测试再测试才是科学的精神。
七宗罪:敝帚自珍
技术总是向前发展的,不要过于“敝帚自珍”,抱着原有的东西不肯放弃,软件产品也有生命周期,该终结时要毫不犹豫。
在写过“程序员的四个境界”和“程序员的七种武器”两篇短文后,收到一些同行的E-MAIL,对有些问题进行了进一步交流,我个人也有所获,希望知识、经验能共分享,为中国的信息技术发展添自己的一份力。
程序员的四个境界
作者:雷年胜 本文选自:赛迪网 2003年01月22日
国学大师王国维先生认为古今成大事业、大学问者,必经过三种境界,第一种境界:“昨夜西风凋碧树。独上高楼,望尽天涯路”;第二种境界:“衣带渐宽终不悔,为伊消得人憔悴”,第三种境界:“众里寻他千百度,蓦然回首,那人却在灯火阑珊处”。一代宗师真是体察入微,寥寥数语,道尽了求道者的心路历程,将一个人由浅尝、迷茫到彻悟的过程尽数概括,可谓入木三分。
IT行业可谓现在的热门行业,程序员也是很多人羡慕的工作。薪水高,不用东跑西颠,敲敲键盘,看看屏幕,一切工作全都搞定,轻松而方便。果真如此吗?不尽然,实际上,程序员的职业生涯也是一个求道的过程,需要不断的提高和学习,IT行业知识更新之快,常让程序员们有随时掉队的危险,无一日不战战兢兢,不敢稍有懈怠。
程序员的职业生涯也可分为四个阶段,初级程序员(菜鸟)、高级程序员(熟练工)、系统程序员(高手)、软件大师(大师),其作品也经历四种境界:
· 可以运行的程序
· 健壮、高效的程序
· 结构优美的程序
· 思想深邃的程序
程序员的必经第一个阶段都是编写可以运行的程序。很多人的编程生涯是从“Hello
World”开始,当第一次按照教科书上的步骤,将源文件编辑完后,编译、连接、运行,在屏幕上显示出“Hello
World”时,心中的激动一点也不亚于阿里巴巴打开了宝库的大门。初级程序员的目标一般是让程序能运行起来,他们迷惑于库函数的众多,不知道该用那一个,他们还要学习基本的语法,以使程序编译通过。初级程序员一般不会考虑设计模式、软件结构等问题。记得本人编写的第一个较大的程序是本人的本科毕业论文题目——一个计算机辅助实验系统,开发工具为Turbo
C,在DOS下开发(那个时候Windows还不太流行,怎么样,年代够久远吧),整个软件大约7000行代码,在当时已经能干不少事,在DOS下也能显示不少花里胡哨的图形界面,支持中文,支持鼠标操作(那时候在DOS下需要自己处理鼠标事件中断),当时还颇受好评。可是今天再重新温习过去的作品,真有点掺不忍睹,整个软件毫无结构可言,一共分成两个源文件还是由于编译器不支持一个太大的源文件而被迫分开,整个系统就是源代码的简单堆砌。相信每个程序员都需要经历这个阶段,它是程序员职业生涯的开始,没有捷径可以跨越,只有不断的实践、学习和总结。
第二阶段的程序员已积累了不少的编程经验,语法和库函数不再是障碍,他们已不再满足于程序正确运行、功能实现无误。他们需要了解程序背后发生的事情,需要了解操作系统的原理和调度机制,内存管理,文件系统组织等;了解开发工具的细节,如C的函数调用机制,参数的传送机制、堆栈的建立过程等;了解C++的封装、继承和多态性背后的机制,虚函数实现机理等。他们不仅知道程序应该如何运行,还知道它为什么这样运行,能编写高效、鲁棒的程序。
第三阶段的程序员能构建结构优美的软件系统,软件系统结构的合理性、可扩展性、可维护性、可测试性是系统程序员考虑的重点,结构优美的软件系统同一栋完美的建筑群一样,每个部分各司其职,搭配合理。本人一直认为,一个好的软件系统应当具有美学特征,如简洁、和谐、层次感等,一个好的软件系统应当是简洁的,易于理解的;应当是和谐的,每个部分高内聚、低耦合,既分工又合作;应当是层次分明,易于维护和移植。所以,本人建议那些进行软件系统设计的程序员,当你设计完一个系统后,需要问问自己:"它美吗?",如果答案是否定的,那么我建议你需要重新考虑系统的设计,如果答案是肯定的,那么,恭喜你,你已经达到一个相当高的水平。
最后一级也许是每个程序员梦想达到的顶峰,程序设计不再是简单的工具,而是大师们改变世界的魔杖,从C到C++,再到COM和COBRA,再到XML和WEB
SERVICES,每次改变,不是软件语法和开发工具的升级,而是用软件构建现实世界模型的改变,是一种软件思想的革命,软件具有了灵魂和智能。如果没有理解这一点,认为C++只是更好的C,COM只是更好的C++话,你就没有了解它们的精髓和思想性。
“程序员之路漫漫兮,吾将上下而求索”,希望与所有的程序员共勉。