177 lines
4.6 KiB
Markdown
177 lines
4.6 KiB
Markdown
|
|
# 隠れた危機一髪 - 26日間で本当に危なかった瞬間
|
|||
|
|
|
|||
|
|
## 概要
|
|||
|
|
|
|||
|
|
表面的には順調に見えた26日間の開発。しかし実際には、何度も致命的な破綻の淵に立っていた。これらの危機を回避できたのは、「箱理論への執着」と「人間の違和感センサー」のおかげである。
|
|||
|
|
|
|||
|
|
## 危機1: プラグインボックスの罠
|
|||
|
|
|
|||
|
|
### 状況
|
|||
|
|
ChatGPT5(実装AI)が提案した設計:
|
|||
|
|
```rust
|
|||
|
|
// 危険な設計案
|
|||
|
|
static PLUGIN_INSTANCES: Mutex<HashMap<String, Arc<PluginBox>>> = ...;
|
|||
|
|
|
|||
|
|
// インスタンスを参照で共有
|
|||
|
|
fn get_plugin(name: &str) -> Arc<PluginBox> {
|
|||
|
|
PLUGIN_INSTANCES.lock().get(name).clone()
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 何が危険だったか
|
|||
|
|
- **箱理論の根本違反**:他の箱は`birth`で生まれるのに、プラグインだけ特別扱い
|
|||
|
|
- **状態管理の複雑化**:グローバルな共有状態が生まれる
|
|||
|
|
- **デバッグ困難**:問題が起きても原因特定が困難
|
|||
|
|
|
|||
|
|
### にゃーの介入
|
|||
|
|
```
|
|||
|
|
にゃー:「他の箱と同じようにbirthでインスタンスをうむ」
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 解決策
|
|||
|
|
```nyash
|
|||
|
|
// 正しい設計
|
|||
|
|
box FileBox from PluginBox {
|
|||
|
|
birth(path) {
|
|||
|
|
// 外部ライブラリの初期化は1回だけ(static変数で管理)
|
|||
|
|
PluginSystem.initOnce()
|
|||
|
|
|
|||
|
|
// でもインスタンスは普通に生成
|
|||
|
|
me.handle = createNewHandle()
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 学んだ教訓
|
|||
|
|
- **AIも箱理論を見失うことがある**
|
|||
|
|
- **効率性の誘惑**に負けてはいけない
|
|||
|
|
- **統一性>効率性**
|
|||
|
|
|
|||
|
|
## 危機2: P2Pライブラリの静かな破壊
|
|||
|
|
|
|||
|
|
### 状況
|
|||
|
|
- C++ nyameshライブラリ:コンテキスト圧縮で内部状態が破損
|
|||
|
|
- JavaScript nyamesh:同様に破損
|
|||
|
|
- **表面上は動作継続**(最悪のパターン)
|
|||
|
|
|
|||
|
|
### 何が危険だったか
|
|||
|
|
```cpp
|
|||
|
|
// C++ nyameshの内部
|
|||
|
|
class P2PContext {
|
|||
|
|
std::vector<NodeInfo> nodes; // これが破損
|
|||
|
|
MessageQueue queue; // でもここは動く
|
|||
|
|
};
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- データ構造の一部だけ破損
|
|||
|
|
- エラーが出ない(NULLチェックは通る)
|
|||
|
|
- 徐々に通信が劣化
|
|||
|
|
|
|||
|
|
### 発見の瞬間
|
|||
|
|
```
|
|||
|
|
にゃー:「なんか通信の挙動がおかしいにゃ...」
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 対処
|
|||
|
|
1. 完全な再初期化を実装
|
|||
|
|
2. 状態検証のチェックポイント追加
|
|||
|
|
3. 「箱」として隔離(P2PBox内に封じ込め)
|
|||
|
|
|
|||
|
|
## 危機3: 型システムの静かな崩壊
|
|||
|
|
|
|||
|
|
### 状況
|
|||
|
|
- FloatがI64として扱われる
|
|||
|
|
- でも「動いている」ように見える
|
|||
|
|
- 計算結果が微妙にずれる
|
|||
|
|
|
|||
|
|
### 危険性
|
|||
|
|
```nyash
|
|||
|
|
// 見た目は正常
|
|||
|
|
local x = 3.14
|
|||
|
|
local y = 2.0
|
|||
|
|
local z = x + y // 5になるはずが...
|
|||
|
|
|
|||
|
|
// 内部では
|
|||
|
|
// 3.14 → 3 (I64)
|
|||
|
|
// 2.0 → 2 (I64)
|
|||
|
|
// z = 5 (正しく見える!)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 発見
|
|||
|
|
テストで`sin(1.5707963267948966)`が`0`を返したとき
|
|||
|
|
|
|||
|
|
## 危機4: Arc<Mutex>の感染爆発
|
|||
|
|
|
|||
|
|
### 状況
|
|||
|
|
- 最初は「安全のため」StringBoxにMutex
|
|||
|
|
- 次第にすべてのBoxに感染
|
|||
|
|
- パーサーが個別処理地獄に
|
|||
|
|
|
|||
|
|
### 臨界点
|
|||
|
|
```rust
|
|||
|
|
// 16種類すべてがこの形に...
|
|||
|
|
struct StringBox {
|
|||
|
|
base: Arc<Mutex<BoxBase>>,
|
|||
|
|
value: Arc<Mutex<String>>, // たった1つの文字列に!
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### にゃーの決断
|
|||
|
|
```
|
|||
|
|
にゃー:「これはやばいにゃ。NyashValueに統一するにゃ」
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 共通パターン:静かな破壊
|
|||
|
|
|
|||
|
|
最も危険なのは**「表面上動いている」**状態:
|
|||
|
|
|
|||
|
|
1. **部分的破損**
|
|||
|
|
- 一部は正常動作
|
|||
|
|
- 徐々に劣化
|
|||
|
|
- 原因特定が困難
|
|||
|
|
|
|||
|
|
2. **型の暗黙変換**
|
|||
|
|
- エラーが出ない
|
|||
|
|
- 結果が「それっぽい」
|
|||
|
|
- 後で大問題に
|
|||
|
|
|
|||
|
|
3. **複雑性の感染**
|
|||
|
|
- 「安全のため」から始まる
|
|||
|
|
- 徐々に全体に広がる
|
|||
|
|
- 気づいたときには手遅れ
|
|||
|
|
|
|||
|
|
## 危機回避の共通要因
|
|||
|
|
|
|||
|
|
### 1. 箱理論への執着
|
|||
|
|
```
|
|||
|
|
「これも箱にすれば...」
|
|||
|
|
「箱の規約を守れば...」
|
|||
|
|
「問題を箱に封じ込めれば...」
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 違和感の言語化
|
|||
|
|
```
|
|||
|
|
「なんか変だにゃ」
|
|||
|
|
「これ続けたらやばいにゃ」
|
|||
|
|
「表面は動いてるけど...」
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. シンプルさへの回帰
|
|||
|
|
```
|
|||
|
|
複雑化 → 「待って」 → 箱に戻す
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 結論:見えない危機との戦い
|
|||
|
|
|
|||
|
|
26日間の開発は、実は**薄氷の上を歩く**ような危険な旅だった。
|
|||
|
|
|
|||
|
|
成功の鍵:
|
|||
|
|
- **箱理論という北極星**:迷ったら必ず戻る場所
|
|||
|
|
- **人間の第六感**:データでは見えない異常を察知
|
|||
|
|
- **AIとの対話**:AIの暴走を人間が制御
|
|||
|
|
|
|||
|
|
これらの「隠れた危機」の記録は、将来の開発者への貴重な警告となる。
|
|||
|
|
|
|||
|
|
**「動いているように見える」が最も危険**
|
|||
|
|
|
|||
|
|
この教訓を忘れてはならない。
|