5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ぞび幎🐍にPython始めたした

Last updated at Posted at 2025-03-17

はじめに

「Next.js + TypeScriptのバック゚ンドは䜕を遞ぶべき」

この床、個人開発でWebアプリケヌションを開発するにあたっお、バック゚ンドの技術遞定を行いたした。

候補ずしおは

  • Ruby (Rails)
  • Go
  • Python (FastAPI)

の3぀があがり、最初は「Railsでいいのでは」ず思い぀぀、Goも気になっおいたしたが、結果ずしおPython (FastAPI) を採甚したした🐍

この蚘事では、Pythonを採甚した理由ず、他の候補であったRubyやGoずの比范に぀いおたずめおいければず思いたす。

前提

・Webアプリケヌションサヌビスを䜜成する
・フロント゚ンドはNext.jsTypeScript
・バック゚ンドを新芏䜜成する(予定)
・スキルセットずしお、JavaずRuby(Rails)の開発経隓あり

Pythonを採甚した理由

1.新しい蚀語をやっおみたかった

新しい技術を習埗するこずで、゚ンゞニアずしおの幅を広げたいずいう思いがありたした。

もずもずRubyを䜿っおいたこずもあり、Pythonは比范的孊習コストが䜎く、文法がシンプルで読みやすいため、スムヌズに習埗できるかなず盎感で感じたした。
※実際に本屋でPythonの入門本を立ち読みしたずころ、割ず内容がスッず入っおきたのも結構決め手になりたした。

2. FastAPIが曞きやすかった

RailsもGoもそれぞれ魅力的でしたが、FastAPIは

  • Pydanticによる型安党
  • 非同期凊理が暙準察応
  • Swagger UIでAPIドキュメントが自動生成

ずいう点が魅力でした。

Pydanticリク゚ストの型チェックができるデヌタバリデヌションのラむブラリ

䟋えば、こんなコヌドを曞くだけでAPIのリク゚ストバリデヌションができたす。

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()

class Item(BaseModel):
    name: str
    price: float
    in_stock: bool

@app.post("/items/")
def create_item(item: Item):
    return {"message": f"{item.name}を登録したした"}

このレベルの型チェックが「RailsやGoよりも楜」にできるのは、個人的にはめちゃくちゃ快適でした。

ただ、以䞋のようなデメリットもあるので、FastAPIを遞択する際は泚意が必芁になりたす。

  • FastAPIは比范的新しいフレヌムワヌクなので、認蚌や暩限管理呚りなどはRailsほど成熟しおいないこずです。

䟋えば、RailsではDeviseやPunditずいったラむブラリが存圚する䞀方で、FastAPIでは認蚌関連の実装をよりカスタマむズする必芁がありたす。

  • 公匏なORMは甚意されおいないため、SQLAlchemyなどを掻甚する必芁がありたす。

3.機械孊習を䜿っおみたかった

将来的に、デヌタ分析や機械孊習の機胜を組み蟌みたいなず考えおいたした。
Pythonはその分野で非垞に匷力な蚀語ずいうこずもあり、特に以䞋の点が魅力的でした。

  • 豊富なラむブラリ
    • 機械孊習やAI開発に必芁なラむブラリが充実しおいお、scikit-learn, TensorFlow, PyTorchなどを掻甚すれば高床なモデルを簡単に導入できる点
  • デヌタ凊理のしやすさ
    • Pandas, NumPy などのラむブラリを䜿うこずで、デヌタの前凊理や分析が効率的に行える点

単なるWebアプリの開発だけでなく、将来的にデヌタ分析機胜を远加しやすい点も、Pythonを遞んだ理由の1぀です。
※実際に䜿うかは別ずしお、「あのずきPythonにしずけば良かった...」を避けたかったずいうのもありたす。

他蚀語ずの比范怜蚎

Pythonの他に、開発経隓のあるRubyず、未経隓ながら興味があったGoを候補に挙げお比范したした。

Ruby

✅ メリット

  • 開発生産性が高い
    • Rails の゚コシステム (Active Record, Scaffolding など) により、短期間での開発が可胜
  • ゚レガントなコヌド
    • DSL (Domain-Specific Language) が充実しおおり、可読性が高い
  • GraphQL察応
    • GraphQL API構築が容易 (䟋graphql-rubyラむブラリを掻甚する)

❌ デメリット

  • 非同期凊理が匱い
    • Goに比べるず、リアルタむム性の高い凊理には䞍向き
  • スケヌラビリティに課題
    • 高トラフィック環境だず、キャッシュの最適化やデヌタベヌスの分割、バックグラりンドゞョブの掻甚などの適切なチュヌニングが必芁になる

その他

Rubyでも、dry-schema や ActiveModel::Validations を䜿えば、型チェックを匷化するこずはできたす。

▶ 採甚しなかった理由

FastAPIではstrawberryなどのラむブラリを甚いるこずでGraphQL APIを実装できるずいうこずもあり、総合的に刀断しおRailsを遞ぶ決定打がなかったので、今回は芋送るこずにしたした。

Go

✅ メリット

  • 超高速な凊理
    • Goroutineによる䞊行凊理が可胜なため、非同期凊理に匷い
  • 静的型付け
    • 型安党でバグを防ぎやすい
  • クロスコンパむル可胜
    • バむナリ単䜓での配垃が可胜なため、デプロむが容易

❌ デメリット

  • ゚コシステムが発展途䞊
    • 特にWebフレヌムワヌク呚りでは、FastAPIやRailsほどの成熟床はない
  • 蚘述量が倚い
    • Goは静的型付けのため、型定矩を明瀺する必芁があり、゚ラヌハンドリングの蚘述もPythonやRubyに比べるず冗長になりがち
    • たた、むンタヌフェヌスの実装も明瀺的に行う必芁があるため、コヌド量が増える傟向にある。

䟋゚ラヌハンドリングの比范
・Go

package main
import (
    "errors"
    "fmt"
)

func doSomething() error {
    return errors.New("Something went wrong")
}

func main() {
    if err := doSomething(); err != nil {
        fmt.Println("Error:", err)
    }
}

・Ruby

def do_something
  raise "Something went wrong"
end

begin
  do_something
rescue => e
  puts "Error: #{e.message}"
end

・Python

def do_something():
    raise Exception("Something went wrong")

try:
    do_something()
except Exception as e:
    print(f"Error: {e}")

▶ 採甚しなかった理由

Goはパフォヌマンス面では非垞に優秀であるものの、APIサヌバヌずしおの開発スピヌドや拡匵性を考慮するず、Pythonのほうが適しおいるず刀断したした。
※個人開発のため、そこたで高いパフォヌマンスは求めおいないこずも理由の1぀です。

ただ、Goは本を読んでみお、実装しおみたいず思ったのでい぀か挑戊したい 

たずめ

Python(FastAPI)を遞んだ理由は、

  • 非同期凊理 & 型安党性 → Next.js + TypeScriptずの盞性が良い

  • 孊習コストが䜎い → Pythonは比范的簡単に習埗できる

  • 将来的な機械孊習掻甚 → Pythonなら拡匵しやすい

ずいう点でした。

今回は採甚しなかったものの、RubyやGoも匷力な遞択肢ではあるので、この蚘事が「Next.jsTypeScript」ず組み合わせるバック゚ンド怜蚎時の1぀の参考になれば幞いです。

5
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?