プログラマーになりたい。

プログラミングや写真や本や読書会のことや、日常のこと。

42tokyo Piscineに落ちた話

Piscine(ピシン)、落ちた話も受かった話もまあまあブログ記事とかになっていて、公開できないことも多いし、僕がこれ以上つけ加えることはほとんどないと思うが………。なんていうの、やっぱり落ちればくやしいわけで、なにかポエムを書こうと思って。

42tokyo

そもそも、42tokyoは何なのだろうか。プログラミングスクールなのだろうか。もちろん学校法人ではない(一般社団法人 42Tokyo)。実質はDMM様のご厚意で、会社の大きい部屋と大量のiMacを貸していただいているという感じだ。

最近私が気に入っている定義は、定期的に問題を解かないと追い出されるサロンというものだ。

ピシン(Piscine)

ピシンも、入学後も、「問題と生徒だけがあって、先生がいない」基本スタイルは変わらないようである(落ちたので、本科は詳しくないけど、ウェブサイトにはそう書いてある)。体験会的な面もあるのだろう。

私ことmiidaは2022年10月度のピシンを受けた。ウェブサイトで受ける2時間かかる壮大なCAPTCHAみたいな試験があり、受かったので、ピシンに参加した。IDからみいださんとかいいださんと呼ばれていた。

私の出身は、入試偏差値で日本で三指には入ると言われるアホ高専だが、一応電子情報工学科卒で、情報系であった。情報工学専門なら42なんて行かなくてもいいんじゃない? って思う人もいるらしいけど、ぜんぜんそんなことないから。現に落ちてるし。高校1年とかの必要性のわかってないやつらにプログラミング教育するのって難しくて、大した授業は受けられなかったのだ。

ピシンの風景

あるところに集められて、問題集渡されて、4週間放置されるみたいな感じ。レビュー予約と自動判定のシステムは一体で、大問ごとに2回レビューを受けると自動判定が走る。レビューの点数はおそらく大して大きくない。レビューを受けたいときは空き枠から選べる。逆に自分がレビューしてもいい時間帯を登録しておくと、システムを通じて勝手に予定が入る。レビューは15分単位で入れられるが、私は15分だと足りなかったから、ブッキングされたら前後の空き枠を消していた。

リアル教室はでっかいパソコン室みたいなのが1個ある。私たちの回はコロナ特例でオンラインで参加できたので、ほとんどいっていない。現在は完全オンラインは不可能らしい。

勝ち方と負け方

落ちた話も受かった話もまあまあブログ記事とかになっているが、

  • **がんがんググって、
  • がんがんコード書いて、
  • 遠慮せず質問して、
  • がんがんレビュー受けて、
  • がんがん他の人のレビューする
  • どれが足りなくてもダメ**

というのが私が身をもって(不合格になることで)学んだことだ。

大問のなかに小問がいくつか入っていて、判定は小問ごとにOK/NGされる。

各大問のうち50%で合格。ただし、一番最初のNGになった小問以降は点数にならないというスパルタ。なので、

  • 大問を最後までやるような完璧主義もダメ
  • だけど、凡ミスで前半の小問をNGにする注意力のなさもダメ

だと思う(大問最後までやることが、入った後に役に立つ可能性はあるが)。

これでPassしなかったら、NGの問題だけなおして、レビュー×2、自動判定してもらう。

私が負けたのは、まずレビューのポイント制を理解してなかったこと。完璧主義のために、提出から24時間以内に2レビューのルールを守れてなかったことがある。書き終わってfinishボタン押してから「これで大丈夫かな?」とかぐずぐず見直したり、ブッキング入れたのにキャンセルしたり(ポイントが消えるに気づかなかった)。

これはダメ。

はじめの方は、平気で4日(24時間以上)とか寝かしていた。これだけは本当に無駄。

私はせまい実家住みなので、夜型なのに、午前0時以降は通話しないと決めていたのだけど、そうするとまともにレビューができなかった。最後の方はあきらめて家族に謝って、午前2時、3時とかにレビューしてましたが、フルタイムは無理でも休日なし毎日6時間程度は必要じゃないかな。

finish後24時間以上経過って、これまともな人は体験しない結構なレアケースで、どうなるか知らない方もいるだろうが、1レビュー受けた瞬間に自動判定が走って、OK/NGはわかるけど、0点になります。

そんなことばっかりしてたら、お互いの進捗ってよくわからないので、最後の方のチーム戦で組んだ人に「え!なんで、そんなところにいるの!」とめっちゃ怒られました。すみませんね。

とにかく最初は知識がなくても、調べるのが上手く、デバッグやレビューを参考に、驚異的な速度で私を追い抜いていって受かった人もいる。とにかく手が動かないのは許されない。

仕事があったりして、時間がないときは

ちなみに、どうしてもピシン中に時間を確保できない場合は、事前にC言語の勉強、シェルの勉強をするしかない。

シェル使ったことない、シェルってなんですか? ってのは論外で、大変な目にあう。何がなくても、そのくらいの事前準備はした方がいいと思う。主要なコマンドの名前とおおまかな機能の暗記、一般的なオプションや引数の形式、複数のコマンドを組み合わせるやり方とかまで、知ってるとスタートダッシュが効くかも。

どのような課題か教えることはできないが、海外も含めて42本科の最初には「ft_lib」という課題がある(必修なので、できないと即退学)という記事を読んだけど、まあそういう学校なので、ft_libが何か説明を読んで、なんとなくどういう風に作るか理解できくらいのレベルが、入学を許可されるレベルなんだと思う。

公開情報によれば「ft_lib」は、「libc」とかのサブセットを自作するようだ。Cのコンパイラに付属する標準的なツール(関数とか)が入っている「libc」というものがあるんだけど。あと、macOSUNIXであるから、UNIX基準で勉強すること。

つまり、これから言えるのは、Cに関しては大ざっぱに言って1990年年代前半くらいまでのC言語の教科書に載っているような知識が役立つということ。当然CLI(コマンドライン)のみで、GUIはピシンには出ないとわかる。

ピシンの合格した友人たちが、このft_libでヒーヒー言っているので、もちろん一々ライブラリーの中身を使える必要はない。ただ、ライブラリーってなに? 関数ってなに? では不利になるだろう。

合格者は即ft_libが書けること期待してるわけですからね。

アルゴリズムとデータ構造」

私は知識偏重で、複雑なアルゴリズムでもAPIにあればわりと覚えているタイプだ。だから、他人の書いたAPIは使えないピシンでは死ぬタイプである。C言語の文法とかコンパイルオプションは無駄知識で書けるけど、複雑な処理は苦手。

そういえば無駄知識の中に、ポインターとか構造体があったのは、ちょっと調べれば二分木なとが書けてめずらしく有利だった。

みなさん、なんでもいいけどC言語の文法と、初歩的な「アルゴリズムとデータ構造」はやったほうがいい。教科書は非常に簡単なものでいいので、

  • 制御構造、
  • 関数、
  • 構造体
  • ポインター
  • 再帰といった どんな教科書にも書いてあるようなC言語の勉強はしておくべき。GUIはまったく不要。あと、
  • 基本的なアルゴリズムとデータ構造をCでどう書くか

も。

ふんわりしていてわかりにくいかもしれないが、もう一度言うが、とにかく42本科の最初の課題は「ft_lib」である。ft_libが何か説明を読んで、なんとなくどういう風に作るか理解できくらいのレベルが、入学を許可されるレベルなんだと思う。

まあ、ピシン中のみんなのスキルアップはまじでやばいので、脱落しなければ、ピシン終了時にはそのくらいになれてしまうかもしれない。

まあそういう場所なのですよ。

私の結果

自分で言うのもなんだけど、僕は上位半分にはいたが、上位3割には入ってなかった。

私は前職で1日中JavaPythonシェルスクリプトを書いたり、1日中シェルを触るような仕事をしていたから、シェル慣れ、コンパイラ慣れしていて、環境・知識面では有利だった。ただ、アルゴリズムでは競技プログラミング勢にはぜんぜん負ける。

大学生くらいで、プログラミング未経験だったけど、アルゴリズム的な思考、競技プログラミング的の才能がある人がいて、ばんばん追い抜かれた。

でも、アルゴリズムって、他人のレビューで教えてもらえるし、もうちょっと先まで行けたと思うんだよね。

ツール

初心者はエディタはVSCodeだろう。私はVimも少し使う。

ターミナルは手元ではzshスクリプトbashになる。

コンパイル環境

自動判定も、コンパイラーも、なにもかもがMacベースです。

なので、コンパイラーはちょっと古いXcodeのclangが基準になる(最新でも構わない)。ちなみに、自分でGCC入れてなければ、gccはデフォルトでclangにリンクされているので、どっちのコマンド名でもclangになる。

また、あまり新しすぎないGCC(本物)をminGWWindowsで使っている人もいたから、ある程度大体可能だと思う。ただminGWは難問か厳しい問題があった。目安は同じソースをコンパイルして出るwarningが同程度であれば大丈夫だろう。WindowsではWSL2でCentOS 8を入れて、GCC(本物)かなにか入れたほうがいいかもしれない。ただ、Linux系はコマンドオプションがぜんぜん違うから、茨の道だ。教室のiMacを使おう。

norminette

さらに、norminetteというスタイルチェッカーがあり、コンパイル前にこれを通らないとダメ。自分の環境で事前に使えるようにすべき。またnorminetteに無理やり従わせるc-formatter-42というフォーマッターがある。これも同様。

後者がmacOSの標準Python環境では動かないらしいので、現在のPythonを公式ウェブサイトか、brewなどで調達する必要がある。norminetteやc-formatter-42は、VSCodeにそれぞれ橋渡しする拡張機能があるからそれも入れる。

ただし、c-formatter-42は配列の変数初期化や、constの変数初期化を2つにわけちゃうバグがあるので、ときどきかける程度でいいと思う。

Normルールとnorminetteは公開情報だから書きますが、 - Cの関数に行数制限があり、 - ファイル当たりの関数の数、 - 関数当たりの引数の数 に制限があります。

Cのお勉強で書き写すときも、norminetteとc-formatter-42は使う方がいいと思います。

WIndows/Linux環境

私はメインマシンがMacだったのは運がよかった。

Windowsの人達はWSL2上のUbuntuminGW使ってたが、結構大変そうだった。

自動判定のシステムも含めて42の基準は全部macOSなのだ。コマンドのオプションの差にときどきハマってて大変そうだった。macOSBSD系だから、Liinux系のminGWUbuntuとちょっと違うのだ。さらにminGWはライブラリーの差がある。

コミュニケーション

僕の回はレビューが全部Discordだったので、音質悪い人がいて困ったな。こういうのって言いにくいんですよね。

私は単回のレビューで喧嘩とかみたいな感じで、トラブったことはない(はず)です。寝過ごしたことはあるけど。親しき仲にも礼儀ありっていうけど、大半は親しくすらないんだから、最低限、 - あいさつ - 名乗り - お礼 くらいは言いましょうね。それでトラブルが減るなら、お互い気持ちよくやれるなら、実行すべきでしょう。HTTPみたいなプロトコルですよね。形式だけで上手くいくのだから、人間って単純です。

ただ、表面的に礼儀正しくしてても、僕はぜんぜん名前とか覚えてなくて「はじめましてじゃないです」とか言われていた。十分失礼である。参加者100人中10人くらいしか覚えてないんだもん。みんな私より記憶力がいいらしく、レビューで「あ、みいださんだ」とか言われるんだけど、すみません、結構わかってなかったです。

チーム戦

チーム戦、最後の1回を除くと、参加ボタンを押すだけで、毎回ランダムにチーム組んでくれる、非コミュにやさしい仕様。

ただnorminetteでゼロ点、コンパイルできなくてゼロ点とか、僕が参加したチームは結局全部ゼロだった。あれは毎週末の娯楽だと思った方がいいかも。

レビューだとそこまで深くアルゴリズムの議論ができないけど、チーム戦でうまく実力の近い人(少なくともCがまともに書ける人)と出会えたらチャンスなので、お互いの思いついたアルゴリズムについて話してみるといい。ただ、コードが書けない人が2名と自分みたいになった場合は非常に過酷なことになる。

まあ、進捗優先。最悪パスもありだろう。娯楽だし。

さいごに

興味がある方は、Piscine体験会みたいなのもあるらしいから、興味のある人は42tokyoのTwittterアカウントとか、ウェブサイトを見てください。どうも今後はオフラインのみになりそうだから、DMM社となりの教室に毎日通えない人は厳しいかもしれないですね。

なめてかかっていると僕みたいに後悔するので、よく考えて、ちゃんと毎日×半日または週3〜4×フルタイムくらい時間をとれることを確認して挑んでください。

Creative Commons License ©2007-2021 IIDA Munenori.