對程序員的一些個人建議


作者:鄭暉

答讀者問

以下內容摘自冒號論壇的一個話題,考慮其具有一定的典型性,故轉至冒號空間,希望能對更多的讀者有所幫助,也算是一種代碼重用吧。

 

讀者Jee問:

之前在Top language裏的一位網友像我推薦您的《冒號課堂》,書中eric向您建議開設社區,我猜測可能會有,就找到您的博客發現此地,很幸運您是一個如此有責任心的作者。

我是一名沒有什麼理論基礎的不合格的計算機專業畢業生,畢業後卻對軟件方面技術非常感興趣,可能與個性有關。於是在這近2年的找工作和工作過程中看了一些書,也和一些過來人聊過,總體來說讓我對軟件編程有了一點認識。在閱讀您的冒號課堂之前,我曾一度認爲我所差的是經驗和一些諸如高級算法之類的進階技術, 可現在,一個用了一個多月時間的夜晚閱讀《冒號課堂》之後的我發現我所差的不僅僅是那些,而是最基礎最根本的對計算機本身的認識,對數學的認識,對軟件工程的認識。

我不想能有速成一說,只想能夠現在正視自己,腳踏實地的一點一點的學習和進步,哪怕讓我自學4年大學課程也未嘗不可,只是有些時候有點找不到一個開始。我數學不好,作爲一名程序員我想這是個令人沮喪的事實,我英語也不好,當看到蹩腳的一些翻譯著作後痛苦不已。我想嘗試着去改變這些,但是卻不知該如何去做, 您知道,作爲一名已經進入社會的成年人,我需要承受一些生存的壓力和一些生活的負擔,我希望能更好的利用每天那抽出來的時間,所以望鄭暉老師能給我指出一條明道。

我一直沒有說我從事的語言和方向,因爲我知道這並不是核心,也不是想從您這得到如何學習XX語言等。萬分打擾,還望見諒。

 

作者hui答:

你提到的問題十分典型,我非常理解你的心情,同時也非常樂意分享一些個人的看法。

雖然你在言語之中流露出不少負面的情緒,但我看到的卻是正面的希望。首先,你對軟件技術很感興趣,而興趣是學習和工作的最大動力。一般說來,我也沒興趣回答那些對編程不感興趣者的有關編程的問題。一方面,我會勸他們改行,否則彼此都痛苦;另一方面,我建議的方法通常也不適合他們。其次,你很清楚地意識到自己在哪些方面不足,這是一切進步的基礎。許多程序員意識不到自己的無知,甚至自以爲足夠有知,那又如何能進步呢?最後,你不指望任何捷徑,願意通過踏踏實實的學習來彌補不足。在浮躁之風盛行的當下,這點也是難能可貴的。

關於數學基礎,竊以爲並非什麼太大的問題。幾乎每個得知我數學背景的人都會對我說:哦,學數學的人來學計算機自然容易啦。事實上,這種觀點雖然極爲普遍,但也極爲膚淺。本人從事數學14年(從本科算起)、從事計算機12年(與前者有部分重合),在這一點上還是比較有發言權的。事先說明,以下提到的數學不包括高中數學。其實大多數從事軟件開發的人員用不到太多的數學知識,他們只需要正常的邏輯思維能力和抽象思維能力。整天拿數學說事,要麼是無知,要麼是找藉口,要麼是裝高深。當然,我不否認一些高級算法、計算機理論以及人工智能等領域可能涉及到高深的數學知識(其實也只是圖論、組合數學、數論、概率論、計算幾何、抽象代數、數學邏輯等中的一小部分),但那畢竟只是少數。我也不否認自己的數學背景有助於對編程的理解,但投入產出比太低,不值得作爲經驗來推廣。不過若想成爲一位計算機科學家,那就另作別論了——這時數學懂得再多也會嫌少的。

    倒是英語我希望你更重視些。我在《冒號課堂》中專門提過閱讀原著的必要性,而且你也意識到譯著的質量問題。建議不必特地去學習英語(你本來就會了,不是嗎?),只要堅持讀經典原著即可。其實,計算機方面的英文算是很容易的了,關鍵是克服自己的慣性和惰性。開始可能不習慣,看多了就習慣了。在此提醒一點,在閱讀時請有意識地培養自己對英語的語感,就像編程時要有意識地培養自己對編程語言的語感一樣。

總之,對於程序員來說,數學沒有人們認爲的那麼重要,英語沒有人們認爲的那麼不重要。

再說說專業方面的問題。你提到願意重新自學大學課程,雖精神可嘉,但未必可取。從軟件(或建築)設計的觀點來看,這是bottom-up法。作爲學生,最好採用這種方法,但你已經參加工作了,所以我建議你更多地採用top-down法。這當然不是輕視基礎知識,而是認爲獲取知識最高效的方法莫過於按需(on demand)學習。在實際工作中意識到某個知識點的重要性,從而有針對性地彌補短板,這樣學習起來不僅更有效率,也更有興味。需要強調的是,絕不能只是 “頭痛醫頭”,而要“拔蘿蔔帶出泥”。只有尋根究底、以點帶面,才能快速有效地建立起自己的知識結構體系。對於軟件開發這類實踐性很強的專業來說,該法尤其奏效。

話又說回來,這種項目驅動式的學習方法也是有一定侷限的。畢竟大多項目涉及的深度和廣度通常都很有限,單純憑此建立起來的知識體系不可能非常完善。這就需要平時有計劃地閱讀一些經典著作以加強深度,並定期瀏覽一些高質量的技術網站以加強廣度。

以上談的都是一些較爲宏觀的建議,我想你需要的是更加具體的建議。《冒號課堂》上已經闡述了不少關於編程語言、編程範式、設計原則方面的觀點,此處不復贅言。我想特別強調一點——把握抽象(abstraction)。事實上,無論是在書中還是本論壇中,我都不厭其煩地再三提到抽象的重要性,今後有時間還會深入地挖掘這一主題。對編程的語言、範式、設計、實現體會得越深,對抽象體會得也越深。借用Hakell的設計者之一Paul Hudak的一句略帶誇張的話(overstatement):“abstraction, abstraction, abstraction” are the three most important things in programming。一定會有人會問:難道編程語言就不重要了嗎?設計模式就不重要了嗎?算法設計就不重要了嗎?那是他們尚未真正理解何爲抽象——抽象不僅滲透在編程範式之中,也滲透在編程語言之中;不僅反映在設計原則之中,也反映在設計模式之中;不僅體現在架構設計之中,也體現在算法設計之中。

說來也怪,明明是想提“具體”建議的,偏偏又扯出了“抽象”,大概不是你想要的答案吧?既然你是計算機專業畢業的,又有一定的工作經驗,其實也不需要太過具體的建議。你的苦惱是找不到努力的方向,而這個方向恐怕還是得靠自己去尋找。建議試試兩種方法:研讀一本有趣的名著或開發一個有趣的應用。只要深入其中,相信絕不會再爲找不到方向而發愁,說不定倒會爲方向太多而發愁呢。

最後,說句更實際點的話:如果平時能有意識地積累一些計算機以外的領域知識(domain knowledge),比如金融、電信、教育、企業管理等等,對提高個人在IT業的核心競爭力也是大有裨益的。當然,前提是你有興趣或有條件獲得這些知識。

一家之言,希望能對你有所幫助。

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/bvbook/archive/2010/06/11/5664267.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章