Hatena SUMMER INTERNSHIP 2020 に参加しました.参加記というかほぼ反省記.お気持ちです.
まとめ
- 参加して良かった
- 自分の不足している部分が浮き彫りになった
- 開発に対するモチベが上がった
- 周りのインターン生が凄すぎてこの先やっていけるかかなり不安になった
- それでもやっていくしかない
インターンまでの流れ
- 選考 ~6/15
- 一次募集で申し込んだ
- ローカルで簡単な Docker のコマンドを実行してその出力を提出した
- 面接 6/11
- インターン 8/24 ~ 8/28
インターンのスケジュール
ざっとインターンのスケジュールを振り返る.
全体の流れ
全部で 1 週間.前半に講義,後半に課題,最後に成果発表というスケジュール.
- Day 1: 講義
- Day 2 ~ Day 4: 課題 & 逐次レビュー
- Day 5: 成果発表,懇親会
講義
全 5 講義
- 1.Web API
- HTTP, REST, GraphQL, gRPC について
- 自分の知識不足で講義のときはあまり理解できなかった.課題をやりながら徐々に理解していった.gRPC の利点や,「インターフェースを定義 -> サービス間のクライアントのコードの自動生成の流れ -> サービス間の繋ぎ込みの設定」の流れを理解した.
- 2.コンテナ
- コンテナ, Docker について
- コンテナとは?Docker とは?がめちゃめちゃ分かりやすかった.また,Dockerfile の実践的な tips(マルチステージビルドやレイヤキャッシュ),イメージの中身を見る,コンテナのセキュリティ事情など,自分がいつも使っている用途よりも一歩踏み込んだ内容だった.
docker save
とかdocker history
とか知らんコマンドが出てきた.
- 3.Kubernetes
- Kubernetes の概念,開発ツール(Kustomize, Skaffold)
- 自分の知識不足で講義のときはあまり理解できなかった.課題をやりながら徐々に理解していった.
- 「Kubernetes の良さ = インフラ,リソースを管理するために欲しい機能がそろっている」だから Kubernetes の良さを学ぶことでサーバーサイド,インフラ周りに必要な知識が身に付くというのを講義外で聞いた.
- 4.マイクロサービス
- 5.課題説明
- ブログサービスに対して機能(Markdown 記法,独自記法,その他発展課題(並列処理による高速化など))を実装するという内容.
インターンでの自分の動き
1 日目:講義
講義を受けてたら一瞬で終わった.感想は先述した通り.講義後は HTTP の仕様や RPC/gRPC について調べていた.
2-4 日目:課題
2 日目の朝に某プログラミングサービスで Golang に入門.gRPC もなんとか概要を把握.付け焼き刃すぎてインターン期間中雰囲気で実装してたと思う.
課題の内容,ブログサービスの構成
課題は「ブログサービスに対して機能を追加する」というもの.ブログサービスはコンテナベースで,マイクロサービスアーキテクチャを採用している.アカウントを扱うサービス,ブログを扱うサービスなどに切り分けられており,サービス同士の通信には gRPC を用いている.これらの各サービスのコンテナを Kubernetes(K8s)上で動かしている.
課題のテンプレートとなるブログサービスを K8s 上で立ち上げると,自分の記事を CMS で投稿できるようになる.テンプレのままの実装だと生テキストが何も変換を経ずにブラウザにレンダリングされてしまう.そのため,「生テキストをパースして Markdown やその他の記法から HTML へ変換する部分を実装する」のが(基本)課題の目的.
実装
- 言語:Golang
- 実装した機能
// AST に対する操作の定義 func (l *autoTitleLinker) Transform(node *ast.Document, reader text.Reader, pc parser.Context) { // ast.Walk(n Node, walker Walker) ノードを visit して関数(Walker)を実行する ast.Walk(node, func(node ast.Node, entering bool) (ast.WalkStatus, error) { // node.ChildCount() == 0: 現在のノードに子ノードが無い -> タイトルが無いリンク if node, ok := node.(*ast.Link); ok && entering && node.ChildCount() == 0 { // 新しくノードを作って現在のノードに子ノードを追加 node.AppendChild(node, ast.NewString([]byte(fetchTitle(l, string(node.Destination))))) } return ast.WalkContinue, nil }) }
AST って何ぞやみたいな感じだったけど少しずつ挙動が分かってきたときは面白かった.このとき,また,Golang,gRPC,K8s やらのキャッチアップでいっぱいいっぱいで,残念ながら発展課題をやるには至らなかった.何というか残念な感じだった...
5 日目:成果発表
インターンを通してできたこと,できなかったこと
- できたこと
- Golang,gRPC の概要を理解して実装まで漕ぎ着けたこと
- Pr◯gate 等を利用した.A Tour of Go が良いらしい.
- Kubernetes の概要,開発手順の理解したこと
- (少しだけど)AST の操作を理解したこと
- Golang,gRPC の概要を理解して実装まで漕ぎ着けたこと
- できなかったこと
- 設計について考えること
- 各サービスの責務の切り分け,設計の意図の理解
- (というか設計について今までまともに考えたことがなかった...)
- テストの書き方
- モック,
interface
を利用したテストの設計
- モック,
- Golang,gRPC,Kubernetes の概要の理解に時間を取られてしまい,「動けば良かろう」なコードを書いてしまった
- 設計について考えること
他のインターン生についての印象など
お世辞抜きで(する意味も無いですが),技術力の塊みたいな人ばかりだった.世間は広い.
率直な感想
- 客観的に見て自分との技術力の差がありすぎて一人でずっと「すげーすげー」呟いてた
- 刺激を受けてもっとやっていくぞという気持ちが出てきた.モチベーションが非常に高まった.
- それと同時にこの先自分のような人間がやっていけるか不安になった
他のインターン生についてすごいなと思った点
- Web サービスに対しての理解が深い
- テストのしやすい設計を理解している
- 自分が理解していないのであんまり言えないが,「どう設計すればテストがしやすくなるか」をちゃんと考えて実装していた.
後書き
正直なところ,周りのインターン生の方々が凄すぎて自分の無能っぷりをこれでもかと思い知らされた.しかし,自分ができなかったことや他のインターン生についてすごいなと思った点は自分の伸び代でもあると前向きに考えていく.今は「がんがん開発していくぞ」というモチベーションと「自分の技術力でやっていけるのか」という将来への不安が入り混じっている.駆動力にもなったりその逆も然りなので上手くこの感情と付き合っていきたい.