免费下载案例集|20+数字化领先企业人才培养实践经验 了解详情
写点什么

代码行数是致命因素吗?

  • 2007-12-26
  • 本文字数:1874 字

    阅读完需:约 6 分钟

Steve Yegge最近的一个帖子触动了开发社区的神经。Steve 主张将代码数量保持在一个绝对的最小值,是软件开发中最重要的事情。依他的看法,即便仅仅出于缩减代码行数的理由,你或许也该牺牲一些设计模式和避免一些重构。如果问题域太大,做不到这一点——那么你可以换到另一种编程语言。

……我相信,相当坚定地相信,对于一个代码库来说,最坏的事情就是它的大小。

Steve 认为,代码大小有毁灭性的影响:

多数人可能不认同我的观点:山一样的代码是一个人、一个团队、一家公司所能遭遇的最严重的灾害。我认为代码的重量会压垮项目和公司,它迫使人们在达到一定大小后就不得不重写,明智的团队会尽其所能阻止代码库变成一座大山。

Steve 说他本来也可以用代码肿胀的说法,但问题是开发者鉴别不出肿胀,而且他要说的也不是一般偶然遇到的复杂性。

我说的“大小”只是用来代替一个相对更加合适的概念,因为我暂时找不到更好的词汇来表达。我会来回说明这个词所代表的含义,直到你理解我的意思,或者帮我找到一个更合适的词。“肿胀”这个词可能更准确,因为每个人都知道肿胀是不好的,但不幸很多所谓有经验的程序员都不知道该怎么检测肿胀,他们会指着一个剧烈肿胀的代码库,说它瘦得像电线杆一样。

这个帖子的背景是 Steve 曾经用 Java 写了一个在线游戏,现在已经达到了 500,000 行代码,他无法再自己一个人维护这么大的代码库。因此不久前他把游戏撤了下来,现正用 JavaScript 重写。

我是经历过很多才得出这样的观点。人们很少关心代码库的大小,它并不被广泛认为是一个问题,实际上它被广泛认为不是一个问题。

那工具又如何呢?工具能让代码管理变轻松吗?

这一行的人们对于名义上有助于对付巨大的代码库的各种思路非常热衷,比如能把代码当成“代数结构(algebraic structure)”来操弄的 IDE,搜索索引之类。这些人看待代码库的眼光和建筑工人看待一堆土差不多:他们想要能把这堆土随意搬来搬去的大机器。

如果只是说到这个份上,很多开发者都还同意 Steve 的观点。凡是曾经接手大型代码库的人都清楚,代码行数本身就令人头痛。

如果你有 1 百万行代码,按每“页”50 行算,那就是 20,000 页的代码。你读完一本 20,000 页的说明书需要多长时间?仅仅是浏览代码库,尝试辨认出总体的结构可能就要花费数周甚至数月,取决于信息的密度。重大的架构变更可能需要数月甚至数年。

Steve 比大多数开发者更激进,他主张出于最小化代码库的目的,避免设计模式和重构可能是好的选择。

重构在 Java 这类语言身上表现出来的问题,很接近我的命题的中心:重构会使代码库变大。我估计现有 IDE 所支持的各种标准重构当中,能使代码库变小的不超过 5%。

至于设计模式,他写道:

设计模式——至少 GoF 书中的大部分模式——使代码库变得更大。可悲的是,唯一有助于缩小代码库的 GoF 模式(Interpreter)被那些程序员全然忽略了,而他们甚至把设计模式的名称纹在了身上。

不久之前 InfoQ 总结过对依赖注入的争论,Steve 把 DI 也归入了代码肿胀的类别:

像依赖注入这类流行的新 Java 设计模式,Ruby、Python、Perl 和 JavaScript 程序员可能从未听过。即便听过,他们也很可能(正确地)断定自己不需要它。依赖注入是一种极其精妙的基础架构,它在某些方面令 Java 更加动态,而那些方面正是更高级语言的本质所在。而且,用不着猜,DI 会让你的 Java 代码库变得更大。 用 Java 就要忍受它变大。活着就要生长。Java 就像是俄罗斯方块游戏,没有哪一块能完全填满其他块造成的缺口,而不造成新的缺口,因此你只能无休止地叠下去。

在跟贴里人们争论得很热烈。很多人觉得解决的方法是把代码分解成库,这样就不需要去理解全部的代码,至少不需要一下子全部理解。 Udi Dahan 问:

假如你按照这样的方式去组织代码,比如说每次做一件有意义的工作时只需要查阅不超过 1000 行代码,那么总共有 50 万行代码是一个大问题吗?

Jay Levitt 插了进来,他不同意 Udi,还借用了“成层现象(stratification)”这个词来表述他的意思。

我不断看到这样一种反模式,不过还没给它找到很好的名字。我叫它“成层现象”。 简单说,你越是编写高级的库来包装低级的库,低级库就用得越少,于是你就更不了解它们。渐渐地,你甚至忘了它们的存在。到了那个时候,你将(不可避免地)在高级库之上编写更高级的库,目的却是重新实现低级库的功能。

大小重要吗?我们都同意偶然的复杂性是不好的,应当消除;但如果代码实际上是清晰的,却仍然很庞大呢——我们是接受现实,还是采取非同一般的手段,像回避重构或者换用其它编程语言,去缩减代码的大小?大小有多重要?

查看英文原文: Does lines of code kill?

2007-12-26 16:581417
用户头像

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

关注

评论

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

LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之二:编码实现

程序员欣宸

Java LeetCode 8月月更

行业 SaaS 微服务稳定性保障实战

阿里巴巴云原生

阿里云 微服务 云原生 可观测

SRv6网络演进面临的挑战

穿过生命散发芬芳

8月月更 SRv6

手撸Router,还要啥Router框架?让react-router/vue-router躺一边凉快去

hiisea

vue.js 前端 开源项目 前端框架 React

开源一夏 | VuePress的简单使用

坚果

开源 8月月更

【LeetCode】使数组中所有元素都等于零Java题解

Albert

LeetCode 8月月更

面试突击71:GET 和 POST 有什么区别?

王磊

Java 常见面试题

Java网络编程IO模型 --- BIO、NIO、AIO详解

Bug终结者

Java io 8月月更

关于 01 背包问题

HelloWorld杰少

8月月更

Java J.U.C 学习笔记-使用篇(一)

U2647

git 安装与体验

Jason199

git 签约计划第三季 8月月更

C++面向对象封装特性的实例分析与应用扩展(一)

CtrlX

c++ 面向对象 后端 代码 8月月更

Nacos配置中心之事件订阅

急需上岸的小谢

8月月更

SAP Analytics Cloud 和 SAP Cloud for Customer 两款 SaaS 软件的集成

汪子熙

SaaS 云平台 系统集成 8月月更

浅聊缓存函数

掘金安东尼

前端 8月月更 高阶函数

是什么,让中国成为一台超级计算机?

脑极体

鲲鹏devkit开发套件

乌龟哥哥

8月月更

磁盘管理-Linux系统磁盘管理

Albert Edison

Linux 磁盘 8月月更

2022-Java后端工程师必会知识点-(Lunix)

自然

Lniux 8月月更

Serverless开源架构方案

阿泽🧸

Knative 8月月更

【高并发项目实战】千万级并发的购物车系统设计与代码详解

小明Java问道之路

架构 高可用 高并发 签约计划第三季 8月月更

程序员常说的“左手锟斤拷,右手烫烫烫”是怎么回事?

桑榆

bug 8月月更

不想当Window的Dialog不是一个好Modal,弹窗翻身记...

hiisea

前端 前端开发 前端架构 antd 前端框架

Sass/Scss、Less 是什么?

CRMEB

4KMILES加入艾盛集团,以更强劲的数字商务能力,加速中国跨境电商的全域全效增长

Geek_2d6073

万物智联时代,悄然走入生活

这不科技

鸿蒙 OpenHarmony

数据中台建设(八):数据服务体系建设

Lansonli

数据中台 8月月更

Axure9的元件用法

乔乔

签约计划第三季 8月月更

2022-Java后端工程师必会知识点-(Docker)

自然

Docker 镜像 8月月更

2021-Java后端工程师必会知识点-(分布式RPC框架Dubbo)

自然

RPC 8月月更

linux重要的目录之etc

入门小站

代码行数是致命因素吗?_编程语言_Niclas Nilsson_InfoQ精选文章