初めに
こんにちは!テコンドーです。8月末にメルカリが開催していた
Online Summer Internship for Gophers 2020 に参加してきたのでその模様をお届けします!
インターン概要
今回のインターンの内容は、Go言語、静的解析の技術を利用して、五日間で基礎を学びツールまで作成することを目的としたインターンになります。
概要を公式サイトから引用します
前半2日間は、Goの静的解析に関する講義やプログラミング言語Go完全入門の資料で参加者が興味を持つ領域を中心とした講義をWorkshopを交えながら実施。後半3日間では、静的解析ツールまたはその周辺ツールの開発に取り組んでいただきます。開発に取り組む期間は、メルカリ・メルペイのエンジニアがメンターとしてサポートします。
参加したきっかけ
きっかけは メルカリ ・LINE・クックパッド三社の合同インターン 説明会イベント
に参加した際に、このインターンについて紹介され、興味を持ったためです。
僕は元々別の会社で長期インターン生としてGo言語を使った開発に携わっていました。
その中でかなりGo言語が好きになっていたこともあり、Goについてのより詳しいスキルが得られる今回のインターンに非常に興味を持ちました。
メルカリといえば、Go言語に関してのアウトプットも多く、メルカリ 社員からのレビューがいただけるという点も非常に魅力的だったため、エントリーすることにしました。
参加するまで
コーディングテスト+面接(一回)でした。
コーディングテストのレベルは他のインターン選考とあまり違いがありませんでした。
AtcoderでいうB~C問題くらいでしょうか、その程度の問題が3問あったと思います。
ただ、選択可能言語がGoのみ(多分)になっていたため、ある程度はGoでコードが書けないとここで篩に掛けられます。
※他のインターンシップ選考では違うようです
Go使ったことないけど参加したい人は、基本的な構文は抑えておくといいと思います。
参加者の中にはGo初心者もたくさんいたので、Go言語歴は関係ないみたいです。
コーディング試験をパスした後は面接です。
僕の場合は元エンジニアの人事の方に対応していただきました。
聞かれたこととしては
- 普段の開発は何をしているのか?
- このインターンで何をしたいのか?
- 静的解析の経験はあるか?
などについてだったと記憶しています。本当に和やかに面接が進んで行きました。
今回のインターンは静的解析についての講義+開発なので、静的解析がなんなのかは抑えておきましょう。
どういうツールが作りたいのか?などの詳しいところまでイメージできているとインターンで得られる学びも増えるかと思います。モチベーションの整理も兼ねて、面接前に考えておくといいですね。
しばらくするとオファーが届きました。
Goで有名なメルカリにインターン参加できることになってうれしかったです!!!
静的解析とは
インターン内容について触れる前に、静的解析とは何かについてご説明します。
静的解析とは、コードを実行する前にコードをチェックすることです。
コンパイルでも利用されています。
静的解析では、上記の画像のように、ソースコードを構文的に分解し、どのルールを当てはめたコードなのか、それぞれのコードはどの構文なのかを判定することができます。
静的解析を行うことで
- 構文ミスの検知
- 使ってはいけない関数の検知
- 変数の型チェック
などが実行できます。
コンパイル以外で静的解析が使われている例としては、Linterが挙げられます。
VSCodeなどで間違ったコードを書くとエラーメッセージが出てきますよね?
そこには静的解析の技術が使われています。
現在のコードを言語が提供している構文に当てはまるかどうかをチェックすることでコードを実行する前に間違っているかどうかを確認することができます。
この技術を利用することでより便利、快適にプログラミングをすることができるのです。
そんな静的解析の魅力、実際の利用手法を学べるインターンでした。
インターン内容
講義パート
まず、初めの二日間は講師の方による静的解析についての講義がありました。
メイン講師はメルカリエキスパートチームのtenntennさん(nが二つないとダメ)です。
日本でGo言語を勉強すると、必ずtenntennさんが書かれた記事を読むことになるくらいGo界隈では有名な方です。メルカリが提供しているプログラミング言語Go完全入門の著者でもあり、Go言語に圧倒的に詳しいです。
そんな方に学ばせていただける機会だったため、非常に有益な時間でした!!!
資料としては、プログラミング言語Go完全入門の14章の静的解析とコード生成の部分を教えていただきました。
大きく分けるとトピックは4つあり、
- クイックスタート
- 構文解析
- 型チェック
- 単一代入形式
を順に学んでいきました。これらについて説明すると長くなるため、詳しく知りたい方は資料を読んでみてください。
やってみるとわかるのですが、Goが公式に提供しているライブラリを利用することで、静的解析についてあまりよく理解できていなくても、決められた手順に従うことで簡単にやりたいことを実現できます。
イメージとしてはライブラリにコードを渡すと勝手に解析してくれて、その結果が帰ってきます。
開発者はその結果を色々調べてコードが違反しているかどうかなどをチェックするだけです。
大学の授業でコンパイラを作成したときに自分で構文解析を書いたことがあるのですが、その手間が全て省かれていることに感動しました。
Go言語のように公式で静的解析パッケージを提供している言語は珍しく(TypeScriptはあるって聞いた)、
開発者がツールを作りやすいのもGoの魅力の一つなんだなと感心しました。
「ランチ」
今回のインターンはランチ代が支給されました。
額は伏せるのですが、僕の1日の食費予算の2倍だったため、もう食べまくりました。
インターンが終わった後にこの生活が忘れられなくなったらどうしよう。。。と心配しました。
開発パート
後半三日は開発パートです。
前半パートで学んだ知識を活かして実際にツール開発を行っていきます。
わからないところはSlack越しにメンターさんが回答してくれます。
日頃から静的解析を利用してツールを作っている方も多く、アドバイスが的確で本当に頼りになりました。
技術の話をするときも本当に楽しそうで、メルカリの高い技術力文化を作りあげているのはこういう人たちなんだな。。。
ということを肌で感じることができました。
開発を行っていると時間はあっという間に過ぎていき、なんとか自分の作りたいと思っていたところまでのものを作り上げることができました。
最後にメンター、インターン生、メルカリ新卒エンジニアを交えてオンライン懇親会を行い、インターンが終了しました。
Go言語の新しい魅力と静的解析自体の知識を身に付けることができる非常に有意義なインターンでした。
いろいろメルカリのイベントにも参加させてもらえた。Go FridayでのGoに関する濃ゆい話とか、9月入社のWelcomeパーティに参加させてもらえたりとか、メルカリで働くことの一端を知ることもできた。
成果物
作ったツールは、Test用の関数自動変換ツールです。
https://github.com/tekonfo/deepequal2cmp
go-cmpは、googleが作ったパッケージで、Go言語に標準実装されているreflect.DeepEqualよりも構造体比較などが便利に行えるものです。
Testする際に利用するgotestsパッケージで自動生成されるDeeqEqualをcmp.Diffに自動変換してくれます。
利用例のgif貼り付けておきます。
作った経緯としては、今携わっているプロジェクトでDeepEqualが非推奨になり、cmp.Diff関数に書き換えなければならないのですが、今まではそれをいちいちマニュアルに変更しなければいけませんでした。
書き換える手順などはほぼ一緒なので、その変換をツールで自動化しました。
一回実行するともれなく変換してくれるため、CIとかで実行させることでド忘れを防止することもできます。
チームに共有したところ、好評でした。もっと改善してより使いやすいツールにしていきたいです!
振り返って
まとめると今回のインターンは
- Go言語がもっと好きになる
- 静的解析の可能性を感じることができる
- 成果物を作成できる
ことがメリットだと思います。
静的解析を行う上で、Language Specificationを参照するようにアドバイスされるように、これまで意識することのなかったGo言語の詳しい文法を知ることになります。
untypedIntなど、気づかず利用していた便利な型などが存在していることを知り、Go言語がもっと好きになります。
普通に開発している中では、静的解析を自分で行う機会はほとんどないため、その時間が明示的に与えられたのは非常によかったなと思います。
深い知識を学ぶとどのようなことができるのかを感じれたことも、これから勉強するモチベーションにつながりました。
静的単一代入形式の箇所では、有向グラフを上手に利用することで問題を簡単にすることができることを例としてあげており、競技プログラミングの重要性なども知ることができました。
静的解析を利用することで本当に様々なことが可能になることを学びました。これからもツールを継続して作っていきたいです。
インターン中に作成した成果物は、開発で利用したりポートフォリオの一つとして利用するのでコスパ最強です🔥
インターン中の講義を収録した動画も公開されるらしいので、興味を持った方はやってみるといいと思います!
みんなで快適ツールどんどん作っていきましょう💪
それでは!