之前在公眾號里有個讀者給我留言:
請教個問題,公司高職級和初中級,都是寫業(yè)務(wù)代碼,那么高職級的價值在哪里呢?
由于公眾號回復(fù)留言的限制,當(dāng)時我就簡單的回復(fù)了如下的幾個點:
- 初級多在寫代碼,高級多在設(shè)計代碼;
- 初級多在解決一個問題,高級多在解決一類問題;
- 初級多在考慮技術(shù)問題,高級還要參與業(yè)務(wù)上的需求;
- 初級工程師只管接需求,導(dǎo)致自己忙不過來,高級工程師會砍需求, 用自己得經(jīng)驗告訴產(chǎn)品這個需求不需要,告訴設(shè)計師這個交互沒必要;
- 初級工程師可能做完一個項目就完了,高級工程師可能會封裝幾個組件,整理一個腳手架出來。
還有很多很多,初級工程師和高級工程師差距不僅僅是代碼質(zhì)量上,而且其他能力上,解決問題的能力,抽象問題的能力!
今天有時間,想詳細(xì)的跟大家談?wù)勎宜龅降?、見到的厲害的程序員,同樣是寫業(yè)務(wù)代碼,為什么會比初級程序員拿的工資高?
初級多在寫代碼,高級多在設(shè)計代碼
一般人可能拿到需求,就開始寫代碼了,寫著寫著由于頁面功能越來越多,感覺代碼越來越復(fù)雜,自己都會覺得難以維護(hù)了。
我拿我自己舉個例子,之前有一次我寫完一個頁面之后,然后給另外一個同事(可以理解為高級程序員)讓他幫我 Review 代碼,看到我的代碼之后就覺得這個寫得不對呀,怎么會這么去設(shè)計呢?
然后他給我理了下整個頁面應(yīng)該如何去設(shè)計,一個頁面分為哪些塊,有哪些事件,每個事件應(yīng)該 dispatch 哪些 action,然后整個模塊有哪些數(shù)據(jù)放在 store 里,哪些模塊放在 state 里,當(dāng)時反正聽他理完之后,感覺自己寫的代碼真的很垃圾,然后花了兩天時間把上周寫的代碼重寫了一邊。
注意,這里是重寫,不是重構(gòu),重構(gòu)是對軟件內(nèi)部結(jié)構(gòu)的一種調(diào)轉(zhuǎn),目的是不改變軟件可觀察行為的前提下,提高其可理解性,降低其修改成本。那么如果保證不改變軟件可觀察行為呢?就需要寫測試用例,保證測試用例能跑通的情況下進(jìn)行重新構(gòu)造代碼才是重構(gòu)的第一步,沒有測試用例的重構(gòu)就是耍流氓。
那么如何提高設(shè)計代碼的能力呢?
我覺得有一個方法對于提高設(shè)計代碼的能力非常有幫助,那就是采用 TDD(測試驅(qū)動開發(fā))。
TDD 的原理是在開發(fā)功能代碼之前,先編寫單元測試用例代碼,測試代碼確定需要編寫什么產(chǎn)品代碼。 --來源百度百科
為什么 TDD 會提高設(shè)計代碼的能力呢?可以看到 TDD 的原理是要在寫代碼之前就要寫測試用例,在寫測試用例的時候你必然得去思考你的每個函數(shù),每個模塊,每個組件應(yīng)該如何去設(shè)計才能使得易于測試,往往易于測試的代碼都比較好維護(hù)。
這就可以達(dá)到在寫代碼之前先去設(shè)計代碼,然后才寫代碼,也就是先思考,后行動。
我只是說 TDD 可以提高設(shè)計代碼的能力,并沒有說我就特別提倡 TDD,說 TDD 很麻煩,難以實施的人就不要跟我討論了。
初級多在考慮技術(shù)問題,高級還要思考業(yè)務(wù)上的需求
我們要知道,技術(shù)是為業(yè)務(wù)服務(wù)的,沒有業(yè)務(wù)談技術(shù)的好壞都是瞎扯淡!
常??梢钥吹胶芏鄬嵙?xí)生,或者剛來的應(yīng)屆生會吐槽以前的老代碼用的框架老,用的技術(shù)舊,然后就去改成新的,自己覺得牛逼的,然后沒有多個環(huán)境測試,發(fā)上線就掛了,這種例子很多很多,別說我們公司,就連我們組都出現(xiàn)過好幾次這樣的情況了。
這種就是只考慮技術(shù)問題的,而沒有去考慮為什么以前前人要這么寫,前人沒有用這些東西,難道僅僅是因為那個時候沒有新東西,或者說認(rèn)為前人比你差。
很可能就是他們考慮到了業(yè)務(wù)上的需求,比如要兼容 IE、或者比如考慮到了有很多用戶用 iOS,Safari 不支持 webp ,或者比如考慮到很多用戶是低端機,性能不好,不能用一些新特性等等問題。
對于老板來說,他根本不管你用什么新技術(shù),新特性,也許你用了新特性確實讓代碼更簡潔了,但是,但是,但是,發(fā)到線上掛了,那么你寫的東西就是垃圾,連最基礎(chǔ)的穩(wěn)定性都保證不了,更別說流暢性,高并發(fā)。
初級工程師只管接需求,高級工程師會砍需求
經(jīng)常看到很多初級工程師就是,不管產(chǎn)品、運營甚至后端提出一些需求,他也很友好,只要是需求,他都接,然后整天忙忙碌碌,還經(jīng)常加班,但是實際上,很多需求做了沒有什么價值,也許還有些是重復(fù)工作,還把自己搞得很辛苦,這種情況真的很多很多。
然后還有一種情況是有一個產(chǎn)品需求來了,然后 balabala 一頓需求討論之后,產(chǎn)品給出一個期限,初級工程師滿打滿算,可能能完成,然后就說能行,結(jié)果要么對自己能力估算錯誤,要么很多突發(fā)情況,然后不能按時上線。
而高級工程師基本上不會出現(xiàn)不能按時上線的情況,我思考了幾點原因:
- 會給自己留 buffer,來避免突發(fā)情況導(dǎo)致時間的耽擱。
- 在需求分析的時候會思考每個需求是否有必要,如果有些需求覺得沒必要,會和產(chǎn)品討論,拿出充分的理由將需求砍掉。如果都有必要,然后時間又不太夠,會去和產(chǎn)品談是否能使交互簡單一下,一期先出個什么樣子,下一期再做完整一點。
- 對需求的評估以及自己能力的評估更準(zhǔn)確。
這里我想要表達(dá),不是所有的需求都是有必要的,不要每個需求都去接。
那么如果來判斷一個需求是否應(yīng)該接呢?
我覺得主要是去思考他背后的價值,為什么要做這個東西,做了能達(dá)到什么樣的效果,如果產(chǎn)品說不出來價值,或者說產(chǎn)生的價值與你花費的時間不匹配,那么這個需求就是有待商討的。
初級多在解決一個問題,高級多在解決一類問題
很多初級工程師可能昨晚一個項目就完了,還覺得很 OK 呀,然后也把在項目中的問題一個一個的解決了,按時按量的完成了任務(wù)。
對,這就是初級工程師的標(biāo)準(zhǔn),能完成一個項目。
那么對于高級工程師除了完成項目還會做什么呢?
也許會封裝幾個公用組件發(fā)到 npm 上大家都可以用。
也許會整理一個腳手架出來大家用,比如以前公司沒有用 TS,那么用 TS 寫完項目之后,踩了很多坑,你就可以整理出一個腳手架,然后把踩得坑記錄下來,方便后面想用 TS 的人用。
也許發(fā)現(xiàn)前端工程師還原 UI 搞是一件枯燥無味,而且沒有技術(shù)含量的事兒,我司有個大佬就寫了一個 UI2Code 的工具,可以將 Sketch 文件轉(zhuǎn)化為 html 代碼。
也許高級工程師發(fā)現(xiàn)一上線一個功能,小程序和 H5 都要寫一套一模一樣的,然后我司大佬就寫了一個可以將 vue 代碼轉(zhuǎn)換為小程序的框架,一套 vue 代碼,h5 和小程序都能用。
這些都是我身邊的例子,可以看到高級工程師經(jīng)常解決的不是一個問題,而是解決一類通用的問題,然后給出解決方案,并且得以實施,從來不會認(rèn)為吧項目做完了就完了,沒有一點產(chǎn)出,也許你做這個項目是對自己太大的幫助,成長的。
初級程序員經(jīng)常犯的錯誤集錦
然后我在知乎上看到了一個初級程序員經(jīng)常犯的錯誤集錦,我覺得非常大家都可以看看,自己有沒有這些毛病。
1 命名不規(guī)范
2 日志不規(guī)范
3 拒絕寫接口和假數(shù)據(jù)
4 不寫單元測試
5 盲目集成
6 邏輯不清
7 不做方案
8 不關(guān)注性能
9 害怕重構(gòu)
10 做出來就好,不考慮優(yōu)雅的方案
11 不考慮未來需求的變化
12 遇到問題的時候不會試錯
13 不會寫偽代碼
14 不做數(shù)據(jù)量的預(yù)估
15 提交代碼不規(guī)范
16 不喜歡打Tag
17 不遵守發(fā)布流程
18 不知道Bug修復(fù)的優(yōu)先級
19 總喜歡手動修改線上代碼
20 不做數(shù)據(jù)備份
21 不做自測
22 不盡力模仿真實數(shù)據(jù),測試數(shù)據(jù)很隨意
23 不抽取公共代碼
24 不認(rèn)真聽需求講解
25 不看驗收標(biāo)準(zhǔn)
26 不主動推進(jìn)項目進(jìn)度
27 遇到難題不主動反饋
作者:暗滅鏈接:https://www.zhihu.com/question/33578621/answer/451931102
總結(jié)
初級程序員主要是體現(xiàn)在目光短淺,缺乏思考,做完東西沒有成果,不積極主動。
而高級程序員不僅僅是代碼寫得好,寫得快,確實思考得更長遠(yuǎn),做的東西更有用。
我列舉我身邊所遇到的高級程序員所做的事,我覺得更有說服力,不是空談大道理,都是我從身邊的大佬們身上學(xué)到的,希望能給剛?cè)肼殘?,或者感覺自己是個初級程序員的程序員們一些警惕。
當(dāng)然,上面所說的高級工程師所擁有的優(yōu)點和初級工程師的缺點,都不是所有高級工程師都會有所有的這些優(yōu)點,也不是所有的初級工程師都具有這些缺點,這是沒辦法進(jìn)行定量的。
你們身邊還遇到什么高級工程師的特點,或者初級工程師的缺點,歡迎在評論區(qū)里面留言。
最后歡迎大家關(guān)注我的公眾號「前端桃園」