“任何时候我也不会满足,越是多读书,就越是深刻地感到不满足,越感到自己知识贫乏。”在近期的学习与读书过程中,我明显感觉到了自己十分的吃力,不仅仅在于对知识的积累,还在于自己的理解与领悟无法跟上进度。在书新的一章中,我看到了各种自己,不过都是作者举的反例当中,读书中仿佛自己就躺在手术台中,一步一步的被解剖,各种缺点被放大,也明白了不是会编几段程序、会几种语言就能称得上注重实效的程序员。
当我们的项目开始进入编码阶段时,有一种认知是很不正确的:机械地把设计转换为可执行语句,我一想,完了,因为每一次的编程作业我都是这么认为的,将老师提出的要求一步一步的写成可执行语句,之后的“程序丑陋、低效、结构糟糕、不可维护和完全错误”抨击这我的心灵,很难想象自己竟如此不堪。这章有很多的地方打破了我原以为的认知,比如靠巧合编码等,这些内容瞬间变得价值斐然,因为这正是我所缺少的,更是我今后发展的重要因素。
“要深思熟虑地编程”,我们应该避免靠巧合编程,避免靠运气和偶然的成功,在此我讲一个自己的事情,有一次我完成了编程作业时,结果也符合提供的测试集,但在我又一次阅读与检查自己的代码时,发现了一个致命的问题,原本应该是“==”的符号,我少写了一个等号,于是便改了过来,之后的运行便出现了我吃惊的结果,结果与正确结果一个都没对应上,这个应该就是所谓的“靠巧合”,因为一开始就不知道它为什么能工作。假设用坏数据调用一个例程,并以一种特定的方式加以响应,而代码就以该响应为基础,但原作者并没有预期该例程会以那样的方式工作,当例程被修正时,便是代码崩溃时,尽管有时它们看起来能工作,但那只是个巧合。作为一个注重实效的程序员,我们应该学会思考和判断,第一我们要意识到自己在做什么;第二不要盲目的编程,不要构建自己不理解的应用或使用不熟悉的技术,这一点在这次个人作业里深有感触,看着别人使用高级的技术进行实验,自己却选择了自己最熟悉的数据结构,虽然可能会很笨拙,但对于自己可以更好地进行修改与操作;第三按照计划行事;第四依靠可靠的事物,不依靠巧合或假定;第五为工作划分优先级,把时间花在重要的方面;第六不要做历史的奴隶,不要让已有的代码支配将来的代码。注重这些要点,才能走上一条不被运气控制的编程之路。
“估计算法使用的资源——时间、处理器、内存”是注重实效的程序员几乎每天都要使用的。简单的说估算算法是对运行时间和内存需求的分析,可以使用一种处理近似计算的数学途径O(),例如线性算法可以表示为O(n),但实际上大多数的算法都是亚线性,而且O()表示法并非只适用于时间,它可以表示算法使用的其他任何资源。现有几个常识估算:简单循环、嵌套循环、二分法、分而治之、组合,这些可以帮助我们估算许多基本算法的阶。实践中,如果数值有限,可以知道代码的运行时间,如果数值取决于外部因素,那就需要考虑一下大量数据对运行时间或内存消耗可能带来的影响,当不确定所需要的时间时,就试着运行,把结果绘制成图,可以根据曲线了解大体情况。最后一点就是选择适当算法时注重实效——最快的算法对于你的工作并非总是最好的,这个可以对比在输入集很小时,简单的插入排序和快速排序一样好。
“重构”意思为重写、重做和重新架构代码合起来。随着程序的演化,我们有必要重新思考早先的决策,并重写部分代码,因为代码需要演化,它不是静态的事物,作为一个刚刚起步的新手,对于“重构”没有一个十分明确的认识,只是从字面意思去理解,但在阅读之中,逐渐发现了这个东西其实很基础,就在自己的身边。书中将软件开发的两种比喻做了比较,第一种的比喻是修建建筑,第二种作者更青睐于 “园艺”——它比混凝土更有机,与软件开发的现实更接近,商业人士喜欢修建建筑的比喻,因为它更科学,可以重复,具有严格的管理报告层次。我比较赞同“园艺”这一观点,因为这更像是一门艺术,每一处的合理才会造就融洽的整体。每当我们发现代码不合适时,这对于自己就算是错误的东西,要坚定不移的去改动,犹豫不决只会浪费时间,在现实中,如果需要进行重构的时候却没有进行,之后沿途修正问题将需要投入更多的时间,这就好比是身体里的肿瘤,趁它还小的时候,进行手术将其取出,才会避免以后更大的危机。关于“重构”,核心问题就是重新设计,但是如果撕毁大量代码,就会发现自己处于比一开始更糟的位置上,所以需要我们的慎重与深思熟虑。
有关测试,在软件中可以做一件与硬件同样的事,从一开始就把可测试性构建进软件中。在隔离状态下对每个模块进行测试,目的是检测其行为、一旦我们在受控的(甚至是人为的)条件下对模块进行了彻底的测试,我们就可以更好地了解模块在广阔的世界上将怎样起反应。如果我们想要编写测试用例,要确保给定的单元遵守其合约。当我们会编写大量测试代码,并进行大量测试,我们可以为项目开发标准的的测试装备,对于其中的即兴测试,我深有体会,比如“print”,我会经常用这个来进行测试代码的运行情况,可能很累,但对于自己很有帮助。
这次的阅读进一步加深了我对于编程的理解,对于我明确自己未来代码的编写风格有不可忽视的作用,期待下一次的阅读会带给我什么。