Avintonジャパン独自のエンジニア育成プログラムAvinton Academy。その学校向け講義Avinton Academy on Campusが岩手県立大学 ソフトウェア情報学部 プロジェクト実践演習の授業内で行われました。
今回の講義のテーマは「アジャイル開発」。Avintonジャパンの社内サービス開発チームにおけるアジャイル開発のスタイルがどのようなものか、そしてその軸ともなっているコラボレーションツール「Git」をいかに活用しているのかをお話してまいりました。
今回は、岩手県立大学 ソフトウェア情報学部での授業でお伝えした最前線でのアジャイル開発の手法を公開いたします!
1.Gitとは
AvintonジャパンでエッジAIカメラやAvinton データプラットフォームを作っている社内サービス開発チームでも使われているGit。もちろん、我々Avintonだけでなくチームで開発しているエンジニアや大学生までみんなに有用なツールです。これを読んだエンジニアの方でGitを使ってみたことがない方がいらっしゃりましたら、是非一度お試しあれ。
Avinton AcademyではGitのチュートリアルを提供しています。Gitの勉強を始めたいかたは、こちらも読んでみてください。
さて、そんなおすすめツールGitですが、一言で表現すると「分散型バージョン管理システム」です。ファイルのバージョン管理がとても簡単になるツールだと思ってください。
このツールを使うと以下のようなことが実現できます。
- 新旧のファイルを一括管理
- 前のバージョンのファイルに戻れる
- チームでファイルの変更履歴を共有
- 複数のメンバーで修正した部分の統合
- チーム開発の効率化
これの何が便利なのか、一つ例をあげてみましょう。
多人数が参加しているプロジェクトにおけるアプリケーションコードのバージョンアップについて見てみます。通常、ファイルを更新すると古いバージョンに戻すことは手間がかかります。もしバージョンアップ後にエラーが起きてしまって一度以前のバージョンに戻したいと考えたとき、コードを1文1文打ち込んでいたら手間ですよね。これがGitで管理しているファイルであれば、Git上でファイルの編集履歴を管理できるので、編集前のファイルのバージョンに簡単に復元できます。
これだけ聞くとたったそれだけと思うかもしれませんが、小規模プロジェクトならともかく、数十人以上の大規模プロジェクトともなるとファイル数も多く、このようなことは頻繁に起こります。そんな時に、無駄なく必要な処理を行えるのがGitというツールです。
2.GitHub / GitLab
こんな便利なGitですが、Gitを単体で使うということはほとんどありません。
実際にエンジニアチームが使うときには、GitHubやGitLabというサービスプラットフォームと併用されることがほとんどです。
GitHub
GitHubとは、Gitを使ってコードを管理するときに使われるプラットフォームです。世界中で使われていて、8000万人以上のユーザーを持つ、エンジニアのほとんどが一度は使ったことがあるというくらいに浸透しているツールです。2億件以上の豊富なリポジトリを持つ世界最大のGitのサービスです。リポジトリとは、コードやファイルを管理するためのフォルダのようなものだと認識してください。そして、このリポジトリは必要に応じて公開/非公開を設定することが出来ます。公開に設定したリポジトリをパブリックリポジトリといい、いわゆるオープンソースのプロジェクトにあたります。企業での利用等を始め、機密性の高いファイルや外部に公開したくないプロジェクトに対しては非公開設定のプライベートリポジトリを利用します。
このGitHubは開発プラットフォームであると同時に、開発者のためのコミュニティという側面も持っています。オープンソースのアプリケーションに対し「こんな問題があった」「もっとこういう機能を追加した方が良い」といった議論がなされ、開発者間で日々活発なコミュニケーションが行われ、新たなプログラミング言語やアプリケーション、先進的な技術が開発されている、そんなプラットフォームです。
GitLab
GitLabはGitHubをもとに開発されたオープンソースソフトウェア(OSS)です。GitHubが開発者間のコミュニケーションに重きを置いたプラットフォームであるのに対し、このGitLabはプロジェクトやチームを管理し、タスクを進捗させていくことに焦点を置いたアプリケーションです。DevOps支援やタスク管理に特に力を発揮します。DevOpsの話は後ほどいたしますが、タスク管理のしやすさについては、下の画面を見ていただければ一目瞭然です。
このようにIssueという形で今あるタスクが可視化され、今どういう進捗か、誰が担当しているのかというところをタブで表現可能です。ですので、これを見れば今誰が何をやっているのか、これから何を抱えているのかはこれを見るだけでわかります。また、コードや変更履歴がIssueに紐づけられるのでGitLabを見ることで開発状況がすぐにわかります。これにより、エンジニアとしてもマネージャーとしても、チームでプロジェクトを進めるうえでの情報連携が容易になるのです。
3.Gitを使ったプロジェクトワークフロー
これだけでは中々イメージもわきにくいと思いますので、ここからは実際にAvintonではどうやってコードやタスクの管理をしていくのかをご説明いたします。
1.Issueの作成
問題や解決するべき課題を明確に記述する。
必要であれば、タスクを開始前に議論するべき点や懸念点なども記述する。
今から何をやるのかを誰が見てもわかるようにすることがポイント。
2.担当するメンバーをアサインする
タスクを行うメンバーを明確にする。
自分をアサインすることもある。
3.ラベルを追加する
必要に応じてラベルを追加する。
“To Do”, “Pending”, “Continuous”などIssueの状況に応じて適宜更新する。
これにより、看板ボードでのIssueやプロジェクト全体の進捗管理 になる。
4.コメントでIssueの状況を更新する
進捗をコメントしつつコードを書き始める。
コードがある程度書けたらコミットメッセージで何をしたかを残していく。
上記が状況を残しつつ、マネージャーへの報告にもなる。
必要に応じてIssue上で質問したりアドバイスを求めたりも出来る。
5.マージリクエストの作成
自分がプログラムを追加したり更新したときに、その内容をマスタープログラムに反映(マージ)しても良いかを確認する。
6.変更点のレビュー
マージリクエストに対し、レビュワーをアサインする。
レビュワーは変更点をレビューし、必要に応じてコメントする。 もし不備があれば、修正を提案、依頼する。
ここで問題がなければマージを行う。
7.issueを閉じる
このような手順を踏むことで、チームでの開発だったとしても本番のプログラムにエラーが含まれているコードが反映されたり、コミュニケーションエラーが起きることを効率的に防ぐことが出来ます。一つ一つは手のかかる業務かもしれませんが、これらによってチーム開発の最大の敵である手戻りの発生を防ぐことが出来るのです。
4.Gitを活用したOSSの開発事例
今回はApache SupersetというAirbnb社が開発したデータの検索や可視化を行うためのオープンソースソフトウェアのBIツールの開発がどのように行われているかを解説いたします。これは一つの事例ですが、ほかのオープンソースのプロジェクトについてもほとんど同じように開発されております。
このApache Superset、オープンソースですので、誰でも使うことが出来て、コードを見ることも出来て、何と開発に参加することまで出来てしまいます。
まず、プロジェクト全体の行動規範(CODE OF CONDUCT)がこちらに記述されています。たとえば、”Be Open”(オープンな態度でいよう)や “Be collaborative”(協力的な態度でいよう)など、不特定多数のエンジニアが気持ちよく共同開発するために重要な姿勢や考え方が書かれています。
次にこちらのページには、OSSへコントリビューションを行う方法が記述されています。コントリビューションの種類や具体的なプルリクエストの 作成方法、レビューやテストの方法、コードのスタイルについてまで、幅広く網羅されています。また、コントリビューションと聞くとコードを書いてコミットする、というイメージが強いかもしれませんが、それ以外にも”Report Bug”(バグの報告)や”Improve Documentation”(ドキュメントの改善)などのコーディング以外の作業も説明されています。新しくOSS活動に参加したい人はこのドキュメントを確認して、スムーズ に開発に参加することができます。
実際にバグが修正された例を見てみましょう。レビュワーの一人がバグを発見したため”[SQL Lab] Saved Queries do not include parameters“というIssueを作成し、バグを報告します。 この場合、Saved Queriesという機能が動いていないという報告ですね。ここには、バグの再現方法やバグ発生時の環境を報告し、コメントでほかの人も同じバグが確認できたことなどを共有しています。また、スクリーンショット等も使って、わかりやすく開発者間で情報を共有します。
その後、報告されたバグに対する修正をコミットしたプルリクエスト “feat(sqllab): save query parameters in database“が作成されました。GitとGitLabでマージリクエストと言ったりプルリクエストといったり名前が変わるのですが、基本的には同じものだと思ってください。
このプルリクエストの中では、レビュアーが変更点を確認し、テストを行い、変更が意図するものかどうか、バグやエラーがないかどうか を確認してから承認をしています。変更点はコードチェンジの項目から閲覧することができ、レビュアーだけではなく、全世界の人が確認することができます。 まさにオープンですね。
このリクエスト内でコードを書いた人とレビュアーを中心に議論を重ね、正しい変更だということを確認後、この変更点はマスターブランチにマージされ、機能の修正が完了しました。
OSSの開発では複数人のエンジニアやユーザーが協力し合ってアプリケーションを改善していくことで成り立っています。この参加者たちはお金がもえらるというわけではありませんが、趣味で週末に参加している人もいれば企業に務めて業務時間として一日中開発に参加している人もいます。このように多くのエンジニアが自由に議論しながら、様々な新しい考え方や技術が生まれています。世界中のエンジニアが大規模に開発を行う際にも、GitやGitHubは大きな役割を果たしています。
5.GitとDevOps
このようにGitは様々な機能を提供していますが、他にも近年開発の主流になりつつあるDevOpsを実践する上でも非常に有用なシステムです。 DevOps(デブオプス)とは、アジャイル開発においてDEVelopment(開発)とOPeration(運用)を組み合わせる概念です。まず開発を行い、形になったら運用してみて問題点を洗い出し、それを改善するための開発を行い…というサイクルを行い、アプリケーションを継続的に改善していくというものです。DevOpsを導入することでアジャイル開発において重要な効率的で安全なソフトウェアライフサイクルを実現することを目指します。
CI/CDはそれぞれContinuous Integration(継続的インテグレーション)とContinuous Delivery(継続的デリバリー)を指しています。CIはソース を自動でビルド・テストすることで、効率的かつ素早く不具合を見つけ、修正することを目的とするプロセスです。一方、CDはCIのテスト したコードが本番環境にデプロイされるまでのプロセスを自動化するものです。このようにCI/CDはビルド・テスト・デリバリーを自動的に行うことであり、これはDevOpsを実現する上で最も重要な仕組みの一つです。
ここではDevOpsを実現するための一つとしてCI/CDを紹介しましたが、実際にはCI/CDの他に調査やプロジェクト自体の管理が必要であるなど、 DevOpsを実践する上でクリアしなければいけない課題はいくつかあります。そこで、Gitリポジトリ機能や多くのDevOps機能を備えるGitLab、Githubなどのシステムを利用し、プロジェクト全体の管理からアプリケーションの運用までカバーすることがあります。Gitに対する理解を深めることはモダンな開発フローを実践していく上でも非常に重要です。
6.まとめ
Gitを効率的に使用することによって、チームでの開発を加速することができます。近年ではDevOpsの技術と組み合わせて、ソフトウェアライフサイクルを管理するための一部として重要な技術になっています。多くオープンソースのアプリケーションはGithub上で開発されました。Gitを利用することで、個人や小さいチームでの開発だけではなく、世界中に分散しているプログラマーがコードの変更や修正を衝突することなく して効率的に開発を行うことができるのです。
7.この講義を受けたうえでの質疑応答
(学生)私も普段からGitは利用しています。Avintonでは海外の方ともGitを介してのやり取りがあると思いますが、何か特別注意している点や工夫していることはありますか?
(Avinton)言葉にしてしまうと陳腐なのですが、コミュニケーションをクリアにすることにとても気を遣っています。例えば、Issueを立てるときには「背景」「目的」「完了の定義」「やるべきこと」が誰から見ても明確にわかるような記載をし、Issueナンバーとコードを紐づけてから開発を始めるといった、社内の共通ルールを厳格に守っています。
(先生)Issueを立てるのはプロダクトオーナーだったりマネージャーだったりすると思うのですが、誰をアサインするかを決める際のルールや方法はあるのでしょうか?
(Avinton)一番多いパターンは、週1回程度のクライアントとの打ち合わせで1週間分のタスクがはっきりするのですが、そのタスクをチームごとに分けてTo Do化したIssueを立てます。それを見て各チームのリーダーが適性や今のタスク状況等を総合的に見て各エンジニアにアサインしていく流れです。その際に、アサインされたエンジニアから見て今の自分のタスク量を鑑みて処理不可能だと感じた場合や優先順位として低いと感じた場合は、そのIssueにおいてプッシュバックして相談や交渉を行います。
もう一つよくあるのがエンジニアが何かエラーを発見したときのパターンです。エラーを発見したり改善すべき点を発見した際は、それを発見したエンジニアがIssueを立てて、自分をアサインしたりそれを解決できそうな同僚のエンジニアをアサインしたりすることも多々あります。
(学生)Gitを使った進捗管理ではラベルを使うというお話がありましたが、具体的にどんなラベルを使っているのですか?
(Avinton)Todo,Doing,Contenious,Pending等を使うことが多いです。
ここで講義の時間が終了してしまいました。本講義はここまでです。
8,最後に
さて、Gitを使った連携についてAvintonジャパンのアジャイル開発とApache SupersetのOSS開発とDevOpsでのGitの役割の3つの事例を紹介いたしました。Gitの便利さを感じていただくことは出来たでしょうか?
今、IT技術はどんどん成長していて、開発の現場では複数人でのコラボレーションが当たり前になっています。エンジニアにとって自身の技術力を高めることももちろん重要ですが、チームで開発を進めるための作法を理解し、チームに貢献できるようになることも同じように重要です。
エンジニアを目指していてGitを使ったことがない方がいらっしゃりましたら、これを機にGitデビューしてみませんか?