BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

代码行数是致命因素吗?

| 作者 Niclas Nilsson 关注 0 他的粉丝 ,译者 郭晓刚 关注 0 他的粉丝 发布于 2007年12月27日. 估计阅读时间: 5 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

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?

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

Fall Back by Guo Xiaogang


简单说,你越是编写高级的库来包装低级的库,低级库就用得越少,于是你就更不了解它们。渐渐地,你甚至忘了它们的存在。到了那个时候,你将(不可避免地)在高级库之上编写更高级的库,目的却是重新实现低级库的功能。

我想设计库/API的时候应该留下一个fall back的口子,高级库只针对80%的情况去做简化,剩下的留一条路让人直接用低级库。举例:Spring AOP和AspectJ,Hibernate和JDBC。

Re: Fall Back by Guo Xiaogang

极端一点的话,对于大多数人:
1、不要自己写库;
2、如果必须自己写库的话,参见第一条。

Re: Fall Back by Jacky Li

赞同

Re: Fall Back by 曹 云飞

前提是开发人员既要会Spring AOP又要会AspectJ,这个前提不那么容易成立,所以实践起来难度比较大呀。
总的来说,我喜欢短的代码。也有一些例外,有些短代码不易于理解,如果长代码更容易理解的话,我会用长的。

Re: Fall Back by 李 佳

极端一点的话,对于大多数人:
1、不要自己写库;
2、如果必须自己写库的话,参见第一条。


就会没有库 哈哈哈

Re: Fall Back by Boqi Tang

没库就光了,不许出屋,哈哈,

Re: Fall Back by Boqi Tang

java项目本来就是多个库组合而成,用一些开源库和自己写库,本质上没什么分别吧,

关键是开发文档要全,对以后的修改很方便

java项目的开发如果没有一个好的领导会很容易成为垃圾项目的,

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

7 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT