これをやれば生産性10倍!ソフトウェア開発のパラダイムシフト
2023年はChatGPTによって大きく社会が変わったことを実感した1年でした。
自分自身もChatGPTに没頭した1年になりました。
この記事では、”ソフトウェア開発”をテーマに学んだことの集大成を書いてみました。
ソフトウェア開発の本質は問題解決
ソフトウェア開発、これはちょっとした魔法みたいなものです。
プログラマーは、誰かの困りごとを探し出して、コードっていう特別な言葉で解決策を作ります。
ちょうど、難しいパズルを解くような感じですね。
この魔法は、私たちの日常や仕事をラクにしてくれて、世界をちょっとずつでも良くしてくれます。
そして、この魔法のいいところは、一度作れば何度でも使えること。
上手く書かれたコードは、いろいろな問題に応用できて、何回でも役立ちます。
つまり、ソフトウェア開発っていうのは、ちょっとクリエイティブな問題解決なんです。
なので、問題解決のセオリーをおさらいします。
問題解決のセオリー
「誰の」どんな「課題」を「解決」するのか
問題解決は、「誰の」どんな「課題」を「解決」するかを考えることがセオリーです。
これは、対象となるターゲット(「誰の」)、彼らが直面している具体的な問題やニーズ(「課題」)、そしてその問題をどのように克服するか(「解決」)に焦点を当てています。
ターゲットはどんな人?
問題解決のプロセスにおいて、「対象となるターゲット(「誰の」)」を理解することは非常に重要です。
ターゲットが誰かを深く理解するためには、彼らの経験を自分自身に憑依させることが鍵となります。
特に、ターゲットが「過去の自分」である場合は、その体験に最も深く共感しやすいです。自分自身が直面した問題を思い出し、その時の感情や思考を再び体験することで、より深い理解に至ることができます。
しかし、ターゲットが自分自身でない場合、インタビューを行ったり、彼らと同じ体験をすることが有効です。これにより、ターゲットのプロトタイプを自分の中に作り出し、彼らの視点を自分のものとして取り入れることができます。このようにして、彼らのニーズや課題をより深く理解し、効果的な解決策を導き出すことが可能になります。
結局のところ、問題解決におけるターゲットの理解は、彼らの視点を自分のものとして内面化することから始まります。
課題とは?
「課題」とは、基本的に「ありたい姿」と「現在地」の間に存在するギャップのことを指します。ここで言う「ありたい姿」とは、目指すべき意志やビジョンを意味しています。つまり、どんな目標や理想を持っているかが「ありたい姿」に当たります。そして、その理想に対して現在自分たちがどこにいるのかが「現在地」です。
この二つの要素の間に生じる差異、つまりギャップが課題となります。意志やビジョンがなければ、そもそも追求すべきギャップも存在しないため、課題も生じません。課題は、意志やビジョンを持ち、それに対して現状を認識することによって初めて形成されます。言い換えれば、課題は私たちの認識の中で作り出されるものであり、目指すべき方向と現在の位置の間にある距離感を具体化したものです。
つまり課題とは”認識”により作るものです。
そして同じ課題を持ってる人数(or 社数)と金額の掛け算がマーケットサイズです。
解決とは?
「解決」というのは、ターゲットとなる顧客が現在利用している方法と、これから提案する新しい解決策をどのように差別化するかを考えます。
この考え方を具体化するために、次のようなマトリクスを用いることが有効です。
縦軸:一般論と意外性 - この軸では、解決策がどれだけ既存の一般的な考え方から離れているか、または予想外のアプローチを取っているかを評価します。
横軸:違和感と納得感 - この軸では、提案される解決策がターゲットにどの程度の違和感を与えるか、またはどれだけ納得感を持たせることができるかを考慮します。
最終的な目標は、相手にとって予想外だけれども納得感のある解決策を提案することです。
このバランスを取ることで、既存の解決方法とは異なる新しい価値を提供し、ターゲットの注目を引き、彼らの問題を効果的に解決することができます。
したがって、解決策を考える際には、単に問題を解決するだけでなく、どのようにしてそれをユニークかつ魅力的な方法で行うかが重要になります。
ChatGPTを使って課題を解像度高く理解する
このような問題解決のセオリーを構造的に理解しつつ、ChatGPTを活用して思考を整理します。
ChatGPTと壁打ちするような形で、自分の考えを整理します。
仮説を論理的に組み立てて、思考を深めていくのに役立ちます。
次に、作成した仮説を現地現物で検証します。
実際の状況やデータを用いて仮説の妥当性を試みます。
そして、得られたインサイトをもとに、新たな仮説をChatGPTと共に作り上げていきます。この繰り返しにより、より洗練された理解と解決策が導き出される可能性が高まります。
ソフトウェア開発の構造
課題を解像度高く理解したら、いよいよコードで解決策を作ります。
っと、その前にソフトウェア開発の構造を理解していきます。
(問題解決パートは伏線で置いといて、後でちゃんと回収します)
このパートでは、ソフトウェア開発は、”多層構造”の”モジュールの組み合わせ”で成り立っており、”より複雑になっている”。という話をします。
多層構造
ソフトウェア開発の多層構造は、アプリケーション、ミドルウェア、そしてオペレーティング・システムといった異なるレイヤーから構成されています。これらのレイヤーは、ソフトウェアが機能するための基盤となっています。
アプリケーションレイヤ:これはユーザーが直接触れる部分で、さらに細分化されています。具体的には、
プレゼンテーションレイヤ:ユーザーインターフェイスを担当し、ユーザーとの対話を管理します。
ビジネスレイヤ:アプリケーションのビジネスロジックを処理し、データ処理や計算などの機能を提供します。
データレイヤ:データベースやファイルシステムへのアクセスを管理し、データの保存や取得を行います。
ミドルウェア:アプリケーションとオペレーティング・システムの間を仲介し、異なるコンポーネント間の通信やデータのやり取りを支援します。
オペレーティング・システム:ハードウェアとソフトウェアの間で動作し、基本的なサービスとリソース管理を提供します。
外部のシステムやサービスとは、APIエコノミーを通じて接続されます。APIは、異なるアプリケーションやデータソース間の統合を可能にし、よりリッチな機能やデータの共有を実現します。
また、現代のソフトウェア開発では、インフラストラクチャとしてAWSのようなクラウドサービスが一般的に使用されます。
AWSが提供しているサービスの数は240種類以上の多様なサービスを提供しており、それらはさまざまな目的に合わせてカスタマイズして利用します。
モジュールの組み合わせ
問題解決において、しばしば「巨人の肩の上に立つ」という表現が使われます。
これは、過去の偉人や先人たちが築き上げた知識や成果を利用することの重要性を指しています。ソフトウェア開発の世界でも、この考え方は非常に有効です。
現代のソフトウェア開発では、ライブラリ、フレームワーク、オープンソース、Web API、さらにはSaaS(Software as a Service)やIaaS(Infrastructure as a Service)といった多様なモジュールが公開され、広く利用されています。これらのモジュールは、個々の機能や特定の問題を解決するために設計されており、プログラマーがゼロから開発する必要はありません。
実際、効率的なソフトウェア開発の鍵は、これら既存のモジュールをどのように上手く利用し、組み合わせるかにあります。新しいアプリケーションを開発する際に、適切なライブラリやフレームワークを選択し、それらを組み合わせることで、時間とリソースを節約し、より複雑で高度な機能を実現することができます。
巨人達が作成し、テストし、改善したモジュールを利用することで、我々はより高い立場から問題にアプローチでき、より大きな成果を上げることが可能になります。
結論として、ソフトウェア開発においては、自ら全てを作り上げるよりも、既存の優れたモジュールを効果的に組み合わせることが、より賢い解決策へと導く道なのです。
より複雑になっている
これまで、多層構造やモジュールの組み合わせについて考察してきましたが、このパートで強調したいのは、ソフトウェア開発が複雑になっているという現実です。
テクノロジーは、日々進化し続けています。このような状況は、プログラマーにとって非常に刺激的である一方で、全てを追いかけることの難しさも増しています。
この進化と複雑性の増大は、チームでの開発が主流になる大きな理由です。個々のプログラマーが全ての新しいテクノロジーを網羅することはほぼ不可能です。そのため、多様なスキルと専門知識を持つプログラマーたちがチームを組み、互いに補完しながらプロジェクトを進めることが一般的になっています。
ソフトウェア開発のパラダイムシフト
そんな複雑になっているソフトウェア開発が
ChatGPTの登場でパラダイムシフトが起きようとしています。
このパートでは、私の実体験から感じた3つの要素について話します。
(ここがこの記事の”サビ”です。)
”作る”から”探索”へ
ソフトウェア開発における”コードを書く”ということを簡単な構造にすると「入力(x)→処理(f)→出力(y)」になります。
プログラマーは主に”処理”を関数として作っています。
ChatGPTを使うとこうなります。
プログラマーは、命令とデータをプロンプトとして入力し、ChatGPTがコードを書いて、プログラマーが出力結果を評価して(必要に応じて)修正指示する。
変化は、プログラマーの仕事の比重が入出力に向かったということ。
ChatGPTは入力を満たす部分空間(θ)を探索していて、途中で課題や制約があっても筋道を立てて出力する。
入力(x)と出力(y)の質が高ければ、より適切な部分空間が探索できて処理(f)の質も高くなる。
入出力の質を上げるには?
ここで冒頭に書いた「「誰の」どんな「課題」を「解決」するのか」を使います。
(ここで伏線回収)
このあたりを明確にすると必然的に質、つまりChatGPTで使うプロンプトの質が上がります。
まとめると
出力(y)を満たすために質と量のデータ(x)を入力し、ChatGPTはyを満たす部分空間(θ)を探索する。
プログラマーは、yの解像度を高くすること、xを集め、整理することに注力することになる。
プログラマーは出力結果を評価して、改善点を入力にフィードバックさせて、より適切な部分空間を探索させます。
このフィードバックループを回すことがプログラマーの仕事になります。
結論として、ソフトウェア開発は”作る”から”探索”になる。
モジュール利用のコストが下がった
問題を解くには”モジュールの組み合わせ”が有効だと書きました。
モジュールを利用するうえで、最もコストが高いのは学習コストです。
ドキュメントを読み、動作テストを繰り返して利用することに多くの時間を費やしています。
ChatGPTを使うと一変します。
ChatGPTの入力にドキュメントを与えると、そのモジュールを使った適切なコードを書いてくれるようになりました。
その結果、学習コストが下がり、手軽にモジュールを利用できるようになりました。
非構造化データが使える
ソフトウェア開発の重要な要素の一つに”データを構造化する”というのがあります。
データを構造化しないと開発できないし、構造化の適切さ次第で創出される価値に大きなインパクトがあります。
ChatGPTの入力は非構造化データ(我々が普段使ってる自然言語)を扱えることは大変インパクトが大きいです。
さらにマルチモーダルであることも考慮すると、ソフトウェアが扱える問題領域の拡大と設計の容易さにつながります。
複雑であることに変わりないが…
ソフトウェアが多層構造でモジュールの組み合わせの数は今後も増えていく(むしろ拍車がかかる)ので、複雑さが増していくことに変わりはありませんがChatGPTは、多くの領域をカバーしてくれます。
”変わること”と”変わらないこと”
ソフトウェア開発の”変わること”と”変わらないこと”を一旦整理します。
変わること
ソフトウェア開発は”作る”から”探索”になる
モジュール利用のコストが下がる
非構造化データが使える
変わらないこと
ソフトウェア開発は問題解決
課題は”認識”によって作るもの
生産性10倍に!
ソフトウェアがより複雑になっていく中で、このような変化にキャッチアップしている人とそうでない人では大きな差になるでしょう。
急激に変化する中でも本質(変わらないこと)を軸にキャッチアップしていこうと思います。