Java10年選手がPythonを学んであきらめそうになった瞬間

※サムネイル画像は、生成AIで作成したイメージです
こんにちは、グローバルウェイのNです。Javaをメインに10年経験してきましたが、グローバルウェイへ転職を機にPythonメインに転向しました。Pythonを学んで半年ほどですが、衝撃を受けあきらめそうになったことについてまとめました。
この記事は以下の方を対象としています。
★5 Djangoの開発経験が3年以上。
★4 Djangoの 開発経験が1年以上。
★3 Webサイト開発経験あり。これからDjangoを学習します。
★2 Python 初級者。簡単なプログラムコードが書けます。
★1 プログラミング未経験。
目次
「型」がない恐怖、あるいは「型」に守られていた幸せ
Javaでは List<User> userList = new ArrayList<>(); と書くのが礼儀です。何が入っているか一目でわかります。
ところがPythonはこうです。
users = []
…いや、何が入るの?
「実行してみるまで分からない」という動的型付けの自由さは、Javaエンジニアにとっては「暗闇の中で全力疾走する」ような恐怖です。10年かけて培った「静的解析による安心感」が、一瞬で崩れ去る瞬間です。
「中括弧 { }」の不在と、インデントの掟
Java屋の右手は、無意識に { を打ち、行末に ; を添えるように調教されています。
Pythonにはこれらがありません。代わりに君臨するのが「インデント(空白)」です。
if is_java_engineer:
print("セミコロンを探してしまう")
# ここでインデントを1つ間違えるだけで、ロジックが崩壊する恐怖
「見た目がロジックを支配する」というPythonの思想。
最初は「これでいいの?」と思いましたが、慣れてくると「あ、Javaの冗長なボイラープレート(お決まりの記述)って、実は贅肉だったのかも…」と気づき始めるから不思議なものです。
「カプセル化」という概念のゆるふわ化
Javaなら private フィールドを作って、厳格な Getter/Setter でガードを固めますよね。
Pythonには、Javaのような厳密な private は存在しません。
Java:「立ち入り禁止!鍵をかけるぞ!」
Python:「入らないでね(アンダースコア _ を付けながら)。まあ、どうしてもって言うなら止めないけど。大人なんだから自己責任でね」
この「We are all consenting adults(私たちはみんな、同意した大人だ)」というPythonの哲学。無駄なコードを省き、シンプルさを追求する文化に触れると、Javaの堅牢さが時に「過保護」に見えてくることもあります。
Map<K, V> という重装備を脱ぎ捨てた「Dictionary」の衝撃
Javaエンジニアにとって、連想配列といえばHashMapやTreeMapですよね。
でも、PythonのDictionaryはそれらとは一味違う、もっと「やりたい放題」な存在なんです。 学んでいて一番衝撃でした。
Generics(型パラメータ)がない解放感と絶望
Javaならこう書きます。
Map<String, Integer> inventory = new HashMap<>();
これで、「キーは文字列、値は数値」という秩序が保たれます。
しかし、Pythonは……
data = {
"id": 101,
"name": "Javaおじさん",
"skills": ["Spring", "JUnit"], # リストも入る
"active": True # booleanも混ざる
}
なんでもあり?と思ってしまいますね。
型がバラバラなものを一つの変数に放り込める。これはJava屋からすると「型安全性の崩壊」に見えますが、Pythonではこれが日常。JSONを扱う時などは、この柔軟性が開発スピード向上を生みます。
put も get もいらない、直感的なアクセス
Javaのmap.put("key", value) や map.get("key") に慣れきった指には、Pythonのブラケット表記が新鮮(あるいは不安)に映ります。
Python: data["id"] = 102
Java: data.put("id", 102);
さらに、Python 3.9以降では | 演算子で辞書を結合できるようになりました。
merged_dict = dict1 | dict2 この「記号一つで何でも解決してやる」というアグレッシブな姿勢、Javaの冗長なメソッド呼び出しに疲れた心に、少しずつ毒のように回ってきます(笑)。
「存在しないキー」への恐怖と get() の作法
Javaの map.get("unknown") は null を返してくれますが、Pythonの data["unknown"] は容赦なく KeyError で落ちます。
nullチェックさせてくれと思うかもしれませんが、ここでJavaエンジニアが覚えるべきは get() メソッドのデフォルト値指定です。
value = data.get("unknown", "デフォルト値")
これは、Java 8の getOrDefault と同じですが、Pythonではこれが標準的な「守り」の書き方になります。
まとめ
Java10年選手が最も驚くのは、Pythonでは「ちょっとしたデータの塊なら、わざわざclass(DTO)を作らずにdictで済ませちゃう」という文化かもしれません。
Java: 「まずは User クラスを作って、フィールドを定義して、Lombokで @Data つけて……」
Python:「とりあえず user = {"name": "naka"} でOK」
この「設計より先に動かす」というスピード感に最初は戸惑うでしょう。
でも、1ヶ月も触れば、あんなに愛していたnew HashMap<String, Object>() が、煩わしいと感じられる日が来るはずです。
結論:Java10年選手へのアドバイス
Javaの知識は武器になりますが、時として固定概念が邪魔になります。
Pythonを学ぶコツは、一度「正しさを捨てる」ことかもしれません。

