華為資深工程師:碼農(nóng)很多,但程序員并不多......
春節(jié)假期,與幾位友人小聚,大家互道工作順利、平安健康云云......
期間一位馳騁商界多年的老友問:“你現(xiàn)在在華為做什么工作呀?”我很驕傲地說:”系統(tǒng)架構(gòu)師“,可是他卻愣了很久。
但當(dāng)我老婆在旁邊補(bǔ)上一句“碼農(nóng)“時,老友瞬間秒懂,卻把我受傷的心孤獨地留在風(fēng)中凌亂。
作為與 UNIX 同年代的人,我當(dāng)初選擇計算機(jī)專業(yè)僅僅是因為抓到什么就學(xué)什么罷了。
本科畢業(yè)遇到互聯(lián)網(wǎng)危機(jī),便沒有想法地去讀了研,研究生畢業(yè)找工作,面試官問為什么要做軟件開發(fā)。
答曰:“不給錢都喜歡做的事情,何況還給錢”,從此便踏入了編碼這一行,只是從來沒想到一做就是十幾年。
但凡一件事情做久了,無論成功與否,都會有一些真切的體驗和心得。以前也讀過一些工作中如何成功、快樂,諸如馬洛斯理論之類的文章。
也許是因為自己領(lǐng)悟能力比較差,唯一的收獲是慶幸自己當(dāng)初選擇了編碼作為自己的工作,因為編碼天生就具有讓人愉悅的工作內(nèi)容和工作氛圍,快樂如影隨從。
編碼世界:規(guī)則簡單有效,粗暴卻***
從事編碼,可以鍛煉邏輯思維能力,教會你如何思考。就像學(xué)習(xí)法律一樣,學(xué)法律的人未必都是為了成為律師,但法律教會了你一種思維方式。
同樣的,通過編碼可以學(xué)習(xí)到這個世界上最嚴(yán)謹(jǐn)?shù)乃季S方法。因為在編碼的世界里,對錯是簡單甚至絕對的。
只要敲下鍵盤,計算機(jī)就會判定孰是孰非,0 或 1,規(guī)則簡單有效,粗暴卻***。
從事編碼,可以獲得持續(xù)的創(chuàng)造力。跟寫作、繪畫、作曲一樣,編碼也是一種創(chuàng)造性的工作。
只要有一臺計算機(jī),掌握了基本技能后,你便擁有了***的超能,便能隨心所欲地創(chuàng)造出新的東西,豐富和美好這個世界,是不是很棒?
更酷的是,編碼可以品味孤獨。除了跟別人交流、學(xué)習(xí),程序員大部分時間都是獨自在工作,只要雙手觸摸到鍵盤,內(nèi)心頃刻便會變的寧靜,多酷呀!
伴隨著鍵盤清脆的低吟,沉浸在一個人的世界里,跟煙雨蒙蒙天,一杯茶,一個人聽著淅淅瀝瀝的雨聲品味孤獨,簡直有異曲同工之妙,多感性呀!
能夠選擇編碼作為工作的人,大部分都是喜歡為人處世簡簡單單的人:這群人有著天真爛漫的好奇心,雖不茍言笑,但卻內(nèi)心火熱,善于分享,樂于助人,甚至有時為了解決問題、寧愿不眠不休,卻深以為樂……
跟這樣一群簡單純粹的人在一起,我覺得世界上***的工作氛圍,也不過如此。
程序員的三個境界
但 IT 時代的膨脹已經(jīng)讓編碼工作如同文藝復(fù)興時的印刷匠一樣,編碼門檻越來越低。
例如,遍地《一周XX速成》、《20天XX精通》,仿佛會寫代碼就成了程序員,這讓很多人認(rèn)為從事編碼工作就是碼農(nóng)。
其實,印刷匠很多,成為大師的不多;碼農(nóng)很多,但程序員并不多。程序員不是碼農(nóng),碼農(nóng)也不是真正的程序員。
程序員在英文里對應(yīng)有三個單詞:Coder、Programmer 和 Software Engineer。
我覺得這三個詞,生動形象地描述了程序員所需要經(jīng)歷的三個階段,或者說三個境界:
- Coder。只要求能夠熟練使用編程環(huán)境,精通幾種編程語言、開發(fā)框架和開發(fā)庫,擅長寫代碼就可以了。這個階段的程序員能夠按照既定的設(shè)計完成編碼。
- Programmer。要求在 Coder 的基礎(chǔ)之上,精通設(shè)計模式、算法實現(xiàn)和編碼技巧,并具備熟練應(yīng)用的能力,這個階段的程序員能夠獨立編碼解決現(xiàn)實問題。
- Software Engineer:要求在掌握業(yè)務(wù)知識的前提下,理解為什么這么實現(xiàn),在綜合考慮架構(gòu)實現(xiàn),權(quán)衡開發(fā)成本后,為解決業(yè)務(wù)問題提出***方案,并能與業(yè)務(wù)人員順暢溝通,讓業(yè)務(wù)人員理解方案。
編碼工作達(dá)到這個階段,才能稱得上是真正的程序員,才真正實現(xiàn)了從工作到職業(yè)的轉(zhuǎn)變。
不可否認(rèn),這個世界上有一些天才的程序員,他們喝著咖啡,哼著歌,便完成了上面三個階段的修煉。但絕大部分人,都需要為此付出巨大的時間和精力。
能否成為職業(yè)的程序員,影響因素和方法論很多,各種學(xué)習(xí)類、技術(shù)類的總結(jié)遍地都是:主動思考、及時總結(jié)、制定規(guī)劃等。但我認(rèn)為其中最重要的是能否做到專注。
許多沒有達(dá)到第三個階段的程序員,就是因為受到各種因素誘惑,變得心猿意馬,不夠?qū)Wⅰ?/p>
因為不夠?qū)W?,他們不在意做好自己本職工作,不在意錘煉自己的技能,不在意學(xué)習(xí)新興的技術(shù)。
慢慢的,他們會認(rèn)為從事編碼沒有出路,進(jìn)而毫無例外地把編程看成是體力勞動,只會粘貼拷貝代碼,知其然而不知其所以然,導(dǎo)致技術(shù)停滯不前。
在這樣的狀態(tài)下工作 5 年、10 年,對于他們來說,沒什么區(qū)別,程序員真的就是吃青春飯的碼農(nóng)。
程序員 VS 碼農(nóng):我們不一樣
要避免程序員變成碼農(nóng)要做到如下幾點:
- 必須對編碼保持熱情,并持續(xù)學(xué)習(xí)。
- 必須保持好奇心,樂于探求事物本質(zhì)。
- 必須對所做的工作及時總結(jié),主動優(yōu)化代碼,讓系統(tǒng)變得更加有機(jī)。
- 必須主動嘗試更好的開發(fā)方式、更先進(jìn)的工具,來提升開發(fā)效率,并想辦法避免重復(fù)性的工作。
- 必須不斷改進(jìn)設(shè)計,將編程變成創(chuàng)造性的工作。
只要通過這樣逐步地積累經(jīng)驗和長時間錘煉,知識體系才能構(gòu)建完備和豐富,才能避免淪落為碼農(nóng)。
幾年前,我曾經(jīng)重構(gòu)過一個模塊,從外部看模塊所在的系統(tǒng),都是類似這樣的,簡潔而漂亮:
但從程序員編碼實現(xiàn)的層面看,它實際上是這樣的:
這個設(shè)計在最初的版本沒有任何問題,使用繼承擴(kuò)展管理對象的接口能力,但僅僅過了兩個版本,項目組 PL 說實在撐不下去了。
增加一個接口,需要修改 200 多個地方,如果再過一個版本,估計要修改 400 多個地方了。
后來我把它改成這個樣子,使用聚合消除了耦合:
從代碼實現(xiàn)層面看,在功能剛開始開發(fā)時,這兩個設(shè)計區(qū)別不是很大。
但隨著系統(tǒng)演進(jìn)、越來越多的功能加入,繼承關(guān)系帶來的耦合會導(dǎo)致模塊之間關(guān)系越來越復(fù)雜。
牽一發(fā)而動全身,終究有一天哪怕只做很小的改動,也將成為壓死駱駝的***一根稻草。
這次重構(gòu)的成果是代碼量由 43K 減少到 15K,擴(kuò)展新的接口能力不再需要修改已有代碼。我想,這或許就體現(xiàn)了碼農(nóng)和程序員的區(qū)別吧。
CT 是一個業(yè)務(wù)復(fù)雜度極高的行業(yè),要想從碼農(nóng)成長為程序員,需要經(jīng)歷更多的煎熬,需要發(fā)揮更多的創(chuàng)造力,同時也意味著,我們比以往任何時候都需要越來越多的碼農(nóng)成長為程序員。
既然我們選擇了編碼作為職業(yè),注定會經(jīng)歷各種心劫:枯燥、沮喪、迷茫,甚至浮躁……
然而無論處于哪種心境當(dāng)中,我相信,只要想起自己曾經(jīng)滿懷驚奇、興奮與真誠敲下的那個程序——“Hello,World!”我們就會充滿了渴望和力量,因為那是程序員最初的夢想:改變世界。