一点一点地读完了这本书,像人们对这本书的评价一样,我也认为这是一本程序员的心经,当然这里很多哲学并不是仅仅适用于程序员,更适用于人生。至此,我希望成为一名注重实效的程序员。
如何才能算是一名注重实效的程序员,最直观的的说法大概就是不会将时间浪费在一些琐碎的准备工作上,做事很漂亮并且很高效,不能保证绝对没有错误,但是有了错误可以很快的纠正自己的错误,并且总是在自我批判的环境中,不停的改进自己。所以,首先要保持一颗好奇的心,勇于提问,这样才能引发自己的思考,然后将这些思考变成自己的经验。
注重实效是一门哲学。首先,不管是程序设计还是做人,都不要为自己的错误找借口,借口只是一种欺骗,更没有必要去欺骗自己了,要事先做好应对多种情况的准备,避免出现各种错误。然后,对于一些小错误不要因为懒惰而不去管它,像一个小孩子从小小偷小摸没有人去管,长大了以后最终因为盗窃毁了一辈子一样,不可以容忍“破窗户”,一直保持代码的干净整洁,不加入混乱的脏东西,一旦出现了不好的东西就会加速软件腐烂,所以从一开始就努力严谨认真一些。最后,要经营自己的知识资产,必须要定期给自己的知识做投资,计算机技术发展的速度很快,掌握的技术多一点就能更好的调整,赶上变化,但是也不应该过分追求太先进的技术,毕竟学习计算机科学像练功一样,那些基础的知识就如同内功一样重要。
注重实效的途径:这里要说的是书中一直提到的一个重要的原则,DRY(Don’t repeat yourself)原则:系统中的每一项都必须具有单一、无歧义、权威的表示。要做得高效就尽量避免去做重复的事情,比如:代码与文档里的重复,代码与注释的重复。还有,在设计和构建的时候要注意到的正交性:计算机技术中,用于表示某种不相依赖性或者是解耦性,如果两个或者更多事物中一个发生变化,不会影响其他事物,这些事物就是正交的,在设计良好的系统中,数据库代码与用户界面是正交的。降低正交性可以减少耦合,有一个软件设计的原则:开放封闭原则,软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。这样可以降低风险,已经设计好的模块在需要添加新的功能的时候可以不去修改原来的代码。只要添加新的部分就可以了。做一个注重实效的程序员,要对当前的状况有一个估算,这个估算应该要有一定的准确度,以避免发生意外。估算的准确度也要依据不同的情况而定。如何进行估算呢?1:建立对提问内容的理解,把握问题域的范围2:建立系统的模型,把不精确性引入计算过程中,不可避免,也是有益的。3:把模型分解为组件,找出描述这些组件怎样交互的数学规则,每个组件都会有参数4:给每个参数指定值,找出哪些参数对结果影响最大。用合理的方式计算这些关键的参数。5:计算答案:只有最简单的情况下才会是一种答案,结果看起来很奇怪的时候,不要很快放弃他们。可能模型或者问题就是错误的。保持估算的习惯,并且记录下每一次估算的结果,看看自己的接近程度,来让自己不断提高。
基本的工具:最基本的一些东西还是很有用的,比如,纯文本,保证不过时,易于控制和管理,易于测试,增加,更新。并且在各种环境中都是统一的标准。还有shell也是一个基本的但却强大的工具。而对于GUI来说,优点是所见即所得,缺点就是,所见即全部所得。熟练了之后shell会比GUI更高效,毕竟无形中鼠标的移动点击和眼睛搜索会花去很多时间。还有呢,就是编辑器了。编辑器特性:1可配置,各个方面都可以按照自己所喜欢的偏好配置,字体,颜色,窗口尺寸以及键击绑定。2可扩展,编辑器不应该只因为出现了新的编程语言就变得过时。3可编程:应该可以对编辑器编程。让他执行复杂的多步骤的任务,可以通过宏或者内建脚本语言进行这样的编程。如:语法突出,自动完成。自动缩进,初始代码或者文档样板与帮助系统挂接,类IDE特性。曾经看到朋友那里有一本书《vi编辑器》,我当时是多么的吃惊啊。一个编辑器居然要小题大作的写一本书。于是他告诉我,vi编辑器是很强大的,当时并不能很好的理解。现在看来,这种古老又全能的编辑器确实值得好好深入研究和熟悉的啊。还有就是源码控制工具了SCCS(source code control system)可以追踪变动。比如现在的svn还有git了。好处都是很显而易见的。另外,调试也是一个很强大的工具。调试的策略:重现bug,使数据可视化,跟踪程序,可以使用跟踪语句钻入代码。还有一个很简单又非常有效的找到问题的方法,就是向别人一步一步解释你的代码。听的人不需要说一句话,只是需要点头就可以了。然后,问题就经常会从屏幕上跳出来了。最后一个实用的工具是代码生成器:被动代码生成器只运行一次来生成结果,然后结果就变成了独立的,它与代码生成器分离了。本质是参数化模板,源码控制指示,比如开始撰写文本时使用的一种语言,但完成后转向了另一种语言,于是,编写一个代码生成器,将第一种语言格式的文本转换成第二种语言的文件。编写能写代码的代码。这也是一种避免重复来提高效率的方式。
注重实效的偏执:我们很容易掉进“它不可能发生”这样一种心理状态,很多人编写的代码都不检查文件是否能成功关闭,这些代码很可能不会出错,但是要进行防卫性编程。有些事情并不是不可能,所以要针对这些养成良好的习惯,做好充分的准备。对于资源的分配要有始有终,比如以与资源分配的次序相反的次序解除资源分配,或者,在不同的地方分配资源的时候,总以相同的次序分配他们。
一些具体的做法:元数据就是关于数据的数据。元数据的优点:解除设计的耦合,将细节放进元数据,将抽象放进代码,以延缓对细节的处理。还有要考虑时间耦合,分析工作流来改善并发性。然后为并发进行设计,必须对任何全局变量或静态变量加以保护,使其免于并发访问,解除耦合,与巧合编程抗争。计算机黑板系统,我的理解是,建立一个共有的空间,各对象都可以在空间中异步的写数据,并且支持查找获取数据,更新时通知各对象,用黑板来协调工作流。
编码时的一些思考:写代码的时候不能像机器一样,要学会思考,并且要时刻的观察,像一个老司机一样,时刻关注着周围环境的变化,以来应对各种突发的情况。怎么样才能深思熟虑的编程呢,1、 总是意识到你在做什么。2、 不要盲目编程,试图构建你完全不理解的应用,或者是使用你不熟悉的技术,就是希望自己被巧合误导。3、 按照计划行事,不管计划是在你的头脑中,在任何地方。4、 依靠可靠的事物,不要依靠巧合或假定。如果你无法说出各种特定情形的区别,就假定是最坏的。5、 为你的假定建立文档,有助于澄清头脑中的假定,并且有助于把他们传递给别人。6、 不要只是测试代码,还要测试假定。不要猜测,要实际尝试它。7、 为工作划分优先级,把时间花在重要的方面,很可能,它们是最难的部分。8、 不要做历史的奴隶,不要让已有的代码支配将来的代码,如果不再适用,所有的代码都可能被替换。对算法速率的估计:big O ,不仅要估算算法的时间复杂度,还要估计算法的空间复杂度。重构:不要对改动犹豫不决,无论代码具有以下哪些特征,都应该考虑重构:1、 重复,你发现了对DRY原则的违反。2、 非正交的设计。3、 过时的知识,你发现了有些代码或者设计可以变得更正交。4、 性能,为了改善性能,须要把功能从系统的一个区域移到另一个区域。可以这么想重构,需要重构的代码是一种肿瘤,需要对他进行侵入式手术,等的越久可能就越危险。怎样重构呢?1、 不要试图在重构的同时增加功能。2、 在开始重构之前,确保你拥有良好的测试,尽可能经常运行这些测试。这样,如果改动破坏了任何东西,可以很快就知道。3、 采取短小、深思熟虑的步骤:把某个字段从一个类移往另一个,把两个类相似的方法抽象融合到超类中。关于代码生成器还有值得讨论的地方,前面提到了要自己去编写自己的代码生成器,这样可以节省很多的时间,避免进行重复的编码。而现在有很多他人提供的代码生成器,这些可以称之为向导,向导会为你自动生成框架代码,但是,如果使用了向导却不理解向导制作的代码,这样就无法控制自己的应用,没有去维护它的能力,在调试的时候也会有很大的麻烦,并且,不能完全相信向导,因为向导也不一定是一定正确的,只有理解了之后才能真的会判断它的是与非,不能让不理解的代码变成自己的代码。
在项目开始前的一些思考:当然项目开始前首先想到的就是需求分析了。但是需求分析其实不是一件很容易的事,很多需求并不是向在表面上写的那样,客户在告诉你需求的时候他也只是在表达,他能描述的一些东西只是他看到的,但是要应用到编程里又得靠我们自己去挖掘这些需求。要考虑这个需求以后可能会遇到的一些改变,那才是真的需求,有一个比较好的挖掘需求的方法就是与用户一同工作,像用户一样的去思考。在项目开始前有些项目可能会比较困难,一时没有什么好的解决方法,这时候需要开阔的思维,站在不同的角度去思考。也许会有意外的收获,如同特洛伊木马。以一种最不可能的方式达到了最想要的结果。
如何做注重实效的项目:不能留破窗户,要主动的监视周围不停在变化的环境,不要重复自己,重复会造成工作的浪费,并且可能带来维护的噩梦。团队之间要有良好的沟通与交流,保持文档的整洁,新鲜,一致。一个好的团队总是在用一个声音说话。另外好记性不如烂笔头,要把文档当作是开发过程中的完整的一部分来接受,让代码在手边,对于代码的注释呢,要把变量名函数名写的清楚一些,有一个良好的命名习惯,这样,代码就已经能很明确的说明它究竟是用来干什么的,不需要特别的注释了,注释是给那些用方法还不足以表明的一个使其变完美的机会,模块级头注释,重要数据与类型的声明,每个类,每个方法简单的说明来描述它们不明了的地方。要将眼光放远一些。任何东西要想持久的生存下去都要跟着变化而变化,不能像嘟嘟鸟那样。所以,尽早的去料想未来可能有的变化会让项目更有生命力。
在努力成为一个注重实效的程序员的路上要不停的思考,如同我对人与动物之间区别的想法一样,人最大的不同就是要思考来寻求改变,思考也是人最大的乐趣。要乐于去提问,为什么和是什么的问题不要让它们深埋在心里。以后要坚持学习,活到老学到老,不仅限于程序员的修炼道路上,人生也是一样,总有学不完的知识和哲理。要好好的经营自己的知识财产,也要不停的用批判的思维来看自己,看看自己的代码,要时不时的停下来回头看看自己走过的路,“吾日三省吾身”,不仅是修正自己的道路,反省自己的同时也会有很多的收获。成为一名注重实效的程序员的路还很漫长,要不断的努力了。