このレッスンでは、課題を段階的に整理して具体的な手順に落とし込む「アルゴリズム」と、それをコンピューターで実行するための「プログラミング」について学びます。
これまで学んだように、現代では顧客管理やデータ分析、在庫管理など、さまざまな場面でアプリケーションが活用されています。これらのアプリケーションを形作るスキルが、アルゴリズムとプログラミングです。
ビジネスパーソンにとっても、アルゴリズムやプログラミングを学ぶメリットは大きいです。
プログラミングを学ぶことは、単にソースコードの書き方を覚えるだけではありません。その背後にあるプログラミング的な考え方や、アプローチの方法(アルゴリズム)を理解することが重要です。その上で、プログラミング言語での実装方法を学ぶことで、ビジネスの現場で汎用的に役立つ課題解決力を身につけることができます。このレッスンで、順番に学んでいきましょう。
アルゴリズムとプログラミングの基礎、システムとプログラムの関係を正しく理解すること
プログラミング思考 とは、プログラムを書く前に行なう「問題解決のための考え方」のことです。
プログラミングを行なう際、最初からいきなりソースコードを書くのは難しいものです。しかし、プログラミング思考をもとに問題を論理的に分解し、順序立てて解決策(アルゴリズム)を見つける方法を理解しておくと、プログラミングをよりスムーズに進めることができます。
順番に確認していきましょう。
最初に、大きな問題を小さなサブタスクに分解します。大きな問題は、そのままでは解決が難しいですが、小さなサブタスクに分解して順番に解決することで、最終的に全体の問題を解決できます。

以下のように進めると良いでしょう。
例えば「送料込価格を計算する」という問題があるとします。問題の内容は以下の通りです。
この問題に対して、最初からいきなりソースコードを書くのは難しいでしょう。そこで、まずは問題を小さなサブタスクに分解します。分解結果は以下のようになります。
大きな問題を分解することで、1つ1つのサブタスクで行なうことが、明確になりましたね。
次に、サブタスクをコンピューターが処理できる形式で表現します。
コンピューターは非常に単純で、「データを受け取って、加工し、出力する」ことしかできません。この仕組みを組み合わせることで、すべての処理を表現します。

以下のように進めると良いでしょう。
アルゴリズム は「問題解決の手順」を意味します。プログラミングにおいては、入力データを所定のルールで処理し、最終的に望む結果を出すまでの一連の流れを指します。
プログラミング思考で整理した「データを受け取って、加工し、出力する」流れを整理したものがアルゴリズムです。重要な要素は以下です。
制御構文 とは、プログラムの流れを制御するための基本的な仕組みです。制御構文には「逐次処理、条件分岐、繰り返し」の3種類があります。

変数 はデータを一時的に保存する箱のようなものです。コンピューターは、人間のように抽象的な情報を覚えておけないため、はっきりとした置き場である変数が必須となります。変数は、データを加工した結果をあとで使いたい場合に使用します。
配列 は、同じ種類のデータをまとめて扱うための箱の集まりです。繰り返しと組み合わせて使うと、同じ処理を一括で行なうことができます。
先ほどの「送料込価格を計算する」問題を、コンピューターが処理できるアルゴリズムとして表現してみましょう。それぞれのサブタスクは「データを受け取って、加工し、出力する」流れで考えます。また、データを加工した結果をあとで使いたいサブタスクでは変数を使用します。【】 で囲った部分が変数です。
税抜価格や税込価格、送料は、あとの処理で使うので、変数に代入しています。送料込価格は表示するだけで、あとの処理では使わないため、変数には代入していません。
プログラミング思考を身につけると、以下のようなメリットが得られます。
プログラミング思考は、身近なテーマで身につけることが可能です。
フローチャート は、タスクの手順やデータの流れを「記号」と「矢印」で表現する方法です。複雑な処理や複数の選択肢がある場合でも、図形や分岐線を使うことで可視化できるため、多様な業務やプログラミングの場面で利用されています。
フローチャートの例:

前のチャプターで取り上げた「プログラミング思考」において、タスクをいかに分解し、どの順序で処理すべきかを考えることが重要とお伝えしました。フローチャートを用いると、このプロセスを誰が見てもわかる形で可視化できます。
ここでは、フローチャートのメリットと作図ツール、基本的な記号や構造、そして実際の書き方について確認します。
フローチャートには、以下のようなメリットがあります。
フローチャートを作成するには、以下のようなツールを使うと便利です。
PowerPoint や Google Slide などのオフィスソフトを使う場合は、「挿入」タブの「図形」メニューから「フローチャートの記号」を選んで配置し、カギ線コネクタなどの矢印を使って手順をつなぎます。オフィスソフトはビジネスの現場で広く使われているため、誰でも気軽に始められます。

ブラウザ上で利用できるサービスが多く、インストール不要で共同編集もしやすいのが特徴です。基本的なフローチャート記号だけでなく、さまざまなテンプレートやオブジェクトが用意されているため、プロ並みの図を簡単に作れます。
プログラミングで良く使われる VS Code というエディタの拡張機能を使うと、テキストベースでフローチャートを記述できます。
記述にはMermaidやplantumlなどの記法が用いられます。
テキストで記述したフローチャートの例(Mermaid形式):
graph TD
Start[開始] --> Step1[ステップ1: 作業を開始]
Step1 --> Step2{条件を満たしているか?}
Step2 -- はい --> Step3[次のステップを実行]
Step2 -- いいえ --> Step4[条件を再確認]
Step4 --> Step1
Step3 --> End[終了]
フローチャートでは、処理の開始・終了、判断、入出力などに対応した記号を使います。

一般的に、フローチャートは上から下へ向かって処理を並べます。左右に広げて描く場合もありますが、最終的にはどこかでゴール(終了)にたどり着く線形構造が基本です。分岐がある場合は、判断の記号(ひし形)を使って「Yes」「No」のようにルートを分けます。
先ほどの「送料込価格を計算する」問題のアルゴリズムを、フローチャートで表現してみましょう。
「送料込価格を計算する」問題のアルゴリズムを再掲します。
フローチャートで表現すると、以下のようになります。
とても、わかりやすく表現できましたね。
フローチャートでは、より抽象度の高い業務フロー(業務の流れ)も表現できます。
ECサイトでの注文受付から発送までの業務フロー
ECサイトでは、お客さまが注文を行なってから実際に商品の発送準備が完了するまで、いくつかのステップが存在します。一連のフローを大まかに整理してみましょう。
フローチャートで記述してみましょう。
このように、複数のタスクが含まれる業務フローも、フローチャートで整理するとわかりやすくなります。
アルゴリズム は、問題を解決するための明確な手順を指します。
私たちが日常で行なう作業のなかにも、小さなアルゴリズムが数多く存在しています。たとえば「財布の中から小銭を取り出して合計金額を計算する」「本棚に並んだ書籍をあいうえお順に並べ替える」といった流れも、立派なアルゴリズムです。
プログラミングにおいては、この手順をコンピューターが実行できる形でコーディングし、入力から出力までを効率よく処理することが求められます。どのようなアルゴリズムを選ぶかで、処理の速度やメモリ使用量といったパフォーマンスが大きく変わります。取り扱うデータが増えれば増えるほど、アルゴリズムの優劣が結果に大きく影響するのです。
ここでは、代表的なアルゴリズムを確認し、効率性やプログラム全体に与える影響について整理します。
数値の配列を入力し、それらの合計値を求めます。
配列の要素を1つずつ取り出して加算していくのがポイントです。
数値の配列を入力し、合計値を求めてから、要素数で割り平均値を算出します。
配列の要素を1つずつ取り出し、合計(sum)に加算するとともに、要素数(count)にも1を加算するのがポイントです。
数値の配列を入力し、全要素の中から最大値(または最小値)を見つけます。
配列の最初の要素を初期値とし、配列の要素を1つずつ取り出して、より大きい(または小さい)値が見つかれば更新するのがポイントです。
ここでは最大値版を示します。最小値の場合は 要素 > maxValue? を 要素 < minValue? に変えるだけです。
入力された整数が「偶数か、奇数か」を判定します。
実際の処理としては「入力数 % 2 == 0 なら偶数、そうでなければ奇数」とします。
剰余で判定するのは「整数」や「ある数の倍数」などの判定にも応用できます。
繰り返しはないため、単純なフローです。
文字列を後ろから読み取って、新しい文字列として構成し直します。
配列の先頭から1つずつ順番に探していきます。目的の要素を見つけたら処理を終了し、見つからなければ配列の末尾まで続けます。実装が容易ですが、最悪の場合、全要素を調べるため、データ数が多くなると時間がかかります。
あらかじめ配列がソートされていることを前提に、要素を中央で半分に分けて、探索対象がどちらのグループに含まれるかを判定します。不要な半分を切り捨てて、残りの半分を再び二分して調べる操作を繰り返します。データ数が n の場合、探索にかかる手順は最大でも log2(n) 程度に抑えられ、線形探索よりも高速なことが多いです(ただし、ソートが必要な点にも注意)。
隣同士の要素を比較し、大きい(あるいは小さい)方を後ろ(または前)へ入れ替えていくことで、配列全体をソートします。
バブルソートは、配列を何度も走査し、隣接する2つの要素を比較しながら並べ替えます。隣り合う要素が逆順なら交換し、これを配列の末尾まで行なったあと、もう一度先頭からやり直すのを必要回数繰り返します。理解しやすい反面、大量データにはあまり効率的ではありません。
バブルソートは「外側ループ」と「内側ループ」の2重ループになります。
分割統治法(Divide and Conquer)の一種です。基準となる要素(ピボット)を決め、そこより小さい要素と大きい要素を分割し、それぞれのグループに対して再帰的に同じ処理を繰り返すことでソートを進めます。うまくいけば高速に処理が進みますが、データの状態によっては性能が落ちることもあります。
入力された整数が素数かどうかを調べます。素数判定には以下のルールがあります。
プログラムは、ユーザーからの入力や外部システムからデータを受け取り、アルゴリズムに従って処理を進め、最終的に出力を生成します。そのため、アルゴリズムの選択や設計は、プログラム全体のパフォーマンスやメンテナンス性を左右します。
アルゴリズムの良し悪しを数値化して比較するために、Big-O表記(オーダー表記)という概念が用いられます。これは、データ数 n に対するアルゴリズムの処理ステップが、どの程度増加するかを大まかに示す記号です。たとえば、要素をすべて調べる探索の計算量は O(n)、二分探索は O(log n)、バブルソートは最悪で O(n^2) などと表現されます。
例:1000人の名簿から特定の人を探す
O(n))。log2(1000) 回程度の比較で済みます(およそ10回程度)。データ量が膨大になると、この差が圧倒的な時間の開きとなります。したがって、プログラムのパフォーマンスを考えるうえで「どのくらいの計算量がかかるのか」を意識することは非常に重要です。
短期間での開発を優先して単純なアルゴリズムを採用する場合もあれば、将来的な拡張性を重視して高速なアルゴリズムを組み込むケースもあります。状況に応じて最適な選択を行なうためにも、アルゴリズムの基礎を理解することが大切です。
プログラミング言語 は、コンピュータに指示を与えるために使用される人工的な言語のことです。
レッスン2で学んだように、プログラムは通常、「高水準言語」と呼ばれる、人間にとって理解しやすい表現を用いるプログラミング言語で書かれます。プログラミング言語は、私たちが考えたアルゴリズムを、コンピューターが理解できる形へ変換するための手段となります。
プログラミング言語には、さまざまな種類があります。ビジネスアプリケーションを支えるものから、Webサイトの動的な演出を担うもの、機械学習分野を得意とするものなど、用途によって最適な選択肢が異なります。
ここでは、プログラミング言語の仕組みや代表的な言語、コードを読みやすく保守しやすくする工夫、ソースコードをチームで管理する方法などについて確認します。
プログラミング言語は、大きく分けて「コンパイル型言語」と「インタプリタ型言語」に分類できます。
両方とも、人間が記述したソースコードを、コンピューターが理解できる形(機械語)に変換しますが、その変換方法に違いがあります。

最初に、「ソースコード」と「実行ファイル」の違いを押さえておきましょう。
ソースコードは、プログラミング言語で書かれたテキスト形式の「指示書」です。以下のように英単語や記号を使って、コンピューターに行なってほしい処理を記述します。
Pythonのソースコードの例:
a = 5 b = 3 result = a + b print(f"足し算の結果: {result}")
ソースコードは人間が読める形ですが、そのままでは、コンピューターは理解できません。そこで、ソースコードを機械語へ変換してコンピューターが実行できる形にする必要があります。
コンパイル型言語 は、「コンパイラ」と呼ばれるソフトウェアを使って、ソースコードを機械語に一括して変換(コンパイル)して「実行ファイル」を生成します。
変換後の実行ファイルは、拡張子が .exe や .out などのファイルとなり、これをダブルクリック(またはコマンド)で実行します。
インタプリタ型言語は、ソースコードを「インタプリタ」と呼ばれるソフトウェアが読み取り、逐次(その場で)機械語に変換して実行する方式です。
コンパイル型言語のような「実行ファイル」は生成せず、代わりに、インタプリタを通してソースコードを動かすイメージです。
プログラミング言語は用途や設計思想によって多岐にわたります。主なプログラミング言語を紹介します。
データ分析や機械学習、Web開発など幅広い分野で利用されます。シンプルな文法と豊富なライブラリが魅力で、初心者にも取り組みやすい言語です。インタプリタ型であるため、対話型の開発・実験がしやすく、AIやサーバーサイドなどの領域で盛んに使われています。
業務システムやAndroidアプリ開発などで根強い人気を持つコンパイル型言語です。オブジェクト指向の思想がしっかり組み込まれ、規模の大きいプロジェクトでも保守しやすいとされています。動作環境として「JVM(Java仮想マシン)」があり、一度コンパイルしたコードはさまざまなOSで実行可能です。
速度やメモリの制御がシビアな分野(ゲーム開発、組込みシステム、高性能計算など)で広く利用されるコンパイル型言語です。C言語の後継としてオブジェクト指向やテンプレート機能を追加しており、優れた実行性能を発揮します。その反面、文法が複雑で学習コストが高めです。
ブラウザ上で動作するスクリプト言語として発展してきました。HTMLやCSSと組み合わせ、Webページを動的に制御する用途で用いられます。現在ではサーバーサイドの Node.js 環境でも動作し、フルスタック開発が可能な言語になりました。
これらは厳密にはプログラミング言語ではありませんが、Web開発において欠かせない要素です。HTML はページの構造や要素を定義し、CSS は見た目の装飾を担当します。ロジックを記述するものではないため、たとえばループや条件分岐などは持ちませんが、JavaScriptと組み合わせてWebアプリを構築する際に重要です。
これら以外にも、Ruby や Go、Rust など、注目される言語は数多くあります。プロジェクトの目的やチームのスキルセットによって選択は異なるため、「人気があるから」という理由だけで決めるのではなく、保守性や将来性、コミュニティの活発さなどを総合的に評価することが大切です。
プログラミング言語を選んだとしても、誰もがすぐ理解できるコードになるとは限りません。「コードの書き方やスタイル」は読みやすさに大きく影響します。複数の開発者が参加するプロジェクトでは、共通のコーディング規約や命名規則などを決めておくことが一般的です。
コーディングスタイル とは、ソースコードを書く際の一貫性のあるルールやガイドラインのことです。これにより、コードの可読性や保守性が向上し、複数の開発者が協力して作業する際に混乱を避けることができます。
ソースコード内に、「この変数はなぜ必要なのか」「なぜこのアルゴリズムを選んだのか」など、処理の意図や前提条件などをコメントとして書いておくと、あとからコードを読んだ人(あるいは自分自身)が理解しやすくなります。
ただし、コード自体がわかりやすく書かれていれば、コメントは最低限で済ませるほうがよい場合もあります。ドキュメント化の範囲や粒度は、チームの規模やプロジェクトの特性に合わせるのが基本です。
リファクタリング とは、動作するコードの構造を整理・改善して可読性や保守性を高める作業です。
動作要件を変えずに、不要な重複コードをまとめたり、複雑な関数を分割したりする作業が該当します。大規模プロジェクトでは、リファクタリングを定期的に行なうことで、開発が進むにつれて肥大化しがちなコードを健全に保ちます。
バージョン管理 とは、ソースコードや資料などのファイルが「いつ・誰によって・どのように」変更されたのかを自動で記録・追跡できる仕組みです。
ソフトウェア開発では、バージョン管理が不可欠です。特に複数の人が同じコードを同時に編集する場合、誰がどの部分を変更したのかがわからないと、作業が衝突したり、原因不明のバグが生まれてしまうことがあります。バージョン管理を使うことで、こうした混乱を防ぎ、変更履歴をいつでも振り返ることができるようになります。
Git は、世界で最も広く使われているバージョン管理システムの1つです。Gitの特徴は「分散型」という点で、以下のような仕組みで作業を進めることができます。
企業で行なうシステム開発や、オープンソースプロジェクトでは、GitHubやGitLabなどの「リモートリポジトリ」サービスがよく利用されます。各開発者は以下のように作業します。
こうすることで、誰がどの部分をいつ変更したのかをかんたんに追跡でき、複数人が同時に開発していてもスムーズに統合できるメリットがあります。
それでは、実際にプログラミングを体験してみましょう。
今回は paiza.io を利用します。
paiza.ioは、ブラウザ画面でプログラミングが行なえるサービスです。通常、プログラミングを行なう際は、パソコンにさまざまなツールをインストールして開発環境を構築する必要がありますが、paiza.ioは、すぐにコードを書いて実行できるので便利です。
paiza.ioのトップページ にアクセスし「コード作成を試してみる(無料)」のボタンをクリックしてください。なお会員登録すると、自分の作ったコードを一覧で確認できるので便利です。

エディター画面の左上で「Python3」を選択すると準備完了です。

最初は、簡単な足し算を行なうプログラムを作成してみましょう。
2つの数値を足し合わせ、その結果を出力します。
Pythonのソースコードは以下のようになります。
x = 1 y = 2 result = x + y print(result)
それぞれの行が、フローチャートと対応していることがわかります。
x = 1 は、x に 1 を「代入」するという意味です。プログラムでは = は「等しい」ではなく「代入」の意味になります。x や y、result」は、自由に決めることができます。print() は、カッコの中に指定された値を出力する命令です。print(result) で「result を表示する」という意味になります。3
次は、条件分岐を行なってみましょう。
入力された整数が「偶数か、奇数か」を判定します。
Pythonのソースコードは以下のようになります。
# 整数を入力 n = 9 # 剰余を計算して判定 if n % 2 == 0: print("偶数です") else: print("奇数です")
ひし形で示した条件分岐を if で実装し、条件が満たされる場合とそうでない場合で処理がわかれています。
if 条件: で書きます。# 以降はコメントです。n に代入する値を、いろいろと変えて試してみましょう。
奇数です
次は、条件分岐を行なってみましょう。
数値の配列を入力し、それらの合計値を求めます。
Pythonのソースコードは以下のようになります。
# 配列を用意 array = [1, 2, 3, 4, 5] # 初期値を設定 sum = 0 # 配列の要素を1つずつ取り出して加算 for num in array: sum += num # 合計値を出力 print("合計:", sum)
[1, 2, 3, 4, 5] のように書きます。for 要素名 in 配列(リスト): で書きます。合計: 15
最後に、実用的な例にチャレンジしてみましょう。チャプター3で取り上げた「送料込価格を計算する」問題のフローチャートを実装します。
「送料込価格を計算する」問題のフローチャートを再掲します。
Pythonのソースコードは以下のようになります。
# 税抜価格を入力 price_ex_tax = 1800 # 税込価格を計算 price_incl_tax = price_ex_tax * 1.1 # 送料を計算 if price_incl_tax >= 2000: shipping_fee = 0 else: shipping_fee = 350 # 送料込価格を出力 total_price = price_incl_tax + shipping_fee print("送料込価格は", total_price, "円です")
if 条件: で書きます。else: で書きます。送料込価格は 2330.0 円です
企業や組織で運用されている業務システムやWebサービスは、単体のプログラムがそのまま動いているわけではありません。複数のプログラムやミドルウェア、外部サービスなどが組み合わさって動作し、ユーザーが求める処理やデータ連携を実現しています。
たとえば、売上データを夜間にまとめて計算するバッチ処理や、リアルタイムにアクセスして情報を返すWebアプリケーションなど、多彩な処理形態が存在します。プログラミングを学んだうえで視野をシステム全体に広げると、個々のプログラムがどんな役割を担い、どうやって全体のサービスを支えているのかが見えやすくなります。
このチャプターでは、システムの構成要素や代表的な処理形態、プログラム開発におけるテストやデバッグの必要性、そして性能やコストといった評価指標を整理します。プログラムを単体で動かすだけではなく、ビジネスの現場で安定して稼働させるために、どのような観点が求められるかを確認しましょう。
システム とは、複数のプログラムやデータベース、ネットワーク、ハードウェアなどの要素が結びついて、特定の目的を達成する仕組みです。
たとえば、ブラウザから商品を購入できるECサイトでは、ユーザーが入力した注文情報を受け取るWebアプリケーション、在庫データを扱うデータベース、決済を担う外部サービスなどが連携し、全体として「商品の注文から決済まで」を自動化します。
ここでは、さまざまな観点から、システムの構成と処理形態について確認しましょう。
システムのなかでは、複数のプログラムが役割分担して動いています。フロントエンド(画面表示やユーザー操作)を担当するプログラムと、バックエンド(データベースアクセスやビジネスロジック)を担当するプログラムに分かれる例も多いです。また、以下のように、処理するタイミングによって大きく2つに分類できます。
プログラムが実行されるサーバー環境にも多様な選択肢があります。オンプレミス(自社サーバー)やクラウド(AWS, Azure, GCPなど)での稼働、あるいはコンテナ技術(DockerやKubernetesなど)を使う場合もあり、それぞれの特性を踏まえた運用が求められます。近年はクラウドインフラを活用し、負荷の変動に合わせてサーバー台数を柔軟に増減させる仕組みを取り入れる企業も増えています。
システムが停止しないように冗長構成を取ることは重要です。ハードウェアやソフトウェアに障害が起きた場合でも、別の系統ですぐに処理を引き継ぐことでサービス継続を目指します。代表的な構成例は次のとおりです。
システムを支えるうえで、データをどのように保管・保護するかも重要です。サーバー内のハードディスクやSSDを単体で運用するだけでなく、RAIDやNASを用いて冗長性や拡張性を高める方法があります。
RAID(Redundant Array of Independent Disks)
複数のディスクを組み合わせて、信頼性や性能を向上させる仕組みです。以下のようなレベルがよく使われます。
ほかにもRAID2〜4などの方式がありますが、実際に使われることは少なく、実運用ではRAID1/5/6がよく利用されます。
NAS(Network Attached Storage)
ネットワーク上に直接接続されたストレージ機器のことです。ファイルサーバー的に複数のクライアントからアクセス可能で、容量や台数を柔軟に増やすことができます。クラウドストレージやオンプレミスのNASを活用することで、大量データの共有やバックアップを行ないやすくなります。
システムの動作形態として、処理を直列的に行なうか、並列的に行なうかという視点も重要です。
システム開発では、「ライブラリ」や「フレームワーク」を活用することで、大量のコードを自作せずに効率よく機能を組み上げられます。さらに「API」を利用することで、外部サービスや別のシステムと連携がしやすくなります。
ライブラリ は、汎用的な機能やクラス、関数がまとまった部品集です。たとえば、Pythonの標準ライブラリには文字列操作や日付処理などが用意されており、すぐに呼び出して使えます。
フレームワーク は、アプリケーション全体の構造や基本的な流れを提供し、その上に独自のロジックを組み込める仕組みです。Webアプリを構築するフレームワークとしては、Pythonなら Django や Flask、Javaなら Spring、JavaScriptなら Express や Next.js などが有名です。フレームワークを使うと、ログイン機能やデータベース接続、ページ遷移などの定型処理を簡単に追加できます。
API(Application Programming Interface)は、プログラム同士がデータや機能をやり取りするためのインターフェースです。
多くの場合は、RESTやGraphQLなどの仕組みを用いて、HTTP経由でデータ交換を行ないます。たとえば天気情報APIからデータを取得すれば、自作アプリで天気予報を表示できます。また、地図や決済、音声認識など、専門性が高い機能を外部サービスからAPIとして呼び出すことで、開発コストを大幅に削減できます。
ライブラリやAPIの使用には、以下のようなメリットがあります。
システムの信頼性や品質を確保するには、「テスト」と「デバッグ」が欠かせません。個々のプログラムが単体で正しく動くかどうかだけでなく、システム全体の連携や運用時の負荷、エラー発生時のリカバリなど、多角的に確認する必要があります。
テストは、規模ごとに大きく3つの種類に分けられます。

バグが見つかったら、その原因を突き止めて修正します。ログを出力したり、デバッガツールを使って変数の状態を追いかけたりするのが一般的です。テスト環境をローカルやステージングサーバー上で用意し、デバッグが完了してから本番環境に反映するフローを組むことで、ユーザーへの影響を最小限に抑えられます。
コードレビューや自動テスト(CI/CD)などを導入すれば、開発者が修正や新機能を追加するたびに自動でテストを回せます。問題があれば早期に気づけるため、不具合の混入リスクを下げられます。大規模な企業システムでは、テスターや品質管理部門がシナリオテストやリグレッションテストを実施し、リリース直前まで念入りに検証する体制を整えていることが多いです。

システムを本番運用する際には、性能面だけでなく信頼性や可用性、さらにコストなど、多角的な評価が求められます。
プログラム単体では問題なく動作していても、システム全体の観点で見ると改修が必要になる場合もあるため、総合的な視点での検証が不可欠です。
一度に多数のユーザーがアクセスしてきてもレスポンスが遅くならないようにする必要があります。Webアプリケーションでは、1秒未満の応答を目指すケースが多いでしょう。処理速度に影響する要因として、プログラムのアルゴリズムやデータベースのインデックス設計、サーバーのスペックなどが挙げられます。性能を最適化することは、ユーザー体験の向上だけでなく、システム全体の効率にも関わってきます。
システムが停止したり不正なデータを出力したりすると、ビジネスに大きな影響を及ぼします。障害発生時にどう対処するか、復旧時間をいかに短縮するかといった運用面の設計が重要です。
障害から障害までの平均稼働時間(MTBF)が長いほど故障が少なく、平均修復時間(MTTR)が短いほど復旧が早いと判断できます。
クラスタリングや冗長構成(同じ処理ができるサーバーを複数台用意する)といった対策を取ることで、これらの指標をより良くすることが期待されます。
MTBF(平均故障間隔)
MTBF は「故障と故障の間(正常稼働している時間)の平均」を表す指標です。値が大きいほど故障までの時間が長い、つまり故障が起きにくい(信頼性が高い)システムといえます。計算式は以下のとおりです。
たとえば、あるシステムを 1,000 時間運用している間に、合計 5 回の故障が発生したとします。このときの MTBF は200時間となります。つまり「およそ 200 時間に 1 回」の頻度で故障が起きていることになります。
MTTR(平均修復時間)
MTTR は、システムが故障したときに、それを修復して再び稼働状態に戻すまでにかかる時間の平均を表します。値が小さいほど復旧が早い、つまり保守・運用体制が優れているシステムといえます。計算式は以下のとおりです。
上記と同じシステムで、5 回の故障の修復時間がそれぞれ 1 時間、2 時間、1 時間、3 時間、2 時間だったとします。合計修復時間は 1 + 2 + 1 + 3 + 2 = 9 時間です。つまり、このシステムが故障した場合は平均して約 1.8 時間 で復旧していることになります。
稼働率 は、システムが「利用可能な状態にある割合」を示す指標です。MTBF と MTTR から計算できるため、システムの「停止しにくさ(故障の少なさ)」と「復旧の早さ」の両方をまとめた評価指標といえます。稼働率が高いほどシステムは止まりにくく、止まっても素早く復旧できることを意味します。計算式は以下のとおりです。
先ほどの例で「MTBF = 200 時間、MTTR = 1.8 時間」と求めました。このときの稼働率は、約98.23%となります。つまり、100 時間の稼働のうち約 98.23 時間はシステムが動いている(利用可能な)状態です。
開発コストだけでなく、サーバー利用料や保守・運用にかかる人件費などを総合的に考える必要があります。
稼働率や信頼性を高めるほどコストは増大しがちなので、システムの重要度や予算に応じて最適なバランスを検討することが大切です。
このレッスンでは、ビジネスや日常業務のさまざまなシーンでアプリケーションが活用されており、その基礎となるのが「アルゴリズム」と「プログラミング」であることを学びました。複雑な問題を細かく分解し、最適な手順(アルゴリズム)を設計し、その手順をコンピューターが理解できる形(プログラミング)で実装する流れが、効率的な業務オペレーションや新しいサービス創出の土台になります。
単純な計算処理やデータ抽出に限らず、大量データの分析や高度な自動化を行なうときにも、アルゴリズムとプログラミングが重要な役割を果たします。ビジネスパーソンがこうした基礎を理解しておくと、エンジニアに的確な依頼を出せるだけでなく、自分たちの業務に合った改善策を主体的に考え、実装や導入をリードできるようになります。
このレッスンで学んだことを振り返り、理解度を確認しましょう。
下記の5つの質問に答えてください。「回答フォーマット」をコピーして、コメント欄に記入して提出してください。
回答フォーマット
1.
2.
3.
4.
5.