42Tokyoのカリキュラム紹介＆入学2.5ヶ月で感じた学習効果

この記事は[42 Tokyo Advent Calendar 2022](https://qiita.com/advent-calendar/2022/42tokyo)の20日目です。

# はじめに

- 2022/6にPiscineを受験し、2022/10より本科で学習しているtakiraです。
- この度Advent Calendarのひと枠をいただけたので、「42Tokyo本科のカリキュラム紹介＆入学2.5ヶ月で感じた学習効果」について深掘りたいと思います。  

<p></p>

- 本科のカリキュラムに関する情報は少なく、入学試験へのチャレンジを躊躇っている方が大勢いるのではないでしょうか。
- また、本科での学習は入学試験Piscineと一味違うなあと日々痛感しているのですが、世の中にPiscineの受験に言及した情報は多く見受けられる一方で、本科での学び方やその効果に触れる情報も少ないように思います。
- そこで、42Tokyoのカリキュラムや学習の流れを紹介したり、習得できるスキル（※入学2.5ヶ月目の学生視点）を紹介して、少しでも多くの人に42Tokyoを深く知ってもらい、志す人が増えればいいなぁと思い、記事を書くことにしました。

<p></p>

- 尚、本記事の内容はあくまでも入学2.5ヶ月で、42Tokyoへの取り組み方も模索中の個人の感想です。
- Qiita初投稿であり、レイアウトが残念なことになっていますが、暖かい目で読んでいただけますと幸いです。
- また、カリキュラムにの公開に関する制限レベルが明確でないため、もし問題のある内容がございましたらご連絡いただけますと幸いです。すぐに修正します。
---------------------------------------

# TLDR

- 42TokyoではFirst Circleで基礎を, Second Circleで応用を学べ、その分野は様々です。簡単に紹介しています。
- 真剣に取り組めば42Tokyo公式サイトに挙げられているスキルは身につくはずです。あと、英語にも慣れます。
- 課題の進め方や在籍期間なども紹介しています。
- 課題以外にも学生主体のイベントなど盛りだくさんです。
---------------------------------------


# 42Tokyoとは？

- 本アドベントカレンダーに限らず、色々なところで紹介されていると思うので、説明は割愛します。
- 公式サイトと、先日公開されたTwitter Liveのリンクを貼っておきます。Twitter Liveでは42の特徴・仕組み・進路や、他のプログラミングスクールとの差異等について語られています。興味がある方は是非ご視聴ください。
    - [42Tokyo公式サイト](https://42tokyo.jp/)
    - [Twitter Live 第一回 42Tokyoとは？Piscine体験会とは？（2022/12/16）](https://twitter.com/i/broadcasts/1BdxYykPeazxX)
---------------------------------------

# 学習課程と課題の内容

 学習課程は2階構成になっており、基礎課程の1st Circle、応用課程の2nd Circleがあります。


### First Circle

- Rank0~Rank6の7段階に分類されており、Rank0から順番に取り組んでいきます。
- ライブラリの再実装から始まり、お馴染み（？）のprintfやbashの再実装、2D, 3Dグラフィックをテーマとするからネットワーク関係まで様々です。
- 課題の数はRank0~6までで全26個です。
    - 選択式のものがあり、実際に取り組み評価される分は15個です。
    - 選択できなかった課題でも、問題文は公開されているため自主的に取り組むことは可能です（レビューによる評価や、下述する在籍期間の延長などは無し）。
- 各課題の所要時間の目安が公開されており、40~300時間と課題によりけりです。
- 取り組む人数も、個人のものからグループ（2~5人）で取り組むものまで様々。
- 主にC言語を使用し、[42独自のコード規約](https://github.com/42School/norminette)を遵守する必要があります。
- 主な課題は次のとおりです（関連リンクに42Tokyoの学生の記事や、成果物の紹介動画（42海外校）などを勝手にリンクしております）。
    - **Linux C Library(libc)の関数を実装する課題**（str系やmem系など約50個の関数、お馴染み？のprintfなど）
        - [https://rakiyama0229.hatenablog.jp/entry/2021/10/02/014220](https://rakiyama0229.hatenablog.jp/entry/2021/10/02/014220)
        - [https://abvi.hatenablog.com/entry/2022121300](https://abvi.hatenablog.com/entry/2022121300#%E8%AA%B2%E9%A1%8C-3--printf-%E9%96%A2%E6%95%B0%E3%82%92%E8%87%AA%E4%BD%9C)
    - **バーチャルマシンを使いLINUXの環境構築をする課題**
    - **並行・並列処理に関する課題**（食事する哲学者問題）
        - [https://nafuka.hatenablog.com/entry/2021/05/04/194200](https://nafuka.hatenablog.com/entry/2021/05/04/194200#%E9%A3%9F%E4%BA%8B%E3%81%99%E3%82%8B%E5%93%B2%E5%AD%A6%E8%80%85%E3%81%AE%E5%95%8F%E9%A1%8C%E3%82%88%E3%81%86%E3%81%AA%E4%B8%A6%E8%A1%8C%E4%B8%A6%E5%88%97%E5%87%A6%E7%90%86%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E8%AA%B2%E9%A1%8C)
    - **アルゴリズムに関する課題**（定められた操作のみで可能な限り手数の少ないソートを実装する、など）
        - [https://nafuka.hatenablog.com/entry/2021/05/04/194200](https://nafuka.hatenablog.com/entry/2021/05/04/194200#2%E3%81%A4%E3%81%AE%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%97%E3%81%A6%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E3%82%BD%E3%83%BC%E3%83%88%E3%81%99%E3%82%8B%E8%AA%B2%E9%A1%8C)
        - [YouTube](https://www.youtube.com/watch?v=8h7a7NxztkM)
    - **bashの一部機能を実装する課題**（42といえばこれ？）
        - [https://rakiyama0229.hatenablog.jp/entry/2021/10/05/120920](https://rakiyama0229.hatenablog.jp/entry/2021/10/05/120920)
        - [https://jun-networks.hatenablog.com/entry/2021/07/02/034002](https://jun-networks.hatenablog.com/entry/2021/07/02/034002)
        - [https://note.com/daitai_daidai/n/nf69533f53646](https://note.com/daitai_daidai/n/nf69533f53646)
        - [YouTube](https://www.youtube.com/watch?v=xUfdQHEYh1w)
    - **グラフィックをテーマとした課題**（minilibxというライブラリを使用　2Dや3D、ゲーム要素もある）
        - フラクタルを描画する課題 [YouTube](https://www.youtube.com/watch?v=ZM5POiGpRik)
        - 2Dゲームを制作する課題 [YouTube](https://www.youtube.com/watch?v=IcEGdGYS2Tk)
        - 3Dゲームを制作する課題（ray-casting法） [YouTube](https://www.youtube.com/watch?v=rnWRs_BBgXc)
        - 3Dグラフィックを描画する課題（ray-tracing法） [YouTube](https://www.youtube.com/watch?v=1JoTZg4Ulo0)
    - **ネットワークに関する課題**（TCP/IPの基礎知識、WEBアプリの作成、など）
        - Webサーバーの実装
            - [https://note.com/kotabrog/n/n292c0b5ef071](https://note.com/kotabrog/n/n292c0b5ef071#fb9afa05-e815-40d4-bed9-c07b1e6162f2)
        - Webアプリの制作
            - [https://jun-networks.hatenablog.com/entry/2022/12/05/234522](https://jun-networks.hatenablog.com/entry/2022/12/05/234522)
    - **C++を使う課題**
        - STLコンテナクラス（vector, map, stack, set, etc.）の再実装
            - [https://nafuka.hatenablog.com/?page=1640875320](https://nafuka.hatenablog.com/?page=1640875320)

### Second Circle

- 専門性を高める、約70個の課題があります。
- 課題に依りますが、基本的に言語は自由で、コード規約等もなく、高い自由度のもと課題に臨めます（のはず…）。
- 所要時間は数十〜数百時間、取り組む人数も個人からグループまで様々です。
- 課題数が多く全容は掴みきれていないのですが、おおよそ以下の分類と内容になります。ここに挙げたもの以外に、紹介しきれていない課題もたくさんあります。
- 課題の内容はチラ見した程度ですが、概要や、成果物の紹介動画を見つけたものはリンクを貼っておきます。
    - **アルゴリズム、数学**
        - 五目並べのアルゴリズムを実装　[YouTube](https://www.youtube.com/watch?v=1Cj9gUNN_hg)
        - グラフの最大フロー問題を解く課題　[YouTube](https://www.youtube.com/watch?v=d5b5Xp5Ikuw)
    - **データサイエンス**
        - 線形回帰、次元削減の実装
        - 機械学習ツールの実装（データ解析、可視化、グラフ化、ロジスティック回帰の実装、プラスアルファで様々な最適化アルゴリズムも実装可能）
        - ニューラルネットワークを実装する課題
    - **アセンブラ**
        - read, write, strlenなどの関数をアセンブラで実装する課題
    - **グラフィック**
        - Minecraftを作る課題(Twitter Liveで言及されていたもの)　[YouTube](https://www.youtube.com/watch?v=OaGU2lnSlws)
    - **ネットワーク**
        - tracerouteコマンドの実装
        - pingコマンドの実装
        - nmpamコマンドの実装
        - SSLの再実装
    - **セキュリティ**
        - Address Resolution Protocolを実装する課題
    - **Web**
        - 動画視聴サイトを制作する課題　[YouTube](https://www.youtube.com/watch?v=tBRCFE10srY)
        - マッチングサイトを制作する課題　[YouTubeg](https://www.youtube.com/watch?v=PYd6bTXz-3g)
        - JavaScriptでテトリスを制作する課題
    - **Linux**
        - Linuxディストリビューションをビルドする課題
        - Linux Kernelにカスタムシステムコールを追加する課題
        - カーネルを実装する課題
    - **Unix**
        - lsコマンドを実装する課題
        - nmコマンドを実装する課題
        - straceコマンドを実装する課題
        - mallocを実装する課題
    - **Unity**
        - Shadowmaticを実装する課題　[YouTube](https://www.youtube.com/watch?v=k5VcuI957bw)
        - 工場・倉庫作業ができるゲームを制作する課題　[YouTube](https://www.youtube.com/watch?v=red-O5bfLmw)
    - **Java**
    - **Swift**
        - 42の情報を表示するアプリを作成する課題（42APIを使用）
        - 3DレンダリングやTouch IDなどを使用したアプリを作成する課題　[YouTube](https://www.youtube.com/watch?v=Zn6eSUa5zOE)
---------------------------------------

# 課題を進める流れや締切
　課題を進める流れや締め切りについて紹介します。

### 課題を進める流れ

1. 取り組める課題に登録する
2. 課題のSubjectを読み、要件（提出ファイル名や作成するプログラムの挙動、使用可能関数など）を把握する
3. プログラムを作成し、Gitで提出する
4. コードレビュー（42Tokyoの学生1人による評価）を3回実施する
5. レビュー3回分の評価点が一定基準以上で合格となる。不合格の場合はプログラムを修正し、リトライする。
6. 合格した場合、次の課題を進める。

- **レビューについての補足**
    - レビューの予約はポイント制で、1レビューにつき1ポイント消費します。
    - 1ポイントを得るには誰かの課題を1回レビューする必要があります。
    - レビュワー（課題を評価する側）はレビュー可能な時間をあらかじめ登録しておき、レビュイー（課題を提出しレビューを受ける側）はその中から選択してマッチングします。
    - レビュワーにとっては、意図せぬ時間帯に勝手にレビューが入る心配はありませんが、未着手の課題のレビューが入ることもあり、
    また、レビュイーにとっては、マッチする相手のレベルに合わせた説明が求められるため、レビューのマッチングはドキドキ・ワクワク・ヒヤヒヤする要素でもあります。


### 課題の締切

- 各課題に対し所要目安時間が示されていますが、締切はありません。
- 代わりにブラックホール（以下、BH）という在籍リミットが定められており、BHまでに課題をクリアしなければ退学となります。
- 入学時点でのBHは約3ヶ月あり、課題をクリアすると課題に応じて15~60日程度のBHが付与され、在籍期間が延長されいきます。
- 参考までに、First Circlは1.5年程度でクリアすることを想定されているようです（合計1.5年ほどのBHが付与されるため）。
- 尚、First Circleを突破するとBHが無期限となり、のびのびと課題に取り組めるようになります（※今後変更される可能性もあります）。
- BHが数ヶ月先とはいえ、自分で適度に締め切りを定め、計画的に課題を進めていく必要があります。
- 私は入学直後の2週間程度、夏休み初日のような気分になり、かなりだらけてしまいました。反省しています。
---------------------------------------


# 入学2.5ヶ月で感じた学習効果の高い項目とその効果
- 入学2.5ヶ月目の私ですが、42Tokyo独自のカリキュラムにより、効果的に学習できているなあと感じる項目がいくつかありますので、紹介していきます。　
- 42Tokyoが[オフィシャル](https://42tokyo.jp/concept/)挙げている項目を適当にまとめると以下5つになると思われます。
    >1. プログラミングスキル＆コンピューターの基礎から体系的に学べる
    >2. ピアラーニングによるディスカッション・視野が拡張できる
    >3. 問題発見・解決力が身につく
    >4. 学び続ける力が習得できる
    >5. プロジェクト管理やグループワークといった実務に直結する学びもある


- 私が現在、特に学習効果を感じている項目を以下に示します。
- 公式記載のうち、**問題発見・解決力、プログラミングスキル、ピアラーニング**に相当すると思います。
- 加えて、入学するまで想定していなかったのですが、**英語力**（リーディング）も避けては通れない道でした。  
### 問題発見・解決力
- 各課題において、成果物の簡単な仕様と使用可能関数などの最低限の情報しか与えられません。
- これら情報をもとに、要件を整理してプログラムの仕様を定めます。
- 実装に必要な情報や方法、適切なテストなどは自分で調べ、考えて進めていきます。
- 取り組み方針が固まらない場合や困った時には、他の学生に問いかけたり相談に乗ってもらったり、過去取り組んだ方々が残している情報を漁ることも可能です。
- 課題に取り組む毎に未知の問題に立ち向かう経験ができるため、問題解決力を鍛える素晴らしい機会が与えられていると感じています。
<p></p>


### プログラミングスキル（コーディング）
- 課題をこなす上でライティング、リーディング力はもちろん、仕様を満たしているか確認するためにテストするケースを考える必要があります。
- また、次項と重複しますが、レビュー（レビュイー側）の際には、レビュワーのコードを読むことも可能です。この時に相手のコードから学びを得たり、改善点を指摘したりします。レビューを繰り返すことで長期記憶に定着したり、様々な実装を見て議論を重ねることができるため、徐々に洗練されていくような気がしています。
- また、正しい情報を得るためにもドキュメント（一次情報）を読む癖がついてきたと実感しています。
<p></p>


### ピアラーニング（レビュー）
- 42Tokyoの大きな特徴でもあるレビューもとても勉強になる機会です。
- 自分が課題を提出する際はレビューしてもらう側（レビュイー）、採点する側はレビュワーとして、学生同士で成果物を評価し合います。
- レビュイーは自分が書いたコードを相手が納得するまで説明する責任があります。
- レビュワーは評価項目に沿って適切にテストを行い、仕様を満たしているか確認する責任があります。この時、仕様外の挙動を発見したりコードの問題点や改善点などがあれば相手が納得するまで説明したり、不明点を一緒に考えられるとお互いにとって学びのある有益な時間となります。
- レビューでは特に自分が「わかったつもり」になっている曖昧な点が説明や質問により浮き彫りになり、理解が深まったり、他人の実装を見ることで、様々な気づきが得られるとても良い学習機会だと思っています。
<p></p>

- また、レビュワーにとって未到達の課題をレビューすることも様々な観点で勉強になる機会です。
- 個人的に、実務でマネージャーの立場からレビューするようなイメージと捉えています。
- すなわち、仕様は把握しているが、実装したことがない（実装者のみわかる注意点などがわからない）状態でのレビューで、成果物を適切に評価する立場の練習でもある、と勝手に解釈しています（なかなかレビュイーにとって有益なレビューにすることは難しいのですが...）。
- 後々、自分がその課題に取り組み実装した際に、以前のレビューで見逃していたポイントなどを発見することもありますが、こういった経験も重要な学びの一つであると思います。
<p></p>



### 英語（リーディング）力
- 課題の文面やイントラサイト、レビューの評価項目などは全て英語であり、ドキュメントも基本的に英語です。
- そのため、42Tokyoへの入学以降、英語を読まざるを得ない時間が大幅に増加しました。
- 当初は英語への苦手意識が強く、DeepLなどで全翻訳していましたが、プログラムを扱う上で英語は避けて通れない道なので（急ぎでない限り）全翻訳を控えるよう心がけています。
- まだ単語力、読解力が追いつかずリーディングに時間を要しますが、入学時点よりも確実に英語への苦手意識、拒否感は薄れていることを実感できています。
---------------------------------------
<p></p>



# 本科とPiscineの差異
- 入学試験Piscineは、本科のお試しのような位置付けですが、本科での学習とPiscineでの体験は一味違うなあと感じています。
- これはポジティブな意味であり、Piscineと比べ、本科では無駄なストレスなく学習できているためです(Piscineでのワイワイ感は薄れます...)。
- 特に、Piscineで感じるかもしれない理不尽で辛い部分は、本科では解消されるため、Piscineを諦めようとしている人や入学を躊躇っている人に届いて、踏ん張ってほしいなあと思います。
- 尚、Piscineの情報は公開できないため、ぼかした表現となることをご了承ください。
- 私が感じる、Piscineでの経験と本科で大きく異なる点はレビューの質、課題の採点基準の2点だと感じました。

### レビューの質
    
- 本科でのレビューはPiscine以上に学習の機会となっています（レビュワー、レビュイー共に）。
- 本科のレビューはレビュワー側が様々なテストを実施し、レビュイーはそれを見るという場面が多いです。
- テストは評価項目に従うものからコーナーケース、クレイジーな入力まで様々です（レビュワーに依りますが…）。
- また、レビュワーによってはコードを細部までチェックするケースもあり、そこからバグを発見してもらえることもあります。
- みっちり評価するため、課題の分量にも依りますが、レビュー1回あたりの所要時間は1~2時間程度となることが基本です。
<p></p>

- 一方、Piscineのレビューは比較的あっさりしていたと記憶しています（課題の内容・分量因でもあると思います）。
- 基本的にレビュイーがテストを回し、どう？問題なく動いてるでしょ？という流れで確認するケースが多かったように思います。
- コーナーケースまで入念にチェックした or された記憶はなく（確か...半年前のため記憶が曖昧です...）、レビューは学びの一環というよりも、課題を提出するための通過儀礼のような立ち位置でした。もちろん、他人に説明することで理解が深まる、思考が整理される、などといった効果は感じていました！
- これは、試験期間が限られており、レビュワー・レビュイーともにレビューに時間を掛け難い、また、全員がPiscine初体験のためレビューの方法が探り探りだったためだと思われます。

<p></p>
    
### 課題の採点基準
    
- 本科の採点は前述したように、基本的にレビュワー3人の評価点で決まります。
- すなわち、レビュー中にお互い納得した点数で決着することができます。
- 例えば、課題文に明記されていない仕様に突っ込まれ、不合格になりそうだとしても、自分の解釈を伝えて相手が納得すれば合格を勝ち取ることができます。
<p></p>
 
- 一方、Piscineでは不条理な評価結果となるケースがあると思います。捉え方は人によると思いますが...詳細はPiscineを受験してみてるとわかるはず...!
- 私はこれに遭遇する度に、Piscineを途中で辞めようかと思いました…（Piscine合格後、本科入学にも若干悩んだくらい）。
- 今となってはPicineの継続および入学を決意して本当に良かったと思っています。
- Piscineを途中で辞めようと思っている方や、入学を躊躇っているっている方、ぜひチャレンジを継続してみてください...！
---------------------------------------

# 課題以外での取り組み

- 紹介になりますが、42Tokyoでは課題をこなす以外にも、イベントが開催されたり、学生が自主的に輪読会を開催しており、自由に参加できます。
- 私は積極的に参加できていませんが、もう少し課題が進んで余裕が出てきたら、何かに参加してみたいなあと思っています。
　
- **公式のイベント**
    - コーディングゲーム
    - CODINGAME FALL CHALLENGE 2022
    - AWSイベント（海外校対抗戦）
    - 42海外校のキャンパスツアー
    - DMM VPoE　オープンドア
    - ●●なCode大会（Halloween, etc.)
    - etc.
　
- **学生主体のイベント**
    - 輪読会
    - ●●大会（ダーツ大会, 大喜利, etc.)
    - Advent Calendar
    - 他にも色々あるようです！
---------------------------------------

# おわりに
- 42Tokyoの紹介を兼ねて、カリキュラム紹介＆入学2.5ヶ月で得られた学習効果について述べてきました。
- 今後も引き続きサボらぬよう、学習を継続していきたいと思います。当面の目標はbashの再実装を乗り切ることです。
- この先、課題を進めていくうちに感じ方が変わってくると思いますので、その際にはまた記事を書いてみたいと思います。
- 尻すぼみ感が否めない長文になってしまいましたが、ここまで読んで下さり有難うございました！　
<p></p>

明日は、[@ryo_manba](https://qiita.com/ryo_manba)さんにより「タイムアウト付きfgetsを実装してプロセスとスレッドの使い方をざっくり理解する」が投稿されます。お楽しみに！