コンテンツにスキップ
この記事はパブリックドメイン(CC0)です。自由にご利用ください。 CC0 1.0 Universal

開発型開発とリファクタリング駆動テスト

開発とは、繰り返し役に立つ新しい何かを生み出すことです。

開発と聞いてすぐに思いつくのは新製品の開発でしょう。これは個々の製品を作る製造とは異なり、いわば製品の設計書や型を作るという意味合いがあります。

このため、新製品の開発によって生み出された設計図や型が、工場で繰り返し利用されて、同じ製品が多数製造されることになります。

他にも、個人の能力の開発や、社会や国の開発という使い方があります。これらは単に所有しているものが増えるというよりも、その開発された能力を繰り返し使用して役立てることができるという意味合いがあります。

個人も社会も経済力は景気などによって浮き沈みがあるかもしれませんが、基本的に開発された能力は永続します。

減ることがあるとしても、それは経済的な豊かさのような上下変動ではなく衰退とみなされます。

この他にも技術や知識の開発もあります。これらは個人や個々の社会の能力と異なり、容易に共有することができるという特徴があります。

そして、これらの開発の成果物である製品、能力、知識、技術の中には、それが次の開発に役立つという場合があります。

そのような開発に役立つ成果物の開発により、開発の幅が広がり、効率や品質も向上していきます。

AI駆動ソフトウェア開発

一般に、開発には、長い時間と大きな労力が必要でした。特に社会が発展し様々なものが高度化すると、新しいものを作ることはより難しくもなっていきます。

しかし、生成AIの登場により、その状況が変わりつつあります。現在、生成AIのプログラミング能力の高さの恩恵で、ソフトウェア開発は劇的な変化を迎えています。

そこでは、生成AIをベースとした自律型エージェントがソフトウェアエンジニアとしてソフトウェア開発の中心となっていくという未来像が、既に現実のものとなりつつあります。

現在はその過渡期です。完全に生成AIに開発を任せることはできませんが、うまく生成を活用すると、非常に強力にソフトウェア開発を進めることができます。

これは、AI駆動ソフトウェア開発と呼ばれています。

開発型開発

ソフトウェア開発を生成AIが効率化すると、単に最終目的となるソフトウェアの開発だけでなく、開発に役立つソフトウェアの開発も効率化できます。

はじめに述べたように、開発に役立つ成果物は、開発の幅を広げ、効率化と品質向上に役立ちます。しかも、うまく作成すれば別の開発でも繰り返し使えるようになります。

このため、ソフトウェア開発の最中に、開発に役立つソフトウェアも開発することで、結果的に全体の効率を上げ、さらに次の開発にも役立つ資産として活かすことができます。

従来も、そのような開発に役立つソフトウェアを開発することは、現場ではよくあることでしたが、それ自体が開発時間や労力を必要とするため、慎重に見極めて的を絞って実施する必要がありました。

生成AIを活用すれば、思いついたちょっとした作業を自動化する簡易的なソフトウェアを、すぐに作ることができます。処理が明確な作業であれば、ほとんどミスなく生成AIが的確なプログラムを作ってくれます。

このため、ソフトウェア開発中に、その開発に役立つソフトウェアを開発するということが、今までよりもやりやすくなりました。

そして、そのことを深く考えていくと、開発中に開発に役立つものを次々と開発していき、開発のやり方そのものを変えていく、という開発スタイルが見えてきます。

これを開発型開発と呼ぶことにします。

開発型開発を実践するためには、自分が行っているソフトウェア開発を客観視して、どの部分はソフトウェアに肩代わりできるのか、どの部分は人間にしかできないのかを考える習慣と、そうした開発に役立つソフトウェアを開発するスキルが必要になります。

そして、それらのソフトウェアの中にも生成AIを組み込むことができます。ソフトウェアの中に組み込むことで、生成AIエージェントとは違って、ある程度処理の範囲を絞ったり、道筋を定めることができます。

AIエージェントでも、プロンプトにより同じようなことができますが、生成AIを組み込んだソフトウェアの方が、プログラムとプロンプトの両方を組み合わせることで、確度を上げることが容易にできます。

このような開発型開発を実践できれば、最初のプロジェクトよりも2回目のプロジェクトの方が品質もコストも改善されます。さらに、3回目のプロジェクト、4回目のプロジェクトと回数を重ねる毎に、ますます改善されていきます。

これは、単に生成AIを活用してソフトウェアを開発する、というやり方とは全く異なります。生成AIツールを使いこなすだけのチームと、開発型開発を実践するチームとでは、時間と共に大きな開きが生じていくでしょう。

リファクタ駆動テスト

テスト駆動開発という考え方があります。先に仕様からテストを考え、そのテストをパスできるようソフトウェアを開発するという考え方です。

生成AIを活用すると、自動テストのためのテストプログラムも容易に開発できるため、テスト駆動開発が実践できるかもしれないと、私も初めのうちは考えていました。

しかし、開発型開発を実践すると、テストを考えてから実装するというやり方は、あまり適さないと考えるようになりました。

特に、Webアプリのように自分でも触ってみて使い勝手や見た目のデザインなどの感性的な部分を伴うソフトウェアの場合、細かなテストよりも実際に動かして触ってみることの方が、優先度が高いことに気が付きました。

なぜなら、触ってみてUI/UXレベルで大きな不満があると、フレームワークや基本アーキテクチャ、データモデルやユースケースといった根本的な部分を変更したくなる可能性があるためです。

私も、現在個人で進めているソフトウェア開発プロジェクトの中で、機能の柔軟性や性能の問題に気が付いて、2つのフレームワークを別のものに入れ替えました。

また、メモリ使用効率が悪い部分があり、全面的に処理の見直しを行ったこともあります。

こうしたリファクタリングのタイミングで、テストが初めて意識されます。

これが開発の初期段階であったり、そもそも機能や仕様も大きく変えるなら、テストは不要でしょう。

しかし、既に開発がかなり進んで確認しておく項目も多くなるなら、リファクタリングで機能の不備や漏れがないことを確認するために、テストが必要になるでしょう。

このため、ある程度開発が進んでリファクタリングが必要になったタイミングでテストプログラムを作る、という考え方も悪くないでしょう。

この際にも、全てのコードのテストを作るのではなく、今後変化することが少ないような枯れてきた部分に対してのテストを中心とし、まだまだ流動的な部分は自動テストなしにしておくことがポイントです。

これはリファクタリング駆動テストと呼ぶことができます。

さいごに

生成AIは、ソフトウェア開発を劇的に変えていっています。

私は以前の記事で、フルスタックエンジニアを超えて、様々なドメインやインフラ、実行環境を組み合わせた全方位システムを開発できる全方位エンジニアを目指すことが重要になるという話を書きました。

また、従来の仕様と実装を一致させるソフトウェア開発ではなく、ユーザ体験をソフトウェアの振舞いによって向上させるエクスペリエンス&ビヘイビア中心の開発という考え方の時代になるだろうという記事も書いています。

開発型開発やリファクタリング駆動テストは、まさにこうした新しいソフトウェア開発の地平へとつながっていくものです。