大咖直播-鸿蒙原生开发与智能提效实战!>>> 了解详情
写点什么

争论:编写可维护的代码

  • 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:111276
用户头像

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

关注

评论

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

消息队列优化(2) -- 几种基本实现

1412

消息队列 workflow srpc 异步调度 并行计算

江苏民丰 x mPaaS | 县域小银行,技术团队就12人,却找到了数字化转型的秘籍

蚂蚁集团移动开发平台 mPaaS

银行数字化转型 mPaaS

软件架构设计方案实战

Andy

Polkadot系列(四)——Polkadot茶溪岸啤(XCMP),干杯!

QTech

区块链技术 polkadot 跨链

架构师训练营第2期 第11周命题作业

月下独酌

十一、高可用

Geek_28b526

面试官:数据库自增ID用完了会怎么样?

艾小仙

数据库

开源整套Netty源码笔记+19个案例调优+游戏项目,终于彻底顿悟了

Java架构追梦

Java 源码 架构 Netty 游戏项目

面试腾讯,字节跳动首先要掌握的Java多线程,一次帮你全掌握

Java架构之路

Java 程序员 架构 面试 编程语言

消息队列优化(3) -- grpc MPMCQueue 简介及各队列性能对比

1412

消息队列 workflow srpc 异步调度 并行计算

console.log也能插图!!!

德育处主任

CSS html 大前端 Web js

呃?!!!我彻底忘了这件事😂

Nydia

万字长文聊缓存(上)

Silently9527

Java nginx HTTP

判断回文数字算法,swift 5初始化详解,时间管理计划落地,swift5 多线程高级用法 John 易筋 ARTS 打卡 Week 33

John(易筋)

ARTS 打卡计划 算法回文数字判断 时间管理计划落地 swift5 初始化详解 swift5多线程高级用法

UDP连接要不要发起connect

kof11321

网络编程

完美!华为爆出Redis宝典,原来Redis性能可压榨到极致

996小迁

redis 架构 面试 资料

曲折!目标腾讯,字节,拼多多;最后居然五面进了阿里?

Java架构之路

Java 程序员 架构 面试 编程语言

架构师 01 期,大作业一

子文

谁说明天上线,这货压根不知道开发流程!

小傅哥

Java 小傅哥 架构设计 开发流程 开发规范

2020年国内前端团队都做了些什么?

徐小夕

大前端 技术栈 2021

准备去阿里以及大厂面试你都需要会些什么?我从任职阿里的朋友口中,总结出了一些答案!

Java架构之路

Java 程序员 架构 面试 编程语言

架构师第一周总结



微服务缓存原理与最佳实践

万俊峰Kevin

缓存 缓存穿透 缓存并发 go-zero Go 语言

干货|原来IPFS是这样存储文件的

QTech

区块链技术 IPFS 星际文件系统

与前端训练营的日子 --Week10

SamGo

学习

消息队列优化(1) -- 鶸的介绍篇

1412

消息队列 workflow srpc 异步调度 并行计算

关于一个梦(自我的死亡)

Yuchen

身心健康 心理 自我

重学JS | 数组知识点大全,必收藏!

梁龙先森

大前端 编程语言

AI人脸识别技术门禁系统解决方案智慧社区建设

13828808769

人脸识别 智慧城市 智慧平安小区平台开发 刷脸

Week1 作业

oooh-la

我画了 40 张图就是为了让你搞懂计算机网络层

苹果看辽宁体育

计算机网络 IP 网络层 ipv6 ipv4

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