轉行軟體開發的通用學習路徑(轉自劉校長親筆)

FF1NN發表於2018-03-02
【序言】
哈!2015年到啦,我知道好些個朋友今天都許下心願、立下誓言:“從今天起好好學習
、天天向上,一定要以XXXX方面取得成功!”其中就不乏有朋友是打算在今年從某個“
坑”專業跳進軟體開發這個行業的,對吧?不過呀,您先別急——光有志願、不知道該
往哪兒使勁兒,到頭來又要被人笑話“無志之人常立志”了。作為一個在軟體行業打拼
了十多年、常年帶人轉行的人,我可以很負責任地告訴你:轉行軟體開發的drop率還是
非常高的——別老盯著那些轉行成功的光鮮帖子看,這跟做買賣一樣,做賠了的從來不
會出來聲張的。造成大家半路放棄的原因就是不知道正確的學習路徑。為了讓那些打算
今年轉行軟體開發的朋友能取得成功,今天我就把多年來積累下來的通用學習路徑給大
家說一下。乾貨百分百哦!
【正文】
那位朋友說了——你算老幾啊跟我們說這些。好吧,先介紹一下自己。我叫Timothy 
Liu,是國內三本農學學士,自學軟體開發,一路殺進微軟,在自己創業,run兩家公司
(離開微軟是因為某開掛民族實在沒質量文化、把微軟毀的不輕)。軟體寫了十多年,
因為生於教育世家,所以能把自己所會的東西清楚地講給大家,於是順便一直在搞教學
。寫過書,銷量不錯;出過視訊,YouTube上排名Top 1。如果你感
覺我有資格介紹怎麼自學,那麼請接著往下看,否則呢,新年快樂!您就不必浪費時間
啦:)
今天我們們說的就是轉軟體開發,至於計算機行業其它職位,您移步看我的另一篇文章《
計算機行業發展方向小全》。
軟體開發,說全了就是“使用程式語言和工具開發軟體”,能開發出來有價值的軟體,
那你就有工作,或者說有生產力、有被剝削的價值;寫不出來,那就只能噹噹愛好了。
自然,你能寫的越多、越快、質量越好、價值越高、別人越寫不出來,那你的薪水就越
高。
“使用程式語言和工具開發軟體”——軟體是什麼,我就不囉嗦了,重點就剩兩個了,
一個是程式語言,一個是程式設計工具。
【先說選語言】
先說選語言吧。一句話,程式語言那就是開啟軟體開發行業大門的鑰匙。什麼Java、C#
、Python、Ruby、C、C++,無非就是一大串鑰匙。很多初學的朋友會花很多時間“挑鑰
匙”,這個心理是可以理解的,因為怕選錯了語言學出來沒人要。於是呢,很多教人入
門的文章就在選語言方面大做文章,吹的五花八門兒。實際上呢,一大串鑰匙,你選一
把,先把門開啟,進門要緊啊!外面多冷啊。之所以不建議大家在選語言方面花很多時
間原因是語言都有自己的使用領域,語言之間的比較無非是以己之長攻人之短,大家怕
選錯,所以老盯著各門語言的缺點看了,結果是技術還沒學,先學了一堆自己都不知道
是在說什麼的“缺點”,自己把自己給嚇退了。我從來不擔心大家拿哪個語言入門,原
因有二:(1)現在靠單語言生存基本上已經是不可能了,幾個大語言,兩三五年內是
都需要會的;(2)能活下來的語言目前出現非常明顯的“趨同性”,也就是功能方面
“你有我有全都有”,你學會一門,再學一門的時候比較著學,很快。用教育學上的術
語來說就同知識的可遷移性越來越強。
要說真就一點兒也不選、拿起什麼學什麼,這也不是我想說的。怎麼著你也得選個比較
流行的、還沒死掉的語言吧。那選什麼呢?問Google吧,你搜programming language 
ranking,前排的幾個連結都有不錯的參考價值。
我個人是推薦Java、C#、Python的,有些有點基礎的同學抬槓,說C/C++能讓你瞭解底
層,應該從C/C++入門。如果你是CS專業的同學,我一定是推薦學習C/C++甚至是一些匯
編語言的,但對於自學程式設計、以找工作為目的的同學,我建議你先入了門,回頭再用C/
C++來紮實功底。簡單說,C/C++對於自學者來說,學習曲線太陡,學不出來。
【再說工具】
也不知誰先說的“高手開發軟體的時候都直接使記事本加編譯器”,我估計是看武俠看
多了。聽我說:沒那回事兒(極特殊、迫不得已的情況除外)!前面說了,程式是要有
價值的,現在有點兒價值的程式動不動也得幾千上萬行了,記事本根本應付不了。真正
工作時,你99.99%的時間是使用專門的開發工具在寫程式,這種專門工具就是“整合開
發環境”(Integrated Development Environment, IDE),之所以叫這個名字,是因
為它把程式碼編輯(像在記事本里寫程式就是編輯程式碼)、程式碼編譯(使用程式語言的編
譯器把你寫的文字程式碼編譯成計算機能執行的程式)、程式碼除錯(程式碼有錯的時候發現
錯誤在哪裡並進行修改)等多種功能整合在了一起。
每種語言都有市面上流行的IDE。比如Java,有IntelliJ IDEA、Eclipse、NetBeans;C
#是Visual Studio一家獨大,等等。初學者常掉進去一個坑就是,選了哪個大學的教材
,這個大學往往繫結自家的某個非生產性的IDE,結果你學不到什麼生產力,與Amazon
上賣的書也對不上號兒。
提醒大家一點,學使用IDE的時候,要留意使用快捷鍵,用的越熟越好。
【學語言】
選了語言和IDE,開學啦!
無論你選的哪門語言,前面說了,語言的趨同性越來越強,那麼按這個一個順序學,經
過轉行哥多年的教學實踐,是最快的:
(1)過一遍語言的所有關鍵字和操作符(2)語言都支援哪些資料型別,要重視資料類
型這個東西(3)這門語言是怎麼宣告變數和為變數賦值的(4)如何使用變數和操作符
組成表示式(5)如何拿表示式組成陳述式語句(6)分支/判斷語句和迴圈語句怎麼玩
兒,如何跳轉(7)這門語言的函式/方法怎麼寫、怎麼呼叫,特別要留意引數列表和返
回值。
前面是說的任何一門語言都支援的程式導向程式設計的部分。接下來該物件導向部分了。
(8)這門語言是如何聲名類的(9)類都有哪些成員(10)同一個類中方法的過載(11
)這門語言是否支援介面和抽象類(12)子類對父類的重寫,多型,面向介面程式設計(13
)物件導向設計的基本原理
最後,現在的語言多少都支援一點動態程式設計和函數語言程式設計,有餘力的同學可以瞭解下面
的知識
(14)這門語言有沒有Lambda表示式,怎麼玩兒(15)如何進行函數語言程式設計(16)是否
支援動態程式設計
【學習庫】
有些人希望自己寫的程式能被別人重用,這樣可以掙錢或者拉人氣;有人希望通過重用
別人的程式來節省自己的時間——有供有需,自然就有了很多可以被人重用的程式碼片斷
。這些程式碼片斷要麼是一些函式,要麼是一些類,聚整合一個“倉庫”後就有了函式庫
或者類庫。寫庫的人可以從中獲利,用庫的人自然獲利更多——因為不必再“重新發明
輪子”了。每種語言都有自己基本庫(語言廠商或者IDE廠商製造的),還有一些專門
靠寫庫掙錢的公司編寫的第三方庫。一句話:你會的庫越多,你寫程式就越輕鬆。比如
,現在客戶要一個“指紋加密資料夾”程式,你自己寫指紋識別的程式碼(暫且認為你能
寫出來)、自己寫加密演算法程式碼,最後整合成一個程式給客戶,你算了下時間,需要2
年完成;我買了一個指紋識別庫,又買了一個加密演算法庫,專心把它們拼成一個程式,
還有時間做個漂亮的介面,1個月交貨,要個合理的價錢,你說誰能生存下去?
【學習模式與框架】
哈,你也知道靠堆類庫掙錢了?那我告訴你,你堆著堆著程式就亂掉了,而我還可以繼
續往上堆!為什麼?因為我知道怎麼堆類庫程式才能大而不亂。這就是軟體的模式和框
架——類與類之間怎麼配合就是設計模式(design patterns),類庫與類庫之間怎麼
配合就是框架。不過呢,想學框架,前提是把類庫玩兒熟。那些類庫還沒玩兒幾個就吵
吵著“我要寫框架”的,只能送他兩個字——“太浮躁”。
【學習架構】
我一直說,現在是學習軟體開發的好年代。為什麼呢?因為優質的程式太少了。為什麼
寫程式的人那麼多,優質的程式那麼少呢?因為懂架構的人太少了。什麼是架構?舉個
例子:開始動手寫一個專案的時候,團隊把程式設計成了跑在一臺機器上的小程式,結
果突然有一天老闆給團隊配了20臺效能超強的機器說:“我要在原來1/20的時間內看到
結果”,團隊立馬傻眼——因為你程式一開始設計的目標就沒考慮這個,以至於它的架
構就是個“本田雅閣”,你現在要個“解放卡車”,我再怎麼改也改不出來。說實話,
寫程式的,誰沒糟蹋過幾個專案呀!誰又能沒被爛專案糟蹋過呀!為了不再遭受臭程式碼
的折磨,那就得把專案的架構或者說骨架搭好。但這個吧,已經超出轉行自學的範疇了
,因為如果你能學到這裡,你已經在軟體開發行業工作好幾年了:)
【學習心態】
說說學習心態吧,這是個軟實力,很多博士前博士後的,學習能力沒的說,栽就栽在心
態上了。簡單說:別把轉行想那麼難,也別把轉行想的太簡單。心態這事兒,自己在學
習中調整吧,每個人的條件的境遇都不同。
【學習技法】
就算知道了學習的路徑,還是有很多同學drop了。為啥呢?因為不會學習。我先說什麼
叫“會學習”:學軟體開發最大的特點就是——它是一門手藝活兒,所以要領就是多練
,學的知識要落實在程式碼上,程式碼要能默寫。
有這麼幾類人,有可能drop:(1)愛說的人,這類人學東西走嘴,不走心也不走腦,
是學給別人看的,學一點兒東西就等著別人表揚呢,結果大家都忙著學習呢,誰顧的上
表揚你呀,這類同學的drop率不是特別高,100%。(2)鑽牛角尖的,這類同學是遇到
問題後不搜尋,自己就用那點兒有限的知識瞎琢磨,浪費很多時間,學出來的東西還四
不像(3)過分強調基礎的,有些同學學從一個知識點能挖到很深的基礎上去,結果在
很深的、目前無關緊要的問題上浪費很多時間,該學的沒學會,動機是好的,但過猶不
及。提醒這樣的同學,你蓋的是“艾菲爾鐵塔”而不是“金字塔”,兩個雖然都是塔,
但要求不一樣——你的目的不是未來搞科研,所以沒必要蓋那麼結實,而且你也沒那麼
多時間。不過,也許這正是個好的跡象——你是真的喜歡這個行業,為什麼不考慮進入
大學深造,成為頂尖人才呢?(4)基礎不紮實就想學的太快。有些同學,問我一個高
級問題,我一看,初級的程式碼還有錯的,我就不知道他是怎麼開始學這些高階內容的。
這類同學,我只能很惋惜地說:“親,從頭再來吧”。這類同學的drop率也不高,100%
。(5)不主動動手解決問題的,這類同學無論是遇到看不懂的書、做不出的題,還是
程式出錯,絕對不會自己動手去搜尋,要麼是四處貼程式碼、尋找人肉debugger,要麼是
等著別人來幫忙,如果沒人幫忙,那就放棄。這類同學的drop率,呵呵,自己猜!
【尾聲】
足足寫了三個小時,希望對大家有幫助。如果你看了感覺有用,麻煩轉載的時候註明出
處和作者。
雖然我是搞軟體開發培訓的,但我還是鼓勵大家自學——聽起來有點兒矛盾是吧?原因
是,如果能自學成功的同學,那麼你來我這裡培訓也差不多能成功,那就別浪費錢了。
我的培訓是用來幫助那些自學起來有困難的朋友的。
當然了,培訓的另一大用處就是極大地縮短學習時間(道理有點兒像使用類庫),同時
獲得業界的經驗。在幫助大家節省時間方面,我還是非常有自信的。如果自學需要一年
的話,我能幫你縮短到半年左右:)
如果大家對我的培訓感興趣,請移步http://www.waspec.org/courses瞭解更多資訊。
另外,如果遇到哪裡轉載了我的文章,麻煩大家告知我一聲,謝謝!

相關文章