開発の基礎知識
さまざまな言語のコード規約、ツール設定、ベストプラクティスを習得し、プロフェッショナルな開発習慣を身につけ、コード品質とチーム協働の効率を向上させる。
Sequential Thinking を使って開発の基本を学ぶ
開発の常識は多くの側面に関わり、使用構造化思考の方法次の内容を体系的に習得するのに役立ちます:
コード規約
統一されたコード規約はコードを読みやすく、保守しやすくし、チーム協業の基盤となります。言語ごとに規約は異なるため、以下では言語別に紹介します。
命名規則
ESLint 設定
推奨 Airbnb または TypeScript ESLint 設定。
{
"extends": [
"airbnb-base",
"airbnb-typescript/base",
"plugin:@typescript-eslint/recommended",
"plugin:@typescript-eslint/recommended-requiring-type-checking"
],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"project": "./tsconfig.json"
},
"rules": {
"@typescript-eslint/no-explicit-any": "error",
"@typescript-eslint/explicit-function-return-type": "warn",
"import/prefer-default-export": "off",
"max-len": ["error", { "code": 100 }]
}
}Prettier 設定
{
"semi": true,
"trailingComma": "es5",
"singleQuote": true,
"printWidth": 100,
"tabWidth": 2,
"useTabs": false,
"arrowParens": "always"
}TypeScript の厳格モード
{
"compilerOptions": {
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true
}
}React 规范
- • 関数コンポーネントと Hooks を使用し、クラスコンポーネントを避ける
- • Props は TypeScript インターフェースで定義する
- • コンポーネント名は PascalCase を使用
- • 必要に応じて React.memo を使用してパフォーマンスを最適化
- • カスタム Hooks は `use` で始める
他の言語のクイックリファレンス
- • rustfmt(整形)
- • clippy(コードチェック)
- • snake_case 命名
- • dotnet format
- • EditorConfig
- • PascalCase 命名
- • Swift: SwiftLint
- • Kotlin: ktlint
- • Dart: dart format
バージョン管理
Git は現代開発の標準ツールです。Git のワークフロー、ブランチ戦略、コードレビューの流れを習得することは、チーム協業の基盤です。
ブランチ戦略
コミットメッセージ規約(Conventional Commits)
Git Hooks の設定
npm run lint
npm run format:check
npx commitlint --edit $1
💡 使用 husky(Node.js)または pre-commit(Python)Git Hooksを管理する
コードレビューのプロセス
依存関係の管理
プロジェクトの依存関係を適切に管理し、保守性と安全性を確保する。言語ごとに依存関係の管理方法は異なります。
セマンティックバージョニング(SemVer)
ファイル管理のロック
- • package-lock.json(npm)
- • yarn.lock(yarn)
- • pnpm-lock.yaml(pnpm)
- • バージョン管理にコミットして、一貫性を確保する
- • requirements.txt(pip)
- • poetry.lock(Poetry)
- • Pipfile.lock(Pipenv)
- • 仮想環境を使用して依存関係を分離する
依存関係セキュリティ監査
💡 使用 Dependabot または Renovate 依存関係とセキュリティパッチを自動更新する
依存関係更新戦略
- • 定期的に更新:毎月1回、古くなった依存関係を確認する
- • 安全優先:セキュリティ脆弱性のある依存関係を優先的に更新する
- • テスト駆動:更新後に完全なテストスイートを実行する
- • 段階的更新:主要な依存関係を一度に1つずつ更新し、大規模な変更を避ける
- • ドキュメント記録:重大な依存関係の更新と移行手順を記録する
エラー処理の規約
適切なエラーハンドリングにより、プログラムはより堅牢になり、ユーザー体験も向上します。言語ごとに異なるエラーハンドリングのパターンがあります。
エラー種類の分類
- • ユーザー入力エラー
- • ビジネスルール違反
- • 親切なエラーメッセージを返す
- • データベース接続に失敗しました
- • ファイルシステムエラー
- • 詳細なログを記録する
- • API 呼び出しの失敗
- • タイムアウトエラー
- • リトライ機構を実装する
エラー処理モード
try {
const result = await riskyOperation();
return result;
} catch (error) {
logger.error('操作失败', { error });
throw new BusinessError('ユーザーフレンドリーなエラーメッセージ');
}エラー処理のベストプラクティス
- • エラーの種類を明確にする:明確なエラー種別とエラーコードを定義する
- • エラーログを記録する:完全なエラー情報とコンテキストを記録する
- • ユーザーフレンドリーなヒント:ユーザーに親しみやすいエラーメッセージを表示し、技術的な詳細を隠す
- • エラー回復:再試行、フォールバックなどの復旧メカニズムを提供
- • エラー境界:エラー境界(React)またはミドルウェア(Express)を使用してエラーを一元的に処理する
ログ規約
優れたログ記録はデバッグと監視の基盤です。構造化ログにより、ログの分析と処理が容易になります。
ログレベル
構造化ログ(JSON形式)
{
"timestamp": "2025-01-27T10:30:00Z",
"level": "ERROR",
"message": "ユーザーログインに失敗しました",
"context": {
"userId": "12345",
"ip": "192.168.1.1",
"userAgent": "Mozilla/5.0..."
},
"error": {
"type": "AuthenticationError",
"message": "パスワードが間違っています",
"stack": "..."
},
"requestId": "req-abc123"
}ログコンテキスト
- • timestamp:タイムスタンプ
- • level:ログレベル
- • message:ログメッセージ
- • requestId:リクエスト ID(追跡)
- • userId:ユーザー ID
- • operation:操作タイプ
- • duration:操作にかかった時間
- • metadata:追加のメタデータ
機密情報のマスキング
- • パスワード:パスワードを絶対に記録しない、使用する
***代替 - • Token:Token の先頭数文字と末尾数文字のみ記録する
- • 身分証番号:匿名化処理、数字の一部のみ表示
- • 銀行カード番号:末尾 4 桁のみ表示
- • メールアドレス:一部のマスキングを検討できます(例:u***@example.com)
パフォーマンス最適化
パフォーマンス最適化は継続的なプロセスです。コードレベルからアーキテクチャレベルまで、最適化の余地があります。
コードのパフォーマンス最適化
- • 適切なデータ構造を選択する(HashMap vs List)
- • ネストしたループを避け、インデックスまたは Map を使用する
- • キャッシュを使用して重複計算を回避する
- • 時間計算量の分析(O(n) 対 O(n²))
- • コード分割と遅延読み込み
- • 画像最適化(WebP、遅延読み込み)
- • React.memo を使用して不要な再レンダリングを回避する
- • 仮想スクロール(長いリスト)
データベースクエリ最適化
- • よく使われる検索フィールドにインデックスを追加する
- • 過度なインデックス作成を避ける(書き込み性能に影響)
- • 複合インデックスを使用して複数フィールドのクエリを最適化する
- • 定期的にクエリ計画(EXPLAIN)を分析する
- • SELECT * を避け、必要なフィールドのみを問い合わせる
- • ページネーションを使用して、一度に大量のデータを読み込まない
- • 複数回のクエリの代わりに JOIN を使用する
- • N+1 クエリ問題を回避する
キャッシュ戦略
- • ローカルキャッシュ(Map、LRU Cache)
- • ホットデータに適している
- • メモリ制限に注意
- • 分散キャッシュ
- • 有効期限を設定
- • キャッシュの貫通/撃ち抜き/雪崩対策
- • 静的アセットの高速化
- • 画像、CSS、JS ファイル
- • エッジノードキャッシュ
パフォーマンス監視
- • APM ツール:New Relic、Datadog、Sentry(パフォーマンス監視)
- • パフォーマンス分析:Chrome DevTools、Python cProfile、Go pprof
- • 指標監視:応答時間、スループット、エラー率、リソース使用率
- • アラート機構:パフォーマンスのしきい値を設定し、しきい値を超えたら自動で警告
セキュリティのベストプラクティス
セキュリティは任意ではなく、必須です。コードレベルからデプロイレベルまで、すべての段階でセキュリティを考慮する必要があります。
入力の検証とクリーンアップ
- • Zod、Yup などのライブラリを使用してフォーム入力を検証する
- • クライアント側の検証でユーザー体験が向上する
- • ただし、フロントエンドの検証のみに依存してはいけない
- • すべての入力は検証しなければならない
- • ブラックリストではなくホワイトリストを使用する
- • ユーザー入力をクリーンアップしてエスケープする
一般的な攻撃への防御
- • パラメータ化クエリ(Prepared Statements)を使用する
- • ORM(Prisma、TypeORM)を使用
- • SQL 文字列を決して連結しない
- • 出力のエスケープ(Reactの自動エスケープ)
- • Content Security Policy(CSP)を使用する
- • dangerouslySetInnerHTML の使用を避ける
- • CSRF Token を使用する
- • SameSite Cookie 属性
- • Referer ヘッダーを検証する
- • パスワードは bcrypt、Argon2 でハッシュ化する
- • 通信は HTTPS(TLS)を使用する
- • 機密データを保存する際は暗号化する
秘密鍵管理
- • .env ファイルを使用する(Git にコミットしない)
- • .env.example をテンプレートとして使用する
- • 本番環境ではキー管理サービスを使用する
- • AWS Secrets Manager
- • HashiCorp Vault
- • Azure Key Vault
- • 定期的にキーをローテーションする
OWASP Top 10 防御
コードレビュー
コードレビューはコード品質を保証するための重要な工程です。明確なレビュー手順とチェックリストを整備し、レビューをより効率的にしましょう。
レビュー チェックリスト
- ☐ 機能は要件を満たしているか
- ☐ 境界ケースは処理されているか
- ☐ エラー処理は十分か
- ☐ テストは十分か
- ☐ パフォーマンスの問題はありますか
- ☐ データベースクエリは最適化されているか
- ☐ メモリリークはあるか
- ☐ キャッシュの使用は適切か
- ☐ 入力検証が完全かどうか
- ☐ 機密情報が漏洩していないか
- ☐ 権限チェックは正しいか
- ☐ 依存関係にセキュリティ脆弱性がないか
- ☐ コードは明確で読みやすいか
- ☐ 命名規則は適切か
- ☐ コメントは十分か
- ☐ プロジェクト規約に従っているか
レビューのベストプラクティス
継続的改善
コード品質は一度きりの作業ではなく、継続的に改善するプロセスです。品質指標と監視メカニズムを構築しましょう。
コード品質指標
- • コードの複雑さを測定する
- • 目標:< 10
- • ツール:SonarQube、CodeClimate
- • テストでカバーされているコードの割合
- • 目標:> 80%
- • ツール:Jest、Coverage.py、JaCoCo
- • コードの悪臭、重複コード
- • 定期的にリファクタリングする
- • ツール:SonarQube
自動化チェック(CI/CD 統合)
name: Code Quality
on: [push, pull_request]
jobs:
quality:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
- name: Install dependencies
run: npm ci
- name: Run linter
run: npm run lint
- name: Run tests
run: npm test
- name: Check coverage
run: npm run test:coverage技術的負債管理
- • 負債を特定する:ツールを使ってコードの臭いと重複コードを自動的に検出する
- • 優先順位付け:影響範囲と修正コストに基づいて優先順位を付ける
- • 定期的なリファクタリング:各 Sprint に一定時間を割り当ててリファクタリングする
- • 負債を記録する:Issue または技術的負債リストに記録する
- • 新たな技術的負債を避ける:コードレビュー時に技術的負債に注意する
学習成果
この章を終えると、あなたは:
- 1さまざまな言語のコード規約(TypeScript、Python、Java、Go など)とツール設定を習得する
- 2Git を使ったバージョン管理に習熟し、ブランチ戦略とコードレビューのプロセスを習得する
- 3依存関係管理の重要性を理解し、セキュリティ監査と更新戦略を習得する
- 4エラー処理とログ規約を身につけ、コードの堅牢性を高める
- 5パフォーマンス最適化とセキュリティのベストプラクティスを理解し、高品質なコードを記述する
- 6コードレビューと継続的改善の仕組みを構築し、チームのコード品質を向上させる