能适应使用者的就是好的设计。对代码而言,就是要顺应变化。因此要信奉ETC原则(Easier To Change,更容易变更)——就该如此。据我们所知,无论是什么设计原则,都是ETC的一个特例。为什么解耦很好?因为通过隔离关注焦点,可让每一部分都容易变更——此谓ETC。为什么单一职责原则很有用?因为一个需求变化仅体现为某个单一模块上的一个对应变化——此谓ETC。为什么命名很重要?因为好的命名可以使代码更容易阅读,而你需要通过阅读来变更代码——此谓ETC!
每个项目都有自己的词汇表:对团队有特殊意义的术语。“Order”对于开发在线商店的团队来说是一回事,而对于记录宗教团体的世系的应用程序来说,意味着完全不同的另一件事。重要的是,团队中的每个人都知道这些词的意思,并始终如一地使用它们。一种方法是鼓励大量的交流。如果每个人都参与结对编程,并且频繁地交换结对,那么术语就会渗透性地传播开来。另一种方法是使用项目术语表,列出对团队有特殊意义的术语。这是一个非正式的文档,可以在 wiki 上创建并维护,也可以将索引卡片挂在墙上。过一段时间,项目术语将会有自己的生命。随着每个人都熟悉了这些词汇,就能够把这些术语用作简称,准确而简洁地表达许多意思。(这正是模式语言所指。)
维护一个概念列表,可以保证团队交流的准确性,避免你说的是A,我理解成B的情况。一个项目中有不同的角色,业务方、产品、前端、后端、算法、数据,对于一起开会时经常提起的概念,大家的理解并不一定一致。举个简单的例子,比如业务方有个二分类的需求,要从一些商户中找到其中不合规的商户,模型预测结果如下图所示,但是一个人以为的准确率是(a + d) / (a + b + c + d),另一个人以为的是d / (b + d)。如果没有在项目之初明确下来大家关注指标的具体含义,那可能出现各说各的的情形。技术按照一个计算逻辑承诺并达成了准确率指标,业务方按照另一个逻辑计算后发现准确率远远没达到,这会给团队合作带来障碍。维护一个项目概念列表还有一个好处,就是在制定列表的同时会推敲这个概念的说法是否合适。举一个场景,政府规定购买某些药必须有48小时内阴性的核酸检测结果,要用模型识别订单是否需要拦截。有人把”识别通过“说成”识别成功“,把”识别拦截“说成是”识别失败“,这样就很容易把失败率和模型的识别错误率当作是一回事(因为”失败“和”错误“这两个词太相似了)。其实这是两个完全无关的指标,如果短时间内有10个订单全部拦截了,而且用户确实不符合防疫规定,真实的识别错误率是0,但是用失败称呼拦截很容易以为模型识别全错了。概念是“思维的细胞”,维护一个概念列表不仅有利于项目成员内部的合作,也有利于给上级或其他人汇报时听众能更容易准确理解你的意思。因为项目成员有更多的背景知识,用词不准确不一定会引起歧义,大家都能理解,但是非项目成员不一定都能准确理解。