この度、5日間・フルリモートという形式で開催された、はてなサマーインターンに参加してきました!
hatenacorp.jp
概要
マイクロサービスアーキテクチャに則って作られたブログサービスに機能を追加していくという、課題形式のインターンです。テンプレートとなるレポジトリは公開されており、下記のリンクから確認できます。
github.com
インターン生はそれぞれのGitHubアカウントで、このテンプレートからレポジトリを作成し、開発を進めていきます。
ブランチを切って開発・テストを進め、区切りの良いところでプルリクエストを作成して、はてな社員の方からレビューを受ける、ということを繰り返しました。
課題
基本課題2つと発展課題が用意されていました。
基本課題
- 記法の実装
マイクロサービスの中の1サービスであるrenderer-go
は、エントリーとして入力された文字列をレンダリングし、HTMLを返すサービスです。しかし、テンプレートではMarkdownのリンク記法のみが実装されています(
Hatena-Intern-2020-Template/renderer.go at master · hatena/Hatena-Intern-2020-Template · GitHub )。このrenderer-go
サービスを、見出し記法・リンク記法・リスト記法や独自の記法に対応させることが、1つ目の課題でした。
- タイトルの自動取得
renderer-go
サービスがリンク記法に対応していれば、[Example](https://example.com)
という入力は、
<a href="https://example.com/">Example</a>
とレンダリングされます。このとき、リンク記法でタイトルを省略した [](https://example.com)
という入力があった際に、そのURLのタイトルを自動で補完するようなサービスを作成することが、2つ目の課題でした。
発展課題
基礎課題の「タイトルの自動取得」は、入力されたURLに対してHTTP GET→HTMLから title
タグの値を見つける→ title
タグの値をタイトルとして返す、という手順で実装できます。この機能のパフォーマンス面での改良や、タイトルを取得されるWebサイトの運営者側から見た改善点の考察・実装が、発展課題でした。
応募・面談
応募課題は、はてなさんが用意したDockerイメージをdocker run
して、その実行結果を確認するというものでした。まぁ簡単なものですが、すくなくともターミナルを触れる環境にあるとか、Dockerがインストールできているとか、最低限の所を見られていたのかなぁと思います。事前課題の結果と簡単なポートフォリオ(今までやってきたことや、興味のあることなど)を送って、結果を待ちました。
その後、書類選考通過のお知らせが届き、人事の方・エンジニアの方とそれぞれ面談を行いました。エンジニアの方との面談では、Githubのレポジトリについて掘り下げた話をしたり、コミュニティ活動をしている動機などを話したりしました。
僕はWeb系の開発経験はほとんど無く、正直、書類選考も通るとは思っていなかったので、インターン内定の案内が届いた時はかなり嬉しかったです。面談では、Web系以外の開発の経験も評価してくださり、伸びしろを期待してくださっているように感じました。
インターン中
1日目
1日目は講義デイでした。「Web API」・「コンテナ」・「Kubernetes」・「マイクロサービス」・「課題説明」の5つの講義を受けました。どの講義もかなり丁寧で、知識を体系的に整理することができました。
Protocol Buffers:構造化されたデータをシリアライズする仕組み(バイナリなので嬉しい)#hatenaintern2020
— はいばら (@w_haibara) August 24, 2020
「DockerはLinuxカーネルのコンテナ関連の仕組みを使いやすくしたものと見ることもできる」#hatenaintern2020
— はいばら (@w_haibara) August 24, 2020
コンテナ設計
— はいばら (@w_haibara) August 24, 2020
・1プロセス 1コンテナ
・ステートレスで普遍にする
・ログはstdout/stderrに出力する
・アプリの設定は環境変数に角野能する(Docker Fileに書かない)#hatenaintern2020
CTFで学ぶDocker#hatenaintern2020
— はいばら (@w_haibara) August 24, 2020
コンウェイの法則:システムを設計する組織は、その組織の構造をまねた設計を生み出してしまう
— はいばら (@w_haibara) August 24, 2020
→組織の形が悪いと、生み出すシステムの構造も悪くなってしまう
#hatenaintern2020
マイクロサービスって「機能ごとに分けられて便利!」くらいにしか認識してなかったけど、どういった組織構成でソフトウェアを開発していくかという文脈の話なんですね
— はいばら (@w_haibara) August 24, 2020
#hatenaintern2020
1日目の終業後には、歓迎会を開いてくださり、社員の皆さんや社員の皆さんと話すことができました。リモートワークでは、雑談することのハードルが高くなるというのはよく聞く話ですが、改めてそれを実感しました。こういったコミュニケーションの場を設けてくださるのは嬉しいですね。歓迎会を通して皆さんのキャラクターを少し知れました。
2日目
2日目からは本格的に開発を始めました。実は、僕はこの時点でまだ環境構築がうまくいっておらず、四苦八苦していたのです。午前中の間ずっと、Discordの画面共有を通して社員の方にサポートして頂き、
なんとかアプリケーションを動かすことができるようになりました(大変助かりました……)。
他のインターン生に後れを取りつつ、基本課題「記法の実装」に取り組んで、プルリクエストを作成しました。粒度を細かくコミットしたり、テストを書いたりと、丁寧な開発ができて良かったです。
また、作業ログはScrapboxの個人ページに記入していきました。この作業ログは社員さんや他のインターン生からも見えるので、それぞれの進捗状況を共有できて良かったです。Scrapboxは、テキストチャットに書き込むのと違って、あとから振り返る際に見やすいのが良いですね。
3日目
3日目は主に基本課題「タイトルの自動取得」に取り組みました。マイクロサービスを採用しているため、gRPCさえ使えればどの言語で実装してよいのですが、無難(?)にGo言語で実装しました。gRPCを扱うのは初めてだったのですが、APIの仕様を記述したprotoファイルからサーバー・クライアントを自動生成できたり、grpc_cliという公式ツールでデバッグができたりと、スマートな印象を持ちました。
お昼は id:chris44403 さん、id:onish さんとランチでした!
4日目
4日目は、3日目に作成した「タイトルの自動取得」の実装のテストを作成しました。このテストには、gRPCの通信部分をモックする必要があり、なかなか苦戦しました。Go言語であれば、gomockというライブラリを使う方法もありますが、ここでは素朴にinterfaceを上手く使ってモックを作成しました。モックを含むようなテストコードを書くのは初めてで、学びが多い一日でした。無事にテストも通り、基本課題「タイトルの自動取得」についてもプルリクエストを作成できました。
5日目は成果発表のため、この4日目が開発に充てられる最後の1日でした。独自記法や「タイトルの自動取得」のパフォーマンス改善などに取り組む時間は無さそうだったので、軽くVue.jsを書いてフロントエンドの見栄えを良くしたりして、4日目を終えました。
お昼は id:onish さん、id:motemen さんとランチでした!
5日目
最終日である5日目は、インターン生の成果発表会がありました。10名のインターン生それぞれで、力を入れる部分が異なっていて面白かったです。いやーみんなすごいなぁという感想に尽きますね。大尊敬です。
因みに、僕の発表スライドは以下のURLから見ることができます。
w-haibara.github.io
発表後には個人面談があり、インターン全体を通してのフィードバックなどをいただきました。DiscordやTwitterで積極的に発信していたことを評価していただいたようで、嬉しかったです。