米Target社の受入型集合研修(Dojo)でのモブプログラミングとDevOps

DevOpsDays Tokyo で来日してくれた、米Target社の  Michael Migliacio さんの記事を訳しました。衣料品小売の会社で、DevOpsやモブプログラミングを実践できるチームを作るための研修のお話です。

tech.target.com

 

一緒にレベルアップしよう - 多様な経験を持つ人々のチーム

Posted by Kin Wong & Michael Migliacio
Apr 15, 2019

人々の成長を促すために、みんなの経験をどうやったら楽しく共有しあえるのか? … 私たちがエンジニアリングリーダーとしていつも直面している課題です。それには献身的で規律正しくある必要があり、最も大事なのはコミュニケーションです。チームメンバーのあいだで継続してコミュニケーションと対話が行われるよう促すことは、必ずしも簡単なことではありません。うまいやり方を探すのは、多くのみなさんが思う以上に大変な道のりなのです。

“小打も積もれば大木を倒す” Little strokes fell great oaks. - 日本のことわざ (訳注: 少しづつの努力を続ければいずれ大きなことが起こせるという意味)

道場の門を叩く

さまざまなチームの人たちが、Target(訳注: 筆者たち)の没入型学習環境(訳注:受入型研修施設)である道場(Dojo)にやってきて、さまざまな理由で助けを求めます。例えば、製品のプロトタイプ作成、アジャイルの習得、DevOpsのベストプラクティスの実践などです。ビジネスニーズを解決するために集められた、できたてのチームが訪れることもあります。最近訪れたチームはその典型でした。API型のWebアプリによって、コントロールルームの在庫を迅速・正確に管理できるようにするために、店舗ホスティングの経験の豊かな人たちが集められていました。このアプリはゼロからの新規開発で、弊社のCI / CDパイプラインを通じてデプロイされます。チームはスクリプト作成とDBクエリーの経験は持っていましたが、RESTfulの概念とCI / CDは多くのメンバーにとって馴染みがなく、オンボーディング(全員を参加させる)には膨大な時間を投資する必要がありました。

一緒に変わる

最初のステップは、技術知識の基盤を確立することでした。午前中、チームは講義に参加して教室スタイルで概念の紹介をうけます。午後に入ると、午前中に教わった概念を強化するように設計されたワークショップや実地体験をおこないます。このアプローチはチームが前に進むのを助け、コラボレーションを促進する環境を作り出すのに役立ちました。ソースコード管理、基本的なPythonスクリプト作成、RESTfulサービスの使用などのケーススタディを含む、様々な形式のアクティビティがあり、すべてチームとしてやり遂げるよう設計されています。ほんの数日間のハンズオン活動によるコラボレーションによって、チームの真の生産性が解き放たれました。「モブプログラミング」を通じて。

モビングで心を一つにする

f:id:wayaguchi:20190516121442p:plain

モブプログラミングはソフトウェア開発のアプローチの一つで、チームが1つのモニター、1つのコンピューター、および1つのキーボードを介して同時に成果物に取り組みます。各チームメンバーには、数分間キーボードを担当する「ドライバー」役が回ってきます。時間はタイマーで測り、時間になったら交代です。キーボードにさわらない人も開発に積極的に参加し、技術的なハードルを乗り越えたり、解決策を調べたり、概念を説明したりしてドライバーを助けます。 モビング(Mobbing)はチーム全体の活動です。お互いが黙ってスクリーンにコードを書いていくのを眺めあう活動ではありません。

タイマーを忠実に守って行うことは本当に大切なことで、規律のないモビングだと、「キーボードを奪い合う」チームや、キーボードで積極的にタイプせず「絶ってしまう」チーム、取り組んでいることをコロコロ変えるチームになってしまうことがよくあります。Dojoでは、チームメンバー全員の参加を繰り返し促していくことや、Mobsterタイマーを使うことで、こうした問題を軽減します。Mobsterはオープンソースのツールで、参加者全員に順番を回したり、交代の時間になったら画面にちょっとしたメッセージを表示することで、確実に交代していくことを助け、「チームとしてソフトウェアを作る」ことに全員が集中し続けられるようにします。

このチームにとってモブプログラミングの利点は計り知れませんでした。モビングによって、各チームメンバーはグループと知識を共有できたのです。また、コードの作成、リファクタリング、およびテスト中にチームメンバーがアイデアを生み出す頻度が高まりました。モビングの各セッションを通して、生産的な会話が自然と頻繁に起こりました。

テスティング

今日のビジネス環境では、チームがビジネスの敏捷性と迅速にソフトウェアを展開するための器用さを備えていることは、関係を保つ上で不可欠です。ソフトウェアの変更やアップデートへの需要が高まっているため、CI / CDパイプラインの中で自動的にテストを行うことが不可欠です。この問題に対応するために、店舗ホスティングチームは、APIを作成する際にスペック駆動型開発(spec-driven development)を用いました。別の表現をすれば、Swaggerで定義されるAPI仕様は、どんなコードが書かれるより前に完成していました。このアプローチはチームにとって非常に役立ちました。チームは作業開始時点で各エンドポイントのデザインを詳細に理解することができるようになったからです。 Swaggerによってもたらされる互換性問題を解決するオープンソースPythonテストライブラリpytestと組み合わせることで、チームはAPIエンドポイントの開発と並行して、ユニットテストと統合テストの堅牢なライブラリを構築することができました。

f:id:wayaguchi:20190516121643p:plain

Pytestにより、このチームは堅牢なテストライブラリを構築し、それらをDroneのCI / CDパイプラインに統合することができました。何か新しいコードがマスターブランチにチェックインされると、Droneのジョブが起動され、、アプリケーションを構築し、Dockerコンテナにデプロイし、テストスイートを人手の介入なしに実行します。チームはテストとCI / CDを組み合わせて行うことで、開発プロセスを通して日々発生するエラーをキャッチできるテストインフラを獲得し、それによって自分たちがやりたい実験ができる自信を得ました。

結果

店舗ホスティングチームはすぐモビングできるようになり、研修中に醸成された信頼関係を大事にするようになりました。チームは一種の「集団意識」で活動するようになり、各メンバーはリズムを崩さずに交代できるようになりました。さらに、考えたことや意図は効果的に伝達され、キーボード操作の引き継ぎがあっても作業を続けるすことができます。モビングによって、チームが一緒に失敗し、一緒に学び、そして一緒にミスを修正することが可能になりました。チームはたった数週間のうちに、FlaskによるAPI開発、CI / CD、Python、PytestによるTDD、自動化、機密情報管理まで、幅広く取り組めるまでになったのです。

店舗ホスティングチームによって提供されたMVP(最低限の実行可能な製品)は期待を超え、新しいチームはソフトウェアエンジニアリングの概念を学び、さらに大事な、大きな相互信頼を獲得しました。

 

- - -

Kin WongとMichael Migliacioは、Targetでソフトウェアエンジニアリングチームをより良くすることに焦点を当てているシニアエンジニア/ Dojoコーチです。

 

(翻訳はここまでです)

本記事の翻訳には様々な方のレビューをいただきまして、特に松元健さん、新井剛さん、荒井裕貴さん、木村卓央さんからは修正提案を頂き、マージしております。ありがとうございました。他にもご指摘がございましたら、ご連絡いただければ幸いです。