荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: huhaiming (一生只爱她), 信区: Program
标  题: 修炼一名程序员的职业水准3(林庆忠__署名原创)
发信站: 荔园晨风BBS站 (2005年04月08日09:01:04 星期五), 站内信件

【 以下文字转载自 CIE 讨论区 】
发信人: dreamway (美洲豹), 信区: CIE
标  题: Re: [转帖]修炼一名程序员的职业水准(林庆忠__署名原创)[2]
发信站: 荔园晨风BBS站 (Thu Apr  7 23:21:33 2005) , 站内信件

三、注重逻辑:成为一名职业程序员
好,再前进一点点,你就要成为一名职业程序员了,让我们继续来完成这个任务吧!我们在
前一节提到过,“你发现一些个别的demo是极品,它所展现的程序逻辑结构是你设计不出来
的,你现在有点更关心它的程序设计构架,甚于对你原始目的(某种相关的技术/技巧)的关
注”,其实你是在关注这个demo程序作者的思维逻辑,所有程序的本质就是逻辑。技术你已
经较好地掌握了,但只有完成逻辑能力的提高,你才能成为一名职业程序员。打一个比方吧
,你会十八般武艺,刀枪棍棒都很精通,但就是力气不够,所以永远都上不了战场,这个力
气对程序员而言就是逻辑能力(其本质是一个人的数学修养,注意,不是数学知识)。逻辑能
力也是逐步提高的,开始时你一定是用直观的逻辑能力来编程的,怎么想就怎么编,不对就
再改,在改进中提高自己的逻辑能力,从直观逻辑能力提高到抽象逻辑能力,这是很正常的
。提前说一句吧,到达逻辑能力的至高境界,其表现是用数学语言来描述问题和问题的解决
办法,高度抽象!好,说回来吧,你要提高逻辑能力,最快的办法就是读别人写的结构优秀
的程序。优秀的代码是百读不厌的 (这句话是我抄来的),暂时放放对其中某种技术和技巧
的关注吧,你要推导和学习的是这些好程序的逻辑结构,它们是被精心设计出来的。你可以
先捂住这个 demo程序,自己设计一个功能相同的程序结构,然后比较一下demo的程序结构
,如果差距较大,那你就不应简单地改进一下,而是要把demo作者设计的过程在心里复原一
遍,做到这一点也许有点困难,但这种事干的多了,你就会越干越快,越来越得心应手,你
的逻辑能力飞速提升,你能看得上的逻辑结构优秀的程序开始不多了,下一步就是练习。从
工作中开始吧,如果你有空闲,你需要做至少两类练习,一类是算法练习,所有的经典算法
都是经典的逻辑,题目有的是,像个好学生一样吧,每年的国内国际编程竞赛都有逻辑要求
非常高的题,你可以只选一两道难题来做做。当你可以把复杂的单递归程序(只有A调A)变成
非递归程序时,已经不错了,如果你能看得懂双递归程序(A调A、A调B、B调A、B调B都有),
我为你鼓掌!你不必往下看了,我有点不好意思啦――班门弄斧,你快滚蛋吧!另一类是把
以前和当前你工作中你不满意的程序推倒重新设计一遍,这非常重要,省时省力,因为你熟
悉需求,技术上也没问题,目的就是改进程序的逻辑结构,很划算哦,唯一要克服的就是:
你对推翻以前工作中那点小小成就的心理障碍,如果你真想优秀,说句粗话:这点心理障碍
算个屁,一遍遍反复地推倒已有的成果只能使自己快速进步,放手干吧,没什么好可惜的,
马恩早就在《共.产.党宣言》里说过了:在这个过程中,你失去的只有锁链(禁锢你思想的
锁链)。让我们来总结一下,经过自我否定后,再生的你尽管对过去的“业绩”还有一些眷
恋,但已是一个初步具备职业水准的程序员了,掌握了相应的技术和技巧,具备了较高的抽
象逻辑思维能力,最主要的特征是:能自觉地自我否定,不断地追求更高水平的逻辑能力。
在这个过程中,如果你能注意以下一些小的方面,你前进的步伐也许会快一些。
l         从编译原理的角度来理解你工作中使用的高级语言,如果你做到这一点,至少有
两个好处,第一个好处是避免一大堆低水平重复出现的编译错误。一名优秀的 Coder平均在
一个工作日中应该完成200行以上的源码,其编译错误应该控制在5个以下,要知道这200行
源码不是一次完成的,所以大多数情况下你都要追求一次编译通过,而一名职业水准的程序
员,应该进一步做到即使用purify这类的工具来检查源码,也不会存在严重的内存泄露。第
二个好处是可以提高源码的可读性和效率。规范地编写你的代码使你自己的逻辑清晰,因为
你明白多加几个括号和空行、多换行对齐、多注释,编译器是会自动识别的,不影响程序执
行的效率,反过来,控制好递归调用和循环内的if语句才是提高程序效率的关键,要全力避
免递归,但要深刻理解递归,能通过自己建立堆栈来把递归程序转换成非递归程序,要求还
是较高的哦
l         避免思维陷阱,只要你是人就一定有自己的思维惯性,这一定又会表现在你的程
序逻辑中,有时你就是从这个惯性中跳不出来(谁都有这个时候),但要心里有数才行,所以
你需要帮助,如果你有几个水平相若或更高的职业伙伴,太好了,当遇到花30分钟还打不下
的bug时,就别浪费时间了,找他们吧,最要紧的是能思路清晰明确地表述你的问题,通常你
自己在这个过程中或者伙伴中就有人把问题解决了,又快又好。另外,有几个可以良性竞争
的职业伙伴是人生的一件幸事,1+ 1>2,大家各有所长,你最好做到及时公开你的成果,技
不压身嘛,IT发展的这么快,你再优秀,那点东东也没有什么值得隐藏的,所以你可以技术
或水平不够高,但千万不可以让真正具有职业水准的选手鄙视你的职业品质和行为。
l         有自己debug的特点,下面的说法作者不敢太肯定,只是经验之谈。即使在VC这
种高度完善的开放环境下,你仍然应该要求自己仅凭打印语句就能 debug。这也有两点好处
,第一个好处是,遇到bug你会认真想问题所在,而不是用debug工具一步步简单地追踪卡在
哪儿了,你定位bug范围的方式是从大到小、从粗到精,这是一种自顶向下的思维方式,而
用工具追踪,容易形成自底向上的思维方式,这不算好,你应该看到森林,再看到树木。我
反复提及:程序就是逻辑过程,大多数程序从main函数开始,是由数据结构和功能子程序组
成的一个树形结构的逻辑过程(要认清即使是面向对象的程序语言也是一样的),它的执行过
程是深度优先的,但你定位bug应该是广度优先的,好好想想这一点,嗯?第二个好处是强
迫你思考并记住而不是用工具看到调用过程,你大脑的抽象逻辑思维能力和胳膊上肌肉的力
量一样,都是练出来的,如果你的bug是程序结构上的逻辑错误引起的,这一点就非常重要
了,顺便说一句,最难打的 bug就是程序逻辑结构错误导致的bug。你要是真正明明白白地
认识到这儿了,那我就没什么东西可以告诉你了。总之,程序员的职业水准:生产效率和程
序质量,主要是取决于源码中bug的数量和debug的速度,而不是取决于编写源码的速度。给
你一个我自己定义的考查一个职业程序员的指标:一个合格水准的职业程序员,编程的时间
如果算一份的话,其累计debug的时间不能超过一份,真正职业高手累计debug的时间应该控
制在0.5份以下,如何?你关上门悄悄问问自己,你花费在编程和debug上的时间比例是多少
?如果你把程序员作为自己一生的职业,那么就永远都要牢记一点:追求做一个0 bug的优
秀程序员!这是任何一个想成为职业程序员的人的理想,请相信:坚忍不拔地追求实现这个
理想将让你出类拔萃!
l         做好程序的单元测试,这是另一项考查你是否是一名具有合格职业水准的程序员
的一个必要指标。其实在你拿到需求的时候就要准备单元测试用例了,并且这些用例将直接
影响你的详细设计(有关软件设计本来是该放在第四节讲的)。我们还是打比方吧,当你拿到
一个需求时,除了分析它静态的功能外,还应明确它动态的操作 /执行过程,把这个动态过
程明确地用流程图画出来,比如分为A~Z的26步,其中A又可以进一步分解为A1~A5的5步,
直到不能再分解为止。又比如说 A3步不可分解了,那么你应该把A3步的正常操作和所有五
花八门的异常操作都列出来,确保正常的操作肯定正确,异常的操作起码程序不退出才行。
这样你就要写好多好多的测试用例,说句老实话,我也从来不写!但我一般会列一个提纲,
比如A3步有正常的操作a、b、c、d、e共5项,异常的操作有f、g、h、 i、j、k、l、m、n共
9项,你在进行单元测试时都应该跑一遍,这样的程序都还不敢说质量如何好,但起码可以
说较稳定吧!如果要想在进行单元测试时干得快、效率高,那么在进行详细设计时,你就应
该把A3步中对所有正常操作和异常操作的判断都设计好,在编程实现A3步时,使得程序的结
构合理高效,对不对?所以,如果你在工作中是割裂地看待软件工程中从需求、分析、设计
、编程、测试等各个环节,恐怕水平很有限喔!但如果你在分析需求时就能看到测试的问题
,并改进设计和实现,为此做好相应的准备工作,嘿嘿,整个软件开发过程你的效率会高很
多,通常你在一个开发团队中就会高度自信的,你已越过当一名偏颇、露骨的高手的境界,
成为一个平静的高手,这可是The best in the best!,用周星星的话说:是高手之高高手
,因为别人看不出你高在哪儿,没见你有什么高招或特拚命干,但反正你就是干得又快又好
、又省力。关于进行单元测试还有很多复杂的方法,在此本文只提到了最基本的一点,目的
是让你在工作上考虑周全、安排有序,其它的自己琢磨吧,没有人能替你吃饱饭!
l         如果你是用C++编程,我再简单谈谈有关内层释放的一个小技巧,就是对所有
你编写的类,在构造和析构函数中加打印语句,统计每个类在运行程序时构造和析构的地方
,如果是配对的,那么起码没有对象类一级的内层在程序运行结束时没有释放,然后你就可
以把打印语句删掉了,招数虽土,但管用!
l         还有其它一些好习惯,在这里我随笔写一些,你要是有不同看法也请一笑过之吧
。编程时应该对齐缩进,一个缩进用一个tab键,一般是4个空格,严格遵守开发团队的编程
规范也是非常重要的。一个子程序不应超过30行(不算空行),其内多重循环不应超过3层,
否则都应该分裂成两个子程序,个别算法程序可以长一些,但也不宜超过200行。通常一个
类的所有成员函数总和不宜超过1500行,多了就应该考虑分解成两个类(这个工作最好在设
计时就完成)。每完成一小段程序,比如15~30行,就立即编译运行,不要假装高手,先敲
它一大堆程序,再编译运行,妄想一次成功,体验一种假爽的、虚荣的快感,或炫耀给别人
看,这么做只能证明自己是一个不折不扣的傻瓜,装酷而已。因为只要有一次不成功,你就
会花费大量的时间来调程序,别人的进度在这时就远远地超过你了,平常心是道,还是修炼
真功夫吧!孙子兵法里关于这一点有明确的阐述,我就不引用了,但建议你真的不要这么干
,除非你确实就是这样总是一次就成功的天才,那你还看这篇文章干什么呢?我又不是写给
你们这些天才们看的。再就是有学会买好书、读好书,关于计算机和软件方面的书太多了,
时间有限,比如有一个叫侯捷的家伙,几乎写的每本书都不错,张国峰的C++编程也不错
,这只是我的个人意见啊,好书多着呢,列出来比这篇文章长好多倍,我就不多说了。还有
一招,要是你运气好,能搞到一些著名软件系统的源码,好好读读吧,在此我只能告诉你,
Linux操作系统的一些源码不错,是开放的,你可以合法地搞到,其它的不要说是我建议你
侵犯知识版权啊!

--
做了过河卒子,唯有拼命向前。
※ 来源:.荔园晨风BBS站 http://bbs.szu.edu.cn [FROM: 218.17.74.45]
--
※ 转载:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.95.1]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店