擬似言語の読み方|1行目から追う前に見るべき3か所を解説
擬似言語のコードを上から読んでいくと、途中で何をしているのか分からなくなる。
コードを見た瞬間、1行目から順に指でなぞり始めていませんか?
丁寧に読んでいるつもりなのに、真ん中あたりで自分が何を追っていたのか思い出せなくなる。そして最初に戻って、また同じところで止まる。
この止まり方をしている人は、理解力が足りないわけではありません。読み始める場所を間違えているだけです。
私はエンジニアとして10年以上、Webシステムの開発や運用に携わってきました。他人の書いたコードを読む機会は毎日のようにありますが、1行目から順に読むことはまずありません。
先に見る場所が決まっていて、そこを押さえてから中に入ります。擬似言語も同じで、順番を変えるだけで読みやすさが変わります。
この記事では、値を追い始める前に見る3か所と、そのあとの読み進め方を、例題のコードで実演していきます。
なぜ1行目から読むと迷子になるのか¶
まず、上から順に読む方法の何が苦しいのかを整理しておきましょう。原因が分かると、対策が自然に決まります。
コードを1行目から読むというのは、地図を見ずに歩き出すのに似ています。一歩ずつは間違えていないのに、全体のどこにいるのかが分からない。
擬似言語のコードは、たいてい10行から30行ほどです。この長さは、人が何も準備せずに頭の中へ入れるには少し多すぎます。
覚えることが多すぎて途中であふれる¶
上から順に読むと、変数の値、今いるループの位置、条件の判定結果を全部同時に覚えることになります。人の短期記憶はそんなに広くありません。
途中であふれると、直前に読んだ行の意味が消えます。そこで戻って読み直し、また同じところであふれる。
読み直しの回数が増えているなら、理解が浅いのではなく、抱えている情報が多すぎるサインです。
全体の形が分かれば覚える量は減る¶
先に全体の形をつかんでおくと、覚える量はぐっと減ります。ここは合計を作っているところ、ここは最後の後始末、という枠が頭にあるからです。
枠があると、細かい行は枠の中に収まってくれます。全部を覚えなくても、必要になったときに見に行けばいい状態になります。
そもそも擬似言語がどういうものか、まだ輪郭がつかめていない場合は、先に土台を作っておくと以降が早くなります。
【関連記事】擬似言語とは?IT初心者にもわかる意味・書き方・プログラミングとの違いをやさしく解説
1行目を追う前に見る3か所¶
ここからが本題です。値を追い始める前に、必ず見てほしい場所が3つあります。
順番も決まっています。上から順ではなく、この3か所を先に拾ってから中身に入ります。
| 順番 | 見る場所 | そこで分かること |
|---|---|---|
| 1 | 先頭の宣言行 | 何を受け取り、何を返すのか |
| 2 | 変数宣言の並び | 処理に出てくる登場人物 |
| 3 | インデントの段差 | 処理の骨組みと繰返しの範囲 |
この3つは、どれも1行目を読み始める前に、目を動かすだけで拾えます。時間にすれば数十秒です。
説明のために、例題を1つ用意しました。試験でよく見る形に寄せて、私が書いたものです。
○実数型: 平均点(整数型の配列: 点数)
整数型: i, 合計, 件数
実数型: 平均
合計 ← 0
件数 ← 0
for (i を 1 から 点数の要素数 まで 1 ずつ増やす)
if (点数[i] ≧ 0)
合計 ← 合計 + 点数[i]
件数 ← 件数 + 1
endif
endfor
if (件数 = 0)
平均 ← 0
else
平均 ← 合計 ÷ 件数
endif
return 平均
このコードを、3か所の順番で見ていきます。中身の細かい計算は、まだ追いません。
1か所目:先頭の宣言行で入口と出口を決める¶
一番上の行には、この処理の入口と出口が書いてあります。ここだけで、読み方の方針がほぼ決まります。
例題の先頭は、実数型を返す平均点という処理で、整数型の配列を1つ受け取る形です。受け取るものが配列なら、中でループが回ると予想が付きます。
そして返すのが実数型だという点が効いてきます。整数どうしの足し算だけなら整数型で足りるので、どこかで割り算が出るはずだと読む前から分かります。
実際、後半に合計を件数で割る行があります。先に予想を持っていれば、その行に来たときに立ち止まらずに済みます。
戻り値の型は、処理の目的を一言で示している場所です。ここを飛ばして中に入ると、何を作ろうとしているのか分からないまま計算を追うことになります。
手続と関数の違いや、戻り値そのものが曖昧な場合は、先にそこを固めておくと3か所の1つ目がぐっと読みやすくなります。
【関連記事】擬似言語の手続と関数の違いとは?引数・戻り値と変数の有効範囲を解説
2か所目:変数宣言で登場人物を確かめる¶
次に見るのは、宣言されている変数の並びです。ここは物語で言えば登場人物の紹介にあたります。
例題では、整数型のi、合計、件数と、実数型の平均が出てきます。この4つ以外は出てこないと分かるだけでも、身構えずに読めます。
名前からも役割が読み取れます。iは数を数える係、合計と件数はためていく係、平均は最後に答えを入れる係です。
役割で分けておくと、あとで値を追うときに何を見ればいいかが決まります。全部の変数を同じ重さで追う必要はありません。
型にも意味があります。合計が整数型なのに平均が実数型になっているのは、割った結果に小数が出るからです。
型ごとの違いがまだ頭に入っていないなら、こちらで整理しておくと読む速さが変わります。
【関連記事】擬似言語の変数宣言とデータ型の読み方|整数型・実数型・文字列型・論理型の違いを解説
3か所目:インデントの段差で骨組みをつかむ¶
3つ目は、行の中身ではなく字下げの形です。文字を読まずに、左端の凸凹だけを見てください。
例題は、段差が2回できています。forの中にifが1つ、そしてforを抜けたところにもう1つifがあります。
この形が見えると、処理が3つの部分に分かれていると分かります。準備、繰返し、後始末の3つです。
準備は最初の代入、繰返しは配列を1つずつ見る部分、後始末は件数が0かどうかで分ける部分。これが骨組みです。
骨組みが見えたところで、初めて中身を読みます。ここまで来ると、1行の意味が骨組みのどこに属するかが分かった状態で読めます。
繰返しの中にさらに繰返しが入る形になると、この段差の読み取りがそのまま得点を左右します。入れ子に慣れておきたい人は、こちらで形を目に焼き付けておくと安心です。
【関連記事】擬似言語の多重ループ(入れ子の繰返し)がわからない人へ|二重forの読み方を解説
3か所を見たあとの読み進め方¶
3か所を押さえたら、いよいよ中身に入ります。ここでも1行ずつ均等に読むのではありません。
骨組みの部分ごとに、まとめて意味を取っていきます。塊で読む感覚だと思ってください。
塊ごとに日本語の一言に言い換える¶
繰返しの中を読むときは、行を1つずつ日本語にするのではなく、塊全体を一言でまとめます。
例題のforの中なら、0以上の点数だけを合計して、その個数を数えている、という一言で足ります。合計と件数を別々に説明する必要はありません。
言い換えができたら、その塊はもう読み終わりです。あとで値が必要になったときだけ、中を見に戻ればいい。
うまく一言にまとまらないときは、まだ読めていない行がある証拠です。その塊だけをもう一度見れば、迷子にならずに済みます。
私が実務で他人のコードを読むときも、まず塊ごとに一言のメモを付けていきます。関数全体を理解しようとせず、区切って言い換えるほうが結局は速いからです。
値を入れるのは最後にする¶
3か所を見て、塊を言い換えて、それでもまだ具体的な値は入れません。値を追うのは、処理の意味がつかめたあとです。
先に値を入れてしまうと、計算に気を取られて全体の形が見えなくなります。順番を逆にするだけで、同じコードがずっと軽くなります。
値を入れる段になったら、紙に表を作って追ってください。頭の中で数えるのは、どんなに慣れても必ずどこかでずれます。
表の書き方そのものを固めたい人は、手順を分解したこちらから練習するのが近道です。
【関連記事】擬似言語のトレース表の書き方|科目Bで変数の値を追う手順を解説
分からない行は飛ばしていい¶
読んでいる途中で意味の取れない行が出てきても、そこで止まらないでください。印だけ付けて先に進みます。
全体の形が見えたあとに戻ると、同じ行があっさり読めることがよくあります。前後の塊が意味を補ってくれるからです。
最初の1周で全部を理解しようとすると、たいてい最初の難所で時間を使い切ります。分からない行は保留にする、と決めておくだけで進み方が変わります。
読み違えやすい場所を先に知っておく¶
読む順番が決まっても、つまずきやすい場所は残ります。ここを先に知っておくと、事故がぐっと減ります。
私が新人のコードレビューで実際によく見かける読み違いを、擬似言語の形に合わせて表にまとめました。
| 読み違えやすい場所 | 何が起きるか | 先に確かめること |
|---|---|---|
| ループの終わりの値 | 最後の1周が余分、または足りない | 「まで」に書かれた値そのもの |
| 条件の等号の有無 | 境目の値の扱いが変わる | 以上なのか、より大きいなのか |
| インデントの外れた行 | ループの中と外を取り違える | endforより上か下か |
| 代入と比較の記号 | 値を入れる行を判定と読む | ←なのか=なのか |
この4つは、どれも1文字か1行の違いです。ところが読み違えると、結果は大きく変わります。
とくに3行目は見落としが多い場所です。例題の後半にあるifは、forの外側にあります。
もしこのifをループの中にあると読んでしまうと、平均を何度も計算する処理に見えてしまいます。段差を先に見ておく理由は、ここにあります。
記号の意味が曖昧なままにしない¶
擬似言語には、日常では見かけない記号がいくつか出てきます。←や÷、≧などです。
記号の意味が曖昧だと、読む速さが落ちるだけでなく、判定を逆に取ることもあります。ここは覚えるというより、見た瞬間に迷わない状態にしておきたい部分です。
読む練習を始める前に、記号だけをまとめて確認しておくと安心です。試験直前の見直しにも同じものが使えます。
【関連記事】擬似言語の記号・記述形式一覧|試験前のチェック早見表
読み方は動かして確かめると定着する¶
読む順番は、知識として覚えただけでは身に付きません。自分の読みが合っていたかを確かめる工程が要ります。
やり方は簡単です。3か所を見て、塊を言い換えて、こう動くはずだと予想を立ててから、実際に動かして答え合わせをします。
Giji Academy の擬似言語シミュレーターなら、一行ずつ進めながら変数の値が変わる瞬間を画面で追えます。自分の予想とずれた行が、そのまま次に直す場所です。
ずれる場所には人ごとの癖があります。ループの最後の1周だったり、条件の境目だったり、だいたい決まった場所で毎回ずれます。
その癖が分かると、読むときに自分で注意を向けられるようになります。読み方が身に付くというのは、この状態のことです。
擬似言語を読む力は、基本情報技術者試験の科目Bでそのまま得点に変わります。試験での位置づけを確認しておきたい人は、こちらで全体像をつかんでおくとよいでしょう。
【関連記事】基本情報技術者試験の科目Bとは?擬似言語・アルゴリズム対策を初心者向けに解説
1日1本、短いコードで練習する¶
練習するコードは短いもので構いません。10行程度のコードを1日1本、3か所を見るところから読む。
大事なのは量ではなく、順番を毎回同じにすることです。同じ手順を繰り返すと、そのうち意識しなくても目が先頭行と段差に向くようになります。
現場で新しいコードを渡されたときも、私は同じ順番で見ています。この処理は何を受け取って何を返すのか、登場人物は誰か、骨組みはどうなっているか。
順番が体に入ってしまえば、初めて見るコードでも手が止まりません。擬似言語で身に付けたこの読み方は、そのまま実務でも使えます。
まとめ¶
最後に、擬似言語を読む順番を振り返っておきます。
1行目から追い始めないでください。先に見るのは、先頭の宣言行、変数宣言、インデントの段差の3か所です。
この3か所で、何を返す処理なのか、登場人物は誰か、骨組みはどう分かれているかが分かります。ここまでが準備です。
そのうえで塊ごとに日本語へ言い換え、最後に値を入れて表で追います。分からない行は印を付けて飛ばし、全体が見えてから戻ってきましょう。
コードは書かれた順に読むものではなく、分かる順に読むものです。今日はまず1本、1行目を読む前に3か所だけ見るところから試してみてください。