前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一周技术思考笔记(第54期)-活代码、睡代码、死代码

一周技术思考笔记(第54期)-活代码、睡代码、死代码

作者头像
王新栋
发布2022-03-30 16:06:41
3840
发布2022-03-30 16:06:41
举报
文章被收录于专栏:程序架道

这周继续学习《UNIX编程艺术》这本书。

如果有一天你听到或者看到,有人将我们周围的代码分成这样三类:活代码、睡代码、死代码,你会怎样来理解它们?

活代码周围存在一个非常活跃的开发社团。

睡代码之所以“睡着”,经常是因为对作者而言,维护代码的痛苦超过了代码本身的效用。

死代码则是睡得太久,重新实现一段等价代码更容易。

如果希望让代码成为活代码,则最有效的时间花费方法之一就是投入精力使代码具备可维护性(并以此吸引未来的维护者)。

对于什么有助于生成可维护的代码,Unix程序员有许多隐性知识,原因是Unix有许多可以追溯到几十年前的源码。Unix程序员学到了一种品性,就是宁愿抛弃、重建代码也不愿修补那些蹩脚的代码。

什么是可维护的代码,如果请你给它下一个定义,你该怎么描述?

如果作者以外的其他人能够顺利地理解和修改软件,则这个软件就是可维护的。可维护性不仅要求代码能够运行;还要求代码能够遵循清晰原则,并且和人以及计算机成功沟通。

OO的思想好吗,好,如果要是过度OO会怎样呢?

程序员经常建造过分精细的抽象城堡,这一倾向的近亲是过度保护底层细节。尽管在程序的正常操作模式中隐藏这些细节并不是不良作法(fetchmail

的-v选项的缺省被关闭),但这些细节必须能够找到。隐藏细节和无法访问细节有着重要区别。

采用面向对象编程的时候,我应该如何开悟呢?

禅的一个主要教导是,通常我们都透过源于欲望的偏见和成见的迷雾观察世界。要开悟,我们必须遵循禅的教导,不仅要“去欲望,少依恋”,还要“如实见”——不要让偏见和成见蒙住了眼。

太多的OO设计就像是意大利空心粉一样,把“is-a”和“have-a”的关系弄得一团糟,或者以厚胶合层为特征,在这个胶合层中,许多对象的存在似乎只不过是为在陡峭的抽象金字塔上占个位置罢了。这些设计都不透明,它们(臭名昭著地)晦涩难懂并且难以调试。

软件需要调试——而且通常在整个使用期都需要不断的维护、向前移植和改写。

设计代码和编写代码有什么不一样吗?

我应该如何命名,我应该如何保持统一的代码缩进,等等,这些是编写代码要考虑的。

如果是设计代码,只考虑这些特性是不够的。

设计的特性和代码的特性是不同的。

设计的特性,你需要考虑以下内容:

程序调用层次中最大的静态深度是多少?也就是说,不考虑递归,为了建立心理模型来理解代码的操作,人们将要调用多少层?提示:如果大于四,就要当心。

代码是否具有强大、明显的不变性质?不变性质帮助人们推演代码和发现有问题的情况。

每个API中的各个函数调用是否正交?或者是否存在太多的特征标志(magic flags)和模式位,使得一个调用要完成多个任务?完全避免模式标志会导致混乱的API,里面包括太多几乎一模一样的函数,但是频繁使用模式标志更容易产生错误(很多易忘并且易混的模式标记)。

是否存在一些顺手可用的关键数据结构或全局唯一的记录器(scoreboard),捕获了系统的高层级状态?这个状态是否容易被形象化和检验,还是分布在数目众多的各个全局变量或对象中,而难以找到?

程序的数据结构或分类和它们所代表的外部实体之间,是否存在清晰的一对一映射?

是否容易找到给定函数的代码部分?不仅单个函数、模块,还有整个代码,需要花多少精力才能读懂?

代码增加了特殊情况还是避免了特殊情况?每一个特殊情况可能对任何其它特殊情况产生影响;所有隐含的冲突都是bug滋生的温床。然而更重要的是,特殊情况使得代码更难理解。

代码中有多少个magic number(意义含糊的常量)?通过审查是否很容易查出实现代码中的限制(比如关键缓冲区的大小)?

你是如何理解优雅这个词的,在程序世界优雅的代码又有什么样的特质呢?

优雅是力量与简洁的结合。

优雅的代码事半功倍。

优雅的代码不仅正确,而且显然正确;优雅的代码不仅将算法传达给计算机,同时也把见解和信心传递给阅读代码的人。

你是如何理解软件设计的透明性可显性这两种品质的呢?

讲真,我还不太理解的那么透彻。

如果没有阴暗的角落和隐藏的深度,软件系统就是透明的。

透明性是一种被动品质。

如果实际上能预测到程序行为的全部或大部分情况,并能建立简单的心理模型,这个程序就是透明的,因为可以看透机器究竟在干什么。

如果软件系统所包含的功能是为了帮助人们对软件建立正确的“做什么、怎样做”的心理模型而设计,这个软件系统就是可显的。

因此,举例来说,对用户而言,良好的文档有助于提高可显性;对程序员而言,良好的变量和函数名有助于提高可显性。

可显性是一种主动品质。

在软件中要达到这一点,仅仅做到不晦涩是不够的,还必须尽力做到有帮助。

今天在图书馆拍到一张照片,分享给你。

----END----

这里记录,我每周碰到的,或想到的,引起触动,或感动的,事物的思考及笔记。不见得都对,但开始思考记录总是好的。

与爱学习、爱思考、爱记录的你共勉。

以上涉及粗体部分内容引自:

[美] Eric S.Raymond著.UNIX编程艺术.电子工业出版社.2012:7.得到电子书:https://d.dedao.cn/DuefPaGheH00fk59

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序架道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档