はてなインターン2023参加記

初めまして、id:ucciqunです。

初投稿のこの記事では2023年の夏に参加した株式会社はてなインターンシップについてお話しします。

経緯

遡るは6月、夏のインターン応募ラッシュが始まった頃、私もぼんやりと修士一年の大事な夏をどの会社のインターンに捧げるべきか考えあぐねていました。

就活の早期化が進む昨今、インターンも就活の一部と言っても過言ではありません。選考の有利だ不利だと不毛で空虚な議論をするつもりはありませんが、戦略的に動くメリットがあるのも事実です。

ある日私が通う大学の学部が主催するインターンマッチングイベントが開催されると聞き、顔を出してみることにしました。そのイベントには数十の企業が参加しており、気になる企業の担当者と自由に話すことができます。私は以前から興味のあった、いわゆるWeb系企業と呼ばれるWebサービスを提供する企業の方と数回お話ししました。このうちの一つが今回取り上げる株式会社はてなです。

株式会社はてなはこのブログでも使っているはてなブログはてなブックマークを提供する企業として、以前から個人的に注目している企業でもありました。インターンマッチングイベントには株式会社はてなからCTOであるid:motemenが参加しており、私の通う大学への注目度の高さが感じられました。(大抵の企業は人事のみ参加していたため、CTOが参加しているというのはかなり目立っていました。)

id:motemenとはその後の懇親会でもお話しさせていただきました。私が現在作成中のサービスやデザインの話、最近流行りのライブラリやCloudflareが熱い話などなど…若者の話を聞いていただけて非常に楽しい時間でした。

そこで、以前から注目している企業であったことや実際に話してみて合いそうな雰囲気が感じられたため、イベント終了後直ぐに夏のインターンに応募する流れとなりました。

応募から面接まで

はてなインターンに応募するには公式のインターンページにアクセスする必要があります↓

https://hatena.co.jp/recruit/intern/index.html

私が参加した2023年のインターンでは、応募時に4桁のパスワードが必要でした。四桁の全てのパターンを繰り返し試すのが正攻法でしょう。とはいえはてなのような遊び心のある会社が何の意味もない四桁を選ぶとは思えません…。ここには答えを書きませんが閃いた皆さんは2023インターンページから試してみてください。かくして一発でパスワードを当ててしまった私はポートフォリオGitHubのリンクを掲載したESを提出して応募を完了させました。

応募から四日後に面談参加に関するメールが到着し、その三日後に面談を行いました。はてなのエンジニアスタッフ2人と私1人の3人で1時間ほどの面談でした。まず応募時の四桁のパスワードについて聞かれ、一発で通したことを伝えると愚直な方法以外で解けた人に初めて会った!とのことでした。嬉しいですね。他には応募時に提出したポートフォリオGitHub、研究について和やかな雰囲気で話すことができ、手応えが感じられました。

面接の対策について書いておくと、私は特に面接対策をしていませんでした。実際に面談を受けた時の肌感覚としてはバリバリ手を動かしてコードを書いていることや新しい技術にアンテナを張れていることについて評価しているような印象を受けました。

面談後大学で研究をしていたところ、なんと面談当日にインターンシップ内定のメールを頂きました。私は他にもいくつかのインターンに応募していましたが当日中に合格が出たのはこの会社だけでした。また、最大10人しか採用されないと聞いていたのでその中に入れたことが大変嬉しかったことを覚えています。

インターンシップに参加した

さて、今年2023年のはてなインターンシップは3週間オンラインでの開催でした。3週間のうち最初の1週間は講義パートと呼ばれ、様々な講義をはてな社員の方から教わることができます。残りの2週間は実践パートと呼ばれ、実際にチームに配属されてタスクに取り組むことになります。

講義パートについては他のインターンメンバーが詳細に書いていたのでそちらをご覧ください。どの講義も濃密で一瞬たりとも聞き逃せない内容で大変勉強になりました。

追加課題の話

講義パートでは講義と並行して課題が出されます。マイクロサービスで実装された簡単なブログシステムにいくつかの機能を追加するというものです。この課題では必須問題の他にオリジナルの工夫を加える追加課題があります。私はこの追加課題でMDN Web DocsやRustの「the book」のように文中のコードを実行する機能を実装することにしました。これはページ内実行により環境構築することなくすぐ試すことができて便利だという理由からです。

developer.mozilla.org

doc.rust-lang.orgこの機能を実装する方針として、コードを実行して結果を返すマイクロサービス(Runner)を作成することにしました。別の案としてクライアント側でWebAssemblyを用いてコードを実行することも考えましたが、マイクロサービスについて勉強したいという思いから今回はサーバー側でコード実行する方針に決めました。また、当初は複数の言語に対応する予定でしたが、時間の都合上Runnerで実行できる言語はJavaScriptにだけ対応しました。

具体的な実装としては、まずJavaScriptライブラリであるRemarkを用いてマークダウンをマークダウン抽象構文木(Mdast)に変換します。出来たMdastを走査してコードブロックを見つけ、その内容をRunnerに投げて結果を取得します。Runnerはnode:vmからインポートしたrunInNewContext関数を用いて受け取った文字列を実行します。runInNewContextはNode.jsのサンドボックスを提供するもので、信用できない外部コードなどを実行する時に利用できます。(ただしある種のクラッシュコードには対応できないので完全には信用できませんね。)

以上を実装する上でRemarkのバージョン互換問題やgRPCに慣れていなかったことなどから課題講評日の朝一時まで開発を続けてしまいました。最終的に動いたスクショを貼っておきます。GPT-4に生成させたコードを実行している様子です。

マークダウン中のコードを実行した結果が表示されている様子

Runnerが実際に動いて実行結果がブログ上で確認できた時の感動は忘れられません。講義パート最終日は東京オフィスに集合し、id:motemenから課題の講評がありました。講評の一番最後に私の成果について言及され、個人的に好きだというお言葉を頂きました!

この日がインターン唯一のオフライン参加デーとして設定されており、この後に続くチーム配属の顔合わせや社長、社員の方との晩御飯会が催されました。

実践パートの話

残りの2週間は実際のチームに配属されてプロダクト開発を行い、期間内のリリースを目指します。私はid:laminneと一緒にMackerelと呼ばれるサーバー監視ツールの開発に携わりました。このMackerelというサービスは実を言うと私が今研究している分野とピッタリでした。私はMQTTと呼ばれるプロトコルを対象に通信遅延の削減に取り組んでおり、その一環としてMQTTのサブセットやビジュアライザ、ベンチマーカーを実装することがあります。ビジュアライザでは時系列データをグラフにするなどの処理を書くことになるのですが、これがまさかMackerelに通ずるとは思いもしませんでした。

さて、このMackerelにはカスタムダッシュボードと呼ばれる、グラフを自由に置いて監視ダッシュボードをカスタマイズできる機能があります。このダッシュボードで利用可能なウィジェットのうち、大きく数字を表示するウィジェット(数値ウィジェットと呼ばれます)には少し問題がありました。普通AWSGCPのようなダッシュボードではグラフの表示期間を変更することができます。Mackerelでも同じ機能はあったのですが、数値ウィジェットは期間に依らず常に最新値が表示される仕様になっていました。また、数値ウィジェット閾値を設定することができ、閾値を超えると文字が目立って赤く表示される機能があります。これは一目でSLOを達成しているかどうかわかるなど、とても便利な機能です。ただ数値ウィジェットは最新の一点のみ指し示すため少し前に閾値を超えていたかわからないという問題がありました。これらの問題を修正し、より良い数値ウィジェットをお客様に提供するのが私たちMackerelインターンチームの仕事でした。

mackerel.io最初の二、三日はプロダクトコードを読みながら実装の方針を立てていきました。まず変更の対象になりそうなコンポーネントをブラウザから探し、コードリーディングの起点となるコンポーネントを見つける必要があります。その後関係しそうな関数の実装にどんどん降りていき、全体の大まかな構造を把握します。このように何層にも抽象化されたレイヤーを降りていき、底を確認したら浮上するコードリーディングのことを個人的にスペランカーと喩えています(未プレイですが...)。

その後の日数で実装することになるのですが、私はこのタスクで施した変更がユーザーに与える影響について考えることに時間を割く必要があると考えました。何故なら開発者目線では瑣末な変更だとしても、ユーザーには大きな影響を持つことがあるからです。

実際私がこのタスクに感じた違和感として数値ウィジェットの役割にありました。数値ウィジェットの機能について考察すると、これまでは最新のデータを表示していました。これは、時間を経てデータが増えていくグラフで最新の情報が重要であるためです。しかし、特定の期間を指定してデータを確認する場合、ユーザーが最も知りたい情報は必ずしも最新の値だけではありません。ユーザーは過去の状況を振り返りたいため、期間内での統計的な情報が役立つ場面が多いはずです。

そのため、この修正をより良い方向に向けるには数値ウィジェットに統計的な文脈を含めることは私の中で絶対でした。私がこのような考えをメンターの方々に伝えると、良く受け止めてくださり、適切にタスクの舵取りをしていただきました。

 

最終的に私たちのチームが作ったのは以下の記事で紹介されているように、選択した期間に応じた値表示とトレンドの表示、それにid:laminneさんが主に関わって作ってくださった「数値ウィジェットからグラフの全画面表示機能が開ける」機能です。私たちの仕事により数値ウィジェットに新たな方向性が見えてきたのではないでしょうか。是非社内サーバー、家庭内サーバーなどの監視に強化された数値ウィジェットをご利用ください!

mackerel.io

最終日

インターンの最終日はこれまで2週間の成果発表を行いました。その結果、ありがたいことにMackerelチームは社長賞をいただくことができました!!メンターの方々、チームメンバーのid:laminneさん、本当にありがとうございます。

感想

この夏、非常に充実した3週間でした。全社でインターンを盛り上げようという熱を感じました。ここに書ききれないほど素晴らしい体験でしたので、皆さん是非はてなインターンへ!!

 

はてなインターンはいいぞ