這篇文章是關於「無痛入手 C++」這個系列,在內容設計上的想法。有任何建議都歡迎在留言提出~
這個系列會分成三個部分來進行: 基礎系列、中級系列、進階系列。
(過程中可能會對寫過的內容做一些調整)
我希望讓完全沒有程式基礎的人,在學完基礎系列的課程以後,有能力寫出一些小遊戲,如: 貪吃蛇、踩地雷 (會用黑黑的終端機畫面印出來,雖然蠻醜的但已經算是有一定規模的程式了~)。
會這樣規劃是因為我認為對於沒有基礎的人來說,先學習少量、足夠用的語法來寫出有一定難度的程式,不僅可以花更多心力在訓練寫程式的邏輯 (這跟使用什麼程式語言無關),也有助於培養信心。
因此在基礎系列的課程設計上,會盡量排除:
1. 對上述目標沒有直接影響的部分。
2. 牽涉到硬體知識的部分。
像是資料型態的介紹會排除 int8_t、usigned、long 以及 overflow 的議題,pointer 和 memory allocation 也會留到中級系列。
而某些實用也容易使用的 container,如: string、std::array、vector 則會在基礎系列就涵蓋。
此外,部分承襲自 C 或是相對底層的部分,如: C-array、reinterpret_cast、void*,可能在三個系列中都不會提及。
會這樣規劃的原因是我認為那些部分是在學習底層的系統開發而不是通用的程式設計。更具體來說,單純只是學了那些語法是沒有意義的,還需要對底層的系統開發有一定程度的理解,並搭配實際的範例才知道怎麼使用。
而對於許多 C++ 的程式設計師來說,通常不會直接碰觸到那些部分 (不然應該會直接用 C 寫),因此我認為應該要著重在 C++ 較為現代及高階的部分。
這個系列會著重在和電腦基本架構及記憶體有關的部分。
我認為學習這個部分需要大量的範例與習題的輔助,在熟悉基礎系列中常用的語法與程式邏輯後,有助於學習這類較為困難的部分。
此外,和基礎系列一樣,這個系列也希望讓讀者能擁有實際應用的能力,因此會加入一些時間複雜度與資料結構 (linked list、tree、graph) 的內容。我相信這樣的搭配會對於理解記憶體和熟悉 pointer 的操作很有幫助。
這個系列才會介紹到 C++ 的主要核心: OOP、template、STL。
上述提到的三個主題都是圍繞在 C++ 的抽象化,有助於開發大型軟體。抽象化是建立在扎實的實作基礎上,相信在具備前面兩個系列的知識以後,這個系列應該會學得蠻順利的。
不過關於類別與 template 的設計,請容許我跳過一些複雜的主題,像是如何設計出具有彈性、安全且高效的函式庫,這個部分完全超出我的能力範圍......。
還有一些現代 C++ 的函式庫與用法,如多執行緒、coroutine、ranges & views...等等的太多了,應該都不會提到。
總之,「無痛入手 C++」會以基本概念為主,畢竟 C++ 實在是又深又廣,其他沒有涵蓋到的部分就請有興趣的讀者自行研究了~