お問い合わせ・ご相談についてはこちら

『42 Tokyo』半分ちょいを修了したので振り返ってみる

プログラミング
この記事は約9分で読めます。

皆さん、お久しぶりです!
こんにちは!

今回は、
42Tokyo
というフランス発のエンジニア養成機関
に僕が所属して、
半分のカリキュラムが修了した記念に、
これから42Tokyoに入学を検討している方や、
プログラミング学習をしようとする方、
また起業や今後について
考えていることがある方向けに
振り返っていこうかなと思います!

具体的には、
42の立ち位置、
プログラミングについてとかの話になるのかな。
ちょっと今回は長めです。

簡単に自己紹介!

僕は大学で物理学を専攻した後、
起業をして世界を変えてやる!!
という想いがあり、
自分の得意分野で戦いたいという理由から
CS(コンピューターサイエンス)という、
機械数学的な学問(プログラミングとか)
に興味を持ち、この世界に足を突っ込みました。

最初は、
RecursionCS
というコンピューターサイエンスをオンラインで、
いわゆる教科書を読むタイプではなく、
問題集を解きまくる勉強法をとるサイトで一番最上位のレベルまで進めました。

大体大学在学期間も合わせて1年ほどここで理論を学んだのですが、
ここでのプログラミングの勉強が
僕の42Tokyoの勉強にとんでもなく生きることになります。

Recursionでは、
時間計算量と空間計算量(O(n)とかよくみるやつ)
をとても意識させてくれ、
プログラミングの効率を実践的に学べました。

ここで基礎的な理論を学べたおかげで、
42Tokyoのカリキュラムは
ただ必死についていくというよりは、
とあるスタンス(後で書くのですが)を持って、
工夫しながらより理論を体現化させる練習になったと思います。

42Tokyoでは
tishihar“というアカウントでやってるので、
42の学生の方々は気軽に話しかけてくれると嬉しいです!

42Tokyo について

ここでまだ42Tokyoについて、
あまり知らないよ!!!って方の為に簡単に説明をしておこうと思います。

42Tokyoとは合格率4%のパリ発のエンジニア養成機関で、
日本のエンジニアリング力の底上げをしたいという考えと
協賛してくれる企業の皆さんの応援の元、
4週間にわたる試験を乗り越えることを条件に
入学費、授業料、施設利用費免除
という待遇を受けられる、
まさに神懸かっている学校「42Tokyo」です。

中にいる人も強い方や面白い方が多く、
頭がいい人が多いなぁと感じる場でもあります。
(技術にとことんこだわったりとかいい意味で変わった人が多いのも事実笑)

そんな42の日常は、
いわゆる先生といわれるポジションがなく、
学生同士で課題のレビューを行い、
お互いに高め合おうぜっていうスタンスを保っていて、
何かチャレンジしてみようという仲間は、
どんどん背中を押されるような環境にあると思います。

その代わり、
BHという除籍システムがあり、
入学してから課題をクリアをしないと、最短三ヶ月?で
BHに吸い込まれる=退学
という扱いになる、厳しい環境下にあり、
試験を通過したとして、
コモンコアを修了できるのは大体そのうち10%ほどで、
就職や忙しくなってしまってBHという方もかなりいるようなイメージです。

僕は42コミュニティの仲間感と廊下などで
すぐ議論が起きる文化は特徴的で、
時々カンファレンスやハッカソンなどに参加したり、
青春だなとかいいなぁと感じることも多々ある反面、

学生層の考え方も多種多様で、
全ての人がめっちゃ頭いいエリートスーパー集団というわけではなく、
スーパーな人もいれば、スーパーを目指す卵もいるみたいな感じです。

とても考え方が大人な方が多く、
ある意味日本っぽくない雰囲気な気がします!

42 の課題を振り返って(中間)

前半戦の課題は、
苦行もあったが特にグラフィック系課題やチーム課題が楽しい。

42では
「ファーストサークル」
と呼ばれる基礎カリキュラムと、
「セカンドサークル」
と呼ばれる応用カリキュラムがあり、

ファーストサークルでは、
printfや自前ライブラリの実装から、
仮想環境、
shellの実装(minishell)、
RT(レイトレーシング)やwebアプリケーションの実装などを行い、

セカンドサークルでは、
トロイの木馬(ウイルス)を作るセキュリティ系の課題から、
unreal engineやマインクラフトを作ろう、
カーネルを作ろうとかなんかいっぱいあります。

そのうち僕はファーストサークルの半分ちょい
(miniRTのサークル)までを終えたので、
課題感を振り返っておきます。

LIBFT, GET NEXT LINE, PRINTF , B2B

ここは入学して速攻で始まった4強どもです。

順に、
自作ライブラリ、
ファイルから一行だけを取り出す関数、
printfの実装、
仮想環境の作成

なのですが、
ここでプログラミングは
考えている時間 >>>>>> 実際にコードを書く時間
なんだと気付きました。

コードを闇雲に考えながら書くよりも、
公園で散歩して理論立てて、一気に書き上げるスタンスが
自分には向いているなと思いました。
GNLは初回1時間くらいで書き上げたのですが、
散歩の賜物です。

PUSH SWAP, PIPEX, FDF

ここあたりからちょっと楽しくなってきたかな!

順に、
2スタックだけを使ってソートを行う、
pipe()を使って、
プロセス間の情報の渡し方を学ぶ(shellに生きる)
アウトラインのようなグラフィックを作る

です。
したのはFDFに日本地図を読み込ませたもので、
実際に左上を(0,0)として、どの座標になんの色の点を打つのかをマップから数学的に計算し、
ちょっと斜めから立体的に見えるようにします。

山は海抜0(黄色)から飛び出るように、
海溝は窪んでいるようにしました。

ブレゼンハムのアルゴリズムの単純化の部分
を落とし込もうとして3日が消えましたが、
とんでもなく対照的なコードで、
友達と導出し切った時は感動しました。

この辺りから、
プログラミングを整理しながら書くということができるようになりました。
(コンポーネントに分けながら汎用関数を作って責任を1関数に1つ持たせるイメージ)

minishell, philosopher

ここが中ボス(もはやこいつはラスボスでいいn回目)
とよく言われる課題なのだが、シェルを実装します。

↑こうゆうやつ

ここで初めてチーム課題で一緒にコードを書くことになります。
僕は仲間に恵まれたので苦じゃなかったけれど、
ここで多くの人が苦しみます。

ここでは後述もしますが僕自身はプログラムの基礎
というか考え方は自分の中で確立していて、

プログラミングの難しさというより、
仲間とのコミュニケーションの取り方というか、
エンジニア同士は
特に嫌なことも伝え合う瞬間が必ず避けられなくて、
もっとここはこうしていった方がいいんじゃないか?

みたいなことも議論をしていくようにしていました。
この時、
こうしてほしい。と押し付けるのは避けて、
議論をするように心がけていました。

philosopherはマルチスレッドについて学ぶ会でしたが、
知識は面白かったのですが、
実装が面倒くさかったので苦行でした。
早々に終わらせました。

ただ、
ここで非同期処理をプログラムで走らせられること、
非同期とはいえでも
PCスペックによって見かけの非同期になっていないかなど
勉強することができたので、まぁ60点くらいに考えておきます笑

miniRT, netPractice

miniRTで作ったのはこちらです。

もう凝りすぎて小さなゲームエンジンのようなものなのですが笑
仲間と3週間ほどで作りました。

実際にこれもFDFと同様に、
モニターのどの座標に何色を塗るかを関数的に決めて、
オブジェクトを表示するという課題なのですが、

ここでは最近でも熱い、
Ray Tracingというレンダリング技術を使います。

簡単に説明すると、
僕ら自然界でものが見える時、
それは光源から放たれた光が
物体を反射とかをし、目に入ることで世界が見えます。
https://cs.stanford.edu/people/eroberts/courses/soco/projects/1997-98/ray-tracing/types.html

(詳しくは上のサイトの図を参照)

なので、
光源から放たれた光が
どのような経路を通るかを知れれば、
そこが影になるのか、
それとも水に光が映っているのかなどを知れます。

ただし、
光源から出る全てのray(全方向)の中には
目に入らないものもあって余分ですよね。

なので
目から見たい場所だけの計算を行う(光源から逆方向)ことで、
計算量を大幅に減らしつつ、
反射とかを自然界の見え方に近づけてリアルにしようぜって理論です。

このサイト(Ray Tracingについて解説)がイメージつきやすかったです。
youtubeでのこれ(ray trace解説)もどうやって使われているのかイメージできる。

ベクトル計算も、
内積、外積の知識(と本質)が分かれば手出せるので
数学に自信ある方は
ぜひ鏡面反射や屈折までやってみてください。

netPracticeは今やってるのでパス!!!

42 で学んだことは何か

自分は基礎知識
(カプセル化とかOOP知識はなんとなく知ってたりDRY原則も意識できていた)
があって課題に取り組んだのですが、
そういったスタンスの実践経験としてコードがまとまってきたように思えます。

ついでに日常の情報の整理をプログラマーな考えになってきてしまったように思えます。笑

僕が学んだことは、

  1. DRY原則を守りながら、部品を組み立てるようなプログラミング。
  2. どんなに苦しくてもとにかく解決できる姿勢。
  3. 1人でプロジェクトをやるのではなく、一緒にすすめるという感覚。
  4. 計画を最後まで見通し切る力

です。

プログラミングにおける能力は
こんだけ意識して書いていればついていくとも思うんですが、
物理を専攻していた大学以上に、
日常の考えも成長を感じます。

ただ、あまりにも理屈的になりすぎていて笑

ちょっと何でもかんでも理屈理屈しているのは
面白く無くなってしまって、

だからこそ、
感情的だったり衝動、ワクワクするとか
そうゆうのこそ大事なんだと再認識もできました。

1の部品を組み立てる感じはレゴを作る感じに近いです。
城を作るとき、
最後A、B、Cの部品をガッチャンこして城にするのですが、
AもまたA1、A2、A3の部品で成り立つ。って感じです。

これが出来ている人は意外にも少なくて、
可読性とコードの流れを把握しやすいのでバグも起きにくく
おすすめです。

2,3,4は42が学生に目指してほしい理念と奇跡的に被っている気がするのですが、
特別意識したわけでもなく、
ただ、課題難易度や課題の出し方、
いろんな要因でそうなっていく気がします。

これは経営者など目標を遂行せねばならない時に
大きく役に立ちそうなメンタルで、
これはよかったなと思います!

今後の計画と42の未来

僕自身、
課題を進めようと思ってからは速度を出しながら、
とりあえず遂行するという気持ちでタイムアタック的に取り組んでいるのですが、

これからの課題は、
サーバー立ち上げやWebアプリ開発など、
ちょっと億劫に感じるものがあるのは事実です。
(Webアプリ開発の中身はプライベートでやった経験がある)

なので、タイムアタック的な態度は変わらないと思います。

ですが、
ここで少しずつ、
42という頑張れば余裕が生まれる環境下で
経営についても計画を立て始めようと思います。

また近々、別件でこれは記事にしようと思います!

僕自身の強みが生きるのは、
「技術的に困難」な領域でそれを技術、マネタイズで持続可能にできれば、
大きく社会を前に推進できるはずです。

42に対して期待すること、凄いところは、
議論が廊下で気軽に起きるこのコミュニティにあります。

レビューは甘えて適当にやらないでバトルだと思ってやって欲しい。
このみんなが大人で、
誰かが進もうとする背中をみんなで押す文化を絶やさないでほしい。

あとは最近活発になってきている、
外部とのつながりを僕自身も大切にしたい。

少しでも42に興味ある方は、
以下のリンク
42Tokyoから4週間のハンター試験を受けることをお勧めします。
CSに対して勉強したい方は、
RecursionCSこちらもお勧めです。

コメント

タイトルとURLをコピーしました