《代码大全》阅读心得一
软件开发的前期要仔细研究需求,稳定的需求是开发优质可靠软件的基本保证,也可以有效降低开发成本。要描述出系统的多个方面,在确定需求阶段考虑的越全后期变动的可能性就越小,这要和他人多次充分的交流,我甚至觉得可以采用询问犯人的做法,对一个需求做多次的需求确认,研究对方的话有什么差异,把这些差异再次确认。当然并不能杜绝后期的变动,但至少会避免很多偏差了,大大降低了返工的风险。作者认为,开发是一个迭代的过程,要持续地反思之前的工作,对不理想的地方进行重构。现在慢慢地自己也有这种习惯,特别是写的程序比较大的时候,总会发现前面的设计与实现的不足之处,及时改正它们比收尾的时候改正风险、代价都会小很多,这也说明前期设计的重要性。抵御“尽快开始编码”的欲望,多在前面的需求和设计花些功夫是值得的,也希望提需求而不怎么懂软件开发的人员能理解这里面的道理。
作者对于软件的构建过程是倾向于自上而下的设计的。在确定软件需求后,先设计出总的功能模块划分,然后对功能模块设计需要的包和类,设计类的接口抽象,设计子函数的抽象。特别要强调,降低模块、类之间的耦合度,然它们的接口一致地表明自己的功能,这种一致地抽象十分重要,能极大地提升其可读性;强调函数内操作目标的一致性,都是要为函数名所表达的目标服务,如果有多余的要考虑把它们独立出去,步骤的实现细节要隐藏到子程序中;强调要隐藏实现细节,不能让使用者看到数据的类型、实现的结构等细节,这些细节应是作为私有的部分而隐藏起来的,这样设计下来内部的聚合性会比较强。作者认为,人同时关注的兴趣数量是有限的,这样的设计能保证不会超过这个上限,从而让开发人员能很好地关注自己要实现的部分,也会给其他阅读者带来这种益处。最近阅读代码的时候感受到了这个上限的存在,调用层次多了后就会忘掉最初的使用者是要干什么了。所以实在没有办法避免的时候,我会把这些关系记下来,而不是缓存在大脑中。同时这样的设计业会给以后的扩展带来益处,更容易把同一层次的功能组成出新的高层功能。
编程的时候要树立防御式编程的思维,不能总是假定输入或操作方式在预期内,要多考虑可能的异常情况,特别是涉及到与用户的交互和网络时,这种不确定因素会迅速增加。考虑到当前的工作正是这种情况,以后编写代码时要尤其小心。要重视断言、异常、日志等的重要性,从一开始就重视,同时根据系统的类型,考虑容忍完整性多一些还是正确性多一些。作者建议编程从伪代码开始,其实自己很多没这么多了,顶多画一下流程,以后可以考虑尝试这样做。伪代码不应该体现语言的细节,而是体现实现的思路和流程,是用哪种语言都可以进行实现的,而且不会干扰到实现的细节。有了这种清晰的伪代码,再做实现就会清晰很多,而且有了“天然”的注释。
作者强调一种观点,“在一种语言上编程(programming in a language)”和“深入一种语言去编程(programming into a language)”,要学会后一种工作方式。深入语言,要理解语言的特性和这种特性的由来,比如lua的弱引用;将语言和设计模式结合起来,通常能从低层高层联合的角度得到优雅地程序;可以将不同的语言做些对比,体会某相似的点的差异,只有理解了语言采用更好地驾驭语言。想来自己也学了好几种语言了,但感觉都没有很深入地去使用,大部分时候用哪种语言是外部的选择结果。以后用python和Lua会多一些,希望能深入地使用它们。