??xml version="1.0" encoding="utf-8" standalone="yes"?>
]]>
]]>
]]>
W六?nbsp; 试驱动设计
单元试是一Ҏ升代码质量的极佳实践 。经q测试的代码能更好地保证~码的意囑֒实际l果相符。测试驱动开发,因ؓ坚持先写试后写代码的方式,带来了更多的好处。当把Y件工E和其他的工E科学进行比较的时?我需要一些隐ȝ表达)他们之间的重要差异就会显现?/p>
严格遵守TDD(试驱动开?的方式还回带来非常多的好处!TDD建立了一U消Ҏ识:当你~写一个单元测试的时候,其实你正在创建待开发代码的W一个消费者。这让你思考,在测试之外,我们会如何用这个类?/p>
很多开发h员都有这Ll历Q在写一个大cȝq程中,一路伴随着很多的假设或者臆断。然而当你真的开始用这个类Ӟ你才认识C些假设是错误的。然后,你只好去重构代码。TDD要求你在写代码之前先创徏它的W一个消费者,q会让你L考其他代码最l会如何使用q些待开发的代码?/p>
恩,从自q手的几个目来看Q单元测试的都是非帔R帔R要的。首先你需要保证的是你写的?00%正确的。。(q虽然不太可能)但v码当用户需求不变的时候,你的q个是正的。把写代码和试代码搞成一个螺旋开发的事实。。不断调整进度。。其实这样子才是最省时省力的方法?/p>
对设计的影响。TDD通过以下形式Q来改进代码的设计:
1 它帮你养成了很好的代?#8220;消费意识”Q因为在开始写代码之前Q就需要创建第一个消费者?/p>
2 保持对及其简单的一些情况进行测试(以及持箋不断地测试)Q能在你不小心把臛_重要的基设施破坏了之后及时的发出警告?/p>
3 对边界情늚试是必不可的。那些难以被试的代码,可以把它们重构得更加单,而如果真的无法简化他们的话,也应该想办法严格试它们Q不多么困难。因为复杂的事情更需要测?/p>
4 永远保持把测试作为构E的一部分。Y件中最奇怪的事情Q莫q于在修改一块完全不相关的代码时Q不心出发?#8220;副作?#8221;。有了单元测试这张安全网Q确实能替你节省很多的时间和力气?/p>
5 有一套健壮的单元试Q允怽q行一些异惛_开的重构游戏(q行大量的修改,然后q行试来看看这些修Ҏ带来的媄响)。记得第一ơ和一些已l习惯于单元试的开发h员一起动手修改代码时Q我也是非常紧张Q因为大量的修改往往会破坏很多东西,但他们看h丝毫没有犹U。逐渐圎ͼ我也放下心来Q因为我慢慢的认识到Q有了测试的保证Q完全可以发信大胆地M改代码?/p>
以上几条Q的是金玉良言啊!往往开发的成|与否Q都在如此细节与习惯当中?/p>
1 当你们用了某个重要东西的多个版本,事实证明q样的东西一定会失去同步?/p>
DRY Don`t Repeat yourself, DRY
DRY版本控制
作ؓ一U显而易见的规范性应用,版本控制在绝大多数开发企业中已经成ؓ常态,版本控制是一U规范化的时_因ؓ真正的文件只存在于版本控制中。版本控制在处理文g版本斚wh很多好处Q同时它是一U强大的备䆾机制Q把你的元代吗保存在一个安全的场所Q远d发者机器上单一文g实例Q!
q的是一个良好的规范Q而现在在实验室中Q很多项目根本就没有版本控制q一说法。。之前的GuardpȝQ里面是有CVS?–》Current Version Control。。可是现在开发的3l步态模拟分析中Q根本就没有。。这也给目带来了很多不必要的麻烦。。。经常被q些东西弄的头大。。。一个练好的版本控制完全可以解决q些问题。。?/p>
工具应该鼓励好的行ؓQ惩|坏的行为。尽早尽可能皮帆提交文g到版本控制中Q鼓׃q行步改动。如果进行了长时间的改动Q你׃面合ƈ冲突的问题。认识到q一点将鼓励你越发经常地提交。这U工具生了一U有用的张力Q以微妙但有益的方式改变了你的工作方式。好的工具应当鼓励好的行为?/p>
当以后自׃责项目的时候,一定要实行成型的Y件版本控制方法。。尽量提高团队的合作能力和效率。。这个差别好大。。?/p>
E序员修g道。。{云风的一blog
上次读这本书已经是在五年前。中文版刚出版我׃了一本。那个时候我的工作相Ҏ较清Ԍ有大量的旉阅读。恰巧我在负责公司的校园招聘以及新员工培训,非常需要一些不错的教材Q更早的时候听说过q本书的英文版,但是没能一读,中文版自是不能放q。另外,那年我在写书Q记录一些程序员生中的心得Q对l验的ȝ都颇有兴?
׃释手Q是我第一ơ读完后的心境。完整的l历了h生中W一个成功的大的软g目后,我有许多感慨。不东西知道怎么做对Q怎样做不对,但是要一条条写下来,却不知道怎么ȝ。这本书说出了许多我惌Q而不知道该怎么说的道理?
接下来的日子Q我在公司做q好几次技术培训,N都是以这本书中的某个或某几个观点Q结合自ql历展开的。对于信L的同学,我L把这本书列在l他们开的书单的W一本?
后来Q国内又译引进了几本类似的好书。比如?a >代码大全》,?a >Unix ~程艺术》。古ZQ读书有三上Q马上、枕上、厕上。我q真把书C好几本,床头、办公桌上各|一本,方便睡前、如厕时阅读Q手机里攑օ电子版,上下班\上,偶尔阅。这些书的确是值得逐章挑选出来,反复_读的。《程序员修炼之道》却于几q前推荐l新入职的同事,从我的视野里消失了?
q几天,同事把书q了我,加上 周筠老师 发给我电子版Q我又重M一遍。原以ؓ那些嚼烂了的东西Q不会再有新味道Q但是我错了?
不同的h从不同的角度用不同的方式Q阐q相同的道理。其中细微的差异Q是需要读者有了许多许多的l历后,才能体会的。比如,在《程序员修炼之道》中׃六页分析 DRY - Don't Repeat Yourself 原则Q而在《Unix ~程艺术》中把它UC SPOT - Single Point of Truth Q大U用了一半的篇q。他们真是是惌辑֮全一致的理念吗?我看未必。所以,作ؓ读者,同样会有许许多多的想法。随着~程l历的越来越多,思考次数的增加Q重新和q些前辈的思想相印证,也是一件乐事?
我们以ؓ理解了作者,其实是误解。但我们再一ơ理解编E?
从上qͼ看来q本书还是不错的。。可惜啊Q自׃大一的时候就接触了这本书。。直到现在,仍然没有深入M遍。。没有一定的l验Q读q种书就是浪Ҏ间。。?/p>
搜的时候,搜到了另外一帖子。。。{q来一起吧。?/p>
作者:林庆忠,1990q毕业于昆明工学院计机软g专业Q后又于1999q毕业在南京大学Q完成Y件工E专业硕士的学习Q现供职于CNPC旗下的一个行业Y件研发中心,因ؓ在网上看了许多有l验的各路Y件开发h员写的好帖,一时手痒兴P也凑一壮壮声ѝ?br>假设你是一名Y件专业毕业的本科学子Q如何在工作中修炼成Z名有较高职业水准的程序员呢,本文试图ȝ作者从?5qY件开发工作的感想Q希望对有志成ؓ职业E序员的人有所帮助Qƈ借此Z感谢原昆明工学院计算机系的和智玲老师和张怀宁老师Q特别感谢我的硕士导师,南京大学计算机系的博导郑国梁教授?br>注:本帖a辞尖刻,乃作者脾气秉性Ӟ如果你看着有气Q就请多多见谅,放下别看了?br>E序是一pd按步骤进行的操作序列Q?它有好多U别,比如最低的微E序、次低的汇~程序、高U的各种~程语言E序、最高的脚本语aE序Q也许我列的不对Q但没关p,我要说的是不是那个U别的程序,其本质都是操作的逻辑序列。大多数pȝ和应用程序都是徏立在高~程语言上的Q比如C、C++、C#、FORTRAN、BISIC、JAVA{等Q就让我们只xq一U的~程能力吧。因此如果一个程序员的逻辑能力不高Q他永远都不能成Z名具有合D业水准的E序员,我们在下面的讨论有关~程能力的方斚w面,最l都是ؓ了最大程度地提高和实C名程序员的逻辑能力?br>掌握基础知识Q十六年寒窗的持l积?/strong>
?岁读学Pl过16q的学习Q你从Y件专业本U毕业后Q必d成以下几门专业课E的学习Q计机l成、操作系l原理、汇~语a、数据结构、编译原理、数据库原理、Y件工E、结构性设计语a(PASCAL、C)、面向对象设计语a(CQ+、CQ?、计机|络{,你最好还懂一些算法分析、分布式pȝ、计机囑Ş学、Ş式逻辑、h工智能原理、Y件设计模式、Y件构?框架{研I生的课E,16q来Q你U篏的除了知识,更重要的是Ş成最适合自己的学习方法和工作Ҏ。这些是你具备程序员职业水准的基能力Q不要受什么计机软g怪杰之类传奇的媄响,那不q是概率事Ӟ而且q些怪杰们就没有读qY件本U和研究生,也往往自学了大多数专业评Q很可能比在校学习的学生对这些课E的_N部分理解的更好, q有他们的工作方法和思维方式是特别而高效的Q但普遍性差Q可以借鉴Q不宜模ѝ好Q所以现在你只需要问问自己,那些评和知识都学会q掌握了吗?如果是,那就准备好进行实践了?br>在实践中提高Q成Z名高水^的Coder
好了Q你毕业了,在校功课都不错,也找了一个专业对口的工作Q你惛_展`图了Q可是别急,你的膀q不够硬Q不信我们说来看看?br>通常Q你在工作中都会用到某一U单?公司固定的操作系l和~程语言开发环境,比如Windows、UNIX、LINUX{操作系l,又比如用VC、VB、PB、Delph、JAVA、Motif/XWindow、QT、OpenGL、OpenInventor{编E语a和开发环境,我们在后面把它们合称为开发环境。就在校学习的有兛_发环境的知识而言Q大概你距工作需要的差距是不的Q当某个操作pȝ和编E语a环境成ؓ你的饭碗Ӟ׃应也不能用通过评/认证考试之类的眼光和要求来评价你的能力,即你能?00分。你需要深入地学习该操作系l和~程语言环境的各cd发手册的所有内容,你会说大多数你都用不上,其实你既对又不对Q对的是单从使用的角度而言Q你实用不上开发手册的大多数内容,比如庞大的VC开发类库和复杂的开发环境,你在实际工作中能用到的不到L?/10?/5Q不对的地方在于Q你用到的部分不是孤立存在的Q它们是整个体系中的一部分Q只有对整个体系有了一个较完整的了解,才能得心应手、随心所Ʋ地用好你用到的部分Q你才算初步具备在这U开发环境下q行Coding的职业水?q远不够E序员的职业水准?Q而这只是刚开始。如何才能真正掌握一U开发环境的全面的知识呢Q最原始的办法就是读开发指?教程、参考手册,一般来Ԍ学习开发指?教程Ӟ你如果是一个认真的人,都会完成5/10~7/10左右内容的学习和l习Q如果你x业选手Q就应该完成9/10以上内容的学习和l习。参考手册不同,大多数所谓的“E序?#8221;们只是用C才翻,q差的太q了Q你应该象读开发指?教程一P每个环节都要读,比如VCQ参考手册中的每个类Q类的每个函敎ͼ都要M几遍Q它们往往是一伙一伙地纠~在一起用的Q开始时d你毫无头l、心烦意乱,不要紧,q有一手呢Q如果你开发环境安装的全面Q它们往往都有开发商做的demo例子可看Q你p入另一个境界了Q开始时你关注demo中的具体技术,后来你发现这些demo的程序写的都q算不错Q结构简单但合理Q如果你真的用心Q就一定能发现一些个别的demo是极品,它所展现的程序逻辑l构是你设计不出来的Q你现在有点更关心它的程序设计构Ӟ甚于对你原始目的(某种相关的技?技?的关注,q时的你Q开始了从一名Coder向一名Programmer的{变,你会忍不住要看看开发商提供的源E序Q比?h?cppQ通常你会扑ֈinclude路径下所有的.hE序Q你才知道,哇!好多好多东东在参考手册中都没提到Q你要学的太多了Q没旉֏其它的业余爱好了Q现在知道ؓ什么程序员是年Mh的职业了吧, ?你要有够多的时间才行,即你的智商?60。如果你走到q一步,在你工作的团队中Q已l是l常有h向你h技术问题,l常有hh你帮忙debugQ你已是公认?#8220;高手”了,别得意,因ؓ你仍然是个CoderQؓ什么这么说呢,你想惻I你已深入了解了这个开发环境中的各U技能,知道一名Coder如何用好q些东西Q可是你能设计的出提供给Coder们用的东西吗Q唔……Q你想了惻I可能q不太行。对了,是q样Q你q是一名小我境界的E序员呢Q本质是个CoderQ当然已是一名高水^的Coder了,然而你需要进一步登堂入室才能成Z名真正的E序员?br>让我们l吧Q通常你都是从_N一U编E环境开始的Q?strong>假设你已l较为精通在Windows下用VC开发Y件了Q这时在技术和技巧方面你面临一一大两个挑战,W一个小挑战是如果公?单位Ҏ了开发环境,比如用LINUX下的QT交互语言工具q行开发,你不q是把前面掌握VC的过E再来一遍,׃在主观上l历了VC工具的学习过E,在客观上各种开发环境都有太多相似的斚wQ这回你掌握的应该较快?/strong>要小心,在这时第一ơ诱惑之门打开了,因ؓ你感觉良好,看!q回q么快,我就q么好地掌握了新的开发环境,你开始关注其它暂时还用不到的同类环境Q比如VB、Delph、JAVAQ如饥似渴地掌握各种开发工P证明自己的学习能力和价|但你忘了一点,你仍然是个CoderQ只不过是一个在好多开发环境下都能~程的CoderQ就像你生活在中国,因而精通了汉语Q工作需要你又掌握了pQ然后你来了劲Q把俄语、日语、阿拉伯语、拉丁语Q等{等{,都学习个遍, ?我只能说Q有点BT。你忘了自己是个职业人,同一cȝ东西工作中用得到才需学习Q太多太多的Coder们喜Ƣ在一h较和炫耀自己会掌握了几种开发工P不信你看看招聘时的求职书q道了QsighQ?/strong>他们中绝大多Ch永远都只能停留在q个层次上,心Q气躁Q一生都再也当不成真正的E序员了。ȝ一下,其实你在q时需要的是对自己掌握新开发环境的能力的自信,而不是一遍遍地重复来证明自己。第二个大挑战就是你明白了只掌握VC是不够的Q你发现自己有点薄Q有很多东东你会用但你不太懂Q很多方面支持VC~程的知识你都没掌握Q比如操作系l的源码、网l协议知识、Windows 的注册表、进E和U程的基知识、硬仉动方面的知识、ActiveX、Windows 庞大?APIQ又是一个等{等{,q些基础知识的学习和掌握可是要花费大量时间的Q你再一ơ深切地感到旉太不够用了,因ؓq时的你大概有许多俗务缠w了Q所以有Ҏ丧,q不用提IT业每天不知有多少C西在发布QKAOQ永q都跟不上,拉远了。哎Q别气馁Q振作一点,你还是忘C自己是个职业人,既然好多东东在工作中你永q都没机会用Q那么干嘛要学呢Q用什么才学什么,最多预到马上要用什么,先一步学什么好了,要知道没有h是真正的、无所不精的全U大夫,除非你是,但如果你q在耐着性子看这文章,你肯定是个h嘛?br>OKQ一般工作后三五q_你经历了上述q程Q经受了诱惑和考验Q终于明白了一个道理:你要的是强劲的学习知识的能力Q是ҎUY件知?技能的有深度的_N,一U摸到它的根的深度,而不是已掌握的技能的U类和数量。这时无用他掌握了多种你不会的技能来吓唬你都没用Q你对他的层ơ只有蔑视。通过几年的学习和工作Q要C最重要的一点,永远最重要Q对自己学习IT知识能力的自信,一个程序员一生都要不停地q行高强度的学习Q用心问问自己,有没有这个自信?别用虚荣心来骗自己哦Q如果没有的话,那就不必p你宝늚旉向下看了Q作者在此感谢你有耐心看到q里Q现在徏议你关闭q篇文章Q趁着q轻Q当机立断{行吧Q?
注重逻辑Q成Z名职业程序员
好,再前q一点点Q你p成ؓ一名职业程序员了,让我们l来完成q个d吧!我们在前一节提到过Q?#8220;你发C些个别的demo是极品,它所展现的程序逻辑l构是你设计不出来的Q你现在有点更关心它的程序设计构Ӟ甚于对你原始目的(某种相关的技?技?的关?#8221;Q其实你是在xq个demoE序作者的思维逻辑Q所有程序的本质是逻辑。技术你已经较好地掌握了Q但只有完成逻辑能力的提高,你才能成Z名职业程序员。打一个比方吧Q你会十八般武艺Q刀枪棍都很精通,但就是力气不够, ?所以永q都上不了战场,q个力气对程序员而言是逻辑能力(其本质是一个h的数学修养,注意Q不是数学知?。逻辑能力也是逐步提高的,开始时你一定是用直观的逻辑能力来编E的Q怎么惛_怎么~,不对再改,在改q中提高自己的逻辑能力Q从直观逻辑能力提高到抽象逻辑能力Q这是很正常的。提前说一句吧Q到N辑能力的至高境界,其表现是用数学语a来描q问题和问题的解军_法,高度抽象Q好Q说回来吧,你要提高逻辑能力Q最快的办法是d人写的结构优U的程序。优U的代码是百读不厌?q句话是我抄来的)Q暂时放攑֯其中某种技术和技巧的x吧,你要推导和学习的是这些好E序的逻辑l构Q它们是被精心设计出来的。你可以先捂住这个demoE序Q自p计一个功能相同的E序l构Q然后比较一下demo的程序结构,如果差距较大Q那你就不应单地改进一下,而是要把demo作者设计的q程在心里复原一遍,做到q一点也许有点困难,但这U事q的多了Q你׃干快Q越来越得心应手Q你的逻辑能力飞速提升,你能看得上的逻辑l构优秀的程序开始不多了Q下一步就是练习。从工作中开始吧Q如果你有空Ԍ你需要做臛_两类l习Q一cL法l习Q所有的l典法都是l典的逻辑Q题目有的是Q像个好学生一样吧Q每q的国内国际~程竞赛都有逻辑要求非常高的题,你可以只选一两道N来做做。当你可以把复杂的单递归E序(只有A调A)变成非递归E序Ӟ已经不错了,如果你能看得懂双递归E序(A调A、A调B、B调A、B调B都有)Q我Z鼓掌Q你不必往下看了,我有点不好意思啦――班门弄斧,你快滚蛋吧!另一cL把以前和当前你工作中你不满意的程序推倒重新设计一遍,q非帔R要,省时省力Q因Z熟悉需求,技术上也没问题Q目的就是改q程序的逻辑l构Q很划算哦,唯一要克服的是Q你ҎM前工作中那点小成就的心理障,如果你真想优UQ说句粗话:q点心理障碍个屁,一遍遍反复地推倒已有的成果只能使自己快速进步,放手q吧Q没什么好可惜的,马恩早就在《共.?党宣a》里说过了: ?在这个过E中Q你失去的只有锁?锢你思想的锁??br>让我们来ȝ一下,l过自我否定后,再生的你管对过ȝ“业W”q有一些眷恋,但已是一个初步具备职业水准的E序员了Q掌握了相应的技术和技巧,具备了较高的抽象逻辑思维能力Q最主要的特征是Q能自觉地自我否定,不断地追求更高水q的逻辑能力?br>在这个过E中Q如果你能注意以下一些小的方面,你前q的步伐也许会快一些?br>从编译原理的角度来理解你工作中用的高语言Q如果你做到q一点,臛_有两个好处,W一个好处是避免一大堆低水q重复出现的~译错误。一名优U的Coderq_在一个工作日中应该完?00行以上的源码Q其~译错误应该控制?个以下,要知道这200行源码不是一ơ完成的Q所以大多数情况下你都要q求一ơ编译通过Q而一名职业水准的E序员,应该q一步做到即使用purifyq类的工h查源码,也不会存在严重的内存泄露。第二个好处是可以提高源码的可读性和效率。规范地~写你的代码使你自己的逻辑清晰Q因Z明白多加几个括号和空行、多换行寚w、多注释Q编译器是会自动识别的,不媄响程序执行的效率Q反q来Q控制好递归调用和@环内的if语句才是提高E序效率的关键,要全力避免递归Q但要深ȝ解递归Q能通过自己建立堆栈来把递归E序转换成非递归E序Q要求还是较高的哦!
避免思维陷阱Q只要你是h׃定有自己的思维惯性,q一定又会表现在你的E序逻辑中,有时你就是从q个惯性中跳不出来(谁都有这个时?Q但要心里有数才行,所以你需要帮助,如果你有几个水^相若或更高的职业伙伴Q太好了Q当遇到?0分钟q打不下的bugӞ别费旉了,找他们吧Q最要紧的是能思\清晰明确地表qC的问题,通常你自己在q个q程中或者伙伴中有人把问题解决了,又快又好。另外,有几个可以良性竞争的职业伙伴是h生的一件幸事,1+1>2Q大家各有所长,你最好做到及时公开你的成果Q技不压w嘛QIT发展的这么快Q你再优UQ那点东东也没有什么值得隐藏的,所以你可以技术或水^不够高,但千万不可以让真正具有职业水准的选手鄙视你的职业品质和行为?br>有自己debug的特点,下面的说法作者不敢太肯定Q??只是l验之谈。即使在VCq种高度完善的开攄境下Q你仍然应该要求自己仅凭打印语句pdebug。这也有两点好处Q第一个好处是Q遇到bug你会认真想问题所在,而不是用debug工具一步步单地q踪卡在哪儿了,你定位bug范围的方式是从大到小、从_到_,q是一U自向下的思维方式Q而用工具q踪Q容易Ş成自底向上的思维方式Q这不算好,你应该先看到林Q再看到树木。我反复提及Q程序就是逻辑q程Q大多数E序从main函数开始,是由数据l构和功能子E序l成的一个树形结构的逻辑q程(要认清即使是面向对象的程序语a也是一L)Q它的执行过E是深度优先的,但你定位bug应该是广度优先的Q好好想惌一点,嗯?W二个好处是你思考ƈC而不是用工具看到调用q程Q你大脑的抽象逻辑思维能力和胳膊上肌肉的力量一P都是l出来的Q如果你的bug是程序结构上的逻辑错误引v的,q一点就非常重要了,Z说一句,最难打的bug是E序逻辑l构错误D的bug。你要是真正明明白白地认识到q儿了,那我没什么东西可以告诉你了。MQ程序员的职业水准:生效率和程序质量,主要是取决于源码中bug的数量和debug的速度Q而不是取决于~写源码的速度。给你一个我自己定义的考查一个职业程序员的指标:一个合格水准的职业E序员,~程的时间如果算一份的话, ?其篏计debug的时间不能超q一份,真正职业高手累计debug的时间应该控制在0.5份以下,如何Q你关上门悄悄问问自己,你花费在~程和debug上的旉比例是多?如果你把E序员作׃生的职业Q那么就永远都要牢记一点:q求做一? bug的优UE序员!q是M一个想成ؓ职业E序员的人的理想Q请怿Q坚忍不拔地q求实现q个理想让你出cL萃!
做好E序的单元测试,q是另一考查你是否是一名具有合D业水准的E序员的一个必要指?/strong>。其实在你拿到需求的时候就要准备单元测试用例了Qƈ且这些用例将直接影响你的详细设计(有关软g设计本来是该攑֜W四节讲?。我们还是打比方吧,当你拿到一个需求时Q除了分析它静态的功能外,q应明确它动态的操作/执行q程Q把q个动态过E明地用流E图d来,比如分ؓA~Z?6步,其中A又可以进一步分解ؓA1~A5?步,直到不能再分解ؓ止。又比如说A3步不可分解了Q那么你应该把A3步的正常操作和所有五花八门的异常操作都列出来Q确保正常的操作肯定正确Q异常的操作LE序不退出才行。这样你p写好多好多的试用例Q说句老实话,我也从来不写Q但我一般会列一个提UԌ比如A3步有正常的操作a、b、c、d、e?,异常的操作有f、g、h、i、j、k、l、m、n?,你在q行单元试旉应该跑一遍,q样的程序都q不敢说质量如何好,但v码可以说较稳定吧Q如果要惛_q行单元试时干得快、效率高Q那么在q行详细设计Ӟ你就应该把A3步中Ҏ有正常操作和异常操作的判断都设计好,在编E实现A3步时Q得程序的l构合理高效Q对不对Q所以,如果你在工作中是割裂地看待Y件工E中从需求、分析、设计、编E、测试等各个环节Q恐怕水q_有限喔!但如果你在分析需求时p看到试的问题,q改q设计和实现Qؓ此做好相应的准备工作Q嘿嘿,整个软g开发过E你的效率会高很多,通常你在一个开发团队中׃高度自信的,你已过当一名偏颇、露骨的高手的境界,成ؓ一个^静的高手Q这可是The best in the bestQ,用周星星的话_是高手之高高手,因ؓ别h看不Z高在哪儿Q没见你有什么高招或Ҏ命干Q但反正你就是干得又快又好、又省力。关于进行单元测试还有很多复杂的ҎQ在此本文只提到了最基本的一点,目的是让你在工作上考虑周全、安排有序,其它的自q吧Q没有h能替你吃饱饭Q?br>如果你是用CQ+~程Q我再简单谈谈有兛_层释攄一个小技巧,是Ҏ有你~写的类Q在构造和析构函数中加打印语句Q统计每个类在运行程序时构造和析构的地方,如果是配对的Q那么v码没有对象类一U的内层在程序运行结束时没有释放Q然后你可以把打印语句删掉了,招数虽土Q但用Q?br>q有其它一些好习惯Q在q里我随W写一些,你要是有不同看法也请一W过之吧。编E时应该寚w~进Q一个羃q用一个tab键,一般是4个空|严格遵守开发团队的~程规范也是非常重要的??一个子E序不应过30?不算I)Q其内多重@环不应超q?层,否则都应该分裂成两个子程序,个别法E序可以长一些,但也不宜过200行。通常一个类的所有成员函数d不宜过1500行,多了应该考虑分解成两个类(q个工作最好在设计时就完成)。每完成一段E序Q比?5?0行,q即编译运行,不要假装高手Q先敲它一大堆E序Q再~译q行Q妄想一ơ成功,体验一U假爽的、虚荣的快感Q或炫耀l别人看Q这么做只能证明自己是一个不折不扣的ȝQ装酯已。因为只要有一ơ不成功Q你׃p大量的时间来调程序,别h的进度在q时pq地过你了Q^常心是道Q还是修炼真功夫吧!孙子光|里关于这一Ҏ明确的阐qͼ我就不引用了Q但你真的不要这么干Q除非你实是q样L一ơ就成功的天才,那你q看q篇文章q什么呢Q我又不是写l你们这些天才们看的。再是有学会买好书、读好书Q关于计机和Y件方面的书太多了Q时间有限,比如有一个叫侯捷的家伙,几乎写的每本书都不错Q张国峰的CQ+~程也不错,q只是我的个人意见啊Q好书多着呢,列出来比q篇文章长好多倍,我就不多说了。还有一招,要是你运气好Q能搞到一些著名Y件系l的源码Q好好读dQ在此我只能告诉你,Linux操作pȝ的一些源码不错,是开攄Q你可以合法地搞刎ͼ其它的不要说是我你R犯知识版权啊Q?
天生力Q成为系l分析员
本来pq如何成Z名职业程序员而言Q本文已基本完成d了,但《菜根K》有aQ??竭世机枢Q似一滴投于巨壑,I玄辩Q若一毫置于太虚。既已乘兴到此,何妨多置一毫于太虚呢,作者不才,q脆兴写算了?br>你要是运气好Q直接进入了一个严D范生产的软g企业׃Q刚开始就应该是按别h做好的Y件设计来实现~程Q你可以有机会直接学习Y件设计,当你U篏的够多了,能够对其中的一些设计提出好的改q徏议,而且q得又快又好Q就会渐渐地展露头角Q我怿你终有一天成Z名Y件设计h?注意Q不是Y件品设计h?Q步入系l分析员的行列,但这q需其它的一些条件和自我修炼。如果你在一个不规范的Y件企业工作,那也不错Q你很可能直接就有机会进行Y件设计,然后开发、测试,甚至q不得不自己定义需求,把Y件开发过E的各个环节C个遍Q当然这样对你的要求更高Q而且你也不容易得到及时有益的指点Q在正态分布的情况下,你应该是成长的很慢。但不管׃的单位如何,如果你决心要成ؓ尖软g职业选手Q通常什么客观困NL不了你,然而你个h的因素可能会L你的前进。下面提出的观点U属一׃见,伤h自尊之处作者在此提前道歉,q徏议你除非Ҏ文有强烈的兴,否则p直接看第五节或放下别看了。丑话已说在前头了,在各UY件开发组l的发展q程中的事实也证明,只有数E序员能成ؓpȝ分析员,我想q一点不是我杜撰的吧Q因此你要是在看接下来的部分时感到气愤难当,那也实在没着Q纯属活该,因ؓ作者只是在说明自己的观点而已Q你最多可以呲之以鼻,表示一下你的轻蔑好了, ?但没有Q何理由可以骂人!
作者自己没有到微Y面试q,但n处Y件行业,关于微Y的许多东东当然还是有耳闻的,据说微Y招聘一名程序员要过五个已经成ؓ微YE序员的面试养I而且是一否军_Q又据说大多数面试题q~程Q而是一些有关逻辑和智力的题,作者私下也做过许多传的微软面试题QƈҎ做法׃为然。程序的本质是逻辑Q所以几十年前就有h提出~程是一门艺术,而艺术是要靠天䆾的,q一点少有h反对。一个h的逻辑能力可以不断提高Q但其能到达的终极逻辑能力的层ơ必定ؓ其天生智力所限制Q这一点就让h不易接受了。好W啊Qh们可以公开承认自己没有某种或全部的艺术天䆾Q但要说自己逻辑天䆾不够Q换句话说承认自q、IQ不够高,往往是要怒发冲冠的,其实q又有什么区别呢Q话都说到这儿了Q再ơ徏议你如果不够自信Q就跌q一节吧Q直接看W五节,好吗Q?br>好了Q把话题说回来,你已l成Z门合格的职业E序员了Q如果要xZ事Y件系l设计的职业pȝ分析员,W一件事是悄悄找一个标准智商测试的|站或其它渠道,严格认真的测一自q智商Q如果IQ低于130 (正常智商?10)Q就请别费劲了,打消掉成为系l分析员的念头吧Q好Q好Q??先请你冷静一下,好好xQ其实微软面试时是在测你的智商和逻辑数学素质呢,q就是本节的标题?#8220;天生力”的原因,因ؓ设计是从无到有地进行创造,无论是Y件还是其它行业都一P可以有借鉴的,没有现成的,设计是创造!如果你IQ?30以上Q又军_要当一名职业Y件系l分析员Q其实你不过是要准备好吃更大的苦而已Q有什么好虚荣的呢Q?br>修炼q是从基本功开始的Q过E和成ؓ一名职业程序员差不多。必M用设计工兯一Ҏ不用多说的。在工作中,你基本上遇到的是两类方式的设计,一个是l构化设计,另一个是面向对象设计Q就个hl验而言Q面向对象的设计更好。如果你工作中不得不采用l构化的设计Q你必须熟练地掌握数据流囑֒控制图的分析和设计Q一般来Ԍ如果你把一个Y件中用到的数据模型设计好了,针对功能化的程Q不难设计出数据图Q但下一步设计控制流图才是挑战,如果你按照需求走不通设计好的控制流图,那么你或别h在按照这个设计编E实现时Q必定也C通, ?没有奇迹会发生,q是在设计阶D严D求吧Q又有一炚w要牢讎ͼq工是最慢的。当你在q行控制图的设计时Q也不要妄想得到需求h员提供给你明的指点Q通常他们要是能够把需求的功能和操作次序写完整的话Q你应该感恩戴德了Q从需求中整理出功能、操作的拓扑ơ序和条件是你作为系l分析员的职责。看看,要是没有一点图论的基础和拓扑学的入门知识,你是当不好一个职业系l分析员的,即你天赋不错,必要的数学和逻辑素质仍然不可或缺。也不用气馁Q永q没有最好的设计Q只有更好的设计Q反复地q行设计q代Q勇于推L的设计,你将快速进步。如果你在工作中是采用面向对象进行设计的Q那更有利了,有关面向对象设计的书太多了,不用作者在此多费口舌,_读一本经典的书,比如北大늻忠等~译的《面向对象的分析》,有些Ҏ和技巧可能过Ӟ但其逻辑的基本原理是非常正确的,其本质是Q你在逻辑上是如何认识q个世界的,你就是如何设计Y件体pȝ构的Q然后读d它书Q触cL通,自己创造机会多实践Q成功自然会到来的,MQ不是l构化设计还是面向对象设计,评h一下自q软gpȝ设计Ҏ吧,有好多指标呢Q比如是否均匀和^衡?局部独立性强不强Q有没有歧异的结构?有没有层ơ太多或太少Q有没有某个层次太大、太q?是不是逻辑l构先复杂了再化的?q是只会设计单的Q复杂不h(q一ҎW哦Q如果出现多ơ,请你不要意气用事Q{行吧)Q最重要的一点,是否Ҏ理解、实现和改进Q你自己会得L。如果有Z看到别h的设计,一定不要错q学习的ZQ自己推g遍,认真比较比较Q获益会较多?br>走到q一步,你就应该x设计模式了,首先q是学习Q这斚w的好书有的是Q??但一般在工作中用到的设计模式较ؓ单一Q应该多试一下其它的设计模式。其ơ必要明白设计模式不是设计思\Q也不能代替设计思\Q比方你要从A到B修一条\Q设计模式只是让你选择Q是修水泥的q是柏a的?是高架\q是普通的Q但U\必须你自己定Q而线路就是设计思\Q模式对思\是有影响Q但不能代替Q所以如果你的智商高?50Q我怿你直接用汇编语言也能写出面向对象的程序来。第三在此有一个陷阱,很多pȝ分析员生搬硬套设计模式,全然不懂如何融会贯通,在你的一具体工作中Q往往是以一U设计模式ؓ主,其它模式的,思维不拘泥于形式才是关键Q而且也ؓ你到达更高的软g设计的境界做好准备?br>唉!都不知该怎么向下写好了,因ؓ已达C者水q的极限了,我胡p一点,你凑合看吧。Y件设计最l的层次是:以无法ؓ有法、以无限为有限,q句话是李小龙说的,不是我说的。再拾h牙慧一把,cL一个故事吧Q金大侠在《倚天屠龙记》里讲到张无忌初学太极,学会的标志是把刚学的招数全忘了,C的是太极的道理和_Q和李小龙有些相似喔QY件设计也一P忘记所有的设计模式Q随心所Ʋ进行设计才是至高境界,所以你能到辑֤高的软g设计的境界最l将取决于你的哲学素质,q一点实在是不好写啊Q你自己领悟吧!作者只有祝了Q?br>职业人的l极目标Q全面修|成ؓLeader
q一节更不好写,涉及到太多其它非技术方面的因素Q特别是个h人生观和世界观的修炼Q如果本帖的点击率超q作者私下期望的一个数|那我׃取尽力厚着脸皮再补上吧。我只说一句,虽然大家都知道Y件开发是一个团队性的工作Q但q求参与一个大型Y件系l的成功开发,是一名Y件h员的本能Q就像拿破仑说的不想当元帅的士兵不是好士兵,所以不q求实现大系l的软g人员Q也不是一个好的职业Y件h员,但你只有成ؓLeaderQ领g个优U的Y件开发团队,才有Z实现q个l极职业目标Q对不对Q?br>好吧Q不你现在的感受如何,我都谢谢你能dq里Q我不习惯假歉虚Q就不说什么作者水qx限,本文抛砖引玉Q欢q大家批评斧正之cȝ客套话了Q虽然作者水q确实有限。所以我认ؓ你尽有权砸砖,但实在没必要搞回帖、或回骂、或之cȝ玩意儿,我只是尽兴写一点多q从事Y件开发工作的体验Q因此接下来我就高挂免战牌,不回复Q何回帖了。再ơ谢谢你能有耐心dq里Q希望本文对你有所裨益Q祝你成功!再见Q?/p>
q个都学会是有点难,但是慢慢学还是可以搞的。。。恩Q以后好好学一下。?/p>
专注法则 本章的目的是让你重新扑ֈ征服一座山峰后兴奋地头晕的感觉。。。真看不出来。。?/strong>
插入一D,刚刚在群上聊到Hash 函数的问题。。提C两个法QBloom Filter法?MD5 。。之前的没有特D了解过。?/p>
自己对大规模数据处理q部分一直都是个薄弱环节。。需要进一步加强。。。字典树 (tire tree)q个问题一直没有把他归l到代码上。。有些许遗憾啊。?/p>
l箋M
2 我是开源版本控制系lSubversion的忠实fansQ在我看来,它就是强大、简单和易用的完结合。归根到底,subversion是一个基于命令行的版本控制系l,不过有很多开发者ؓ它开发出来前端工?我最喜欢的是与Windows资源理器集成的Tortoise)。尽如此,subversion 最大的威力q是在命令行。。?/p>
q个subversion 自己q真的不是很了解唉。。而且很多的CVS自己都不是很熟。。至需要熟悉一个CVS吧。。。唉。。又拖篏大家乐。?/p>
3 Yak Shaving q或许是今天晚上最大的收获吧。。。第一ơ听说这个名ơ。。Yak shaving。。或许是我太孤陋寡闻了。?/p>
莫名其妙今晚的google不好用。。只好找个繁体的了。?/p>
別讓自動化的努力變成剪牦牛毛(yak shaving)——這是一句在a算科學界源遠長的行話,它代表了諸如此類的情況:
i於在某個時候,你停下來回想自己一開始到底是想q什麽。然後你發現自己正牦牛剪毛Q這時你就應該停下來想惻I這一大堆牛毛?#8220;從Subversion日誌生成文檔”到底有什麽關pdQ?br>剪牦牛毛是g危險的事Q因為它會吃掉你大把的時間?..始終牢記你到底要做什麽,如果情況開始失控及時抽w而出?/p>
YakShaving 是一件危险的事,因ؓ它会吃掉你大把的旉Q始l牢C要做什么。。如果情况开始失控就及时抽n而出。。。想x也曾l浪费大把的旉。。惭愧。。在|上q根溯源扑ֈ了一E文的Blog。。看一下。?/p>
The single best term I've learned this year.
Apparently turned into a computer term by the MIT media lab five years ago, yak shaving was recently referenced by my pal Joi Ito. (Link: Joi Ito's Web: Yak Shaving)
I want to give you the non-technical definition, and as is my wont, broaden it a bit.
Yak Shaving is the last step of a series of steps that occurs when you find something you need to do. "I want to wax the car today."
"Oops, the hose is still broken from the winter. I'll need to buy a new one at Home Depot."
"But Home Depot is on the other side of the Tappan Zee bridge and getting there without my EZPass is miserable because of the tolls."
"But, wait! I could borrow my neighbor's EZPass..."
"Bob won't lend me his EZPass until I return the mooshi pillow my son borrowed, though."
"And we haven't returned it because some of the stuffing fell out and we need to get some yak hair to restuff it."
And the next thing you know, you're at the zoo, shaving a yak, all so you can wax your car.
This yak shaving phenomenon tends to hit some people more than others, but what makes it particularly perverse is when groups of people get involved. It's bad enough when one person gets all up in arms yak shaving, but when you try to get a group of people together, you're just as likely to end up giving the yak a manicure.
Which is why solo entrepreneurs and small organizations are so much more likely to get stuff done. They have fewer yaks to shave.
So, what to do?
Don't go to Home Depot for the hose.
The minute you start walking down a path toward a yak shaving party, it's worth making a compromise.
Doing it well now is much better than doing it perfectly later.
1 在《Programming Perl》一书中QLarry Wall 说到“懒惰Q傲慢和~Z耐?#8221;是程序员?大妹的。懒惎ͼ因ؓ你一直致力于减少需要完成的工作总量Q缺乏耐性,因ؓ一旦让你浪Ҏ间去做本该计机d的事情,你就会怒不可遏Q还有傲慢,因ؓ被荣誉感冲昏头脑的你会把E序写的让谁都挑不出毛病来?/p>
呵呵Q恩Q卓的E序员就应如此啊Q!
2 在小字里面看到这样一D字Q?Hyperproductivity是指在高效的工具和工?程之下工作的工人得不到休息而过度疲功뀁压力过大的情况。。。。?/p>
哥难道杯L属于q种情况吗?。。。杯具啊。?/p>
3 很多比较q轻的同时从来就没有认真使用q命令行工具Q自然也无法理解ؓ何这些工兯比时下那些漂亮的IDEq要高效。。?/p>
乐表示没有认真的用q命令行。。。看来这本书ȝq是对的。。?/p>
4 那些对于普通用戯言能够提高生率的东西(比如漂亮的图形界?鼠标 下拉菜单{?Q对于其他一些h(E序开发?来说实他们获得计算机最x能的障?#8220;易用”“高效”在很多时候其实是不相关的。那些在使用囑Ş界面的过E中长大的程序开发h员们Q对那些老一代聪明h所使用的不仅酷而且高效的技巧一无所知。。。他们的计算机大部分旉里根本不是在跑,直就是在散步。。?/p>
5 Vi~辑器就是一个经典的“不需要鼠?#8221;的引用。旁观一个经验丰富的VI用户会人心生敬畏。光标看h像是在跟随者他们的眼睛。遗憄是,它的学习曲线实在是太陡峭了,大概需要两q坚持用VI才能够达到这U程度吧。另一个经典的的编辑器是EmacsQ同样非常的以键盘ؓ中心Q然而,Emacs是一个原始的IDEQ通过插gl构Q它可以做的q不止是~辑文g。VI用户轻蔑的将Emacs成ؓ“一个只有有限文本编辑能力的伟大的操作系l?#8221;?/p>
VI和Emacs 都支持一个非帔R要的加速器Q永q不要将你的双手从字W按键上d?/p>
的确是,说实话,从大学开始搞计算机到现在已经3q了。。准的_自己接触计算机到现在也就3q的旉。。想想一开始的那段旉Q自q的是什么都不懂。。然后慢慢搞Cq一步。。一个行业从业十q_不断的学习,p让你成ؓ一名专家。。我坚信如此Q!Q?/p>
不错到现在开始,我还没有真正意义上接触LinuxQ只是一些小打小闏V。。。以后需要反思实践了。。扩大自q事业。。多接触一些东西M是坏事情。?/p>