はてなインターン2020 に参加してきた
こんにちは、1 年半ぶり2 度目の投稿です。
今回は、はてなインターン 2020 (9/7 ~ 9/11) に参加してきたので、その記録をはてなに残そうと思います。
参加したきっかけ
マイクロサービスやコンテナを用いた開発に興味がありました。もともと Docker や REST での開発経験 (フロントエンドもバックエンドも) はあったのですが、なかなか gRPC といった今流行の技術をキャッチアップできていませんでした。ですので、それらの技術をキャッチアップする環境を整え、入門したいと思い、このインターンに応募しました。
インターン前日
以下のテンプレートリポジトリを自分のリポジトリに持ってきて、手元の環境で動かすことが、事前課題でした。インターン前日に引っ張って来たリポジトリのコードに目を通すと全く理解できませんでした。そもそも Golang を触ったことがなく、 gRPC の概念自体知らなかったので、アプリケーションの各概念を調査しつつ A Tour of Go と Quick Start – gRPC をローカルで動かして遊んでいました。REST と全く概念が違い、サーバー上で実装されている関数をクライアントからの呼び出しに応じて実行するのは慣れない変な感じがしました。
一通りさらっと遊びましたが、明日からやっていける自信は全くありませんでした。しかし、寝る前に、一週間を乗り切ると自信がついて楽しいだろうなぁと思っていました。
インターン期間中
1 日目
主に講義がメインでした。Web API, コンテナ, K8s, マイクロサービスの講義を受けました。コンテナの講義で取り扱った以下の Docker Quiz は面白かったです。
一日の最後にこのインターンでの課題が発表されました。与えられた課題のアプリケーションは既存のブログサービスなのですが、このアプリに大きく2 つの機能を組み込むことが課題でした。
1 つ目は、入力された Markdown をHtml に parse する機能です。また、これに加えて Markdown 独自記法を追加する機能です。
2 つ目は、Markdown のリンク記法で (http://example.com/) のように の中に何も指定されない時は、指定された URL からスクレイピングをしてタイトルを取得し、 [] を補完する機能です。これは、元あるサービス群に新しい独立したサービスを作成する必要があります。
これらを表す構成図は以下の画像のようになります。
2 日目, 3 日目, 4 日目
この3 日間で課された課題はこなすことができました。また、インターンの間の3 日間では K8s, Golang, gRPC, テスト の技術を深掘れました。
K8s
与えられた課題のアプリケーションを minikube で ubuntu18.04 上で動かしていたのですが、起動や停止がとてつもなく遅かったりしてホットリロードが効かず丸一日ほど悩まされました。最終的には Mac の Docker Desktop を使用することにしました。この minikube が起動しないことと付き合っていくうちに K8s の基本的なことは学べたと思います。トラブルシューティングは良いですね。
Golang と gRPC
機能追加や新しいサービスを作る際には Golang で全て実装しました。*.proto ファイルという IDL からクライアント側とサーバー側のコードが生成されるのは慣れない部分もありましたが、便利でした。それらをサーバー側とクライアント側で呼び出し、作成した独立したサービスを K8s のクラスタに入れ込み疎通が確認できると完成です。こうして新しい独立したサービスを組み込めて一通りのフローは学べました。
テスト
これまであまりテストを書いてこなかったので外部依存性に注目しつつ適宜 mock を使いながらテストを書くことを心がけました。テストが書きづらいと実装が良くないのかなと思い、実装とテストを往復できたのは学びになりました。
5 日目
成果発表会がありました。技術が好きな人たちが思い思いの機能を作成していて面白かったです。parser を自作したり、 Squid を用いてプロキシさせたり、新しいサービスを作ったりしている人がいてすごいなーってなってました。
感想
この一週間のインターンはとても楽しかったです。現代のWeb 開発の最高のスナップショットを学べました。一日中、寝るまでずっとコードを読んでわからないなりにトライアンドエラーを繰り返していました。あっという間でした。この経験を生かして Golang + gRPC + K8s の構成を深堀って行きたいです。