VWork バイブコーディングフレームワーク

学童保育の待機児童を住所で引く道具を、PHP1ファイルで作り直した——バックエンドが要るかの見分け方

2026年9月21日

住所を入れると、その自治体の学童保育(放課後児童クラブ)の待機児童数が出る道具を作りました。公開して、systemdに登録して、ポートを開けて、公開用のプロキシも置きました。

そこで言われました。「なんでポートが必要なの? PHPだけじゃないの?」

そのとおりでした。作り直したら、PHP1ファイルとJSONだけになりました。その日のうちに気づけなかった理由と、次から迷わないための見分け方を書きます。

何を作りすぎたか

最初の構成はこうでした。

動くには動きました。ただ、最初の公開のときに 502 が出ました。原因は、プロキシの向き先のポートが外から見えていなかったことです。つまり、自分で作った依存で自分が転んだわけです。

作り直したあとの構成はこうです。

以上。データベースも、常駐するサーバーも、ポートもありません。

なぜ気づかなかったか

直前に作っていたのが洪水・内水のハザードマップで、そちらは本当にバックエンドが要るからです。PostGIS に数百万面のポリゴンを入れて、点を含む面を空間検索します。PHPでは無理です。

その形が手に残っていたまま、次の製品を同じ型で作りました。要件ではなく、直前の成功体験で構成を決めてしまったということです。

見分け方(次からはこれで判断する)

作る前に、この4つを見ます。全部「いいえ」ならPHPで足ります。

問い 学童保育ナビ 洪水ハザードマップ
データは数十MBを超えるか いいえ(29KB) はい(数GB)
空間検索や全文検索など、専用エンジンが要る計算をするか いいえ はい(PostGIS)
データが毎日・毎時変わるか いいえ(年1回) はい(発令は3分ごと)
学習済みモデルや重いライブラリを使うか いいえ いいえ

学童のほうは、やっている計算が「住所を都道府県と市区町村に正規表現で割って、JSONを引く」だけでした。この程度でバックエンドを立てるのは、ガスコンロで足りる料理に工場を建てるのと同じです。

逆に、1つでも「はい」があるならバックエンドを立てます。そこをPHPで無理をすると、今度は別の形で壊れます。

PHPにして良くなったこと

1. 故障の種が減った。 heteml の中で完結するので、うちのサーバーが落ちても動きます。502の原因そのものが消えました。

2. 売り物として強くなった。 買った人がやることが「ファイルを2つ置いて、.htaccess に1行書く」だけになりました。前の構成なら、Python・venv・systemd・ポート開放・プロキシの説明が要ります。説明が短い製品は、それだけで価値があると思っています。

3. 運用が消えた。 監視するプロセスがありません。年1回、国が新しいPDFを出したときにJSONを差し替えるだけです。

失ったものは、正直に言えばありません。強いて言えば、PHPでテンプレートエンジンなしにHTMLを書くので、コードは少し読みにくくなりました。1ファイル700行ほどです。

Pythonは捨てない。置き場所を変える

PDFから表を取り出す処理はPythonのままです。ただし製品には含めません。年1回、手元で動かしてJSONを作り、そのJSONを配布物に入れます。

この分け方が大事でした。「データを作る道具」と「データを見せる道具」は、動く場所も頻度も違います。前者は開発者の手元で年1回、後者はお客さまのサーバーで毎日。同じ言語・同じプロセスに詰める理由がないのに、最初はひとつの箱に入れようとしていました。

ちなみに取り込みの検算では、抜き出した数字を全部足して、PDFに書かれている全国値と一致するかを見ます。最初は待機児童が147人足りず、原因は名前が1文字の市(柏市・呉市)を落とす正規表現でした。直して、待機16,330人・クラブ25,928か所・登録児童1,570,645人の3つとも一致しました。合計の一致は、写し間違いがないことのいちばん安い証拠です。

まとめ

作り過ぎに気づけたのは、他人に「なんでポートが必要なの?」と聞かれたからでした。作った本人は、自分の構成を疑いません。完成したあとに、いちばん素朴な質問をしてくれる人が、いちばん役に立ちます。