高校時代のSinatraとの出会いから、今の技術選択まで

## はじめに

ふと、技術面接でよく聞かれる質問について考えていた。

「得意な言語やフレームワークについて教えてください」
「なぜその技術を選んだのですか？」

正直に言うと、最初は「使ったことがあるから」とか「人気があるから」といった程度の理由で選んでいた。でも、実際に開発を重ねていくうちに、自分の中での「選ぶ理由」が少しずつ変わっていった。

今回は、私がなぜPythonとFlaskを選んだのか、その経験と考えを共有してみたい。

## 原点は高校時代のSinatra

今でこそPythonとFlaskを使っているけれど、私の原点は高校時代に触れたRubyのSinatraだった。当時は「Webアプリケーションを作ってみたい」という純粋な興味から、手探りでRubyを勉強し始めた。

Sinatraとの出会いは衝撃的だった：

```ruby
require 'sinatra'
get '/' do
  'Hello World!'
end
```

たったこれだけで、Webアプリケーションが作れる。

「こんなにシンプルでいいの？」と思ったのを覚えている。それまでの私は、Webアプリケーションというと何か複雑で難しいものだと思い込んでいた。でも、Sinatraは違った。必要なものだけを、必要なだけ使う。その考え方に強く惹かれた。

## PythonとFlaskとの出会い

その後、大学でPythonを学ぶ機会があった。最初は正直、「なんでRubyじゃないんだろう」と思っていた。でも、実際に書いてみると、その数学的な表現力の高さに衝撃を受けた：

```python
def analyze_distribution(data):
    """確率分布の分析"""
    # 数学的な表記に近い集合内包表記
    unique_values = {x for x in data}
    frequencies = {x: sum(1 for d in data if d == x) / len(data) for x in unique_values}
    
    # 統計量の計算
    mean = sum(data) / len(data)
    variance = sum((x - mean) ** 2 for x in data) / len(data)
    
    # 数列や級数のような表現
    cumulative_prob = [sum(frequencies[x] for x in unique_values if x <= k) 
                      for k in sorted(unique_values)]
    
    return {
        'distribution': frequencies,
        'mean': mean,
        'variance': variance,
        'cumulative': cumulative_prob
    }
```

このコードを見た時、数学の教科書を読んでいるような感覚になった。特に驚いたのは、数学的な概念をそのままコードに落とし込める表現力だ。

例えば、集合の内包表記（Set Comprehension）は、数学での集合の定義とそっくりだ：

数学での表記：
```
S = {x | x ∈ R, x > 0}  // 実数の正の部分
```

Pythonでの表記：
```python
S = {x for x in numbers if x > 0}
```

さらに、NumPyを使うと行列演算も直感的に書ける：
```python
import numpy as np

# 行列の演算
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
C = A @ B  # 行列積

# 固有値計算
eigenvalues = np.linalg.eigvals(A)
```

JavaやJavaScriptでも同様の計算はできるけど、数式からコードへの翻訳が必要になる。一方Pythonは、数式をほぼそのままコードにできる。これは数値計算や機械学習のコードを書く際に大きな利点となる。

特に感動したのは、数学的なアルゴリズムの実装のしやすさだ。例えばニュートン法による平方根の計算：

```python
def newton_sqrt(n, epsilon=1e-10):
    x = n  # 初期値
    # 数学的な漸化式をそのままコードに
    while abs(x * x - n) > epsilon:
        x = (x + n/x) / 2
    return x
```

この例では漸化式がそのままコードになっている。数学者が書いた論文のアルゴリズムを、ほぼ直訳でコードに落とし込めるんだ。これらの特徴は、コードを書くことよりも、「何を実現したいのか」を考えることに集中させてくれた。

そして、PythonでWebアプリケーションを作ろうと思った時、出会ったのがFlaskだった：

```python
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello World!'
```

この瞬間、高校時代のSinatraとの出会いを思い出した。同じようなシンプルさ、同じような思想。まるで古い友人に再会したような懐かしさを感じた。

## 「できる」から「分かる」へ

最初は「Webアプリケーションが作れる」という事実だけで満足していた。でも、実際のプロジェクトで使っていくうちに、このシンプルさの本当の価値が分かってきた。

Pythonの読みやすさは：
- コードレビューでの議論が建設的になる
- 新しいメンバーがコードを理解しやすい
- バグを見つけやすく、修正しやすい

Flaskのシンプルさは：
- プロトタイプを素早く作れる
- 必要な機能を段階的に追加できる
- フレームワークの動きを理解しやすい

もちろん、課題もある。Pythonは実行速度が遅いし、マルチスレッドには制限がある。Flaskは設計の自由度が高すぎて、大規模開発では管理が難しくなる。

でも、それらの課題にも対策はある。実行速度はCythonで改善できるし、マルチスレッドの制限はマルチプロセスやasyncioで回避できる。Flaskの自由度は、Blueprintでの適切な分割や、アプリケーションファクトリパターンの採用で管理できる。

## 今、面接で聞かれたら

今、技術選択の理由を聞かれたら、こう答えると思う：

「私がPythonとFlaskを選んだのは、高校時代にSinatraで学んだ『必要最小限のシンプルさ』という考え方に強く共感したからです。実際のプロジェクトで使っていく中で、このシンプルさは単なる便利さ以上の価値があることに気づきました。

コードの読みやすさは、チームでの開発効率を上げ、保守性を高めます。必要な機能だけを持つという思想は、プロジェクトの要件に合わせた最適な構成を可能にします。

もちろん、実行速度やマルチスレッドの制限といった課題もありますが、それらへの対策方法も理解しています。これらの特性を活かして、まずはMVPを素早く作り、そこから段階的に機能を追加していくアプローチを取ることが多いです。」

## 終わりに

技術選択に「正解」はないのかもしれない。でも、なぜその技術を選んだのか、どう使っているのか、そして何を学んできたのか。それを自分の言葉で語れることは、とても大切だと思う。

最初は「使ったことがあるから」で始まった技術選択も、実際に使い続けることで、その価値や課題、そして自分なりの活用方法が見えてくる。それを素直に語ることが、技術面接では求められているのではないだろうか。