ホーム 第6章 · アルゴリズム
第6章 · テクノロジ

見つからない受注を、手順から追いかける。

「動きません」だけの報告では、開発側も直せない。葵は井上の説明を聞きながら、変数、配列、探索、並替えを小さなデータで追い、不具合が起こる条件を探します。

4つのテーマ14項目11の図解
この章の目次・学習項目

この章も、新卒コンサルタントの葵と先輩の佐伯が、大手メーカー「アステラ製作所」の受注・生産・出荷をつなぐ案件に取り組みます。

会話と図解で読み進め、詳しい説明は各項目で開けます。

01
「いい感じにやって」は、機械に伝わらない

「開発のことは分かりません」で、止まらない

実装の言葉を知り、業務の期待を具体的に伝える。

開発レビュー|画面と処理の確認

井上がコードを開くと、葵は少し身構えた。自分はコンサルタントなのだから、実装は専門家に任せればいいと思っていた。

佐伯
先輩ITコンサルタント

全部を書ける必要はないよ。でも、何をしてほしいかと、何が起きたかを伝えられると、調整はずっと進む。

新卒ITコンサルタント

分からないところをまとめて「技術的な話」にせず、一つずつ聞いてみます。

プログラム・ソースコード・言語プロセッサ

プログラムがどんな形で書かれ、実行できる形になるかを確認する。葵はコンパイラとインタプリタの違いを、処理の段階として整理した。

人が書いたソースコードを、コンピュータが実行できる形に変換・処理する。

01人が書き、実行できる形へ変換する
高水準言語のソースコード人が読み書きしやすい形
言語プロセッサ翻訳や実行を行うソフトウェア
機械語などの実行形式CPUが処理できる命令へつながる
コンパイラ
コードをまとめて別の形式へ翻訳します。
インタプリタ
コードを解釈しながら実行します。
詳しい説明・条件・具体例

プログラムは、コンピュータへの命令を組み立てたものです。それを書くための言葉がプログラミング言語で、JavaやPythonなどがあります。記述した命令文をソースコードと呼びます。

コンパイラ
コードをまとめて別の形式へ翻訳します。実行前に機械語へ変換する方式が代表例です。
インタプリタ
コードを解釈しながら実行します。必ず原文を一行ずつ機械語へ直すだけ、という仕組みではありません。

実際には中間コードや実行時コンパイルを組み合わせる処理系もあります。高水準言語そのものをCPUが直接理解しているわけではありません。

新卒ITコンサルタント

修正したソースコードがあるのに、端末では古い動きをしています。直し忘れでしょうか。

井上
開発会社のPM

まず、実際に配布された版を確かめましょう。書いたものと、実行されているものが同じとは限りません。

新卒ITコンサルタント

ソース、実行できる形にする処理、配布先を分けて追うんですね。動かした版も報告に添えます。

HTML・CSS

見出しの意味と、色や配置の変更を一つの要望に混ぜていた。葵はHTMLとCSSの役割を分けた。

HTMLは見出しや段落などの構造、CSSは色や配置などの見た目を指定する。

<h1>出荷のお知らせ</h1>
<p>標準部品は11時に出荷します。</p>
02ブラウザが組み合わせて表示する
HTML見出し・段落・リンクなどの意味と構造
CSS色・余白・配置・文字の見た目
詳しい説明・条件・具体例

マークアップ言語は、タグなどを使って文章やデータに構造・意味を付けます。HTMLでは定められた要素で見出しや段落を示し、XMLでは目的に合わせた要素名でデータを構造化できます。

ブラウザはHTMLやCSSなどを解釈し、Webページを表示するソフトウェアです。内容と見た目を分けると、スマホなど画面幅が違っても、同じ内容を読みやすく配置できます。

新卒ITコンサルタント

「見出しが変です」では伝わりませんね。見出しとしての構造は合っていますが、幅が狭いと文字が切れています。

井上
開発会社のPM

それなら、HTMLの構造を変える話と、CSSの表示を直す話を分けられます。切れる幅も教えてください。

新卒ITコンサルタント

はい。同じ文字と画面幅で確認できるようにします。説明が少し具体的になってきました。

葵は見た目の問題と処理の問題を分けて報告した。

井上
開発会社のPM

どちらを直す話か分かるので助かります。この画面の件は、表示条件と見た目を分けて確認しますね。

専門家へ任せるためにも、共通の言葉が必要だった。

ちょっと考えてみよう見出しの意味を表すのはHTML、文字色や余白を指定するのは?考え方をひらく +

CSSです。HTMLの意味・構造と、CSSの見た目の役割を分けます。

02
データの置き方で、取り出し方が変わる

三番目を直したつもりが、四番目を変えた

値の持ち方と、順番の約束を確かめる。

検証用データ|参照位置の確認

研修のサンプル点数を変更する操作で、三番目を指定したつもりが四番目を変えてしまった。葵は画面の行番号と見比べた。

井上
開発会社のPM

この処理は0から数えます。三番目を指す添字は2です。画面に出す行番号とは分けています。

新卒ITコンサルタント

0から数える約束を見落としていました。画面の何番目と、内部の番号を同じだと思っていました。

佐伯
先輩ITコンサルタント

気付ければ直せる。入力と、途中の値と、結果を残して確認しよう。

変数・代入

代入を、数学の等号と同じ意味に読んでいた。葵は右辺を今の値で計算してから、左辺へ入れる順を追った。

右側を今の値で計算してから、左側の変数へ入れる。数学の等式とは読み方が違う。

x ← 3
x ← x + 5
詳しい説明・条件・具体例

変数は、値を名前で扱うための仕組みです。変数に値を設定するのが代入。擬似言語では「←」で表すことがあります。

xの中身を追う

  1. 最初の代入で、xは3になります。
  2. 次の行は、右辺の「今のx+5」を先に計算します。3+5=8。
  3. 計算結果8をxへ入れます。最終的なxは8です。

途中の値を記録すれば、画面の結果だけでは見えない誤りを説明できる。再現手順に、変更前の状態も添えるようにした。

配列・添字

配列の95、75、85、79、90を使い、どの要素を変えるかを指で追った。添字の始まりは問題や言語の約束で違う。

複数の値を並べて持ち、添字で場所を指定する。添字が0始まりか1始まりかを確かめる。

03ここでは添字を1から数える
添字12345
得点9575857990
詳しい説明・条件・具体例

配列は、複数の値を並べて扱うデータ構造です。一つ一つの領域が要素、位置を示す番号が添字(インデックス)です。開始番号は言語や問題の定義によって0または1などになります。

この例でscores[4]は79。scores[3] ← 60とすれば、3番目の85を60に上書きします。配列全体を入れ替えるのではなく、指定した一要素を更新します。

新卒ITコンサルタント

scores[3]なので、三番目の85を変える……この例なら、それでよいですね。

井上
開発会社のPM

はい。この例は1始まりです。0始まりの配列なら、同じ添字3は四番目になります。

新卒ITコンサルタント

同じ書き方でも約束が違うんですね。位置を伝えるときは、先に添字の始まりを確認します。

キュー・スタック

印刷指示を受けた順に処理するのか、直前の操作を先に戻すのか。葵はキューとスタックを、取り出す順番の違いとして比べた。

キューは先に入れたものから取り出す。スタックは後に入れたものから取り出す。

04A、B、Cの順に入れたら?
キュー|FIFO取り出す順番:A → B → C
先入れ先出し
スタック|LIFO取り出す順番:C → B → A
後入れ先出し
詳しい説明・条件・具体例

キューは、先に受け付けた注文を先に処理する行列のイメージです。スタックは、積み上げたトレーの上から取り出すイメージ。戻る操作や処理途中の情報の保存などにも使われます。

田中
物流担当

出荷ラベルは、先に送ったものから印刷してほしいです。新しい指示が先に出ると、箱との対応を間違えそうなので。

新卒ITコンサルタント

その取り出し方はキューですね。一方、操作を取り消すなら、直前の操作から戻すスタックの考え方が合います。

田中
物流担当

どちらも「順番に」と言っていましたが、逆向きなんですね。

新卒ITコンサルタント

はい。何を先に取り出すかまで、要件に書きます。

木構造

カテゴリの下に商品があり、拠点の下に担当者がいる。葵は親子の関係を、横に並んだ一覧とは分けて説明した。

一つの根から、親子関係で枝分かれする構造。組織やフォルダの階層を表せる。

05商品を、階層で分類する
製品
機械部品軸受・歯車
制御部品センサ・リレー
ノード(節)
データを表す点。
エッジ(枝)
ノード同士の関係を表す線。
ルート(根)
木の最上位にあるノード。
リーフ(葉)
子を持たない末端のノード。
詳しい説明・条件・具体例
ノード(節)
データを表す点。
エッジ(枝)
ノード同士の関係を表す線。
ルート(根)
木の最上位にあるノード。
リーフ(葉)
子を持たない末端のノード。

配列が位置で並べて扱うのに対し、木構造は階層関係を扱います。フォルダの整理などにも、この考え方が現れます。

小野
生産管理責任者

このカテゴリを移したら、下の商品もまとめて移るんでしょうか。

新卒ITコンサルタント

そこを確かめたいです。横に並んだ一覧と違って、親子関係を持つので、配下へ影響する操作があります。

井上
開発会社のPM

どの範囲を一緒に扱うかを、図で示して確認しましょう。

新卒ITコンサルタント

拠点と担当者の関係も同じですね。見た目の位置だけ変えるつもりで、関係まで変えないようにします。

葵はデータの位置、受付順、階層の基準を仕様の欄へ追記した。何となく一列に並ぶデータにも、扱い方の約束があると分かった。

ちょっと考えてみようA、B、Cを順にスタックへ入れた後、一つ取り出すと?考え方をひらく +

最後に入れたCです。スタックは後入れ先出し。キューなら最初に入れたAが出ます。

03
手順を追えば、答えは途中で見えてくる

再現しない不具合を、再現できる説明へ

分岐と繰返しの途中を追い、原因の場所を絞る。

不具合の確認|画面共有でのレビュー

葵の最初の報告は「ときどき数が違います」だった。井上は再現できず、調査が止まった。

井上
開発会社のPM

こちらでは同じ結果になりません。最初に入っていた値と、押した順番を教えてもらえますか。

葵は入力、操作順、期待値、実際の値をそろえて、もう一度連絡する。

新卒ITコンサルタント

この初期値で三回繰り返すと、ここで一回多く更新されます。途中の値も表にしました。

井上
開発会社のPM

この条件なら、こちらでも確認できました。最後に一回多く進むところを調べます。

井上がうなずいて画面を拡大した。会話が、やっと同じ場所から始まった。

アルゴリズム・流れ図

受付条件を文章からフローチャートへ移すと、在庫がない場合の表示が空欄だと分かった。

目的を達成する手順を、順次・選択・繰返しで組み立てる。図にすると分岐が追いやすい。

06ひし形の条件から、二つへ分かれる
在庫を読み、在庫が0より大きいなら受注受付、そうでなければ売切れ表示へ分岐する。在庫を読む在庫 > 0 ?はいいいえ受注を受ける売切れを表示
順次
指定した順番で処理する。
選択
条件に応じて処理を分ける。
繰返し
決めた条件の間、同じ処理を繰り返す。
詳しい説明・条件・具体例

アルゴリズムは、問題を解くための処理手順や考え方です。同じ目的にも、複数の手順があります。プログラミング言語、流れ図、擬似言語などで表現できます。

順次
指定した順番で処理する。商品を選び、カートへ入れ、決済へ進むなど。
選択
条件に応じて処理を分ける。
繰返し
決めた条件の間、同じ処理を繰り返す。

流れ図(フローチャート)では、開始・終了、処理、判断などの記号を、矢印で結びます。条件の両方の行き先を書き、実行順序を読み取れるようにします。

アルゴリズムは、正常に進む道だけの説明ではない。分岐の両側をたどり、顧客の期待と突き合わせた。

繰返し処理

三回処理するつもりの繰返しが、四回動いていた。葵は初期値、条件の確認時点、更新を順番に読んだ。

開始値・続ける条件・値の更新を確かめる。条件を先に調べるか後に調べるかでも、回数が変わる。

x ← 1
for (i を 1 から 3 まで 1 ずつ増やす)
    x ← x + 1
endfor
07一回ずつ増える値を記録する
時点ix
開始前未設定1
1回目の後12
2回目の後23
3回目の後34
詳しい説明・条件・具体例

初期値1、増分1、終値3なら、i=1、2、3の3回です。「終値まで含むか」「条件を処理前に調べるか処理後に調べるか」を確認します。終了条件が変化しなければ、無限ループになることもあります。

始まりと終わりの条件が分かると、境界の試験が作れる。0件、1件、上限のときも確認するようになった。

トレース

頭の中で追うと途中の値を取り違える。葵は小さな例でxとyを表に書き、分岐と繰返しごとに値を残した。

命令を一つずつ実行したつもりで、変数の値を表に書く。頭の中だけで追わない。

x ← 1
y ← 3
if (x < y)
    x ← x + 4
else
    y ← x + 2
endif
for (i を 1 から 3 まで 1 ずつ増やす)
    x ← x + 1
endfor
08選ばれなかった側は実行しない
処理の後xy
初期代入13
x < y の判断13
x ← x + 453
ループ1回目63
ループ2回目73
ループ3回目83
詳しい説明・条件・具体例

トレースは、処理を順に実行したときの変数や配列の変化を追うこと。表の行に処理、列に変数を置けば、代入前と代入後の混同を減らせます。

条件は1<3なので真。else側のy ← x+2は実行しません。最後はx=8、y=3です。図の見た目や行数ではなく、実際に通った経路を記録します。

井上
開発会社のPM

結果が違ったところより、一つ前の値を見せてもらえますか。

新卒ITコンサルタント

ここです。あ……この行で、更新前のxを使っていました。

葵は表の一行だけを消し、そこから先をもう一度追った。

新卒ITコンサルタント

どこまでは合っていたかが分かると、全部をやり直さずに説明できますね。

井上
開発会社のPM

その表があれば、実装の問題なのか、読み方の違いなのかも一緒に確かめられます。

修正後は同じ条件で再確認し、正常な場合も壊れていないかを見た。葵は、コードを全部書けなくても、不具合を解く作業に参加できる手応えを感じた。

ちょっと考えてみようx=2から、x ← x+3を4回繰り返す。最後の値は?考え方をひらく +

2+3×4=14です。トレースすると5、8、11、14と変わります。

04
探す手順、並べる手順にも選び方がある

速い方法にも、使える前提がある

探索と並替えの性質から、条件を確認する。

性能の相談|受注一覧の検索

件数が増えると検索が遅くなると聞き、葵は覚えたばかりの二分探索を口にした。

井上
開発会社のPM

この一覧は、検索キーでは並んでいないんです。その方法を使うなら、並びを保つ方法も考える必要があります。

新卒ITコンサルタント

方法だけ知って、前提を確認していませんでした。まず、どう整理されているデータかを見ます。

会議後、葵は「余計なことを言ってしまいました」と佐伯に話した。

佐伯
先輩ITコンサルタント

知った方法を試して考えたことは悪くないよ。ただ、方法を決めて渡す前に、何を改善したいかを一緒に確かめよう。

新卒ITコンサルタント

受注番号で探すときに、何件を何秒以内で見つけたいか。そこから相談し直します。

線形探索

前から一件ずつ確認する探索を、少ないデータで追う。葵は最初、中間、最後、見つからない場合を確認した。

先頭から一つずつ比べて探す。データが順番に並んでいなくても使える。

12, 3, 17, 5, 8, 14, 21, 6, 9, 1, 19
詳しい説明・条件・具体例

線形探索は、一つずつ順番に調べる方法です。並びが整っていなくても使えますが、見つからない場合や最後にある場合は、全要素を調べます。

14を探す

  1. 12 → 3 → 17 → 5 → 8と、順に比較する。
  2. 6番目の14で一致。ここで探索を終える。

一般に、要素数が増えると最悪の場合の比較回数も比例して増えます。少量のデータや、順序付けされていないデータでは、単純で使いやすい方法です。

小野
生産管理責任者

同じ検索でも、すぐ見つかるときと時間が掛かるときがあります。

新卒ITコンサルタント

前から一件ずつ探す方法なら、対象の位置で確認回数が変わります。探した名前と、全体の件数を教えていただけますか。

小野
生産管理責任者

見つからなかったときも記録したほうがよいですか。

新卒ITコンサルタント

ぜひお願いします。先頭、途中、末尾、見つからない場合を分けて確認します。

二分探索

並んだデータなら範囲を半分ずつ絞れる。葵は、中央の比較から次の範囲を選ぶ動きを手で追った。

整列済みのデータを、中央との比較で半分ずつ絞る。整列していることが前提。

1, 3, 5, 6, 8, 9, 12, 14, 17, 19, 21
0914があり得る範囲を狭める
全体の中央は914 > 9なので、右半分だけ残す
12・14・17・19・21中央17より14は小さいので、左を残す
12・14中央の取り方に従って比較し、14を見つける
詳しい説明・条件・具体例

二分探索は、昇順または降順に整列したデータに対し、中央との比較で探索範囲を半分ずつ絞る方法です。昇順は小さい順、降順は大きい順です。

新卒ITコンサルタント

半分ずつ絞れば速いので、全部この方法にしたくなります。

井上
開発会社のPM

ただし、比較する順に並んでいることが前提です。受注を追加した後も、その順序が保たれていますか。

新卒ITコンサルタント

追加の動きまでは見ていませんでした。二分探索を使う条件と、更新の処理を一緒に確認します。

選択ソート

最大を見つけて先頭へ置き、残りを繰り返す。葵は並替えの途中も書き、完成後の順番だけを見る癖を直した。

未整列の範囲から最大や最小を選び、端へ置く。この例は、最大を選んで大きい順に並べる。

10未整列の範囲を、一つずつ縮める
段階並び
開始12, 3, 17, 5, 8
17を先頭へ17, 3, 12, 5, 8
次の最大1217, 12, 3, 5, 8
次の最大817, 12, 8, 5, 3
完成17, 12, 8, 5, 3
詳しい説明・条件・具体例

降順にしたいなら、未整列の範囲から最大値を選び、先頭と交換します。次は残った範囲で繰り返します。昇順なら最小値を選びます。

選択ソートを追う練習は、処理を途中の状態に分ける練習でもあった。誤った結果から、どの段階で崩れたかを考えられる。

バブルソート

隣同士を比べるバブルソートでは、一回の走査で何が移動するかを確かめた。

隣同士を比べ、順番が逆なら交換する。比較を繰り返して、端から位置を確定する。

詳しい説明・条件・具体例

隣り合う二つを比較し、順序が逆なら交換します。これを繰り返すと、大きい値または小さい値が端へ移動していきます。どちら側から比較するかで途中の並びは変わります。

降順にするため、右側から左へ一巡

  1. 開始:12, 3, 17, 5, 8。5と8を比べて交換 → 12, 3, 17, 8, 5。
  2. 17と8はそのまま。3と17を交換 → 12, 17, 3, 8, 5。
  3. 12と17を交換 → 17, 12, 3, 8, 5。最大の17が先頭に来る。
  4. 残りの範囲でも繰り返し、17, 12, 8, 5, 3になる。
新卒ITコンサルタント

一回端まで見たら、全部並ぶのだと思っていました。

井上
開発会社のPM

この例で、一回の走査で確定するのはどの位置でしょう。隣同士の比較と交換を、もう一度追ってみてください。

新卒ITコンサルタント

あ、ほかの位置はまだですね。似た並替えでも、比べる場所と交換するタイミングが違うのが分かりました。

クイックソート

基準で分け、分かれた範囲でも同じ処理を行う。葵は再帰的な考え方を、クイックソートの小さな例で追った。

基準値より小さい側と大きい側へ分け、分けた範囲でも同じ処理を繰り返す。

11基準12で、二つの範囲へ
12より大きい17, 14
12より小さい9, 5, 8, 3, 4
詳しい説明・条件・具体例

クイックソートは、基準値(ピボット)より大きい側と小さい側に分け、それぞれで同じ処理を行う方法です。

17, 9, 12, 5, 8, 3, 14, 4を降順にすると、最終的には17, 14, 12, 9, 8, 5, 4, 3になります。平均的には効率のよい方法ですが、基準値の選び方などで性能は変わります。選択ソートの「毎回最大を選ぶ」とは違います。

佐伯
先輩ITコンサルタント

仕組みが分かったら、顧客には何を説明できそう?

新卒ITコンサルタント

速い方法の名前だけでは決められない、と説明できます。データの条件と、処理の性質を確認して選ぶ必要があります。

佐伯
先輩ITコンサルタント

いいね。コードを全部書けることだけが、技術を学ぶ目的ではない。質問の精度が上がったことも、仕事に効いているよ。

葵は実装方法を安易に指定する代わりに、件数、並び、更新頻度、求める応答時間をそろえて相談した。仕組みを学ぶほど、専門家へ渡す問いの質も変わっていった。

ちょっと考えてみよう二分探索を使う前に、必ず確認するデータの条件は?考え方をひらく +

探索対象が昇順または降順に整列していることです。順序があるからこそ、半分を安全に除外できます。

この章、おつかれさまでした!

同じ問題を、一緒に見られる報告になった。

入力、処理の順序、期待する結果を共有できるようになりました。コードをすべて書けなくても、手順を読めることが橋渡しになります。次は、工場の物流現場で使う端末の選定です。

この章を読み返す ↑
NEXT CHAPTER / 公開中07 ハードウェア
前の章へ · 第5章 基礎理論