有位朋友的問題在我信箱裡面壓了兩週了,我呢,一直沒有回答,包括上週一次回答三位朋友的博文,也沒有回答他的。這裡對這位朋友說聲抱歉。
倒不是我有意拿大,關鍵是這位朋友的問題,看似簡單,其實很難回答,屬於典型的開放式問題,而且很模糊,不好回答啊。但又不可否認,這個問題,很多人都問過的。
我本意也是本週末來回答這位朋友,不過呢,說實話,我呢,水平有限,恐怕回答不好,只有儘量答答看,如果不滿意,也請見諒了哈,我回去繼續學習,什麼時候學好了,繼續回答。
這裡我也說明一點啊,本週準備要寫的博文,其實是這一篇,額外那兩篇,其實是因為意外事件插入的哈。我是《0bug-C/C++商用工程之道》的作者,讀者來信肯定要優先回復的,這是原則,不能變。還有就是有人亂來,我拍回去,這是私人恩怨哈,大家別參與。
還是那句話,一家之言哈,歡迎拍磚。
原文如下:
肖老師,看過您寫的文章,對您是相當的佩服啊。我有個問題想請教請教您,我是一個網路工程專業的大一學生,然後師兄經常跟我說要學好C語言,我也在努力地認真學C語言,可是最近有個問題很疑惑,大家說的“學好C語言”到底是說學好C語言的什麼???我學來學去感覺總是在學那些語法什麼的而已,麻煩肖老師幫我解惑一下,謝謝老師了。。。
我的回答:
這位同學你好,嗯,說實話你的問題很“大”,很不好回答,我呢,試著答答看哈,不滿意別見怪,不是我不想回答好,確實是水平不夠。
但是呢,我也要說,你的這個問題很普遍,幾乎每個學習計算機軟體開發的朋友,包括我自己,其實在開發之初,都有過這類疑問,慢慢的,學會了,這個疑問會淡一點,但是,過幾十年,回過頭一想,發現這個問題還是有點模模糊糊的,呵呵,不知道我這麼說,大家同意不?
這個問題就是:“我們學計算機程式語言,到底學什麼?
 誠然,如你所說,師兄讓你學C,大家也都說學好C語言,但是,我們到底學C語言什麼呢?
粗看起來,C語言要學好,肯定要首先學好語法的啦,然後呢,需要學習演算法語言,資料結構,很多數學,還要學習很多平臺特性,Windows平臺和Linux平臺等,還要有一定的彙編知識,因為指標是彙編級的,還有什麼呢?我想還應該學點並行開發的知識,這其實也是屬於OS平臺特性,但是,這和普通書本上的程式設計是截然不同的世界觀,這個需要扭轉過來。等等。。。
這裡我談點我的認識,我們是程式設計師,或者是未來的準程式設計師,我認為,程式設計師主要的工作目標,其實不是掌握很多很“酷”的語言,滿嘴大家聽不懂的英文,來顯得自己也很“酷”。
我想程式設計師工作最本質的一點,就是把人希望計算機做的事情,翻譯給計算機聽,然後它照做。大家說是不是這樣?
我們對比一下學語文或者學英語這兩堂課,可能很多朋友會發現,其實學計算機語言和學人類語言,做的都是差不多的事情。首先要識字,背單詞,背成語,為啥呢,語言要學得熟,起碼你要知道這門語言能說什麼話,不能說什麼話,注意哦,不是每門語言都能描述這個世界上的所有事物的,很多現代科學裡面的概念,單位,其實中文是沒有對應的描述的,我們很多時候說英語,就是因為用中文描述不準確。我的理解,這叫做掌握語言的“邊界”。
其次呢,語法很重要,你用哪門語言,就要遵守這門語言的語法,否則別人聽起來費勁,溝通效果就差。比如我們很多時候,同時學語文和英文(至少初中以上的同學都這樣,呵呵),就容易弄混,搞定經常說一些“Chinese English”,或者“English Chinese”出來,中國人聽不懂,外國人不明白。呵呵,什麼“horse horse,tiger tiger”,外國人就暈過去了。還有什麼“正在熱賣中…”,這明顯借鑑了英語中的現在進行時,中文中沒這個語法的。
當然,上面不絕對哈,當一些錯誤的語法,用法,大家都接受了,其實作為成語,最後也被語言正式採用了,比如上面的馬馬虎虎,嗯,很多外國人都開始用。還有,我們QQ裡面打字,我也喜歡用“=ing”這類縮寫,大家知道什麼意思嗎?“=”就是“等”,表示“我正在等你”,呵呵。這是開個玩笑哈,亂來了。
注意沒有,學語言和學數學不一樣,學數學是要做題,把題作對就是100分,而學語言,終極目的不是考試,是你以後的生活中,說的話別人要明白才行,語文考試100分,生活中不會說話的人大有人在的。大家想是不是這樣?
所以說,語言沒有考場,或者說,它的考試貫穿你這一生,只要你這一輩子,用這門語言講話,有一次別人聽不懂,或者聽了不舒服,都叫做拿不到滿分的。
那好,我的問題就來了,學語言,僅僅學會語法和基本語句,夠用嗎?是不是還要大量實踐的經驗啊?
還有一個問題我們可以討論一下,我們學語言做什麼?首先啊,語文和英語都是人類語言,我們可以用他做幾乎生活中的任何事,與人溝通,請別人做事情,或者和人聊天,嗯,可能還有用來泡MM哈。
C語言顯然不行,我們不可能憑藉一段C程式碼,就把MM泡到手了的,呵呵,起碼我沒見過,大家有見過的,麻煩告訴我一聲,我也開開眼哈。
嗯,因為寫一段C程式碼,太專注,MM飛走了的我倒是見過。
C語言是計算機程式語言的一種,那很明顯,它最擅長的,是和計算機溝通。那計算機能做什麼事?是不是“計算”啊?所以,我說句話,學好C語言,學好任何一種計算機程式語言,最少有一個考試指標,就是“你能不能利用這種語言,指揮計算機完成你想要的計算!”大家說對不對?
因此,如果要我說,“學語言究竟學什麼?”,很簡單,學習讓計算機聽懂你話的能力。
我們前面說了,學習中文、英文,學習的目標是讓別人聽得懂我說話,能理解,不反感,還能按照我們的意思幫助我們,就夠了。
學計算機語言其實一樣的,讓計算機聽得懂我說話,能理解,不崩潰,沒有bug,還能照做,就夠了。
所以我這裡再說一個道理,大家看同意不?“計算機是檢驗程式的唯一真理!
這裡插句題外話,我的書《0bug-C/C++商用工程之道》,出來後,有很多人就罵,0bug,可不可能嘛,然後看了兩天書就開罵,說裡面程式這不對那不對,是垃圾,呵呵,弄得我很多朋友都跑過來問我,說你書裡的程式碼,到底有沒有問題?
我回答我朋友說,0bug是目標,不是說這本書裡面的程式碼一定0bug,不過呢,書中的程式碼,最少都有公網兩年的無故障執行歷史,最長的9年,起碼的穩定性還是有的。
可大家不信啊,還問,最後我說這樣子,你把程式碼敲出來自己run一下就知道了,沒必要自己在那琢磨,以及跑來問我。“計算機是檢驗程式的唯一真理!”,程式碼本來就不復雜,你自己敲敲看。
喏,敲完了,大多數人不說話了,這程式本來就是我自己的工程庫,不敢說一定沒bug,但也不是bug一大堆啊,不然,老闆早就把我炒了,我也早就餓死了,輪不到我到這裡出書給大家看。大家去想是不是這麼個理兒?
起碼,這堆程式碼出來見大家的時候,是經過了QA和計算機兩道關稽核的,呵呵。
因此,學C語言,學習其語法和關鍵字,常用庫函式,我的理解,學到我們寫的程式計算機能理解,就ok了。
不過呢,這樣夠不夠?
要我說,不夠的!
學語言,別人聽得懂是一碼事,能指揮別人做事,是另一碼事,語言最難學的,我認為不是上面簡單的語法,語句,更關鍵的是,我們需要用語言來描述邏輯。大家去想是不是這個道理?
那個誰誰誰,去把這件事做了,你先做什麼,後做什麼,最後做什麼,聽明白沒?明白了就去做!
那個計算機,去把這件事做了,你先做什麼,後做什麼,最後做什麼,聽明白沒?明白了就去做!
大家覺得對計算機說話和對人說話,究竟有多大差別?所以我在《0bug-C/C++商用工程之道》,第三章C/C++無錯化程式設計中,特別強調,好的程式,從易讀開始,把你的程式說得淺顯易懂,你的程式就能在商用工程中發揮最大的效能。
說話,本來就是要讓人懂的嘛!
因此,我要說,學語言,更要學習很強悍的邏輯描述能力,能把一件很複雜的事情,拆分成很多簡單事情,並分別簡要說明,讓計算機一看就明白,這個很重要。
那麼,我們前面說了,計算機,主要是做計算,它處理的事物,主要是數**算,因此,我們學語言要學好,要不要把很多數學學好?
其實,學數學,我的理解就是學習把一個很複雜的計算簡單描述出來的能力,大家覺得呢?
所以,簡單說一下,我覺得,學語言,首先要學好語言相關的知識,能熟練運用,別把意思表達錯了,其次,要學習很多其他相關的知識,比如數學,比如作業系統,比如很多開發理念,這些都是前人總結出來的,更好地幫助你表達自己的意思的工具,同時,還要多練習,不斷演練,才能逐步掌握一門語言的開發方法。
我們學習,只要學的是語言,其實很難說終點在哪裡。考試得100分,可能僅僅是開始,並不是結束。大家去想。
當然,還有個利好訊息送給大家,如果大家能把一門計算機語言,走完上面這個過程,其實,任何語言對你來說,都是一碼事,為啥,最難的後面的開發思想掌握了,學新語言,也就只剩下學點語法和關鍵字了,只要考試100分,就能用它做事,大家說對不對?
好吧,先說到這裡,有問題再問,也歡迎大家討論。
肖舸