Skip to main content

接手了屎一样的代码 怎么办?

 


1、

今天刷知乎看到一个这个话题


Image


回答这个问题前,先来看一个真实的故事,它每天在你身边发生。

一个哥们撸码时忽然怒气冲天,大声质问这TM谁写的代码,这么明显的bug都能出,还不写注释,当时项目组的码农们都心惊胆战,不敢说话,害怕把自己揪出来示众。

项目经理听到发话了:XX,你查一下SVN记录,查出来全公司通报,扣他年终奖。

这哥们:我已经在查了....

过了几分钟......
这哥们:不可能吧,这怎么可能呢?

大家都凑了过去,发现这段代码是这哥们一年前自己提交的。

为了避免过度尴尬,大家都没再提这个事情。

回到问题,是的,都是一堆臭shit,不做记号的话,还真分不出来是不是自己拉的。

看到这个,北妈突然就想起来,我这么多年是怎么在前人的各种屎山里艰苦爬行,而且我还给别人搭建了不止N座大小屎山。嘿嘿

有句话,说的非常好:祖传代码就像一座很大的屎山,你见过的最大的山,每次你想修正一个bug,你的工作就是爬到屎山的正中心去!

关于“代码屎山”这个国内外都无解的神奇话题,俗称N年前的代码和技术栈,无比庞大和冗余,如今看起来像屎一样,但你又毫无办法。

2、
驾驭屎山的唯一方法,不是重构,而是不重构

为什么有人可以在屎山里加功能?

很简单:把屎山扒拉开,每块闻一闻,找出和你要改的功能对应的那坨屎,把这坨屎套个塑料袋(封装),你就可以假装塑料袋里不是屎,是巧克力。然后,在旁边拉一泡新的屎,等它风干成型(测试通过)就可以收工了。

当然,怎样优雅地在一座屎山里闪转腾挪,做到“百屎丛中过,片屎不沾身”,还是需要很多经验和技巧的。

不过说白了,臭也只臭你程序员一个,老板还觉得你很狼性,客户还觉得真香。

很多愣头青觉得自己是天才,可以把屎山重构了。他们中的大部分人引发了屎崩,永远埋在了几千米高的屎山之下。

极少数人在泥屎流的洗礼中活了下来,浴屎重生。他们真的做到了,他们真的重构了整座屎山!

重构之后的那个东西,被后人称为——

屎山2.0。

3、
当一个系统复杂度增加的时候,它的熵也会增加,这是宇宙规律。而有洁癖的码农,他们非要强行降低这个复杂的熵——不是做不到,但需要巨大的能量,也就是成本。

你想让谁来付这个成本?老板还是客户?

屎山不是一天拉成的。每一代屎山的建设者,都是非常聪明的人。他们非常清楚继续堆高屎山,未来将产生的代价。

他们理性中立客观地评估了推翻屎山重建的成本,然后做出了一个充满智慧的决定:

在屎山上继续拉屎。

这个决定对于每一个人都是最优解,因为每一个人只需要对他当下的目标负责。

每一次“继续拉屎”的决定都是正确的,不这样做才令人匪夷所思。如果重构屎山,客户很生气,因为交付时间更长了,还会冒出许多以前没有的bug。

老板很生气,因为成本大增,而客户毫无多付钱的意思。就连重构屎山的人自己也很生气:天天钻在屎山里996,搞得浑身屎味,工资却一分钱没涨。

屎山不择细流故能成。屎山代码就这样一天天长大,终于令最后接手的码农感叹:高山仰止,景行行止。

其实,屎山,是任何复杂系统的终极归宿。

4、
就连微软、谷歌、Oracle这样的大公司,他们的产品也都是屎山。

chromium浏览器的源码有十几个G,虽然是开源的,但没有人敢在如此险峻的屎峰上提交自己微不足道的屎坷垃,高处不胜寒。

至于微软,呵呵……从win8到win11,10年了,控制面板还是有两种口味:一种是古早味的,一种是苹果味的。office从2016到2021,5年了,不拿放大镜都看不出有什么区别。

这段话可能会让你误以为,微软、谷歌都是垃圾。但实际上,他们肯定是地球上最强的软件公司。

世界上最高的屎山,都是最聪明的屁股拉出来的。换了一般的程序员,屎山还没垒出一个小屎包,就屎崩了,就这点水平还天天嚷嚷着要重构屎山。

乔布斯曾说:死亡是最好的创新。

所有代码的最终归宿都是坟墓,而绝大多数代码早已死无葬身之地。屎山是不可能重构的,这辈子都不可能重构的。

打败屎山的唯一方法,唯有另起炉灶,建一座新的屎山。这就是为什么在巨头们巍峨连绵的屎山脚下,总能有新的小屎包崛起。

当然,对于血气方刚的少年,我知道,你很可能觉得我在扯淡,屎山有什么好怕的,重构就是了。

当年我比你还血气,还刚,但如今我也在给后人不停的堆高屎山。

无论你使用何种语言,师从什么流派,哪怕23种设计模式样样精通,最终还是会踏上前往屎山的道路。因为,条条大路通屎山。

明知山有屎,偏向屎山行。来,壮士,干了这碗屎,我绝不会拦着你。
------

每日金句:“心情不好的时候,不想说话,不想社交,你不妨试一试随便找一辆公交车,围着城市兜一圈,看看人间疾苦,或许就好了”


Comments

Popular posts from this blog

CKA Simulator Kubernetes 1.22

  https://killer.sh Pre Setup Once you've gained access to your terminal it might be wise to spend ~1 minute to setup your environment. You could set these: alias k = kubectl                         # will already be pre-configured export do = "--dry-run=client -o yaml"     # k get pod x $do export now = "--force --grace-period 0"   # k delete pod x $now Vim To make vim use 2 spaces for a tab edit ~/.vimrc to contain: set tabstop=2 set expandtab set shiftwidth=2 More setup suggestions are in the tips section .     Question 1 | Contexts Task weight: 1%   You have access to multiple clusters from your main terminal through kubectl contexts. Write all those context names into /opt/course/1/contexts . Next write a command to display the current context into /opt/course/1/context_default_kubectl.sh , the command should use kubectl . Finally write a second command doing the same thing into /opt/course/1/context_default_no_kubectl.sh , but without the use of k

OWASP Top 10 Threats and Mitigations Exam - Single Select

Last updated 4 Aug 11 Course Title: OWASP Top 10 Threats and Mitigation Exam Questions - Single Select 1) Which of the following consequences is most likely to occur due to an injection attack? Spoofing Cross-site request forgery Denial of service   Correct Insecure direct object references 2) Your application is created using a language that does not support a clear distinction between code and data. Which vulnerability is most likely to occur in your application? Injection   Correct Insecure direct object references Failure to restrict URL access Insufficient transport layer protection 3) Which of the following scenarios is most likely to cause an injection attack? Unvalidated input is embedded in an instruction stream.   Correct Unvalidated input can be distinguished from valid instructions. A Web application does not validate a client’s access to a resource. A Web action performs an operation on behalf of the user without checking a shared sec