以下內容節選自《碼農翻身》,我對這些內容深有感觸,因此整理出來推薦給年輕的程序員們看看,希望激發大家去看看原書的興趣,從而在IT技術道路上精進。
順便說一下:此書80%的內容,還是在講IT技術的(用講故事的形式、淺顯易懂),適合架構師以下級別。
凡事必先騎上虎背
有人問我,說他所在的是一家中小型公司,開發團隊有十來個人、七八條槍,做行業軟件,現在公司沒有技術經理,只有一個懂業務的總監來管理所有開發人員,而且開發人員都是初級水平,大部分只有一兩年經驗,相比而言,他還算老人。總監認可他的技術,似乎有意讓他做技術經理,最近公司招人也讓他去面試。
但是他不太自信,覺得表達能力不行,有些技術還比較薄弱,領導布置的功能可以做出來,但是說原理就有可能卡売。我告訴他,這正好是一次機會,是最好的學習時機,有了問題的引導,你會瘋狂地學習,迅速地提升自己。
我想起了2009年看過的一本書《陳寅恪與傅斯年》,里面形容傅斯年的性格是“凡事必先騎上虎背”,這句話我一直印象深刻。
對于我這樣一個性格內向的程序員來說,我在遇到機會,猶豫不決、縮手的時候總會想起這句話,然后鼓起勇氣先騎上虎背,讓自己下不來臺再說,但是真的盡自己最大力以后就會發現,事情沒那么難,最后還都把事情完成了。
作為一個擅長和機器打交道的群體,大部分程序員的性格都比較內向、沉默。別看在網上、在O群里談突風生、幽默有趣,斗斗得不亦樂乎,但是回現實中,面對一群“真人”的時候,連準確地表達自己的觀點可能都做不到,更不用說去柔中帶剛、唇槍舌劍地去爭搶某個東西了。
程序員大多實誠、謹小慎微,很多事情不敢也不會去努力爭取,完全靠自己的能力吃飯。這樣很吃虧,因為你的能力無法完全體現,在工作中只能表現出一部分,比如10分的能力只能顯露出7分,剩下的3分可能就被埋沒了。
對于ー個內向的人來說,害怕失敗,害伯被別人說自己不夠格,所以總想把自己修煉得盡善盡美,在達到基至遠遠超過那個職位的要求以后心里オ會踏實,才會想著領導會看到,讓自己去負責那項工作。可是反過來講,世上哪兒有等你完全準備好以后才開始做的事情?你覺得完全準備好以后,黃花菜都涼了。
IBM每年害期都有一項叫作“藍色之路”的實習生計劃,招聘學生到公司實習,在這項計劃中有四五個被稱為 Extreme Blue(青出于藍)的項目,面向的是優秀的大學實習生。這個 Extreme Blue項目是由IBM的員工提出有創新的、有商業價值的想法,由這些優秀的學生去實現。
作者在2008年提出了一個想法:在一個3D虛擬世界中構建一個支持數捷軟件開發的環境,有幸被選中作為 Extreme Blue項目之ー。當時我對散捷軟件開發還算了解,但是對于在3D虛擬世界中建模、編程一無所知。可是已然騎上虎背,下不來了,接下來馬上要帶著實習生來實現,怎么辦?只剩華山一條路,明知山有虎,偏向虎山行。那就是逼著自己趕緊進入未知領域,拼命地去學,像海綿一樣吸收各種知識。幾個月以后,我們確實把這個項目做出來了。
舉這個例子就是想說:對于性格內向的程序員,很多時候你認為基本準備好了其實就夠了,凡事必先騎上虎,勇敢地邁出去,努力地爭取一下,你就會發現自己登上了更高層的臺階。
一名架構師的總結
我和很多人交流過一個有趣的現象:那就是從剛畢業到30歲這段時間,會覺得時間過得很慢,總覺得自己還很年輕;但是一旦過了30歲,時間就如白駒過,一年又一年飛逝而過。我自己也是,眼看著畢業快15年了,15年間從一個剛畢業的菜鳥成長為技術骨干,做到架構師的職位,回頭看看,編程雖然枯燥辛苦,但是如果真的感興趣,就能體會到其中的樂趣。
好奇心
劉慈欣在《朝聞道》中描繪過這樣一個情節:在古老的非洲大陸上,有一個原始人無意間抬頭仰望星空,凝視的時間稍微長了一些,超過了外星人設置的國值,立刻拉響了人類即將產生文明的警報。因為外星人認為,人類已經產生了對宇宙的好奇心。有了好奇心,文明的產生、科技的發展不過是一瞬間的事情。
確實是這樣的,好奇心驅動人類不斷向前,在短短的幾千年(相對于長達幾十萬年的原始時代)里就登上了月球,并且努力向其他行星拓展。
對于程序員來說也是如此,如果你看到新技術、新產品沒有像小孩看到新玩具那樣兩眼放光,沒有立刻在自己的電腦上試試的沖動,你就需要仔細考慮一下是否真的對軟件開發有興。如果根本沒興趣,那不要浪費時間,還是趁早轉行,有更多話合你的職業在等著你。
沒有好奇心,就不愿意追本溯源,追求技術的本質。
沒有好奇心,就難以靜下心來,耐得住寂寞,遠離浮躁,更難以跨過這個行業所帶來的種種挑戰。
沒有好奇心,就不愿意學習新技術。一名架構師,如果沒有對技術的敏感度和前性,直抱著一套技術架構不變,估計很快就會被海汰。
當然,自制力強大的人除外。但話說回來,靠著自制力讓自己做自己不喜歡的事情不非常痛苦?
在一堂關于領導力的培訓課上,老師一直在說 Passion(激情)、Passion、 Passion。但我直覺得,沒有好奇心,沒有興趙,怎么會產生 Passion呢?所以,對技術的好奇心、興趣是一切的基礎。
抽象的能力
抽象思考的能力怎么強調都不為過。
現實的需求紛繁復雜,如果架構師不能把這些亂無頭緒的需求抽象成一些“概念”,在概念的層次進行思考,那么系統根本就無法設計。
我認為,把紛雜的事物抽象到數學層面是最高的抽象。也許有人會說哲學層面才是,但到數學層面已經非常難了。
我在之前的公司有率遇到一次,把針對稅務領域的 Credit, Debit s等概念抽象為在一個二維坐標下點的運動,問題一下子簡化了很多,實現簡單,并且非常安全可靠。
但是抽象成數學模型和算法通常是可遇而不可求的,在這種情況下,我們需要退而求其次,試圖抽象成若干個正交的概念,以此來降低復雜度。
“正交”在數學上指的是線性無關,最常見的例子就是坐標系下的x軸和y軸。對于一個點來講,它的x值的變化不會影響到y,y值的變化不會影響到x,即x和y是正交的。
正交的威力在于互不影響、擴展方便。單用一個x軸可以表示一條直線上的所有點;再加一個y軸就能表示平面上的所有點;再加一個z軸,三維空間中的所有點都能表示出來。
人類的大腦在思考問題的時候是有容量限制的,難以同時駕馭太多復雜的概念。如果我們的軟件系統也能做成x、y、z坐標這樣,就帶來了無與倫比的好處。你在處理與x軸相關的事情時,不用考慮與y軸和z軸相關的事情,因為你知道它們不會受到影響。這樣問題的復雜度就從三維一下子下降到一維,更容易把握了。
抽象能力的訓練沒有捷徑,就是經驗的積累,勤于思考和學習。例如學習 Java Web:開發的可以思考一下為什么 Spring有 Controller、ViewResolver這樣的概念?學習 Android的可以思考一下 Android是怎么對未知的、紛緊復雜的應用程序進行抽象的?為什么會有Maven、Git、Nginx、Hadoop這些產品呢?
開始寫作吧
我時常會有這樣的感覺:自己心里黨得對一個技術點已經掌握了,但是當我試圖給別人講述的時候,發現并不能輕松自如、深入淺出地講出來。
這就說明了一個問題:自認為掌握了,其實并沒有真正掌握,大腦只是對這個技術點建立了一個整體的概念,在一些細節處做了想當然的假設,等到你用語言再來表達的時候就會發現,原來這個假設井不完全成立,是有問題的。
估計大家都有這樣的經驗:如果你能把一門技術通俗易懂地給別人講明白,那就說明你已經掌握了。這種“轉教別人”( Teach others)的辦法屬于主動學習,效率是最高的。但是在工作和生活當中,你是很少有機會去給別人講授的。
那怎么辦?總不能拉著你正忙著的同事說:“哥們兒,來,我別學了 Java CAS,我給你講講吧。”也許你的同事很有禮貌,耐著性子聽你地講完了,然后不知所云。前幾次還行、次數多了,就對你敬而遠之了。既然沒法給別人講,那就退而求其次吧,把自己的理解寫出來。
當然不是泛泛地記流水賬,或者把幾個孤立的點羅列在那里,而是要把思路厘清楚,尤其要寫出為什么要有這門技術、這門技術解決了什么問題,然后才是這門技術是怎么使用的。
當你逼著自己去回答這些問題的時候,很快就會發現,自己的理解還不夠,還需要查找更多的資料。在你從網上查找資料的時候,你會發現,網上的這些文章怎么這么差勁,重復的內容這么多,大部分都是復制、粘貼的,大部分都在講述怎么使用,對于“為什么”從來都是只字不提,或者猶抱琵琶半遮面,羞羞答答地不說出來。
這個整理資料和思考的過程是很珍貴的,只有這樣才能把信息變成你自身的知識。如果實在搞不定,就帶著問題去論壇提問,去QQ群發言,找大牛請教,總是可以解決的。
有人可能要問了:我也可以按照這個思路去學習,為什么要寫下來呢?原因很簡單:不寫出來,很容易放棄深度思考。
我們已經進入了一個碎片化的時代,我們的大腦已經養成了碎片化的習慣。寫作會逼著你去深度思考,梳理知識體系。