はてなインターンシップをリモートで開催する方法─精神と時のステイホーム

こんにちは。 チーフエンジニアのid:cockscombです。 インターンシップでカリキュラムをリードしています。 私自身が2012年のはてなサマーインターンシップ参加者という経験もあり、ここ何年か特に大きくインターンシップに関わっています。

この夏、はてなはインターンシップをリモートで実施しました。 2008年にサマーインターンシップを始めて今年で13年目ですが、その歴史で初めてのオンライン開催になりました。 それには多くの検討が必要でした。

春先にインターンシップの計画を始めてすぐ、新型コロナウイルスの深刻な影響が明らかになりました。 はてなでも2月中旬から許可されていた在宅勤務が、ほどなくして推奨になり、緊急事態宣言下では原則として在宅勤務と、状況も変化していました。 例年通りにインターンシップを開催ができないことは、4月の時点で明らかでした。

こうしてリモート開催に舵を切ったインターンシップを、どう計画し、実施したのか? 運営者の立場から振り返ってみようと思います。

リモートの難しさはコントロールの難しさ

オンラインで開催するインターンシップは、これまでと勝手が違います。

リモートでの難しさは「コントロールを効かせにくくなる」ことにあると考えました。 コントロールとは、状況を認知し、行動を決定して、実際に制御を働かせる、一連のプロセスのことです。 リモートでは状況を正確に知ることも、実際に制御を行うことも難しいでしょう。

また、コントロールが難しくなったことで、どういった影響が出るのかにも考慮すべきです。 コントロールできなくても問題にならないことと、深刻な影響が想定されることがあります。 リモートでの開催は、こういったことを前提として検討しなければなりませんでした。

日程の設計 ─ 期間を短く参加者は倍に

例年のインターンシップでは、下図のように4週間にわたるカリキュラムを組んでいました。 前半の2週間でWebアプリケーション開発をまさに一通り学び、後半2週間で実際のプロダクト開発を経験します。 4週間の長丁場は「精神と時の部屋」とも呼ばれ、濃密な体験を生み出していました。

例年の日程
1週目 講義
2週目 課題
3週目 プロダクト開発
4週目 プロダクト開発 フィードバック

しかしリモートで実施するとなると、4週間ものカリキュラムが果たしてどのような影響を与えるか未知数でした。 最悪の場合、参加者が疲れ果ててしまうのではないかという懸念がありました。

そこで方針を大きく変え、下図のように期間を1週間に短縮してリスクを緩和するとともに、参加者を入れ替えて2回実施することにしました。

2020年の日程
講義 課題 フィードバック

例年の日程なら得られたであろう経験がなくなってしまうのは残念です。 一方で、リモートかつ短期間の開催とすることで、多くの人が参加しやすくなるメリットもあります。 実際に、募集人数は例年の倍以上となる20人に設定できました。

カリキュラムの設計 ─ 課題を中心に

カリキュラムは、課題を中心として一から作り直しました。 構成として、講義・課題・フィードバックの3つの要素からなります。 これは、将来の成長につながるフィードバックループの最初のイテレーションのつもりです。

このうち、私たちがコントロールしやすいのは課題です。 課題を中心に設計することで、全体を見通しやすくなります。 このため課題の良し悪しが、インターン全体の良し悪しに直結することになりました。

今回のインターンシップの課題には、次のような条件が求められると考えました。

  • はてなのインターンシップなので、Webサービスの開発を課題にしたい
    • 技術的なおもしろさだけでなく、サービス作りのおもしろさを組み入れたい
  • 時間的な制約
    • 3日間で取り組めるものでなければいけない
  • 参加者にとって取り組むに値する課題であること
    • メンターにとっても、しっかりフィードバックできるもの
    • 「創意工夫の余地」

これらを満たしつつ、さらにある種の「派手さ」が必要です。 作っているものが実用的で、きちんと触れるものでなければ、モチベーションを保つのも難しくなるのではないかと思います。

マイクロサービスでブログを開発する課題に

これらを所与の条件として、テーマを「マイクロサービス」に置いてみました。

ブログシステムをマイクロサービス的に用意しておいて、その一部のサービスを丸ごと開発してもらう課題です。 インターン生の視点からは、ある程度は動作するブログシステムが与えられ、そこに機能を追加していく形になります。

インターン生は、事前に用意されたブログサービスやアカウントサービスをもとに、MarkdownなどからHTMLへと変換する「記法変換サービス」を開発します。 独自の記法を追加することと、リンク先のページタイトルを自動的に取得する機能は必須としました。

事前に用意されたシンプルなブログシステム
事前に用意されたシンプルなブログシステム

インターン生の開発環境もまた、コントロールが難しいものの筆頭にあげられます。 コンテナ技術を使うことで、環境の差異を少しは平準化できるはずです。 コンテナオーケストレータにはKubernetesを使い、サービス間の通信はgRPCで行います。 Docker Desktopもしくは、minikubeSkaffoldを使えば、手元でも複数のコンテナを使ってうまく開発できるでしょう。

開発言語は、Go言語をメインとして、記法変換サービスはGo言語かTypeScriptを明にサポートしました。 ただし「別な言語を使ってもいい」としています。 実際に参加者が選んだ言語はGo言語が多いものの、TypeScriptはもちろん、KotlinやRustなどを選択したケースまでありました。

課題に取り組むために必要な知識を1日の講義で

課題に取り組んでもらう前に、講義の日を設けました。 これから使う技術がどういうものなのか知ってもらうことで、より効果的に学べるだろうと考えています。

講義の日に説明したいことはたくさんありますが、休憩もしっかり挟みたいので、45分の講義が4本と、課題の説明という構成にしました。

また座学が中心だと眠たくなるだろうから、途中で手を動かす「Let's try!」コーナーや、ハンズオンも取り入れています。

講義で取り上げるテーマは以下の4つです。

  1. Web API
  2. コンテナ
  3. Kubernetes
  4. マイクロサービス

「Web API」の講義では、最終的にはgRPCの使い方を教えようというものです。 ただし形だけの知識にならないように、gRPCが内部で使っているHTTP/2や、Web API一般に関しても説明しました。

「コンテナ」の講義は、Dockerだけではなく、コンテナ技術とはどういうものなのかを説明しようと試みています。 この講義の「Let’s try!」コーナーでは「Docker Quiz」を出題し、人気を博しました。

「Kubernetes」はハンズオン形式で、とにかく手を動かしてもらいます。 Kubernetesに実際に触れることで、課題で実際にKubernetesクラスタに変更を加える際にも、あまり身構えずに済むようにと企図しています。

「マイクロサービス」の講義では、なぜマイクロサービスにするのか、というところをしっかりと説明します。 あわせてマイクロサービスのいくつかのパターンや、サービスメッシュのような技術についても紹介します。

なお、講義の配信にはATEM Miniを使って、手元のPCにある講義資料とビデオカメラからの入力をPicture in Picture形式に合成していました。

講義の配信:titel=

新しい視点と柔軟な発想に満ちたフィードバック

インターンシップの期間中は、かなりの時間をメンターが張り付いています。

その場で質問にも答えるのはもちろん、取り組みに対してレビューすることも仕事のひとつです。 レビューの目的は、もっぱら「インターン生に新しい視点を持ってもらうこと」としました。 違ったバックグラウンドと経験を持ったメンターが、その視点を分け与えるというイメージです。

反対に、インターン生に感心させられることも多くありました。 柔軟な発想に舌を巻いたり、そもそも自分と異なった専門性を持っていることもあります。 そういうときは、ちゃんとそうフィードバックするように心がけています。

カリキュラムの終わりには、それぞれの創意工夫を発表してもらいました。 発表は、社長や執行役員、CTOおよびインターンシップに関連したスタッフの前で行います。 発表を行うことで、他者からのフィードバックを集められるのはもちろん、自分自身で振り返ることもできたのではないでしょうか。

コミュニケーションの設計 ─ ツールの活用

リモート開催でいちばん難しいのは、コミュニケーションの設計でした。 いつどのようなツールを使うかなど、頭を悩ませました。

講義・発表・交流会にはZoomのビデオ会議

講義や発表、あるいは交流会のように、複数人が集まってビデオチャットするときには、Zoomを利用しました。 他のソリューションとちゃんと比較したわけではありませんが、特に交流会の時に ブレイクアウトルーム 機能でミーティングを分割できるのが便利です。

それ以外には、社内がリモートワークにシフトしていく中で生まれたプラクティスを取り入れました。

ちょっとした会話にはDiscordのボイスチャンネル

ひとつは、Discordの活用です。 リモートを前提とすると、コミュニケーションの手段としてはテキストでやりとりするか、ビデオ会議を設定するかということになります。 近くの席の同僚にちょっと声をかけるのと較べると、気楽さで劣ります。

そこで最近は、Discordのボイスチャンネルが流行しています。 ボイスチャンネルに参加していれば、「話しかけてよい」という合図です。 ちょっと相談したり、雑談したりしやすくなります。

ただし、インターンシップはお互いに初対面で、関係性が構築されている同僚とのコミュニケーションとは違います。 そこで事前に交流会を催すなどして、少しでも顔見知りになれるようにしました。

テキスト情報の共有にはScrapbox

もうひとつは、Scrapboxです。 ボイスチャットやビデオチャットは高密度にコミュニケーションできる一方で、時間を奪い合う形にもなりやすく、テキストで非同期的にやりとりする方がスケーラブルです。

そのため作業ログや、ボイスチャットで相談した内容など、とにかく何でもScrapboxに書き残すようにしました。 後から振り返ることもできるし、他者と共有するのも便利です。

DiscordやScrapboxの活用では、状況を伺いやすく、伝達されやすいように気を配りました。 もちろん別な方法もあったでしょうが、例えばビデオ会議を常に繋いでおくような運用はお互いに負担が大きいのではないかと考え、バランスを取りました。

まとめ ─ 課題と講義は公開しています

先に述べたように、リモートのインターンシップでは、従来と較べてコントロールが効かせにくいという課題があります。 特にコントロールが効かないことによる影響が無視できないようなものについて、緩和したり、内容を差し替えたりしました。

振り返ってみると、コントロールしやすい課題を中心に設計したことで、インターンシップを円滑に進められたように思います。

インターンシップをインターネットに還元

はてなは、「知る」「つながる」「表現する」で新しい体験を提供し、人の生活を豊かにするをミッションとしています。 私たちスタッフもまた、インターネットから多くを得てきました。 だからインターンシップでは、私たちが得たものをインターネットに還元することが目的のひとつになっています。 インターンシップの修了者を世の中に送り出すこともその手段です。

そして今年は、インターンシップの講義と課題をインターネットで公開しました。

はてなリモートインターンシップ2020
オンライン 講義動画&課題公開

ぜひご覧ください。


今回のインターンシップでは、CTOのid:motemen、企画のid:zokomoko、人事からはid:manabuno2id:okikukunとともに春から検討を重ねました。 課題や講義では、id:akiymid:itchynyid:susisuの3名が実際に手を動かしています。

講義の配信に際してはid:nagayamaの知識とテクニックが総動員されました。 また社長のid:chris4403および創業メンバーで執行役員のid:onishiが、忙しいにも関わらず多くの場面でサポートしてくれています。 さらに5人のメンターや、他の多くのスタッフの協力を得て、ようやくインターンシップを開催できました。

このようにインターンシップの実施は、毎年のことではありますが、社内の多くの人を巻き込んだ一大事業です。 関わったスタッフ、そして参加してくれたインターン生の皆さんに、あらためて感謝します。さらにオンライン公開した講義や課題を通して、この体験が広く共有できれば幸いです。

はてなリモートインターンシップ2020 オンライン 講義動画&課題公開