
传统上,将软件开发过程与构建过程进行比较。 术语“建筑师”仅加强了这些过程之间的关联性。 但是现代现实使该模型变得无关紧要,因为它无法解释某些机制:
- 如果我们制造某种物理对象或产品,那么为什么该软件从未被认为是完整的?
- 如果我们在谈论工程解决方案,那为什么我们永远不能自信地计划未来呢?
- 如果我们是建筑师或建筑商,那么为什么这么多项目以失败告终?
- 最后,有这么多技巧,最佳实践,原理,书籍和软件开发报告,为什么这么多项目变成难以承受的工作场所?
我建议翻译一下莎拉·梅(Sarah May)出色的报告《宜居的代码》,该文本与案文很接近,她在其中考虑了所有这些问题。
为什么有一个模型很重要?
该模型使我们可以在不熟悉或难以理解的过程与我们熟悉,可以理解的过程之间进行类比。 此外,它不仅适合描述一切都很好的情况,而且像任何良好的比喻一样,该模型应该指导我们处于临界状态。
软件开发过程是两个相关的,相互作用的但仍然独立的实体的组合:代码和团队。

确认这是康威的法律。 这些实体的关系告诉我们,代码中的问题与团队中的问题有关,反之亦然。 因此,我们有两种解决方案:在代码方面和团队方面。
有些问题似乎仅是代码方面的问题,有些只是团队方面的问题。 实际上,所有这两个组件都存在问题。 因此,新模型应该适合现代现实,并反映开发过程的两个组成部分之间的关系。
新型号说明
应用程序所在的空间
建筑物的建造分为三个不同的阶段:设计,建造和维护。 以前,软件开发看起来很相似:开发的结果是成品。 它由用户安装并转移到支持一个单独的小组,开发人员开始做其他事情。
但是在Web应用程序的世界中,实际上每天部署和发布几次,实际上还没有完成。 在移动应用程序和游戏中,当通过Steam在控制台上自动更新它们时(通常是在最不适当的时刻),也会观察到类似情况。 此外,在不断变化的业务环境中,应用程序必须是灵活的并且能够更改。 为了确保这种灵活性,开发工作必须付出巨大的努力。 不能从建筑物中得到同样的结果。
我们在开发应用程序时使用的基础架构更像是一栋建筑物。 我们创建的不是建筑物本身,因为大多数应用程序应用程序会占用预先构建的结构中的空间。 这听起来像是从建筑师到室内设计师的一步,但是这种模型有很多功能。 其中的建筑物是我们应用程序的基础:基础是操作系统,停车级别是编程语言,建筑物本身是所使用的框架,我们正在内部开发应用程序。
建筑物提供的内部空间(结构)是可变的,但是比您自己的代码更难更改。 拆除墙壁要比移动家具困难得多。 因此,建筑物本身(框架)对内部(应用程序)的功能和外观施加了一定的限制。
每栋建筑均针对其自身目的进行了优化。 可以将应用程序放置在其中的任何一个中,但某些空间将更适合它,而某些空间则更糟。 因此,将以某种方式生成将要放置在预成型空间中的代码。

在我们的行业中仍然有大量的建筑工作,但是我们大多数人仍在从事室内装饰(应用)。
发展的新目标
如果将所有这些都加进来,就认为项目永远不会完成,那么您将得出结论, 代码不是我们要构建的东西,而是我们生活的地方 。 这使您从另一个角度看待开发的真正目标。 我们需要使居住的地方宜居 :适合居住 ,舒适和舒适。 不仅对于我们自己,对于与我们一起生活的人也是如此。 就代码而言,仅完成产品并继续前进还不够。 对于居住在其中的团队,还需要使其具有宜居性 :可理解,可支持,可扩展。
什么是宜居代码?
与居家相关的宜居环境意味着您生活在一个可以舒适,轻松地进行日常活动的空间中。 卧室里有一个阅读灯,茶几上有餐巾纸,客厅里有一个操纵杆盒子,走廊上有一个自行车架。
但是,对一群人来说, 宜居的手段取决于自己。 对于有孩子的年轻父母来说,舒适的家不像是为学生或老人而建的房子,也不是有少年的单亲家庭。
适用于代码的含义是相同的:您可以更改或添加所需的内容,而不会造成过多的复杂性和烦恼。 您了解什么在哪里,因此可以轻松地跳到代码中的正确位置并使用它。 这里的原理是相同的:一个团队适合居住而不适合另一个团队。 一个高级和四个初级人员的宜居性与五个高级人员的宜居性不同,并且与外包团队的宜人性大不相同。
人们来来往往,因此以宜居状态创建和维护代码是一个持续的过程。 团队中新成员的出现类似于新室友:他有一个奇怪的沙发,出于某种原因他真的很喜欢它,所以您无奈地同意将他放到客厅。 几天后,一位邻居建议更换窗帘,因为还有更多符合人体工程学的窗帘。 最糟糕的是,他用选项卡而不是空格在洗碗!
但是现在你们在一起生活,所以您必须进行谈判。
事实证明,您的心情和状况更多地取决于与您住在一起的人,而不是公寓中的特定事物,甚至更少地取决于其布局。 同样与代码有关:您的幸福感主要取决于与您一起工作的人员,而较少取决于代码本身或框架。
项目如何变得混乱
但是,如果您的代码看起来像这个房间怎么办? 如何使其适合团队? 从哪里开始?

同意,在这里四处走动很困难,更不用说了解如何整理事物了。 为什么房屋达到这种状态? 人们常说这是懒惰。 心理学家的看法有所不同:由于一系列看似微不足道的错误决定,房屋进入了这种状态。
想象一下如何开始。 有一个小房间,您在其中尝试优化空间:添加了几个架子和抽屉,使用了窗台。 有一阵子,一切都很好:您每天保持订单。 但是傍晚是艰难的一天,那时您没有下车。 早晨,您睡过头了,回到家后,您正坐在办公桌旁吃晚饭,却忘了拿走盘子。 父母在周末带了你的旧东西。 没有时间拆解它们,您可以按原样放置盒子。 您会觉得房间不再井井有条,但是情况如此令人沮丧,以至于您不知道从哪里开始纠正情况,很快便变成了IT。 一系列小错误的决定:房间已经是一团糟,为什么不把书扔在地板上?
代码也会发生同样的事情。 您打开的文件已经损坏,有六个模式不再起作用。 经理站在您后面,等待错误修复。 首先想到的是用磁带尽可能多地修复错误,并尽快离开这里。
这些看似很小的本地解决方案正是使代码不可行的原因 。 但是,有一些方法可以帮助我们摆脱困境。
通过改变习惯而得救
您是否注意到,在大多数整齐整齐的房屋中,经常有许多杂志,带有美丽而舒适的内饰的剪报? 也有照片,项目,适合居住空间的提示。
住在乱七八糟的房子里的人们想过不同的生活,他们浏览所有这些杂志,而他妈的想拥有相同的内饰,但他们不知道该如何实现。 他们认为,只有一些基本的决定,一个事件才能使他们的房子与图片中的一样。
美国电视上有一个a积节目。 生活在永远混乱中的人们同意参加,因此专业团队将清理并在其房屋中进行设计师室内装饰。 好了,并且像往常一样,在程序结束时,前后都有漂亮的照片。 有趣的是,大多数参与者都承认他们的房屋最终恢复了原始状态。 很简单:相同的小错误决定序列导致他们得出先前的结果。
事实证明,一种更有效的方法是逐渐延长工作时间,而不是与房屋的内容一起工作,而是与人民自己一起工作。 目标是改变他们的习惯,使他们将维持秩序作为日常生活的一部分。 不幸的是,制片人认为这种选择对于真人秀来说太无聊了。
杂乱无章的代码的行为方式相同:我们每天都在为解决当前问题而与之抗争,并梦想着重写所有内容。 现在,如果我们只能重做所有事情,那么我们绝对不会犯同样的错误! 我们必须在Ember上重写jQuery! 我们必须将整体切割成微服务!
有时它可以工作,至少足以写一篇胜利的博客文章。 但是随后光线熄灭,相机停止工作,摄制组离开现场,如果您还没有改变习惯,那么您将陷入混乱,甚至比您想象的还要快。
人们认为重大错误正在杀死我们:房屋太小,布局不成功,框架错误,整体设施不足,资源不足。 事实并非如此。 我们被习惯和思维方式造成的那些很小的决定杀死了。
您可以重写任何内容。 但是,如果您的团队不改变其习惯,那么您将发现自己处于一个复杂的微服务网络中,就像您在一个整体中拥有一个复杂的类和模块网络一样。
团队习惯
应当指出,我们不是在谈论个人,而是在谈论团队的习惯和准则。 这就解释了为什么开发人员作为专业人士的形象不能反映现实。 这不是一个独立的开发人员,既懒惰又不专业。 这是一支团队文化culture脚的团队。
就像与室友一样:每个人都应进行日常清洁,自己洗碗,定期清洁浴室和卫生间,清洁公共客厅。 但是,有更多复杂的活动可以提高宜居性 ,可以“仅对感兴趣的人”保留这些活动。 例如,要超过厨柜或在客厅中选择合适的桌子,而不要太笨重。
但是日常工作是每个人都必须做的。 也就是说,团队中可以有一些对全局体系结构重构感兴趣的人,他们拆分过大的模块,优化它们与那些不想这样做的人之间的交互。 每个人都没有义务参加家具的重新布置,但每个人都必须洗碗。
两个极端是不适合生活的,或者为什么书不起作用

很棒的内饰,不是吗? 一切都完美匹配并经过深思熟虑,仅此而已。 一句话-一个梦想。 就像对模式的描述一样,它显示了完美一致,完美抽象的代码的优美版本。 如此美丽以至于眼睛高兴。
是的,图片中的公寓很漂亮,但您不能住在其中。 杂志上的公寓被故意剥夺了杂物,因为杂物是个人的东西。
对于每个人来说,这种混乱是不同的。 如果您喜欢阅读,那么这些就是书,如果您喜欢电脑游戏,这是游戏机和操纵杆,如果您喜欢户外活动,则是自行车或皮划艇。 您所使用的东西应该在手边,所以您必须忍受一定的麻烦。 最主要的是不应有太多。
在软件开发领域中有关精美内饰的杂志显示了不切实际的干净代码,因此设置了错误的准则。 这些是有关软件开发,设计模式,博客技巧和文章的书籍。 满足其所有要求(完全一致和抽象)的代码在现实世界中不可行。 即使您设法做到这一点,您也不能生活在其中。
我们需要一点混乱才能感到舒适。 无论是公寓还是代码,都是如此。
两种极端都不适合 。 如果您有一段不懂的代码并且不知道如何使用它,那么它就是其中一种极端。 要么乱扔垃圾,以致无法将合适的想法与不合适的想法区分开,要么太纯净,以至于根本找不到合适的想法。
而且,这两个极端可以在同一项目中同时存在。 有时甚至彼此相邻。 宜居的代码介于两者之间。 除了舒适的生活空间外,它还位于杂志封面照片和杂乱的公寓之间。
因此,您需要能够处理少量杂物,因为这会使空间变得宜居 。
清单
您可以说:“这当然很有趣,但是如果我的代码已经完全混乱了怎么办? 或者,如果该项目还不错,但我想确保它没有朝错误的方向发展呢?”
假设您的代码看起来像是一个杂乱无章的遗留生命空间,通过它只有狭窄的山羊路。 不用担心,你不是一个坏人-这可能发生在每个人身上。
如果您从工程学的角度看问题,那么它只会大喊:“重写! 在没有自由空间的地方如何组织一些东西? 只需从这里移走所有内容,然后重新开始!”“这种自上而下的计划非常适合某些工程任务,但不适用于大多数软件。 这不是因为我们是不好的工程师或我们做得不好,而是因为在我们所在的地区,工程方法无效。 代码充当人们生活的空间。 您需要了解人员正是您需要从事的工作。
这是操作方法。 有四种适用于任何语言和框架的规则。
无害
几乎像医学上的。 当打开一个已经杂乱的文件时,请保证不会让它变得更糟。 即使您没有时间去修复那些已经很糟糕的东西。 如果在进行代码审查时看到一个人如何违反此规则,只需提醒他您所同意的内容即可。
相信持续改进
一堆五本书在地板上,一本整理在书柜里比一堆六本书更好。 也许下次触摸此代码的人会将另一本书从堆放到书架上。 如果您等待时间将它们全部放在一起,这将永远不会发生。
使用这种方法可能是个问题。 连续的改进对许多人来说都是困难的,因此它们继续怀着完全重写模块,子系统或应用程序的强烈愿望。 结果,书堆不会减少并且在迭代之间一直停留在地板上。
使客房清洁成为工作流程的一部分
不要启动用户案例进行重构。 不要等待两周来修复一个文件。 了解如何将简单规则纳入您的日常工作。 侦察兵规则说:离开营地之前要比到达前更清洁。 如果您不断遵循,则逐渐摆脱“不良习惯”。
保持联系
准备随时与团队中的每个成员就您的工作进行沟通。 上一段并不意味着您需要隐藏自己在做什么。 您只需要考虑将重构和整理成为所有操作的一部分。
重构时:
- 不要征得许可。 这是您工作的一部分。 但是要开放讨论您的决定。
- 不要对自己的错误负责,不要从错误中学习。 错误也是工作的一部分。 正是通过他们,我们才了解我们正在从事的工作。 您会做的,谦卑自己。 有时您无法完成重构,有时相反,您可能会被过多带走,但是最重要的是,要一遍又一遍地从错误中学习。
- 要求提示,但不要总是遵循提示。 作为开发人员,您的任务是确定需要重构的内容和不需要重构的内容。 您必须拥有做出这些决定和犯错误的自由。
- 一起做,因为你住在这里。 这很重要。 , , , .
结论
— . — . , , , , .
. — . , , , , .
参考文献
- , ,