1. はじめに
私は現在、以下の教育機関に所属しています。入学後1年で義務過程(first circleと呼ばれる)を終了したので、その感想をまとめようと思います。学校の規約で課題の詳細については述べられないことをご了承ください。
前半はこちら
対象読者
- 42Tokyoに興味がある方
- Computer Scienceの体系的な学習に興味がある方
本記事で述べること
- 42Tokyo本科課題に関する以下の内容
- 課題で筆者が学んだ要素
- 課題のつまづきポイント
- その他感想
本記事で述べないこと
- 本科課題の詳細設定
- 本科課題の解法、解答コード
- 本科課題の参考資料
- その他課題を実際に進めるために有益な情報
2. miniRT
概要
RTとはレイトレーシングの略称です。レイトレーシングとは、コンピュータグラフィックスの手法の一つで、3D描画の計算を現実的な計算量に抑えて行えるというメリットがあり、Nvidiaも解説の動画を出しているほどポピュラーです。
この課題ではファイルを読み込んでレイトレーシングを用いてファイルの内容を描画するプログラムを実装します。
この課題から学べること
- レイトレーシング法
3. NetPractice
概要
パズル形式のテストを通じてインターネットを支えるTCP/IP、IPアドレスやサブネットマスクについて学んでいく課題です。
この課題から学べること
- IPアドレス
- サブネットマスク
感想
課題をクリアするだけなら1日程度の投下時間で済むという話を伺っていました。私はインターネットの全体感を掴みたかったので1週間ほどインプットに費やした後に課題特有のコツを友人に伺ってクリアしました。
最終課題のft_transcendenceでこのインプットが活きて非常に感動したので、ある程度の時間を使うことを強くおすすめします。
4. cpp
概要
ここまでの課題はすべてC言語でしたが、ここからはC++を使用するため、その入門的な課題です。実際は細かく単元分けされた複数の小課題で構成されています。
クラスが使用可能になったため、オブジェクト指向やポリモーフィズムを段階的に学んでいきます。
この課題から学べること
- クラス
- 継承
- オブジェクト指向
- ポリモーフィズム
- etc
感想
あんまり自由度が高くなく面白みに欠ける課題であるため、地味にだらだらとスタックする人が多い印象です。僕は全10個のcpp課題を一人で勝手にcppPiscineとして3週間に凝縮して乗り切りました。
キャストやテンプレートが1単元だったり、コンテナの勉強ががっつり必要なのに1単元だったりで一つ一つの重みが全然違うのも疲れる要因の一つかなと思います。
5. ft_irc
概要
IRCとはInternet Relay Chatの略称です。インターネットを通じて複数の利用者がリアルタイムに文字メッセージを交換することができるチャットシステム、あるいはそのプロトコルのことです。
ソケット通信を学ぶ課題で、別のターミナル同士でのチャットを可能にするサーバーを実装します。実際にあるirssiなどのIRCクライアントでも動作するように結構厳密にプロトコルを踏襲する必要があります。
この課題から学べること
- プロトコルとはなにか
- IRCプロトコルとはなにか
- ソケット通信
- ソケット通信のエラーハンドリング
感想
本科の課題は複数種類のプロセス間通信を学んでいくものなのかなと確信した課題です。(ここまではシグナル、パイプ、マルチスレッド等)
ソケット通信に必要なsocket()やsend(), recv()が内部ですごいことをやっているのに、非常に簡単なインターフェースの提供で済んでいることを理解して震えました。
6. Inception
概要
Dockerの使用法を学ぶ課題です。変な縛りのもとで複数のコンテナを立ち上げる必要があります。
この課題から学べること
- Dockerの使い方
感想
本科に入って一番虚無感が強かった課題かもしれないです。非現実的すぎる課題制約かつ指定されたサービスの初期化設定が一番しんどくて嫌いでした。
Dockerは便利なことはわかりましたが、これがfirst circleの最後の個人課題なのが残念でした。
7. ft_transcendence
概要
first circle最終課題です。Pongゲームを遊べるSPAのウェブサイトを実装します。要件で指定される言語やフレームワークが比較的頻繁に変わる課題なので過去資料が参考になりにくいです。
フロントエンドもバックエンドも実装するのでウェブサイトの実装の全体感が掴めます。
この課題から学べること
- Web開発の基礎
- フロントエンド
- バックエンド
- API設計
- 非同期処理
- etc...
感想
4人のチームで3ヶ月かかりました。僕はゲームとしてのコア機能となる別端末同士の通信対戦を担当しました。必要なWebSocketのバックエンドとそれを使うフロントエンドをどちらも実装しました。
全く何も知らない状態から始まり、いったん作ってみては壊しを3回くらい繰り返して合計1万行くらいロールバックをしてようやく通信対戦機能が完成したときは達成感に溢れました。
Djangoの最初のページから始まって、チームメイトの実装でどんどん形になっていく様はワクワクして3ヶ月があっという間で非常に充実していました。
反省点としては、API設計を最初にやることが大事だなと思いました。それをやっておけば前述したロールバックは防げたんだろうということと、タスク分割も容易になって過労で死にかけることもなかったなと思いました。
8. おわりに
ここまでお読み頂きありがとうございました。無事にfirst circleを終了出来て少しほっとすると同時に、second circleの内容も非常に楽しみでなりません。
僕は低レイヤーよりは実務っぽいレイヤーに興味があるのでモバイルアプリやゲームエンジン系のブランチに進みたいと思います。
これを読んで少しでも課題のイメージがついて42Tokyoに興味が湧いていただければ幸いです!