はじめに
Day 14では、連載の一区切りと今後の開発目的について書きました。
今回はPythonプロトタイプの完成の報告とバックエンドをRustへ移行する決断とその経緯について書きます。
Pythonプロトタイプの完成
Day 13で報告したgoals機能のチケット制への全面改修が完了しました。これによりPythonプロトタイプとして当初計画していた機能が一通り揃いました。
実装済みの機能は以下の通りです。
| 機能 | ファイル | 内容 |
|---|---|---|
| 時間記録 | times.py | 開始・終了・合計時間の計測。月別CSV自動出力 |
| チケット管理 | goals.py | 親→子→孫の3階層チケット。作成・ステータス更新・completion_flag自動算出 |
| ファイル操作 | file_operations.py | OSパス自動判定・CSV/JSONL読み込み |
| APIハブ | main.py | FastAPIによるエンドポイント定義 |
Rust移行を決断した理由
このタイミングで本番機能の実装を開始することにした理由は3点あります。
1. 開発当初からの方針
本番用バックエンドにはRustを使用する想定で開発を進めていました。Pythonはあくまでもロジックとデータ構造を確認するためのプロトタイプという位置づけです。
2. NN機能実装前に移行するコストが最小
NN機能をPythonで実装した後にRustへ移行しようとすると、PyTorchからBurnへの変換作業が発生します。プロトタイプの規模が小さい現時点で移行することで、書き直しのコストを最小化できます。
3. 3D描画時のボトルネック回避
フロントのUI方針変更(後述)に伴い、3D描画を実装する場合に現在のスタックではAPI通信を行う部分でボトルネックが発生すると判明しました。
フロント要件とUX方針の変更
goals機能の実装を通じて、フロントの操作性について再検討を行いました。
当初はVS Codeをモデルにしたマウス操作中心のUIを想定していましたが、ゲームコントローラー的に限定されたキーの組み合わせで全操作を完結させる独自UIに変更します。
| 変更前 | 変更後 |
|---|---|
| マウス操作中心 | キーボードのみで全操作完結 |
| 静的なコンポーネント配置 | ユーザー操作に応じて動的にUIが変化 |
| Electron + TypeScript | Tauri + Three.js + TypeScript |
3Dゲームのようにユーザーの操作に応じて画面が動的に変化する設計を目指します。Three.jsによる3D描画はTypeScript側で完結させ、Rustバックエンドでは描画計算を行わない方針です。
新しい技術スタック
| 層 | 技術 |
|---|---|
| デスクトップFW | Tauri |
| バックエンド言語 | Rust |
| フロント言語 | HTML / CSS / TypeScript |
| 3D描画 | Three.js |
| NN機能 | Burn(将来実装時) |
| データ形式 | CSV / JSONL / MD |
PythonプロトタイプはTauri標準のIPC(コマンド方式)で連携していたFastAPIとは設計思想が異なります。HTTPサーバーは不要になり、TauriのIPCコマンド方式でフロントとバックを繋ぐ設計になります。
プロトタイプから引き継ぐ設計判断
Rust版でもPythonプロトタイプで確定した以下の設計判断は引き継ぎます。
- フロントとバックエンドの完全分離
- バリデーションはフロント・バックの2重チェック
- 機能別モジュール化
- 状態保持が必要な機能は永続インスタンス、リクエスト単位で完結する機能はリクエストごとにインスタンス化
- データ保存先はOSのユーザーデータ領域に自動保存
おわりに
今日はPythonプロトタイプの完成とRust移行の決断について書きました。
プロトタイプを作ったことでデータ構造・API設計・フロントとバックの責務分離の判断が確定しました。Rust版ではこれをベースに本番品質の実装を進めていきます。
次の記事はRust版の実装が進んだ段階で公開します。
リポジトリはOSS公開準備中です。公開後にこの記事へリンクを追加します。
この記事は連載「クラウドに依存しないマイルストーン管理ツール開発記」のDay 15です。
- Day 1 - なぜ自作するのか
- Day 2 - 技術スタックとその選定理由
- Day 3 - Pythonで時間記録機能を作る
- Day 4 - タスク管理のデータ構造
- Day 5 - FastAPIによるAPIハブ設計
- Day 6 - TypeScriptでクラスベースのコンポーネント設計
- Day 7 - 1週間の振り返りと今後の開発方針
- Day 8 - データ保存先の設計変更
- Day 9 - CSVフォーマットの設計
- Day 10 - ファイル読み込みモジュールの設計
- Day 11 - APIクライアント自動生成の導入
- Day 12 - timer画面の本実装と非同期通信
- Day 13 - タスク管理機能を全面再設計した理由
- Day 14 - 連載の一区切りと今後の開発目的