來源:陳梓瀚
一年一度的高中畢業生填簡歷的日子即將就要到了,又有很多人問計算機專業的事情。其實我從心底裡覺得,高考後才來問這個,已經完了一大半了。當然另一小半十分有前途的人可以在大學四年趕上來,不過估計他們還是要讀個研究生,才能把自己訓練成能用的碼農。
程式設計是一件很難的事情。當然我的意思跟那篇著名的《程式設計是一件很難的事情》不一樣。想把程式碼寫好,本來就是一件非常困難的事情。我大三的時候訓練一個大一的老鄉,就光是C++,長達四年後她還搞不清楚模板超程式設計究竟是什麼。而且還有C語言學會了轉C++會把壞習慣帶進來啦,C++的人轉做C#之後發現很多C++的好技巧到了C#都只會讓程式變得更慢啦,很多寫動態語言的人不理解型別的好處還在那裡胡扯啦,還有C#和javascript明明放著大好的函式式風格不用,非要把程式碼寫的超長(本來光是這樣沒什麼問題的,只是有某些人不肯學習新知識)。可見,就算把自己訓練了好多年,最終進入了工作崗位,想把程式碼寫好,也是一件非常困難的事情。
當然有些人說,如今只有產品做得好才能賺錢,程式碼寫的好有個屁用。這隻能是人各有志,有些人就不喜歡鑽研程式碼,這本來也沒什麼。但是這些人老是跳出來忽悠別人,也只會讓程式設計變得更難。只是幸好,我的單位並不會跟某些單位一樣說一些“把程式碼寫得那麼好有什麼用,搞到我們還非得學東西才能看你的程式碼,趕緊做點新feature啦”的這種話,我已經覺得很好了。
寫得好這個東西還是比較抽象。我認為其中一條就是程式碼要好維護。我一直以為,只有程式碼寫得好維護,好改,清晰易懂,這樣加新的功能才會容易,不出事情,順利釋出軟體。後來我發現我錯了,騰訊不也是QQ一版一版的發嗎,原來加班也是一種方法,啊哈哈哈。如果在一個單位裡面,不加班別人就會找你麻煩的話,我相信你也不會花心思把程式碼寫好的,反正都要加班。
不過對於志向就是寫程式碼的那一些人,最好還是不要受到這些外來資訊的干擾。最近跟我們組裡的一個test manager聊天,他是一個菲律賓人,說是從紙帶時代開始就寫程式碼了(不過看起來好年輕……),工作的時候還覺得C語言是一個嶄新的語言。後來他跟我說,如果一個人有志向與,程式碼一條路走到黑,最好就去學習一下怎麼當architect。他說道,Architect的知識架構是由各種pattern組成的,然後就說了自己年輕的時候的很多故事來作證這個道理。然後還講了微軟的其中一個創始人到現在還堅持一線寫程式碼的事情,不過沒告訴我是誰。
在這之前,剛好MSR的Daan Leijen因為來北京參加programming language相關的conference,就來我們這裡參觀了一下。後來我看他做過GUI,做過parser combinator,發明實現過語言,就前去搭訕,結果發現他讀書的時候的導師竟然是Erik Meijer。按照他的話說,“then we are connected”,如果說成中文,就是有緣分吧。接著就跟他討論了一些parser combinator和型別系統之類的東西。我說我之前也搞過這些東西,最後還貢獻了一部分給公司,換了個組之後還開了講座什麼的。他講到他讀書的時候,也是學校沒教自己自學的這些東西,後來周圍也沒什麼人做,但是並沒有讓他喪失動力。然後就說了一句話讓我印象很深刻:“原來你也做這些東西啊,我應該可以看到為什麼你要從產品組跳到MSRA來了。”他直到今天,頭髮都基本上掉光了,還在那裡繼續研究programming language的東西,還給了我幾篇論文。我覺得很好,人就該像他那樣。
有些時候,人就得有那個信念,才能把可行但是難度大的東西,也最終搞出來。我自己寫了11年的程式,其實並沒有接觸過十分廣泛的東西,因為很多時間都花在重寫我的一些idea上面了。譬如說編譯器就寫了五六個,GUI庫就寫了八遍,還有些雜七雜八的。不過從這個過程之中,可以明顯感覺到自己什麼時候比以前更進一步。這種signal有很多,譬如說當你決定要新增一個比較複雜的功能,也可以迅速知道怎麼做而不用動到架構啦;譬如說你覺得你的程式碼越來越順眼啦;譬如說你因為架構不行決定重寫的時候,你發現前一個版本的程式碼可以撿起來繼續用的部分越來越多啦。
寫到這裡,我想起很多人都問過我,程式要怎麼寫才能寫得好,或者說設計模式要怎麼寫,之類的問題。如果把學習程式設計花費的精神代價做標準的話,捷徑是沒有的。但是如果僅僅把時間作為標準的話,捷徑顯然是有的。怎樣才能加速你學習的過程呢?答案就是,先寫再看書。對於像編譯原理這種略微高深的知識,總要自己寫過幾遍,吃了一些苦頭,才能知道為什麼書裡非要把演算法那麼設計結構那麼安排。對於像設計模式這種需要大量經驗才可以領悟到的知識,如果你從來沒獨立寫過一個上萬行的程式,你覺得你能理解設計模式在講什麼嗎?我覺得這種時候能做的也就是背下來,理解什麼的都是扯淡。諸如此類,學習程式,如果要加速那個過程,肯定要花大量的時間寫程式碼。當你把專案做得越大、越複雜、演算法越扭曲、介面越華麗、尺寸已經大到你覺得不學習新的方法論就肯定會讓程式碼失控的時候,這個時候你來看設計模式的書,保證是每看到一個模式都覺得人家說到你心坎裡去了。那你不僅可以迅速理解,而且以後還可以不由自主的想起來使用它。
當然,如果你不是一個喜歡寫程式碼的人,那這個方法肯定沒有用,因為中途放棄什麼的太多了。這種時候,只能怪你沒緣分,設計模式不渡你了。如果你最後撐下來了,雖然你自己覺得你也花費了相當的努力,但是別人反正是看不到你的努力的,就會開始覺得你有捷徑了。為什麼呢?因為效率高啊,時間花得短啊。
光寫程式碼也是沒用的。同人於野一篇講成年人還能不能進步的部落格說得很好,知識分為舒適區,學習區和恐慌區。舒適區的意思就是,你很容易就可以做完。學習區的意思就是,你需要花費大量的智力才可以做完。恐慌區的意思就是,你根本不知道如何下手。當你在為了練習編寫大量的程式碼的時候,你要儘量把題目都安排在學習區這裡,這樣才能讓你進步快的同時,還不會被問題打倒,可以繼續積累成就感了。
學生做這個最方便了,工作之後,如果剛好遇上個黑心公司要你天天加班,你反而沒時間做學習區的內容了,公司給你的肯定是舒適區的苦力活。
說到這裡,如果你還有時間練習的話,千萬不要去想:“我每一個程式都要跨平臺”,“我只做這個語言”等等。反正將來,語言你都要會,平臺的差異你都要知道,為什麼要斷送自己瞭解這些東西的機會呢?你真的以為不知道垃圾收集的原理,和一些底層的可以通過C++的練習而得到的的操作,你真的可以在某些關鍵時刻操縱好C#嗎?當然有些人會覺得,我估計一輩子不會遇到這些問題的,所以我還是不管他了。人各有志嘛,C#不渡你,也是你自己的事情。如果你真的可以一輩子都在一個平臺上用一種語言做同一種程式做到退休,那真是幸福的生活啊。