stl源代码stl源代码_源代码的寿命

stl源代码stl源代码

查看您日常工作的代码。 那里已经有多久了? 几岁了? 六个月大? 一年? 也许五岁? 十? 二十?! 有多少旧代码? 少于10%? 半? 或高达90%? 好奇地想知道这些问题的答案,我一直在研究代码停留了多长时间。

软件考古学

适用于已经存在两年以上的任何公司,并且源代码已经存在了一段时间。 在这样的环境中编写软件通常是软件考古学的一个练习–深入研究应用程序就像深入挖掘一个古老的城市,慢慢地逐步揭示过去。

一旦您摆脱了闪亮的新型容器化微服务,您便开始研究最近的过去:也许是该公司首次涉足面向服务的体系结构的残余。 现在,集合了具有复杂业务逻辑的整体式服务,这些服务与许多Spring捆绑在一起。 进一步深入研究,我们回到EJB时代。 一些遗忘已久的豆类仍然坚持存在,因为缺乏任何开发人员重新了解它们的欲望。 在这里是骨骼所在的位置。

如果没有破裂,请不要修复

旧代码有什么不好的地方? 毫无疑问,它正在实现一些重要目的。 至少,其中一些可能是。

如果您看一年前编写的代码,却看不到任何更改,那么您去年就没有学到任何东西

我们一直在学习更多:对领域有更好的了解,对我们的解决方案如何对领域建模,新的架构风格,新的工具,新的方法,新的标准和新的想法有了更好的了解。 这是不可避免的,你写了一年前的代码可以以某种方式改进。 但是您最近回头并改进了多少呢?

旧代码的麻烦在于,更改变得越来越困难。 如果业务需求的变化使您一直走到EJB的罗马时代下水道,将会发生什么? 您会以十年前的方式实施更改吗? 还是您会花费时间尝试提取需要更改的部分? 也许在此过程中构建另一个闪亮的,新的容器化微服务? 不过,这种变化不会便宜。

这就是问题所在:偿还这种“技术债务”是正确的做法,但是更改此古老代码比您上周或上个月编写的内容要慢。 您拥有的越古老的代码进行更改的速度就越慢,开发新功能的速度就越慢。 维持长期运行的代码库最糟糕的部分不仅是偿还我们知道自己做错的事情的债务;还包括 是(在当时)做对了事情的债务,但只是现在看来是错误的。

我们的代码多大了?

我一直在浏览各种源代码:一些商业代码,一些开源代码。 跨多种语言(Java,C#,Ruby)。 通常,大多数代码库似乎遵循类似的模式:

您今天编写的代码行中的大约70%在12个月内仍将保持不变

也许不足为奇的是,代码在编写后的最初几个月中最经常更改。 此后,似乎进入了维护模式,其中代码更改相对很少。

图片

我发现这很令人惊讶:一年之后,我编写的代码中大约有75%仍然存在。 想象一下,我今天对这个问题的了解有多好。 想象一下那些可以被重构为今天使用的,被遗忘的设计思想,改变的体系结构,新的工具和库。 想象一下这些行中的每一行可能会有多好。 但是,即使在我们不断努力以偿还技术债务的代码库中,我们也几乎无法确定代码的年代。

怎么

我如何进行此分析? 由于git的强大功能,它非常简单。 我可以使用git对整个仓库执行递归git责任。 对于当前在头的每一行,它列出了引入它的提交,创建者和时间。 借助一些shell-fu,我们可以按天或月提取计数:

git ls-tree -r -rz --name-only HEAD -- | xargs -0 -n1 git blame -f HEAD | sed -e 's/^.* \([0-9]\{4\}-[0-9]\{2\}\)-[0-9]\{2\} .*$/\1/g' | sort | uniq -c

到今天为止,这会输出一个漂亮的代码行表,该行代码按月最后一次触及。 但是,我可以轻松地回顾历史,例如回到2015年初:

git checkout `git rev-list -n 1 --before="2015-01-01 00:00:00" master`

然后,我可以重新运行递归git怪。 通过比较每个月最后检查的行数,我可以看到2015年之前编写的代码今天仍然存在。 通过更详细的分析,我可以看到在给定月份中最后触摸的行数如何随时间变化,以查看代码衰减的速度(或没有!)。

结论

编写代码是为了达到某些目的,以提供一些业务价值。 但这很快就成为一种责任。 随着代码的老化和腐烂,它变得越来越难更改。 通过上面的分析,可以清楚地理解为什么已经存在了十年的代码库大多都是过时的:每年只对很少的旧代码进行更改,而在我们不断堆积的过程中,它只会不断地徘徊。将新的遗产放在首位-大部分仍将在明年出现。

我们该怎么办? 随着时间的流逝,它似乎只是软件的自然规律。 从我自己的经验来看,即使在重构方面做出协调一致的努力也几乎没有影响。 我们接下来干吗? 我们是否只接受随着源代码的老化而使更改变得越来越困难? 还是我们需要找到一种方法来鼓励软件具有较短的半衰期,以便尽快进行重写。

翻译自: https://www.javacodegeeks.com/2016/02/longevity-source-code.html

stl源代码stl源代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值