The 5 Levels Of C++
こちらの動画の要約。
「The 5 Levels Of C++」要約
5段階のC++習熟レベル
- レベル1(初心者)
- Hello World や簡単な電卓が作れる程度。
- コンパイラもよくわからない。
- エラーに苦しみ、CVにC++と書いたら死刑。
- レベル2(基礎習得)
- 関数・クラス・メモリ確保など基本的なことがわかる。
- 簡単なプログラムを書ける。
- まだ初心者扱いだが、ここでプログラミングを職業にしたいかどうか決断しがち。
- レベル3(いわゆる"中級〜疑似上級")
- 標準ライブラリ(unique_ptr, algorithmsなど)が使える。
- ポリモーフィズム、キャスト、継承、Rule of 3 など理解。
- 多くの人がここで「上級C++」だと勘違いして止まるが、実際は表層的。
※Rule of 3:クラスがデストラクタ、コピーコンストラクタ、コピー代入演算子のいずれか一つ以上を定義する必要がある場合、通常は残りの二つもすべて明示的に定義すべきであるというプラクティス。
- レベル4(本当の上級C++)
- テンプレートの高度な利用(SFINAE, CRTP, 変数テンプレート、テンプレートがチューリング完全など)。
- erase-removeイディオムのような言語の落とし穴も理解。
- 標準ライブラリやBoostの内部的な実装を真似できるレベル。
- しかし複雑すぎて現実のコードではあまり使うべきでない。
※SFINAE:条件に合わないテンプレートは無視される仕組み。
※CRTP:そのテンプレートの引数として自分自身を渡すデザインパターンのこと。
※変数テンプレート:型に応じた「定数」や「変数」をテンプレートとして定義できるもの。
- レベル5(C++神級)
- 言語仕様の隅々まで知り尽くし、奇妙な構文やライブラリ機能を駆使できる。
- 例えば自作リテラル演算子やobscure(あいまい)な標準機能を使いこなす。
- ただし実用性は低く、コードは難解になりがち。
作者の主張
- C++の高度な機能(特にテンプレートや汎用プログラミング)は複雑すぎて、正しく実装するのが非常に難しい。
- 自作の
vector
実装ですらバグだらけで、標準ライブラリが数千行かかるのも必然。 - だから「C++を神レベルまで極める必要はない」。
- 実務や作品制作(ゲーム開発など)では、読みやすく単純なコードを書くことが一番大切。
- 学ぶなら上級機能を知る程度で十分。その後は大きなプロジェクトを作る経験に注力すべき。
コメント欄
趣味として、(C++の高度な)こうした機能の使い道を見つけるのは、そもそもそれらを学ぶことよりも難しいと感じています。
全部の機能を使おうとせず、必要なものだけを選んで使うのが効率的。
(ただ、(多様な機能の)概要だけでも知っておくと、引き出しが増えるので、学習は無駄にはならない。)
C++は、学べば学ぶほど知らないことが増えると感じる唯一の言語だ。
まるで人生のよう。
最初のコメントと同じく、「自分が必要とする範囲だけ深く知る」という戦略が現実的かも。
レベル6を忘れているぞ、C++をやりすぎてその酷さに気づき、結局Cに戻る段階だ。だってC++の機能の95%はただのクソで、本当に必要なものなんて一つもないんだからな。笑
過激派(?)の意見。
ただ、人生で一度も使わない機能がかなりあるだろうことは間違いない。
C++20では「コンセプト」と呼ばれる機能が導入され、SFINAEの多くのユースケースを置き換えるだけでなく、読み書きや理解が格段に容易になり、コンパイル速度も向上しています。あなたが言う「レベル3のC++開発者」にとって、コンセプトの基礎知識はほぼ必須と言えるでしょう。
もちろんC++17、C++20、C++23、C++26には知らなくても構わない細かい変更が山ほどあります(例:C++23におけるオーバーロード可能なコンマ演算子の非推奨化、C++26の可変長オックスフォードコンマの非推奨化など)。しかし一部の機能は日常的なC++開発を劇的に楽にしてくれます。
余裕ができたら、C++11以降のバージョンで追加された機能も、適宜取り入れたい。
特にConceptsは、現代C++開発者の必須知識ともいえそうだし。
(C++17以降の知識を解説している本やサイトなどが(日本語の者は特に)少ないのが少しネックだが...)
おわり
ごちゃごちゃ言わんと、まずは業務経験を積むのがベスト。
業務の中でわからないところを深堀していき、余裕があれば様々なライブラリを学び、活用できそうなところは活用していくのがよい。