0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

フルスタック開発のメモ

Posted at

フルスタック開発を始めたばかりの方、あるいはこれから始めようとしている方に向けて、実務経験から得られた重要な知見をまとめました。この記事では、ベテラン開発者たちが「もっと早く知っておきたかった」と感じる重要なポイントを、実践的な例を交えながら解説します。

1. コードの品質と保守性

クリーンコードの重要性

コードの可読性と保守性は、開発の長期的な成功を左右する重要な要素です。以下の原則を意識しましょう:

# 良くない例
def p(d):
    return d * 1.1

# 良い例
def calculate_price_with_tax(base_price):
    TAX_RATE = 1.1
    return base_price * TAX_RATE

変数名や関数名に意味のある名前をつけることで、コードそのものがドキュメントとして機能します。

コメントの適切な使用

コメントの使用について、開発者の間で2つの考え方があります:

  1. できるだけ詳細にコメントを書く

    • 複雑なロジックの意図を残せる
    • 後で見返したときの理解が容易
  2. 必要最小限のコメントに留める

    • コードそのものを自己文書化する
    • コメントのメンテナンスコストを削減
    • クリーンコードの原則に従う

推奨される方法:

# なぜこの処理が必要かを説明
def calculate_user_score(user_data):
    # 法令改正(2024年4月)により、新しいスコア計算方式を導入
    # 旧方式との互換性のため、両方の計算を行う
    legacy_score = calculate_legacy_score(user_data)
    new_score = calculate_new_score(user_data)
    return max(legacy_score, new_score)

2. データベースとキャッシュの使い方

データベースアクセスとキャッシュの使用について、実務での重要なポイントを説明します。

データベースアクセス

データベースアクセスについて、2つの異なるアプローチがあります:

  1. キャッシュ重視のアプローチ:

    def get_user_profile(user_id):
        # まずキャッシュを確認
        cache_key = f"user_profile:{user_id}"
        profile = redis_client.get(cache_key)
        
        if profile:
            return json.loads(profile)
        
        # キャッシュになければDBから取得してキャッシュに保存
        profile = db.query(User).filter_by(id=user_id).first()
        redis_client.set(cache_key, json.dumps(profile.to_dict()), ex=3600)
        return profile
    
  2. 直接アクセス重視のアプローチ:

    def get_user_profile(user_id):
        # インデックスが適切に設定されていれば、
        # 単純なクエリは十分高速
        return db.query(User).filter_by(id=user_id).first()
    

どちらのアプローチを選ぶかは、以下の要因に依存します:

  • データの更新頻度
  • 一貫性の要件
  • アクセスパターン
  • インフラのコスト

キャッシュ戦略

キャッシュを使用する際の重要な考慮点:

  1. キャッシュの有効期限設定

    # 短期キャッシュ(頻繁に更新される可能性がある場合)
    redis_client.set(key, value, ex=300)  # 5分
    
    # 長期キャッシュ(あまり変更されないデータ)
    redis_client.set(key, value, ex=86400)  # 24時間
    
  2. キャッシュの無効化戦略

    def update_user_profile(user_id, new_data):
        # DBの更新
        db.query(User).filter_by(id=user_id).update(new_data)
        db.commit()
        
        # 関連するキャッシュの無効化
        cache_keys = [
            f"user_profile:{user_id}",
            f"user_settings:{user_id}",
            "users_count"  # 影響を受ける可能性のある集計キャッシュ
        ]
        redis_client.delete(*cache_keys)
    

3. バージョン管理とデプロイメント

Gitの効果的な使用

基本的なワークフロー:

# 新しい機能の開発を開始
git checkout -b feature/new-authentication

# 変更を追加
git add .
git commit -m "Add OAuth2 authentication support"

# メインブランチの最新変更を取り込む
git fetch origin
git rebase origin/main

# プルリクエストのためにプッシュ
git push origin feature/new-authentication

重要なプラクティス:

  • メインブランチへの直接プッシュを禁止
  • 意味のあるコミットメッセージの使用
  • 定期的なリベース

Dockerの活用

Dockerを使用する主な理由:

  1. 環境の一貫性確保

    FROM python:3.10-slim
    
    WORKDIR /app
    
    # 依存関係のインストール
    COPY requirements.txt .
    RUN pip install -r requirements.txt
    
    # アプリケーションコードのコピー
    COPY . .
    
    CMD ["python", "main.py"]
    
  2. マイクロサービスの分離

    # docker-compose.yml
    version: '3'
    services:
      web:
        build: ./web
        ports:
          - "8000:8000"
      
      worker:
        build: ./worker
        depends_on:
          - redis
      
      redis:
        image: redis:alpine
    

4. インフラストラクチャの選択

クラウドサービスの選択

予算と規模に応じた選択肢:

  1. スタートアップ/個人開発向け

    • Hetzner
    • DigitalOcean
    • Linode
  2. エンタープライズ向け

    • AWS
    • Google Cloud
    • Azure

CDNとストレージの活用

効率的なリソース配信:

// 画像のCDN配信例
const imageUrl = `${process.env.CLOUDFLARE_DOMAIN}/images/${imageId}`;

// バックアップストレージの使用例
const backupConfig = {
    provider: 'backblaze',
    bucket: 'my-app-backups',
    path: `${new Date().toISOString()}/database.sql`
};

まとめ

フルスタック開発では、以下の点を常に意識することが重要です:

  1. コードの品質と保守性を優先する
  2. データアクセスとキャッシュ戦略を慎重に検討する
  3. 適切なバージョン管理とデプロイメントプロセスを確立する
  4. スケールに応じたインフラ選択を行う

特に初期段階では、「完璧」を目指すのではなく、まず動くものを作り、そこから継続的に改善していく姿勢が重要です。

参考リンク

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?