☑️

Gopher Enablement Internship レポート

2023/04/03に公開

はじめに

3/15 ~ 3/17 の3日間で、ナレッジワークさんの【Gopher Enablement Internship】に参加してきました。
初日から最終日まで楽しく過ごせて本当に最高でした!!開発だけではなく、会社の組織体制、社員さんの雰囲気を知れたことはとても良かったと感じています。

今回は、そのインターンについて書いていこうと思います!

インターンに申し込んだ理由

主に2つあります。
1つ目、@tenntennさんが入社した会社がナレッジワークだったからです。tenntenn さんのことを慕っているので「どんな会社にいったんだろう、、?」と疑問に思い調べてみました。
「イネーブルメント」に軸を置いていて、サービスの内容からデザインまでとても目を惹かれ気になっていきました。その過程でインターンシップに臨んでみたいという気持ちが段々強まっていきました。

2つ目、Go言語で静的解析をやってみたいと思っていたからです。タイミングが合わず挑戦する機会を見失っていたのですが、ハンズオン形式で実践的に学べるということで申し込みを決意しました。メンターの方や tenntenn さんが学習をサポートしてくれるという環境があったことも申し込みを決めた大きな要因の1つです。

インターンシップ詳細

Goはモジュールプロキシ(proxy.golang.org)を用いることで、モジュールの安全性担保やドキュ
メント生成などを行っています。
また、モジュールインデックス(index.golang.org)を見ると、公開されたモジュールの情報を取得
できます。
本インターンシップでは、公開されたモジュールを対象とし、解析を行うことでGoのソースコードで
用いられているベストプラクティスを学びます。
たとえば、パッケージ構成はどうなっているのか、テーブル駆動テストはどの程度行われている
のかなどを調べます。
解析で使用するHTTPクライアント、Goの静的解析、並行処理などをハンズオンを通して実践的
に学べます。

インターンシップの参加者は13人で、大学1年生から 42Tokyo の受講生などさまざまな Gopher がいました。
4-5人で1チームとなり、チームごとにメンター1人がつくというような体制。
フルリモートで行われ基本的に1日中ビデオオンで開発(自チームの話)。

それでは実際にやっていったことに移っていきましょーー!

やったこと

1日目

10:00~10:40 オープニング/自己紹介タイム
10:40~11:00 インターン・ナレッジワークのご紹介
11:00~12:00 講義
12:00~13:00 ランチ休憩
13:00~14:00 講義
14:00~18:00 チーム開発
18:00~19:00 全体振り返り

初日は自己紹介をしたりナレッジワーク目指している世界、事業内容についてお話を聞くところからスタートでした!ゲームをする時みたいに楽しく仕事ができたらいいよね、というお話を聞いて実現された時の世界を見てみたくなりました!!

静的解析全くわからん、という不安もありましたが tenntenn さんの講義がとてもわかりやすく不安よりもワクワクが大きくなっていきました。tenntenn さんの説明、本当に神です、、、

チーム開発の時間では静的解析をしてツール開発をしていきました。
モブプロ形式だったのでチーム内で理解していることと理解できていないことを共有し合い、みんなで歩を進めることができたのもよかったな〜と思いました。

チーム開発のテーマは2つあり、自チームはテーマ②を選びました!
もともと気になっていたテーマだったのと、個人的に馴染みがあったという理由から②の方を選びました。2つの他チームは①の方でした。


この日は go/analysis パッケージの理解と使い方の理解が深まりました。それに合わせて抽象構文木の構成や型チェックについても理解が深まりました。
あと、静的解析は字面は難しそうだけれど思った以上にやっていることはわかりやすくパズルのような感じだなー、という感想。

成果物

2日目

10:00~10:30 オープニング/Good&New
10:30~12:00 講義
12:00~13:00 ランチ休憩
13:00~15:00 個人開発
15:00~16:00 社員交流タイム
16:00~18:30 個人開発
18:30~19:00 チーム振り返り

Good&New というのはナレッジワークのカルチャーの1つで、24時間以内にあったいいことを1人ずつ話していくというものです。こうした会社独自の文化に触れられたのも新鮮でとても楽しかったです!

午前中は tenntenn さんのお話があり、go/analysisパッケージ以外の静的解析を作る話を聞きました。

その後はいよいよ 個人開発!!!

  • Go Wayなコード
  • 新しいGoの機能
  • 効果の高いLinter

この3つの中から好きなものを選び開発するというものでした。何かしらの Linter を作ってみたいと思っていたので 「効果の高いLinter」 を選びました。

ただ、どんなものを作りたいかを考えるのが結構難しかったです。理由としてはいくつかあり、

  • 限られた時間の中で開発しきれる Linter ってどんなのがあるだろう、、
  • せっかく作るならオリジナルの Linter を作りたい!

というような悩みがありました。

実質1日ほどしか開発する時間がなかったのでここは本当に悩みました笑

オリジナルの Linter については tenntenn さんやチームの人と相談しながら決めていきました!
相談乗っていただき本当にありがとうございました、、、!!!

結局どんなものに落ち着いたかというと、それは、、、
「パッケージ名.関数名の組み合わせ、構造体.フィールドの組み合わせで同じ単語を使っていた場合に警告を出す」 Linter です!!

u.CrateUserFromDatabase()      // -> ○
user.CrateUserFromDatabase()   // -> "user" が2回使われている

// 複雑なものだとこんなのも、、、
user.OOOOuser.OOOO().OOOO()

この Linter を作りたいと思った1番の理由は、自分自身がよくやってしまうことのうちの一つだったからです、、、笑

「あ、ここ名前被ってるな」と思っていても後回しにすることが多く、そのまま忘れ去られてしまうまでがテンプレ。

個人開発していく中で経験することが多々あったので、時間に追われている(異論は認める)ベンチャーやスタートアップではよくあるのでは、、、?と思い作るのを決意しました。
俺が許しても Linter は許さない、、、!!!!
あれです、技術負債 checker みたいなものだと思ってください。

個人開発ではあるものの、チームの仲間とビデオオンにして開発していたので休憩の時は雑談して終始楽しく過ごせました!!本当に自チームの人の雰囲気が暖かかった、、、
そんな環境の中で開発していたので、わからないことはすぐ聞くことができました。聞かれることも多くお互いに理解を深めることができたのかなと、、!!

3日目

10:00~10:30 オープニング/Good&New
10:30~12:00 個人開発
12:00~13:00 ランチ休憩
13:00~16:30 個人開発・発表準備
16:30~18:30 全体発表会
18:30~19:00 全体振り返り
19:00~20:30 懇親会

きたぜ、最終日!!
え、もうきたんですか?と困惑するくらい早かった、、、

実は2日目の時点で Linter を完成させていました(と自分は思っていた)。
3日目は発表資料を作るだけ!という状態だったので、「もう一個 Linter 作れる!!」と思い色々と案を出していたところに、、、

同チームの方からバグ報告をいただき修正していたらいつの間にか時間が溶けてしまいました!修正前と比べコードも読みやすく、機能的にも満足がいくものが作れて大満足!!


そんなこんなで時間は過ぎていき、
きたぜ、全体発表!!!

同じチームの方や他チームの方の発表、最高に面白かったです。

とても目の付け所がよく、参考にしたい。
と思うような発表ばかりでした。

「こんなのができればいいのになー、」と思っていたところにアプローチしてくる Linter ばかり。最高!!
Linter を作るまでに至った背景があり、そこを聞くのがとても楽しかったです。
また、自分で課題を見つけ出し解決するために Linter を作る、というプロセスが綺麗だったし常に心がけていきたいと思いました。

発表の時間、ナレッジワークの方が zoom のチャット機能をかなり使っていたのも印象的でした。
インターンシップ初日に「チャット機能をフル活用する文化があります」と言っていたのを思い出しました。
感想や疑問点、良いと思ったところなどを呟いたりしていてより発表を楽しむことができ、良い文化だったなと!!
そういった企業の文化に触れることができて、インターン楽しいと心底思いました!!

一人一人の発表が終わるごとに、ナレッジワーク CTO のマヤさんと各チームのメンターから講評をいただくという方式で発表は進行していきました。
制作物のよかった点や、「こういうケースの時はどうしますか?」という考慮し忘れていた点を講評でいただくことが多かったです。みなさんの視点はとても鋭く、思わず「はっ、、!!!」とするようなものばかりでした。

もちろん経験から考えられるということもあると思いますが、技術に対する考え方がとても丁寧。かつ、考えられる可能性について思考を深めていく流れが綺麗だなと思いました。

そんなこんなで自分の発表がきた!!
意識したことは丁寧に話すということです。
少し緊張していましたが、3日間お世話になった感謝の気持ちを持って発表していきました。自分が発表している時もチャットの方で盛り上がっていたみたいで嬉しくなりました笑 反応があると嬉しくなりますよね、自分も真似していこ。
「作った Linter が自分だけにしか需要がなかったらどうしよう、、、」という不安もありましたが、いろんな方からの共感がありとりあえず一安心!!

発表も滞りなく進み、伝えたいことも伝えられてとても楽しく終えることができました!!


成果物

学んだこと

  • 静的解析の理解
    • 構文解析
    • 型チェック
  • skeletonを使ったテスト駆動開発の仕方
  • 自分が作った Linter を走らせる方法
  • ナレッジワークの会社の雰囲気

感想

静的解析を通して Go言語の理解が深まったと思います。「静的解析しやすい言語を作りたい」想いのもと、シンプルな言語使用になったというお話を聞いて素直に面白いと思いました。もっと Go言語に詳しくなりたい、Go言語に貢献したい、、、します。

また、今回触れることができなかった箇所があるのでそこはこれから学んでいこうと思います。
ポインタ解析、SSA など

やっていきたいリスト

  • 開発を行っていく上で不便なことがあり、Linter を作れば改善できそうな時は積極的に作っていきたい!
  • Linter を自動実行できるようにしたい!
  • 開発環境を整えていきたい!
  • コード生成できるようになりたい!

今回のインターンでの達成目標は 「できなかったことを、できるようになる」 というものでした。実際に目的達成の開発環境が整っていたし、サポート体制がありました。本当に感謝、、

3日間という短い期間でしたが、「できる喜びが巡る日々」だったと感じています。 
学習 x アウトプット = :taisetsu

最後に

3日間一緒だったチームのみなさん、tenntenn さんをはじめとするインターンに関わったナレッジワークのみなさん、本当にお世話になりました!!最高に楽しかったです!!

ここで得たナレッジを次に繋いでいくことが自分にできることだと考えているので、どんどん共有していこうと思います!とりあえず技術書展で Go言語に関する何かを書いていきます!!

ナレッジワーク

Discussion