組織と仕事 / コードの進め方
Python プロジェクトの構成をどう考えるか
結論:構成は、見た目の整理ではなく「仕事を続けられる形」を作ること
Python プロジェクトの構成は、フォルダをきれいに並べるためのものではありません。
本当に効いてくるのは、次のような場面です。
- 別の人がコードを読むとき
- レビューするとき
- 修正や再利用が始まるとき
- 担当が変わるとき
つまり構成とは、どこに何を書くかを決めるだけではなく、誰がどこを責任範囲として扱うかを見えやすくすることでもあります。
| 構成を考えないまま増やすと | 起こりやすいこと |
|---|---|
| 全部を1ファイルへ追記する | どこを直せばよいか分からなくなる |
| 設定が各所に散らばる | 変更のたびに探し回る |
| 入出力と計算が混ざる | テストしにくい、レビューしにくい |
| 役割分担が見えない | 「この人しか触れない」状態になりやすい |
正解の構成は一つではありません。けれど、判断軸はあります。この記事では、そこを仕事の観点から整理していきます。
あるある:動くコードはあるのに、人を巻き込んだ途端に進まなくなる
Python を少し触れるようになると、自分の仕事を助けるコードはかなり書けるようになります。
- CSV を読む
- 整形する
- 集計する
- グラフを出す
- ファイルへ保存する
ここまでは、一人で動かすぶんには十分です。問題は、その次です。
| 一人で使う段階 | 仕事として広げる段階 |
|---|---|
| 自分が全部分かっている | 他の人も読める必要がある |
| その場で直せる | どこを直すべきか共有できる必要がある |
| 多少散らかっていても回る | レビュー・引き継ぎ・再利用に耐える必要がある |
つまり、困りごとの正体は「Python が書けない」ことではなく、人が入ってきたときの入口が見えないことにある場合が多いのです。
相談:Python は書けるのに、仕事になると人を巻き込めない
Python で集計もできるし、数値計算も組めるとよ。欲しい結果までは出せる。でもな、それを仕事の中で広げようとすると、急に進まんくなることがあるばい。
うん。「自分で動かせる」と「人と一緒に回せる」は、少し違う力なんだよね。そこに構成の話が効いてくるのよ。
でも、小さいコードにそこまで要るかね。まずは結果が出ることが大事やろ。現場では「動いたなら使おう」で進むことも多かろうし。
最初はそれでいいこともあるよ。でも、誰かに渡す、レビューしてもらう、別案件で流用する、運用に乗せる、となった瞬間に「どこに何があるか」が効いてくるの。
たしかに、「この定数どこですか」「この関数だけ試したいです」「保存先を変えたいです」って聞かれて、毎回おれが説明しとる気がするばい。
それは、コードの中身が悪いというより、共同作業の入口が見えていない状態なんだよ。構成は、技術を人に渡せる形にするための案内板みたいなものなの。
なるほどたい。自分では分かっとるから困ってないだけで、他の人からすると入口が見えんのやね。
そう。だから構成は、きれい好きのためじゃなくて、巻き込みやすさを作るためにあるんだよ。
なぜプロジェクト構成が問題になるのか
最初は1ファイルでも回ります。これは事実です。むしろ、最初の一歩が速いのは Python の強みです。
最初の段階では、1ファイルでも困らない理由
- 自分しか触らない
- 仕様変更がまだ少ない
- 入出力もロジックも頭の中で追える
- その場で直せる
ただし、仕事では次の変化がほぼ必ず起きます。
- 追記が入る
- 修正が入る
- 別の人が触る
- 似た仕事に流用したくなる
- 設定値が増える
- 例外対応が増える
この変化が始まると、問題は「長いこと」よりも、どこを直せば何が変わるか分からないことになります。
| 構成が曖昧な状態 | 現場で起きる困りごと |
|---|---|
| 読み込み・計算・保存が同居 | 修正の影響範囲が読みにくい |
| 設定がコード内部に埋まる | 変更時に毎回探すことになる |
| 共通処理が散らばる | 似た関数が増えて重複する |
| 入口が分からない | 他の人が触り始めにくい |
構成が悪いと起きること
構成が悪いときに起きやすいことを、先に一覧で見ると整理しやすくなります。
| 起きること | なぜ困るか |
|---|---|
| 似た処理の重複 | 修正箇所が増え、仕様差異も生まれやすい |
| 入出力と計算ロジックの混在 | テストしづらく、切り分けもしにくい |
| 設定値の散在 | 変更が「探し物」になる |
| レビューしづらい | 読む側が毎回全体を推理する必要がある |
| 引き継ぎが難しい | 担当者が変わるたびに口頭説明が必要になる |
| 属人化 | その人がいないと進まない状態になる |
属人化は、「その人が優秀すぎるから」だけで起きるわけではありません。
むしろ、構造が共有されていないから、その人の頭の中にしか地図がないという形で起きることが多いです。
良い構成を考えるときの軸
ここで大事なのは、「唯一の正解」を探すことではありません。見るべきなのは、形ではなく判断軸です。
| 判断軸 | 見るポイント |
|---|---|
| 役割ごとに分ける | 入口・設定・入出力・ロジックが混ざっていないか |
| 入出力とロジックを分ける | 計算部分だけを試しやすいか |
| 設定を寄せる | パスや閾値を一か所で見直せるか |
| 再利用をまとめる | 似た処理が複数箇所に増えていないか |
| 入口を明確にする | 最初にどのファイルを見ればよいか分かるか |
| 変更点を見越す | 今後よく変わる場所が独立しているか |
最低限の考え方だけ抜き出すと
- 入口を見えるようにする
- 設定を散らさない
- 入出力と計算を混ぜすぎない
- 再利用する処理は寄せる
具体例:最初に覚えるのは「正解の形」ではなく「どう分けるか」
ここまで読むと、「考え方は分かったけれど、実際にはどう分ければいいのか」と感じるかもしれません。
そこで、仕事として使い始めるときの最小限の構成例を一つ置いてみます。大切なのは名前そのものではなく、役割が見えることです。
たとえば、こんな分け方
project/ ├─ main.py # 実行入口 ├─ config.py # パス、閾値、列名などの設定 ├─ io.py # 読み込み・保存 ├─ calc.py # 計算ロジック ├─ funcs.py # 複数箇所で使う共通処理 ├─ notebooks/ # 試行錯誤や検証 └─ scripts/ # 単発実行用の補助スクリプト
| 置き場 | 役割 | 分ける意味 |
|---|---|---|
main.py |
実行の入口 | どこから始まるかを見えやすくする |
config.py |
設定値 | パスや閾値の変更を一か所で済ませやすくする |
io.py |
入出力 | データの読み書きと計算を切り分ける |
calc.py |
計算ロジック | ロジック単体で見たり試したりしやすくする |
funcs.py |
共通処理 | 重複を減らし、再利用しやすくする |
notebooks/ |
検証用 | 試行錯誤と本体コードを分ける |
scripts/ |
単発実行 | その場限りの処理と保守対象を混ぜすぎないようにする |
この形が唯一の正解という意味ではありません。
ただ、入口・設定・入出力・ロジックが分かれているだけで、「どこを見ればよいか」がかなりはっきりします。
最初はここまでなくてもいい
小さいうちは、もっと簡単でもかまいません。
main.pyとfuncs.pyに分ける- 設定が増えたら
config.pyを切り出す - 入出力が増えたら
io.pyを分ける - 計算が育ったら
calc.pyを独立させる
つまり構成は、最初から完成品を当てるものではなく、仕事の増え方に合わせて育てるものです。
構成は、最初から完成品を当てるものではなく育てるもの
実務のコードは、多くの場合こうやって育ちます。
| 段階 | よくある状態 | 次に分けたくなるもの |
|---|---|---|
| 最初 | single file | 実行入口と共通処理 |
| 少し育つ | main.py + functions.py |
設定、入出力 |
| 実務化が進む | 複数人が触る | config、io、visualize、model |
| 継続運用 | 再利用・引き継ぎが発生 | 責任範囲が見える形へ整理 |
ここで大事なのは、あとから分けることは失敗ではないということです。
失敗なのは、何も意識しないまま増やし続けて、あとで分けたくても分けにくくなることです。
構成は個人の美意識ではなく、共同作業の土台になる
仕事のコードでは、構成は個人の趣味で終わりません。共同作業のしやすさに直結します。
構成が効く場面
- 人が入れ替わっても読める
- レビューの観点を共有しやすい
- 変更時の影響範囲が見えやすい
- 責任範囲を分けやすい
- 説明を毎回口頭で補わなくて済む
たとえば、入出力を触る人と、計算ロジックを調整する人が別なら、構成が分かれているだけで会話がしやすくなります。
| 構成が見えていると | 会話がこう変わる |
|---|---|
| 入口が明確 | 「まずここを見てください」と言いやすい |
| 入出力が独立 | 「今回は io 側の変更です」と言える |
| ロジックが独立 | 「このレビューでは計算部分を見てください」と言える |
| 設定が集約 | 仕様変更時の調整箇所が明確になる |
構成は、コードのためだけではありません。人が変わっても仕事が回るようにするためにあります。
落とし穴:立派な構成を先に作ることが目的になる
ここで逆方向の落とし穴もあります。構成を考えること自体が目的になってしまうことです。
| やりがちなこと | なぜ苦しくなるか |
|---|---|
| まだ小さいのに階層だけ多い | どこに何があるか、逆に探しにくい |
| 役割が曖昧なまま箱だけ作る | 名前は立派でも境界が機能しない |
| 正解の形を先に当てようとする | 現実の変更に合わなくなる |
大事なのは、厳密さを競うことではなく、最小限でも境界が見えることです。
締め:小さいうちに少し分けておくと、後で仕事が楽になる
小さいコードに、いきなり厳密な多階層構成は要らないかもしれません。けれど、小さいうちから役割分離の考え方を持っておくことには意味があります。
- 入口を分ける
- 設定を寄せる
- 入出力とロジックを混ぜすぎない
- 再利用する処理をまとめる
これだけでも、後から育てやすさはかなり変わります。
Python プロジェクトの構成とは、ファイル整理ではなく、仕事を継続できる形にすることです。保守、分担、再利用、引き継ぎ。そうした仕事の現実を見据えると、構成はコードのためというより、仕事を壊さないために必要なのだと思います。
おれは「計算を正しく組むこと」には意識が向いとったけど、「人が途中から入っても回るようにすること」までは、あまり考え切れてなかったかもしれんばい。
それは自然だよ。作る人はまず解くことに集中するからね。でも仕事になると、解けることと、引き継げることと、安心して直せることが同じくらい大事になるの。
なるほどたい。構成って、きれい好きのためやなくて、「人に渡せる形にする」ための準備なんやね。
そうそう。最初から豪華にしなくていいけど、「誰かが次に入ってこられる余白」は作っておきたいのよ。
じゃあ次からは、「動くか」だけやなくて、「人が入れるか」も見るようにするばい。
うん。それができると、コードが個人技から仕事の基盤に変わっていくよ。