【第2回】コードを書く前に「仕様書」を書く — AIと開発するなら、ここが土台になる

机の上には、一枚の和紙に優雅な手書きの設計図のような図や構造に関するメモが描かれ、その傍らには万年筆が置かれている。柔らかな朝の光が差し込んでいる。

前回は、業務で使ってきた帳票デザインソフトの「ちょっとした不便」をきっかけに、自分で帳票作成システム Kasane(重ね) を作り始めた経緯を書きました。

今回は、いよいよ開発に入る…前に、最初にやったことの話です。それは、コードを1行も書かずに「仕様書を書く」ことでした。

業務系のプログラマなら「そりゃ仕様書は書くでしょ」と思うかもしれません。ですが、AI(Claude Code)と一緒に開発する場合、仕様書にはもう一つの重要な役割があることに気づきました。

目次

なぜ最初に仕様書を書いたのか

私が最初に作ったのは、docs/file-format.md という1枚のマークダウンファイルでした。

これは「Kasane のファイル形式」を定義した仕様書です。中身は、こんな問いに答えるものでした。

  • 帳票のテンプレートは、どんな形式で保存するのか?
  • データはどう渡すのか?
  • 「重ね合わせ」をどう表現するのか?

コードを書き始める前に、この仕様書をじっくり作りました。理由は2つあります。

理由1: 設計のブレを防ぐ

帳票作成システムのような「土台」が大事なソフトは、最初の設計が後のすべてを決めます。データ構造を後から変えると、その上に積み上げたコードが全部崩れる。

最初に仕様を固めることの価値は、業務システム開発で何度も痛感してきました。

理由2: AIとの「共通理解の土台」になる

これが今回の発見でした。

Claude Code に「こういうものを作って」と毎回口頭(チャット)で説明していると、少しずつ認識がズレていくことがあります。会話が長くなるほど、最初に決めたことが曖昧になる。

ですが、docs/file-format.md という明文化された仕様書があれば、Claude Code に「この仕様書を読んで実装して」と伝えるだけで済みます。仕様書が、私とAIの間の「正」となる共通の参照点になるのです。

実際、開発のたびに私はこう指示しました。

「docs/file-format.md を読んで、Phase 1 を実装してください」

仕様書を更新したら、また「更新版を読んで」と伝える。これで、何度実装を重ねても設計がブレない。これは AI と開発する上で、想像以上に効きました。

Kasane のファイル形式: 2つのファイルで1つの帳票

では、実際にどんな仕様にしたか。Kasane の帳票は、2つのファイルの組み合わせで表現することにしました。

テンプレート(.kasane)とデータ(.dat)

ファイル役割形式
.kasane帳票のデザイン(レイアウト、罫線、文字の位置)XML
.dat帳票に流し込むデータ(顧客名、金額など)INI ライク

これは業務帳票システムの王道パターンです。「デザイン」と「データ」を分離することで、1つのテンプレートに次々と違うデータを流し込んで、大量の帳票を生成できます。

例えば請求書なら、テンプレートは1つ作っておき、顧客ごとのデータ(.dat)を流し込めば、何百枚もの請求書が出力できる、というわけです。

なぜ XML と INI なのか

ここは設計判断でした。独自のバイナリ形式にする選択肢もありましたが、あえてテキスト形式を選びました。

理由:

  • 人間が読める: テキストエディタで開けば中身が分かる
  • Git で管理できる: 差分が見える、バージョン管理しやすい
  • 手で編集できる: ちょっとした修正ならエディタで直せる
  • デバッグしやすい: 何かおかしい時、ファイルを開けば原因が分かる

前回書いた「ある業務ソフトの独自バイナリ形式は中身が読めない」という不満への、私なりの答えです。透明性を最優先しました。

Kasane の中心思想: レイヤー

仕様書を書く中で、一番こだわったのが 「レイヤー」 の設計です。

前回書いた通り、私が最初に困ったのは「条件によって帳票に重ねる図を変える」ことでした。この課題を、後付けの機能ではなく設計の中心に据えることにしました。

レイヤーの考え方

Photoshop を使ったことがある方なら、レイヤーパネルを思い浮かべてください。複数の絵を「層(レイヤー)」として重ね、表示・非表示を切り替えられる、あの仕組みです。

Kasane も同じ発想にしました。帳票を複数のレイヤーで構成し、データ(.dat)の指定によって、どのレイヤーを表示するかを切り替える

簡単な例で言うと、こんなイメージです。

  • ベースレイヤー: 常に表示される帳票の本体(罫線、項目名)
  • 「支払済」レイヤー: 条件に応じて重ねる赤いスタンプ
  • 「未払い」レイヤー: 別の条件で重ねる青いスタンプ

データ側で「支払済レイヤーを表示」と指定すれば、赤いスタンプ付きの帳票になる。「未払いレイヤー」を指定すれば青いスタンプになる。テンプレートは1つのまま、データの指定だけで見た目が変わるわけです。

「重ね色目」という名前の由来

このレイヤー思想が、プロジェクト名の由来になっています。

日本の伝統に「重ね色目(かさねのいろめ)」という美意識があります。平安時代の装束で、複数の色の布を重ねることで、一つの美しい表現を生み出す文化です。

複数の意匠を重ねて一つの帳票を作る——この思想を込めて、プロジェクトを 「Kasane(重ね)」 と名付けました。

仕様書を「先に」書くことの効用

ここで、業務系プログラマの方に特に伝えたいことがあります。

AI 開発ツール(Claude Code など)を使うと、つい「とりあえず動くものを作って」と指示しがちです。確かに、それでも何か動くものはできます。

ですが、最初に仕様書を書いておくと、AI の出力品質が段違いに上がります

私の体感では、

  • 仕様書なしで「いい感じに作って」→ 毎回少しずつ違うものができる
  • 仕様書ありで「この仕様書通りに作って」→ 設計が一貫し、手戻りが激減

これは、人間のチーム開発で「仕様書を共有する」のと全く同じ効果です。AI が相手でも、明文化された共通理解が品質を支えるのです。

仕様書を書く時間は、決して無駄ではありません。むしろ、後の実装フェーズを何倍も速く・正確にする投資でした。

次回予告

仕様が固まったら、いよいよコードを書き始めます。

次回は Phase 1: コアライブラリの実装 の話です。.kasane(XML)と .dat(INI)を読み込んで、メモリ上の帳票データに変換する、Kasane の心臓部を作りました。

ここで一つ、技術的な選択をしました。XML を読むのに、C# 標準の XmlSerializer を使うか、それとも XLinq で手書きパースするか。

Claude Code はある理由で後者を選びました。その判断が、なぜ正しかったのか——次回、詳しく書きます。

それでは、また次回。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次