不把C作為第一門語言是個好主意麼?

edithfang發表於2014-07-02



近來連續看到這樣兩個資訊,一個是知乎上有個問題叫:如何學習C語言?,這個問題的答案中得票數第二高的是不要最先學習C語言;一個是看到了2012年金旭亮老師寫的第一門程式語言選誰?這文章,金老師也是支援不用C做第一門語言的,從投票來看大部分人也比較支援這個觀點。

這是比較讓我意外的事情,因為我正好持相反的觀點。

語言學習的兩種道路

我們有兩條路來學習程式設計,一條是厚積薄發,一條則是速成的道路。厚積薄發要一點點打根基,比如學習C語言、學習計算機系統的構造,去看《計算機程式的構造與解釋》這類書,去學習演算法等,這麼走有點吃力不討好,吭哧半天也還不一定能看到什麼結果;速成的就可以先學習IDE,先學習指令碼,先學習CSS,JavaScript,這樣沒多久就可以獨立幹不少活了,比如建立個漂亮網站什麼的。

這種不同道路的選擇最終決定了C是不是更適合做第一門語言。走前一條路的顯然就適合用C做第一門語言,因為不掌握這種系統級的語言就不太好理解什麼是指標,什麼Stack,什麼是Stack Overflow,什麼是寫超界,對打基礎形成不良影響,也理解不了《深入理解計算機系統》這樣的書。走後一條道路的就沒關係了,哪個實用學哪個。

想知道適合走哪條道路,請先拷問自己!

初學者到底適合選擇哪個方向?首先我們必須承認沒有哪種方法是適合所有人的,舉個例子來形象地說明這一點:松鼠桂魚是蘇州這邊的名菜,但對於不喜歡甜食的人來說,這道菜很糟糕。

因此我不想在技術上展開太多,這更主要是個人成長的現實問題,從怎麼做更有利於實現自己的價值(包括現金價值)來探討可能更有現實意義一點。所以要想回答要不要從C開始,最好先回答下面這樣的問題:

1.你是不是想專職做程式設計師,把它作為自己未來的職業?
2.你是不是想成為比較傑出的程式設計師獲得更好的成長和收入?

上面這類問題的關鍵在於,如果你一直做程式設計師而不是做做就幹別的去(比如管理、銷售等等),那麼就要有專業,專業才能更好的創造價值,而專業需要一種高度,高度則需要基礎和積累。我們很難講不學C語言就成不了很專業的高手,但你可以看看身邊,很多高手就是打了基礎一點點磨練出來。

這麼說也許有點抽象,我們來看看具體的故事:
2012年的時候Facebook花10億美元買下了照片共享應用公司Instagram。這事在當時引起了非常大的轟動。這事之所以引起極大關注,其關鍵點在於後者只有十幾個員工。十幾個員工支撐起10億美元的價值,這絕對是讓人震驚的事情。
做個簡單的比較就可以知道這個差距有多大。
假設一個公司是做外包的,非常厲害,人月單價有4萬RMB。同時這個公司包括支援人員在內有500人,公司裡每個人都可以換成收入,那麼這個公司一年的收入大概是4000萬美元,而Instagram用十幾個人達成10億美元價值只用了差不多2年。兩家公司中,單人一年創造價值的比率是差不多500萬倍。
這是怎麼樣的一種槓桿率差異!大家可以想象都是寫程式,這兩種槓桿率回報上的差異。

這種槓桿率背後隱含了這樣一種基本現實:基於很多現有的框架,小而精的團隊已經可以通過產品撬動極大的生意,這並不僅侷限於Instagram。而為了打造這種小而精的團隊,大家在聽一些分享時就會發現:很多人都有意願找ACM上成績比較好的人,他們認為這類人更有以一當十的可能性等。

從這類現象中我們可以挖掘出來什麼東西?
  • 第一點,如果把程式設計師進行分級,一個極端是能做很高階的活,比如以小而精的團隊打造很牛的產品;一個極端是隻能做CRUD的活,那收入與這種技能等級正相關是無疑問的,槓桿率在那裡。
  • 第二,做很高階的工作可以並不只侷限於打造產品,也可以去弄系統底層等等,但總的來看,越往高階走對基礎要求越高,這裡的基礎範圍可以廣點:可以是演算法,可以是對體系結構的理解等。沒有這類基礎工作時,就很容易被卡在一些地方乾瞪眼,不知道如何下手解決有點難度的問題,而事實上當你試圖建立一個新產品的時候,必然會碰到獨屬於你自己的問題
要想成為名好程式設計師 學習C語言是非常必要的

在《程式設計師生存定律》裡,我寫過一篇文章叫:程式人生的出口。其中列舉了程式設計師最可能的結局,比如:
1 成就超一流高手 
簡單來講就是繼續以程式設計師的身份進行奮鬥成為牛人。
2 積累、爆發、開始創業
簡單來講就是自己做產品,努力當CxO去。
3 轉向管理之路
大多情形下是拋棄程式,內部轉行去喊口號。
4 維持原狀的老碼農
就是在CRUD這個層面打轉那種。
5 提前退場、向程式碼說再見
眼看前途渺茫,轉行了。
這其中1對基礎要求很高,2與3對打基礎比較無所謂,這時候技術很像一種敲門磚,而4與5很可能正是忽視了基礎的結果。

這樣一來事情就非常清楚,如果你真想長時間做程式設計師,並且想比較好的實現自己的人生價值(包括現金價值),那麼打基礎是很必要的,再進一步就是說從C語言開始學習程式設計其實是很必要的。

從C語言開始學習程式設計對大學生的另外重意義

從C語言開始學習程式設計對大學生而言還有另一重含義:除了大學的時間,你可能再也沒有大段的時間打基礎。容易的東西是可以用碎片時間學的,比如各種指令碼語言,但難的東西是需要大片時間學的,所以一旦大學裡不把硬骨頭啃掉,未來很可能就沒時間啃了,說回來還是要先打基礎再談其它。

歷史上趙匡胤曾經猶豫過是先搞定比較羸弱的南唐還是先搞定幽雲十六州,最終他選擇了先易後難去搞南唐,從結果來看這是錯了,你不趁自己最巔峰的時刻搞定最難搞的,未來可能就再沒機會了,而羸弱其實一直會弱在那裡,早搞晚搞差別不大。

當然我們也必須承認即使努力的去打基礎,也不是每個人向上走,都能成為高手、成為特別牛的程式設計師,還是有人會卡在某條線下面,要去維護垃圾程式碼、寫垃圾程式碼,但關鍵是我們談的是在學習階段應該怎麼做,不爭一爭就放棄某種可能性,還是太可惜了。

此外,對於大學生或者那些有充足時間學習的人,我不太認可一種方式可以培養興趣,另一種就不能培養興趣的說法。這更多的可能是種藉口,因為在有如此多好玩開源專案的年代,對於想學的人,C語言一樣可以有很多興趣,對於不想學的人再簡單的語言一樣也很無聊。

有沒有趣,是學習或者是教學方法的問題,而不是程式語言的問題。

最後我想再補充兩點

首先,我寫上面內容時,沒太考慮職業技術學校的情形,一旦考慮速成,考慮大規模生產,結果必然會掉過來,這並不令人意外。

其次,並不是只有我有這類觀點,大名鼎鼎的Joel在《軟體隨想錄》裡專門有一章叫“學校只教Java的危險性”,其中所表達的觀點與這裡的觀點類似。

本文轉載自:http://www.csdn.net/article/2014-07-01/2820467
相關閱讀
評論(0)

相關文章