pyてよn日記

一寸先は闇が人生

Hatena SUMMER INTERNSHIP 2020 参加記

Hatena SUMMER INTERNSHIP 2020 に参加しました.参加記というかほぼ反省記.お気持ちです.

hatenacorp.jp

まとめ

  • 参加して良かった
  • 自分の不足している部分が浮き彫りになった
  • 開発に対するモチベが上がった
  • 周りのインターン生が凄すぎてこの先やっていけるかかなり不安になった
  • それでもやっていくしかない

インターンまでの流れ

  • 選考 ~6/15
    • 一次募集で申し込んだ
    • ローカルで簡単な Docker のコマンドを実行してその出力を提出した
  • 面接 6/11
    • 技術に関する面接
    • 自分の開発経験,GitHub リポジトリをかなり深く掘り下げられた
    • 面接が 17:00 ~ でその日の 19:30 にはインターンの内定が出た(めっちゃ早くてビビった)
  • インターン 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.マイクロサービス
    • マイクロサービスアーキテクチャの概要と設計
    • 講義前は「マイクロサービス」についてほとんど知らなかった(「モノリシックなアプリケーションからサービスを切り出す」というざっくりとしたイメージしか持っていなかった).マイクロサービスの Pros/Cons,システム設計と組織設計からマイクロサービスの設計を考えるという内容が非常に興味深かった.技術・パラダイムは問題解決策として出てきているが,マイクロサービスがどういう背景で出てきたのかが分かって良かった.何でもかんでもアプリケーションが巨大になってきたから切り出せば良い,ってわけではない.
  • 5.課題説明
    • ブログサービスに対して機能(Markdown 記法,独自記法,その他発展課題(並列処理による高速化など))を実装するという内容.

インターンでの自分の動き

1 日目:講義

講義を受けてたら一瞬で終わった.感想は先述した通り.講義後は HTTP の仕様や RPC/gRPC について調べていた.

2-4 日目:課題

2 日目の朝に某プログラミングサービスで Golang に入門.gRPC もなんとか概要を把握.付け焼き刃すぎてインターン期間中雰囲気で実装してたと思う.

課題の内容,ブログサービスの構成

課題は「ブログサービスに対して機能を追加する」というもの.ブログサービスはコンテナベースで,マイクロサービスアーキテクチャを採用している.アカウントを扱うサービス,ブログを扱うサービスなどに切り分けられており,サービス同士の通信には gRPC を用いている.これらの各サービスのコンテナを KubernetesK8s)上で動かしている.

課題のテンプレートとなるブログサービスを K8s 上で立ち上げると,自分の記事を CMS で投稿できるようになる.テンプレのままの実装だと生テキストが何も変換を経ずにブラウザにレンダリングされてしまう.そのため,「生テキストをパースして Markdown やその他の記法から HTML へ変換する部分を実装する」のが(基本)課題の目的.

実装

  • 言語:Golang
  • 実装した機能
    • goldmark という Markdown パーサを用いて,ブログのテキストを HTML へ変換する機能
    • [](https://example.com) という「タイトルが無いリンク記法」のテキストをパースしたときにそのリンク先をクローリング & スクレイピングしてタイトルを取得する機能
      • goldmark は,パーサにユーザ定義の抽象構文木(AST)の操作時の処理などを加えることができ,パーサを拡張できるようになっている.
      • 今回の例では,「現在のノードの子ノードが空なら,現在のノードが持つ URL に対してリクエストしてタイトルを取得する」という処理を加えている(下記にコードの一部を示す).
// 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 の操作を理解したこと
  • できなかったこと
    • 設計について考えること
      • 各サービスの責務の切り分け,設計の意図の理解
      • (というか設計について今までまともに考えたことがなかった...)
    • テストの書き方
      • モック,interface を利用したテストの設計
    • Golang,gRPC,Kubernetes の概要の理解に時間を取られてしまい,「動けば良かろう」なコードを書いてしまった

他のインターン生についての印象など

お世辞抜きで(する意味も無いですが),技術力の塊みたいな人ばかりだった.世間は広い.

率直な感想

  • 客観的に見て自分との技術力の差がありすぎて一人でずっと「すげーすげー」呟いてた
  • 刺激を受けてもっとやっていくぞという気持ちが出てきた.モチベーションが非常に高まった.
  • それと同時にこの先自分のような人間がやっていけるか不安になった

他のインターン生についてすごいなと思った点

  • Web サービスに対しての理解が深い
    • パフォーマンス(リクエストの並列処理,非同期処理)
    • サービスに対して迷惑をかけないという視点(robots.txt やリクエストのキャッシュ,リクエスト回数の制限などを当たり前のように実装している人が多く見られた)
    • セキュリティ(自分のサービスが DDoS の踏み台にされるとか考えたこともなかった)
  • テストのしやすい設計を理解している
    • 自分が理解していないのであんまり言えないが,「どう設計すればテストがしやすくなるか」をちゃんと考えて実装していた.

後書き

正直なところ,周りのインターン生の方々が凄すぎて自分の無能っぷりをこれでもかと思い知らされた.しかし,自分ができなかったことや他のインターン生についてすごいなと思った点は自分の伸び代でもあると前向きに考えていく.今は「がんがん開発していくぞ」というモチベーションと「自分の技術力でやっていけるのか」という将来への不安が入り混じっている.駆動力にもなったりその逆も然りなので上手くこの感情と付き合っていきたい.

はてなの社員の方々,他のインターン生の方々,5 日間ありがとうございました.