作為程序員的你是在什麼時候「突然開竅」的?

作為初學/自學者,我發現學習編程的唯一途徑真的就是只有不停的敲,照著書一行行的敲沒有太大幫助,完全練習,就像是上學時候每課後的練習題自己嘗試著去完成的幫助最大,初期階段的編程概念都不難懂,哪怕是OOP神馬的,最關鍵的就是看書時候都明白,合上書兩眼一抹黑,連個最簡單的東西都自己敲不出來,這是我的切身體會,畢竟編程不同於學習文史哲,自己在腦袋裡面的理解和自己能否做出來是兩回事,文科老師常說的『理解並與自己的語言表達出來』完全不適用於編程的學習,因為編譯器可是眼裡容不得點沙的。

正如Learn x the hard way作者Zed A. Shaw所說的『Keep trying and eventually it"ll be easier and fun.』

想了解下各位在學校里是編程專業或者自學成才的各位,你是在什麼時候發現『突然開竅』,『邁過了那道檻』的呢?是在某天完成學校布置作業的時候?或者是鼓搗自己的小項目或者工作後?

另外借問題想請大家推薦幾本帶有很多很多練習以及詳細解答的Python或者Ruby學習書籍,感謝!


我是生物專業學生,學計算機基本靠自學和熱情,說說我幾個重要的階段和體會:

1.本科畢業後的暑假中用Flash寫出了Windows自帶的紙牌遊戲,因為之前在網上看到過上海貝爾實驗室的人也用Flash寫了這個遊戲,這讓我自信心非常爆棚了一下,同時感覺到在編程中抽象、整理出簡單規則非常重要。

2.04年還是05年的時候看了英文版的《Code Complete 2nd》,這本書竟然讓我盯著電腦看了一個月,它深深的吸引了我,也改變了我的編程習慣,更重要的是讓我知道了自己的實力,畢業後生物不好找工作,果斷改行計算機。工作後又看過兩遍這本書,每次都有很大的收穫。

3.在Flash開發圈裡一直比較流行PureMVC等MVC框架,我也用過,感覺有點問題,比如僵化思維,可維護性較差,脫離Flash原生介面等方面,但是在人云亦云的背景下,我還是不敢確信這個東西不好,反倒有點認為是否是自己在抗拒這個東西,沒有深入了解它,09年在盛大的時候參加了中科院謝老師的架構師培訓,說到了框架到底是什麼東西的問題後,豁然開朗。非常確信PureMVC是不能稱之為一個「框架」,是有問題的,因為框架不能脫離業務,而PureMVC就是設計為「百搭」型的。

4.09年在盛大比較閑,但是自己的閱讀和思考沒有停止,閱讀了大量的代碼和書籍,想如何更好的實踐OOP編程,發現其實很多代碼在實踐方面並沒有很好的表現,相對於教科書。同時也回頭看看自己寫過的代碼,反省自己的具體實踐,給自己設定了一個規則,寫代碼時一個類的行數不超過400行,一個函數不超過20行,一旦超過的時候就想盡辦法去優化、重構它。並堅持實踐,結果是代碼可讀性,正確性,可測試性方面顯著改善,並且代碼在OOP實踐方面好很多,代碼自然而然的更符合OOP的一些範式了。


高一的時候,我為了寫一個RPG,花了8個月,一共一萬多行代碼才把他搞定。這對於只會寫面向過程代碼的我是一個巨大的挑戰,後來我就明白了設計模式和各種計算模型的重要性。


帶著一個團隊,完成了個兩年的項目,然後才覺得有點開竅了。


我是做web開發的,有兩個開竅的時候

  • 一是從大學時候就在想MVC各層的職責到底是什麼?為什麼這麼劃分?有什麼好處?實際代碼該怎麼寫?

    然後很多年之後接觸到了rails,突然好像這些個問題都想清楚了,當然那時得到的答案現在看來還很幼稚,但是確實是後續深入思考的「起始頓悟點」

  • 二是在剛工作的時候,某一天老大跟我們吹牛時候,提到說曾經「扒開」JVM的虛擬機內部,看到90%的工作都是在處理字元串。

    後來針對這句話想了很久,然後突然間覺得自己明白了web開發的「本質」,然後以前很多很模糊的問題都想清楚了,並且在日後的工作中,這個我所領悟的「本質」對我幫助非常大,很多問題往「本質」上一靠,答案很輕鬆地就浮現了


  • 貫串從機器底層到高層應用代碼的——抽象;

  • 學過C、C++、Java後再接觸schema的時候——什麼是程序;

  • 在看到「Linus:利用二級指針刪除單向鏈表」的時候——什麼是指針;

  • UNIX——less is more;

  • 從塞班到iOS——什麼是產品;

……(想起來再補充)


說一個我自己的經歷吧......

大三的時候我修讀一門人工智慧的課程,期末的時候是做一個人機博弈的對戰程序。當時人太白,遇到問題第一個反應就是跑去上網搜,結果一無所獲。後來,又在圖書館挖到N年前的舊書,上面倒是有那麼一個範例。但是我還是不滿意。一氣之下,先把理論知識搞明白了(那些什麼A*演算法,剪枝演算法等等),然後又看了一堆源碼,最後扔掉手頭的所有資料,認真在電腦寫程序。從零開始,最後居然被我倒騰出了一個難看的命令行界面的五子棋出來。後來,把演算法移植到圖形界面上,馬馬虎虎能工作了。我猛然發現扔掉東西寫程序是如此有意思。

總結:

雖然看書學代碼是必須的,但是如果你把書本扔掉,仔細寫一段你想寫的代碼,收穫會比看完一本書還多。所以,要想再有開竅的機會,多多寫自己的代碼吧。


php開發而言, 是在看完 opencart 源碼之後, 對 網站開發, 豁然開朗


我做了100到ACM題後,喜歡上了這樣一個領域,後來的幾次參觀別人公司的機會更讓我喜歡上了計算機,然後偶然的機會接觸了linux,愛不釋手啊,哈哈


從vb轉學c之後


a = 1;

b = 2;

a = b; /*當我明白這句是啥意思的時候,我便開竅了...*/


套用別人的話:當你寫代碼和寫作一樣,語言的規則(語法)根本是不經大腦就能揮灑文字,文章有條理有思路。那就算開竅了。還有寫演算法邏輯嚴謹實現巧妙,而且學習新語言很快,解決問題能力強,那你就算開竅再開竅了。


沒開竅,反而在考上程序員之後10年左右閉竅了。

之前寫代碼的時候洋洋洒洒上千行,一蹴而就。

後來發現寫出的代碼總覺的有一堆問題,可以反覆優化,反而寫不出代碼了。

非常痛苦,都不想從事這個工作了。

再後來就不寫代碼了。

最近慢慢找回寫代碼的樂趣了,不過現在是票友,非職業選手。


每次學習一門新的語言的時候,前期都會有很多壓力,因為語法啥的都不熟悉,之後如果一直試圖熟悉下去會有一段煩躁期,那段時間真是出了一點小的事情都有想砸電腦的衝動(學OB-C時,我的MACBOOK已經被砸了幾次了……),等這段煩躁期一過,猛然間,關於這門語言的一切都非常明了了,這應該算是開竅了吧。


第一次見scheme,驚為天人,知道了抽象層次高的好處


讀完sicp前三章之後


這是情況是應該會發生的。但一般會在遇到問題,並思考之後。我覺得我完全對編程開竅,並能夠使用OO思想以及FP的想法,了解所謂的設計模式,大約是在從事開發工作3年之後。


照著別人的代碼抄了一遍,邊抄邊手工整理縮進,然後突然發現靈感,加了幾個功能,於是就學會寫代碼了。


自學了10年程序,之前怎麼寫代碼,看代碼,都沒有很大的成就。

後來有一天,我突然明白程序代碼的寫法和邏輯根本不是完美的。

很多參數,函數都是因對之前設計不完美而誕生的。

很多的調用方法也是不得已而添加的,甚至有很多個人意識。

我就領悟了,從此功力大進。

你要明白,程序本來就是逐步發展過來的。

如果現在重新推翻計算機系統並重新設計,會比現在使用的簡單的多

所以,學好程序,關鍵是寫的時候不要想太多,先貫徹你自己的想法去實現,最後來調整結構


大概是在準備技術面試的時候,那時以前不太明白地,現在就都知道啦。


當你把近10萬行的項目重寫3遍,基本就開竅了


推薦閱讀:

為什麼C++語法這麼複雜?
程序員都是怎麼記代碼和編程語言的?
樹莓派為什麼採用python語言為主要開發語言?
Rust 火了會怎樣?

TAG:程序員 | 編程語言 | 編程 |