[257] 關於新手學習 C/C++ 這件事
這篇首發在鐵人賽—。山姆大叔談 C++:從歷史談起,再給個定義—Modern C++ 解惑
最近看到一篇文章讓我瞬間「眼神死」,讓我不禁感到無言以對,甚至有些無奈。
文章作者是一名學生,該文「看起來」是第一線觀察學校電腦程式設計的教學現況有感而發。懂得觀察很重要,但過於武斷這一點,要不得。
藉由這篇文章,山姆也要來好好地大放厥詞一番。(如果你看完有些動肝火,這屬於正常反應,不必驚慌)
缺德?
首先,關於「叫朋友學 C/C++ 是缺德行為」的笑話,真的笑一笑就好,不要當真。那些認為好笑的,十個有九個是 C/C++ 語言的「逃兵」——抓不到要領,學不到精髓,只好跟著別人笑。
C 跟 C++ 是截然不同的程式語言,但討論時,經常將兩者混為一談。本文討論的對象是 C++,不是 C。
再來就是「比賽誰能用最少程式碼印出 Hello World!」。說到這個,不知道最早是誰想出來的,但我認為她(他)的初衷不是拿來測試誰能最快印出 Hello World,而是以簡單且有趣,讓人一目了然的範例教程式語言。
每次看到有人拿這比賽來說嘴,說 C++ 很難學,很不友善。我想反問:證明了「Python/Ruby/JavaScript 是一個很會印 Hello World! 的程式語言」,有什麼意義?
小明用 Python 竟然比小憲用 C++ 早一分鐘印出 Hello World!
可以再搞笑一點?
該不該投入?
「該不該有更多人學習 C++ 並當做作專業技能?」
這個問題的答案,只有一個:當然要。
這幾年,許多有潛力的「系統程式語言」輩出,Go, Rust 都被認為有機會「幹掉 C++」。許多人這麼想,但我認為還早,甚至永遠不會發生。
我認為應該要培養更多 C++ 人材的理由是,許多資訊基礎建設如瀏覽器、資料庫、作業系統,甚至那些瞧不起 C++ 的程式語言,也是以 C++ 寫就。
以 C++ 開發的軟體專案會用其他語言改寫嗎?有些會(會做這種決策的人要嘛太蠢,要嘛錢太多),但多數不會。新的專案會選擇 C++ 做為主要開發語言嗎?肯定會,雖然我沒有數據證明,但我相信數量比你想像得要多。
C++ 難如登天?
我覺得 C++ 之所以被認為難學,是有一群人讓她變成這樣。什麼人?「門外漢」。
一個人一輩子,不是只能夠學一種程式語言。我常掛嘴邊的話:「我最討厭 Java, JavaScript, Assembly」,討厭歸討厭,我不會(真心地)告訴別人不要學那些我討厭或覺得困難的語言。專業工作者必須備有主槌、副槌、小槌子,不同的問題,要用適合該問題的工具解決。
我同意 C++ 相較於其他程式語言,其進入門檻相對較高(這個門檻不是指「印出 Hello World 難易度」)。但是,不要讓學生初接觸程式設計就挑戰難度較高的語言,什麼時候才適合?最直覺(無腦)的答案是:有需要的時候。
可是瑞凡,C++ 不是那種要用的時候「撿」起來就可以直接上手的工具,再怎麼有天份、資質的人,也要投入一定的時間,才能建立起正確而且紥實的 C++ 語言基礎。需要的時候再學,通常來不及啊。
學習 C++ 不僅僅只學該程式語言,電腦運作原理、軟體程式的抽象性、如何拆解問題,都是學習的一環。克服困難的問題所獲得的成就感,除了讓人大幅成長,還會讓人想一鑽再鑽,更上層樓。真正進得了「專業軟體開發者」大門的人,是那些需要「細心呵護」的嫩芽嗎?
程式語言有兩種
以學習的角度來看,程式語言概分兩種:
- 學成之後,要上手其他語言變得簡單
- 學成之後,要學其他語言變得難上加難
高階語言——離電腦運作原理很遠的那些,把開發者當「寶貝」,難的東西「藏」起來,說好聽怕你弄髒手,其實是「陰暗」的角落不讓你碰,因為你太「弱」了。那些不讓你碰的地方,設計者做了許多取捨,有些東西導致你在學習其他語言時,摸不著頭腦,搞不清楚狀況。
引用本文開頭所指的那篇文章中的一段:
C/C++ 是靜態語言,意思是它的變數需要定義型別且不能改變,這對新手是一個困難;C/C++ 是編譯式語言,程式必須先經過編譯才能執行,編譯過程對新手也是一個困難。
是「相對困難」,但這難度,很難克服嗎?我不這麼認為。「型別系統(Type System)」是 C++ 程式語言必備基礎,但就像教「數學原理」,「1+1 為什麼等於 2」?有那種教一下就會的小朋友,也有一些要花點時間才能接受的孩子,投入時間後,多數孩子都能學會基礎數學。
理解 C++ 的「型別系統(Type System)」不只在該語言有用處,同樣的觀念適用於不同的程式語言,雖然不是一對一對應,但原理互通,多有關連。這也是為什麼「學成 C++ 之後,要上手其他語言變得簡單」的原因之一。
真正讓人吐血的是這段:
再來是最大的問題,C/C++ 語法複雜,且在 AI、網站後端、App 等領域較不適合,現在通常是用其他的語言來設計,C/C++ 只會用來實做底層的功能。
希望讀者原諒該位作者,他真的不知道自己在「工蝦小」。這種不堪一擊的論述,以後再找時間談。
如果「新手不適合學 C++」,那要什麼時候學?關於學習 C++ 或其他程式語言,該聽誰的?「戰士」,還是「逃兵」。
在我眼裡,C++ 是一種許多面向都在「越變越好」的程式語言,覺得學 C++ 沒前途、沒市場,那是因為等級還太低,經驗、火侯還不夠。要怎麼做才能拉高等級?如何成為一位真正的「C++ Pro」?我認為:
① 反覆閱讀幾本好書
② 做中學的實驗精神
③ 待領域相同的職場
④ 跟隨一位對的導師
⑤ 公開分享學習心得
⑥ 三年
對,「三年」。多數人至少需要投入三年的時間,把 C++ 當做專業技能來學習,才有機會成為有實力的「C++ Pro」。