システム開発において、開発、検証、ステージング、本番環境の違いを理解することは非常に重要です。
こちらの記事では、この4つの環境の必要性について解説します。
そしてこの4つの環境と密接な関係にあるのがCI/CD(Continuous Integration/Continuous Delivery)です。CI/CDは1つの技術を指すものでなく、ソフトウェアの変更を常にテストして自動で本番環境にリリース可能な状態にしておくソフトウェア開発の手法を意味します。
CI/CDについての詳細は以下のリンクからご覧いただけます。
https://envader.plus/article/44
システム開発における4つの環境
開発システムの規模やチームにより異なる場合がありますが、以下の4つに基本的に分けることができます。
- 開発環境
- 検証環境
- ステージング環境
- 本番環境
この4つの環境には、どのような意味があり必要性があるのでしょうか?
システム開発での開発環境とは
システム開発における開発環境とは、Dockerを使用したローカル環境やクラウド環境で共同開発するなど、システムやソフトウェアを開発するにあたり欠かすことのできない作業環境のことを意味します。表現として、devやdevelopなどと呼称されることがあります。この開発環境がなければ、システムやソフトウェアの開発を進めていくことは不可能です。
開発環境は次の2つに分けて考えることができます。
開発環境におけるハードウェア
これは、実際に存在する物理的な機器のことを指します。具体的には、パソコン・モニター・キーボード・マウスなどが挙げられます。モバイルデバイスであるスマートフォン、タブレットなどもハードウェアとして該当します。
開発に必要なハードウェアは、開発対象のアプリケーションや開発手法によって異なるため、適切に選定する必要があります。
開発環境におけるソフトウェア
ハードウェア上で動作するプログラム全般を指します。
ソフトウェアの種類としては、以下の4つに大別することができます。
-
コンパイラやインタプリタ、デバッガなどのツール
コンパイラやインタプリタ、デバッガは開発に欠かすことのできないソフトウェアツールです。
これらのツールを使用することで、プログラムをコンピュータが理解できる状態へ変換すること(コンパイル)や、プログラムのバグを発見・修正する作業(デバッグ)を行うことができます。
-
テキストエディタ
テキストエディタは、コンピュータ上でテキストファイルを編集するソフトウェアのことです。基本的な機能である入力・編集・保存ができることはもちろん、ファイル内の検索機能や置換機能、自動補完機能など様々な機能を備えていることが特徴です。
また、拡張機能を使用すればプログラミング言語のシンタックスハイライトやソースコードの自動整形などを利用することができ、より便利に利用することが可能です。
テキストエディタの主な種類には、Vim、Emacs、Atom、Sublime Textなどが挙げられます。
-
統合開発環境(Integrated Development Environment、IDE)
プログラム実行環境、テキストエディタなど開発に必要なツールや機能を一つのパッケージにまとめたソフトウェアのことです。開発を進める上で必要な機能を統合的に提供することで、開発作業を効率化することができます。
統合開発環境が提供する機能を以下の表にまとめました。
機能 詳細 ソースコードエディタ ソースコードを編集するための機能を提供。コード補完やシンタックスハイライトなどの機能が含まれる。 デバッガー プログラムの実行時にエラーやバグを発見するための機能。ブレークポイントの設定やステップ実行の設定などが可能。 ビルドツール コンパイルやリンク、ビルド設定の管理などを行うことが可能。 バージョン管理ツール Gitなどのバージョン管理システムに対応した機能が含まれている。ソースコードの変更履歴の管理、ブランチの作成などを行うことができる。 統合開発環境が無い時代には、これらの機能を別々に利用していたため開発作業が非効率でした。この統合開発環境を利用することで、より効率的に開発を行うことができるようになります。
主な種類には、EclipseやVisual Studio、Xcodeなどがあります。
また、クラウドサービスとして提供されている統合開発環境を利用することも可能です。通常統合開発環境を準備するには自身のPCにインストールする必要がありましたが、クラウド型のIDEを利用すればインストールせずに開発を進めることができます。
基本的にクラウドIDEは対応しているブラウザでアクセスするため、ブラウザさえあれば簡単に開発を始めることができます。主なクラウドIDEには、AWS Cloud9やGitHub Codespacesなどがあります。
事前にどのようなプログラミング言語を使用するのか、開発するシステムに必要なツールとは何なのかを理解し環境構築をすることで、ストレスなく効率的に開発を進めることができるようになります。
検証環境(テスト環境)とは
システム開発における検証環境とは、システムが正しく動作するかどうかの検証作業を行う環境のことです。それぞれの開発環境で作られたシステムのテストをするための工程になり、誤記やリンクミスなどのチェックを行い、適宜修正していく段階になります。testing environmentと呼ばれます。
検証環境でテストを行うことで、本番環境へソフトウェアをリリースする前に問題を発見し、修正することができます。こうすることで、ソフトウェアの信頼性が向上し、本番環境での問題が発生する確率を抑えることができます。
検証環境が必要な理由とは
開発環境で動くようになったシステムには、バグが含まれている可能性が非常に高いため、検証環境で様々なテストを行います。
検証環境では単体テストや結合テストなどを行い、個別のプログラムが正しく動作しているかどうかや、複数のプログラムを連携させた際に正しく動作するかをテストします。主なテストの種類や内容を以下の表へまとめました。
名称 | 内容 |
---|---|
単体テスト | システム単体で行われるテスト。「ユニットテスト」とも呼ばれる。個別のプログラムの機能が正しく動作しているかどうかを検証する。 |
結合テスト | 複数のプログラムを連携させた際に正しく動作するかを検証する。単体テストが終了した段階で行うテスト。単体テストでは発生しないバグを見つけることができる。 |
総合テスト | 開発したシステム全体で正しく動作するかを検証する。できるだけ本番に近い環境で実施することが望ましい。 |
確認テスト | システムの修正時に、変更していない箇所に影響が出ていないかどうかを検証する。機能修正を実施する際には必ず行われる。 |
評価テスト | システムの操作性、脆弱性などを検証する。擬似的な障害を発生させ、障害が発生した際にもシステムが動作するかなどの検証も行う。 |
負荷テスト | システムが過負荷状態になった際にも問題なく動作するかを検証する。アクセスが集中した時などを想定して検証が行われる。 |
これらのテストを行うことで、本番環境へリリースする前にバグや問題点を発見し、修正することができます。そして、本番環境でトラブルが起きるリスクを最小限に抑えることができ、システムの品質向上やリスクの最小化を図ることができます。
ステージング環境とは
ステージング環境とは、本番に限りなく近い環境を用意してテストを行う環境のことで、staging environmentと呼ばれます。検証環境では単体テストや結合テストを行い、プログラムを一つずつチェックしていきます。対してステージング環境では、プログラム全体の動作を確認していくイメージです。
システム開発における品質テストの最終工程に位置するステージング環境は、品質を保証する(Quality Assurance)という点から、QA環境とも呼ばれます。
ステージング環境が必要な理由
検証環境では問題なく動作していたのに、本番環境では正常に動作しないといったケースを防ぐためにステージング環境が存在します。実際に、テスト環境では正常に動作していたのに、ステージング環境では動作しないといったケースは少なくありません。
ステージング環境はハードウェア、OS、ネットワーク環境などを本番環境により近い環境を用意するため、検証環境とは違い精度の高いテストを実施することが可能になります。
ただし、本番環境と同じか近い環境を用意するということは、それだけコストが掛かってきてしまうことも考えられます。開発していく中でコストを掛けることが不可能だった場合に、取れる最善策はどのようなことがあるのかを考えておくことも大切です。
本番環境とは
本番環境とは、サービスを一般公開して、ユーザーが実際に利用できる状態にした運用環境のことです。production environmentとも呼ばれます。システム開発においては、検証環境やステージング環境を経て、最終的に本番環境にシステムを移行する流れが一般的です。この、開発中のシステムを本番環境へ移行して実際に稼働させることを「デプロイ」「デプロイメント」と呼びます。
本番環境においては、不具合やエラーが生じた場合、迅速かつ正確に対応することが求められます。
本番環境で運用していく際に必要な役割
本番環境では、以下のような役割が求められます。
-
安定性
本番環境では、システムが安定して稼働することが非常に重要です。例えば、設計段階ではどのように運用していくのか、運用パターンを整理しておくことで想定していなかった異常が発生するのを防ぐことができます。
また、デプロイする前に検証環境やステージング環境でしっかりとテストを行った後で、本番環境へデプロイする必要があります。
-
パフォーマンス
本番環境ではステージング環境などとは異なり、多くのユーザーがサービスを利用するため、高いパフォーマンスが求められます。サーバーの構成やネットワークの設定を最適化し、ロードバランサーを使用した負荷分散やキャッシュを利用して、レスポンスを速くすることが重要です。
-
セキュリティ
本番環境では、ユーザーのデータやシステムが外部からの攻撃や不正アクセスに対して保護されることが求められます。そのため、セキュリティ対策や脆弱性のチェックを行い、定期的にアップデートやパッチを適用することが重要です。それ以外にも、WAFやファイアウォールの設定なども必要になってくるでしょう。
WAFについては以下の記事をご覧ください。
-
監視と運用
本番環境では、システムの動作状況をリアルタイムで監視し、問題が発生した際に迅速に対応できるよう運用体制を整えることも求められます。ログやアラートを活用して、障害の発生を早期に検出し対応することが重要です。
以上のように、本番環境はシステム開発において非常に重要な役割を果たしています。開発者は、安定性・パフォーマンス・セキュリティ・監視・運用の面で、最適な環境を構築しサービスを提供することが求められます。
まとめ
今回は、システム開発をする上で理解しておかなければいけない4つの環境について解説しました。
開発環境とは、Dockerを使用したローカル環境やクラウド環境で共同開発するなど、システムやソフトウェアを開発するにあたり欠かすことのできない作業環境のこと。
検証環境とステージング環境はそれぞれテストを実施するための環境であること。ステージング環境では本番環境により近づけた環境でテストを行うことで、本番環境での予期しない不具合を事前に検出し対処すること。
本番環境は最終的にエンドユーザーが利用するサービスが提供される環境で、サービスの安定性・パフォーマンス・セキュリティ・システムの監視や運用が求められてくること。
これらの環境を使用することで、開発者は段階的にソフトウェアを開発・テスト・デプロイし、高品質なサービスを提供することができます。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2022.12.29
内部設計の目的と成果物
内部設計とは、外部設計を実現するシステム内の処理・構造を決めることです。
- アーキテクティング
2022.12.29
外部設計の3つの設計対象…機能・非機能・方式
外部設計とは、ユーザーから見たシステムの振る舞いを決めることです。例えば画面や操作方法等です。
- アーキテクティング
2023.01.31
アジャイル開発とは?他の開発手法とどう違うの?
アジャイル開発とは、個人との対話・動くソフトウェア・顧客との協調・変化への対応を重視するソフトウェア開発です。
- アーキテクティング