教えて、ござ先輩! なぜプログラミングに「表現力」が必須? わずか3つの表現文法でイメージをコード化する方法

自分のイメージを、ちゃんとコードとして表現することができていますか?そのために必要なのは、イメージを論理へと変換する、「表現力」です。エンジニアが身につけるべき表現力を、ござ先輩がばっちり解説します!

教えて、ござ先輩! なぜプログラミングに「表現力」が必須? わずか3つの表現文法でイメージをコード化する方法

株式会社クオリティスタートの代表を務めている、湯本@gothedistanceと申します。インターネットでは、「ござ先輩」という愛称でブログを書いたり、雑誌やWebメディアに記事を書かせていただいています。本業ではITコンサルタントという立ち位置で、主に業務アプリケーションの業務分析/要件定義や、エンジニア向けの新人研修の講師などの仕事をしています。

プログラミングは非常に自由なもので、同じ処理や条件を記述しているにもかかわらず、エンジニアによって書かれたコードがかなり違うことがあります。「この時だけ動けばいい。あとは知らん」という刹那的なコードもあれば、「この2行だけで全てが表せる。変更にも強い」という堅牢なコードもあります。

新人や若手の方が「プログラミングができるようになる過程」を見ていく中で、この、「考えを表現できる力」が不足していると感じることが多々あります。「自分はこういうコードが書きたい」と言葉にすることができないと、自分が何を形にするべきか、また、自分が何につまずいているのかもわからないのではないでしょうか。本稿では、若いエンジニアに向け、「エンジニアが体得するべき表現力」の意味を解説してみたいと思います。

プログラミングにおける「表現力」とは?

「自分はこういうコードを書きたい」が言葉にできない最たる理由は、プログラミングにおける表現がどういったものかを把握できていないからだと考えています。2つのケースを引き合いにして、皆さんとプログラミングにおいて何をどう「表現」するのか?を、考えてみましょう。

1つ目は、定番の問題である「FizzBuzz」です。仕様は以下の通りです。

  • 3の倍数ならFizzと表示
  • 5の倍数ならBuzzと表示
  • 3と5の倍数ならFizzBuzzと表示
  • それ以外なら、当該数字を表示

表現のための文法はわずか3つ

プログラミングの基礎文法は3つしかありません。「順番に行う」「条件分岐」「繰り返し」です。これらを駆使して、どういった処理の流れを作ればよいのかを考えるのが、プログラミングです。

FizzBuzzのキモは倍数判定です。判定対象となる数字がどんな数字でも、ある数の倍数か否かを判定する必要があります。

処理内容を考えるにあたっては、具体的なケースを想定して処理の流れを考え、そこにある共通点を見つけることが重要です。3でも33でも345でも9980802でも、3の倍数として判断しなければなりません。

これらに共通している属性は、「3で割ると余りが0になる」です。ここにたどり着けば、あとは単純。「倍数=ある数字で割り切れる=余りがない」という連想を行うことで、条件分岐のコードに落とし込めるわけです。

つまり、FizzBuzzプログラムは「ある数で割った時に余りがない数(この場合は3)」の判定プログラムであると表現できます。これこそが、プログラミングにおける表現力です。

3の倍数ならFizzと表示

倍数=ある数字で割り切れることができる数

Fizzと表示するための要件を下段の概念に置き換えて、割り切れることができるか否かという状況を作り出し、条件分岐によって判断可能にしています。こうした表現能力、つまり、事象をYes/Noで判断できるところまで分解して表現できるかどうかが、「こういうコードを書けばいいんだ!」につながる鍵となります。

論理として成り立つように、言い換える

FizzBuzzの条件分岐は比較的単純なので、頭に入りやすいでしょう。一方、新人さんが苦労するのが、繰り返しの条件を作ることです。例えばwhile文です。while文は「ある条件が成り立つ限り繰り返す」ということを表現することが求められますが、上手く読解できない方が少なからずいらっしゃいます。

while文の例として素数判定がよく用いられます。ある数字が素数であることを証明するには、1と自分以外で割り切れないことを証明すればいいわけです。今年は2017年ですが、2017は素数です。2017を素数であるかを判定するためには、どんなことを表現する処理を書けばよいでしょうか?

最も単純な解法は、2から順番に割り算をして、自分自身以外の数字で割り切れるかを判定することです。例えば、10であれば2で割ったら割り切れるので素数ではありません。11は2~10のいかなる数字でも割り切れないので、素数です。

こういったロジックを作れば、どんな数字が対象になっても素数であると判定できます。 では、この素数探索アルゴリズムを実現するために、どういう繰り返し条件を設定してwhile文を作ればいいか、少し考えてみて下さい。以下が回答例です。

     num = 2017 
     cnt = 1 
     while num > cnt: 
         cnt += 1
         if num % cnt == 0:
            break

ポイントはnum > cntです。「自分自身以外の数字で割り切れるかを判定する=2から自分の数字まで順番に繰り返す=判定したい数>割る数字」に展開していることがポイントです。実際に11が代入された時の流れを追いかけると、さらに頭に入ることでしょう。

まとめると、以下のような図になります。

1

自分の意図を表現できない場合は、「例えば、この場合だったらどう動くのが正しい?」という質問に上手く答えることができません。「何がやりたいの?」と聞かれたら「例えば、こういう時にはこうしたい!」と表現できるように、習慣づけましょう。

考え方の違いでコードはここまで変わる

エンジニアHubに会員登録すると
続きをお読みいただけます(無料)。
登録のメリット
  • すべての過去記事を読める
  • 過去のウェビナー動画を
    視聴できる
  • 企業やエージェントから
    スカウトが届く