【新卒研修】なぜマジックナンバーをやめるのか?なぜconfigにまとめるのか?なぜsecretsに隠すのか?
新卒のコードレビューをしていると、よく次のような課題に出会います。
- あっさりマジックナンバーを使う
- パスワードやAPIキーが普通にコードに書いてある
- GitにCSVファイルをそのままコミットする
- (特に機械学習系で)hyperparameterがコードのあちこちに散らばっている
でも実は、これらはバラバラの問題ではありません。
すべて同じ原因に帰着します。
それは、
システムの本質を理解していないこと
です。
システムの本質は「データ」と「ロジック」
システムとは何でしょうか?
答えはシンプルです。
システム = データ × ロジック
データ:システムが扱う情報や値
ロジック:データを処理する方法やルール
これだけです。
難しく考える必要はありません。
① マジックナンバーを使ってはいけない理由
例えばこんなコードがあったとします。
if score > 0.8:
print("OK")
この 0.8 は何でしょうか?
合格ライン?
精度の閾値?
実験的に決めた値?
これは データ です。
しかし今、このデータは ロジックの中に埋め込まれています。
つまり、
データとロジックが分離されていない状態です。
正しくはこうです。
THRESHOLD = 0.8
if score > THRESHOLD:
print("OK")
こうすると何が起きるか?
- 意味が明確になる
- 値を変更しやすい
- 実験しやすい
- 再利用しやすい
これは「可読性」の話ではありません。
データとロジックを分離しているだけです。
② hyperparameterを上にまとめる理由
機械学習コードでよく見る例:
model = RandomForestClassifier(
n_estimators=100,
max_depth=5,
random_state=42
)
これがファイルの途中に突然出てくる。
これも同じ問題です。
- n_estimators
- max_depth
- random_state
これらはすべて データ です。
モデルのアルゴリズム(ロジック)ではありません。
だから正しくはこうです。
CONFIG = {
"n_estimators": 100,
"max_depth": 5,
"random_state": 42
}
model = RandomForestClassifier(**CONFIG)
これにより、
- 実験管理ができる
- 再現性が保てる
- 設定変更が容易になる
なぜ?
データとロジックが分離されたからです。
③ パスワードをsecretsに隠す理由
これも本質は同じです。
password = "my_password_123"
これは「セキュリティが甘い」という以前に、
ロジックの中にデータを埋め込んでいる
のが問題です。
パスワードは「環境に依存するデータ」です。
開発環境、本番環境、テスト環境すべて異なります。
つまり、ロジックとは独立しているべきデータ
なのです。
だから .env や secrets manager に入れる。
セキュリティは結果であって、
本質は「分離」です。
④ なぜGitにCSVを上げてはいけないのか?
これも同じ話です。
Gitとは何か?
Gitは「ロジック」を管理する場所です。
コードとは何か?
データを処理するルール。
ではCSVは?
データそのもの。
Gitは差分管理、履歴管理、ブランチ管理
をします。
これは「ロジック」に最適化された仕組みです。
データを入れるとどうなるか?
- リポジトリが肥大化する
- 差分が意味を持たない
- 再現性が崩れる
- 管理不能になる
なぜ起きる?
データとロジックの区別がついていないからです。
すべては「責務の分離」の問題
まとめます。
| 問題 | 本質的な原因 |
|---|---|
| マジックナンバー | データがロジックに埋まっている |
| hyperparameter散乱 | 設定データが分離されていない |
| パスワード直書き | 環境依存データがコードに混ざっている |
| CSVをGit管理 | データとロジックの区別がない |
全部同じです。
データとロジックの分離ができていない。
良いエンジニアの思考
コードを書くとき、常に自問してください。
- これはロジックか?
- それともデータか?
- この値は将来変わる可能性があるか?
- 環境によって変わるか?
- 実験ごとに変わるか?
「変わる可能性があるもの」は、
ほぼすべて データ です。
そしてデータは、
- configにまとめる
- 環境変数に出す
- secretsに隠す
- 外部ストレージに置く
べきです。
研修で一番伝えたいこと
技術は増え続けます。
Kubernetes
Databricks
Terraform
MLflow
CI/CD
でも本質は変わりません。
システム = データ × ロジック
これを理解している人は、
マジックナンバーを使わない
設定を整理する
secretsを分離する
Gitの役割を理解している
逆にこれを理解していないと、
ツールだけ覚えても本質的に成長しません。
最後に
新卒の皆さんへ。
マジックナンバーを使ったから怒られているのではありません。
パスワードを書いたから怒られているのでもありません。
「システムをどう捉えているか」が問われています。
データとロジックを分けて考える。
それだけで、コードの質は一段上がります。
そしてそれは、
エンジニアとして一段上がるということです。
Discussion