仏発エンジニア養成機関「42 Tokyo」ってどんなところ?

はじめに

この文書の目的は
1. 42はどのような課題をこなすプログラミングスクールなのか
2. 42の課題をこなしている学生の特徴
の2つを示すことです。

この文書の対象読者は以下を想定しています。
・42 Tokyoの学生がどのようなことを学んでいるのかを知りたい方
特に「42 Tokyoに属している方が就職の面接に来た際、その方がどのようなことを学んできたのかを事前に知りたい方」に読んで頂きたい内容です。

著者

42 Tokyoの第一期生(2020年2月のPiscineに参加、2020年6月下旬からカリキュラム開始)

この文書を書こうと思った契機

42 Tokyoの方々のことを多くの企業の方々に知っていただきたいからです。
firstcirleの課題(42における基礎の課題)をすべてクリアしてから書こうと思っていたのですが、1年経っても終えられず、firstcircleの最終課題までたどりついたのですが、最終課題のクリアに少なくとも3ヵ月はかかりそうです。
最終課題をクリアしていなくても文書は書けそうなこと、42 Tokyoで学んでいるのはいいがどうやって就職すればいいのかに悩んでいる学生が多い気がすることから、この時点で文書を書くことにしました。
この文書を公開することで、42 Tokyoの方々のことを広く知っていただき、42 Tokyoの方々の活躍の機会が生まれることを期待しております。

※firstcircleとは
カリキュラム | 42 Tokyo パリ発のエンジニア養成機関の「自分の好きなペースで学ぶ」の章に「プロジェクト単位で学習が進むので、基礎を終えた後はあなたの好きなジャンルを、授業時間に縛られることなく好きなペースで好きなだけ学ぶことができます。」とあります。
この基礎の部分をfirstcircle、基礎を終えた後をsecondcircleと呼んでいます、たぶん…

42のfirstcircleでこなした内容

(1) libcの再実装およびその後の課題に使う便利関数の作成
strlcpy,strlcat,atoi,strchr,strdupのような関数の再実装
substr(文字列を切り出す)
strjoin(文字列を結合する)
split(文字列を分割する)
itoa(int to ascii)etc...の実装をします。
使っていい関数はwriteとmallocのみです。
コーナーケース含めて再実装しなければいけないので、「え?そんなケースもあるの?」なケースも対応する必要があります。
42のレビューでは、segmentation fault等でプログラムが終了したら、即レビューNGとなります。
そのため(1)の課題の「その後の課題に使う便利関数」においては、どのようなケースでもセグフォしないようにコードを書く必要があります。
レビューする側はセグフォさせるようにテストをします。

関連文書

(2) fgetsの再実装
ファイルディスクリプタから改行までを読み込んで返すという関数を実装します。

関連文書

(3) printfの再実装
フラグ、変換識別子は課題で定められた特定のものだけに対応します。
(3)以降の42の課題は初見では「何から手を付けていいかさっぱり分からない」状態からスタートします。
この文書を読まている方々も「C言語のprintfを実装せよ」と言われたら、おそらく何から手をつけていいか分からないのではないかな…と思います。
それでも、ググるなり、glibcのprintfの実装を読むなり、誰かに聞くなりして、課題をこなしていく必要があります。
printf再実装にあたって使っていい関数(システムコール)は以下の通りです。
malloc, free, write, va_start, va_arg, va_copy, va_end
便利な関数は一切使えません。
実装がえぐいのは、%fです。
%fの実装はボーナス課題に位置付けられているので、私はやっていないのですが、実装した方々は1ヵ月くらいかかっています。

関連文書

(4) ネットワークの基礎知識
192.168.0.0/30だとホストに使えるアドレスは2つ等、TCP/IPの基本的な知識を学びます。

(5) Dockerを使ったサーバーの構築
Debianをベースとして、MariaDB、php-fpm、Nginx、phpMyAdmin、WordPressをapt-get install等を使ってインストール、設定します。
SSLにも対応させます。
Docker Hubにある公式イメージを使っていいのは、Debianのみです。
42は、便利なものは使用せず必要最低限もの、必要最低限の関数だけが許可されており、その中でなんとかする、という特徴があります。
この課題も、Dcokerの公式イメージの使用はDebian以外許可されていないので、サーバーを1から設定します。
知っていればなんのことはない課題ですが、42は初めてプログラミングをはじめましたという方も多く、この課題ではじめてサーバーという概念を知るという方もいらっしゃるので、てこずる方々が多かった印象を受けます。
この課題で、公式ドキュメントと公式のチュートリアルは大事、ということを学びます。

(6) Wolfenstein3Dのような3Dゲームを作る
最低限の課題は、テキストのマップデータを読み込み、そのデータにしたがって3Dの迷路を構築し、迷路を歩けるようにする、です。
ボーナス課題は多種多様で、すべてこなすと普通にゲームとして遊べるようになります。
この課題で使っていい関数(システムコール)はやはり非常に限られています。
画像描画に使っていい関数も限られており、ざっくり書くと、Windowを生成する関数、そのWindowのある座標に指定したRGBのドットを描画する関数、のみが使えます。
実装はLode's Computer Graphics Tutorialを読めばOKなのですが、実装をレビューワーに説明できるようにする必要があるため、そこそこ数式を理解する必要があります。
この課題を通して、いわゆる文系の方々でも「なんとかして数式を理解して実装する」ことが出来るようになります。

関連文書


同じレベルの課題に、レイトレーシングを実装するものがあります。自分はやっておりません。
こちら方が高度な数学の知識を必要とするのですが…多くの方が普通にこなされている印象です。みんなすごいな…
どんな課題かというと、週末レイトレーシングな感じの課題です。

関連文書


(7) Bashの再実装
機能が制限されたBashを作成する課題です。
signal、pipe、fork、字句解析、構文解析を学ぶ課題です。
The Bourne-Again Shellがよい資料なので、こちらを読んで実装していきます。
字句解析、構文解析の実装方法については、ToYeah0102さんのshellの文字列分解と環境変数展開を再実装したをご覧ください。
実際の動作についてはnafuka11さんのbash再実装の課題振り返りの成果物をご覧ください。
この課題から「このケースに対応できるようにロジックを追加したら、こっちが動かなくなった」ということが頻出するので、テストをきっちり書くようになります。
42の課題は明確ではないことが多くあります。
そのため、Bashをどこまで真似ればいいのか?について悩むことになり、結果的にこれも実装しておこう、あれも実装しておこう、このケースにも対応しておこうと、なります。
例えば、
echo hello > a.txt
は、
> a.txt echo hello
とも書けます。
時間がたつにつれ、42 TokyoではBashの動作の知見がたまってきており、レビューにおいて「え?そんなケース(コマンドの書き方)知らなかった」というケースを試されてレビューでNGとなることが続出している印象です。

関連文書

(8) Kubernetesを使ったクラスタを作成する課題
minikubeでKubernetesクラスタを作成します。
ホストOS(外部)からクラスタにアクセスするためにMetalLBを使用。
Nginx(WordpressとphpMyAdminとGrafanaを配置)、FTPS(vsftpd)、MariaDB、php-fpm、InfluxDBを配置。
各Podの状態をInfluxDBに格納しGrafanaで表示。
この課題はfirstcircleの課題(基礎の課題)としては難しすぎたらしく(実際、つらかったです)、Docker Composeを使った課題に置き換わりました。
課題に指定された要件を満たす機能を公式のマニュアルを読み込んで設定していきます。

(9) アセンブラ
strdupやstrcmp他6つの関数をアセンブラで実装します。
ボーナス課題として、atoiを実装する…があります。
学ぶ内容は低レベルプログラミングの最初の50ページほどの内容です。
この課題はfirstcircleからsecondcircleに移動されました。

(10) スレッド
食事する哲学者の問題を実装し、並列処理を学ぶ課題です。
42らしく使っていい関数の制約が厳しいので、工夫して実装しないとCPU使用率が100%に張り付いて、処理遅延で哲学者がフォークをとれずに死んでいく問題を回避する必要があります。

(11) C++の機能を学ぶ課題
ここまではC言語での実装だったのですがここからはC++が使えるようになります。
まずC++の機能を把握するため、C++の機能を理解するための8つの課題を1つ1つこなしていきます。
C++はおそらくC++11以上を使うのが標準だと思いますが、42ではあえてC++98で実装することを求められます。
内容はProgramming Place PlusのC++編の言語解説を一通りこなす…に相当するかなと思います。
※こちらのHPとロベールのC++教室には本当にお世話になりました。

(12) NginxのようなWebサーバーをC++で実装する課題
Nginxの書式のConfigファイルを読み込み、HTTP1.1に準拠したCGIを処理できるWebサーバーを実装する課題です。
実装するヘッダーはすべてではなく、最低限課題で指定されたヘッダーのみを実装します。
forkはCGIの処理にしか使えないという制約があるので、1プロセスでクライアントからのリクエストを裁く必要があります。
つまり、Nginxのように、すべてのread/writeをノンブロッキングとし、selectシステムコールでI/O多重化します。
この課題は42が準備したテスターによるテストをpassする必要があります。
このテスターは、20個のworkerが5回、100MB分の小文字zが記録されたchunkedなテキストファイルをPOSTしてきます。
そのPOSTされたzを大文字のZにするCGIを介して、クライアントに返却します。
このテスターによるテストをpassするためには、クライアントからread(recv)したデータをCGIにwriteしながら、CGIからのレスポンスをreadする必要があります。(CGIにデータを送りきってから、CGIからのレスポンスデータを受信するという順次処理だとテスターをpassできない(らしい)です。)
この課題を通してRFCをちゃんと読みました。RFCをこんなに読み込むことになるとは思いませんでした…
この課題は「人間のやる課題ではない」として、内容が軟化しましたが、依然として重い課題だと思います。
この課題は2~3人で取り組みます。
実装に4か月かかりました。

(13) IPv4のルーティングを理解する課題
IPv4の設定が不完全なネットワーク構成が与えられて時間内にIPアドレス、ネットワマスク、ルーティングテーブルを書き直してネットワークの疎通ができるようにする課題です。
CCNAのシミュレーション問題の簡単版(staticルートの設定だけ)です。

(14) STLコンテナのvectorとmapとstackの再実装
テンプレートの理解と平衡二分木を実装してみるための課題…だと思います。
stackはコンテナアダプタなので、実装に時間がかかるのはvectorとmapです。
それぞれのコンテナのイテレーターも実装します。
42らしくC++98で実装する必要があるので…C++98の機能だけを実装すればいいのですが、std::enable_if、std::is_integral等C++11から実装されたものは使えないので、必要なものを自分で再実装する必要があります。
この課題はBashの再実装と違って完全にSTLコンテナを再現する必要があるのでゴールは明確ですし、テンプレート関数なのでVisualStdioCodeでは簡単に定義に飛べるので本物がどうやって実装されているかはすぐに分かるのですが、やはり最初は「何から手をつけていいかさっぱり分からない…」でした。
この課題をこなすにあたって江添亮の入門C++が大変参考になりました。

上記の課題をこなすのに要した時間について

1日平均3時間以上費やして、1年と1ヶ月かかりました。
自分の知識/経験は以下のとおりです。
・42の課題レベルのネットワークについては無学習でOK。
・42の課題レベルのサーバー構築についてはKubertenessとDocker以外はほとんど学習しなくてOK。
・PHP歴19年…しかし知識はPHP5系で止まっている…

人によって進捗はマチマチです。
というのは
・42に全力で取り組んでいる方 / 仕事や学業の合間にやっている方
・課題だけをこなす方(私です) / 課題以外にも精力的に取り組む方(こちらの方が多い印象です)
・まったくプログラミングに触れたことがない方 ~ 本職の方
と、いろいろな方がいらっしゃるからです。

現在取り組んでいる課題(firstcircleの最終課題)

(15) オンラインゲームを作成する
- オンライン対戦できるpongをTypeScriptで実装する。
- バックエンドはNestJSを使用する。
- フロントエンドは自由。
- オンラインゲームにあるあるな、チャットができるロビーも実装する。
記憶がおぼろげですが、(15)の課題のクリアすると42的にはインターンレベルとのことだったと思います。

42 Tokyoの学生の特徴について

課題の内容を見て頂いて分かるように学んでいる内容はすごく地味です。
また組織に所属して即戦力になるような内容ではないです。
しかし…(14)までたどり着いた学生以下の特徴を持っています。
・四六時中プログラミングをしていても問題ない
・ほわっとした課題に対して、なんとかして調べて実装することができる
・コーナーケースも含めてきっちりテストを書くことができる
・プログラムを書くための環境構築ができる
・公式ドキュメントを読む習慣がある
・他の人のソースコードを読んで悪いところを指摘したり、良いところを取り込むことができる

(15)の課題でTypeScriptを学んでいるのですが、C++を学んだおかげで、TypeScriptの内容がすっと頭に入ってきます。
おそらくキャッチアップは早いのではないかと思います。

42 Tokyoの学生が就職するあたっての課題について

課題の内容は即戦力となるようなものではないので、即戦力となるためには、別課題とは別に学習したり、バイト等で経験を積んだり、モノやサービスを作ってみたりする活動が必要かなと思っています。
ちょっと前まではブラックホールという42の除籍システム…一定期間内に課題をクリアしないと除籍となるシステム…の「一定期間」が短かったため、課題をこなすので精一杯という状況でした、たぶん…
そのため上記活動をする余裕はなかったと思うのですが、最近「一定期間」が緩和されましたので、徐々に即戦力となるような活動が生まれてくることを期待しています。

関連する文書


この記事が気に入ったらサポートをしてみませんか?