- Blue-green は 2 つの完全な環境を維持し、すべてのトラフィックを一度に切り替えます。
- Canary は、最初は少数のユーザーに新しいバージョンを送信し、その後徐々に拡張していきます。
- 青緑色は非常に高速なロールバックを提供します。 Canary は、不適切なリリースが影響を与える可能性のあるユーザーの数を制限します。
- どちらも、下位互換性のあるデータベースの変更と適切な監視に依存します。
ソフトウェアのリリースは、かつてはメンテナンスの時間枠と面倒な作業を意味していました。現代のチームはリリースを日常化する戦略を採用しており、ブルーグリーン デプロイメントとカナリア デプロイメントの選択は、最初に直面する選択肢の 1 つです。どちらもリスクを軽減しますが、その方法は逆です。1 つは完全な代替品を準備し、もう 1 つは実際のユーザーを使って一度に少しずつテストします。
このガイドでは、それぞれの仕組みと実際のコストについて説明します。 Python 3.13 で小規模なユーザー ルーティングとロールバックの例を実行し、その実行から出力が得られます。 Kubernetes サンプルは例示的なものであり、私たちはそれらを実行しませんでした。パーセンテージとしきい値は、適応するための開始例として扱います。
短い答え
blue-green デプロイメントでは、2 つの同一の実稼働環境を実行します。 1 つはユーザーにサービスを提供し、もう 1 つは新しいバージョンをデプロイしてテストし、その後、すべてのトラフィックを一度に切り替えます。
カナリア デプロイメントでは、新しいバージョンが古いバージョンの隣で実行されます。実際のトラフィックの小さな割合を送信し、結果を比較し、全員にサービスが提供されるまで段階的にシェアを増やします。この名前は、かつて危険を早期に警告するために鉱山労働者が使用していたカナリアに由来しています。
ブルーグリーンとカナリアを並べて
| アスペクト | 青緑 | カナリア |
|---|---|---|
| トラフィックシフト | 一気に | 徐々に |
| 不正なリリースにさらされたユーザー | すべて、あなたが元に戻るまで | カナリアシェアのみ |
| ロールバック | トラフィックを元に戻す | カナリア共有をゼロに設定する |
| リリース速度 | 高速カットオーバー | 段階的にゆっくりと |
| インフラコスト | リリース中は最大2倍 | 少量の追加シェア |
| トラフィックルーティングが必要 | シンプルなスイッチ | パーセンテージベースのルーティング |
| 監視が必要 | 良い | バージョンごとのメトリクスを備えた優れた機能 |
| バージョンが共存する | 簡単に言うと、もしあれば | ロールアウト全体について |
| 完全リリース前の実際のユーザーからのフィードバック | いいえ | はい |
Blue-Green 導入の仕組み
- Blue はライブであり、すべてのトラフィックを処理します。
- 新しいバージョンをユーザー トラフィックを受信しない green にデプロイします。
- スモーク テストと内部ユーザーを使用して、実際の運用環境でグリーンを徹底的にテストします。
- トラフィックをグリーンに送信するようにルーター、ロードバランサー、または DNS を切り替えます。
- 青はまだ実行中で準備ができているので、注意深く見てください。
- 何か問題がある場合は、元に戻してください。すべてが順調であれば、青が次のアイドル環境になります。
Kubernetes では、Service のセレクターを変更することで切り替えを実行できるため、トラフィックは別のラベルが付けられた Pod に移動します。
apiVersion: v1
kind: Service
metadata:
name: shop
spec:
selector:
app: shop
version: green # was: blue
ports:
- port: 80
targetPort: 8000
長所: 概念的にシンプルで、ユーザーが見る前に正確な実稼働セットアップをテストでき、ロールバックはほぼ瞬時に行われます。 弱点: インフラストラクチャの重複は高価になる可能性があり、テストをすり抜けたバグは一度に全員に到達し、切り替え中に開いているセッションと実行中の作業に注意が必要になります。スイッチに DNS を使用している場合、キャッシュされたレコードによって遅延が発生する可能性があります。この概念は初めてですか? 初心者向けの Kubernetes チュートリアルをご覧ください。
カナリア デプロイメントの仕組み
- 新しいバージョンを安定バージョンと並行してデプロイします。
- トラフィックのわずかな割合 (たとえば 5%) をカナリアにルーティングします。
- エラー率、レイテンシー、ビジネス指標を安定版と比較します。
- 健康な場合は、25%、50%、100% と増加します。
- 何かが低下した場合は、すべてのトラフィックを安定したバージョンに送り返します。
多くのチームは、内部スタッフでカナリアを開始し、次に低リスク地域で、その後、より広範囲の一般向けにカナリアを開始します。
長所: 悪いリリースは少数のグループにのみ影響し、実際のトラフィックからは、テスト環境では完全に再現できないことがわかります。 弱点: パーセンテージベースのルーティングとバージョンごとのメトリクスが必要で、ロールアウトに時間がかかり、2 つのバージョンがしばらくの間一緒に実行されます。小さなカナリアは、特に交通量の少ない時間帯には、静かすぎて意味のある信号を発することができない場合もあります。
安定したユーザールーティング
リクエストごとにバージョンをランダムに選択すると、古いバージョンと新しいバージョンの間を行き来する可能性があり、ユーザーに混乱を招くエクスペリエンスを与えます。一般的な解決策は、安定したユーザー ID をバケットにハッシュして、各ユーザーが常に同じ答えを得るようにすることです。
import hashlib
def bucket(user_id):
digest = hashlib.sha256(user_id.encode()).hexdigest()
return int(digest, 16) % 100
def version_for(user_id, canary_percent):
return "v2" if bucket(user_id) < canary_percent else "v1"
users = [f"user-{i}" for i in range(10000)]
for percent in (5, 25, 50, 100):
share = sum(version_for(u, percent) == "v2" for u in users) / len(users)
print(percent, round(share * 100, 1))
# 5 5.0
# 25 24.5
# 50 49.9
# 100 100.0
実際のシェアは目標をほぼ達成しました。このメソッドにはさらに 2 つの有用なプロパティがあり、実行では両方が確認されました。同じユーザーは常に同じバージョンを受け取りました。そして、5% グループの全員は依然として 25% に含まれていたため、すでに新しいバージョンを持っていた人は展開が大きくなるにつれて戻されませんでした。
実際のシステムでは、通常、サービス メッシュ、ロード バランサー、または Argo Rollouts や Flagger などのツールがこのルーティングを処理するため、自分でルーティングを記述する必要はありません。彼らが何をしているのかを理解することは依然として役立ちます。
意思決定の自動化
Canary は、誰かが実際にバージョンを比較している場合にのみ機能します。自動チェックは、人間がグラフを監視するよりも信頼性が高くなります。以下は、カナリアのエラー率と安定版のエラー率を比較する核心的なアイデアです。
def should_rollback(canary_errors, canary_total, base_errors, base_total,
tolerance=1.5, min_requests=500):
if canary_total < min_requests:
return False # not enough data to decide
return (canary_errors / canary_total) > (base_errors / base_total) * tolerance
should_rollback(3, 100, 10, 5000) # False: too few requests
should_rollback(30, 1000, 100, 10000) # True: 3% against 1%
should_rollback(12, 1000, 100, 10000) # False: 1.2% is within tolerance
最初のケースに注目してください。エラー率は高いように見えますが、リクエストが 100 件しかないため、まだ十分な証拠とは言えません。実際のツールはより慎重な統計を適用し、いくつかの信号を一緒に調べます。
| 信号 | 例 |
|---|---|
| エラー | 5xx 回答 の割合 |
| レイテンシー | p95 と p99 で説明されているように、負荷テストとストレステスト |
| 彩度 | CPU、メモリ、接続プール |
| ビジネス | サインアップ、チェックアウト、支払いの成功 |
ヒント: 先週の数値ではなく、同じ期間の安定バージョンとカナリアを比較してください。トラフィックと行動は時間ごとに変化するため、並べて比較すると、より公平な信号が得られます。
データベースの問題
アプリケーションコードは数秒で交換できますが、データは交換できません。通常、どちらの戦略も 1 つのデータベースを共有するため、ロールアウト中およびロールバック後は、古いバージョンと新しいバージョンの両方が同じスキーマで動作する必要があります。
標準的な答えは、拡張と縮小パターンです。 name の名前を full_name に変更するとします。
- 展開: 新しい列を追加します。古いコードは影響を受けません。
- 移行: 両方の列に書き込み、古い行をバックフィルするコードをリリースします。
- スイッチ: 新しい列から読み取るコードをリリースします。
- 契約: 古い列が何も使用されなくなったら、後のリリースでは削除します。
これには数回のリリースが必要ですが、すべてのステップを安全にロールバックできます。 RENAME COLUMN を一度に実行すると、他の名前を予期していたバージョンが壊れてしまいます。長時間実行されるスキーマの変更にも、ロックが保持される可能性があるため注意してください。詳細については、SQL トランザクション を参照してください。
ローリングおよびその他の戦略
| 戦略 | 仕組み | に良い |
|---|---|---|
| 再作成 | 古いものを停止し、ダウンタイムを伴いながら新しいものを開始する | 社内ツール、バッチシステム |
| ローリング | 一度にいくつかのインスタンスを置き換える | Kubernetes を含む一般的なデフォルト |
| 青緑 | 2 つの環境を切り替える | 高速なカットオーバーとロールバック |
| カナリア | 小さなシェアを徐々に拡大 | トラフィックが多く、リスクが高い |
| シャドウ | トラフィックを新しいバージョンにコピーし、その応答を破棄します | ユーザーに影響を与えない実際の負荷でのテスト |
Kubernetes デプロイメントは、デフォルトでローリング アップデートを実行します。これは多くのサービスに適しています。ローリング アップデートも徐々に変化しますが、そのシェアはインスタンスの数に関連付けられており、それ自体で結果を分析したり、悪いメトリクスで一時停止したりすることはありません。
機能フラグについてはどうですか?
デプロイメントによってサーバーにコードが配置され、リリースによって機能がユーザーに利用可能になります。機能フラグを使用すると、何もデプロイせずに選択したユーザーに対して機能を有効にすることができ、これらを分離できます。これらは両方の戦略で非常にうまく機能します。フラグをオフにしてデプロイし、徐々に有効にします。フラグは、起動時にクラッシュするリリースからユーザーを保護できないため、これらの戦略に代わるものではありません。古いフラグは技術的負債として蓄積されるため、必ず削除してください。
選び方
| あなたの状況 | 合理的な選択 |
|---|---|
| シンプルなアプリでユーザー数も少ない | ローリングアップデート |
| 非常に高速なカットオーバーとロールバックが必要 | 青緑 |
| 切り替え前に本番環境でテストしたい | 青緑 |
| トラフィックが多く、障害によるコストが高い | カナリア |
| 強力な監視とバージョンごとのメトリクス | カナリア |
| 交通量が少ない | 青緑色、カナリア信号が弱すぎるため |
| 厳しいインフラ予算 | カナリアまたはローリング |
組み合わせることもできます。一部のチームは、グリーン環境を展開し、そこにトラフィックを徐々に移行させ、クリーンな環境と制限された爆発半径を獲得します。 GitHub アクション ガイドで説明されているように、何を選択しても、CI/CD パイプラインを通じて自動化してください。
よくある間違い
- 重大なスキーマ変更を行う。 古いコードがデータを読み取れない場合、ロールバックは役に立ちません。
- ロールバック基準がない。 インシデント中ではなく、リリースが開始される前に「悪い」の意味を決定します。
- 環境を漂わせる。 緑が青と異なる場合、テストの証明は不十分になります。 コードとしてのインフラストラクチャを使用して両方を定義します。
- 技術的な指標のみを測定します。 リリースにエラーがなくても、チェックアウトが中断される可能性があります。
- ロールバックを練習しないでください。プレッシャーにさらされたときに機能するように、リハーサルをしてください。
- バックグラウンド ジョブを忘れます。 ワーカーとスケジュールされたタスクも、切り替え中に計画が必要です。
まとめ
青緑色は、きれいで素早い切り替えを可能にします。 Canary は、少量の測定された露出を提供します。監視がまだ基本的な場合は、カナリアを試す前に、ローリング アップデートまたは Blue-Green から始めて、バージョンごとのメトリクスに投資してください。次に、データベースを含む次のリリースでのロールバックをリハーサルします。この 1 回の演習で、本当に修正が必要なものが明らかになる傾向があります。
よくある質問
ブルーグリーンデプロイメントとカナリアデプロイメントの違いは何ですか?
青緑色は、すべてのトラフィックを 1 つの完全な環境から別の完全な環境に一度に切り替えます。 Canary はトラフィックのごく一部を新しいバージョンに送信し、徐々に拡張します。
ブルーグリーンとカナリアではどちらが安全ですか?
Canary は、不適切なリリースが影響するユーザーの数を制限し、Blue-Green は非常に迅速なロールバックを提供します。より安全な選択は、トラフィック、ツール、監視によって異なります。
ブルーグリーン展開には費用がかかりますか?
リリース中に 2 つの完全な環境を実行する可能性があるため、その可能性があります。クラウドの自動スケーリングとアイドル環境のシャットダウンにより、コストを削減できます。
カナリアは何パーセントから始めるべきでしょうか?
チームは通常、意味のある信号を送信するのに十分なトラフィックを提供できる限り、約 1 ~ 5 パーセントから開始します。低トラフィックのシステムでは、より大きなシェアが必要になる場合があります。
Canary と Blue-Green はデータベースの変更をどのように処理しますか?
通常、展開や縮小などの下位互換性のある変更が含まれます。これは、両方のバージョンが 1 つのデータベースを共有する可能性があり、ロールアウト中に両方が機能する必要があるためです。
学び続ける
テスト、WordPress、または SEO についてサポートが必要ですか?
私たちは、チームがより優れたソフトウェアを出荷し、サイトを成長させるのを支援します。あなたが取り組んでいることを教えてください。明確な次のステップを提案します。
詳しいガイドはこちら テスト、AI、最新の開発
この記事は気に入りましたか?トピックを選択して、最新のチュートリアルに直接アクセスしてください。
AI 幻覚の説明: 言語モデルが物事をでっち上げる理由とそれを軽減する方法
AI 幻覚について説明しました。幻覚とは何か、言語モデルが幻覚を生成する理由、一般的な種類、グラウンディングとプロンプトで幻覚を軽減する方法、そして私たちが実行した簡単なチェックです。
記事を読む →DevOps環境変数の説明: .env ファイル、シークレット、および設定が正しく行われている
実行した Python の例を使用して環境変数について説明します。環境変数の読み取りと設定、すべての値が文字列である理由、.env ファイル、プロセスの継承、シークレット、検証について説明します。
記事を読む →ソフトウェア開発API レート制限の説明: アルゴリズム、ヘッダー、および 429 エラーの処理
API レート制限については、実行したシミュレーションで説明します。トークン バケット、固定ウィンドウ、スライディング ウィンドウ、429 応答、レート制限ヘッダー、バックオフによる再試行、およびテスト制限です。
記事を読む →テスト自動化Python でのモッキング:unittest.mock、patch、およびテストを嘘にする間違い
Python でのunittest.mockによるモック、テスト済み: モックとreturn_value、side_effect、名前が使用されている場所のパッチ、仕様と自動仕様、日付のモック、およびよくある間違い。
記事を読む →ソフトウェアテストコードカバレッジの説明: 回線カバレッジとブランチカバレッジ、および 100% の実際の意味
実際のcoverage.pyの実行でコードカバレッジを説明: 行、分岐、条件のカバレッジ、レポートの読み取り、100%のカバレッジでもバグを見逃す可能性がある理由、および賢明なターゲット。
記事を読む →データベースとSQLSQL における DELETE、TRUNCATE、DROP: 違い、ロールバック、およびそれぞれをいつ使用するか
DELETE、TRUNCATE、DROP について、テスト済み SQL を使用して説明します。それぞれの削除内容、ロールバック、トリガー、ID リセット、速度、PostgreSQL、MySQL、SQL Server、SQLite の違いについて説明します。
記事を読む →データベースとSQLSQL ビューの説明: 作成、使用、落とし穴の回避、例を示します
SQL ビューについて、実行したクエリとともに説明しました。ビューの作成、ライブ結果、列の非表示、パフォーマンス、更新可能なビューと具体化されたビュー、壊れた依存関係、ベスト プラクティスについて説明します。
記事を読む →ソフトウェア開発TypeScript インターフェイスと型: 実際の違い、コンパイラでテスト
TypeScript インターフェイスと型、実際のコンパイラでチェック: 両方でできること、片方だけでできること、宣言のマージ、拡張と交差、および従うべき簡単なルール。
記事を読む →ソフトウェア開発Python *args と **kwargs の説明: 柔軟な関数と明確な例
Python の *args と **kwargs について、実行したコードで説明しました。パッキングとアンパッキング、パラメーターの順序、キーワードのみの引数と位置のみの引数、デコレーター、一般的なエラーです。
記事を読む →ソフトウェア開発Python Lambda 関数: 構文、実際の用途、および使用すべきでない場合
Python のラムダ関数について、実行したコードとともに説明します。構文、キーによるソート、マップとフィルター、クロージャー、遅延バインディング トラップ、通常の def がより適切な選択である場合。
記事を読む →人工知能AIエージェントとは何ですか?シンプルなエージェント ループを実行できる仕組み
AIエージェントとは何ですか?エージェント ループ、ツール、メモリ、ガードレール、実行した小さな Python ループ、実際のリスク、およびシンプルなチャットボットがより良い選択である場合についてのわかりやすいガイドです。
記事を読む →DevOpsモニタリングと可観測性: ログ、メトリクス、トレースによる本当の違い
モニタリングと可観測性について説明: 既知および未知の障害、ログ、メトリクスとトレース、チェックアウト インシデントのウォークスルー、ゴールデン シグナル、OpenTelemetry、および便利なアラート。
記事を読む →DevOpsDocker ボリュームとバインド マウント: コンテナ データを正しい方法で保持する
Docker ボリュームとバインド マウントについて説明します。コンテナ データが消える理由、名前付きボリューム、バインド マウント、tmpfs、Compose の例、バックアップ、アクセス許可、およびそれぞれをいつ使用するかについて説明します。
記事を読む →テスト自動化TDD と BDD: 主な違い、1 つの機能が両方の方法で構築され、それぞれをいつ使用するか
TDD と BDD は、両方の方法で構築された 1 つの割引機能で説明されています。実行したコードによるレッド-グリーン-リファクタリング、Given-When-Then シナリオ、ツール、トレードオフ、およびそれぞれをいつ使用するかです。
記事を読む →ソフトウェアテストユーザー受け入れテスト (UAT): プロセス、チェックリスト、および実際の例
ユーザー受け入れテストの説明: 誰が実行するか、QA との違い、7 段階のプロセス、UAT テスト ケース テンプレート、チェックリスト、サインオフ基準、およびよくある間違い。
記事を読む →データベースとSQLSQL NULL 値の説明: IS NULL、COALESCE、NULLIF、および回避すべきトラップ
SQL の NULL 値について、実行したクエリで説明しました。3 つの値のロジック、IS NULL、COALESCE、NULLIF、集計、結合、並べ替えでの NULL の扱い方、およびそれが密かに引き起こすバグです。
記事を読む →データベースとSQLSQL CASE WHEN ステートメント: 構文、実際の例、およびよくある間違い
SQL CASE WHEN では、単純な検索フォーム、条件順序、SUM を使用したピボット、COUNT トリック、カスタム並べ替え、更新、回避すべき NULL トラップなど、実行したクエリを使用して説明しました。
記事を読む →ソフトウェア開発JWTとは何ですか? JSON Web トークンを実際の例で説明する
JWTとは何ですか? JSON Web トークンについて説明しました。3 つの部分、実行したコード内で構築および改ざんされたトークン、JWT とセッション、ストレージ、リフレッシュ トークン、およびセキュリティ上の間違いです。
記事を読む →ソフトウェア開発JavaScript イベントループの説明: コールスタック、マイクロタスク、タイマーと例
JavaScript イベント ループについて、実行したコードで説明しました。コール スタック、タスク キュー、マイクロタスク キュー、setTimeout 0 が即時ではない理由、ブロッキング、スターベーション、およびインタビュー クイズです。
記事を読む →ソフトウェア開発Python ジェネレーターと収量の説明: 実際の例でメモリを節約する
Python ジェネレーターと Yield について、実行したコードを使用して説明します。一時停止と再開の方法、メモリ節約の測定、パイプライン、無限シーケンス、Yield from、send、および一般的なトラップについて説明します。
記事を読む →人工知能埋め込みとは何ですか?ベクトルとコサインの類似度を簡単に説明
埋め込みとは何ですか?ベクトル、コサイン類似度、セマンティック検索に関する平易なガイド。私たちが実行した小さな例、一般的な使用法、モデルの選択、既知の制限が含まれています。
記事を読む →DevOpsBlue-Green デプロイメントと Canary デプロイメント: 違い、トレードオフ、および選択方法
ブルー グリーン デプロイメントとカナリア デプロイメントについて説明: それぞれの仕組み、コスト、リスクとロールバック、テストした安定したユーザー バケット化、データベース移行、ローリング アップデート、および選択方法。
記事を読む →テスト自動化不安定なテスト: 問題の原因とそれを永久に修正する方法
不安定なテストについては、私たちが実行したデモを使用して説明しました。主な原因、確認および診断する方法、タイミングの適切な修正、共有された状態と日付、隔離プロセスなどです。
記事を読む →ソフトウェアテスト負荷テストとストレス テスト: 違い、メトリクス、および k6 の例
ロード テストとストレス テストについて説明します。それぞれが何を証明するか、スパイク テストとソーク テスト、重要な指標、平均値が誤解を招く理由、K6 の例、テストの計画方法について説明します。
記事を読む →ソフトウェアテストテスト ケースとテスト シナリオ: 主な違い、例、およびそれぞれをいつ使用するか
テスト ケースとテスト シナリオの説明: 明確な定義、並べて表、シナリオからケースへの 1 つのパスワード リセット機能、テンプレート、およびそれぞれをいつ使用するか。
記事を読む →データベースとSQLSQL クエリの最適化: 実行プランを読み取り、タイミングを考慮して遅いクエリを修正
SQL クエリの最適化は 100 万行でテストされています。実行プランの読み取り、適切なインデックスの追加、検索対象外のフィルターの修正、複合インデックスとキーセットのページネーションの使用。
記事を読む →データベースとSQLSQL UNION と UNION ALL: 違い、例、テストされたパフォーマンス
SQL UNION と UNION ALL について、実行したクエリで説明しました。重複、両方に従うルール、実際のデータのバグ、測定されたパフォーマンス、INTERSECT と EXCEPT、およびそれぞれをいつ使用するかについて説明します。
記事を読む →ソフトウェア開発JavaScript Fetch API チュートリアル: GET、POST、エラー処理、タイムアウト
ローカル サーバーに対してテストされた JavaScript Fetch API チュートリアル: GET と POST、404 がスローされない理由、再利用可能なヘルパー、クエリ文字列、タイムアウト、CORS、およびよくある間違い。
記事を読む →ソフトウェア開発Python ファイル処理: 読み取り、書き込み、CSV、JSON、パスライブラリと例
Python のファイル処理について、実行したコードで説明します。オープン モード、大きいファイルの読み取り、CSV、JSON、パスライブラリ、バイナリ ファイル、安全な書き込み、エラー処理、およびよくある間違いについて説明します。
記事を読む →ソフトウェア開発Python のクラスとオブジェクト: 実際の例を含む OOP チュートリアル
Python のクラスとオブジェクトについて、実行したコードとともに説明します: __init__、メソッド、クラスとインスタンスの属性、継承、プロパティ、ダンダー メソッド、データクラス、およびよくある間違い。
記事を読む →人工知能大規模言語モデルとは何ですか? LLM の仕組みを誇大広告なしで説明
大規模言語モデルとは何ですか? LLM は、トークン、エンベディング、アテンション、トレーニング、温度およびコンテキスト ウィンドウ、小さな次の単語のデモ、実際の制限など、平易な言葉で説明されています。
記事を読む →DevOps初心者のための Linux コマンド: 例を含む基本ターミナル ガイド
初心者向けの Linux コマンド。ナビゲーション、ファイル、ログの表示、grep、パイプ、権限、プロセス、アーカイブなどのタスク別にグループ化されており、実用的なログ分析の例も含まれています。
記事を読む →テスト自動化Selenium と Playwright: 主な違い、コードの比較、どちらを選択するか
Selenium と Playwright の比較: アーキテクチャ、待機、ブラウザと言語のサポート、デバッグ、両方のツールでの同じテスト、移行のアドバイスと選択方法。
記事を読む →ソフトウェアテスト等価性分割: テスト設計手法を実際の例で説明
等価性パーティション化について説明しました。有効なパーティションと無効なパーティションを見つける方法、年齢、パスワード、クーポンに関する実際の例、実行したテスト、境界と組み合わせる理由。
記事を読む →ソフトウェアテストソフトウェアテストにおける重大度と優先度: 相違点、マトリックス、および実際の例
ソフトウェア テストにおける重大度と優先度について説明します。明確な定義、例を含む 4 方向のマトリックス、レベル スケール、それぞれの設定者、バグ トリアージの実行方法。
記事を読む →データベースとSQLSQL サブクエリのチュートリアル: 型、相関サブクエリ、および EXISTS と例
実行したクエリを含む SQL サブクエリのチュートリアル: スカラー、IN、FROM、SELECT サブクエリ、相関サブクエリ、EXISTS、NOT IN NULL トラップ、サブクエリ対 JOIN 対 CTE。
記事を読む →データベースとSQLSQL トランザクションと ACID の説明: COMMIT、ROLLBACK、分離レベル
SQL トランザクションと ACID について、実行した銀行振込で説明しました。COMMIT、ROLLBACK、セーブポイント、ロック、分離レベル、ダーティ リード、デッドロック、ベスト プラクティスについて説明します。
記事を読む →ソフトウェア開発Git mergeとrebaseの違い:例と使い分け
Git mergeとrebaseの違いを、実際のログ出力、比較表、rebaseの黄金律、安全なチームワークフローで解説します。
記事を読む →ソフトウェア開発Pythonのリスト内包表記:構文・例・使うべきでない場面
Pythonのリスト内包表記を解説:構文、フィルタ、if-else、ネストしたループ、実測した処理時間、そして通常のforループの方が良い場面。
記事を読む →データベースとSQLSQL JOINを例で解説(Inner・Left・Right・Full)
サンプルのテーブルとクエリでSQL JOINを順に解説。INNER、LEFT、RIGHT、FULL、CROSS、SELFに加え、よくある間違いとパフォーマンスのコツも紹介します。
記事を読む →