写点什么

争论:编写可维护的代码

  • 2007-06-26
  • 本文字数:1337 字

    阅读完需:约 4 分钟

在.NET 社区里, Sam Gentile Oren Eini(昵称 Ayende) Frans Bouma 正在就如何编写可维护的代码进行一场争论,还有不少人也加入了战局。争论的焦点集中在一个问题:测试驱动开发(TDD)、对象 / 关系映射(ORM)、Model-View-Presenter/Controller(MVP/MVC)以及其他最佳实践是否有助于提高软件的可维护性。

Jdn 以他对可维护性的一些想法开始了这场争论,Jdn 表达了他对 TDD、ORM 和 MVP/MVC 可能妨碍而不是促进了生产效率和可维护性的担心:

我有一个问题(好吧,其实不只一个)。我清楚知道我将把这个程序交给别人。维护它的人不会是我。我了解将要接手的人,因此我知道他们掌握的技能,我知道他们对编码方式的偏好。

Oren Eini 以一篇《可维护,对谁来说?》作出了回应。他同意对于不熟悉 TDD、ORM、MVP/MVC 的开发者来说,维护一个采用这些实践和框架的系统是很困难的(甚至是不可能的)。但他认为保留坏的实践,而只为了方便别人维护是一个糟糕的借口:

走回头路在我看来是最失败不过的了……。这不过是“我们一直都这样做”的老生常谈。当然,你可以用骡子来耕田,没问题。但一架拖拉机可以做得更好,即便你要先学会驾驶它。

Sam Gentile 赞同 Oren 的说法,他也认为向开发者传授最佳实践,如 TDD、DDD 和 ORM 等,对“真实世界”的项目来说,是值得花的代价。他在博客上总结了这场争论,并对 Frans Bourma 写的《没有坚实的文档行不通》作出了回应。Bouma 认为 TDD 无助于理解软件内部的行为,并且“很可能缺乏有深度的设计文档,以来阐述为什么一段代码要这样写,以及比如为什么不采用 B 和 C 算法等等。这些都是提高软件可维护性的重要信息。” Sam Gentile 回应说:

并不是只有单元测试。这些代码都是经过结对编程高度重构过的。当人们谈论代码的可维护性和“可扩展性”时,并不是在说什么插件。而是持续地改进代码的内部实现,将之重构成简单和可维护的代码。我坚持认为这样开发出来的代码更具可维护性,也为将来的代码增长打下了基础,将来不需要破坏一切再重新开始。让我们换个说法:我可以一个月不去看代码库,只要有单元测试和构造良好的代码,在几分钟之内我就能够了解现在的进展。

Frans Bouma 接受了挑战,并反击到:“要正确地分析代码和完全理解代码需要耗费很多的努力。这是‘代码就是文档’流派经常犯的错误”。他认为“代码不能替代你的文档:它只显示了现在的实现是什么,而没有说明为什么没有采用另外一种实现;而且代码是糟糕的文档:它没有用人类最容易理解的方式来说明代码的工作原理。” Oren Eini再次加入战局并声称他对这个问题的解决办法是“投入很多时间来想出有意义的命名,以及在测试里涵盖基础设施的所有方面”。对于 Bouma 的论点“文档并不是与代码分离的实体:它是用某种 DSL(即人类可阅读和理解的语言)写成的对功能性的描述”,Oren 回应说:

文档不是 DSL,而且在很多情况下几乎可以肯定文档是难以理解的。文档可能有很多模糊不清的微妙之处。代码并不是某种 DSL,这种说法假设了代码与文档存在某种关联,但代码才是实际运行的东西,因此对任何系统来说,代码才是权威的。

虽然这场争论很大程度上是在重复“代码就是文档”的老争论,但仍然提出了许多值得深思的新想法和新论点。您的想法如何?

查看英文原文: Writing Maintainable Code

2007-06-26 01:111293
用户头像

发布了 225 篇内容, 共 74.6 次阅读, 收获喜欢 53 次。

关注

评论

发布
暂无评论
发现更多内容

WICC 2021来袭 融云领衔探索互联网通信云技术新方向

融云 RongCloud

CloudQuery 使用教程之《No.2数据查询(上)》

BinTools图尔兹

sql dba 数据库管理工具 国产数据库 开发运维

透过 3.0 Preview 看 Dubbo 的云原生变革

try catch

Vue Conf关于Vite的分享给我带来的启发

前端森林

vite esm Vue 3

🏆「终」【JVM 性能调优】「CMS 垃圾回收器」优化实战分析(补充版)

码界西柚

CMS JVM GC调优 6月日更

未来法律科技发展现五大趋势,区块链、AI、大数据吸引资本目光

CECBC

CloudQuery 安全系列(一): Http 与 Https

BinTools图尔兹

数据库 网络安全 https 数据安全 数据库管理

数字化时代,为什么解决信任问题是科技公司最重要的事情?

CECBC

JAVA 面向对象 (十二)-- 关键字this

加百利

Java 关键字 this 6月日更

英特尔拥抱开源,岂能没有杀手锏?

E科讯

Spring @Transactional 注解是如何执行事务的?

程序员小航

Java MySQL spring 事务 代理

法国政府的"安全 "WhatsApp替代品在短短90分钟内被破解

BeeWorks

使用高级视频质量工具 AVQT 评估视频 | WWDC 演讲实录

网易云信

机器学习 算法 音视频

存储大师班:NFS 的诞生与成长

青云技术社区

存储 分布式存储 NFS

用超出行业平均薪资招人?

石云升

职场经验 管理经验 6月日更

深度学习分类任务常用评估指标

华为云开发者联盟

机器学习 深度学习

在北鲲云超算平台上做球体落入水中的流固耦合仿真模拟记录

北鲲云

Facebook Chat真的是世界第三大即时通讯客户端吗?

BeeWorks

英特尔院士Johanna Swan:极致的异构集成是半导体封装未来趋势

E科讯

作为后端开发者的思考:如何看待如今的前端架构

吴脑的键客

大前端 后端

数仓备机DN重建:快速修复你的数仓DN单点故障

华为云开发者联盟

数据仓库 主机 华为云 备机 DN

什么是SSD Sanitize数据擦除技术?

怀瑾握瑜

存储 SSD 数据保护 备份 删除

华为云数据库GaussDB(for Cassandra)揭秘:内存异常增长的排查经历

华为云开发者联盟

nosql 云原生 Cassandra 华为云数据库 GaussDB(for Cassandra)

电梯“惊魂”事故频频发生,可视化全平台覆盖,远程值守高效监控

一只数据鲸鱼

数据可视化 智慧城市 智慧园区 智慧电梯

让AI发展避开“暗礁”,索信达控股推出自研区块链+联邦学习解决方案

索信达控股

区块链 金融科技 联邦学习 金融监管 风控

解密开源技术的污点

BeeWorks

云小课 | MRS基础入门之HDFS组件介绍

华为云开发者联盟

hadoop hdfs 分布式文件系统 MapReduce服务 数据读写

技术解密 |阿里云多媒体 AI 团队拿下 CVPR2021 5 冠 1 亚成绩的技术分享

阿里云CloudImagine

阿里云 AI 计算机视觉 经验分享 CVPR

社群编码识别黑灰产攻击实践

百度Geek说

安卓工控主板显示接口有哪些呢?

双赞工控

安卓主板 工控主板 ARM开发主板

深入C语言中数据的存储

小写丶H

争论:编写可维护的代码_Java_Hartmut Wilms_InfoQ精选文章