かよ日記

インターンの体験記などを書いていく予定です。

低レイヤ初心者がセキュリティキャンプ全国大会2020に参加した感想

この記事はセキュリティ・キャンプのグループワーク「控えめ関西人」の合同ブログ第6記事目になります。

modestkansaipeople.hatenablog.com

概要

2020年10月18日(日)~2020年12月6日(日)まで「セキュリティ・キャンプ 全国大会 2020 オンライン」のシステムソフトウェア自作トラック(Yトラック)「OS開発ゼミ」に参加させていただきました。低レイヤに入門して間もない状態で参加した私にとっては何もかもが新鮮で、とても刺激的な2ヶ月でした!
そこで、この記事ではセキュリティ・キャンプでやったことや実際に参加してみた感想などについて書いていこうと思います。

目次

セキュリティ・キャンプとは?

セキュリティ・キャンプとは、日本における将来の高度IT人材となり得る優れた人材の発掘と育成を目的とした独立行政法人情報処理推進機構(IPA)の事業の一つです。

 

現代においては、情報セキュリティの脅威は高まる一方です。

本事業では、セキュリティ分野に興味を持ち、将来同分野で活躍したいという意志をもった若者に対して、高度な情報セキュリティ技術の習得機会を提供しています。また、モラルや法律遵守の意識、セキュリティ意識、職業意識、自立的な学習意識についても向上のための機会を提供しています。

 

本事業は、2004年度のスタート以来、2019年度のセキュリティ・キャンプまでで計824名の将来が有望なIT・情報セキュリティ人材を輩出しています。セキュリティ業界はもとより各方面から、高度な情報人材育成に有益なイベントとして高く評価されています。 

(公式サイトより引用:https://www.ipa.go.jp/jinzai/camp/2020/zenkoku2020_about.html

つまり、セキュリティ・キャンプは国主催の、セキュリティ分野のすごい人たちの講義*1を無料で受けられるとても豪華なイベントなのです。 一口にセキュリティ分野と書かれていますが、theセキュリティといった感じ(?)の講義から自作OSやコンパイラ、電子工作まで、様々な講義があります。 もしどれか1つでも興味があるのなら応募しない手はないでしょう。

セキュリティ・キャンプ全国大会2020の講義一覧など、詳細は公式サイトに書かれているので気になる方はぜひ読んでみてください。*2

www.ipa.go.jp

例年は8月に5日間の合宿形式で行われていたのですが今年は新型コロナウイルス感染拡大防止のため、オンライン形式による開催となりました。

セキュリティ・キャンプのここがすごい!

講師陣がすごい!

何と言っても講師陣がとても豪華です!
その分野を勉強している誰もが知っている名著を書かれた方、大学で先生をしている方、GoogleやLINEなどの超有名企業のエンジニアの方、受講生とほとんど変わらない年齢でありながら最前線で大活躍されている方など、普段中々会えないようなすごい方々が沢山いらっしゃいます!
そのような豪華すぎる講師陣の講義を無料で受講できるし、相談や質問も無料でし放題なのです

受講生・チューターがすごい!

講師陣だけではなく受講生やチューターもすごい人ばかりでした。
小中学生の頃からずっとプログラミングをしてきたような人がザラにいます。何なら中高生の参加者もいたりします。私ですら名前を聞いたことがあるような強い人もいました。(主観ですが、実務経験や開発経験が豊富な「強い人」というよりはアカデミック系の「強い人」が多い印象を受けました。)
初心者の私にとっては雲の上の存在ばかりだったのですが、セキュリティ・キャンプではそんな人たちと同じ講義を受けることができ、交流することができてとても刺激的でした!
また、優しい人たちばかりだったので、初心者だからといって肩身の狭い思いをすることはなく、雰囲気もとても良かったです。

協賛企業がすごい!

公式サイトの会員企業・団体一覧を見てもらえば分かると思うのですが、セキュリティ・キャンプの協賛企業には名立たる企業の名前がずらりと並んでいます
https://www.security-camp.or.jp/about/index.html

セキュリティ・キャンプでは協賛企業の方のLTを聞けたり、企業の方を交えて技術的な話題について議論するBoFというイベントがあったりしました。


↑豪華なノベルティを頂きました。

セキュリティ・キャンプに参加するには

※こちらは2020年度の情報になります。

セキュリティ・キャンプ全国大会に応募するための条件は大きく2つありました。

  1. 日本国内の学校に在籍する2021年3月31日終了時点において22歳以下であること
  2. 応募課題を提出すること(応募課題による選考有り)

他にも細かい条件が色々ありますがここでは割愛します。気になる方は応募要項を読んでみてください。:https://www.ipa.go.jp/jinzai/camp/2020/zenkoku2020_vote.html

年齢制限

1に関しては、学年制限ではなく年齢制限であることに注意してください。
ただし22歳を超えている場合であっても、25歳以下の学生であれば同時開催の「セキュリティ・ネクストキャンプ」や、地方各地で開催している「セキュリティ・ミニキャンプ」には参加できるようです。また、協賛企業の社員であったり、そうでなくてもお金を払えば全国大会の講義を見学できるらしいという話も聞きました。

www.ipa.go.jp

www.security-camp.or.jp

応募課題

セキュリティ・キャンプの講義は分野ごとにいくつかの「トラック」に分けられています。 トラックごとに応募課題が用意されており、参加したいトラックの問題を回答します。

2020年度ではA~Dトラックが「選択コース」であり、L、X~Zトラックが「集中コース」でした。

「選択コース」は基本的に1回完結型の講義の集まりで、自由に組み合わせて受講します。(定員数によっては希望通りにならない場合もあります)。 ただし、応募時はトラックごとに選考が行われるものの、参加時は選択コースの全講義の中から受講したいものを選択できるようになっていました。(募集時に公式サイトにもそう明記されていました。)つまり、「Aトラックで応募したけれどB~Dトラックの講義も受講する」ということもできるわけです。

「集中コース」は1つのテーマについて集中的に開発するハッカソン形式のコースです。トラックの中でさらにゼミに分かれており、ゼミ毎に応募課題が出されます。 選択コースと違ってこちらは応募時と同じゼミにしか参加できませんでした。

参加するまでの経緯

自作OSに興味を持ったきっかけ

私は集中コースの中でもYトラックのOS開発ゼミに参加しました。
しかし、前々から低レイヤに興味があったわけではなく、興味を持ち始めたのは応募するほんの少し前の話でした。

大学では情報系の学部に所属しているのですが、その中でも低レイヤやハードウェアをほぼ扱わないコースに所属していたため、それらの勉強をちゃんとしたことがなく、しようとも思っていませんでした。それどころか他コースの友人たちが低レイヤに関する実習で苦しんでいる様子を見て「(一部の天才を除き)低レイヤとはつらく苦しく、何も面白くないものである」とさえ思いこんでいました。

普段使っているコンピュータの裏でどういう処理がされているんだろうといった興味は少しだけ持っていましたし、昔から何かを作ることも大好きだったのですが、低レイヤに対して前述のような印象を抱いていたため実際に行動に移すことはありませんでした。

そんな私に転機が訪れたのはとある技術系イベントでした。 イベントの内容自体は低レイヤに寄ったものではなかったのですが、そこで私は低レイヤ界の有名な方や低レイヤが好きな方々に沢山出会い、低レイヤに対する印象が変わっていきました。そして、イベントが終わる頃には誰かから勧められたわけでもなく自然と「30日でできる!OS自作入門」を手にしていました。

f:id:knknk98:20210221205251p:plain

かの有名な緑の本


この本の詳細についてはここでは割愛しますが、私のような前提知識がほぼない人でも読めるよう詳しく解説してあり、また、自作OSを楽しもうというスタンスで書かれているので友だちと雑談しているような感覚で読み進めることができます。 自作OSと言えばこの本!というくらい有名な本ですので、ぜひ一度読んでみてください!
私はこの本を読んで自作OS、そしてセキュリティ・キャンプのOS開発ゼミに興味を持つようになりました。

www.amazon.co.jp

※OS開発ゼミの講師でもあり、かつて高校生代表として「30日でできる!OS自作入門」の校正にも携わっていた内田さんが3月に「ゼロからのOS自作入門」という本を出版するそうです。こちらは「30日でできる!OS自作入門」の現代版といった内容らしいので、今から読むならこちらの方がオススメかもしれません。

www.amazon.co.jp

応募課題

まず、OS開発ゼミの応募課題は以下の通りでした。

■問題A
我々講師は、普段いくつかのOSを使っていますが、使い込むうちに色々な発見をします。
皆さんもきっとそういう体験があると思います。
あなたが普段使っているOSで、好きな機能と改善してほしい部分について、思いのたけを聞かせてください。
この問では、皆さんが普段どの程度興味を持って既存OSを観察しているかを評価します。

■問題B
皆さんが仮にOSを作るとしたら、「どんなOS(やOSの機能)を作ってみたい」でしょうか?
(既にOSを作った事がある人は、その特徴を書いてくれても構いません。)
そして、なぜそれを作ってみたいと思ったのでしょうか?
皆さんが心の中で夢描いているであろう、ワクワクするようなOS像を教えてください。

■問題C
OSを実装する上で基礎となるC言語の力を見る問題です。

C.1. C言語で双方向リンクリストとそれを操作する関数を作り、ソースコードを提出してください。
リンクリストを生成する関数、要素を任意の場所に挿入する関数、全ての要素を順に標準出力に印字する関数、の3つがあれば十分です。
やる気があればもっとたくさんの機能を実装しても構いません!
C.2. 設計・実装で工夫した点を述べてください。

■問題D
OSを作る過程で様々な調べものをする必要が出てきます。
皆さんに必要な調査力があるかどうかを知りたいです。

単語集:PCI、ACPI、ASLR、スピンロック、コンテキストスイッチ、バディシステム

D.1. 上記の単語集から知らない単語を 1 つ選んでください。何を選びましたか?
D.2. その単語について、調べて分かった事実をなるべくたくさん教えてください。
D.3. 判明した事実に対して、あなたなりの解釈をしてみてください。例えば…
- 「Aという機能はXをやるために追加されたのではないか」
- 「類似のBと比べて、Yの場合にとても効率が良さそう」

※調べる、という行為は、書籍やウェブサイトを読むことはもちろんですが、
実験や観察を自分でやるということも含みます。

■問題E
その他、書ききれなかったことを好きなだけ書いてください。

(公式サイトより引用:https://www.ipa.go.jp/files/000084574.txt
応募課題の回答を載せるのは恥ずかしいのでしませんが、意識した点について簡単に書こうと思います。
公式サイトには選考基準について、以下のような文章が書かれてありました。

このゼミでは、OSの面白さや奥深さを学生の皆さんに沢山伝えたくて、いろいろな講義を計画しています。
恐らく皆さんも、こういった講師の熱い思いに惹かれて、このゼミに興味を持ってくれたのではないでしょうか。
設問の多くは皆さんの知識や技術力を問うのではなく(その辺りは事前学習で講師がフォローします!)、
皆さんのOSに対する興味やモチベーションを聞いてます。それを意識して回答してみてください。

回答は、最低限のことだけでなく、膨らませて沢山書いていただいて大丈夫です(むしろ歓迎!)

(公式サイトより引用:https://www.ipa.go.jp/files/000084574.txt

Y トラックの選考基準は各ゼミ毎に異なりますが,全体的には加点方式を採用し,皆さんのやる気を見ます。 加点方式は,間違った回答を減点するのではなく,良い答えに対して加点していく方法です。ですので,間違ってしまうことを恐れて何も書かないよりは,自分なりの回答を書く方が加点の可能性が高まります。

(公式サイトより引用:https://www.ipa.go.jp/jinzai/camp/2020/zenkoku2020_message.html
つまり、知識や技術力だけではなくモチベも重視するということ、加点方式であるということです。
そこで私は単に問題を解くだけではなく、志望動機やセキュリティ・キャンプに参加するために今どんな勉強をしているのかなども書くこと、少しでも書きたいことは全て書くことを意識して回答しました。
今見返すと現実味のないことや間違った内容ばかりだなあと思うのですが、当時は一生懸命調べたり考えたりしていました。(その結果1万字超えの大長文になってしまいました。)

セキュリティ・キャンプでやったこと

ここではセキュリティ・キャンプでやったことについて簡単に紹介します。

OS開発ゼミ

OS開発ゼミは決まった内容をやるのではなく、各々の好きなことをやり、それを講師やチューターがサポートするという形式でした。
公式サイト:https://www.ipa.go.jp/jinzai/camp/2020/zenkoku2020_program_list.html#list_s-y1

当初、作りたいOSの具体的なイメージを持てていなかった私はテーマを決められるか不安だったのですが、初回講義で講師の内田さんが私のぼんやりとしたイメージをまとめてくださり「こういうことをやればいいんじゃないか?」と具体的な形を提案してくださったので、すんなりと決めることができました。
その結果、私は「30日でできる!OS自作入門」のハリボテOSを改造し、最新のC++で動くようにすること*3、そのために、Linuxの標準的なコマンド(gccやld)を用いて開発できるようにすることを開発テーマにしました。(WSL2上で実行しました。)

「30日でできる!OS自作入門」では開発環境として著者の川合さんオリジナルのツールキットが使われていました。特別な操作を必要とせず本に付属しているファイルを好きな場所にダウンロードするだけで使えるので、初学者が環境構築で挫折することを防いでくれる素晴らしいツールです。しかしその分プログラムが実行される仕組みがブラックボックスのままになってしまっていました。
Linuxの標準的なコマンドを用いて開発できるよう実際にMakefileを書き変えたりリンカスクリプトを書いたりすることによってプログラムが実行される仕組みについて理解を深めることができました。(これに取り組むにあたり、講師の内田さんやチューターのsksatさんがハンズオンしてくださいました。ありがとうございました!)

また、セキュリティ・キャンプ参加前は「C++C言語と互換性があるため、CコンパイラC++コンパイラに差し替えるだけで(C++っぽい書き方かどうかはともかく一応は)ハリボテOSがC++に対応できる」と思いこんでいたのですが、チューターのhsjoihsさんから名前マングリング*4について教えていただき、そうではないことを知りました。(ありがとうございました!)残念ながらセキュリティ・キャンプ期間中に最新のC++への完全対応はできなかったのですが、学びになることは沢山ありました。

OS開発ゼミ全体については講師の内田さんがまとめてくださっているのでぜひそちらを読んでみてください。

uchan.hateblo.jp

グループワーク・交流タイム

セキュリティ・キャンプでは他参加者と交流する場も設けられていました。

グループワークではトラックごちゃまぜの数人のグループに分かれ、「セキュリティ・キャンプ修了後に取り組むこと」をテーマに話し合いました。私たちのグループでは「積極的にアウトプットしたいと思っているもののついつい先延ばしにしていまう……」という悩みを抱えている人が多かったため、合同ブログを運営し、期日を決めて記事を投稿するようにしました。(この記事も合同ブログの一環です。)

交流会では色んなトラックの人と雑談することができました。Yトラック以外の参加者も数多くいたにも関わらず、みんな緑の本を持っていたのはとても面白かったです(笑)
↓当時のTL

その他のイベント

このほかにも全体で受講する講義や協賛企業のLT、好きなテーマを選び協賛企業の方と一緒に自由に議論するBoF等のイベントもありました。

まとめ

セキュリティ・キャンプに実際に参加して、沢山の学びを得ることが出来たのはもちろん、セキュリティや低レイヤに強い方々と沢山交流することができてとても刺激的でした。ありがとうございました! 少しでも興味がある人はぜひ応募してみてください!

*1:座学ではなく手を動かしながら学ぶタイプの講義が殆どでした。

*2:毎年講義の内容は変わっているようです。

*3:ハリボテOSはC言語で書かれています。

*4:C++ 名前マングリングとは - あるべるのIT関連メモ

Web未経験者がCyberAgentの育成型インターンで圧倒的成長した話

概要

2020年8月24日(月)から2020年9月11日(金)まで約3週間、CyberAgentさんの「CA Tech Dojo 3weeks サーバーサイド向け育成型インターンシップ ONLINE」という育成型インターンに参加させていただきました。
そして圧倒的に成長したということで「Growth賞」という賞をいただきました!!!
サーバーサイド開発の基礎スキルは勿論、それ以外でも多くの学びを得ることができ、非常に濃密で有意義な3週間だったと感じています。友だちも沢山できたし何よりめちゃくちゃ楽しかったです😄
そこでこの記事ではインターンを通してどんなことをやったのか? どんなことを学んだか? などを紹介していこうと思います!

目次

CA Tech Dojoとは?

プログラミング経験のある学生を対象に、約3週間でゲームAPIの開発を通しサーバーサイドの開発の基礎スキルを身に着けていただくオンラインインターンシップです。

事前課題や講義を通して理解を深め、活躍する現場社員に質問しながら、課題に沿ったAPIを実装し、実際にゲームクライアントに繋ぎこみを行ってゲームとして遊べる状態にすることを目指します。課題を進めていく中で、Webサービスを作る上で基本となる、サーバ構築やデータベースを参照したAPI実装などについて学ぶことができます。
インターンシップではGo言語での開発を行いますが、プログラミング経験があればGo言語の使用経験や本格的なサーバーサイドの開発経験がなくてもご応募いただだけます。

公式サイトより引用:https://www.cyberagent.co.jp/careers/students/event/detail/id=24975


つまり、Dojoは「インターンを通してGo言語でのサーバーサイド開発を学ぼう!」といった趣旨のインターンです。

「学生の成長」という点を重視しており、そういう意味ではインターンというより有名企業のエンジニアに手厚くサポートしてもらえるめちゃくちゃ豪華なスクールという感じかもしれません。しかもこれだけ豪華なのにお金は一切かからないし最低限のプログラミング経験さえあれば応募段階でGo言語の使用経験や本格的なサーバーサイドの開発経験がなくても大丈夫とのことです。

Dojo開催の経緯などをもっと詳しく知りたいという方はこちらの記事が参考になると思います:サイバーエージェント史上初のエンジニア育成型インターン『CA Tech Dojo』のウラガワ

こんな人にオススメ

個人的には以下のような方にとてもオススメのインターンだと思いました!
(人事の方に採用基準を聞いたわけではなくあくまで個人の感想です)

  • レベルや学年問わず、とにかくサーバーサイドの開発に興味がある人!!!

    今回の参加者にはサーバーサイド開発未経験の人から既に長期インターンでがっつりサーバーサイドの開発に携わっている人まで様々なレベルの人がいました。

    しかし、どのようなレベルの人であっても、みんな「参加して良かった」と話しており、サーバーサイドの開発に少しでも興味があれば、私のような初心者から既に知識・経験がある方までどのような方にもオススメできるインターンだと思います。

    また、このインターンは2022年4月以降に入社可能な学生なら誰でも応募することができました。実際の業務に携わる「就業型インターン」、個人やチームで開発し成果を競う「ハッカソン」は元々スキルを持っていることが参加条件とされがちですが、このインターンは「育成型」であるためやる気さえあれば知識・経験が浅くても参加できます。メンターさんも非常に手厚くサポートしてくださるので「まだインターンなんて早いかも……」と思っているB1やB2の方にもオススメだし、実際かなり成長させてくれる内容だと思います!
    私自身、もっと早く存在を知っていたらよかったな~と後悔しています😢

  • とにかくゲーム開発に興味がある人!!!

    このインターンではゲームAPIの開発を通してサーバーサイドの開発を学びます。

    メンターさんはSGE(サイバーエージェントゲーム&エンタメ事業部)の最前線で働くエンジニアの方々で、インターンの課題の質問だけではなくゲーム開発の現場についてなど貴重なお話を沢山聞くことができました。

    しかも公式サイト等を見てもらえばわかると思いますが、サイバーエージェントスマホゲームは本当にヒット作ばかりです。
    例えば私のチームのメンターさんは私が高校時代に好きだった「ガールフレンド(仮)」の開発に携わっていた方と、いま私の周りで大流行している「NieR」シリーズ、しかもリリース直前の新作に携わっている方でした! 他にも「バンドリ」など様々な人気スマホゲームの開発に携わっている方々が沢山いらっしゃいました。
    これだけ沢山ヒット作を生み出す企業で、最前線で活躍しているエンジニアの方々とお話できたりコードを見てもらえたりできる機会は中々ないと思います!!!

    また、サーバーサイドを学ぶことでゲーム開発の幅が広がるし、アーキテクチャなどクライアント側でも活かせる知識も付くと思います。
    なのでサーバーサイドに限らずゲーム開発全般に興味がある方にもオススメできるインターンだと思います!
    実際、参加者の中にも普段はUnityを触っておりサーバーサイドは今回が初めてという人もいました。

  • 自走力がある人!!!

    前項でDojoのことを「有名企業のエンジニアに手厚くサポートしてもらえるめちゃくちゃ豪華なスクール」みたいな感じだと書きましたが、Dojoはやれと言われたことをただこなすだけのインターンではありません。

    メンターさんはつきっきりで1から教えるのはなく、自力で答えを見つけられるようヒントをくれるという感じで(勿論どうやってもできないときは丁寧に教えてくださります)、基本的に開発は一人で行いますし、発展課題では自ら課題を設定し取り組む形になっています。

    そのため受け身ではなく自分から積極的に頑張ろうとする、つまり「自走力」がある人ならものすごく成長できるインターンなんじゃないかなと思います!

    実際Dojo生は積極的な人や成長に前向きな人がとても多かったと感じています。

インターンに応募した理由や選考、応募段階でのスキルについて

応募した理由

  • 何となくサーバーサイドに興味があったが、一口にサーバーサイドといっても色々あり、何から勉強したら良いかわからない状況だった
  • 最近Go言語の名前をよく耳にし、自分も使えるようになりたいと思っていた
  • 去年の夏に開催された最初のDojo(Go編)に友人が参加しており、(インターン内容もサイバーエージェントという企業自体も)とても楽しそうだったので気になっていた

他にも色々ありますが、主にこのような理由からDojoはまさに今自分が求めているインターンだと感じ応募しました。

選考について

選考はES+面接1回でした。ESは他のエンジニアインターンに比べると質問項目が多く、ガクチカ(「学生時代力を入れたこと」の略)などいわゆる文系っぽい質問もあったため書くのに苦労しました。ESを通過したあとは人事の方との30分程度の面接が1回だけありました。

応募段階でのスキルについて

大学では情報系の学科に在籍しているもののいわゆるコンピュータサイエンスとは少し違う分野を専攻していること、大学の授業は理論が中心だったことから、サーバーサイドエンジニアの仕事に直結するような内容はほぼ勉強していませんでした。

  • 大学の課題や他社の教育プログラムでC++C言語Pythonのプログラミング経験はあるがGoはない
  • インターン経験0・開発経験0・個人の開発物も特にこれといったものはない
  • 大学の授業や資格試験の勉強でネットワークの基礎を一応勉強したものの実際のWebアプリケーションの仕組みと結びついていない。そのためWebアプリケーション開発に関する知識は実質0
  • GitHubの使い方がよく分かっていない
  • Dockerをインストールしたことがない

インターン参加までに勉強したこと

流石に上記のような状態でインターンに臨むわけにもいかないと感じたので、インターン開始までに関連すると思われることを自分で勉強しました。今回のDojoでは合格発表からインターン参加まで数日しかなかったため、選考を受けながら勉強していました。


これらの勉強はインターンで確かに役に立ったものの、これだけでは全然足りなかったと感じています。Webアプリケーションの仕組みが根本的に分かっておらず、最初のハンズオンや基礎課題でとても苦労したからです。具体的には基礎課題で使った「net/http」というGoの標準パッケージも勉強しておくべきだったと思っています。

ちなみにインターンが始まってからですが、実務寄りのノウハウが書かれたGo言語の参考書としてメンターさんから以下の本をオススメしてもらいました。
「改訂2版 みんなのGo言語」
https://gihyo.jp/book/2019/978-4-297-10727-7

インターンでやったこと

ここでは具体的な開発内容について紹介します。

概要

今回のDojoは、初日のハンズオンや基礎課題でスマホゲームによくある様々なAPIを仕様書通りに実装し、発展課題(自由課題)で各自自由に改良を加えていくという流れでした。

仕様書には「user/getというURLに誰かがアクセスしてきたらその人から認証トークンを受け取って、その人に関する情報を返してください」みたいなことが書かれています。つまり、➀user/getに誰かがアクセスしたらその人から認証トークンを受け取る処理 ②その認証トークンを使ってデータベースからユーザ情報(ID/名前/ハイスコア/所持コイン)を取得する処理 ③データベースから取ってきたユーザ情報をアクセスした人に送り返す処理 を実装してくださいということです。

また、今回のDojoでは「スゴリラン」というゲームクライアントが事前に用意されており、そこにサーバを接続するだけでゲームとして遊べる状態になりました。
超ざっくり言うと自分が書いたプログラムで即遊べるということです。
「スゴリラン」はDojoのためにクライアントエンジニアの方が開発&デザイナーの方がデザインしてくれたみたいで、絶妙な中毒性があり、最終日のZoom飲みではみんな夢中になってプレイしていました(笑)

Dojo生は全部で13人いて、A~Dの4チームに分かれチームごとに2人メンターさんがつくという形でしたが開発自体は個人でやっていました。

初日

自己紹介やインターン全体の流れの説明のあとハンズオンがあり、環境構築したり4つのAPIをみんなで実装したりしました。
ハンズオンで実装したAPIは以下の4つです。

  • ゲームの設定情報を取得するAPI
  • ユーザ情報作成API
  • ユーザ情報取得API
  • ユーザ情報更新API


0からコードを書くのではなく、ある程度出来上がったコードに追記していく形でした。

メンターさんの説明はとても丁寧で殆どのDojo生がつまずくことなく進めていたのですが、私は知識のなさと理解力の悪さから早速置いていかれそうになりました。環境構築も上手くいかずこれから3週間やっていけるのかと不安になっていたのですが、全体のハンズオンが終わったあとメンターさんが個別でもう1回同じ説明をしてくださったり、環境構築できるまでサポートしてくださったりして何とか初日は乗り越えることができました。
(普通の仕事もあるのに1時間も残業させてしまって非常に申し訳なかったです。本当にありがとうございました)

正直Dojoが始まる前は自分と同程度かそれ以下のレベルの参加者が一定数いるだろうと楽観的に考えていました。
しかしこの初日で私はDojo生の中で自分が一番できない、それも圧倒的にできないということを痛感させられました
そして、だからこそこれからの3週間必死で頑張らなければならないと思いました。

基礎課題

2日目からは早速開発に入ります。基礎課題では以下の4つのAPIを実装することになっていました。

  • ゲーム終了後ランキングへのスコア登録やコインの受け取りを行う「インゲーム終了API
  • 指定された数だけガチャを回す「ガチャ実行API
  • 「ランキング情報取得API
  • アイテムの所持状況を取得する「コレクションアイテム一覧情報取得API


しかし、私は元から書かれてあるコードや昨日書いたコードの意味を全く理解できていなかったため、最初の2日間くらいは基礎課題に入らず、インターネットで調べたりメンターさんに質問したりしながらこれらの理解に努めていました。分からないまま見様見真似で実装するよりもちゃんと理解してから実装するほうが長期的な目で見れば早いし、何より自分自身の成長につながると考えたためです。

結果的に基礎課題では他のDojo生に大きく遅れを取ってしまいましたが(2日で全部完成させる猛者もいました)、開発していくための土台が作れたと思うので良かったと思っています。

さらに、インターン開始前の私はGitHubもろくに使えなかったのですが、本を読み返したりメンターさんに適宜質問したりしながら段々使えるようになっていきました。


※若干カクついているのは別撮りの動画を雑にくっつけたからです🙇

発展課題

2週目からは発展課題に取り組み始めました。

発展課題はこれをしろといったものはなく、自由に自分のやりたいことをすることができます。
インターン初日は正直「やりたいことなんて言われても何も分からないし……」と思っていたのですが、基礎課題に取り組んだり社員さんのお話を聞いたりする中でやりたいことは自然と浮かぶようになっていました。

結果、私は以下のことに取り組みました。

➀「zap」というパッケージを使ってより便利なログを書く

LT会で怖い話を聞いて、ログに取り組んでみようと思いました。

元のプログラムのログはエラー発生時にエラーメッセージがターミナルに出力されるだけで、情報量が少なく、ファイルに保存されないためPCの電源を消すと内容が消えてしまうといった問題がありました。

そこで「zap」という高速な構造化ログパッケージを使ってより便利なログを書いてみることにしました。具体的には以下のようなことを実装しました。

  • エラー発生時だけではなく、「誰がいつどこにアクセスしたか」「誰がいつガチャを引いてどんなアイテムが出たか」「誰がいつゲームをプレイしてどんなスコアが出たか」などのログも取る
  • ログの種類ごとに出力先を分ける
  • ターミナル&ファイルなど複数の場所に同じ内容のログを出力するが、フォーマットは変えるようにする。(ターミナルには人の目で見やすいフォーマット、ファイルには機械で分析しやすいフォーマットで出力するようにした)
  • ltsvという人の目にも機械の目にも読みやすいフォーマットを導入してみる


このような処理を勝手にやってくれる関数は用意されていないので、zapの様々な関数を組み合わせて自分で実装する必要がありました。そのためにはzapの仕様についてきちんと理解している必要があり、英語のドキュメントを読んだり、ソースコードをよく読んだりしました。

➁Webフレームワーク「echo」の導入

元のプログラムではGoの標準パッケージであるnet/httpを使ってWebサーバを実装していますが、自分で書かないといけない処理が多く、コードが長くなっていました。
そこでWebフレームワーク「echo」を使ってコード全体を書き変えることにしました。echoではWebサーバ構築でよく使われる処理をあらかじめ関数にしてくれており、何十行もあったコードをたった数行にできたりして感動しました。
また、echoに書き変えるためにはまず元のプログラムのどの部分がどのような処理をしているか理解する必要があり、この作業を通してWebサーバに対する理解を深めることができました。

➂データベースのアクセスにORMapperを導入

例えばユーザ情報をデータベースから取得し「User」という独自の構造体に格納する処理を考えます。
元のプログラムではデータベースから取得した値をデータベースとのやり取り専用の型に一旦格納し、そこからUser型に変換する処理を自分で書く必要がありました。つまり、データベースと「User」が直接結びついていない(マッピングされていない)ため面倒な処理を書く必要があったということです。
そこでORMapperを使ってよりシンプルに書こうと思いました。

まず使ったのは「GORM」というORMapperです。
例えばデータベースの「user」テーブルの値を格納するために「User」という構造体を作ると自動でuserテーブルとUser型を結び付けてくれます。
User型を使って直接データベースとやり取りできるため、一旦データベース専用の型に保存してそれをUser型に変換して……といった処理は不要になるわけです。
(自動で結び付けるにはテーブルと構造体の名前を揃える必要があります。また、名前が違う場合でも簡単に対応するテーブルを設定できます)

次に「SQLBoiler」というORMapperも使ってみました。
GORMは「既存の構造体(自分で定義した構造体)にデータベースのテーブルを対応させる」というオブジェクトファーストでしたが、こちらは「既存のテーブルに対応させた構造体・関数を新たに作る」というデータベースファーストになります。
より具体的に言うと、コマンド一つでデータベースの各テーブルに合わせた構造体や関数を自動で作成してくれ、それらを使うだけで簡単にデータベースの処理が書けるのです。

発展課題ではただ実装するだけではなく大量のデータに対する処理の時間を計測したりしてGORMとSQLBoilerを比較したりもしてみました。

➃Docker上で動かす🐳

Dockerfileを書いてdockerイメージを作ったり、docker-compose.yamlを書いて「docker-compose up」とコマンドを入力するだけでサーバが起動するようにしたりしました。
インターン開始前はDockerをインストールしたことすらないという状況でしたが、実際にDockerfileを書いたりすることで少し理解が深まったかなと思います。
この課題に取り組むにあたり、チームのメンターの方から夕会後1時間程度ハンズオンしていただきました。お忙しい中本当にありがとうございました🙇

➄Slack

誰かが新規登録したとき・誰かがログインしたとき・誰かがハイスコア更新したときにSlackに通知してくれるbotを作りました。

2週目終わりの面談では「今実装中のものを含めてあと1つ~2つ程度実装できたら良い」と話してしたのですが、もっと沢山のことをやりたい!!!という欲が出てきて結局最終日のギリギリまで開発していました。

それ以外で他のDojo生が取り組んでいたこと

アーキテクチャ/負荷試験/テスト/Redisの導入/BANユーザの設定/ガチャの確率UPキャラの設定/コマンドだけでレイヤードアーキテクチャを実装するツールの開発/静的解析ツールの開発 など

最終日

3週間にわたるインターンもいよいよ最終日。
最終発表があり、主に発展課題で何をやったかについて発表しました。
人によってやっていることは様々でどの発表も興味深かったです。

そして表彰者の発表がありました。なんとDojo生の中で一番成長したということで「Growth賞」をいただくことができました!!!
名前が呼ばれたときは本当に嬉しかったです! ありがとうございました!!

その後、クイズ大会や社員さんとの交流会、二次会など楽しいイベントが沢山ありました。
実は次の日早朝から予定が入っていたのですが楽しすぎてつい最後まで残ってしまいました(笑)

そうして長いようで短かったDojoが無事終了しました。

開発以外も楽しいイベントが盛り沢山🎉

もちろん開発以外も楽しいイベントが盛り沢山でした! 以下ではその一部を紹介します。

Dojo出身の内定者の方のLT

去年の夏に開催された最初のDojo(Go編)の参加者でCAに内定している大先輩のLT(短いプレゼン)を聞ける機会がありました。LT会はDojoの前半に行われたのですが、このLTを聞いてこれからの開発に対するモチベーションがめちゃくちゃ上がりました💪

現役エンジニアの方のLT

現役エンジニアの方から実際の開発で起こった怖い話を聞きました。
ユーザから不具合の報告を受けたもののログ(誰がいつアクセスしたか、誰がどんなガチャを引いたか、いつどんなエラーが起こったかなどの記録)をきちんと取ってなかった故に原因解明まで時間がかかり、大量のユーザに詫び石を配ること、つまり多額の賠償金を支払うことになってしまったというお話でした。
このお話を聞いて私はログを取ることの重要さがよく分かり、自分の発展課題でもログについて取り組んでみようと思いました。

社内勉強会に参加

SGEの社内勉強会にDojo生もお邪魔させていただけることになりました。
私はまさかの日程を勘違いしてしまいリアルタイムの参加はできませんでしたが、勉強会で使った資料を後日共有していただけました!
社内勉強会を始め、入社してからも成長し続けられる環境が整っているのはとても魅力的だと思いました。

入社1年目の新卒エンジニアの方との座談会

メンターさんたちが私たちにどんなSGE社員と話してみたいか要望を聞いてくださり、その結果、入社1年目の新卒エンジニアの方とお話できる機会を作っていただけました。
某超人気ゲームの開発に携わっていると聞いて、1年目から大きなプロジェクトに関われるなんてすごく夢があるなあと思いました。

企画職転向エンジニアの方との座談会

こちらもメンターさんたちが私たちの要望を聞いて企画してくださり、上記とは別の某超人気ゲームのプロデューサーをしている方とお話できる機会を作っていただけました。
エンジニア以外の職の方とお話できるのはとても新鮮でした。具体的な内容は言えないのですが、企画職もめちゃくちゃ楽しそうだな~と思いました。

バーチャル社内見学

Dojo生がオフィス(アベマタワー)に行けないことを残念がっていたら人事のこーへーさんが企画してくださりました。オフィスの色々な場所をカメラに映してくださりそれをZoom越しに見るいう感じです。アベマくんの水が無料で飲めたり、マッサージが無料でできたり、窓からの眺めが最高だったりetc. こんなオフィスでいつか働いてみたい! と思いました。

カフェタイム・シャッフルランチ・Zoom飲みなどの交流イベント

カフェタイムは開発の息抜きとしてチームごとに時間を決めて毎日開催されました。チームによって話す内容はバラバラでしたが、私のチームはずっと好きなアニメ等の雑談をしていました(笑)
とはいえ、同じチームの2人は雑談であっても「この人たちめちゃくちゃ強いんだろうなあ」と思わされるような方々で、地味に私は刺激を受けていました。

シャッフルランチは企業側が用意したイベントではなく、色々なDojo生が自発的に企画してくれた不定期イベントでした。SlackにZoomのリンクが貼られ、入りたい人だけ入って一緒に昼ご飯を食べながら雑談するというものです。普段のカフェタイムやメンタータイムはチームごとに行われるので、シャッフルランチでは他チームの人とも交流できてとても楽しかったです。企画してくれた人たちありがとう👏

シャッフルランチ以外にもDojo生発の企画は色々ありました。例えば今回のDojoには競技プログラミングにとても強い人がいて、その人にAtCoderの問題を解説してもらう会がありました。自分では思いつけないすごい解法が知れたりして楽しかったです! ありがとう!

Zoom飲みは人事のこーへーさんが企画してくださって計2回開催されました🍻
こちらもSlackにZoomのリンクが貼られ、入りたい人だけ入る&途中入り途中抜けOKというゆるい感じでした。社員さんとも交流できて楽しかったです!

リモートインターンについて

今回のインターンは3週間ずっとリモートでZoomやSlackを使ってコミュニケーションを取っていましたが、特にこれといった不便を感じることはありませんでした。むしろリモートでよかったと思う点もいくつかあります。

  • 他人の目を気にせず開発に集中できる
    毎日10時15分に全体での朝会があり、18時30分にチームごとで夕会がありました。メンターさんにZoomで質問できる「メンタータイム」や同じチームの人と雑談する「カフェタイム」は毎日各チームの都合に合わせた時間帯に開催されました。それ以外は基本的にZoom無しだったので、他人の目を気にせず開発に集中することができました。
    ちなみにSlackでの質問はメンタータイム以外の時間でもいつでもすることができました。

  • 他の予定と両立できる
    開発の時間さえ取れていたらOKなので、参加必須の初日と最終日以外、都合の悪い日は休むことができました。そのため他の予定がある人も両立しやすかったと思います。
    中には2週目を丸々休んでメ〇カリのインターンに参加した猛者、他社のハッカソンに同時参加する猛者もいました。

  • 孤独感0
    カフェタイムやシャッフルランチ、Zoom飲みなど他のDojo生や社員さんと交流できるイベントが沢山あったので孤独感は全くなかったです!
    むしろもうオフラインで会ってる気持ちになってます(笑)

  • メンターさんが犬🐶
    私のチームのメンターさんは犬(のアバター)でした。
    未だに私は人間の姿を知りません。

  • オンラインならではの企画も
    私は参加しませんでしたが、深夜にもくもく会(Zoomを繋いで黙々とインターンの課題をやる会)を開催している人たちもいました。こういった企画はオンラインならではだと思います。

他のDojo生のインターン参加記

note.com

guanghuihui.hatenablog.com

 

おわりに

数週間前までサーバーサイドどころかWeb系の開発について何も分からない状況でしたが、この夏Dojoに参加してとても成長できたと感じてます。モチベーションもかなり上がりましたし、友だちも沢山できました。また、「サーバーサイドエンジニア」という職や「CyberAgent」という企業についても前よりより具体的にイメージできるようになったと思います。沢山の貴重な経験をさせていただけて、Dojoに参加して本当に良かったと感じています。
メンターの皆さん、人事のこーへーさん、そしてDojo生のみんなありがとうございました!!!
これからも頑張ります!!!