42Tokyoに10月入学してからの2ヶ月を振り返る

こんにちは。42Tokyo(以下 42) というエンジニア養成機関の 2022 年度アドベントカレンダー 13 日目を担当します、2022 年 10 月入学の在校生です。

qiita.com


2022 年 6 月に 4 週間の入学試験 Piscine を受けて(体験記はこちら) 42 に入学してから約 2 ヶ月が経過し、rank0, rank1 の課題 計 4 個をクリアしたのでその記録と普段の 42 の様子を振り返ろうと思います。


42の課題とは


概要

まず 42 では授業などはなく各々のペースである程度決まった順番で課題を選択して取り組み、クリアすると在籍可能日数が増えるという仕組みになっています。
全員がまず取り組む CS の基礎コース (通称 first circle。rank0 ~ rank6) では流行りの技術などはほぼ出てこなくて*1、基礎が自然と身に付いていくような課題で構成されている気がします。


所要時間

ざっくりここ 2 ヶ月でクリアした各課題の(あまり当てにならない)推定所要時間と私が雑に計測している所要時間です。

推定所要時間 実際の所要時間
課題 1 70 時間 43 時間 + 1~2 時間のレビュー 9回
課題 2 70 時間 22 時間 + 1 時間位のレビュー 3回
課題 3 70 時間 67 時間 + 1 時間位のレビュー 6回
課題 4 40 時間 48 時間 + 2 時間位のレビュー 4回


これはあくまで参考で、得意不得意や周辺知識をどれだけ調べながら進めるかなどによって ± 数十時間の個人差があると思います。
課題自体はシンプルなものが多いのですが、結構時間がかかる理由はこの辺りかと。

  • 今のところ C 言語
  • メモリ操作以外のライブラリ関数がほぼ使えずシステムコールのみなどに限られている*2
  • 自分で確保したメモリ領域は自分で開放する
  • 独自のコーディング規約
  • レビュー
  • 必須ではないボーナス課題にプラス数十時間

あとは割と片手間にダラダラと取り組んでしまうので普通に時間がかかっています、良くない。


これが今 first circle のどのくらいなのかというと、どんどん課題が重たくなるそうなので正直よく分かりません。
例の推定所要時間から計算すると 13% といったところらしいです。割と速いペースな方だと思うのですがこのままだと 1 年経っても終わらないですね….。

時間で言うとこれ以外に課題に直接関係しない調べものや読書会、他の人のレビュー見学、Discord のボイスチャットで雑談したりイベントに参加したりに月 60 時間くらい使っているらしいです。その内ほとんどがボイスチャット雑談であり…楽しいし為になるのですが恐ろしい…。


課題 1 : 43 個の便利関数を自作


概要

libc にある標準関数や指定されたその他便利関数を write, malloc, free のみを使って計 43 個自作する。*3
man や指定された仕様に沿ってエラー処理も含めて作成します。

ワイルドカードなどは禁止なので Makefile はこのような感じです。ft は forty-twoの略のよう。

感想

入学当初でやる気も高いので一旦 3 日くらいで終わらせレビュー。初めて本科のレビューを受けて改善点や修正点をバシバシ指摘していただいて、それがどれも納得のいくもので楽しかったです。
修正 → レビュー を繰り返したくさんレビューを受けることで色々な人の着眼点を知り勉強になりました。42 の面白い制度です。

この課題はレビューで結構細かいところを見られることも多いのですが、次からの課題でこれら自作関数を使っていくのできちんとエラー処理をしていたことにより助かる~と思うことが多々あり、この為でもあったのかと気付かされています。
課題終了後も適宜修正したり欲しい関数を作って追加したりしています。


ちなみに入学後の最初の課題とあって同月に Piscine を受けた人達と数か月ぶりに再会し、一緒に取り組んでいる感があって心強かったです。
ちょっと量が多いのですが他の人の自作関数を見る(レビューする)のも面白いです。

調べたこと

man、Makefile、ヘッダファイル、アーカイブファイル、ファイルディスクリプタ、メモリ領域、オーバーフロー、NULL ポインタ、malloc、free、const、static、関数ポインタ、連結リスト、C 言語の 2 次元配列、エラー処理、構造体 など


課題 2 : ファイルディスクリプタから1行ずつ読み込む関数を作成


概要

一度に read するバイト数がいくつに指定されても get_next_line(fd) と呼ばれたらデータを 1 行だけ返す関数を作る。ボーナスは複数 fd にも対応。

感想

これは結構好きな課題で、コード量は多くないのですがコンパクトにまとめようと思うと考えることが割と多く頭を悩ませました。
特に課題で指定されている malloc に失敗した場合も考慮しながら、関数の個数制限や行数制限内でメモリリークなしで分かりやすく書く方法を考えるのが面白かったです。

調べたこと

ファイル操作 (open, close, read)、malloc 失敗時、valgrind、static 変数・メモリ領域の違い など


課題 3 : printf 関数を自作


概要

そのままの意味で、printf 関数の挙動を真似て自作します。対応するフォーマット指定子は %c, %s, %p, %d, %i, %u, %x, %X, %%
ボーナスは追加で width と precision を含む 0, -, +, スペース, #, . フラグに対応。

このように自作関数 ft_printf が呼ばれた時に本家 printf と同じ出力と返り値になるようにします。

int ft_printf(const char *format, ...);

int res1, res2;
res1 = ft_printf("%c %s %p %d %i %u %x %X %%", 'a', "hello", 0, INT_MAX, INT_MIN, 42, 255, -255);
res2 = printf("%c %s %p %d %i %u %x %X %%", 'a', "hello", 0, INT_MAX, INT_MIN, 42, 255, -255);

ボーナスはこのようなフラグが組み合わさった入力にも対応する必要があります。

ft_printf("% -8.13d\n", 1234);
ft_printf("%     -08.13d", 1234); // warning ですが一応対応


感想

入学前から大変そう~と思っていた課題です。
実際ボーナスまで対応しようとすると結構大変でした。

ボーナスのフラグがなければ素直にフォーマット指定子を判定して出力していく実装で十分ですが、フラグに全部対応しようとするとなかなかにパターンが多いです。フラグが複数ある時のエラー・未定義動作・優先度・フォーマット指定子による違いや、width と precision の優先度など。
一旦は何も見ずに自分で条件を整理して作ってみたかったのでどの組み合わせだとどういう結果になるのかという調査に数日、そこから上手くまとめられそうな条件まとめに数日、やっと実装といった感じでしばらくは printf の結果を凝視する日々でした…。

私のまとめとしてはこのように出力予定の文字列を 5 個のブロックに分け、各ブロックのサイズを求めてから出力を一旦配列にセットし、最後に一度だけ出力するという実装にしました。
1 番上手くまとめたかった各ブロックごとのサイズを求める部分の実装が %c %s %p %%%d %i %u %x %X に分けて 2 つの関数で済ませることができたのでちょっと工夫できたかなと思っています。

少し前までは %f なども必須だったらしいですが今はなくなっています。浮動小数点の扱いは勉強になりそうですが大変そうです。

調べたこと

可変引数(va_list)、ひたすら本家 printf の挙動 など



このあたりで課題をクリアすると増える経験値により level 2 になり、42 ロゴ入りパーカーを頂きました、普通に嬉しいです。
ちなみに 42 について話しても一切興味関心を示さなかった母がロゴ入りパーカーを見せた途端 "42" という名前をメモしていました。やはりロゴ入りの何かというだけで強いのでしょうか…?


課題 4 : VirtualBox 上で Linux の設定やらをする


概要

VirtualBoxLinux ディストリビューションを入れて各種設定、色々使えるようにするという課題です。
ボーナスはこの中で WordPress を使えるようにするなどなど。

感想

プログラミングについてほぼ競技プログラミングしか履修してこなかったのでこういうのが 1 番知りません…。

一旦休憩して「Linux のしくみ」を読む読書会に参加しました。

毎日 1 章読んで気付いた点や疑問点などを共有し、分からないことは調べたり分かる方がいれば教えていただいたりしました。読書が習慣づくのがありがたいだけでなく、話してる内に概念が分かってきたり、自分がスルーした点に疑問を感じる方がいて興味深かったり、 1 人でただ読むよりも記憶に残ると思いました。
Linux の全体像をうっすら知れたことで 分からない所が分からない から、あの辺のレイヤーの話っぽいが分からない くらいにはなった気がします。

次の課題ではここで知った概念が常識として登場するので参加して良かったです。

調べたこと

Linux, VM (Virtual Machine), LVM (logical volume manager), パーティション、ユーザ、グループ、sshufw、パスワードポリシー、sudo設定、定期実行、Bash script、サーバ、データベース、WordPress など


読書会のような集まりが 42 では自由に始まるのですが、個人で人を巻き込んで始まるもの・雑談の中から自然発生するもの・イベントから派生して作られるものなどなど何かを立ち上げられる人がいて、それも結構多くて、恥ずかしいみたいな空気がない環境なのが良いところでもあると思います。


不定期 (定期?) 開催 : 週末だけで初めての課題にペアで挑戦


概要

約 2 日半でランダムで組まれたペアで課題を提出まで持っていきます。
今回初めて参加したのですが Piscine でよく形容される"つら楽しい"というやつでした。ややつら多め。

というのも、内容が yasl というマイナー過ぎるスタック指向言語で解くという課題でした。
調べて出てくる yasl とはどうも違う言語で、英語の man ファイルという形で配布されたもの以外に情報がありません。
色々試してみるとやっとスタック指向という意味が分かってきます。*4

例えばこのように書くとまずスタックに 3 が積まれ、5 が積まれ、+ が来たので 5 と 3 が取り出されて 5 + 3 をした結果の 8 がスタックに積まれ、print するとスタックの 1 番上の 8 が取り出されて出力、スタックが空になる…のような感じです。

#!yasl
3
5
+
print


簡単なプログラムから試して仕様を把握し、7 つの基本的なプログラム (但し yasl では難易度が高い) と最終的に base64エンコードされた画像ファイルをデコードしてターミナルに256色で表示させるプログラムを作成しました。

256色

256色に変換する前の RGBカラー*5

感想

1 人では全部はできませんでした。
まず仕様把握が難しいが?base64 とは?デコード/エンコードとは?ターミナルにどうやって色を?分かったとてそれを変数もない yasl でどうやって実装する?と全部分からないところからのスタートで、分担して作業できたことで何とかボーナス以外を形にすることができました。
一緒に参加していた他の人ともあーだこーだ言いながら頑張ったのが大変かつ楽しかった思い出です。

ボーナスのマンデルブロ集合を表示させるプログラムは着手までもいかず…ですが、初めての言語でも何とかなるものだなという謎の自信が少しつきました。


その他イベント


イベントが結構多く、 42 主催のものと学生主催のものがあります。 参加したものだとこのようなのがあり、

  • 新入生歓迎会
  • 新しい 42 スタッフさんに質問したり話をしたりする会
  • 42 海外校含めた AWS の会
  • Google 社員の方が来て体験談や模擬面接などをしてくれた会
  • 42 Heilbronn (ドイツ), 42 Paris と中継を繋いでスタッフさんや学生による校舎案内・説明・質疑応答 *6

その他参加していないものだと 企業説明会・地理オリンピック・CTF など色々あります。
興味がないけど参加してみたら予想以上に面白かったということが多いのでイベントのありがたみを感じています。


今は何を


今はこの課題に取り組んでいます。

標高マップのファイルから 1 行ずつ読み取り *7、それを構造体に格納。標高を split して文字列なので数値に変換 *8。 もちろんファイルやマップのエラー処理もしつつ *9、座標に変換して3D っぽくなるように回転した点と点を繋いでいきそれらを window に描画していきます。

この window を扱うというライブラリも 42 から配布されたものを使うので仕様を把握し、Linux 環境でテスト。*10

今まで課題で自作してきたものを集めてちゃんと動作するプログラムが作れた時はちょっと嬉しかったです。

ここからマウスやキー操作を hook にして拡大・縮小や上下左右回転移動ができるようにしたり、色を高さごとにグラデーションにしたりする機能を追加していく予定です。


…が、最近は Go に寄り道したり次の読書会に参加したり C++ で LeetCode を解いたり (レビュー見学をしたり(ボイスチャット雑談したり))していて課題に身が入っていない状態です。

全部自分のペースで課題ができる分、ペース配分やモチベーションの維持なども自分次第なのでなかなか難しいです。そんな時は誰かしらがいるボイスチャットに行って雑談したり課題やプログラミングの話をしたりして更に時間を溶かしつつ楽しんでいます。
面白い人がたくさんいるので興味のある方はぜひ。


そういえば今ならなんと…!Piscine 体験会がオンラインで開催されるそうです…!珍しい。(追記 : 複数回開催が決まったようです。)
私は以前 2 週間体験版 Piscine に参加したことでだいぶ変化が起きたので、何かのきっかけになる方がいるかもしれません。できてもできなくても普通に楽しそうです。


課題でどんなスキルが?

今のところ未知なことについて調べる力がついてきた気がします。英語で調べることに前ほど抵抗がなくなってきたり、プログラムの全体の設計や機能ごとに関数分けをすることに徐々に慣れてきたり。知らないこと・できないことが大量にあるということも分かったり。

レビューは勉強になることだらけですし、C 言語を使うことで Python などを書いていた時には気にしなかったメモリやポインタへの理解も少し深まりました。

あと意外とコミュニケーション能力がつく気がします。
これからペア課題もあるのでチーム開発のようなことができるのも楽しみです。


おわり

アドベントカレンダーという名目を使わせていただき、ただ自分の 2 ヶ月を振り返りました。入学前に想像していたより多くの体験ができているので貴重な場だなと改めて思います。


明日12月14日は Piscine & 入学同期の knitta さんが「How to build your blog」という記事を書いてくださるようなのでそちらも是非読んでみてください!
では~


*1:最後の方では Docker や TypeScript を使うものなどはあります

*2:使用可能関数は徐々に増えていくらしいです

*3:数えてみて 42 個じゃないんだなと思うなど

*4:アセンブラに似てるらしいです

*5:あらゆるターミナルに対応するためにわざわざ上のように解像度を下げなくてはいけないあたりが 42 の課題っぽいというか

*6:現在 first circle を抜けるなど一定条件を満たすと海外 42 校に移動することができる (海外 42 から 42Tokyo に移動してきている方も数名いらっしゃる) ので興味のある学生が多いようです。

*7:どこかで作った関数が活躍

*8:どこかで作った関数が活躍

*9:どこかで作った関数が活躍

*10:どこかで取り組んだ知識を使う