blog.fujishan.jp

長いときも短いときもある。

はてなリモートインターンシップ2023に参加しました

ふじしゃんです。

8/21 ~ 9/8 の3週間、はてなリモートインターンシップ2023に参加してきました。
hatena.co.jp

今回はインターン参加記を書いていこうと思います。

応募

はてなリモートインターンシップの存在自体はかなり前から知っていましたが、実際に応募するのは初めてでした。
応募するときに募集ページを見ていて「はてなは2008年からインターンシップをしていたのか!」とびっくりしたのを覚えています。

「10年後の自分を作る」というなんだかカッコいいキャッチフレーズと、いつもお世話になっているはてなブログと Mackerel などの開発を体験し、実際にリリースしてユーザーからのフィードバックを得ることができるところに惹かれて応募を決めました。

はてなリモートインターンシップでは応募する前に簡単なクイズが毎年出題されます。
これを解かないと応募ページにたどり着くことができません。
今年は「4桁のパスコードを入力して応募しよう!」というクイズで、ソースコードにパスコード書いてあるやろ〜とおもむろに F12 キーを押すとしっかりと暗号化されていたので、以下のようなコードを書いて無事正解することができました。

async function main() {
  for (let passcode = 1000; passcode <= 9999; passcode++) {
    try {
      const result = await unlock(passcode);
      return result;
    } catch (e) {}
  }
}

main()

あとは、応募ページに GitHub や今までやってきたことなどをポートフォリオとしてまとめて提出しました。

面接

面接は Google Meet を通して1時間ほどで行われました。
気さくでとても話しやすいエンジニアの方と2対1の形式でした。

私は特に面接に向けて対策などは行っていなかったのですが、面接官がエンジニアということもあって、GitHub で公開されているソースコードや技術に関する話題で盛り上がりました。
ブロックチェーン, OAuth2, OIDC, Perl, ソフトウェアアーキテクチャの話は特に楽しかったです。
最後らへんは完全に雑談という感じでしたが、はてなの雰囲気や技術選定に関する質問などをさせていただきました。

面接という感じはしませんでしたが、あっという間に1時間は過ぎ去りました。
終わった直後に「はてなのエンジニアさんめちゃくちゃ ツヨツヨ 〜〜〜」とツイートしたのを覚えています。

ここからが驚きなんですが、合否が面接をしたその日に届きました。
一息つく間もなく「内定のお知らせ」というメールがきて動揺したのを覚えています。

スピード感がとんでもなかったです。

1週目: 講義パート

はてなリモートインターンシップの醍醐味とも言える Web に関連する技術を網羅的に取り扱う講義パートです。
かなり楽しみにしていました。
講義は 45~60 分ほどのものが、10個ほどありました。ということは合計で約600分 = 10時間ぐらいの講義ということですね!(凄い)

ちなみに、講義パートといいつつも、1週間で Go, TypeScript, gRPC, k8s などのモダンな技術スタックで小さなブログサービスを作るという課題とセットになっていて、実際に手を動かしながら学べたのは良かったです。

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

Web/HTTP

Web の根幹である HTTP を学びました。
RFCをベースに仕組みを理解する流れで講義は進みましたが、特に HTTP/0.9 や Head of Line Blocking の話が面白かったです。

Web API

現代の Web には欠かせない API について学びました。
講義の中では、REST, GraphQL, gRPC が取り上げられていました。
実際に課題で gRPC を用いてサービス間の通信を実装したのですが、型が付いて脳汁ドバドバでした。

インフラ

Webサービスを開発運用するときのインフラについて学びました。
System - (Application + Data) = Infra という説明と、コストはシステムの生み出す価値と天秤に掛ける必要があるという言葉がとても印象に残っています。
また「計測できないものは制御できない」という名言やサイト信頼性エンジニアリングについても取り上げられていました!

コンテナ

Docker を始めとするコンテナ技術について学びました。
コンテナは、プロセスが利用できるリソースを制限する技術を組み合わせて実現されていて、Linux Kernel が持っている Namespace という機能が UID/GID の分離や CPU, メモリ使用量などを制限していることなどを教えていただきました。
コンテナイメージが階層化された tar アーカイブというのは初めて知ったのでびっくりしました!

コンテナオーケストレーション (k8s)

コンテナの講義をベースに、複数のコンテナを協調させ高い可用性を実現するための仕組みを学びました。
なんだかんだ k8s をまともに学んだことがなかったので、インターンが終わったあとにラズパイのクラスタを組んで遊んでみようと思いました。

ソフトウェアアーキテクチャ

ソフトウェアにおける設計の重要さを、建築をベースに学びました。
大規模工事でドデカイ建物を建てるためには構造設計が必須で、それはソフトウェアも同じであるということを教えていただきました。
また、システムの外形的アーキテクチャとしてモノリス, モジュラーモノリス, マイクロサービスなどの設計手法やレイヤー化アーキテクチャを通して依存関係逆転の原則について学びました。

RDBMS

この講義はブートキャンプの形式でした。
SQL の構文や RDB 入門をしたのちに、テーブル設計や INDEX や EXPLAIN を用いたクエリのパフォーマンスチューニングも学びました。
Slow Query をモニタリングして EXPLAIN してチューニングするの大事だなぁと思いました。

フロントエンド

この講義はブートキャンプの形式でした。
現代のフロントエンドとして React の話を聞いたり、JavaScript, TypeScript の構文について学びました。
JavaScript やフロントエンド周辺技術の標準化についても知ることができたので良かったです。

ビジネス

はてながどのような事業を行っているのかについて、はてなブログを題材として学びました。
エンジニアがビジネスの視点を持つことの重要さなどを教えていただきました。

Perl

この講義はブートキャンプの形式でした。
元からはてな = Perl の会社という印象でしたが、Perl の講義が鎮座していてびっくりしました。
周りのコードを読みながら Perl のコードを書けるように、基本的な構文について学びました。

どの講義もスピードは速かったものの、キーワードだけでも脳内にインデックスを高速で張ることで、必要になったときに調べるということが出来るようになるので、とても勉強になりました。
講師のみなさん、ありがとうございました!

オフラインデー

今回のインターンでは、1日のみオフラインデーがありました。

東京オフィスに集合して、1週間でこなした課題の総評や交流会などを行いました。
また、翌週から始まる実践パートに向けての準備運動などもありました!

2~3週目: 実践パート

いよいよ、実践パートです!
私は「はてなブログチーム」の配属になったので、はてなブログの開発を担当することになりました。
はてなブログは私がプログラミングを始めた中学生の時から知っているので、感慨深いです。

さて、インターンで開発したのは「Mastodon と Misskey に記事をシェアする機能」です。

Mastodon と Misskey のシェアボタン

SNSが多様化する中で、Mastodon や Misskey などの利用も広がっています。
はてなブログMastodon と Misskey に記事をシェアする機能を実装することで、記事のシェアが促進されるのではないかと思い、実装をすることに決めました。

実装する中で工夫した点として、WebFinger を用いて Mastodon や Misskey がホストされているサーバーのドメインを取得するようにした部分が挙げられます。
ActivityPub におけるユーザーID は @test@example.com のような形式で表すことができますが、この example.comMastodon や Misskey が必ずしもホストされているわけではないのです。
例えば、Vivaldi Social ではユーザーID は @test@vivaldi.net であるが、サーバーは social.vivaldi.net という構成になっています。
これに対応するために、RFC7033 で標準化されている WebFinger という仕組みを用いました。

RFC7033 には、CORS への対応を MUST で行うように書かれているためフロントエンドから呼び出すこともできますが、ほとんど変わることのない値であることを考慮して、バックエンドで一定期間レスポンスをキャッシュするようにしています。

8/28 ~ 9/6 にかけて開発を行い、9/7 に本番環境に無事リリースすることができました!

staff.hatenablog.com

リリース後の反響

Misskey の作者である Syuilo さんに機能をご紹介いただいたり、リリース記事のブックマークが 100users を超えるなど、大きな反響をいただきました!
また、はてなブックマークSNS でのコメントもポジティブなものばかりで嬉しかったです。
(リリースした日の夜は、ひたすらエゴサをしていましたw)

b.hatena.ne.jp
misskey-hub.net
misskey.io

を130件も頂いてしまいました!

成果発表

はてなには「ほたて」と呼ばれる成果を発表してみんなで投票する会があります。
今回はインターン特別版のほたてを開催してくれました!!!

結果は………

ほたて賞 をいただきました!!!!!!!

どのチームもとても良い成果を残されていたので、とても嬉しいです。

おわりに

3週間という短い期間ではありましたが、はてなに染まることができました…!
メンターさんがとても優しくて、お世話になっては合掌していました。

また、インターンを通して巨大なコードベースとの向き合い方を学ぶことができました。
すべてを深く把握しようとするのではなく、浅く脳内にインデックスを張っていき、本当に必要になったときに深く掘り下げる。
エンジニアとして生きていく上でとても大事なスキルだな、と思いました。

以上、はてなリモートインターンシップ2023の参加記でした!!!

さぁ!この下に表示されている Mastodon と Misskey のシェアボタンからこの記事をシェアしよう!!!