はじめに
この記事は、競技プログラミング同好会 競技就活部門のスライド「人生のチュートリアルを終わらせるたったひとつの冴えたやりかた」を読んで、自分なりに理解したことをまとめたものです。
元々は、このスライドへのコメントを備忘録としてなぐり書きしていただけでした。ところが、その備忘録のページにそこそこ検索流入があり続けていて、なぐり書きのまま置いておくのは申し訳なくなったので、改めて記事として書き直すことにしました。
先に断っておくと、ここに書くのはあくまでも自分の解釈です。元の資料が全部で166ページもあり、扱う内容も幅広い大きな資料で、読み手によって拾うところは変わると思いますし、この解釈が絶対に正しいというつもりもありません。その前提で、ソフトウェアエンジニアに限らず、一般に「何か新しい分野のスタートラインに立つためにはどうするのか」という話として読んでもらえればと思います。
スタートラインとは何か
ここでいうスタートラインは、ゴールではありません。専門家として一人前になった状態でもありません。
専門職になるというのは、言い換えると専門家集団の仲間になることです。医師であれば医師国家試験、法曹であれば司法試験、研究者であればその分野の博士号のように、資格や試験が境目になっている分野は分かりやすいです。試験に合格すれば、少なくとも仲間として扱われるところまでは来た、ということになります。
一方で、ソフトウェアエンジニアのように資格が境目になっていない分野では、専門家集団の成員自身が「この人は仲間か」を判断します。その判断の入り口に立てる状態が、ここでいうスタートラインです。
スタートラインに立てれば、その分野の人と話が通じるようになり、あとは探索したり、他の人と協力したりしながら進んでいけます。逆に、そこに立つ前にどれだけ高度なことを部分的にできても、話が通じなければ仕事にはなりにくい、というのがこのスライドの基本的な見方です。
鍵は専門家集団の「常識」
では、何が揃えば仲間と判断されるのか。スライドの答えは、その集団が共通に持っている「常識」です。
ここでいう常識とは、世間一般の常識のことではありません。「成員の8、9割が、他の成員の8、9割が知っているだろうと思っている知識」くらいの意味です。知識だけではなく、どう反応するか、どう行動するかといった、反応や行動に近いところも含みます。集団の中向けに書かれたドキュメントは、この常識を持っていることを前提に書かれます。
この常識には、いくつか性質があります。
まず、常識は集団の目的や仕事から決まります。専門家たちが仕事をしていて、5年に1度は見ることになるものの共通部分が常識になる、というのがスライドの説明です。だから、専門分野が違えば常識のセットも大きく変わります。広い集団では常識の範囲は狭くなり、狭い集団では逆に広くなる、という入れ子の関係もあります。
次に、何が常識かは集団の内部に閉じています。外から見て「どこからどこまでが常識か」を知る方法は基本的になく、専門家に聞くしかありません。大学受験のように大規模にコモディティー化している分野なら本屋の参考書コーナーに行けば分かりますが、多くの専門分野はそうなっていません。
そして、常識の量は意外と多くありません。どの専門分野でも、半年から2年くらいあれば叩き込める量だ、というのがスライドの著者の感覚です。届かない高みではなく、やれば揃う範囲のものとして提示されているのが、この話の希望の部分だと思います。一方で、裏を返せば、誤った方向につまみ食いを続けても常識は一式揃わず、専門家としてのスタートラインにたどり着くことすらできない、ということでもあります。
なぜ一式揃える必要があるのか
常識について、スライドが特に強調しているのが「掃ききること」、つまり一式揃えることの大切さです。
常識を部分的に知っていることは、あまり意味がありません。評価は、常識のセットの中で一番苦手なところ、一番大きな抜けに近い値で決まってしまいます。
これは入試とは対照的です。入試は科目ごとの点数の和、算術平均で評価されるので、苦手科目を得意科目で補えます。一方で実際の仕事は、ゼロがひとつあったら全体もゼロになるような性質を持っています。平均ではなく、最小値に近い評価です。ひらがなを20個だけ読めて、特定のジャンルの漢字を2,000個知っていても、日本語の読み書きができることにはならない、というたとえがスライドでは引かれています。
コーディングの例
抽象的な話が続いたので、コーディングを例にするとどうなるか、というのが元の備忘録に書いていた部分です。
AtCoderのような競技プログラミングを遊ぶのに、本来の意味でのアルゴリズムやコーディングの能力は、実はあまりいりません。インターネットで検索したり、ソースコードを持ち込んだりできるからです。問題文の数字の制約から、使用可能なアルゴリズムやデータ構造の計算量を決定する。その条件にマッチするものを探し、組み合わせて動きそうなものを考えて呼び出す。実行してみてテストケースと一致するかを確認し、合うまで修正する。これで解けてしまう問題は多いです。
一方で、本来、アルゴリズムやコーディングの能力とは、以下のようなものの集合体のことだとスライドでは整理されています。
- 何も見ずに書けるし、修正できる能力。ライブラリの中身を問われたら、それも書けてほしい
- 言語のバージョン間の差異や、言語仕様か環境依存かといった点まで含めて気を配れる能力
- 他人に読みやすいように書く能力
- 巨大なコードベースを読み取る能力
- 頭の中でシミュレーターを高速かつ高精度に走らせる能力
- 計算量のような雑な評価ではなく、コードの優劣を評価して、適切なものを選択する能力
なお、スライドには「ほとんどが思っているよりもずっと書けない」という率直な指摘もあります。
自分の実践との接続
自分が2024年に取り組んだArai60のコーディング練習は、今から振り返ると、この「常識を一式揃える」作業そのものでした。
- LeetCodeのMedium程度の問題であれば何も見ずに書けるし修正できること。
- 関連するライブラリの中身を問われればそれも書けること。
- 言語仕様や環境依存に気を配れること。
- 読みやすく書くこと。
- 大きなコードを読めること。
- 頭の中でコードをシミュレートできること。
練習の目的として挙げていた項目は、この記事で紹介した能力のリストとほぼ重なっています。
講師の方々にレビューしてもらいながら同じ問題を繰り返し書いたのは、自分のコードに対する反応を、講師陣の反応に近づけていく作業でもありました。「仕事が一緒にできる人になる」という目的の言い方もしていましたが、それはつまり、ソフトウェアエンジニアという集団の常識を共有できる側に寄せていくことだったのだと思います。練習方法そのものについては、Arai60で取り組んだコーディングの練習方法にまとめています。
常識を揃える場としての選択肢
常識は集団の内部に閉じているので、揃えるには中の人がいる場に入っていくのが近道になります。自分の場合は上のコーディング練習会でしたが、ソフトウェアエンジニアを目指す場合、他にも選択肢はあります。例えば、42 Tokyoもそのひとつとしては悪くないと思います。
42 Tokyoは、フランス発のエンジニア養成機関「42」の東京校です。授業料は完全無料で、18歳以上であれば経歴は問われません。教師や授業、教科書はなく、学生同士が教え合いながら課題に取り組むピアラーニングの形式で、C言語やアルゴリズムといったコンピューターサイエンスの基礎から学んでいきます。入学には約4週間の選考「Piscine(ピシン)」があり、基礎カリキュラムを終えれば、世界30カ国以上にある他の42のキャンパスへ転校することもできます。要するに、コミュニティの中に入って、仲間と一緒に常識を揃えていく場です。
ただ、すでにエンジニアとしてキャリアを積んでいる人には、強くはおすすめしません。キャリアアップはやはり実務経験が中心で、あえてコミュニティで数年間勉強するほどの強いインセンティブは、多くの場合はないと思います。一方で、学生など時間に余裕があって、海外にも興味がある人であれば、検討してもよい選択肢だと思います。
おわりに
スタートラインに立つためにはどうするのか、という問いへの自分の答えをまとめると、目指す集団を決めて、その集団の常識を一式揃えることです。
何が常識かは外からは見えないので、中の人に聞くか、コミュニティに入るか作るかして学んでいくしかありません。ただ、その量は半年から2年で叩き込める程度で、常識さえ揃えば入り口までは到達でき、あとは探索と協力で進んでいけます。
あちこちのトピックに触れたので、解釈がずれているところもあるかもしれません。元のスライドは共有や放流が自由と明記されている大きな資料なので、興味を持った方はぜひ原典も読んでみてください。