JJ1UZH - はてなサマーインターン2022に参加した

目次

はてなリモートインターン2022の参加記です. 媒体は問わないとのことで, なぜか みなさんはてなブログで書いていらっしゃるようなのですが, 自分はGithub Pagesに書きます.天邪鬼ですみません.言い訳をすると,Emacs/org-modeでしか文を書けない病に冒されているのです.

1. 応募したきっかけ

 まずインターンに行こうと思ったきっかけは,先輩がインターンは行ったほうがいいぜと言っていたことと, 大学の必修単位に読み替えられることです. はてなに応募した理由は,内容がおもしろそうだったのと,技術スタックにScalaがあったからでした. Scalaでの開発であれば多少慣れていたし,好きな言語なのでいいなと思ったのです. 結局Scalaは使わなかったんですけどね.

2. 選考

 面接はリモートで行われました(インターン自体がフルリモート). 応募したきっかけや技術的な興味の他,GitHubでの活動についても話して,評価していただいたのかなと思います. 活動といっても,主にLinuxのツール系の小さいOSSにバグフィックスや機能追加を送るくらいなのですが, オープンな開発を推奨するはてなの理念と合っていたのかもしれません.たぶん.

3. 前半:講義パート

 「Web API」「インフラ」「コンテナ」「マイクロサービス」「RDBMS」「フロントエンド」「Kubernetes」「デザイン」の講義がありました. それぞれ1時間で,体系的に駆け足で解説するという感じでした. 個人的には,「Web API」「インフラ」「コンテナ」「RDBMS」「Kubernetes」は頭にスッと入ってきましたが,「フロントエンド」 は分からないところも多かったです(Reactを触ったことがなかったからだと思う). フロントエンド技術は本当に活発ですごいな〜と思いつつ,あまり触れていないので,Reactか何かやりたいですね. 「デザイン」は全然触れてこなかったことなのでとても興味深かったです.

 最後の1日半は課題パートで,Go,Kubernetes,gRPCといったスタックのWebサービスに指定された機能+αを実装するものでした. いわゆるマイクロサービスで,protobufからコードのテンプレート生成→gRPCで通信というのを実際に作って体験しました. 普段はモノレポでモデルやDBを共有する方式で開発しているので, 「コードを共有するより重複させる」というやり方は新鮮でした. ただ全体のメンバーが少ないときはやはりモノレポの方がいいと思うし,バランスが難しそうという印象.

4. 後半:開発パート

 自分が配属されたのはサービスプラットフォームチームというところで,内容は 「社内のアカウント基盤に実験的にTOTP(時刻ベースのワンタイムパスワード)を実装する」というものでした. TOTPというのはGoogle Authenticator等でQRコードを読み取って6桁のコードを入力するやつで,最近ではいろんなサービスで使えるようになっています. インターンの課題という観点でTOTPのアルゴリズムの部分を実装しようかという話もあったのですが,GoのOTPライブラリを使うことになりました. それでもしくみを知らないで使うのは健全ではないので,まずRFCを眺めるところから始まります.

 RFCを読んだ感想は,結構単純だけどよく考えられて作られているな〜でした. 普段Google Authenticatorを使うときは何か魔法のようなことが行われていると思っていたのですが, しくみを知ってみればなるほどな,という感じです. サーバーとクライアントで鍵を共有して,それぞれが同じアルゴリズムでコードを生成して比較する,それだけなのですが, コードが数字6桁になるように短縮したり30秒は同じコードが出力されるようになっていて,使い勝手のことも考えられています. 認証方法はそれ自体が安全でも,ユーザーの手順が面倒だと誰も設定しなかったりバイパスするようにしてしまって逆に安全性が落ちますから,よいことだと思います. それと,暗号学的な安全性も担保されています. 出力コードに偏りが無く,前の値を知っていても今の値を知ることはできないようです. 論文を読んだわけではなくてRFCに書いてあることを鵜呑みにしたのですが,暗号学でありがちなAdversaryを仮定して云々みたいな証明が行われているんだと思います.

 なんとなく仕様を理解したら,実装に入ります.ライブラリを使うからすぐできるやろと思ったのですが, そうは問屋が卸しませんでした. まず今回実験的にDynamoDBを使ったのですが,自分は初めて触れたのでその仕様を把握するのに戸惑いました. 加えてDBのGoインターフェースの使い勝手に慣れるのにも時間がかかりました. Goはコード生成しないといけなかったり,structのメンバーがnilで初期化されて謎panicしたりして困ります. 割りきった言語なので仕方ないですけどね.その分良いところもあるので一長一短だと思います(当り障りのない主張).

 もう一つ困ったのがセッション管理です. パスワード→TOTPの間など一時セッションが必要な箇所がいくつかあって,そこを上手くやるしくみを作ったほうがよかったのですが時間がありませんでした.

 結局のところ,最終的な成果としては,「TOTP有効化・無効化」「TOTP・リカバリーコードを使った認証」は一応できるようになりました. それと,クライアントとサーバー間で多少タイムスタンプがずれても認証を通すようにもしてみました. コードを書いていたら認証アプリの表示が次のコードになってしまって書き直した,という経験がある人もいるかもしれません(自分もある)が, コードは鍵とタイムスタンプから一意に出せるので,サーバー側でひとつ前のコードを計算することもできるんですよね. だから大体のサービスではひとつ前のコードでも認証できるようにしていると思います. これはしくみを知らないと想像しにくいことかもしれません.

 細かい仕様で直さないといけない箇所は残してしまったのですが,最低限動くところは作れたかと思います. 最後にフロントのデザインもして頂いたのですが,デザインが付くと良いものを作っているなあというのを感じられてよかったです. 他のインターン生の方も言っていましたが,デザインは開発のモチベにも直結していて大事なんだなと思い知りました.

5. 成果発表

 最終日に全体で成果発表が行われました.他のインターン生の方々は1週間で機能リリースしていたり,協業他社との兼ね合いに取り組んだりしていて すごいなぁと思いました.やはり手が早いのは大事ですね. 自分は認証機能の実装なので慎重にならざるを得ないとはいえ(言い訳),もっと手早く作れたらよかったです. それと,自分の発表に対する他のインターン生からの質問で,スライドには書いてないけど実装する上で相談したようなところをいくつか訊かれて ちょっと驚きました.同年代だと思いますが経験が違うなと思いました.

6. リモートワークについての雑感

 感じたこととして,みなさんリモートですごく上手く仕事をしてるなぁというのがあります. はてなはもともと京都と東京にオフィスがあって リモートワークしていたのと,2020年以降もコミュニケーションを円滑にする工夫をしているみたいです. 自分が配属されたプラットフォームチームでは,夕会の一部として「ひとこと日記」というのをやっています. メンバー全員が同じページに短い日記を書いて,それを読み上げつつ雑談して盛り上るというものなのですが, これのおかげで違和感なくチームに参加できたと思います. 仕事仲間とはいえ,やっぱりある程度趣味や考え方などを知っていたほうが関わりやすいですね. 他にも勉強会や「ほたて」,朝会(一度だけ参加)などがリモートで行われていて楽しかったです. 自分は物理出社派だったのですが,これくらい上手くやっているとリモートもいいなと思いました.

7. まとめ

 インターンに参加するまでは,今やっているアルバイトと違う経験が得られるのかをちょっと懸念していたのですが,杞憂でした. 機能を実装する上での設計の相談や開発手法,リモートでの働きかたなど多くを得ました.

 インターン中,開発を支えてくださったチームの皆様やはてなの社員の皆様に感謝申し上げます.ありがとうございました!

m(_ _)m