駆動開発が多すぎる件


# はじめに
こんにちは、技術記事の書き方迷走中のむっそでございます。

なんだか最近　**「××駆動開発」** って単語をよく聞きますね。
××駆動開発が多すぎて、どこかでコンフリクト起きてない？って思い始めてます。
**なにを軸に駆動したら良いのかわからない問題** です。

こんだけ××駆動開発って言葉が多いってことは、 **出来ない自分を良い開発体験へと突き動かしてくれるなにかを求めてる欲求の現れなのでは？(救世主(メシア)思想的な何か)** と変な深読みをしてますが、**このような状況のときには××駆動開発すれば良い感じになるんじゃね**というのをまとめてみたいと思います。

※この記事の続編はこちら

https://qiita.com/muson0110/items/4ea641a48abeaf12ff90


# よく知られてる駆動開発の種類
## １.ユーザー機能駆動開発

### 意味：
> FDD(Feature Driven Development)はジェフ・デ・ルーカ（Jeff De Luca）が、1997年シンガポールの大手銀行の大規模な開発プロジェクト（50人、15ヵ月）のために提案したアジャイル開発プロセスです。フィーチャー（Feature）とは顧客視点での小さな単位の機能価値のこと。FDD（ユーザ機能駆動開発）は実績のあるベストプラクティスを組み合わせたもので、稼働するソフトウェアを繰り返し短い間隔で提供します。

[引用](https://www.sei-info.co.jp/framework/keyword/agile.html#fdd)


### どんな時に使えそうか：
ユーザーの要望に基づいていない開発は無駄なコストになってしまう可能性が高いので、ユーザーの求める機能をベースに開発を進めましょうというのがユーザー機能駆動開発ですね。

 - 事業化前のアイデアが実際に利益を出せるか不明で、顧客と話し合いながら機能開発を進めていきたい場合
 - エンジニアチームの技術成熟度があまり高くないので、無駄なく小さく開発を始めていきたい場合

### 参考リンク：

[アジャイル開発 | ローコード開発プラットフォーム 楽々Framework3](https://www.sei-info.co.jp/framework/keyword/agile.html)

[ユーザー機能駆動開発 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E6%A9%9F%E8%83%BD%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA)

[アジャイルサムライ−達人開発者への道](https://www.amazon.co.jp/dp/4274068560/ref=cm_sw_em_r_mt_dp_F136C0SBZ2X2MAB2N0B6)



## ２.チケット駆動開発
### 意味：
> チケット駆動開発 (ticket-driven development; TiDD) とは、プログラム開発手法の一種で、作業をタスクに分割しBTS（Bug Tracking System／バグ管理システム）のチケットに割り当てて管理を行う開発スタイル[1]。細かな修正作業の多い従来開発の中で生まれたが、アジャイル開発との親和性が高い[2]ことから、エクストリーム・プログラミングをはじめとするアジャイル開発でも実践されている。

[引用](https://ja.wikipedia.org/wiki/%E3%83%81%E3%82%B1%E3%83%83%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA)


### どんな時に使えそうか：
過去の機能要望やバグ修正でどういう経緯があったのかなどを追えるのはとても重要です。すべての開発は基本チケット駆動開発であるべきではと思っています。
 - イシューやチケットに基づいた開発を徹底することで問題/要望の出現～機能実装完了までのすべての工程をトラッキングできるようにしたい場合

### 参考リンク：

[チケット駆動開発を上手に運用するためのプラクティス（ゲストブログ） | Atlassian Japan 公式ブログ | アトラシアン株式会社](https://www.atlassian.com/ja/blog/tidd-part2)


## ３.締め切り駆動開発
### 意味：
> 締め切りギリギリまでは開発に着手せず、顧客とのコミュニケーションに専念する。どんなに幸運でもこれ以上遅らせると炎上すると言うところまで来て、開発を開始する。この段階で次の顧客の仕事を始めたことにし、リソース消費の平均化を実現する。
締め切りをすでに過ぎているというプレッシャーを利用して開発を進めるところから、締め切り駆動開発と呼ばれる。

[引用](https://ansaikuropedia.org/wiki/%E7%B7%A0%E3%82%81%E5%88%87%E3%82%8A%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA)


### どんな時に使えそうか：
多分ネタ的に使われている単語に見えますが、割と多くの人間に対して有効な手段かもしれないですね。子供時代の夏休みの宿題や、テスト前日の追い込みがトラウマになっているのかもしれません。

 - 時間にルーズなエンジニアに対して締切という絶対条件を突き付けることで追い込みたい場合
 - 締切がないとやる気がでない場合
 - 追い込まれたい場合またはそういう性癖

### 参考リンク：

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">締切駆動開発、「自分が締切何時間前から焦って行動が出来るのか」を正確に掴んでいないと、有効に働かないので、そのあたりをちゃんと意識して計画を立てるべき。</p>&mdash; chokudai(高橋 直大)🍆@AtCoder社長 (@chokudai) <a href="https://twitter.com/chokudai/status/505591480233119744?ref_src=twsrc%5Etfw">August 30, 2014</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## ４.ドメイン駆動開発(設計)
### 意味：
> ドメイン駆動設計（英: domain-driven design, DDD）とはソフトウェアの設計手法であり、「複雑なドメインの設計は、モデルベースで行うべき」であり、また「大半のソフトウェアプロジェクトでは、システムを実装するための特定の技術ではなく、ドメインそのものとドメインのロジックに焦点を置くべき」であるとす

[引用](https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88)


### どんな時に使えそうか：
ITエンジニアとしてどの業界に転職したとしても共通して生かせる知識を持っておきたいと思うので、ちゃんとドメイン駆動開発は学んでおかないとなぁと思ってます。(にわか&積読中)

 - ITアーキテクチャと業界独自のドメイン知識をどのように組み合わせてアプリケーションを設計/開発していくべきか明確にしていきたい場合
 - 過去のコードがごちゃつきすぎてドメイン駆動設計ベースでリファクタリングをしていきたい場合

### 参考リンク：

[ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本](https://www.amazon.co.jp/dp/479815072X/ref=cm_sw_em_r_mt_dp_QVR1VSSQAVYKMCRZMS6J?_encoding=UTF8&psc=1)

[エリック・エヴァンスのドメイン駆動設計 (IT Architects’Archive ソフトウェア開発の実践)](https://www.amazon.co.jp/dp/4798121967/ref=cm_sw_em_r_mt_dp_JCYEEPKX12NBHWSJKA13?_encoding=UTF8&psc=1)

[ドメイン駆動設計は何を解決しようとしているのか[DDD]](https://qiita.com/little_hand_s/items/721afcbc555444663247)


## ５.テスト駆動開発
### 意味：
> テスト駆動開発 (てすとくどうかいはつ、英: test-driven development; TDD) とは、プログラム開発手法の一種で、プログラムに必要な各機能について、最初にテストを書き（これをテストファーストと言う）、そのテストが動作する必要最低限な実装をとりあえず行なった後、コードを洗練させる、という短い工程を繰り返すスタイルである。

[引用](https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA)


### どんな時に使えそうか：
プログラミングって自由に書くことができるので、考えないで書こうとすると[React propsのバケツリレー](https://www.asobou.co.jp/blog/web/props-drilling)みたいな感じであまりよくないロジックで書いてしまいがちです。クラスや関数をプログラムで書くときに **まずインプットとアウトプットをどのようにしておくべきなのか**という意識から**テストを先に書く**って重要だなぁと感じてます。

 - 共通のパブリック関数やutilを作るときにテストがしやすくて、理解しやすくて、変更がしやすい関数群で構成しておきたい場合
 - 将来的に負債にならないようなきれいなコードを作りたい場合

### 参考リンク：

[テスト駆動開発（TDD）とは？TDDの進め方をステップ毎に解説！| Qbook](https://www.qbook.jp/column/20181009_713.html)

[アジャイル開発における「TDD」と「BDD」  |  SHIFT ASIA -ソフトウェア品質保証のプロフェッショナル-](https://shiftasia.com/ja/column/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E9%96%8B%E7%99%BA%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8Btdd%E3%81%A8bdd/)

[テスト駆動開発](https://www.amazon.co.jp/dp/4274217884/ref=cm_sw_em_r_mt_dp_SNR9MZ09JJ0H9D964QF2)

[ソフトウェア開発の「品質vs.スピード」、本当は何を犠牲にしているのか【デブサミ2020】](https://codezine.jp/article/detail/12245)


## ６.ビヘイビア駆動開発
### 意味：
> ビヘイビア駆動開発 (振舞駆動開発; behavior driven development; BDD)とは、プログラム開発手法の一種で、テスト駆動開発から派生した物である。
テスト駆動開発で記述されるテストケースは、作成したプログラムの動作が正しいかどうかを検証するために行う「テスト」である。テストであるという点は同一であるが、加えて、これから作成しようとするプログラムに期待される「振る舞い」や「制約条件」、つまり「要求仕様」に近い形で、自然言語を併記しながらテストコードを記述する。

[引用](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%98%E3%82%A4%E3%83%93%E3%82%A2%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA)


### どんな時に使えそうか：
やはり**このコードはざっくりこんなことしてます**ってシンプルに説明できる状態の実装というのが、まぁ健全なんじゃないかなと勝手に思ってます。**シンプルいずベスト！**

 - 非エンジニアや関係者に対して、どのようなテストケースでテスト実装しているかを説明できるようにしたい場合(説明とテスト実装が一対一対応している)
 - ユーザー受け入れ基準(この機能を実装できていれば実装完了とみなす基準)を設定していて、受け入れ基準とテスト実装を対応させたい場合

### 参考リンク：

[アジャイル開発における「TDD」と「BDD」  |  SHIFT ASIA -ソフトウェア品質保証のプロフェッショナル-](https://shiftasia.com/ja/column/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E9%96%8B%E7%99%BA%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8Btdd%E3%81%A8bdd/)


[アジャイルユーザーストーリーの受入基準5つのポイント](https://rihoublog.com/2018/11/06/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AA%E3%83%BC%E3%81%AE%E5%8F%97%E5%85%A5%E5%9F%BA%E6%BA%965%E3%81%A4%E3%81%AE%E3%83%9D/)


## ７.コンポーネント駆動開発
### 意味：
> コンポーネント駆動開発(CDD)とは、UIを組み上げるときに、まずコンポーネントから作り始めて、最後にページを作り上げる「ボトムアップ」の開発プロセスのことです。

[引用](https://wb-hp.com/blog/2020/10/12/cdd.html)


### どんな時に使えそうか：
あまりフロントエンド詳しくないですが、Reactにより**部品(コンポーネント)を構成して全体のユーザーインターフェースを作り上げる**という概念が浸透してきて、道具の再利用が出来て無駄が減るので好きだなぁって思っています。

 - UIで同じようなコンポーネントの亜種が大量に発生していてやばくなってきたので、コンポーネントを統一化して利用できるようにしたい場合

### 参考リンク：

[Component Driven User Interfaces](https://www.componentdriven.org/)

[コンポーネントと props](https://ja.reactjs.org/docs/components-and-props.html)


# まとめ
世の中にはたくさんのxx駆動開発がありますね。
これからもっと増えていくかもしれないですが、これらの駆動開発を組み合わせて最強のxx駆動開発を見つけられたらいいなぁと思います。

実は**わいの考えた最強のxx駆動開発**もこの記事に入れて提案しようとしたのですが、文字数がえげつなく多くなったので、
続編を次回出したいと思います。お楽しみにー