amazing-blog

がんばります

はてなサマーインターン2017参加記

f:id:t-k3ntaroo:20170913003916j:plainはじめてのはてなブログ

概要

8/14~9/8に行われた株式会社はてなインターンに大規模システムコースで参加しました。
全体の流れが分かる感じで書いてみたら長くなってしまった

成果物としては

developer.hatenastaff.com

があるので、こっちもぜひ読んで下さい。

目次

だれ

  • 情報系の修士課程1年生
  • 学部入学からプログラミングを始めた
  • Web系アルバイトしばらくやってた
  • 競プロとかもしている

インターン開始〜終わり

インターン選考通過まで(応募~内定)

6月半ばぐらいから「2019年卒だし、サマーインターンに行こう」という軽い気持ちでサマーインターンを探していました。
ちょっと調べてみて、よさそうな印象持った会社に3~4社ぐらい応募しました。 気がついたらレベルの高そうなインターンばかりにエントリーしていました。
1個でも受かれば運が良いぐらいの気持ちでいました。

はてなの応募フォームに技術プロフィールをまとめたJSONを入れる項目があって🤔という顔になりましたが、深いことを考えずに直接JSONを書いてValidatorに通してから提出しました。
志望は 1. クラウドサーバー管理システムコース 2. 大規模システムコース 3. はてなブログ開発コース で提出しました。
1と2はどっちでもよかったのでその場の気分で決めました。

面談はGoogle Hangoutsでやりました。
技術プロフィールにインタプリタだとか研究の成果物とか書いていたので、プログラミング言語系の人っぽい印象を与えたような気がしています。
志望理由を聞かれて「個人では触れる機会のない規模のシステムとか触ってみたい、第1志望と第2志望は迷った(どちらでもいい)」みたいなことを言った記憶があります。

通知までは1週間の予定でしたが最終的に3週間弱かかっていて、その間はとても寂しかったです。
はてなインターン内定時点でその他は1社内定・1社選考中だったので、はてな以外のはその場で全部辞退しました(日程さえあえば行きたかったけど)。

面談後からは大規模システムコースがいいなぁと考えていたら大規模システムコースに配属されたのでよかったです。

インターン開始まで(事前課題)

大規模システムコースはPerlJavaScriptの事前課題が与えられました。
8/14 0:00締切だったのですが、8/11に大学の期末レポートを提出した後から取り組みました。
Perlは初めてだったのでうなりながら書いていました。JavaScriptは書いたことがそれなりにあったのでスムーズにできました。
どちらの課題もヤバイ難易度というわけでなく、基礎的なものだったと思います。

インターン前半

1日目

朝頑張って会社前に行くと既に他のインターン生が揃っていてビックリ
オフィスに入ってからイントロダクション的な話をしたり、誓約書記入したり、環境構築したりしていました。

夜の歓迎会でインターン生の自己紹介をしたりしました。他の人みんな優秀そうでビビっていました。

ホテルにチェックインしました。よさそうなホテルだったのできっと裏では経済が回っているんだろうと思いました。

2日目〜10日目

  • 講義(11:00~13:00)
  • 昼休み(13:00~14:00)
  • 課題(14:00~19:00)
  • やりたい人は課題続き(19:00~21:00)

を基本的な1日として、Webアプリケーションを作るための基礎の話を集中的に詰め込んでいました。
講師ははてな社員が交代で担当していて、とても気合が入っていました。
講義の内容は基礎的だったと思いますが、課題を時間内に終わらせるのはとても大変でした。21:00ぎりぎりまでやっていた日も結構ありました。
課題全体としてシンプルな日記サービスをつくるというものになっていて、1日ずつWebアプリケーションに必要な項目を扱っていく形式でした。
だいたいの課題は出された日の翌日の11:00提出で、その後に講師の人からApproveをもらうまで修正し続けたら終了という感じです。

内容は↓のような感じでした。

  • 8/15(火) 2日目 Perl基礎 (裏ではScala基礎)
    • 講義: Perlの勘所を解説→OOP・テスト→Perlの便利ライブラリ
    • 課題: 日記サービス内に登場しそうなデータ構造を定義→簡単なテスト
    • 感想: Perlは独特だなぁと思った
  • 8/16(水) 3日目 DB
    • 講義: DB一般の話、リレーショナルデータベース(MySQL)、PerlでDB操作する
    • 課題: 日記サービス内のデータ構造をDBテーブルにして、それらを操作するCLIを作る
    • 感想: 課題の量がマシマシ、講義では言われてなかったが正規化するように気をつけた
  • 8/17(木) 4日目 HTTP/WAF(Web Application Framework)
    • 講義: HTTP・URI、WAF使う時の設計(MVCとか)、PerlのWAFの使い方
    • 課題: CLIで実現したデータ操作を、Webページ上でできるようにする
    • 感想: Webアプリケーションができてきた、たのしい
  • 8/18(金) 5日目 JavaScript (裏ではiOS)
    • 講義(JavaScript): JavaScriptのコア部分の話、DOM、非同期、フロントエンド
    • 課題: Webページに動きをつける(Webページ遷移なしでページングを実現したり)
    • 感想: 適当に書くと後からいじれなくなりそうなので設計に気を使った
  • 8/21(月) 6日目 機械学習 (日記サービスとは直接関係ない)
  • 8/22(火) 7日目 デザイン・インフラ
    • 講義:
      • デザイン: 実プロダクトリリースまでのデザイナーさんの体験記 & デザイン一般の話
      • インフラ: Webインフラに求められる基本の話
    • 課題: なし
    • 感想: ためになった、インフラ講義聞いたあとはもっと勉強したくなった
  • 8/23(水) 8日目 AWSハンズオン
  • 8/24(木) 9日目 企画→自由課題
    • 講義: 企画の話・日記アプリケーションにあったらよい機能を考える
    • 課題: 日記サービスに独自の面白い機能をつける
    • 感想: 面白い機能考えるのむずかしい
  • 8/25(金) 10日目 自由課題
    • 独自機能をつけながら日記アプリケーションを完成させる
    • その後発表会→投票

最後の自由課題を成果として、投票が行われました。
僕は8人中3位だったので、上位3名に与えられるはてなブログTシャツをゲットしました(わーい)

2週間もあるとPerlを苦しまずに真顔で書けるようになっていました。

インターン後半

後半は大規模システムコースに配属ということで、開発基盤のチームの席で開発をしていました。
チームの相方はid:makenowjust君で、前半の様子から一番実力がありそうと感じていたメンバーでした。

やったことははてな開発者ブログの記事に書いてあるので、過程を中心に書いていこうと思います。
記憶と主語がいい加減ですが許してください。(主語がないところは僕がやっているとは限りません)

1日目 08/28(月)

  • 配属直後にインターン担当の社員さんと話して、「エージェントの相互監視」みたいなタイトルだけ決めた
  • その後2人でしばらく話してみて、相互監視部分はhashicorp/memberlistとかを利用したほうが良さそうという話になった
    • 唐突にGo言語開発がスタートした
  • 僕がしばらく調べ物をしていたら、横でmakenowjust君が相互監視のプロトタイプみたいなものを早速作り上げていてさすがだった

2~3日目 08/29(火),30(水)

  • memberlistのPingが成功したら、相手先のロールに合わせてヘルスチェックを行う仕様な仕組みを簡単に作った
    • 当時はラフにシェルを叩く仕組みだった
  • 実験のために、バックグラウンドでmackerel-agent&相互監視エージェントを起動しながらアプリケーションを実行できるDockerイメージを作った
  • 手元のMacだと動くので、作ってもらったEC2インスタンス上でやってみたら、mackerel-agentのAWS integrationが謎に動作してエージェントが全部同じとみなされていたっぽい
    • Mackerelチームにクレーム質問を投げる
    • AWS integrationを妨げるためにiptablesで通信をぶった切る方針に
  • 並行してGoの簡易netstat的なもの(go-netstat)を作り始めた

4日目 08/31(木)

  • iptablesをいじったら本当に上手く動いた!(みたいなのが横で行われていた)
  • go-netstatが最低限できてきたので、相互監視エージェントを起動するとnetstatの通信情報から勝手にクラスタにjoinできるようになった
    • 自動joinあたりは全部makenowjust君が書いた

5日目 09/01(金)

  • ここまでの成果をまとめて頭を整理して、後半どうしようと相談した
  • 以下のような役割分担になった
    • makenowjust: エージェントの通信量が多いところがあったりするのでいろいろ調整する
    • t-k3ntaroo: netstatのデータを集めて可視化する
  • 僕は可視化のために、まず各エージェントがMackerelに向けてメタデータとしてnetstatのデータを送るところを書いていた
  • 横でmakenowjust君が大量にコンテナを起動していたら、動作が不安定になったりしていた
    • memberlistのキューがあふれたり、ARPテーブルが溢れたりしていた

6日目 09/04(月)

  • makenowjust君が土日の間にMakeNowJust/pngを作っていてビックリ
    • アプリケーションのヘルスチェックの仕組みがだいたいできてしまった
    • 僕は土日ずっと論文を書いていました…
  • netstatのデータを集めてGraphvizで画像出力してみた
    • 規模が大きくないとまともな図が出たが、コンテナ約100台でやってみたら18304x309の画像が出てきて限界を感じた
  • 他のツールないかなぁと探していたら、graphDBとかNeo4jとかいうワードがでてきて、Neo4jやってみようとなった
  • エージェントが相互にヘルスチェックをするので、そのヘルスチェックも可視化に含まれてしまい完全グラフっぽくなることを確認
    • これは事前の想定通り
  • 気がついたらgo-netstatがより多機能なshirou/gopsutilに完全に置き換えられていた(R.I.P.)

7日目 09/05(火)

  • makenowjust君がヘルスチェックを通信状況として含めないように実装してくれて、可視化がキレイになった
    • PIDから上手に判断する感じ
  • Mackerelに保存しておいた通信状況のデータを集めてNeo4jにクエリを投げつけるプログラムを書いた
    • おしゃれなグラフが出てきた

この時点で成果物がおおよそ完成していました。

8日目 09/06(水)

  • ちょっとプログラムを調整したり、実際の環境で今回の成果物を試してみた

9日目 09/07(木)

  • 僕は発表資料を書き始め、makenowjust君はブログの執筆を始めた
  • 深夜にmakenowjust君から「Web UIの改善やってみるけどどうでしょうか」みたいなメッセージが来たのでいいよと返した
    • 僕は応援しながらも普通に寝ました

10日目 09/08(金)

  • 朝起きたら新しいWeb UIができていた(すごい)
  • 発表した
  • 午後は他チームがゆったり参加ブログを書いている間、大規模システムコースだけは技術ブログ執筆でてんやわんやしていた
    • 僕は図を生成しまくったり、可視化の章を加筆したりしていた
    • 無事ドラフトを提出
  • 投票開示
    • 大規模システムコース 2位
    • 技術賞とれた(わーい)

インターン

  • 26連泊して完全に実家となったホテルとお別れ
  • 午後から京都駅でランチ食べたりスイーツ食べたりお土産買ったりしてから帰宅
    • 京都から帰りたくなかった
  • 家のベッドで寝ているとホテルのベッドが恋しくなる

インターン感想

  • 前半のボリューム満点の講義&課題をこなすのは大変ながらも楽しかったです。
    • 課題は全体で1つの作品になるので、「今書いているコードが後日バグったらどうしよう…」と震えながら書いていました。
  • 後半
    • テーマ決まった時点で「2週間では無理ゲーでは?」と思っていました。
    • 相方が爆速でコーディングしてくれたのでなんとかなってしまった
    • 僕は後半でエージェント部分をあまり触っていないのですが、裏でサクサクできていてすごいと感心していました。
    • そのおかげで僕は可視化に時間をかけることができたので、役割分担できていてよかったです。
      • 可視化ももっと時間をかけていろんなツールを試してみたかった…
    • メンターの人たちのアドバイスも有益でさすがプロという感じでした。
    • 楽しい研究開発って感じでした

その他いろいろ

ホテル

今年は例年と異なり1人1部屋だったのでとても快適でした。
朝食券も日数分もらえるので、毎日ホテルで朝食が食べられました。
僕は朝起きれない人なので半分ぐらいしか行けませんでした…

戦利品

いろいろもらいました

f:id:t-k3ntaroo:20170913003916j:plain
戦利品たち

京都ご飯

烏丸御池付近のご飯を食べまくっていました。
ラーメンを中心にいろいろ食べていました。
適当にお店に入っても大体おいしいのはすごいと思いました。

あと、はてなではお昼ごはん(まかない)が用意されるのがとてもありがたいです。

観光

前半が終わった次の日に社員さん2人とインターンで京都観光しました。
南禅寺とか鴨川あたりを歩いていました。

まとめ

はてなの社員さんは面白い人ばかりで、見たり話したりしていて世界が広がりました。 インターン生も個性豊かながらもみんなレベルが高くて、とても意識が高まりました。

こういう恵まれた環境に4週間もいられる機会は他にはないんじゃないかと思います。

とても楽しかったです。

他のインターン

(順番は投稿順です)

anatofuz.hatenablog.com

hogashi.hatenablog.com

snowman-mh.hatenablog.com

ishikawa-pro.hatenablog.com

cohalz.hatenablog.com

syfm.hatenablog.com

makenowjust.hatenablog.com