為什么祖?zhèn)鞔a被稱為「屎山」?這個(gè)回答簡(jiǎn)直太形象了
經(jīng)常聽說祖?zhèn)鞔a會(huì)被人稱之為「屎山」,不同人可能有不同的體會(huì),最近看到一個(gè)回答,簡(jiǎn)直是把這個(gè)闡述得“活靈活現(xiàn)”,大家來感受下吧。
閱讀本文大概需要 3 分鐘。
作者:Avalon
原文鏈接:https://www.zhihu.com/question/272065178/answer/1583717199
來源:知乎
說一個(gè)親身經(jīng)歷的一座「屎山」,曾入職一家成立 15 年的軟件公司,我當(dāng)時(shí)應(yīng)聘的是中級(jí)程序員,但在入職幾個(gè)月后,我的崗級(jí)和薪資調(diào)整到了高級(jí)程序員,這并不是因?yàn)槲以谶@幾個(gè)月中技術(shù)水平跨越式提升,而是因?yàn)檫@三個(gè)月中發(fā)生了以下事情:
前任組員一號(hào)和我完成交接之后跑路了!
前任組長(zhǎng)和新招來的組長(zhǎng)交接之后跑路了!
前任組員二號(hào)和新招來的初級(jí)程序員交接之后跑路了!
新任組長(zhǎng)和我交接之后跑路了!
新人組員(女)在工位掩面痛哭之后,換組了!(捂著臉掉眼淚不發(fā)出聲音的那種哭)
組內(nèi)人手嚴(yán)重不足,我白天解決生產(chǎn)bug,晚上寫新需求!
這是一座年輕的「屎山」,我是第三批接手者,歷時(shí)幾個(gè)月后我成了項(xiàng)目組中,資歷最老的員工!實(shí)習(xí)生和初級(jí)程序員寫出來的bug和低級(jí)錯(cuò)誤我就忍了,都是從菜鳥過來的,勉強(qiáng)可以理解。
但是框架因?yàn)椤案叱獭?、“架?gòu)組”、“大手子”等人的填填補(bǔ)補(bǔ),已經(jīng)到了嚴(yán)重影響用戶體驗(yàn)的程度!?。?/span>
For example!當(dāng)時(shí)項(xiàng)目的工作流很奇葩,不論出現(xiàn)什么錯(cuò)誤,都會(huì)統(tǒng)一提示“發(fā)生未知錯(cuò)誤”。哪怕我照著“公司祖?zhèn)骺蚣苁褂檬謨?cè)”,在配置中填寫「核算系統(tǒng)接口調(diào)用失敗」、「當(dāng)前時(shí)間不允許操作」等提示信息,客戶用的時(shí)候還是統(tǒng)一提示“發(fā)生未知錯(cuò)誤”!
起初因?yàn)檫\(yùn)維人員每天都在幫客戶解決這種問題,客戶倒是沒有多大的怨氣。某一天,因?yàn)楹軓?fù)雜的原因,客戶為了此事大發(fā)雷霆,我被要求解決這個(gè)問題。
在一頓忙碌之后,問題定位到了一個(gè)公司自己封裝的 jar 包,反編譯后發(fā)現(xiàn)里面的邏輯有問題。我就聯(lián)系外地的架構(gòu)組,讓他們給我一個(gè)新的 jar 包,第二天我收到了回復(fù):“這個(gè)框架很早就重構(gòu)了,公司新框架不兼容老框架,使用老框架的項(xiàng)目都交給項(xiàng)目組自己維護(hù)了,你們項(xiàng)目組的框架應(yīng)該是 xxx 在維護(hù)。”
xxx 是一個(gè)很陌生的名字,幾番打聽之后才知道,xxx 是我們組的第一任組長(zhǎng),離職兩年多了!我只能在 svn 上繼續(xù)摸索,愣是沒有找到 jar 包的源碼。幾經(jīng)波折之后才知道,svn 之前是幾個(gè)外包廠商共用的,后來因?yàn)橥獍鼜S商多了,就給每個(gè)廠商重新配置了一個(gè) svn,遷移的時(shí)候這個(gè) jar 包的源碼因?yàn)闆]有廠商認(rèn)領(lǐng),就被丟到了公用的 svn 上。
然而故事并沒有結(jié)束,從公用 svn 找到的源碼,和我通過反編譯出來的代碼,很多地方對(duì)不上!源碼里的注釋在我眼中都變成了「年輕人,千萬不要?jiǎng)舆@坨屎!」
最后我只能在工作流外面,又封裝了一套組件,專門用于代替工作流提示信息,并且留下了一行注釋「如果你不幸看到了這行注釋,不要怪我,我也不想的!」
以上只是「屎山」一角,「屎」是因?yàn)樽鎮(zhèn)鞔a里面有很多問題是真的臭,「山」是因?yàn)槭禾嗔?。最諷刺的是,你可能為了治理「屎山」,也在里面拉了幾次「屎」......
太形象了....
還有一個(gè)事,再說一個(gè)關(guān)于這座「屎山」的一角。
項(xiàng)目組負(fù)責(zé)的幾個(gè)系統(tǒng)中,有一個(gè)負(fù)責(zé)放款的系統(tǒng)(前置業(yè)務(wù)系統(tǒng),并不涉及記賬和轉(zhuǎn)款),放款是甲方爸爸非常核心的功能之一,上線之前肯定是重點(diǎn)測(cè)試的,所以我接手的時(shí)候已經(jīng)平穩(wěn)運(yùn)行了數(shù)年。接手之后也沒有出什么問題,整個(gè)放款業(yè)務(wù)也沒有什么新需求,我也就沒有深入研究,直到那一天......
背景是甲方爸爸接了個(gè)一個(gè)大單,但是因?yàn)榱刻?,其中幾筆合同的合同號(hào)錄差了,導(dǎo)致紙質(zhì)合同和線上合同對(duì)不上,甲方爸爸就找到了我們組的一個(gè)組員去做數(shù)據(jù)處理。處理了一下午,線上合同的合同號(hào)還是沒有變,組員來找我的時(shí)候已經(jīng)滿頭大汗,我心中隱隱猜到,又要踩屎了。
我發(fā)現(xiàn)組員按照數(shù)據(jù)庫文檔修改了合同號(hào),但是系統(tǒng)上還是顯示舊合同號(hào)。因?yàn)橐呀?jīng)踩了幾次屎,我就直接去翻代碼了。然后大量“中文拼音”命名的變量和無數(shù)意義不明的注釋,看的我太陽穴一跳一跳的。
原來生成電子合同功能跟我們想象的不太一樣,在完成放款操作時(shí)系統(tǒng)會(huì)生成一個(gè)以合同信息主鍵(36 位 UUID)命名的 PDF 存在本地,每一次點(diǎn)擊下載合同其實(shí)就是根據(jù)主鍵 ID 下載這個(gè)文件,所以數(shù)據(jù)庫里不論怎么修改對(duì)電子合同都沒有影響,當(dāng)時(shí)捋明白這個(gè)邏輯的時(shí)候我驚出了一身冷汗,但并不是因?yàn)檫@個(gè)設(shè)計(jì)多么的反人類......
前方高能?。?!前方高能?。?!前方高能?。。?/span>
前任運(yùn)維人員交接的時(shí)候,說放款系統(tǒng)上線一年沒啥問題,唯一要注意的就是因?yàn)榕c外部系統(tǒng)交互產(chǎn)生的交易文件很多,所以要定時(shí)清理,還當(dāng)著我的面,刪掉了一批日期比較早的文件。操作生產(chǎn)環(huán)境有指定的電腦,那臺(tái)電腦上看 pdf 文件是沒有后綴的,圖標(biāo)也是一張白紙,加上當(dāng)時(shí)在場(chǎng)的人也都沒有太在意,根本沒有發(fā)現(xiàn)這些“交易文件”不太對(duì)勁。
看著大概就長(zhǎng)下面這樣,誰也沒有好奇的去看看里面是什么。

所以新任運(yùn)維人員會(huì)定期去刪除老舊文件,也就是以前的電子合同?。?!
我當(dāng)時(shí)就給技術(shù)總監(jiān)和項(xiàng)目經(jīng)理打電話,三個(gè)大老爺們大半夜跑到單位附近的肯德基研究對(duì)策。好在數(shù)據(jù)都在數(shù)據(jù)庫里,技術(shù)總監(jiān)捅咕了幾天,寫出來個(gè)腳本把所有被刪的文件重新生成了一遍。但是服務(wù)器空間不夠又傳不上去,就跟甲方爸爸說電子合同這塊設(shè)計(jì)不夠完善(前任技術(shù)總監(jiān)背鍋),我們想要優(yōu)化一下,不要錢的那種。
“事故”塵埃落定之后,項(xiàng)目經(jīng)理想要追責(zé)卻發(fā)現(xiàn)這鍋只能他自己背,除了他全都是后來的......
在那個(gè)公司干了一年多,工資漲了三次,但我還是離職了,畢竟「屎」是真的難吃......當(dāng)我把項(xiàng)目交接出去的時(shí)候,我就想起我在項(xiàng)目里留下的注釋(屎),露出了和(幸)藹(災(zāi))親(樂)切(禍)的笑容。

