写点什么

讨论:怎样才算“易于维护”?

  • 2009-08-24
  • 本文字数:1391 字

    阅读完需:约 5 分钟

不久前, NHibernate 的主力开发人员 Oren Eini 在博客上发表了一篇名为“怎样才算易于维护”的文章,许多网友围绕这个问题表达了自己的看法。

事情的起因是由于 NDepend 的开发人员 Patrick Smacchia 认为 NHibernate 2.1 的代码“变得很难维护,容易牵一发而动全身”,Oren Eini 撰文予以回应并认为NHibernate 2.1 的代码依然很容易维护。话题慢慢转移到对“易于维护”标准的讨论上,如 Frans Bouma 在回复中谈到

已经花费很长时间来深入代码的人自然能够顺利地修改代码,对他来说代码便是易于维护的。但是对于新接触这些代码的人来说,如果需要花费很长时间才能知道应该从哪里入手,以及更重要的:“为什么”要这样修改,这已经意味着这些代码的可维护性需要提高。

Oren 对此有不同看法,他谈到

我必须说我完全不同意这个看法。

“可维护性”对那些熟悉代码的人来说才有意义,如果这些人认为代码令人难以接受,则表明可维护性较差。如果某人对代码还缺乏必要的了解,那么他认为“难以维护”并不能说明代码本身的任何问题。

不少回复支持 Oren 的看法,如 Phil Haack (微软 ASP.NET MVC 框架开发人员之一)回复到:

我完全同意你的看法。例如,如果我接触一个较大规模的 Python 程序,那么我自然难以对它进行维护。除非我学习了 Python,它的风格和约定,那么我可能就会觉得那些有经验的 Python 程序员写的代码容易维护了。

……然而,熟悉代码所需要的时间,与在了解代码的情况下,是否容易进行维护并没有直接的关系。我们还必须区分领域本身的复杂程度,以及低劣的实现方式所带来的复杂性。

不过也有人认同 Frans Bouma 的说法

如果你足够了解代码的话,就算是一堆狗食(dog-breakfast)也是容易维护的。我见过许多代码本身很有问题,但是它们的作者还是能够轻松地维护代码。

所以衡量可维护性的正确方式,应该让作者和熟悉的人回避,让其他的人来尝试着进行维护。如果难以进行,则这段代码早晚会出问题。这在我的定义中代表了较差的可维护性。

也有人认为应该区分一些概念

在我看来,可维护性是指那些已经熟悉代码的人,在修改系统时需要承担多少风险的问题。如果你有自信可惜在修改时不破坏无关的部分,那么系统就是易于维护的。

至于“可学习性(learnabiliy)”则是另一个问题了。

但是事件的“始作俑者”Patrick认为“可维护性”和“可学习性”是一回事情

我同意 Bouma 的说法。一个人不可能永远熟悉每一行他写的,或者他曾经维护过的代码。我经常遗忘两星期前写的代码。但是有了组件化,结构化,分层……我可以在遗忘之后很快地重新掌握它。

可学习性和可维护性表示的是同一类事情,它们都意味着代码必须被独立地分割,独立地开发,重构,测试,学习和增强。这是“分而治之”原则。违反这个基本原则的代码规模很难提高,对于大型 IT 组织来说,违反这个原则会是最主要的问题。

Jason 认为影响“可学习性”的因素有时并非单纯的实现问题

我认为我们应该通过观察代码的耦合性,内聚性,以及一个人能否根据接口和文档(而不是深入代码)了解代码的作用和使用方式来评价它的“可维护性”。

而可学习性与可维护性不同,因为领域本身的特点会影响学习难度。不过可学习性的其他一些因素也会涉及到可维护性,因此它们是有关系的。

此后,大部分人在回复中认为“代码的可维护性不应该和开发人员等外部资源有关”,因为没有人能够保证这些外部资源是永远充足的。

您的看法是什么呢?您认怎样的代码“易于维护”呢?

2009-08-24 07:523141
用户头像

发布了 157 篇内容, 共 50.1 次阅读, 收获喜欢 5 次。

关注

评论

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

软件测试 | 测试开发 | app自动化测试(Android)--触屏操作自动化

测吧(北京)科技有限公司

自动化测试 app测试

TiFlash 源码解读(七)TiFlash Proxy 模块

PingCAP

TiDB TiDB 源码解读

TDengine3.0计算查询引擎的优化与升级

TDengine

数据库 tdengine 时序数据库 企业号九月金秋榜

软件测试 | 测试开发 | 简单快速的从GitHub同步代码

测吧(北京)科技有限公司

git

【译】日志:每个软件工程师都应该了解实时数据的统一抽象【一】

Rae

架构 分布式 日志 原理

TiDB v6.2 发版

PingCAP

#TiDB

基于MonoRepo的Web端CI/CD实践与优化

RingCentral铃盛

企业号九月金秋榜

软件测试 | 测试开发 | app自动化测试(Android)--高级定位技巧

测吧(北京)科技有限公司

xpath

易观分析&Pangle联合发布《全球新兴市场移动应用报告》

易观分析

新兴市场

为什么资源隔离对HTAP至关重要?

OceanBase 数据库

内核实战教程第四期 _ 带你走进数据库 SQL 引擎

OceanBase 数据库

【译】YouTube 架构

Rae

数据库 架构 youtube 后端技术

开源治理的基本实践与指导原则

SEAL安全

开源 开源安全 软件供应链安全 开源安全与治理

从原理剖析带你理解Stream

华为云开发者联盟

开发 企业号九月金秋榜

边缘服务网格 osm-edge 概览

Flomesh

Service Mesh 服务网格

最新版!955、不加班、双休的公司名单

千锋IT教育

软件测试 | 测试开发 | 一文搞定 uiautomator2 自动化测试工具使用

测吧(北京)科技有限公司

自动化测试

软件测试 | 测试开发 | AppCrawler 自动遍历测试实践(三):动手实操与常见问题汇总

测吧(北京)科技有限公司

测试

开学季 | Y 省教育厅这张卷,融云答出了100分!

融云 RongCloud

通讯协议

软件测试 | 测试开发 | 测试人员必须掌握的测试用例

测吧(北京)科技有限公司

测试

新书上市 | 十分易上手的图解教程,全系列累计销量20万册!

图灵社区

程序员 计算机 图论

你的秋日好运正在派件,请查收9月月更活动!

InfoQ写作社区官方

热门活动 9月月更

软件测试 | 测试开发 | 疫情之下工资翻了2倍多,这4个月学习比工作8年学到的还多

测吧(北京)科技有限公司

软件测试

软件测试 | 测试开发 | 测试人生 | 薪资翻倍涨至50W是种什么样的体验?

测吧(北京)科技有限公司

测试

软件测试 | 测试开发 | 测试人生 | 双非学历入职名企大厂还薪资翻倍?

测吧(北京)科技有限公司

面试 测试

宏杉科技加入阿里云PolarDB开源数据库社区

阿里云数据库开源

阿里云 polarDB 阿里云数据库 PolarDB-PG PolarDB for PostgreSQL

fastposter v2.9.2 最简海报生成器

物有本末

海报生成器 电商海报 图片生成

软件测试 | 测试开发 | 常见接口协议解析

测吧(北京)科技有限公司

TCP

软件测试 | 测试开发 | app自动化测试(Android)-- Capability 使用进阶

测吧(北京)科技有限公司

Andriod

软件测试 | 测试开发 | 如何使用代理配置快速定位接口测试脚本问题?

测吧(北京)科技有限公司

测试

Python代码用在这些地方,其实1行就够了

华为云开发者联盟

Python 开发 企业号九月金秋榜

讨论:怎样才算“易于维护”?_敏捷_赵劼_InfoQ精选文章