追記(2024/06/26)
2024年バージョンを書きました。書いてある内容はほとんど同じであるので、大事なことは変わらないのだなと思います。
背景
フルリモートエンジニアはとてもいいものです。どこでも仕事ができるので旅行をしながら、海外にいながら、温泉に入りながら、どこででも好きなタイミングで仕事をすることができます。
この素晴らしい自由を支えるのは顧客との信頼です。
フルリモートの仕事は、仕事の過程を見ることができないため完全な成果物主義であり、この仕事をこの人に任せればこんな成果物が返ってくるだろうという期待と信頼関係によって成り立っています。
顧客に価値を届け、信頼してもらい、良好な関係を結ぶことがフルリモートエンジニアとして生きていくために必要なのです。
信頼を得るために必要なことは?
どうすればフルリモートでも価値を届けて、信頼してもらい、良好な関係を結べるのでしょうか?
いくつも要素があると思いますが、私が大事に思うのは次の三つです。
- すぐに成果が出てくる
- 品質が高い
- フィードバックに素早く対応する
この大事な要素を全て押さえているのがアジャイル開発手法です。
アジャイル開発手法は次の方法で上の3つに対応できます。
- 最優先ストーリーから開発を始める
- テスト駆動開発
- 定期的なリファクタリング
それぞれについて詳しく説明するために、今回は次のような発注を受けたという設定で、アジャイル開発をどう進めていくのかを解説したいと思います。
設定: 古本屋の店主からwebで在庫管理ができ、お客さんも在庫が確認できるようにしたいという依頼を受けた。店主は仕入れた本を登録することができ、在庫数がすぐわかるようになっていてほしい。お客さんはそのサイトを訪れるとどんな本が在庫にあって、いくらで売られていて、タイトルで検索ができる。他にも売れ筋の商品が見れたり、閲覧履歴からオススメの商品をサジェストしてくれたら最高だと思っている。検索履歴を見ればどの本を次に入荷すればいいかもわかるし、ビジネスの希望が見えてきた、という風に店主は言っている。
すぐに成果が出てくる → 最優先ストーリーから開発
あなたはこの店主の要望を聞いて、全ての機能を開発することにしました。見積もりとしては3ヶ月かかると店主に伝え、早速仕事に取り掛かります。
フルリモートは働き方が見えないというお話をしました。仕事を投げて1ヶ月も2ヶ月も成果物が上がってこないと店主は「こいつ本当に仕事してるのか??」と不安になってきます。店主はあなたに「今どんな感じだい?」と聞いてくるでしょう。
そこであなたは「詳細設計もできて、DBもセットアップし、ModelとControllerをかきました。きちんとテストもしています。あとはViewの部分を書けば完成です。残り1ヶ月でできるでしょう」と答えてソースコードを見せるでしょう。
でも顧客からはそれを聞いても本当にこれで完成に近づいているのか分からないのです。
だって動いている成果物が見れないんですもの。これでは信頼関係が成り立っているとはとても言えません。
アジャイルではどうするか?最優先のストーリーを決めてそこから開発していきます。
ストーリーとは一言で言えば**「(エンドトゥエンドで動く)機能」のことです。
最優先のストーリーは、ストーリーのリストの中で一番大事な価値のあるストーリー(機能)**のことです。
今回の例で言えば、「本を登録して一覧で在庫を見ることができる」がコアな価値です。これがなければ何もできないからです。
アジャイルではこの機能だけのプロダクトから作り始めます。
機能が一つに絞られているので1週間もあればできるでしょう。
1週間後に動くプロダクトを店主に見せるのです。店主はとりあえず本が登録できるようになったことが確認できるので、ソースコードを見るよりも進捗がわかって嬉しくなります。
次の1週間では、次に大事なストーリーを実装してまた来週に動くプロダクトを見せましょう。店主は毎週機能追加されていくプロダクトを見ることできるので、とても安心してあなたに仕事を任せることができるのです。
高い品質 → テスト駆動開発
店主は本が登録できるようになったことを確認できて嬉しいですが、本のタイトルを空白にして登録するとバグが発生することに気づきました。他にも値段に文字を入れられるとか、クリックを二回すると二重登録されるなどのバグがたくさん見つかってしまいます。あなたは次の1週間を丸々使ってテストを書き、バグを治しますが、そうすると1週間前から何も機能が追加されていません。こうなると店主はあなたへの信頼を失います。
いくらスピーディに動くプロダクトを届けてもらっても、品質の低いプロダクトは顧客からの信頼を失います。
アジャイルではどうするか?アジャイル開発は基本的にテスト駆動開発でやっていきます。
テスト駆動開発はテストから書いて、そのテストをパスするように実装をする、というのを繰り返して開発を進めていく手法です。
重要なのは今書いているテストを通すための必要最小限の実装をすることです。
テスト駆動で開発をすると、書いたテスト分の品質が担保できる上に、過剰品質(実装しすぎ)を避けることもできるのです。
テスト駆動開発は奥が深いので、是非とも他の資料に当たって勉強してもらいたいです。
フィードバックに素早く対応 → リファクタリング
1週間に1度動くプロダクトを見てもらったら、必ずフィードバックをもらいましょう。
動くものを触ってみると、机上の議論をしていた時には出なかった要望がどんどん出てきます。
例えば「本の入荷が1ヶ月に100冊以上あるから、登録はできるだけ簡単な方がいいな」とか「アマゾンへのリンクも貼ってあるとうちの安さが伝わるかも」などです。
これらのフィードバックは全てストーリーです。ストーリーリストに入れておき、最優先のストーリーから開発していきます。
フィードバックが多ければ多いほど、それはつまり修正が多いということになります。
機能追加や修正にアジャイルに対応するために必須なのが、リファクタリングです。
アジャイルはいつリファクタリングをするのかというと、常にやります。
正確にいうとテスト駆動開発をしながら、テストを通せたら必ず時間をとってリファクタリングをします。
流れとしてはこうです。
テスト -> 実装 -> リファクタリング
これを繰り返して変化に強いプロダクトを作っていきます。
店主は自分の言った要望が即座に対応されるのをみるとあなたへの信頼感が爆あがりします。だからリファクタリングをして即座に要望に対応できるコードベースを常に用意しておきましょう。
最後に
アジャイル開発という言葉はバズワードですが、具体的にどういう手法でどういう風に進めていくのかまで勉強している人は少ないと思います。
今回の実例を通して、いかにアジャイルが価値を届けることに向いているかが分かっていただけと思います。
今回伝え切れていないことも山ほどあるので、ぜひ自分でもアジャイル開発やスクラム開発というワードで検索して情報に当たってみてください。
それでは、良いエンジニアライフを。
PS. リモートの仕事があったら是非お話を聞かせてください。iOS(swift),Web(React,Vue,Nuxt),API開発(Python,Typescript,Java),データ解析(Python),機械学習できます。他にも色々できます。強みはアジャイルに価値を届けられることです。
連絡先 : mugiroki07[あっとまーく]gmail.com
追記(2019/08/16)
テスト駆動開発についての記事を書きました。参考にしてください。
僕たちがテスト駆動開発をする理由