最近、とあるAI絡みのプロジェクトでLLMを使ったシステムの研究開発をやっておるのですが、個人的に応用が利くものができつつあると実感しているのですが、一方で、今は広める訳にはいかないので、成果の一部を小出しにします。
ちなみに、「オブジェクト指向おじさん?」の記事については、「感情的である」というAIからのご指摘を受けてそのうち修正を行いたいと思います。
以下本題、下記の記事にコメントします。
・なぜ、「ウォーターフォールでソフトウェアを作れる」という嘘を信じる人が世の中にいるのか?
・ウォーターフォール開発がダメなのかは、弁護士が請負契約で仕事しないことでわかる?
あくまでも個人的な感想ですが、どうもAIを活用した論調の記事だとは思うのですが、私のAI分析が良い感じだったのでその成果ということであえてコメントします。
まず、結論ですが、ウォーターフォールだろうが、アジャイルだろうがその場にあった方法でどうぞとなります。
「プログラマ」ではなくある種のコンサルタント的な立場の人間(SEや営業、アーキテクトもその一人かもしれません)、つまり上司やプロジェクトリーダの元での作業ではなく、非エンジニアの顧客(情報システム部門の方でも、そうでない方でも)と直接話をする場合にわかるかと思いますが、おそらく99%の顧客の関心事項は
金をどぶに捨てることにならないか?(何らかの成果物が出てくるか?)
ということです。顧客目線に立てばウォーターフォールが良い場合もあればアジャイルが良い場合もありますし、ウォーターフォールだろうがアジャイルだろうが、最終的にモノが出来なければ「修羅場」になるということです。
まともな顧客は、RFP(Request for Proposal)を用意して提案書(見積)を求めてきます。
そうでなくても「こんなシステムを作りたいのだが・・・」からはじめに打合せを行ってから、ある程度「何を作るか?」を話し合ってからの見積となります。
この場合、ウォーターフォール開発が想定されるような「システム開発」の場合、ほぼ間違いなく
完成保証があります。
つまり請負契約になります。ここで『ウォーターフォール開発がダメなのかは、弁護士が請負契約で仕事しないことでわかる?』とありますが弁護士が請負契約をしない最大の理由は「原理的に完成保証ができない」からです。つまり裁判になったときには必ずどちらかが負けます。弁護士が仕事を受けるときには原理的に「勝ち」を保証できないことになります。
一方でソフトウェア開発の場合は、「不確実性」があったとしても顧客と開発者が成功に向けて協力すれば、「何を作るか?」ということに関しては何らかの合意ができることが多いです。また、記事にあるような『不確実性が高い』というのは、ソフトウェア開発が持つ「本質的不確実性」の他に、開発するエンジニアの技術不足や経験不足「技術的不確実性」ということもあります。もちろん顧客の都合で仕様が変わる場合「要求不確実性」もあり、これらをきちんと見極めないと、アジャイルといって何回も工程を繰り返しても「いつまでたってもできない」ということもあります。
つまり、ウォーターフォールかアジャイルかの問題ではなく、これら3つの不確実性のうちどれをどの時点で誰が負担するかの問題になります。
「完成保証なんて出来ない」と思っている人もいるかもしれません。実際にWikipediaにも「問題点」として挙げられています。当然ですが、ここは現状に合わせて適宜修正を行うことになります。「出来るかどうかわからない」という状態はウォーターフォール開発的に言えば「要件定義が終わっていない」ということになります。実はウォーターフォール開発でも現状分析や要件定義などのいわゆる上流工程は原理的に「完成保証」ができません(し実務上もしません)。また、要件定義がまとまっても技術的にできないことが後になって発覚する場合もあり得ます。そういうのを防ぐ為にも「プロトタイプ」を要件定義の間に行うこともあります。また、テスト工程では「要件定義のバグ」も考慮して期間や費用の見積もりを行った方がよいでしょう。
私の経験では、要件定義の段階で大体プロトタイプを作成しますしそれなりの費用をいただいております。
ウォーターフォール開発の利点の一つですが、「仕様を確定させる」というのがあります。これはお客からの理不尽な要求を抑止する効果があります。もっとも「全ての追加要求を突っぱねる」というのは営業的に問題がありますし、私も「当初の約束でないタスク」をしたこともありますが、一定の線引きがないと収拾がつかなくなります。
仕事というのは契約なので「何を何処まで、幾らでどの期間で」というのを確定させるには工程もある程度は確定している必要があります。ウォーターフォール開発というのは、一般的なビジネス習慣と親和性が高いということになります。
一方でアジャイルという言葉には曖昧性が含まれています。つまり誰にとってアジャイルか?ということです。顧客企業にしてみれば「仕様変更がアジャイル」というかもしれませんが、上記の筆者の言いたいことは「アジャイルは完成保証を前提としない」というこのように読み取れます。こういう認識の違いは、ウォーターフォール以上に、後工程でほぼ確実に契約上の衝突として顕在化します。避けたいところです。アジャイルと言って何でもかんでも「不確定」としてはいけません。
『『アジャイル開発の失敗率は268%も高い』のコメント欄が面白かったので紹介するよ』という記事もあるので、基本的に開発プロセスについてはそもそも比較自体が怪しいということは知っておいた方がよいかと思う。
また、アジャイル開発外部委託モデル契約についてを引用しますと『アジャイル開発においては、開発過程において仕様変更を柔軟に受け入れる場合や、そもそも仕様が明確でない場合等がある。しかし、こうしたアジャイル開発の特徴に対するユーザ企業側の理解が十分でない場合には、期間内に成果物が完成しない等により、ユーザ企業とベンダー企業の間でトラブルとなるケースも発生するとの指摘がある。』とあります。
つまり、ウォーターフォールでもアジャイルでも、モノができなければ揉めます。逆説的になりますが、経験上、信頼されている開発者(会社)は顧客からアジャイル(準委任)を要望され、信頼されない開発者(会社)は顧客からウォーターフォール(請負)を強制される傾向があります。
つまりプロセスは技術的な選択というよりも、信頼関係の結果として決まる側面もあり、あまり声高にアジャイル(準委任)を叫ぶと逆効果ということもあります。
ウォーターフォール vs アジャイルと見てきましたが、『信頼されている開発者(会社)は顧客からアジャイル(準委任)を要望され』ということで、私もアジャイル的に開発を進めたことがあります。つまり顧客と長い付き合いになり、いい意味でなし崩し的になると、開発スタイルとして「プロトタイプ1」、「プロトタイプ2」・・・「完成!」、みたいなことがありました。これはいちいち顧客の要望を細かく聞かなくても、モノを見せながら適宜(アジャイル的に)直していけばいいやという感じで成立していたこともあります。
その他の印象に残るアジャイル的な開発プロジェクトになりますが(まぁ時効ということで告白しますと)、ある意味ぶっ飛んだプロジェクトで、ソフトウェアのリリースが直前になって差し止められるという究極のアジャイル、を経験しました。これは笑い話のようでいて、「価値判断が最後まで確定しない」という意味では、現実に最も忠実な開発プロセスだったのかもしれません。数か月の努力が無になったのですが、お金をもらった以上こちらとしても問題なく、上記の例外の1%ということで、私の経験上これ以上のアジャイルはないかと思います。
東京都、内製AIプラットフォーム「A1」本格運用開始 職員がノーコードで業務アプリ開発・共有
今に始まったわけではないが、IT系の新しい技術が出てくると、まるで冷やし中華のように「○○始めました」という記事が出てきます。もちろん当人たちは真剣(?)にやっているかと思いますが、ただ流行りを追っかけているだけとうことであれば資源(この場合税金)の無駄遣いになります。
ということで、いち東京都民として、税金の無駄遣いにならないか検証するために、覚書ということでメモします。一年後ぐらいに検証できればと思います。
AIによって、プログラマーが淘汰されようかという今になって「次世代のプログラミング言語とは何を言っているのか?」と返されそうですが、今とあるプロジェクトをやっておりまして(具体的なことは控えます)、AI時代に必要なプログラミング言語についてより意識するようになってきました。
今までのプログラミングとは「人間からコンピューターへの指示」ということでした。ではAI時代になると何が変わるのでしょうか。
現状、AIを使ったプログラミングは次のような形になります。
人間 → [自然言語(プロンプト)] → AI → [プログラム] → コンピュータ
これについてまず考えられるのは、次のような形です。
人間 → [次世代言語] → AI → [プログラム] → コンピュータ
つまり、人間とAIの間に共通言語を持てないか、という発想です。
さらにいうと、
人間 → [次世代言語] → AI → [次世代言語] → コンピュータ
ここまで踏み込めれば、AIが生成した内容も(原理的に)人間が確認可能になります。
つまり、問題が発生したときに「何が意図されていたのか」を追跡できるようになります。
ここで当然、次のような批判が出てきます。
人間 → [次世代言語] → AI
AI → [次世代言語] → コンピュータ
同じ言語を使うのであれば、AIは人間が入力した内容をそのまま返すだけではないか、というものです。
実際に、そういうことは起こり得るでしょう。
ポイントは、人間・AI・コンピュータの間で共通言語を持つこと自体にあります。
自然言語ではなく、このような言語を想定する理由は以下のとおりです。
一方で、従来のプログラミング言語との違いは、
にあると考えています。
このアイデアは一見すると突飛に見えるかもしれませんが、実は全く新しいものではありません。
第5世代コンピュータで目指されていた、論理型言語の思想に近いものです。
論理型言語の代表格であるPrologは、当時日本でも注目されました。
また、このブログでたびたび触れているADPも、Prologをベースとしています。
また、Grokに言わせるとLLMとPrologをつなぐアイデアは既に研究対象となっているようです。AIに聞けば多数出てくるようです。下記面白そうなもの2点をピックアップします。
・Arithmetic Reasoning with LLM: Prolog Generation & Execution
LLMが自然言語の算術問題からPrologの述語・ルールを生成し、Prologインタプリタで実行。CoT(Chain-of-Thought)より精度が大幅に向上した実験。
・LLM and Prolog: the logical alternative to chain-of-thought reasoning (Medium, 2025)
金融領域での実践例。LLMが自然言語からPrologルールを抽出し、シンボリック推論エンジンで処理。非常に読みやすい解説。
そりゃPrologを知っている人なら絶対に考えるよなという話ですね。
Prologのような言語は「宣言的」と呼ばれます。
つまり、
という考え方です。
現在のAIによるコーディングもこれに近く、人間が「何を作るのか」をプロンプトで与え、「どう作るか」はAIが担っています。
この役割分担を前提とすると、
「AIは入力をそのまま返すだけではないか」
という批判にも、ある程度対応できます。
もう少し踏み込んだイメージとしては、
という形です。
ここでいう「述語」は論理型言語の用語で、「関数」に近い概念です。
処理手順ではなく「満たすべき条件」を中心に表現することで、結果の妥当性を人間が確認しやすくなります。
とはいえ、このような構想は「言うは簡単で実現は難しい」ものです。第5世代コンピュータプロジェクト自体が頓挫した経緯もあり、AIを使えば当時の問題は解決できるのか?という問いは依然として残ります。
具体的には、
・人間に読みやすいと言ってもPrologはコンピュータよりの言語である。
・宣言的といっても、それだけですべてが上手くいくわけではない。Prolog自体が流行っていない。
・現実案としては、コメントがAIに対する補足(プロンプト)になるが、そうすると自然言語が残ることになる。
というジレンマがあります。特に「宣言的プログラミング」とは当時一瞬流行ったパラダイムになりますが、純粋さを追求すると却ってコードを分かりにくくする側面があります。またAIの出力は手続き的にもなりえます。このあたりの折り合いをどうつけるのかというのが課題かと思います。
このような「純粋な理論」と「現実の泥臭さ」の板挟みを解決するために、私は一つのアプローチをとっています。例えば、ADPは、Prologをベースにマルチパラダイムを追求しています。つまり純粋な宣言的なパラダイムを捨てて、手続き的にも書けるようにしています。このあたりの落としどころが現実的ではあるかと思います。
もっとも、私自身も30年ほど前にこうしたアイデアの断片を考えたことがあります。
さらにいうと、ADPの機能として次世代言語に必要な要件を備えることができれば、ADPそのものが次世代言語になり得るのではないか、とも思っています。
夢は広がりますが、まずは時間を見つけて少しずつ形にしていきたいところです。
■ The Structure of AI-Assisted Programming Today
Traditionally, programming languages have been a way for humans to instruct computers. So what changes in the AI era?
Today, AI-assisted programming typically looks like this:
Human → [Natural Language (Prompt)] → AI → [Program] → Computer
From here, one natural idea is:
Human → [Next-Generation Language] → AI → [Program] → Computer
In other words, can we introduce a shared language between humans and AI?
Taking this a step further:
Human → [Next-Generation Language] → AI → [Next-Generation Language] → Computer
If this were possible, then—even in principle—humans could verify what the AI produces.
When problems occur, we could trace and understand the original intent behind the system.
At this point, a natural criticism arises:
Human → [Next-Generation Language] → AI
AI → [Next-Generation Language] → Computer
If the same language is used on both sides, wouldn’t AI simply return what the human provided?
In fact, this can certainly happen.
The key point is the value of having a shared language across humans, AI, and computers.
Why not just use natural language?
A next-generation language would instead aim to:
And compared to traditional programming languages, the key difference would be:
This idea may sound radical, but it is not entirely new.
It is closely related to the concepts explored in logic programming languages during the Fifth Generation Computer era.
For example, Prolog—one of the most well-known logic programming languages—was once widely discussed in Japan.
The language I’ve mentioned occasionally in this blog, ADP, is also based on Prolog.
Languages like Prolog are often described as declarative.
That means:
Interestingly, modern AI-assisted coding follows a similar pattern:
humans specify what they want, and AI handles how to implement it.
If we properly recognize this division of roles, we can respond to the earlier criticism that “AI would just return the input as-is.”
A more concrete idea would be:
Here, a “predicate” is a concept from logic programming, somewhat similar to a function.
Instead of describing step-by-step procedures, we describe conditions to be satisfied.
This makes it easier for humans to verify whether the result is correct.
Of course, this kind of idea is much easier said than done.
The Fifth Generation Computer project itself failed, which raises the question:
Can AI solve the challenges that existed back then?
More concretely, several dilemmas remain:
This creates a fundamental tension.
Declarative programming was once a briefly popular paradigm, but pushing it too far can make systems impractical.
At the same time, AI-generated output can also be procedural.
How to balance these aspects remains an open challenge.
That said, I personally had fragments of this idea over 30 years ago.
And if the language I’m developing—ADP—can incorporate the necessary characteristics of such a next-generation language, it might itself become one.
It’s an ambitious thought, but for now, I’ll continue working on it little by little, whenever time allows.
昔話をするのは年寄りの悪いところと言われますが、一説によると「老けない」とも言われているらしい。というわけで前向きに昔話を。
ちょっと時間が空きましたが、長らく移行期間があったADSLが今年の1月31日に完全終了したとのことです。
ADSLと言えば、私は今から26年前に契約をしましたが、その前は28,800bpsのモデムを使用しており、それまではWEBページを見るにしても「画像を表示しない」というオプションをONしており、「何が表示されているかよくわからん」状態だったのですが、もっともWEBと言えば2chのような掲示板を文字で見ていました。
で、ADSLというのが出るらしいという話が出て、住んでいるところでサービス開始早々、電話で契約をしました。オペレーターの方が「ベストエフォートなんで・・・1.5Mbpsの速度は保証しません。」と言っていたのを思い出します。もっとも実測でほぼ1Mbps以上出ておりかなり快適になりました。まさにブロードバンドの幕開けを感じました。当然このころからIEの「画像を表示しない」オプションを外しました。
26年前(2000年)といえば、今は完全に忘れられた感のあるインパク(インターネット博覧会)も思い出されます。もっとも見に行きましたが何が何だか分からなかった記憶があります。
PCでいうと、IntelとAthlonがGHz競争を行っていました。WindowsXPが出る前で、 IEのバージョンは5とか5.5でした。Dual Pentium IIIのマシンにWindows 2000を入れて、K6-IIIのマシンにWindows MEを入れました。K6-IIIは前のメインマシンでこの年にDual PentiumIIIのマシンを組み立てました。マザーボードが840のものでE-ATXだったのでフルタワーのケースを担いで帰ったのが懐かしいです。当時はパソコンと言えばネットをやるというよりプログラミングが主で、K6-IIIやPentium IIIのマシンでTSPSolverのアルゴリズムの改善に取り組んでいたのを思い出しました。当時、K6-IIIとPentium IIIはクロックは違うものの、同一クロックならほぼ同じ性能で、TSPSolverの実行速度もクロックに比例していました。
各PCは、TCP/IPではなく、NetBEUIでつないでいたのを思い出します。ADSLの最初期はPCにADSLモデムを直結していました。さすがに「大丈夫か?」ということで、セキュリティを考えてこのような構成にした記憶があります。Windowsのファイル共有をインターネット側に出さない措置になります。もっとも当時はウイルスもあるにはありましたが、今から思えば牧歌的ではありました。
その後、引っ越し時に8Mbpsのものに契約変更し、下記のブロードバンドルータ付きのモデムを購入し使っていました。2005年頃ですが、8Mbpsといっても実測で2,3Mbpsだったのを記憶しています。Wi-Fiも設置していましたが、SSIDをみると家だけだったのを思い出します。
その後、2008年に、キャンペーンをやっておったので光回線に変更しました。ので私のADSL歴は8年で幕を下ろしました。またこのADSLモデムも3年程しか使っていませんでした。
光の方は2012年に一度200Mbpsに変えてそのまま使っていたのですが、昨年(2025年)に1Gbpsに変更しました。もっとも体感ではスピードは変わりません。実測では200Mbpsの時代はほぼ200Mbpsの上限が出ており、1Gbpsに変更後は400Mbps程度です。
これは、ご近所さんが光を契約して使うようになったのでそことの共有とのことで、もちろんですが、Wi-FiのSSIDも今では自分のものを見つけるのにも一苦労です。
とまぁ、ADSLを使わなくなって18年になるのですが、それでもいつか使うかもと思ってモデムの方は予備機と合わせて2台残しておりました。ADSLサービスが終了するというニュースを聞いてオークションに出していましたが、大量に出品されており、売り時を逃してしまいました。
ADSLの普及に合わせてサーバーの運用を開始し、Windowsは怖いからLinuxでメールサーバー、WEBサーバーを公開したり、そのノリで本を出したりと、当時を思い出すとなつかしい思いがします。今なら当たり前のように電車でネットをしていますが、当時は何も無かったところからインターネットが出現し様々な進化をリアルタイムで体感できたことはそれはそれで幸せかもしれません。
ありがとうADSL!

