見出し画像

42Tokyoに3ヶ月間育児をしながらハーフコミットした記録

2020/10から42Tokyoで学んでいます。同期入学でbashを真似たシェルを作るチーム開発プロジェクトを行った相棒の投稿に便乗して(構成も真似して)、私もこれまでを振り返ってみます。

私のプログラミング経験はBasic(中学校の技術家庭科)、Matlab(非IT系の大学院、ただの計算機として)、Python(CourseraのML, DLの講座、Build@Mercari)で、長期間に渡ってプログラミングやコンピュータサイエンスを学んだことはありません。

一方、アドバンテージとしては、留学経験があり、英語に不自由しないこと(ドキュメントを読むなど)、仕事では自分も部下にもノー残業、有給フル消化を目指してやってきたので、タスク分割、順序付けやタイムマネジメントが得意という点があります。

コミット具合

子供が二人いて、育児休職を取得しています。子供の寝かしつけを終えたあと、だいたい20時〜2時が主な活動時間で、その間に赤ちゃんが起きると寝かしつけで中断がありますが、平均して1日4〜5時間くらいは活動できていると思います。

dai65527さんの背中(同期入学で最速の進捗)を今のところ、1−2週間遅れで追いかけている状態です。ただし、彼はボーナス問題と言われるプラスアルファや、先に進むのに必須でないプロジェクト(Javascriptや簡易的なlsコマンドを作る課題)などもクリアしているのに対し、私は先に進めるのに必要な点を得るための最小限の取り組みです。これは休職中にできるだけ先に進めておきたいと考えているからです。

 C言語を気持ち良く書ける

42TokyoではC言語をまず学びます。入学試験前に参考書を買ってやってみた時は、あまり面白さを感じなかったのですが、今はとても楽しく学んでいます。これは課題に取り組んでいくと、積み上げでその仕組みが分かるようなカリキュラムになっているからだと思います。

個人的な体験としては高校生の時に公式を暗記させる物理が気持ち悪く、面白くなかったけれど、物理学科出身の数学教諭が微積分で運動方程式の導出を教えてくれた時に面白くなった感じに似ています。

C言語の標準ライブラリの関数や、その他あると便利な関数(文字列操作、ファイル操作、リストなど)を自分でwrite, read, malloc, freeだけで書いて、それを用いて先の課題を解くというのは気持ち悪さがなく、アセンブリの課題でwriteやreadを書いた時はさらにスッキリしました(ただ、errnoの設定以外はsyscall使うだけでしたが)。

また、少し触っていたPythonのlistやstring操作の関数、pandasで関数を引数で渡す操作など、中身はこうなってるんだろうなとスッキリしました。今後、他の言語を学ぶのにも良い基礎になると感じました。

グラフィックス

ray tracingとray castingの課題が選べます。私は擬似3Dゲームを作るray castingを選びました。これももちろんCで作ります。X windowにrenderingしたり、key操作を処理できるライブラリを使います。これまで自分で作って中身を理解しているものばかり使ってきたので、違和感がありましたが、ドキュメントやソースコードを見て挙動を理解して使います。

数学としては三角関数だけで、そんなに難しくはないですが、ライブラリの関数の仕様や42のコード規約上、構造体と関数ポインタを上手く使うこと、メモリの確保と解放を頻繁に行うのでリークしないように注意するのがポイントでした(valgrindで全部キレイなの確認できると気持ちいいい)。

下はかよさんの素敵な実装です。僕はこんなに面白い感じには作れませんでしたが、動いた時は嬉しかったです。こんなゲーム、友達の家で昔やったなぁと。また、娘は生まれて初めてのゲームとして、楽しんで遊んでくれて、喜びもひとしおでした。

ネットワーク/サーバ

全くのど素人である私がTCP/IPってなに?という状態から、テストに合格するために本を読んで勉強し、そのあとはDockerfileを書いてdebianベースでwebサーバを立てて、さらにはkubernetesを使ってalpineベースの複数のコンテナを制御して、複数のサービスを立てるということに取り組みました。

C言語と違って、個々のサービスの設定を理解するのが苦痛でしたが、kubernetesの課題の終盤は徐々に慣れてきて、こんな感じかなという勘所が少しは分かるようなり楽しくなってきました。Dockerfileを書くのが大変ですが、結局はLinuxで各サービスが動くようにする必要条件+課題が求める要件を理解して、その設定を行うことができれば、自ずとDockerfileも書けるということがわかりました。

また、違うサービスでもalpineで動かす以上はやることも似たり寄ったりということもよく分かりました。今後はスクラッチでサーバをつくる課題があるようなので楽しみです。

シェル

これまでの集大成はbashを真似たシェルを作るチーム開発プロジェクトです。私は主に入力のparse(環境変数、バックスラッシュ、クオーテーションに苦労しました)と組み込みコマンドの一部を担当しました。

日中に主に活動するdai65527さんとは活動時間が違うため、頻繁に直接話をすることはできませんでしたが、深い議論が必要な問題はgithubのissueを、簡単な確認はdiscordのDMを使って非同期のコミュニケーションを使いながら、効率的に開発を進めることができました。

二人で決めたルールに則りコードを書き、プルリクエストを出し、レビューして、動作確認し、レビュワーの責任のもとにマージするを繰り返し、着実に進捗できたと思います。

私の反省点としては、網羅的なテストツールを作成すべきだったということです。終盤のparseの調整で、これまで大丈夫だった処理に影響が出て直すということが起きたことがあり、常に必要項目をチェックできるツールを作っておけば、手戻りがなかったと思います。

さいごに

そもそも42に参加したのは学び直しの欲求を満たすためでした。よくツライと言われる入学試験も、無料で、自分で好きでやっているだけなので、プレッシャーもなく、とても楽しかったです。休暇で好きな本を読み続けるのと似た感覚でした。

今は複数スレッドと複数プロセスの理解が必要なCの課題とC++の課題(ついにC以外も出てきた)に取り組んでいます。42の課題は私にとって面白いので、とにかく先に進んでどんどん解いていきたいと思っています。

復職後も1日2−3時間くらいはコミットできるかなと思っています。ブラックホール(課題進捗が締め切りに間に合わないと強制退学)に吸い込まれるまで、この環境を活かして学び続けたいと思います。

また、願わくばその身につけた力が、自分の子供達の世代が健康で安心して楽しく過ごせる世の中を作るための仕事に活かせればと思います。

この記事が参加している募集

自己紹介

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