Python や Node.js を使ったことはあるでしょうか?
これらの言語は 型チェックが緩い(動的型付け) という特徴があります。
- 変数にどんな型でも入れられる
- 実行時までエラーが出ない
- とりあえず動くコードが書ける
プログラミングを Python や Node.js から始めた人 も多いと思います。
しかし、そこから Rust や Go、TypeScript(厳密設定) のような
「型を守らないといけない言語」に移行すると──
最初に待っているのは、地獄のような型エラー
今回は、その理由と実体験ベースの学びを書きます。
型チェックが緩い言語の世界
Python や JavaScript では、こんなコードが普通に書けます。
x = 10
x = "hello"
x = [1, 2, 3]
JavaScript でも同様です。
let x = 10;
x = "hello";
x = {};
- エラーは出ない
- 実行もできる
- とりあえず動く
この「自由さ」は、学習初期には非常に優しいです。
なぜ初心者に人気なのか
型が緩い言語が最初に選ばれやすい理由は明確です。
- 文法がシンプル
- 書いたらすぐ動く
- 型エラーで止められない
- 学習コストが低い
つまり、「まず動かす」ことに集中できる。
これは大きなメリットです。
しかし、その自由さが後で牙をむく
問題は、そのままの感覚で型が厳密な言語に移行したときです。
例えば Rust。
let x = 10;
x = "hello"; // コンパイルエラー
この時点で、「え、なんでダメなの?」となります。
最初にぶつかるのは「型エラーの壁」
Rust や厳密な TypeScript では、
- 型が一致しない
- Option / Result を処理しろ
- null は存在しない
- 暗黙変換しない
といったエラーが 次から次へと出てきます。
動的型付けの癖が抜けない
特にキツいのがこの感覚です。
- 1つの変数に何でも入れたい
- とりあえず if で分岐すればいい
- 実行すれば分かる
この思考が、
型が厳密な言語では 通用しません。
なぜ型が厳しい言語はこうなっているのか
型エラーは「バグの予防」 です。
型が厳しい言語は、
- 実行前にミスを潰す
- 状態の不整合を防ぐ
- 保守性を上げる
ために、あえて厳しくしています。
移行期が一番しんどい
正直に言うと、
Python → Rust(または厳密TS)
この移行期が一番つらい。
- エラーが多すぎる
- 書く量が増える
- 頭を使うポイントが変わる
でも、慣れると逆に戻れなくなる
- 型を意識して設計する
- コンパイルが通れば安心できる
- リファクタが怖くなくなる
という感覚を一度知ると、「型が無いのが怖い」 に変わります。
学んだこと
- 型が緩い言語は入り口として最高
- でもそれが当たり前になると後がきつい
- 型エラーは敵ではなく味方
- 設計力は型の厳しさで鍛えられる
まとめ
- Python / Node.js から始める人は多い
- そのままの感覚で型が厳密な言語に行くと詰む
- 最初は型エラー地獄
- 乗り越えると世界が変わる
この壁を越えると、
プログラミングの見え方は確実に変わります。