不知道你有沒有過這樣的經(jīng)歷:剛剛進入職場時,進入公司實習妖混,沒多久就發(fā)現(xiàn),為什么公司的技術也這么爛啊轮洋,啪啪啪制市,隨意就能指出十幾個問題來。
我們當初四十幾個同學大四集體去北京找實習單位弊予,當時學校把我們集體安排住在一棟排屋里面祥楣,我們工作之后下班經(jīng)常坐在一起閑聊,聊的最多就是吐槽自己的公司代碼很爛汉柒,當然也包括進入BAT公司的同學误褪。
一、為什么我公司的技術這么“爛”碾褂?
五年過去了兽间,當我最次回想當年的閑聊時,狂笑當年的我們Too Young Too Naive正塌。
你只看到了爛的表面嘀略,而背后的邏輯和原因思考過沒?大學里學到的所有典型的策略乓诽、算法帜羊、邏輯,在職場里鸠天,只是最基本的一些東西讼育,甚至可能是已經(jīng)被顛覆的東西,比如數(shù)據(jù)結構里強調的第三范式在高并發(fā)場景中早就被摒棄了稠集,也就是你即便在課程里得到了滿分窥淆,你來到職場,依然可能是菜鳥一名巍杈。因為你所面臨的場景、業(yè)務環(huán)境扛伍、需求變更的頻次筷畦,和你在學校里學到的完全不同。
那么是不是說你就不能發(fā)現(xiàn)職場的問題呢刺洒?當然不是鳖宾!我們先來說說職場上所謂技術問題是哪些原因造成的。
1逆航、年代久遠鼎文,菜鳥的產(chǎn)品
巨頭也是從初創(chuàng)公司起步的,在起步之初因俐,可能技術實力也不是很好拇惋,而且我們知道信息技術成長性很快周偎,現(xiàn)在我們司空見慣的一些東西在十年前還屬于無人知曉的黑科技,在這種情況下撑帖,一個持續(xù)運營的公司蓉坎,多少會有一些歷史上很粗糙和菜鳥的代碼,并且可能部分仍在運營胡嘿,這是正常的蛉艾。
那么為什么會仍在運營呢?說明這個東西雖然不夠好衷敌,不夠正確勿侯,但是一直沒有出大的問題,沒有給系統(tǒng)添太多麻煩缴罗。所以助琐,雖然這個東西不好,但是基于以業(yè)務為核心的訴求瞒爬,企業(yè)技術部門并不是特別有解決的意愿和動力弓柱。
2、需求迭代的產(chǎn)物
和教科書不同侧但,職場上的需求是瞬息萬變的矢空,一些初入職場的人會覺得公司需求經(jīng)常改,要求 經(jīng)常變禀横,無法接受屁药,覺得是不規(guī)范、不健康的表現(xiàn)柏锄。 15年前酿箭,乃至20年前,我們說印度軟件業(yè) 最為發(fā)達趾娃,其開發(fā)流程最為規(guī)范缭嫡,當時很多中國企業(yè)去印度,學開發(fā)規(guī)范抬闷,覺得印度在 IT方面 遠遠領先中國妇蛀。但是發(fā)展到今天,在互聯(lián)網(wǎng)大潮中笤成,請問哪個互聯(lián)網(wǎng)公司還會去印度取經(jīng)學習 開發(fā)流程和規(guī)范评架?請問誰還會說印度比中國在互聯(lián)網(wǎng)研發(fā)領域領先?問題在哪里呢炕泳,中國互聯(lián)網(wǎng)產(chǎn)業(yè)之所以發(fā)展快就在于沒有包袱纵诞,敢想敢干,隨需應變培遵。傳統(tǒng)軟件工程領域里浙芙,印度可以 作為定制開發(fā)的楷模登刺,強調需求確認,強調定稿茁裙,但是這種模式在互聯(lián)網(wǎng)時代是自尋死路塘砸,你 必須能隨時跟著需求走,跟著時代的潮流前進晤锥。在互聯(lián)網(wǎng)行業(yè)掉蔬,很多開發(fā)往往是沒有明確的邊界條件,也沒有明確的需求確認矾瘾。
所以女轿, 對于一個產(chǎn)品,最初設計的目標是A壕翩,但是開發(fā)過程中突然發(fā)現(xiàn)B才是真正的目標蛉迹,而好不容易把開發(fā)一半的目標A的系統(tǒng)轉為目標B,上線之后又發(fā)現(xiàn)需要兼容C和D的目標放妈。所以北救,新人不了解這個背景,這個迭代的歷史芜抒,就會覺得珍策,這系統(tǒng)誰設計的,邏輯怎么都是擰著的宅倒?沒辦法攘宙,小步快跑,不斷試錯拐迁,不斷調整蹭劈,快速迭代,就是這樣過來的线召。
3铺韧、所謂的正確的架構,存在著你所不知道的坑
就好比前面說的第三范式缓淹,新人一看祟蚀,數(shù)據(jù)結構各種冗余,你怎么不會第三范式啊割卖,大學課程啊,因為他不知道涉及分布患雏、涉及負載均衡的時候鹏溯,這個第三范式無法滿足快速擴展的需求。所以很多時候淹仑,教科書上的一些范例丙挽、方法肺孵,并不適應新的業(yè)務需求和應用場景,而此時颜阐,就會被只讀過教科書的孩子們認為是平窘,代碼太爛,技術太遜凳怨。
4瑰艘、技術演進中的印跡
一個多年運營的系統(tǒng),在演進的過程中肤舞,會存在大量不同的參與者紫新,每個參與者都會有自己的邏輯、想法李剖,以及處理的方式芒率。那么在代碼迭代中,技術的迭代往往是優(yōu)先考慮最緊迫的任務篙顺,優(yōu)化最耗費資源的模塊偶芍,在不斷迭代中,代碼的一致性和結構的一致性可能就無法維持德玫,導致一些本來架構優(yōu)美的結構可能只剩下兩三個模塊匪蟀,但是新人就覺得,這模塊做得好復雜化焕,好啰嗦萄窜,很多沒意義的東西塞在里面。請相信我撒桨,再優(yōu)美的技術結構查刻,經(jīng)過幾茬這樣的迭代,都會變得面目全非凤类,雜亂無章穗泵。然后等待下一個神做整體的重構。
5谜疤、側重點不同的考量問題
比如說佃延,新人發(fā)現(xiàn)一個報表系統(tǒng)效率很低,耗時很長夷磕,于是嘲笑履肃,連索引都不會嗎,這么爛的結構怎么設計的坐桩?但是他不知道的是尺棋,這個數(shù)據(jù)結構首先要滿足一個非常巨量的每日數(shù)據(jù)新增,而后才要滿足每周一次的報表生成绵跷。那么膘螟,如果按照他認為生成報表的優(yōu)美結構來設計成福,所增加的索引和數(shù)據(jù)字段的設計,就會日常帶來大量的i/o開銷荆残,數(shù)據(jù)新增的邏輯就會導致額外幾倍十幾倍的開銷奴艾,也就是說需要很多臺額外的服務器來支撐,而收效卻是内斯,可以每周生成報表的時候從幾十分鐘縮短到幾秒鐘蕴潦,那么如果你是老板,你會同意這樣的方案嗎嘿期?
6品擎、資源緊缺的作品
大公司也會資源緊缺嗎?至少人力資源一直是緊缺的备徐,比如有個緊急的活動萄传,有個緊急的任務,時間特別緊蜜猾,程序員只好急急忙忙從第三方開源軟件抓了一段代碼秀菱,改改塞進去了,反正業(yè)務滿足了蹭睡,至于不好那也實現(xiàn)沒時間了衍菱,結果這個臨時活動效果還不錯,于是慢慢成為常態(tài)活動肩豁,而這個工程師又去干別的去了脊串,這個代碼反正也沒出錯,那就一直跑著清钥。新人來一看琼锋,這啥玩意啊,代碼東一榔頭西一棒槌祟昭,這程序員不會設計系統(tǒng)嗎缕坎?
二、我應該怎么樣解決這些爛代碼篡悟?
你要明白谜叹,哪些是真的問題,哪些是你涉世不深的誤會搬葬,不要只是站出來喊荷腊,這些垃圾那些垃圾,這只能暴露你的淺薄和無知急凰。
那么停局,新人就不能提出現(xiàn)有系統(tǒng)的問題嗎?就不能提出改進的方案和建議嗎?當然可以董栽!但是,這需要有一個正確的認識和思路在前面企孩。
1锭碳、盡可能更完整地了解系統(tǒng),查看一套代碼的時候勿璃,了解所謂的不好的起因是什么擒抛,歷史演進的過程是什么,了解其在業(yè)務系統(tǒng)中的地位和價值是什么补疑,有了一些認識和理解后歧沪,再來思考所謂好和不好的問題。
2莲组、從一個最有把握诊胞,結構最簡單的地方入手,用你認為正確的方式修改一個最小的結構锹杈,先通過測試撵孤、分布的流程,然后再通過運維和其他主管人員獲得反饋竭望,了解改進是否具備對舊版本的比較優(yōu)勢邪码,以及比較優(yōu)勢究竟有多大,多重要咬清。不重要沒關系闭专,但是你要了解是否這個改進是正確的;完成第一個后旧烧,努力去完成第二個影钉,當你能夠順利分布完成十個或更多的這樣的改進和優(yōu)化,并確認你的代碼比較優(yōu)勢確實明顯的時候粪滤,再來吐槽別人的代碼的問題斧拍。
3、如果你這些都做到了杖小,你可能就不屑于吐槽別人的爛代碼啦肆汹,因為你會把它們當作一個個小怪獸。
三予权、一些說明
最近在讀曹大的《你憑什么做好互聯(lián)網(wǎng)》這本書昂勉,書中很多內容寫出了我初入職場時的心態(tài)和做法,這些曾經(jīng)經(jīng)歷過的事不吐不快扫腺,本文內容基于書上的做了一些修改岗照。
謝謝你的閱讀,愿初入職場的你少點吐槽,多了解點真相攒至。愿曾經(jīng)也吐槽過的你厚者,和我一起一笑而過。