42 Tokyoを(ほぼ)卒業したので、今までの活動をすべて振り返ってみた
42 Tokyoに入って早2年。
ようやくFirst Circle(基礎課程)最後の課題をクリアすることができたので、今まで取り組んできた課題について、振り返りたいと思います。
42 Tokyoって何?
42 Tokyoでおこなったすべての課題の振り返り
今後どうするか
についてざっくり書いていきたいと思うので、
42 Tokyoに入りたいと思っている人
今42 Tokyoに通っている人
42 Tokyoでどんなことができるのか知りたい人
にはきっと参考になる内容になるかなと思います。
42 Tokyoって何?
最初にざっくりと42 Tokyoについてご紹介したいと思います。
詳細についてはまぁこちらを見るのが一番だとは思いますが……
ざっくりというと、42 Tokyoとは、フランスで生まれた、無料だけど入学試験が過酷な、先生がいないエンジニアの養成機関です。
教えてくれる存在としての先生はいませんが、解くべき課題は与えられていて、それを仲間と助け合いながらクリアしていくことで、高いレベルのエンジニアとしての能力が学べるようになっています。
入学試験の感想記事や、先生がいないのに成り立つの?ということについては日本語でもたくさんの記事があるので、ここでは課題の振り返りに関係する入学後のカリキュラムについて少し詳しくお話ししたいと思います。
Tokyo校に限らず42では、基本的に道なりに課題をこなすFirst Circle(基礎課程)をクリアしたのち、自分の興味のままに学ぶことができるSecond Circleに入るという流れになっています。
First Circleでは課題提出の期限が決まっていて、それを超えるとなんと退学という普通の学校ではあまり考えられない重い処分が問答無用で下されることになります。
First Circleを超えさえすれば、(現状では)その退学処分の期限もなくなり、42で自由に学び続けることができるようになるので、42に入った人の一番の目標はこのFirst Circleを超えることになるわけです。
ここでタイトルにある「卒業」の意味についてなのですが、Second Circleに突入すると永遠に42で学び続けることができるため、42ではあまり卒業という概念がありません(多分)。
ですので、42が公式に言っているかは確認していないのですが、42生の目標であるFirst Circle越えを成し遂げることをよく「卒業」と表現しています。
実際、このあと書く課題の振り返りを見ていただければわかると思いますが、卒業というにふさわしいだけの内容をFirst Circleでは学ぶことができると思います。
そんな42のFirst Circle最後の課題をクリアしたので、今回は今までの活動の振り返りを書こうと思いました。
42 Tokyoでの活動の振り返り
ということで、ここからは42 Tokyoでの活動を振り返っていきたいと思います。
42では課題文自体を共有することは禁止されていますが、自分で作成したプログラムを共有することは許されているため、
何を作ったか
どんな技術を使っているか
などを中心に書いていきたいと思います。
作ったもの単位でのgithubでのリンクも貼っていきますが、全体へのリンクはこちらになります。
また、課題は変更されることもあるので、今42に入ればこれらの課題をすべてやることになる……というわけではありません。あくまで私がクリアした課題の振り返りになります。
Libft
まず最初に作成したのは、C言語のライブラリでした。
プログラミングの勉強ではよく「車輪の再発明」を行いますが、その第一歩として、限られた関数や機能の中でこのライブラリを作成しました。
例えばC言語では「strlen」という文字列の長さをはかる関数がありますが、それをこのライブラリでは「ft_strlen」として実装しています。(もちろんstrlenを使わずに)
ここで作った関数たちは後の課題でも使用することができるので、まるでRPGで武器を手に入れたときのような気分になったのを覚えています。
技術的には、この課題では、C言語の基礎はもちろん、ヘッダーファイルやMakefileの書き方なども学びました。また、コーディング規約やコーナーケースを注意深く気にすることの大切さも学びました。
……まぁ学んだといっても、直接教わったわけではなく、課題をクリアするために仲間と正解を探しながら自分で学んだという感じですが。(それが42で学ぶことのいいところでもあります)
ネットワークのお勉強
次に、ネットワーク系のお勉強……つまり、普段見ているWebサイトなどがどのように通信して表示されているのかということを学びました。
こちらはたしかテストっぽい形式で、自分で作成したプログラムを提出するという感じではありませんでした。
こちらの勉強は(知る人ぞ知る)3分間Networkingで学んだり
ついでに応用情報の勉強をしようと思い、教本を買って学びました。
ファイルを1行ずつ読む関数
次にget_next_lineという関数をCで作成しました。
この関数はファイルを1行ずつ読む関数で、Cでのファイルの扱い方なんかを学びました。
規模的にもLibftから少しレベルアップです。
printfの再実装
ここから一気に難易度が上がって、printfの再実装を行いました。
printfはプログラミングを始めた初学者がまず最初に試す「hello world」と表示させる関数ですが、それを実装するというのはなかなかおもしろくてキャッチーだと思います。
私は課題の追加仕様もしっかりと実装したので、以下に対応したprintfになっています。
フラグ:-0#' '+.*
長さの修飾子hh, h, l, ll
変換指定子:cspdiuxX%nfge
特に小数点を表示するのが大変で、四捨五入がどのように浮動小数点で行われるのかを学び、その仕組みを実装するのには苦労しました。
また、今まではそこまで1つ1つのボリュームも大きくなかったため、大きいプログラムを作ることの難しさも感じました。
Dockerのお勉強
次にDockerでnginx, mysql, wordpressの環境を、ベースとなるDockerイメージを最小限にして実装することを行いました。
Dockerとは、違う環境(違うPCとか)でも同じようにプログラムを動かすための環境づくりの仕組みです。
今ではだいぶDockerともお友達になれましたが、私はもともと環境構築的なことが非常に嫌いで、この課題にはかなり苦労させられました……。
この課題はDockerの扱い方を学ぶことはもちろんですが、それは前提として、一番大変なのは、それぞれの環境の作成とそれを連携させることだと思っています。
ですので「よし、Dockerについては理解したぞ!」と思った後に、「なんだ、ここからが本番か……」と落胆したのを覚えています。
lsコマンド
こちらはメインの課題ではなく、イベント的なもので作成したものになります。
lsコマンドの一部の機能を実装しました。
↑こちらに飛ぶとわかりますが、lsとは、フォルダ内のファイルやフォルダの一覧を表示するコマンドで、そのlsコマンドの特定のオプションのみに対応させたものになります。
こちらは何かのイベントで作成したので、そんなに新しいことを学んだという感じではありませんでしたが、このあたりからREADMEの書き方にこだわりを持つようになりました。
ここ以前のREADMEもこの時期に作成したのもので、作成の仕方の記事がプチバズリしたりもしました。
nodeとvue
これも何かのイベントで作成したのですが、nodeとvueの基礎を学びました。
本当に基礎的な部分だけ、ちらっと触ったという感じです。
mini ray tracing
次はかなり時間をかけましたが、ray tracing(レイトレーシング)をC言語でおこないました。
ray tracingとは、目に入った光の経路を計算して、画像や動画などを描画する手法です。
最近ではすごいリアルなゲームなんかでも使われている手法ですが、それを1からCで作成するというのはなかなか大変でした。
画面に描画するためのライブラリは用意されていましたが、それを使って実際に光の経路を計算し、平面や球体なんかを表示できるようにしました。
私は大学で数学を学んでいたので、光の計算などにベクトルを使うことにあまり抵抗はありませんでしたが、数学が苦手な方にとっては本当に大変な課題でしょう……。
また、今までは関数……つまり一つの機能の実装でしたが、今回初めてこれ単体で使用するプログラムを作成したので、そこも大きな前進であり、大変なポイントでした。
assembly
コンピューターに最も近い言語の一つであるアセンブリ言語を学びました。
42では一番最初にCのライブラリを作成しますが、そこで使用が許されているとても基本的な関数の一部を、ここでは実装します。
もっとも基礎的なものよりさらに基礎的なものがあった……という発見ができるのはなかなか良い演出だなと思いました。
Cを触ったことがあるというプログラマに比べると、機械の言葉に近いアセンブリを触ったことがある人はなかなかいないと思いますし、CPUとどのようにやりとりしているのかを考えるのは面白かったです。
アルゴリズムのお勉強
続いては、制約がある中でのソートの効率化についてです。
これはなかなか説明が難しいのですが、決められた制約の中で、特定の動きのみを使用して、いかに短いステップで数字の列をソートするか……というのを解くプログラムを作成する課題になります。
ですので、単純にソートアルゴリズムを勉強してそれを実装するのではなく、そのアルゴリズムを理解し、どのようにこの問題に落とし込むのかというところまで問われている課題になります。
このころには仕事でpythonなども使っていたため、テストプログラムをpythonで自作したりもしました。
初めてのチーム課題
イベントでチーム課題を行いました。
プログラムの中身はたしかテストを行うためのプログラム……だった気がするのですが、中身はいいとして、42で初めてのチーム課題でした。
今までは仲間と協力して相談したりはしていましたが、プログラムを作成するのはあくまで一人。
そんな中ではじめてのチーム課題でしたので、どのように課題を進めていくのか、という点がとても勉強になりました。
minishell
続いては、shellをC言語で作るという課題になります。
こちらはチーム課題でしたが、様々な機能を実装する必要があり、とても大変だったことを覚えています。
shellとはいわゆる「黒い画面」を成り立たせるやつで、ユーザーからの入力を待ち、その入力に応じてプログラムを実行するプログラムになります。
ここではプログラムを実行するためにプロセスを作成したり、プロセス間の通信を行ったり、shellの仕様を勉強したりと、新しいことも多く、さらにどんな入力に対してもしっかりとプログラムが応答するように「壊れない」ことを意識しなければいけないため、これまた1段レベルが上がったような課題でした。
pipex
課題の変更の波にのまれて、ここからはしばらく今までの復習のような課題が続いたため、爆速で課題をこなしていきました。
まずはshellの一部の機能に絞ったプログラムです。
shellの実装をしたあとに、shellの一部の機能の実装をするという、はちゃめちゃな順番だったため、こちらの課題はほとんど前の課題のコピーでおわらせてしまいました。
フラクタルな図形
続いてはフラクタルな図形を描画する課題になります。
こちらは↑このリンクを飛んでもらうとわかると思いますが、フラクタルな図形を作成する課題で、ray tracingの課題の易しい版になります。
フラクタルな図形とは、アップしてもいつまでも同じような図形が続くような図形のことで、性質としてはとてもおもしろく、大学のころから好きな図形でした(?)。
哲学者
ここでまた新しい内容になりますが、食事する哲学者の問題の勉強をしました。
何を言っているんだと思うかもしれませんが、どうやらよく使われるたとえ話らしく、並列処理に関する問題を扱う時によく登場するそうです。
詳しい内容は省きますが(設定がぶっ飛んでいるので、調べてみると面白いかもしれません)、ここではスレッドや並行処理などについて学びました。
新しい概念ではありますが、実装量としてはminishellよりはかなり少なかったため、ささっと課題をクリアしました。
またまたネットワークのお勉強
最初のころにネットワークの勉強をしていましたが、こちらは知識を問う要素が少し減って、実際にポート番号とかをどう設定すればいいか、みたいなところに注目した課題でした。
……とここで復習的な内容は終わり、ついにC言語から離れ、次からはC++の勉強に入ります。
CPP-module
C++について、とにかくたくさんの細かい課題をこなしていきました。
とにかくたくさんあって、数をこなすのが大変でしたが、C++の基礎をしっかりと勉強することができました。
nginxの再実装
続いては、学んだC++を用いて、nginxの再実装を行いました。
nginxとは有名なWebサーバで、Webサーバとは、URLを送ったらそのURLにそったページなどを返すやつのことです。
こちらもチーム課題で3人でなんとか作り上げることができました。
nginxについては他の課題でも触れていたので、なんとなくは知っていましたが、それを実装するってなんだ……というところから始まったので、これまたかなりレベルアップした印象でした。
実際にchromeでWebsiteを表示できるようにしなければいけないので、通信のプロトコル(ルールみたいなやつ)や、nginxの仕様を調べることはもちろん、実装も重いのでとても大変でした。
コンテナクラスの再実装
続いては、C++のコンテナクラス……vectorやmapの実装を行いました。
こちらは一つ前の課題とは違って、C++を「使う」というよりは、「より理解する」ための課題だと思います。
詳しくは説明しませんが、vectorもmapも非常に基本的なクラスで、C++を使う人ならほとんどの人が知っているものだと思いますが、それを実装する課題になります。
実装上大変なところとしては、templateという機能をもりもりに使うところや、vectorとmapのデータ構造……とくにmapの木構造(赤黒木を使用)を理解して実装するところだと思います。
Docker Composeのお勉強
続いてはDocker Composeのお勉強になります。
最初の方で書いたDockerのお勉強のところで作成したものを、今度はDocker Composeで作成するという感じになります。
Docker単体で実装したときに比べると、各コンテナ(それぞれの環境)のネットワークの問題を考えたり、より実践的な状況を考えた設定になっていた気がします。
Webアプリの作成
そしていよいよ最後の課題……ゲームやチャットができるWebアプリの作成です。
https://github.com/syamaguc/ft_transcendence
First Circle最後の課題ということで、5人チーム課題、新しいtypescriptという言語、使ってよい関数等の縛りはなし、そしてそれ一つで完結したWebアプリの作成と、まさに今までの集大成という感じです。
機能としては、ユーザーの登録やフレンド、ブロック、チャット、ゲームなどができるようになっていて、私は主にゲーム部分を担当しました。
技術的にはバックエンドはNestjs、フロントエンドはNextJSというフレームワークを使ってます。
今回の課題では、今まで学んできた知識を使うのはもちろんですが、チームで何か新しいプロジェクトを始めるときに、そこに必要な技術なども含めすべて1から調べて形にする力、が問われていたと思います。
42 Tokyoでの今後の活動について
ということで、すべての課題について振り返ってみました。
こう並べてみるとなかなか数が多く、そして課題のつながりにストーリーを感じるなと思いました。
このあとはいよいよSecond Circleへ……といきたいところなのですが、実は私はまだFirst Circleを突破していません。
最後の課題をクリアしたのに、どういうこと?という話なわけなのですが……実はテストを受ける必要があるのです。(これがタイトルに「ほぼ」とついている理由です)
今まであげてきた課題はすべてオンラインでできるのですが、さすがにテストをオンラインで行うわけにもいかないため、校舎に行ってテストを受ける必要があります。
ですが、校舎、遠いなぁと思っていて、もしかしたらこのままテストは受けずに退学するかもしれません。
その場合、Second Circleの景色は見ずに終わるわけですが、42で学びたいことは十分に学べたとすでに満足している自分もいます。
まだ退学までの猶予は残されているので、それまでゆっくり考えようかな、と思っている今日この頃です。
そのほかの今後の活動について
ではテストを受けないで何をするのかというと、今まで42に熱中していたために「作りたいな!」とか「勉強したいな!」とか思いつつもできなかったものに触れていこうかなと思っています。
例えば、私は機会学習系のプログラムを書く仕事をしているのですが、今までは画像系の仕事に縁が多かったので、今話題の絵を描くAIの勉強をしてみたり、はたまた全然関係がない分野の勉強をしたりしてみたいなと思っています。
また、最後の課題でWebアプリを作ってみて、ゲームを作るのっておもしろいなとか、アプリを作ってみたいなとも思いました。
さらに、42で車輪の再発明を散々してきたので、それをきわめて自作OSや自作言語づくり、(ちょっとやりましたが)自作機会学習ライブラリ作りにも興味があります。
こんな感じで興味は尽きそうにないわけですが、こうやって興味を広げてもそれを回収できるだろうなと思うことができるのは、きっと42のおかげだと思っています。
ですので、もし42を退学しても、2, 3ヶ月後に気が向いてテストをうけてそのまま残ることになっても、何かしらの形で42の人とはつながっていたいなと思っています。
ということで以上振り返りでした!
自分よ、(ほぼ)卒業おめでとう。
追記
テストをうけてちゃんと卒業しました!
今はSecond Circleの課題もびしばしやりたい気持ちでいるので、引き続き頑張っていきたいです。