42 Tokyo Piscine 備忘録
本投稿では、Piscineを受けた上で、感じた事を備忘録としてまとめる。
どのような方がどのような形でコミットしていたか、所感、これから試験を受ける方に少しのヒントを残せると良いと思う。
週ごとの所感(Piscine体験記)
先にPiscineについて説明をしたいがどこまで記載して良いのか分からない。そこで特に理由はないが、適当なNote記事を引用しようと思う。この所感はあくまで私の備忘録に過ぎないため、もしPiscineについて知りたいというニーズを読者の方が持っていたら下記のような記事をお勧めする。
第一週目から第二週目
まずはじめに困惑する事となったのはOSである。ちなみにOSについては公式の記事等でもいくらか言及されていたため、ここで言及する。
まず事前に調べた限りはOSはMacであるという情報であった。しかしいざ試験が始まると、目の前にいるのはUbuntu Desktop(Linux)である。
幸いに私はUbuntuはいくらか触った事があったため、問題なく始められたが、OSが原因で脱落した人もいるのではないだろうか。
週の終わりぐらいになり、初めてC言語を書き出した。ポインタなどC独特の機能などは少し理解に苦戦したが、プログラミングを少し齧った事のある人であれば、問題のないレベルだと思う。
グループ課題などもあり、複数人で協力しながら取り組む課題もある。私はその初回で、メンバーの方が英語のみという、英語が苦手な自分にはかなり苦しい状況であったが、いい経験となった。
一ヶ月間の試験で、落ちたら勿体無いと考える方もいるだろうが、このレベルの濃い経験を無料でできると考えたら落ちても儲け物であろう。
第三週目
この辺りから課題が異様に難しくなってきた。言及は避けるがとにかくやった事のないタイプのものばかりでかなり苦戦した。競プロ経験者の方がこの辺りからかなり強みを発揮し始める。
初週であったら、絶対に無理であったような問題も解けるようになっており、自分自身のレベルアップを感じる事が出来る。
第四週目
最後の週、魔境である。課題は難しく、また完璧にしなくてはいけないため、長時間かなりの集中力を保ち続ける必要がある。そのため最後のグループ課題は失敗し、ペア課題はデバックに不安を残しながらなんとかクリアといった感じでかなりギリギリの戦いであった。
だが最後にやり切った分達成感もあり、とても充実した一ヶ月になり非常に満足である。努力した分が数字として現れるのも非常に嬉しいものである。
どのようなタイプの人が有利か
どのようなタイプの人が試験期間中に有利かを記述する。ただここでの”有利”とは、合格しやすいといった物ではなく、試験期間中にどのくらい課題を進められるか、スコアを獲得できるかといった物である。
後述で詳しく説明するが、Piscineの合格基準は非常に不明瞭に隠匿されている。前述のスコアや課題の進捗だけが合格基準となっていないのである。だがその内容もおそらく評価において重要な評価を果たしていると予想される。
また、与えられる課題の進捗が周囲より遅いと、周囲に質問する機会が少なくなっていき、また逆に課題の進捗が早くスコアが高い攻略組であれば周囲から質問されるためコミュニケーションにおいて非常に有利である。
そういった試験中の開発体験の高さや、途中離脱をしないタイプといった意味で、ここでは論じていこうと思う。
現役のエンジニア
これに関して、理由は自明である。だがコーディングの経験だけが、現役のプログラマーが有利となる理由ではない。やはり領域の近い組み込みエンジニアの方が攻略組にいたのは事実だが、WEBなどの領域外のエンジニアも非常に有利であった。以下に私が感じた大きな理由を二つ記述する。
第一に、コミュニケーションの円滑さである。ある程度試験が進むと、小規模ながらも複雑な実装がいくつもある。さらにグループやペアで課題を行う際に、提案力や質問の解答力が、踏んできた場数の分優位に働く。
第二に、検索能力である。検索能力と単に論じてしまうのも味気がないので、ここではその能力について少し分解してみようと思う。
人はものを作る時に、ある程度結果を分割想像しながら行う。DIYであれば切り分けられた木材のパーツを創造するし、料理であれば切り分けた野菜などを想像するだろう。そしてプログラミング言語で物を作る際には”切り分けられた機能”を想像できると良いだろう。
今まで使えていた物が使えていないときに、代わりにこの機能を使うべきであるといった考えや、必要な機能が使えない場合にそれを、自分で作り上げる思考である。料理に例えれば、にんにくが無いときに代わりに生姜を使った。シーザードレッシングを、チーズや牛乳から作った。などがこれにあたる。
料理においても、作り方を知らなければレシピを調べればいいが、料理にある程度慣れていなければ、そもそもドレッシングを作ろうとはならないだろう。さらに、レシピを調べる上でもどのレシピが有用で、このレシピは有用で無いなどを判断しなければならない。(事実、私より母の方がクックパッドで良いレシピを探す事に長けている)
試験中のプログラミングもこれに似て、無い機能は自分で作ったり、代わりを見つけなければならないが、慣れていないとレシピの調べ方やどのレシピの有用さを判断する事が難しい。
上記2点が私が考える現役のエンジニアが有利であると考える理由である。
競技プロ経験者
よくSNSでは、競プロやっていたプログラマーは使えないなどの意見が良く論じられているが、Piscine中においては競プロ経験者は無類の強さを誇っていた。私は競プロをした事は一度もないのだが、Piscineで競プロ経験者の方を見て、特質すべき能力があると感じたため、その能力について2点述べる。
第一に実装スピードの早さである。競技プログラミングの世界では、実装の早さが順位に直結するらしい。例えば10問の課題に取り組み8問目まで解けたとしよう。その場合同じ8問目まで解けた人の中でも早い人の方がランキングが高く、数百位の順位差にもつながるらしい。
そういった点から競技プログラミングの経験者は、ものすごく実装が早い。言及は避けるが、試験中も速度は非常に重要になってくるため、そういった能力はとても有利に働く。
第二に複雑なアルゴリズムへの慣れである。ともに試験を受けた競プロ経験者の方は「アルゴリズムを想像できたら、あとは言語仕様を調べながら実装するだけ」と語っていた。
つまり私がコードを記述しながらアルゴリズムを考えている中、彼らはすでに頭の中に出来上がった機能を、コードに書き起こすだけで良いのだ。そのため実装も早く、機能を洗練された状態でかける。
こういった理由から競プロ経験者は、かなり試験を受ける上で優位であろう。だが前述した方々は、Atcoder水色、緑色など、そもそもかなりハイレベルである上に、競プロはあくまで趣味として楽しまれている。
そういった理由から私は、初心者の方がスキルアップのために競プロを始める事をあまりオススメしない。プログラミングに慣れ、ある程度コードを書く楽しみを感じたタイミングで趣味として始めるのが最も幸福なのではないだろうか。
受験前に触ってみると良いもの
Vim
Vimというテキストエディタをご存知だろうか。おそらくこの記事を読んでいる方は、VScodeの方が馴染み深いだろうか。だがVimに慣れる事は非常に重要である。
理由はいくつかあるが、何より慣れればストレスが少ない。使い始めた最初はその複雑怪奇な操作方法に戸惑うだろうが、慣れればストレスが少ない。
なぜならマウスが不要であるからである(不要以前に使えない)
もちろんVScodeでショートカットを使いこなしているユーザーであればVimはそれほどのアドバンテージにならないかもしれない。だがなかなかマウスが手放せないのではないだろうか。Piscine中は長時間連続でコーディングをしないといけないため、頻繁にキーボードとマウスの間を腕が行き来すると、ほぼ確実に肩こりを発症する。
またマウス操作は集中力を削ぎ、作業効率を落としてしまう。そういった点からVimのショートカットでの高速移動や、マウスが不要である点は非常に効果的だと思う。
また、コマンドラインだけで動くため軽量なので、マシンスペックを気にせずに使用できる。最近のVScodeはプラグインを入れるとすぐに肥大化してしまうため余り好みではない。
そして下記に秘伝の.vimrcを記載しておく。深い言及はできないが以下の呪文はいつか役に立つだろう。空から降ってきた謎のロボットを起動したりするタイプの呪文なので覚えいておいて損はない。
set nu ts=4 sw=4 ai si
Linux
前述の通り、Piscine初日に使用するOSがUbuntusであった時、かなり驚愕した。まだ私はLinuxを使用した事があったが、他の参加者は生まれて初めて、MacとWindows以外のOSを触ったという方もいただろう。
Linuxは仮想環境などが簡単に用意できるが、読者の方には古い中古のPCやミニPCなどに実際にLinuxを入れて試してみてほしい。SSHやファイル管理、CLIでの操作などは実際に構築してみて初めてわかるものが多い。
このダラダラと長く書かれた記事をここまで読んでくれた方なら用意であろう。もし実際に構築してくれた方がいればぜひコメントで教えてほしい。
シェルとターミナル
シェルとターミナル、もしかしたら読者の方にはその存在さえも知らない方がいるのではないだろうか。はじめにその具体例について簡単に下記に記載する。もし知らない方がいれば読み進める前に検索して調べてほしい。
シェル:Bash Zsh Fish など
ターミナル:ターミナル(Mac OS) コマンドプロンプト iTerm など
ちなみに私は、FishとWezTermを普段は用いている。せっかくなので下記におすすめのWezTermカスタマイズ用のConfigを書いたレポジトリを貼っておくので、ターミナルをいい感じにしたい方はぜひ試してみてほしい。
受験前に触ってみなくて良いもの
C言語
意外かもしれないが、必要ないと思う。というのも42で取り組んだC言語は、C言語なのではあるが、Objective-Cのような独自の規則や原則に縛られており、それに慣れる必要があった。そういった意味で、初心者も経験者も最初、程度の差はあれ苦戦することになるだろう。
そしてもし読者の方がすでに「苦しんで覚えるC」を読んだことがあるというなら安心してほしい。「苦しんで覚えるC」は全然苦しくないような内容なので、これで覚えたところでPsicineの楽しみが削がれることはないだろう。
最後に
Piscineに限らずエンジニアリングに取り組む上で、うまくいかない時の方が、うまくいく時より多いことは自明である。
だが、プログラミングをする上で成長を感じたのは、そのうまくいかない時の方が多かったと私は思う。意味の分からないエラーに遭遇して、知らなかった言語使用を理解したり。関数が想定しない挙動をしたため、ソースファイルを確認したり。
うまく行った時には、そのシステムが動く事を、すでに私は知っている。だがエラーが発生して、「おかしいなぁ」と思っている時は、まだ自分の知らない課題に直面している時だろう。
自分はエラーに直面するたびに、自分はプログラミングに向いていないんだろうかと考えってしまっていた。Piscineに一ヶ月取り組み、その困難こそが成長であるという事を知れて本当に良かったと思う。
ここまででもとても満足だが、合格して本科でこの体験を続けられたらと切に願う。Piscineで一緒に学んだ方達とも一緒に学びたいとも思う。