株式会社ProgateのインターンでGitを自作しました!
株式会社Progateの「自分のGitをイチから作る 5日間のチーム開発インターン」に参加してきたので体験記を書こうと思います。
(※ 以降、本ブログでは株式会社ProgateのことをProgate社、プロダクトの方をProgateと表記します)
参加の動機
参加の動機としては以下の通りです。
- プログラミングを始めた頃にProgateを利用しており、Progateというプロダクトの仕組みなどに興味を持っていた
- Progate社について就職的な意味で気になっており、どういう会社なのか知りたかった
- オフィスの雰囲気や、どういったエンジニアの方がいるのかについて知りたかった + オフィスに出社できるインターンだったこと
- Gitの自作楽しそう!
インターンの募集自体はconnpassで発見し、応募することにしました。
(ちなみに今タームのインターン生は自分含め5人でした)
インターンの内容
1日目
1日目はGitの内部的な仕組みを学び、git logの実装を行いました。
最初にCTOの島津さんからGitの仕組みについて説明があり、gitがどのようにして過去のコミットを追いかけているのか、どのようにファイルを管理しているのか等々について知らないことを多数学びました。

その後、logの実装を各個人で進めていきました。スライドや公式ドキュメントを参考にしつつ、以下の処理を実装し、logコマンドを完成させました。
.git/HEADを見て、現在いるブランチ名、またはコミットハッシュを取得- 1がブランチの場合、
.git/refs/heads/<ブランチ名>を確認してコミットハッシュを取得 - コミットハッシュを用いて
.git/objects配下に存在するコミットオブジェクトのファイルへのパスを取得 - zlibで圧縮されているので解凍して内容を読み取る
- parentに記載されているコミットハッシュを取得する
- parentが記載されていないコミットが出てくるまで3 ~ 5を繰り返す
しかし、マージコミットやコミットオブジェクトがPackfileになっている場合にうまく動作せず、この辺の対応方法を調べていると少々複雑そうで(特にマージコミット)、「わァ...ぁ...(めっちゃ大変じゃん...)」となりました。
2日目
2日目からは、Progate社の開発で実際に利用されているツールを使いつつ、複数人のチームでgit addとgit commitを実装することになりました。
この日は「業務ではどういう流れで新しい機能を開発していくのか」という点を学ぶため、目的やゴール、実装に関する設計をDesign Docに書き、ゴールや設計周りの議論をチームで行いました。
特に、ゴールに関して「どこまで本家のgitと互換性を持つのか」という点をよく議論しました。
(例えば本家のgit addであれば、-pオプションで行ごとにaddすることができますが、その辺まで対応するのか、などです)

そしてDesign Docが出来れば、必要なタスクをプロジェクト管理ツールのAsanaに起票していきました。

また、作成したDesign Docやタスクリストに対して、実際の業務で発生する事例をもとに「Design Docではどのような書き方にすると認識の齟齬が生まれにくいか」「タスクはどのくらいの粒度で作るべきか」といった点についてアドバイスを貰い、改善を行いました。
中でも「議論と決定したことを分けて書くべき」というアドバイスが勉強になりました。 今回書いたDesign Docもそうですが、これまでに私が書いたドキュメント類を見ると、議論と決定事項が混在しており、第三者目線で「最終的に何が決まったのか」が分かりにくくなっていました。
議論に参加していない人がDesign Docを読む時を十分に想定して書くことで、認識の齟齬を発生しにくくさせるという点が勉強になりました。
3日目
3日目は、2日目に作成したDesign Docを見つつ実装を進めていきました。
自分のチームでは、addコマンドとcommitコマンドで別れて開発を進めようという方針になりました。 そのため、最初に共通部分を作ったり、ディレクトリ構成を決めたり、共通で利用するinterfaceを定義したりしました。
最初の方は、個別に作業が開始できるレベルまでプロジェクトの基盤を作ることに注力し、その後にaddの実装を進めていきました。
4日目
4日目もaddの実装に取り組みました。
午前中に必要な関数を作り終えて、午後には引き繋ぎと検証を行いました。
ビルドと実行は問題なくできたのですが、何故かファイルがうまくステージングされない問題が発生し確認してみると、indexとして生成されるバイナリが本来生成されるべき形では無いことが判明しました。 そのため、Git - index-format Documentation を見つつ、indexとして足りない部分を比較したりして修正していきました。この結果、とりあえず4日目にaddの基本的な部分は無事実装できました。
一方、commitの方はだいぶ詰まっていそうだったので、メンターの方と一緒にgit commit時に行われている処理の再確認と、実装する必要のある関数のあぶり出しを行いました。
そして、自分はコミットオブジェクト周りの実装を一部お手伝いすることになり、その実装を行いました。


就業後: LT会イベントへ参加
また、この日はProgate主催のLT会イベントにも参加しました。 朝会で、LT会イベントが気になるという話をした所、就業後にタクシーで新宿の会場まで連れて行って貰え、途中参加することができました。
イベントでは色んな人と話し情報交換をしました。イベント終了後も会場にいた方と22:30くらいまで話し込んでしまい、すっかり返るのが遅くなりました笑
5日目(最終日)
最終日は16:00から発表の時間となっていたので、それまで開発を続けました。
4日目の時点でaddコマンドの実装は完成していたのですが、特定の条件で発動するバグが見つかったりしたのでその修正をしつつ、checkoutコマンドの実装を爆速で行いました。 addとcommitが出来ている状態なので、checkoutは そして、無事発表時間までにadd, commit, checkoutが完成し、デモをすることができました!
発表ギリギリでしたが、無事完成させることが出来て本当に良かったです。
懇親会
発表後はオフィスで懇親会がありました。美味しいケータリングを食べながらワイワイいろんなお話が出来ました☺️
完走した感想
インターンに参加して良かった点
学びが非常に多かった
gitの仕組みについての学びはもちろんのことですが、ドキュメントの書き方やタスク分割周りで今後チーム開発をする上で重要になりそうな部分を多く学ぶ事ができました。 あとは作業で詰まったときの整理方法だったり、プロジェクトの進行で問題が発生したときの対処方法なども学ぶことができ、とても為になりました。
また、自分に足りない部分を再確認できるいい機会にもなりました。
色々な部分で質問や相談をしたり、アドバイスを貰うことができた
インターン期間中は何時でも質問したり相談ができました。そのため以下のような部分で色々と分からないことを聞いたりすることができました。 1on1の時間もあり、そこでキャリアについての相談をし、参考になる話を貰うことができたのも有り難かったです。
- TypeScriptの型周りの仕様について
- プロジェクトの設計について
- クラスを使うべきか使わないべきか
- 開発において問題が発生したときの立ち回り方について
- 新卒のキャリアについて
オフィスや開発チームの雰囲気が知れた
オフィスに居ると、集まって話し合いながらモブプロのように開発している様子がよく見られたり、実装やファイル配置、テストなどについて相談されている声がよく聞こえて来ました。 そのため、コードベースの健全性をかなり保ちながら開発できていそうと感じました。 (実際コードベースの見やすさやコードの読みやすさを保つのは頑張っているらしい)
また、雰囲気的にもゆるりとしていていい感じでした。
プロダクトの仕組みについての話が聞けた
今回のインターンではProgate自体の開発には参加していないわけですが、Progateのシステム周りについても色々と知ることができました。
Progateで利用されている「ジャッジ(正誤判定)のシステムがどうやって誤りを見つけているのか」や「演習環境の仕組みがどのように構成されているのか」等について知ることができました。
(Progateのクリアを判定しているジャッジは、構文エラーだけでなく、実装に関して何がどう足りてないのか詳細に判定してくれる事があるので、仕組みがかなり気になっていた)
美味しいランチがいっぱい食べられた
インターン期間中に毎日近くのお店に連れて行って貰いました。 オフィスが渋谷駅のすぐ近くなので、おしゃれで美味しいランチを食べることができ、毎日幸せでした☺️
心残りだった点
機能を開発しきることに注力しすぎてコード上の相談があまり出来なかった
序盤に工数の見積もりや命名規則といったチームのルールを曖昧にしたまま進めた結果、かなり後半で切羽詰まってしまい、コードベースがぐちゃぐちゃになってしまいました。 しかし、最終日の発表までに機能を開発しきることを優先してしまい、ぐちゃぐちゃなままで発表まで進むことになりました。
この結果、メンターの方にコードを見てもらったり、相談するのを躊躇してしまい勿体なかったと感じました。 せっかくなら「どのように書くのが見やすいか」や「ここのエラーハンドリングはどう書くべきか」といったコード上の問題点についてもアドバイスを貰ったら良かったなぁと思いました。
(という話を最終日の1on1でしたら「インターン終了後でも何時でも時間取って見れますよ!」と言ってくださったので、キャッキャ)
まとめ
ということで本当に学びの多いインターンとなりました。本インターンを通してまた一回り強くなれた気がします!
Progate社の方々、5日間大変お世話になりました🙇♂️ 本当に学びの多いインターンで楽しかったです!本当にありがとうございました。
またイベントやその他の機会でお会いできることを楽しみにしています!