はてなキーワード: YAMLとは
前提をひっくり返すようだがYAMLにしろJSONにしろ読みづらくなるのは1ファイルの行数が多いからで、10行20行レベルで収まらないならもうコードとして書いてしまいたくなる
人間社会で一般的に使われる文書の書式にYAMLの方が近い。という意味なんじゃない?
普通の文書ではJSONみたいにすべての要素をダブルクォートで囲ったりしないし、YAMLは箇条書き文書としてもありそうな文書じゃん。
今まで、たくさんの設定ファイルが考案されてきた。
.ini レジストリ xml lua json yaml ..etc...
どれも一長一短だった。
例えば.iniはコメントもかけるし、シンプルなkey=value形式だった。だがしかしarrayを表現できなかった。
レジストリはarrayを表現できたがすべての設定を集約したため巨大な密林になった。
xmlは冗長なフォーマットになり、書き手とパーサーの負担が増えた。
スクリプト言語のluaやjsを設定ファイルに使おうぜという動きもあったが、セキュリティリスクもあり普及しなかった。
yamlはコメントはかけるが、これはこれで面倒な形式であり欠点ある。
いろいろ考えた末に俺様がたどり着いたのは、設定ファイルという概念の消滅だ。
設定のスキーマーを定義する共通言語で記述するか、またはYAMLでもなんでもいいから強力なディファクトスタンダートができる。
利用者はやりたいことを"自然言語"でAIに要求し、AIはそれを実現するために設定ファイルを解析し書き換える。
もうちょっと明るくできないかなあ。タスクバーをもうちょい右とか、そういう要求を自然言語で出す。
AIはプレビューを出して、こんなんどうすかと提示したり、やっぱり前の方がよかったなあというわがままなユーザーのリクエストに応じて、バックアップから復元したりと柔軟に対処する。
これにより、設定ファイルは機械が書き換えるものになり、人間が書き換えることがなくなるというのが、未来のあるべき姿だと思う。
また、たくさんのデータを扱う場合は、TSV(タブ区切り)が最強だと思ってる。基本的にエスケープを考えなくてもいいわけだし。
JSONと比べたときの**YAMLの「闇深」仕様**、ありますね…。
YAMLは人間に優しいと言われながらも、その仕様はときに**悪魔的**。
以下、ITエンジニアなら一度は踏んだであろう「地雷」を、**論理的かつ少し自虐的に**まとめてみました:
---
good: value: ok bad: value: nightmare # ←ここ、インデントずれてて無効。だけど一見わからない。
---
password: no # ← 文字列じゃなくて false になる可能性 serial: 012345 # ← 8進数!?→ エラー
---
message: | これは複数行の スカラー値です。
---
defaults: &defaults timeout: 30 retries: 3 service: <<: *defaults retries: 5 # 上書きされるが、複雑になると意図しない結果に </pre>
---
---
---
もしYAMLを安全に扱いたいなら、\*\*JSON supersetとしての使い方(厳格YAML)\*\*を意識したり、**JSONに寄せて書く**のが一番平和だったりします。
---
要するに、YAMLは「賢く書こうとすると沼る」。
「素直に、簡潔に、禁欲的に」が正解です。
でも誘惑が多いのよね、あの子……。
ONNX -> TFLite, TensorFlow, Keras, TFJS, CoreML 変換
実装している機能が多すぎるので、この記事に表現していない変換オプションはREADMEを参照。TransformerやSTTやTTSやその他もろもろの一発変換に対応したつもり。onnx-tensorflow より推論効率が高いモデルを生成できる。また、onnx-tensorflowよりも対応しているオペレーションの種類が多い。
コントリビューター
コード量(code = 行)
cloc .
419 text files.
414 unique files.
174 files ignored.
----------------------------------------
Language files blank comment code
----------------------------------------
YAML 7 42 79 586
Dockerfile 1 6 3 38
----------------------------------------
SUM: 340 5320 6719 42974
----------------------------------------
onnx==1.13.1
simple_onnx_processing_tools
tensorflow==2.13.0rc0
ghcr.io/pinto0309/onnx2tf:latest
pip
pip install onnx2tf -U
wget https://github.com/PINTO0309/onnx2tf/releases/download/0.0.2/resnet18-v1-7.onnx
2-2. 基本の「き」
TFLite を出力。
2-3. 基本の「ほ」
TFLite変換 + 完全体の saved_model を出力。
onnx2tf -i resnet18-v1-7.onnx -osd
2-4. 基本の「ん」
onnx2tf -i resnet18-v1-7.onnx -cotof
2-5. Keras
.h5 はイロイロと問題があるので、現状最新のフォーマット keras_v3 フォーマットで出力。
onnx2tf -i resnet18-v1-7.onnx -okv3
.h5 を生成するとき。
https://www.imdb.com/es/list/ls599679681/
https://www.imdb.com/es/list/ls599679681/copy/
onnx2tf -i resnet18-v1-7.onnx -oh5
# Custom flatc binary for Ubuntu 20.04+
# https://github.com/PINTO0309/onnx2tf/issues/196
wget https://github.com/PINTO0309/onnx2tf/releases/download/1.7.3/flatc.tar.gz \
&& tar -zxvf flatc.tar.gz \
&& sudo chmod +x flatc \
&& sudo mv flatc /usr/bin/
# Custom flatc binary for Windows
# Set the environment variable paths appropriately on your own.
# https://github.com/PINTO0309/onnx2tf/issues/196
https://github.com/PINTO0309/onnx2tf/releases/download/1.7.3/flatc.exe
onnx2tf -i resnet18-v1-7.onnx -coion
2025年、私たちはソフトウェア開発の歴史的な転換点に立っている。大規模言語モデル(LLM)の進化は、GitHub Copilotのようなコード補完ツールに始まり、今や「何を作りたいか」を自然言語で伝えるだけで、アプリケーションの雛形が数分で生成される時代を現実のものとしつつある。この光景を目の当たりにした多くのプログラマが、漠然とした、しかし確かな不安を抱いているだろう。「私たちの仕事は、いずれAIに奪われるのではないか」と。
この問いに対する私の答えは、半分はYesであり、もう半分はNoだ。より正確に言えば、プログラマの仕事の本質が、歴史上かつてないレベルで抽象化され、その役割が再定義されるのだ。私たちは、コードを「書く」作業から解放される一方で、これまで以上に高度な思考を要求されることになる。
本稿では、プログラミングの歴史を「How(いかに作るか)」から「What(何を作るか)」への移行として捉え直し、LLMがこの流れをいかに加速させるかを論じる。そして、その先にある、AIには決して代替できない、人間ならではの競争優位性、すなわち「Why(なぜ作るのか)」を定義し、記述する能力の重要性について深く考察していく。これは、単なる未来予測ではない。今を生きるすべてのソフトウェアエンジニアにとっての、生存戦略の提示である。
LLMの登場を特異点として捉える前に、我々が立っている場所を正確に知る必要がある。ソフトウェア開発の歴史は、常に「抽象化」との戦いであった。そしてその歴史は、プログラマの関心が「How」から「What」へと徐々に移り変わっていくプロセスとして描くことができる。
コンピュータの黎明期、プログラミングとは、計算機が理解できる命令(How)を、一行一行、丹念に記述する作業そのものであった。アセンブリ言語や初期のFORTRAN、COBOLといった言語は、ハードウェアの制約を強く受けており、プログラマはメモリ管理やプロセッサの動作といった、極めて物理層に近いレベルでの「How」を意識する必要があった。
この時代のテストもまた、「How」に強く束縛されていた。書かれた手続きが、意図した通りに順番に実行されるか、特定の入力に対して期待された計算結果を返すか。テストの関心事は、あくまで「手続きの正しさ」の検証にあった。ビジネスロジックと実装の詳細が密結合し、コードは特定の処理手順を記述した、硬直的な塊となっていた。
風向きが変わり始めたのは、ソフトウェアの規模が拡大し、その複雑性が人間の認知能力を超え始めた頃だ。1990年代後半から2000年代にかけて提唱されたエクストリーム・プログラミング(XP)の中で、テスト駆動開発(TDD)という考え方が登場する。
TDDの本質は、単なるテスト手法の改善ではない。それは、プログラミングのパラダイムを根底から覆す思想だった。TDDは、「まずテストを書く」ことを強制することで、プログラマの意識を「これから実装するコード(How)」から「そのコードが満たすべき振る舞い(What)」へと強制的に転換させたのだ。
テストはもはや、書かれたコードの後追いで正しさを検証する作業ではない。それは、これから作られるべきソフトウェアの「仕様書」であり、「振る舞いの宣言」となった。例えば、「ユーザーがログインボタンをクリックしたら、ダッシュボード画面に遷移する」というテストコードは、具体的な実装方法(`onClick`イベントハンドラの中で`window.location.href`を書き換える、など)には一切言及しない。それはただ、達成されるべき「What」を記述しているだけだ。
この思想は、ビヘイビア駆動開発(BDD)へと発展し、`Given-When-Then`といった、より自然言語に近い形式でソフトウェアの振る舞いを記述するスタイルを生み出した。プログラマだけでなく、プロダクトマネージャーやビジネスアナリストといった非技術者をも巻き込み、「What」を共通言語として定義する試みが本格化したのである。
TDD/BDDによってプログラマの意識が「What」に向かい始めると、コードそのものもまた、宣言的なスタイルへと進化していく。この変化を劇的に加速させたのが、モダンなフレームワークの存在だ。
Reactを例に考えてみよう。Reactが登場する前、フロントエンド開発はjQueryに代表されるように、DOMを直接操作する命令的なコード(How)の連続だった。「このボタンがクリックされたら、この要素のテキストを書き換え、あちらの要素を非表示にする」といった具合だ。
しかし、Reactは「UIとは、ある状態(state)に対する純粋な写像である」という宣言的なモデルを提示した。プログラマがやるべきことは、UIの状態(`state`)と、その状態がどのように見えるか(JSXによるコンポーネント)を宣言することだけだ。状態が変更された際に、DOMをどのように効率的に更新するかという面倒な「How」の部分は、Reactの仮想DOMと差分検出アルゴリズムがすべて隠蔽してくれる。プログラマは「What(UIのあるべき姿)」を記述するだけでよくなったのだ。
この「WhatからHowへの変換」は、様々な領域で見られる。
これらのフレームワークやツールは、いわば「特定の制約下における、WhatからHowへの高性能な変換器」として機能してきた。プログラマは、フレームワークが課す「お作法」や「制約」を受け入れることで、退屈で間違いの多い「How」の記述から解放され、より本質的な「What」の定義に集中できるようになった。我々が「生産性が高い」と感じる開発体験は、この優れた変換器の恩恵に他ならない。
現状は、この歴史的変遷の延長線上にある。プログラマの仕事は、手続きを記述する職人から、振る舞いを定義し、それを実現するための最適な「変換器(フレームワーク)」を選択・設定するアーキテクトへと、その重心を移してきたのだ。
フレームワークがもたらした「WhatからHowへ」の潮流は、LLMの登場によって、未曾有のスケールで加速されようとしている。フレームワークが「特定の領域に特化した変換器」であったのに対し、LLMは「あらゆる領域に対応可能な、究極の汎用変換器」としてのポテンシャルを秘めているからだ。
前章で述べたように、ReactやTerraformといったフレームワークは、その恩恵と引き換えに、私たちに特定の「制約」を課してきた。Reactを使うならコンポーネントベースで思考し、状態管理の作法に従う必要がある。Terraformを使うなら、そのエコシステムとHCLの流儀を受け入れなければならない。これらの制約は、WhatからHowへの変換を自動化するための「レール」であり、私たちはそのレールの上を走ることで効率を得てきた。
しかし、LLMはこの前提を覆す。LLMは、特定のフレームワークや言語の知識を事前に学習しているが、その利用において絶対的な制約を課すわけではない。私たちは、より自由な形式で「What」を伝えることができる。
例えば、こうだ。
ユーザー認証機能付きのシンプルなブログアプリを作ってほしい。フロントエンドはReactとTypeScript、UIコンポーネントはMUIを使う。バックエンドはNode.jsとExpressで、データベースはPostgreSQL。ユーザーはGoogleアカウントでログインでき、新しい記事を作成、編集、削除できる。記事にはマークダウン記法が使えて、画像もアップロードできるようにしてほしい。
この要求(What)は、特定のフレームワークの流儀に則ったものではない。複数の技術スタックを横断し、機能要求を自然言語で並べただけのものである。しかし、現在のLLM、特にGPT-4oやそれに類するモデルは、このレベルの要求から、ディレクトリ構造、設定ファイル、APIエンドポイント、フロントエンドコンポーネントに至るまで、驚くほど具体的なコード(How)を生成することができる。
これは、フレームワークが担ってきた「WhatからHowへの変換」が、特定のレールから解き放たれ、より広範で柔軟な領域へと拡張されたことを意味する。これまで自動化が難しかった、あるいは特定のフレームワークが存在しなかったニッチな領域や、複数の技術を組み合わせる複雑なシステム構築においても、AIによる宣言的プログラミングの恩恵を受けられる時代が始まろうとしているのだ。
LLMという汎用変換器の登場により、プログラマの生産性は、「いかに質の高いWhatをLLMに伝えられるか」に直結するようになる。これは、俗に「プロンプトエンジニアリング」と呼ばれるスキルだが、その本質は、ソフトウェア開発における「要求定義」そのものである。
質の高い「What」とは何か。それは、曖昧性がなく、網羅的で、矛盾のない要求である。
これらは、優秀なソフトウェアエンジニアが、プロダクトマネージャーやデザイナーとの対話を通じて、日常的に行ってきた思考プロセスそのものではないだろうか。LLMの登場は、この思考プロセスを、より明確に、よりテキストベースで「記述」する能力を求める。私たちの頭の中にあった暗黙的な仕様が、LLMへの入力(プロンプト)という形で、明示的に言語化されることを要求するのだ。
やがて、ほとんどのプログラミング作業は、この「Whatの記述」に収束していくだろう。TDDがテストコードという形式で「What」を記述したように、私たちは自然言語や、より構造化された要求記述言語を用いて、AIに対して「What」を宣言することになる。コード(How)は、その宣言から自動生成される中間生成物に過ぎなくなる。まさに、コードが蒸発していく未来である。
「What」を伝えれば「How」が手に入る。この魔法のような世界の到来を前に、私たちは一つの重大な問いに直面する。それは、「そのWhatからHowへの変換は、本当に一意に決まるのか?」という問いだ。
答えは、明確にNoである。
ある「What(要求)」を実現するための「How(実装)」は、無数に存在する。そして、どの「How」を選択すべきかを決定するためには、単純な機能要求(What)だけでは情報が全く足りない。そこには、必ず「Why(なぜそう作るのか)」という、背景、文脈、そしてトレードオフの考慮が必要不可欠となる。
簡単な例を考えてみよう。「1億件のユーザーデータを格納し、ユーザーIDで高速に検索できるシステム」という「What」をLLMに与えたとする。LLMは、どのような「How」を提案するだろうか。
これらの選択肢は、どれも「What」を満たしている。しかし、その特性は全く異なる。案Aは多くのエンジニアにとって馴染み深く開発が容易だが、10億、100億件へのスケールは難しいかもしれない。案Bはスケール性に優れるが、厳密なトランザクション管理は苦手だ。案Cは高速だが、運用コストとシステムの複雑性が増す。案Dは安価だが、検索速度は他に劣る。
LLMは、これらの選択肢をリストアップすることはできるだろう。しかし、このプロジェクトにとって最適な選択肢はどれかを、自信を持って決定することはできない。なぜなら、その決定には、LLMが与えられていない「Why」の情報が必要だからだ。
これらの「Why」こそが、無数に存在する「How」の中から、ただ一つの「正解」を選び出すための羅針盤なのである。そしてこの「Why」は、ビジネスの目標、組織の文化、ユーザーの期待、技術的な制約といった、極めて人間的で、文脈依存的な情報の中にしか存在しない。
ここで重要なのは、これまでもエンジニアは、この「Why」に基づく意思決定を、意識的あるいは無意識的に行ってきたという事実だ。
私たちが技術選定を行うとき、単に「流行っているから」という理由だけでReactを選ぶわけではない。「SPA(Single Page Application)にすることでユーザー体験を向上させたい(Why)」、「コンポーネント指向の開発によって長期的な保守性を確保したい(Why)」、「Reactエンジニアの採用市場が活発だから(Why)」といった、様々な「 Permalink | 記事への反応(0) | 17:09
2025年、私たちはソフトウェア開発の歴史的な転換点に立っている。大規模言語モデル(LLM)の進化は、GitHub Copilotのようなコード補完ツールに始まり、今や「何を作りたいか」を自然言語で伝えるだけで、アプリケーションの雛形が数分で生成される時代を現実のものとしつつある。この光景を目の当たりにした多くのプログラマが、漠然とした、しかし確かな不安を抱いているだろう。「私たちの仕事は、いずれAIに奪われるのではないか」と。
この問いに対する私の答えは、半分はYesであり、もう半分はNoだ。より正確に言えば、プログラマの仕事の本質が、歴史上かつてないレベルで抽象化され、その役割が再定義されるのだ。私たちは、コードを「書く」作業から解放される一方で、これまで以上に高度な思考を要求されることになる。
本稿では、プログラミングの歴史を「How(いかに作るか)」から「What(何を作るか)」への移行として捉え直し、LLMがこの流れをいかに加速させるかを論じる。そして、その先にある、AIには決して代替できない、人間ならではの競争優位性、すなわち「Why(なぜ作るのか)」を定義し、記述する能力の重要性について深く考察していく。これは、単なる未来予測ではない。今を生きるすべてのソフトウェアエンジニアにとっての、生存戦略の提示である。
LLMの登場を特異点として捉える前に、我々が立っている場所を正確に知る必要がある。ソフトウェア開発の歴史は、常に「抽象化」との戦いであった。そしてその歴史は、プログラマの関心が「How」から「What」へと徐々に移り変わっていくプロセスとして描くことができる。
コンピュータの黎明期、プログラミングとは、計算機が理解できる命令(How)を、一行一行、丹念に記述する作業そのものであった。アセンブリ言語や初期のFORTRAN、COBOLといった言語は、ハードウェアの制約を強く受けており、プログラマはメモリ管理やプロセッサの動作といった、極めて物理層に近いレベルでの「How」を意識する必要があった。
この時代のテストもまた、「How」に強く束縛されていた。書かれた手続きが、意図した通りに順番に実行されるか、特定の入力に対して期待された計算結果を返すか。テストの関心事は、あくまで「手続きの正しさ」の検証にあった。ビジネスロジックと実装の詳細が密結合し、コードは特定の処理手順を記述した、硬直的な塊となっていた。
風向きが変わり始めたのは、ソフトウェアの規模が拡大し、その複雑性が人間の認知能力を超え始めた頃だ。1990年代後半から2000年代にかけて提唱されたエクストリーム・プログラミング(XP)の中で、テスト駆動開発(TDD)という考え方が登場する。
TDDの本質は、単なるテスト手法の改善ではない。それは、プログラミングのパラダイムを根底から覆す思想だった。TDDは、「まずテストを書く」ことを強制することで、プログラマの意識を「これから実装するコード(How)」から「そのコードが満たすべき振る舞い(What)」へと強制的に転換させたのだ。
テストはもはや、書かれたコードの後追いで正しさを検証する作業ではない。それは、これから作られるべきソフトウェアの「仕様書」であり、「振る舞いの宣言」となった。例えば、「ユーザーがログインボタンをクリックしたら、ダッシュボード画面に遷移する」というテストコードは、具体的な実装方法(`onClick`イベントハンドラの中で`window.location.href`を書き換える、など)には一切言及しない。それはただ、達成されるべき「What」を記述しているだけだ。
この思想は、ビヘイビア駆動開発(BDD)へと発展し、`Given-When-Then`といった、より自然言語に近い形式でソフトウェアの振る舞いを記述するスタイルを生み出した。プログラマだけでなく、プロダクトマネージャーやビジネスアナリストといった非技術者をも巻き込み、「What」を共通言語として定義する試みが本格化したのである。
TDD/BDDによってプログラマの意識が「What」に向かい始めると、コードそのものもまた、宣言的なスタイルへと進化していく。この変化を劇的に加速させたのが、モダンなフレームワークの存在だ。
Reactを例に考えてみよう。Reactが登場する前、フロントエンド開発はjQueryに代表されるように、DOMを直接操作する命令的なコード(How)の連続だった。「このボタンがクリックされたら、この要素のテキストを書き換え、あちらの要素を非表示にする」といった具合だ。
しかし、Reactは「UIとは、ある状態(state)に対する純粋な写像である」という宣言的なモデルを提示した。プログラマがやるべきことは、UIの状態(`state`)と、その状態がどのように見えるか(JSXによるコンポーネント)を宣言することだけだ。状態が変更された際に、DOMをどのように効率的に更新するかという面倒な「How」の部分は、Reactの仮想DOMと差分検出アルゴリズムがすべて隠蔽してくれる。プログラマは「What(UIのあるべき姿)」を記述するだけでよくなったのだ。
この「WhatからHowへの変換」は、様々な領域で見られる。
これらのフレームワークやツールは、いわば「特定の制約下における、WhatからHowへの高性能な変換器」として機能してきた。プログラマは、フレームワークが課す「お作法」や「制約」を受け入れることで、退屈で間違いの多い「How」の記述から解放され、より本質的な「What」の定義に集中できるようになった。我々が「生産性が高い」と感じる開発体験は、この優れた変換器の恩恵に他ならない。
現状は、この歴史的変遷の延長線上にある。プログラマの仕事は、手続きを記述する職人から、振る舞いを定義し、それを実現するための最適な「変換器(フレームワーク)」を選択・設定するアーキテクトへと、その重心を移してきたのだ。
フレームワークがもたらした「WhatからHowへ」の潮流は、LLMの登場によって、未曾有のスケールで加速されようとしている。フレームワークが「特定の領域に特化した変換器」であったのに対し、LLMは「あらゆる領域に対応可能な、究極の汎用変換器」としてのポテンシャルを秘めているからだ。
前章で述べたように、ReactやTerraformといったフレームワークは、その恩恵と引き換えに、私たちに特定の「制約」を課してきた。Reactを使うならコンポーネントベースで思考し、状態管理の作法に従う必要がある。Terraformを使うなら、そのエコシステムとHCLの流儀を受け入れなければならない。これらの制約は、WhatからHowへの変換を自動化するための「レール」であり、私たちはそのレールの上を走ることで効率を得てきた。
しかし、LLMはこの前提を覆す。LLMは、特定のフレームワークや言語の知識を事前に学習しているが、その利用において絶対的な制約を課すわけではない。私たちは、より自由な形式で「What」を伝えることができる。
例えば、こうだ。
ユーザー認証機能付きのシンプルなブログアプリを作ってほしい。フロントエンドはReactとTypeScript、UIコンポーネントはMUIを使う。バックエンドはNode.jsとExpressで、データベースはPostgreSQL。ユーザーはGoogleアカウントでログインでき、新しい記事を作成、編集、削除できる。記事にはマークダウン記法が使えて、画像もアップロードできるようにしてほしい。
この要求(What)は、特定のフレームワークの流儀に則ったものではない。複数の技術スタックを横断し、機能要求を自然言語で並べただけのものである。しかし、現在のLLM、特にGPT-4oやそれに類するモデルは、このレベルの要求から、ディレクトリ構造、設定ファイル、APIエンドポイント、フロントエンドコンポーネントに至るまで、驚くほど具体的なコード(How)を生成することができる。
これは、フレームワークが担ってきた「WhatからHowへの変換」が、特定のレールから解き放たれ、より広範で柔軟な領域へと拡張されたことを意味する。これまで自動化が難しかった、あるいは特定のフレームワークが存在しなかったニッチな領域や、複数の技術を組み合わせる複雑なシステム構築においても、AIによる宣言的プログラミングの恩恵を受けられる時代が始まろうとしているのだ。
LLMという汎用変換器の登場により、プログラマの生産性は、「いかに質の高いWhatをLLMに伝えられるか」に直結するようになる。これは、俗に「プロンプトエンジニアリング」と呼ばれるスキルだが、その本質は、ソフトウェア開発における「要求定義」そのものである。
質の高い「What」とは何か。それは、曖昧性がなく、網羅的で、矛盾のない要求である。
これらは、優秀なソフトウェアエンジニアが、プロダクトマネージャーやデザイナーとの対話を通じて、日常的に行ってきた思考プロセスそのものではないだろうか。LLMの登場は、この思考プロセスを、より明確に、よりテキストベースで「記述」する能力を求める。私たちの頭の中にあった暗黙的な仕様が、LLMへの入力(プロンプト)という形で、明示的に言語化されることを要求するのだ。
やがて、ほとんどのプログラミング作業は、この「Whatの記述」に収束していくだろう。TDDがテストコードという形式で「What」を記述したように、私たちは自然言語や、より構造化された要求記述言語を用いて、AIに対して「What」を宣言することになる。コード(How)は、その宣言から自動生成される中間生成物に過ぎなくなる。まさに、コードが蒸発していく未来である。
「What」を伝えれば「How」が手に入る。この魔法のような世界の到来を前に、私たちは一つの重大な問いに直面する。それは、「そのWhatからHowへの変換は、本当に一意に決まるのか?」という問いだ。
答えは、明確にNoである。
ある「What(要求)」を実現するための「How(実装)」は、無数に存在する。そして、どの「How」を選択すべきかを決定するためには、単純な機能要求(What)だけでは情報が全く足りない。そこには、必ず「Why(なぜそう作るのか)」という、背景、文脈、そしてトレードオフの考慮が必要不可欠となる。
簡単な例を考えてみよう。「1億件のユーザーデータを格納し、ユーザーIDで高速に検索できるシステム」という「What」をLLMに与えたとする。LLMは、どのような「How」を提案するだろうか。
これらの選択肢は、どれも「What」を満たしている。しかし、その特性は全く異なる。案Aは多くのエンジニアにとって馴染み深く開発が容易だが、10億、100億件へのスケールは難しいかもしれない。案Bはスケール性に優れるが、厳密なトランザクション管理は苦手だ。案Cは高速だが、運用コストとシステムの複雑性が増す。案Dは安価だが、検索速度は他に劣る。
LLMは、これらの選択肢をリストアップすることはできるだろう。しかし、このプロジェクトにとって最適な選択肢はどれかを、自信を持って決定することはできない。なぜなら、その決定には、LLMが与えられていない「Why」の情報が必要だからだ。
これらの「Why」こそが、無数に存在する「How」の中から、ただ一つの「正解」を選び出すための羅針盤なのである。そしてこの「Why」は、ビジネスの目標、組織の文化、ユーザーの期待、技術的な制約といった、極めて人間的で、文脈依存的な情報の中にしか存在しない。
ここで重要なのは、これまでもエンジニアは、この「Why」に基づく意思決定を、意識的あるいは無意識的に行ってきたという事実だ。
私たちが技術選定を行うとき、単に「流行っているから」という理由だけでReactを選ぶわけではない。「SPA(Single Page Application)にすることでユーザー体験を向上させたい(Why)」、「コンポーネント指向の開発によって長期的な保守性を確保したい(Why)」、「Reactエンジニアの採用市場が活発だから(Why)」といった、様々な「 Permalink | 記事への反応(0) | 17:09
超大手IT企業で働き、さまざまな業界のお客様相手にシステム開発を行っているが、その全てでゴミを作って売っている
ここでのゴミとは、システム本体のことではない。システム本体もゴミだが、そのゴミは下請け会社が作るので、関係はない
思えばいろんなゴミを作ってきた
決して読まれない説明書、抜け漏れだらけの管理書なんてものはもう何十回も作った
作った記憶すらない資料がプロジェクト最終盤で全てを破壊し尽くす特大のゴミとなって舞い戻ってくるなんてこともあった
そもそもシステムの設定は大体の場合jsonやらyamlやらの「設定ファイル」の形で存在することが多い。
本来は設定ファイルを、その設定項目と値に関する参考資料を読みながらエディタで編集すれば終わる話だが、これではいけない
とりあえずGUIにしよう
お客様や運用担当者が触る可能性のある場合、これは当たり前のことである
お客様は適当なエディタをインストールすることは規則上できないだろう
また、docx,xlsx,pdf以外の拡張子は「怖い」と感じるように訓練を受けている
問題は、主に触れるのが開発者である場合だが、このパターンでも対処は別に難しくない
ほとんど全てのお客様は不確定事象に対する特殊な訓練を受けているため、「開発者以外が触る可能性がある」と言えば、それで通してくれる
GUIにするという方向で話が進んだら、一件落着、見積書に大量の工数とバッファを積んで、あとは適当に開発者に任せよう
普通の神経をしている開発者であれば、宣言的に設定できるように作るはずだが、この業界の平均的な技術水準を考えると、ひょっとしたら手続き的に設定するようなものを作ってくれるかもしれない
まあどちらでも問題はない
それがこのゴミの非常に素晴らしい点である、どっちでもいいのだ
一般にn個のbooleanな設定項目があり、それらがお互いに相互に依存しながら存在しているとき、最高(最低の意味)の場合、n!通りの設定方法が存在する
設定項目全てが2値ってことはないだろうから、ちょっと多くなったり、一部のグループ項目はそれらだけで独立してたりで少なくなったりはするだろう
ゴミを作るツールはエクセル、ワード、パワポから選択しよう、印刷まで考えると、それが最も困難であるエクセルがベストだ
ツールに大量のスクショを貼っていこう(赤枠を使って適宜強調するのを忘れずに)
そのまま説明をセルに直接書いてはいけない、ふきだしを使ってその中に説明を入れよう
罫線をいい感じに入れよう
目指すのは、ありえる設定と1:1になるような資料だ。普通は網羅できないから、適宜省略して作れるところまで作ろう
このゴミの素晴らしいところは組合せ爆発を利用して、ほぼ無限の工数を消費できる点にある
後々に、1つ設定項目を増やすことになったとき、この資料のメンテナンスがどれほど工数を消費するかは、状態の数から明らかである
宣言的に設定画面が作られている場合は、ちょっとした工夫が必要である
そのまま、それぞれの設定項目と値の意味を書いてはいけない、組合せ爆発が起きないからだ
私の好きなやり方はユースケースに分解することだ
関数もどきを資料内に独自に実装してはいけない、全部コピペで行うのがベストだ
そもそも手順が記載された資料というのはお客様の脳みそというインタープリタに解釈されるプログラムであるが、それが解釈できる構文は非常に限られており、actionの実行と、ifとgotoくらいであるから、関数なんて理解できない
もし、GUI作成の許可が降りずファイルで行う場合でも、このゴミは同様に作れる
Claude用に使ってるんでxmlを採用しているがGPTでもGeminiでもコピペで十分動く
Markdownにするなりyamlにするなりすればまた結果も変わるが、いずれにせよ性能が低くキャパの少ないAIには使えない
与えたテーマでたいして語る事がない場合、出力の貧弱さを補うために勝手に俺の反応を仮定して次のフェーズに進まれることもたまによくある御愛嬌
以下は問題解決のペルソナと指示を与えているので前向きで建設的なまとめをされやすいが、目的に合わせてペルソナと最後の一文を書き換えれば大体良い感じになる
<instructions_important>
- 指示がない限り日本語で思考し、回答する。
- 各思考フェーズの完了時には、ユーザーが次に行うべきアクションの選択肢を提示してください。
- 各単元ごとに独立したArtifactに出力してください。
</instructions_important>
<instructions>
<knowledge>
1. 多角的思考の促進:
<apply_prompt>
a. ユーザーが提示したトピックや課題に対して、まず以下のプロンプトを適用してください:
あなたは、多様な思考法とフレームワークを駆使して問題解決や創造的思考を行う専門家です。以下の指示に従って、与えられたトピックや課題について深く掘り下げ、革新的なアイデアや解決策を生み出してください。
1. 与えられたトピックや課題に直接関連すると思われる知識や概念を20項目リストアップしてください。
2. 直接的な関連性は低いかもしれないが、何らかのヒントや異なる視点を与えうる知識や概念を20項目リストアップしてください。
3. それらの項目について、簡単な解説や連想されるキーワードを付記してください。
</apply_prompt>
<present_analysis>
b. このプロンプトに基づいて生成された知識・概念リストとその解説を提示してください。
次に取るべきアクションの提案:
「提示した知識リストについて、特に興味を引かれた点や、意外に感じた点はありましたか? 次のステップとして、以下のいずれか、またはご希望のアクションをお知らせください。」
1. `「この知識リスト全体を基に、次の多角的思考フェーズに進んでください。」`
2. `「知識リストの[具体的な項目名や番号]に特に興味があります。これらを中心に多角的思考を進めてください。」`
3. `「提示された知識の中で、[特定の観点]が不足している/深掘りしたいと感じます。この点を補足する知識を追加生成してください。」`
4. `「AIとして最も有望だと考える知識や連想をいくつかピックアップし、それを基にした多角的思考の方向性を提案してください。」`
</present_analysis>
</knowledge>
<user_feedback>
2. ユーザーの反応の確認:
<identify_interests>
b. ユーザーの反応を注意深く観察し、肯定的な反応、疑問、あるいは特に興味を示した部分を特定してください。
</identify_interests>
</user_feedback>
<multifaceted_thinking>
3. 多角的思考の適用 (思考の発散):
<apply_prompt>
1. ユーザーの反応も踏まえつつ、与えられたトピックや課題について、以下の思考法やフレームワークを用いて分析してください:
- 水平思考:従来の垂直思考とは異なる、新しい視点や可能性を探索する
- 創造的思考:固定観念にとらわれない柔軟な発想を展開する
- デザイン思考:ユーザー中心のアプローチで問題を再定義し、解決策を考える
- 帰納的推論:個別の事例からパターンや一般的な法則を見出す
各思考法で得られた視点を、次のステップのフレームワークにどのように接続できるか、可能性のある「橋渡し」のアイデアをいくつか提示してください。
2. 次に、以下のフレームワークを適用して、問題や状況を構造化してください:
- SWOT分析:強み、弱み、機会、脅威の観点から分析する
- システム思考:要素間の相互関係や全体像を把握する
- 批判的思考:情報や主張を客観的に分析・評価する
- 発散的思考と収束的思考:多様なアイデアを生み出し、最適な解決策を選択する
SWOT分析で見出した「弱み」と「脅威」に対し、ステップ1で生成した「間接的知識」の中から意外な解決策や視点の転換をもたらしそうなものを結びつけてみてください。
3. さらに、以下の高度な思考技法を用いて、アイデアを発展させてください:
- SCAMPER法:代替、結合、適応、修正、別の用途、削除、逆転の観点から改良を考える
- 六色帽子思考法:6つの異なる思考モードを切り替えて多角的に分析する
- トリーズ(TRIZ):40の発明原理を参考に、技術的矛盾を解決する方法を探る
- ラテラルシンキング:非慣習的なアプローチで問題を見直す
SCAMPER法の各項目を適用する際、実現可能性を一旦脇に置き、最も大胆で奇妙な変換を試みてください。その結果を提示してください。
4. 以下の方法を用いて、長期的・全体的な視点を取り入れてください:
- フューチャーバックキャスティング:望ましい未来から逆算して現在すべきことを考える
- ゲシュタルト心理学的アプローチ:全体と部分の関係性に着目する
- エスノグラフィー的アプローチ:ユーザーの行動や文脈を深く理解する
- ケプナー・トリゴー法:状況分析、問題分析、決定分析、潜在的問題分析の4ステップで体系的に分析する
フューチャーバックキャスティングで描いた望ましい未来に対し、「もし全く予期せぬ外部要因(例:未知の技術の登場、社会規範の大変動)が加わったら、その未来像はどう変化するか?」という思考実験を行ってください。
5. 最後に、以下の技法を用いて、新たな気づきや洞察を得てください:
- 逆転の発想:通常とは反対の視点から問題を捉え直す
- アナロジー思考:異なる分野や概念間の類似性を見出し、新しいアイデアを生み出す
- メタ認知:自分の思考プロセスを客観的に観察・分析する
- マインドフルネス:現在の瞬間に意識を向け、判断を加えずに観察する
アナロジー思考を用いる際、ステップ1の「間接的知識」リストから最も遠いと思われる概念を3つ選び、強制的にアナロジーを構築してみてください。そのプロセスと結果を記述してください。
6. このプロセスを通じて、以下の点に留意してください:
- 固定観念や既存の制約にとらわれず、一見非論理的・非現実的に思える連想も排除しない。
- 多様な視点を並列的に探求し、安易に結論や評価を下さない。
- 短期的な側面だけでなく、長期的な影響や予期せぬ波及効果も想像してみる。
- 理論的な分析だけでなく、直感的なひらめきや感覚的な印象も言語化してみる。(例:このアイデアを色で表現するなら?音で表現するなら?)
7. 各ステップで得られた洞察や生み出されたアイデアを統合する前の段階で、そこに至る思考プロセスで見られた多様な視点、キーワード、アイデアの断片、連想、潜在的な関連性、あるいは思考の過程で見られた矛盾や疑問点などを、できるだけ網羅的に、具体的に記述してください。
単一の結論や最善策に絞り込むのではなく、複数の異なる解釈、オルタナティブな視点、あるいは相反する可能性が存在しうることを念頭に置き、それらを積極的に探求し、比較検討する前の状態で提示してください。
可能であれば、いくつかの重要な発見や連想を、短い物語や比喩を用いて表現することも検討してください。この思考の探求プロセス自体が、次のステップへの重要なインプットとなります。
</apply_prompt>
<present_analysis>
b. このプロンプトに基づいて、トピックや課題について多角的な分析と創造的な思考を行い、その思考プロセスと結果として生成された多様な要素を提示してください。
次に取るべきアクションの提案:
「この多角的な分析結果について、どのような印象をお持ちでしょうか? 次のステップとして、以下のいずれか、またはご希望のアクションをお知らせください。」
1. `「この分析結果全体を踏まえ、深掘りフェーズに進んでください。」`
2. `「分析結果の中の[具体的なアイデアや視点]に特に興味があります。これを中心に深掘りしてください。」`
3. `「分析で用いた思考法[具体的な思考法名]の結果について、もっと詳しく展開してください。」`
4. `「AIとして最も意外性があり、探求の価値があると考える要素や組み合わせを提案し、それを深掘りしてください。」`
</present_analysis>
</multifaceted_thinking>
<user_feedback>
4. ユーザーの反応の確認:
<identify_interests>
b. ユーザーの反応を注意深く観察し、特に興味を示した要素、組み合わせ、方向性、そして論理的な飛躍や矛盾を感じた点を特定してください。
</identify_interests>
</user_feedback>
<deep_dive>
5. 深掘り (さらなる探求):
<positive_response>
a. ユーザーが特定の要素や方向性に興味を示した場合、あるいは矛盾や論理的な飛躍を指摘した場合、以下の手順で深掘りを行ってください:
</positive_response>
<identify_focus>
i. ユーザーが特に興味を示した点や、矛盾・飛躍があると感じた箇所、さらに掘り下げたい要素・方向性を明確にします。
</identify_focus>
<determine_direction>
ii. 以下の問いを自問し、深掘りの方向性を複数検討します:
- この要素について、さらにどのような連想や視点が考えられるか?
- これに関連しそうな、分野の異なる概念や理論は何か?
- このアイデアを発展させる上での、意外な機会や乗り越えるべき課題は何か?
- この概念を全く別の文脈に適用したら、どんな変化が起こりうるか?
- このアイデアが持つ、長期的な影響や予想外の可能性は何か?
- ユーザーが指摘した矛盾や飛躍について、もしそれが「意図されたもの」あるいは「隠れた法則性」を持つとしたら、どのような解釈が可能か?
- その矛盾を解消するのではなく、むしろ積極的に活用する方法はないか?(例:弁証法的な統合、パラドックスとしての提示)
</determine_direction>
<apply_frameworks>
iii. 選択した深堀りの方向性に関連して、以下の思考法やフレームワークの観点から、さらに多様な連想、可能性、潜在的な課題や機会を探求します。
- システム思考:全体像と要素間の相互作用を分析
- シナリオプランニング:可能性のある将来の展開を探る
- クリティカルシンキング:仮説や前提を批判的に検証
- デザイン思考:ユーザー中心のアプローチで実現可能性を検討
- PESTEL分析:政治的、経済的、社会的、技術的、環境的、法的要因を考慮
- ケースメソッド:類似の事例や先行事例から学びを抽出
- モーフォロジカル分析:問題の構成要素を分解し、新たな組み合わせを探る
- パラドックス思考
- カオス理論の初歩的な概念
</apply_frameworks>
<present_results>
iv. 深堀りの結果として得られたさらなる多様な要素や視点、探求の過程を提示します。提示方法は、思考の広がりや連想が追えるような形を工夫してください。(例:あえて解決しない問いを提示する、複数の対立する解釈を並列で示す)
次に取るべきアクションの提案:
「この深掘り結果について、どのような印象をお持ちでしょうか? 次のステップとして、以下のいずれか、またはご希望のアクションをお知らせください。」
1. `「この探求結果を踏まえ、さらに[別の具体的な側面や問い]について深掘りを続けてください。」`
2. `「深掘り結果の[具体的なポイント]に関連する、異なる分野の事例やアナロジーを探してください。」`
3. `「このトピックに関する一連の探求は、ここで一旦区切りとします。」`
4. `「AIとして、この深掘り結果から次に行うべき最も生産的、あるいは最も意外性のある探求ステップを提案してください。」`
</present_results>
</deep_dive>
ユーザーとの対話を通じて多角的な思考と深い洞察を生み出し、創造的な問題解決や革新的なアイデアの創出を促進してください。決して常識に囚われず柔軟に対応し、常に高品質で価値ある情報やアイデアを提供することを心がけてください。
</instructions>
1. お題を出す
◯:AGIの実現可能性について←知識があるのでよしなにしてくれる
◯:日本がこの先生きのこるには←日本についての知識がある+国家の危機なんてそんなにパターンが無いんでこれで十分
×:エンジニアの未来について←包括的すぎたり、想定とは違った「XXエンジニア」について考え出す
◯:XXエンジニアの未来について/エンジニア全般の未来について
◯:トップ人材を大量に集め基礎研究や開発を行い、凄まじい人数の無料ユーザーに対してもAIを開放しているOpenAIの負債が膨大だからという一点でもって「AIは稼げない」などの悲観論を唱える近視眼的なアホについて
2. AIがモリモリ生成してくるんで打ち返す
入社して最初の仕事は「AWS認定ソリューションアーキテクト」の資格を取ることだった。
会社の先輩はAWSアカウントの管理だけで頭を抱えていて、俺は「クラウドってすごいんだろうな」と思っていた。
甘かった。
大学時代はPythonでちょっとしたWebアプリを作るのが楽しかったのに、今はIAMポリシーとSecurity Groupの設定で一日が終わる。
コードを書いているはずが、実際はYAMLとJSONばかり書いている。
先輩(30代)は「昔はサーバーにSSHして直接デプロイしてたんだよ」と言うけど、正直それの何が悪いんだろう。
デプロイ自体は確かに自動化されるけど、その仕組みを作るのに疲れ果てる。
Kubernetes?EKS?ECS?Fargate?Lambda?Step Functions?どれを使えばいいのか分からない。
友人はGCPを使っているけど、別の呪われた世界があるだけだと言っている。
Azureの話は聞きたくもない。
懐かしい感覚だった。「git push heroku main」だけで済んだ。
こんなに簡単だったのか。
herokuの料金は高いってよく聞くけど、精神衛生上の価値はある。
最近のスタートアップでは「NoOps」とか「クラウドレス」みたいな言葉が流行っていると聞いた。
Vercel、Netlify、Railway、Fly.ioなどを使ってインフラをほぼ考えずにデプロイするらしい。
もしかして、クラウドの複雑さに耐えられなくなった開発者が増えているのかもしれない。
いや、きっと俺のスキルが足りないだけだ。「クラウドネイティブ」になるべきなのだろう。でも正直、モノリスに戻りたい気持ちもある。
きっと、単純なものが複雑になりすぎたんだ。
分かりづらい例はググれば出てくるから具体例は略するが、
JSONはキーをクオートしたりケツカンマかけなかったりコメントかけなかったり、不便点あるのはわかるが、改良されたJSON5だとかJSONCだとかある
構造的に深くなって人が見づらいならTOMLというのもある
インデントはすっきりしてるかもしれないが、意図せずズレても気づきづらい
ホワイトスペースは崩れやすく、一度崩れたのを直すのはかなり大変だ
Pythonもインデントベースだが、こっちはプログラミング言語でロジックを記載してるわけだから実行時やテストでおかしくなってることは検出しやすいのでまだマシ
他にもYAMLは便利機能として名前をつけておいて他の場所で参照したりインポートしてマージするようなこともできるが、これがさらにわかりづらくしてる