這篇首發在鐵人賽—。山姆大叔談 C++:從歷史談起,再給個定義—Modern C++ 解惑

今天周末,換個話題。最近有一篇文章引起我的「注意」,是讀了「眼神死」的那種注意。讀完之後,心生一語——鞭數十,驅之別院。

文章作者是一名學生,該文「看起來」是第一線觀察學校電腦程式設計的教學現況有感而發。懂得觀察很重要,但過於武斷這一點,要不得。

藉由這篇文章,山姆也要來好好地,大放厥詞一翻。(看了會動肝火,屬正常反應,請勿驚慌)

缺德?

首先,關於「叫朋友學 C/C++ 是缺德行為」的笑話,真的笑一笑就好,不要當真。那些認為好笑的,十個有九個是 C/C++ 語言的「逃兵」——抓不住要領,學不到精髓,只好跟著別人笑。

再來就是「比一比,看誰最會印 Hello World!大賽」,「印出 Hello World」不知是誰開始的,但我認為她(他)的初衷不是拿來「測試(Benchmark)」誰能最快印出 Hello World,而是以簡單且有趣的範例,來教程式語言。

每次看到有人拿這比賽來說嘴,說 C/C++ 很難學,很不友善。我想反問:證明了「Python/Ruby/JavaScript 是一個很會印 Hello World 的程式語言」,有什麼意義?

小明用 Python 竟然比小憲用 C++ 早一分鐘印出 Hello World!

可以再搞笑一點?

該不該投入?

「該不該有更多人學習 C/C++ 並當做作專業技能?」

這個問題的答案,只有一個:當然要。

這幾年,許多有潛力的的「系統程式語言」輩出,Go, Rust 都被認為有機會「幹掉 C++」。許多人這麼想,但我認為還早,甚至永遠不會發生。

我認為應該要培養更多 C/C++ 人材的理由是,許多資訊基礎建設如瀏覽器、資料庫、作業系統,甚至那些瞧不起 C/C++ 的程式語言,也是以 C/C++ 寫就。

以 C/C++ 開發的軟體專案會用其他語言改寫嗎?有些會(會做這種決策的人要嘛太蠢,要嘛錢太多),但多數不會。新的專案會選擇 C/C++ 做為主要開發語言嗎?肯定會,雖然我沒有數據證明,但我相信數量比你想像得要多。

C++ 難如登天?

我覺得 C/C++ 之所以被認為難學,是有一群人讓她變成這樣。什麼人?「門外漢」。

一個人一輩子,不是只能夠學一種程式語言。我常掛嘴邊的話:「我最討厭 Java, JavaScript, Assembly」,討厭歸討厭,我不會(真心地)告訴別人不要學那些我討厭或覺得困難的語言。專業工作者必須備有主槌、副槌、小槌子,不同的問題,要用適合該問題的工具解決。

我同意 C/C++ 相較於其他程式語言,其進入門檻相對較高(這個門檻不是指「印出 Hello World 難易度」)。但是,不要讓學生初接觸程式設計就挑戰難度較高的語言,什麼時候才適合?最直覺(無腦)得答案是:有需要的時候。

可是瑞凡,C/C++ 不是那種要用的時候「撿」起來就可以直接上手的工具,再怎麼有天份、資質的人,也要投入一定的時間,才能建立起正確而且紥實的 C/C++ 語言基礎。需要的時候再學,通常來不及啊。

學習 C/C++ 不僅僅只學該程式語言,電腦運作原理、軟體程式的抽象性、如何拆解問題,都是學習的一環。克服困難的問題所獲得的成就感,除了讓人大幅成長,而且還想一鑽再鑽,更上層樓。真正進得了「專業軟體開發者」大門的人,是那些需要「細心呵護」的嫩芽嗎?

程式語言有兩種

以學習的角度來看,程式語言概分兩種:

  • 學成之後,要上手其他語言變得簡單
  • 學成之後,要學其他語言變得難上加難

高階語言——離電腦運作原理很遠的那些,把開發者當「寶貝」,難的東西「藏」起來,說好聽怕你弄髒手,其實是「陰暗」的角落不讓你碰,因為你太「弱」了。那些不讓你碰的地方,設計者做了許多取捨,有些東西導致你在學習其他語言時,摸不著頭腦,搞不清楚狀況。

引用本文開頭所指的那篇文章中的一段:

C/C++ 是靜態語言,意思是它的變數需要定義型別且不能改變,這對新手是一個困難;C/C++ 是編譯式語言,程式必須先經過編譯才能執行,編譯過程對新手也是一個困難。

是「相對困難」,但這難度,很難克服嗎?我不這麼認為。「型別系統(Type System)」是 C++ 程式語言必備基礎,但就像教「數學原理」,「1+1 為什麼等於 2」?有那種教一下就會的小朋友,也有一些要花點時間才能接受的孩子,投入時間後,多數孩子都能學會基礎數學。

理解 C++ 的「型別系統(Type System)」不只在該語言有用處,同樣的觀念適用於不同的程式語言,雖然不是一對一對應,但原理互通,多有關連。這也是為什麼「學成 C/C++ 之後,要上手其他語言變得簡單」的原因之一。

真正讓人吐血的是這段:

再來是最大的問題,C/C++ 語法複雜,且在 AI、網站後端、App 等領域較不適合,現在通常是用其他的語言來設計,C/C++ 只會用來實做底層的功能。

希望讀者原諒該位作者,他真的不知道自己在「工蝦小」。這種不堪一擊的論述,以後再找時間談。

如果「新手不適合學 C/C++」,那要什麼時候學?關於學習 C/C++ 或其他程式語言,該聽誰的?「戰士」,還是「逃兵」。

在我眼裡,C++ 是一種許多面向都在「越變越好」的程式語言,覺得學 C++ 沒前途、沒市場,那是因為等級還太低,經驗、火侯還不夠。要怎麼做才能拉高等級?如何成為一位真正的「C++ Pro」?我認為:

① 反覆閱讀幾本好書
② 做中學的實驗精神
③ 待領域相同的職場
④ 跟隨一位對的導師
⑤ 公開分享學習心得
⑥ 三年

對,「三年」。多數人至少需要投入三年的時間,把 C++ 當做專業技能來學習,才有機會成為有實力的「C++ Pro」。