大学・大学院の6年間

大学と大学院の6年間について振り返ります。

この6年間は自分でも予期しなかったほど大きな方向転換をしました。元々はデザイナー兼ファッションモデルとして仕事ができたら良いなと思って大学に入学しましたが、いつの間にかプログラミングの虜になっていました。夢中でプログラミングをしているときは人生で一番楽しい!と思えました。しかし全て順調だったわけではなく、今思い出しても恥ずかしくなるような失態や、周りに迷惑をかけてしまい謝りたいことなどがたくさんあります。でも失敗にめげずにたくさんの挑戦をしてきたからこそ、自分の向き・不向きを知ることができ、自分のやりたいことを見つけることができました。

この文章で伝えたいことは「迷ったらやってみる」ことです。これから社会人として新しい経験をして忘れてしまう前に、6年間でやってみたことを書き残しておきます

私のように学業や仕事で大きな進路変更をした人・これからしようと考えてる人にとって、少しでも参考になれば幸いです。

大学入学まで

小・中・高校は地元の公立学校に通い、ほぼ毎日部活に参加していたのであまり自由な時間はありませんでした。少ない自由時間で行う趣味は、ファッション雑誌を読む、小説を読む、アニメを見る、ゲームをするなどでした。ゲームはパソコンでできるオンラインゲームのメイプルストーリーに一時期はまっており、他の人と会話をするために文字を速く打つ必要があったことから、ブラインドタッチを習得しました。これが唯一、現在の仕事であるソフトウェアエンジニアに繋がっていることだと思います。

また、小学生のときに初めて読んだファッション雑誌に感動し、その頃から自分もファッションモデルになりたいと考えていました。そんなに甘くない世界だとわかっていたので、副業でモデルをし、本業でデザイナーになる、というのが高校生時点でのざっくりとした将来設計でした。勉強はあまり好きではありませんでしたが、物を作ることは小さいころから好きだったので、デザインを学べる学部を見つけたときにはここしかない!と思い受験をし、無事合格しました。

B1: 大学入学、学生兼ファッションモデルになる

大学は芸術工学部という一風変わった学部に入学しました。この学部では様々な分野のデザインについて学べます。講義内容がかなりユニークで、テーマに沿って制作と発表を行う実習に力を入れていました。座学では、美術・デザイン史、グラフィックデザイン、プロダクトデザイン、UI/UXデザイン、音楽理論、映像、画像処理などについて学びました。

講義では基礎しか学ぶことができなかったので、もっと専門的に学びたい人は自主的に動く必要がありました。一つの方法は、毎年夏と秋の2回開催される展示会の作品づくりのために、学生主体のグループに所属し先輩方から学ぶことです。夏に参加したのはプロダクトデザインを行うグループです。このグループではまずスケッチを学びました。それから、製品のアイデア出し、モック(実物大の模型)制作をしました。アイデア出しはとても面白くワクワクしましたが、スケッチやモック制作は予想していたよりも単純な作業で、飽きっぽい自分には向いていないと考えるようになりました。

秋に参加したのがWebサイトを作るグループでした。このグループは友人に誘われて参加したので、初めは乗り気ではありませんでした。しかし、このグループでHTMLとCSSを学んだことがまさしく人生を変えました。このときに初めてコードを書き、楽しい!と思いました。書いたコードはほとんど理解していなかったと思いますが、先輩の力を借りつつなんとかWebサイトの1ページ分のコーディングをしました。

また、入学直後にファッションモデルの事務所に自ら応募し、合格しました。初めの1年間は毎週事務所に通い、ウォーキング、カメラの前でのポージング、メイクなどのレッスンに参加していました。

ファッションモデルで一番大変だったのはダイエットです。モデルになる前は自分はスタイルが良いと思っていましたが、モデルの世界に入ったら自分はぽっちゃりでした。夏頃に1日に1200キロカロリーくらいしか食べない生活を続け、身長165cm・体重48kg (BMIは18以下)までダイエットしました。しかし、この生活は当然続くわけもなくリバウンドとダイエットを何度も繰り返しました。太るかもという恐怖から食べることが怖くなり、友人とご飯を食べに行くことも避けるようになりました。体重の呪いはモデルの仕事を諦めるまでずっと頭の片隅に残り、私を苦しめつづけました。

B2: HTML/CSS/JavaScriptを学ぶ、モデルの初仕事

大学の先輩に誘われて、WebデザイナーとWebエンジニアの学生団体に参加しはじめました。この団体ではとあるWeb制作会社のオフィスを借りて、週に1回学生が集まり、デザイナーとエンジニアでチームを組んでWeb開発をしました。主に静的なWebサイトがメインです。初めの頃は先輩たちが使う技術的な単語の意味がまったくわからなかったため、横で聞いていてわからない単語をひたすらメモし、家に帰って調べることを繰り返していました。そのおかげで数ヶ月ほど経つと、自分も会話に参加できるくらいにWebサイト開発の基礎的な知識を得ることができました。1年後にはHTML、CSS、JavaScriptでフロントエンドの開発ができるようになりました。またGitやエディタなど、開発するために必要なツールについて知ることができました。

ファッションモデルとしては初めて仕事をしました。最初の仕事は健康食品の宣伝のためのWebの広告動画の撮影でした。サプリメントを口にいれるシーンを撮るために、サプリメントを口にいれては吐き出すことを繰り返しました。これを機に少しずつオーディションや仕事に参加するようになります。ほとんどのオーディションは落ちてしまいましたが、2ヶ月に1度くらい仕事をしました。仕事はポスターの撮影、企業マニュアルの撮影、ライフスタイル雑誌の撮影、テレビのエキストラ出演など多岐にわたりました。

B3: 初めてのエンジニアバイト、モデルの挫折

まだフロントエンド開発しかできなったにも関わらず、果敢にもエンジニアのアルバイトに応募し、1ヶ月の研修を受けることになりました。研修を受けて能力があると判断されたら正式に雇ってもらえるとのことでした。研修での課題はJavaでいくつかのライブラリを作ることです。しかし、結果的にこのアルバイトは1ヶ月も経たないうちに、つらくて泣きながら辞めてしまいました。一番の原因は基本的な知識不足から困ったときにどのように質問してよいかわからなかったことです。Javaを書くのはほぼ初めてで、オブジェクト指向が何かもわからない状態だったので、社員の人と技術的な会話をするのにとても苦労しました。

このときまではコードを書くための実践的な技術ばかり学んでいて、理論的な知識を疎かにしていました。しかし、このアルバイトの経験を通して、基礎知識がなければ自分の問題点をうまく表現することすらできないことに気付き、自分で理論を学ぶことにしました。まずはITパスポートと基本情報技術者試験の教科書と問題集を一通り理解しました。そして応用情報処理技術者試験の教科書と問題集にも取りくみ、受験しました。このときは午前試験は合格点だったものの午後試験が合格点に届かず不合格でした。(M1のときに再度受験し、合格しました。)

さらに、Webバックエンドの勉強を始めました。フロントエンドの開発では、仕組みを理解するよりもたくさんのライブラリを上手く使うことが求められていました。対してバックエンドの開発では、ネットワークなどの知識を使って仕組みを理解し、納得しながら開発できることが増えたので、更に楽しいと感じました。

そしてバックエンドの勉強のためにLINE Botを作りました。これを作っている時は本当に楽しくて、朝7時から夜12時までパソコンにかじりつく生活を1週間くらい続けました。こんなにも何かに夢中になれたのは人生で初めてで、エンジニアになりたいという気持ちがどんどん膨らんでいきました

エンジニアになりたい気持ちが高まれば高まるほど、元々の夢であったファッションモデルやデザイナーになりたいという気持ちは無くなっていきました。特にモデルは金銭面で苦しいことを目の当たりにしていました。所属する事務所では、約2割の人しかモデルの仕事だけで食べていくことができず、残りの人はアルバイトをすることで生活していました。先輩のモデルさんは実家暮らしなら問題ないと話していましたが、私は自立したかったので卒業後もモデルを続ける選択肢はこの頃にはほぼ無くなっていました。また、モデルの仕事を始めてから気づいたのですが、自分はコミュニケーションをとることが得意ではありませんでした。モデルの現場ではほとんどの場合、たくさんの初めて会う人たちに囲まれて仕事をします。いろんな人に会うことに私はストレスを感じていました。金銭的理由、コミュニケーションの理由から、モデルの夢は諦めることにしましたが、これらは一度挑戦してみたからこそわかったことだと思います。もし挑戦せずに諦めていたら、心のどこかでずっと後悔しつづけることになっていたかもしれません。

B4: Googleインターン、カルチャーショックを受ける

学部を卒業したらエンジニアとして働こうかと考えていたため、B3からB4になる春休みに就活をしていました。Webバックエンドエンジニアとしての仕事を探しており、いくつかの会社とは話がうまく進んでいましたが、本当に自分がやりたいことなのか決めかねていました。そこで半ば自暴自棄になって、自分の実力を考慮せずに1番行きたい会社に応募してみよう、そして受かったら大学院に進学しようと思い、Googleのインターンに応募しました。履歴書を出し、コーディングテストを受けると、なんと合格することができました。

Googleのインターンは普通のソフトウェアエンジニアのインターン (SWEインターン) とは異なり、STEPインターンと呼ばれるものでした。これは前半3ヶ月の講義と、後半2ヶ月のインターンシップで構成されています。インターンシップは全員が参加できるわけではなく、前半の講義が終わったあとにコード面接をし、合格した人だけが参加できます。週1回の講義では、主にアルゴリズムとデータ構造について学び、それに関する宿題が出ました。宿題では幅優先探索、深さ優先探索、巡回セールスマン問題、グラフ上での最短経路などをPythonで実装しました。このときは大学院の受験勉強も控えていましたが、どちらも妥協せずに毎日必死で勉強しました。

コード面接も無事に通過し、夏にはGoogleでインターンをしました。Chrome OSチームで社内用のWebアプリケーションを0から作るのが私のプロジェクトでした。Webアプリケーションは、PythonでFlaskのフレームワークを使い、Google App Engine上で動かすという構成でした。バックエンドの勉強をしていたときに似た構成でアプリを作ったことがあったため、インターン期間中に技術的に困ったことはほとんどありませんでした。

チームの人と低レイヤーの話をすることが多かったことから、私も低レイヤーに興味を持ちOSなどの勉強を開始しました。低レイヤーの勉強でも、Web開発のときと同じように手を動かしながら学びたかったので、まずは『30日でできる! OS自作入門』からはじめました。

また、インターンで様々なバックグラウンドの人と会話したことが自分の考え方に大きな影響を与えました。自分は比較的ニュートラルで柔軟な意見を持っていると考えていましたが、様々なバックグランドの人と話すことによって、自分が日本に生まれ日本に育ったことによる偏った考えを持っていることに気づきました。具体的には、見た目を褒める発言や、「日本語が上手だね」と言うことは失礼にあたることを知りました。自分が善意で発言したことが、他の国ではそうではないことが衝撃で、世界には様々な価値観が存在することを知りました。

そして、様々なバックグラウンドを持つ人ともっと流暢にコミュニケーションを取るために英語を勉強するようになりました。英語の勉強についてはこちらに書きました。

M1: 大学院入学、二度目のGoogleインターン

大学院は学部のときとは異なる大学を受験し、情報学研究科の研究室を選択しました。気づけば研究室でもプログラムがかなり書ける人という扱いを受けていました。これは勉強するときに手を動かしながら学んできたことが大きかったと思います。しかし数学を利用するような理論的な知識はまだまだ勉強不足で、特に論文を読むときなどに困りました。これは現在もまだ課題です。

夏には二度目のGoogleインターンに参加しました。これは前年のインターンで良い評価をもらっていたためコード面接などはなく、希望を出したら参加することができました。このときはChromeブラウザのチームに参加し、Service WorkersのESモジュール対応を行いました。技術的にも英語的にも前年のインターンより手応えを感じ、仕事をするうえで特に大きな問題はありませんでした。

インターンを終えると、Googleの内定をいただきました。2回以上インターンで良い評価をもらうと、追加のコード面接などを受けなくても内定がもらえる新しい制度の恩恵を受けました。とても嬉しかったのと同時に、プレッシャーでもありました。自分がGoogleに入社しても良いのだろうか、もしかして評価や手続きのミスなのではないのか、という不安は入社するまでずっと続きました。

低レイヤーの勉強では、Go言語でGoのコンパイラを作ったり、Courseraのnand2tetrisの授業を受けてハードウェア記述言語 (HDL) でCPUを実装したり、アセンブラを書いたりしました。

また、インターンが無いときにはエンジニアとしてアルバイトも行っていました。B4からM1の間に3社の地元のスタートアップで主にWeb開発をしましたが、どの会社でも問題なく働くことができ、自信につながりました。応用情報処理試験などで学ぶ理論面と、手を動かしてアプリを作る実践面のどちらも行ったことで、問題なく働けるレベルになったのでは無いかと思います。

M2: GSoCや海外でのインターン、精神の不調

Google Summer of Codeという学生がオープンソースに参加し、オープンソースのBIOSであるcorebootのプロジェクトに参加しました。大学院での授業や研究と並行して行っていたため、時間的な厳しさはありましたが、なんとか目標を達成することはできました。

また、冬にはサンフランシスコにあるスタートアップWasmer社でWebAssemblyのランタイムを開発するインターンに3ヶ月参加しました。この仕事では主にRustを使いましたが、Rust自体が扱うのが難しく、また、プロジェクトの内容も複雑だったため、今までで一番難しい仕事でした。Wasmer社でのインターンシップについてはこちらに詳細を書きました。

空いた時間にはRISC-Vのエミュレータを開発し、xv6という小さなOSを動かすところまでできました。低レイヤーの勉強のために、今までコンピュータアーキテクチャの本は何冊も読みましたが、おおまかな概念は理解できても腑に落ちない点がたくさんありました。しかしエミュレータを実際に作ってみることでようやくコンピュータがどうやって動くのかが少しだけ納得できた気がします。

M2はGSoC、インターンに加え、研究も本格化してきたので6年間で一番忙しい年でした。そのせいか精神的に不調になってしまうことも増え、漠然とした不安から抜け出せず泣いてしまうこともありました。過度に追い詰めすぎると簡単に精神が不安定になってしまうことを学んだので、これからは休息とのバランスを取りつつやっていくことが目標です。

おわりに

この6年間は自発的にたくさんのことに挑戦しました。その結果、最初は予想もしなかったソフトウェアエンジニアの仕事につくことになりました。ソフトウェアエンジニアになるためには、かなり遠回りな学び方をしてきたかもしれません。学部生のときは、「もっと早くプログラミングを始めていれば良かった」「情報系の学部に行けば良かった」と悔やむこともありましたが、今は、ファッションモデルをし、デザインを学んで遠回りしたことに満足しています。なぜならこの遠回りこそが私の個性になるからです。

これからもいくつか挑戦したいことがあるので頑張りたいです。ただし、ちゃんと休息を取ることも忘れないようにします。

@d0iasm

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