1. 読みやすさ(他人と未来の自分が読める)
2. 壊れにくさ(テスト・例外・境界条件)
3. 設計(責務分離・依存の整理)
4. 運用(ログ・設定・CLI・ドキュメント)
## 1. 「動く」から「読める」へ:まずは“型”を身につける
### すぐ効くチェックリスト(毎回これだけ)
* 変数名が役割を説明している(`x` や `tmp` を減らす)
* 関数が長すぎない(目安:20〜30行以内)
* 1つの関数は1つの仕事(“ついで処理”を混ぜない)
* 早期returnでネストを浅くする
* マジックナンバーを定数化する
* `print`デバッグ → `logging` へ移行する癖をつける
### 練習課題(効果が高い)
あなたが過去に書いた「動けばOK」コードを1つ選び、機能追加はせずに、
* 関数分割
* 変数名改善
* 重複削除
だけで読みやすくする、をやってください。これが“リファクタリング筋”を作ります。
## 2. 「壊れにくい」へ:テストは“全部”ではなく“要所”から
テストで挫折しがちなのは、最初から網羅しようとするからです。最初はここだけで十分です。
### 最初にテストすべき3点
* 境界値(空、0、最大/最小、1件だけ)
* 異常系(形式が違う、欠損、ファイルがない、通信失敗)
* 変換ロジック(入力→出力が決まる純粋関数)
### おすすめの進め方
* “テストしやすい形”にするために、先に I/Oとロジックを分離
* ファイル読む・API叩く・DBアクセス:I/O
* 加工・判定・集計:ロジック(ここをテスト)
## 3. 「設計」へ:責務分離と依存の整理を覚える
「とりあえず動く」コードが肥大化する原因の多くは、1か所に責務が集まりすぎることです。
### 初心者がまず覚える設計ルール(実務でも効く)
* 関数は“入力→処理→出力”が見える形にする
* データ構造を先に決める(辞書の形、クラス、dataclass)
* “何をするか”と“どう保存/取得するか”を分ける
例:`calculate_total()` と `load_orders()` を混ぜない
### dataclass は早めに覚える価値が高い
データが増えても崩れにくく、型ヒントとも相性が良いので、初心者の次の一歩にちょうどいいです。
## 4. 「プロっぽい」へ:型チェック・静的解析・フォーマッタを味方にする
ここは“才能”というより“道具の導入”で一気に品質が上がります。
### 最小構成(これだけでOK)
* フォーマット:`ruff format`(または `black`)
* リント:`ruff`
* 型:`mypy`(最初は厳しくしすぎない)
* テスト:`pytest`
ポイントは「全部理解してから導入」ではなく、入れて走らせながら慣れることです。
## 90分でできる“ステップアップ練習”メニュー(週2回で伸びます)
1回90分で回せるようにしています。
1. 10分:既存コードを読む(改善点を3つメモ)
2. 30分:関数分割・命名・重複削除(機能変更なし)
3. 20分:ロジック部分にテストを2〜3本追加
4. 20分:`ruff` とフォーマッタを通して直す
5. 10分:READMEに「使い方」「入力例」「出力例」を追記
これを4〜6回やると、“動けばOK”から確実に抜けられます。
## リンク
- [[PythonからRustへ移行するロードマップ]]