在他们的工作台上想象一个工匠,面对两套工具 – 一种是为了速度而建造的,另一种是精确的。每个都有其目的,但是在错误的时间使用错误的目的会破坏整个项目。
这是现实开发人员每天面对的。我们是否编写快速的功能代码以满足迫在眉睫的截止日期?还是采取较慢的清洁,可维护代码的速度,未来队友会感谢我们?快速移动和正确的建筑物之间的张力是真实的,而不仅仅是开发人员的问题。产品经理和技术领导者也努力解决,因为后果触及了截止日期,团队速度,技术债务和用户体验。
一些团队正在通过所谓的中间立场 氛围编码– 一种平衡的心态,将快速代码的紧迫性与清洁代码的足够结构和清晰度融合在一起,以避免以后混乱。
那么,更聪明的方法是什么?在项目(或您的理智)遭受损失之前,让我们打破权衡取舍,并发现如何明智地选择。
定义概念
什么是干净的代码?
干净的代码是:
- 易于阅读和理解
- 一致和优雅
- 模块化和可维护
- 可测试和可预测的
由传奇软件工程师定义 罗伯特·马丁 (又名“鲍勃叔叔”)在他的书中 干净的代码,这不仅与代码的工作原理有关,还与与之合作的感觉有关。清洁代码传达意图并减少认知负载。这并不聪明;天气晴朗。
干净代码的示例:
JavaScript
函数计算(项目){
返回项目。
}
此功能传达了它的作用。您不需要评论就可以理解它。
什么是快速代码?
快速代码是指迅速编写的代码,通常是为了满足截止日期,概念证明要求或MVP启动。它优先:
- 交付速度
- 形式的功能
- 原始结构的工作软件
快速代码通常以可维护性,可读性和可扩展性为代价来完成工作。它通常充满捷径,命名惯例差和硬编码价值。
快速代码的示例:
JavaScript
功能C(a){
令t = 0;
for(让i = 0; i
t += a[i][1] * a[i][2];
}
返回t;
}
这有效 – 但是有什么 意思是?是什么 c?是什么 一个[i][1]?祝您好运在六个月内调试。
干净代码的情况
1。随着时间的推移可维护性
软件不仅写了一次,而且被遗忘了。大多数代码库持续了多年,数十个开发人员维护它们。干净的代码是对未来的礼物 – 您,您的队友,甚至是新员工。
想象一下,继承一个装有隐秘逻辑和零文档的代码库。干净的代码阻止了这种地狱场景。
事实: 根据 IBM系统科学学院,部署后修复错误的成本比设计期间高100倍。干净的代码有助于尽早避免错误。
2。协作和团队效率
在团队环境中,干净的代码充当通用语言。当您遵循约定,使用有意义的名称并将功能分解为较小的组件时,您的代码将变得协作。
书写不佳的快速代码通常会导致技术债务,雪球会变成更长的入职,较低的速度和倦怠。
3。准备好的重构和测试友好
干净的代码更容易重构和单位测试。它遵循可靠的原则(单一责任,开放/关闭,liskov替换,接口隔离和依赖性反演),这使得代码模块化且易于发展。
当需求发生变化时,干净的代码弯曲而不会破裂。
快速代码的情况
1。上市压力
初创公司通过能够提供价值的速度生活和死亡。一个完美的,良好的系统延迟六个月推出,可能会失去一种笨拙但功能上的MVP,从而获得了早期用户的反馈。
在产品的早期阶段,速度经常胜过完美。这就是精益创业方法的前提:建筑量 – 学习周期应短有效。
真相炸弹: 您不能重构从未发货的产品。
2。原型,POC和实验
当您测试想法,推销投资者或证明概念的可行性时,快速代码是一个很好的工具。您不是构建最终产品 – 您验证了假设。
这里的目标不是完美的代码。它是 速度,,,, 迭代, 和 反馈。
3。有时,干净的代码过于杀伤
并非每个应用程序都旨在持续十年。内部工具,一次性脚本或短期广告系列应用程序可能不需要完整的清洁代码处理。
在这种情况下,花费时间过多可能会适得其反。您的时间可能会更好地花在其他地方。
权衡:技术债务和速度
快速代码累积技术债务 – 造成长期问题的分期解决方案。像金融债务一样,起初它是可以管理的,但如果被忽略,它会变得残酷。
另一方面,干净的代码就像复杂的兴趣一样。它可能开始缓慢,但从长远来看就可以大量收益。
这是一个简单的类比:
代码类型 | 优点 | 缺点 |
干净的代码 | 可维护,可扩展,可测试 | 较慢写,小应用程序过度杀伤 |
快速代码 | 快速交货,早期反馈 | 难以维护,容易漏洞,不可扩展 |
现实世界的情况
方案1:启动MVP
您正在4周内建立MVP来筹集种子资金。您不知道用户是否会喜欢该产品。
受到推崇的: 快速代码→验证想法→然后清理
方案2:SaaS平台与付费客户
您有成千上万的用户和多个开发人员从事功能。
受到推崇的: 清洁代码→可持续发展→更容易入职
方案3:黑客马拉松或内部工具
您需要在24小时内进行演示,或用于数据迁移的抛弃工具。
受到推崇的: 快速代码→文档足够→归档
混合方法:用干净心态的快速代码
这是一个甜蜜的地方。这是您可以平衡两个世界的方式:
1。快速开始,以后清理
遵循“使其正常工作,使其正确,使其快速”的哲学。
- 阶段1:快速原型
- 第2阶段:重构和编写测试
- 阶段3:优化
2。写代码,好像您要维护
即使在快速黑客攻击中,也使用清晰的命名,评论和基本结构。稍后您会感谢自己。
3。功能标志和模块化设计
建立标志后面的快速功能,以便可以向后滚动或清理,而不会影响系统的其余部分。
4。经常,不以后
“稍后我们将清理”一词通常变成“永不”。安排定期重构冲刺或成对编程会话,以在螺旋式失控之前对其进行处理。
行业巨头的教训
Facebook的“快速移动”文化
Facebook著名地接受了“快速移动并破坏事物”的咒语。但是随着扩展的规模,它转向了强大的工程实践。为什么?因为快速代码无法支持数十亿个用户。
Google强调代码质量
Google具有严格的代码审核过程。工程师花费大量时间来审查和重构 – 不是因为他们喜欢nitpick,而是因为他们看到了长期清晰度和稳定性的价值。
购物和清洁代码文化
Shopify是最大的电子商务平台之一,它在开发人员体验和清洁代码实践上进行了大量投资。 Clean Code使他们的成千上万的开发人员能够在整体轨道应用程序中有效协作。
鼓励清洁代码的工具和实践
- Linters&Formatters: Eslint,更漂亮,Rubocop
- 代码评论: 鼓励最佳实践,同伴学习
- 单位测试和TDD: 鼓励模块化,可测试的代码
- 重构工具: 喷气桥IDE,VS代码扩展
- CI/CD管道: 自动测试使您保持诚实
- 文档标准: JSDOC,Swagger,Markdown Readmes
最终判决:最重要的是什么?
那么,更重要的是 – 清除代码或快速代码?
回答: 这取决于。
如果您在高风险的长期代码库中工作,则会赢得清洁代码。但是,在MVP或内部黑客的早期时期,快速代码可能更有价值。
最好的开发人员知道何时对速度进行优化以及何时优化可持续性。对这两种方法进行教条式,会导致不良结果。
经验法则:
在验证想法时编写快速代码,但不要让快速永久化。重构迅速。干净地建造。明智地扩展。
最后的想法
软件开发是一项平衡行为。在干净和快速代码之间进行选择不是对或错,而是关于上下文。伟大的工程师不仅仅是伟大的编码人员;他们是伟大的决策者。他们评估权衡取舍,提前思考并意图建立。
因此,下次您发现自己急于急忙暂停并询问:
- 此代码会被重新访问吗?
- 我可以稍后再清洁吗?
- 其他人能在3个月内理解这一点吗?
如果对任何一个的答案都是“是”,那么也许是时候放慢脚步并清理它了。
因为最终,读取代码的频率超过书写的频率,并且清洁代码(如良好的写作)经受了时间的考验。