PHP で遊ぼう(ハテナ) – 手続き型とアルゴリズムと

hiromasa.zone の MySQL があいかわらず落ちているため、このシリーズが何回目かわからなくなってしまったのでとりあえず (ハテナ)。

プログラム言語はコンピュータに何か処理をさせるための記述の塊ですが、プログラマと呼ばれる人は、そのコンピュータ言語に合わせて"普段の生活でやっていること"の記述をかける人です。

別にたいしたことをやっているわけではありません。 たとえば、前に書いたような、大きいものと小さいものの並べ替えとか、異なる種類のものの振り分けとか、そういった普段の生活でもやっているようなことを、言葉に置き換えているだけ。

人間は体で覚えてしまっているやり方とか、経験的にそうなることがわかっているのでやり方を意識していない部分というのがありますが、これを丁寧に紐解いていって最終的にコンピュータ言語に置き換えるのが仕事です。

コンピュータ言語というのは、こういった"やり方"をきわめて紛れなく記述できる人間のための言語です。 最終的には人間の言葉で書かれた仕様書なんぞ紛れが多くていらなくなります。

人間「1ヵ月後に実施する。」

1ヵ月後って 30日後? 31日後? 次月同日?

31日月末から1ヵ月後っていつ? 次の月が 2月だったら? 28日? あ、29日も考えないと。

等々。

人間の言葉でかかなければいけないのは"なんのためにやるか" というコンピュータ言語でかけない部分。

なんて、実はこれは夢物語。 現在はコンピュータに指令するための特有の記述も混在してしまい純粋にそれだけを書くことができず、時間もかかるので言葉としてはまだまだです・・・。

さて、このような何かのやりたい事を紐解いた手順を、アルゴリズムと呼びます。

アルゴリズム – Wikipedia

アルゴリズム (algorithm) は、なんらかの問題を解くための手順のことである。算法(さんぽう)と訳されることもある。

コンピュータにアルゴリズムを指示するための(電子)文書をプログラムという。人間より早く大量に正しい結果を導くことができるのがコンピュータの強みであるが、そのためには正しいアルゴリズムにもとづくプログラムが必要である。

だから、ソースコードを見られるというのは結構恥ずかしい。 なんといっても自分の思考の流れを赤裸々に人に見られるわけで、友達プログラマいわく「裸を見られるより恥ずかしい」です。(笑)

たとえば、AとBと書かれたカードが裏返しにおいてあって、そのカードの配置を知りたいとします。 どうすればいいかといえば、一枚めくってそれが A なら片方は B。 逆もしかり。 一枚だけめくるだけで片方は決まるので、2枚めくる必要はないわけですが、人によっては一応両方めくることをするでしょう。

1枚だけめくるのを言語になおすと、たとえば

   1: <?php
   2:  
   3:     // 無作為におかれたカード2枚(ここではカード1がB、カード2がA)
   4:     $card1 = 'B';
   5:     $card2 = 'A';
   6:  
   7:     // カード1判定
   8:     if($card1 == 'A') {
   9:         echo 'カード1 は A です。';
  10:         echo 'カード2 は B です。';
  11:     } else {
  12:         echo 'カード1 は B です。';
  13:         echo 'カード2 は A です。';
  14:     }
  15:  
  16: ?>

こんなかんじ。 "めくる" ってのは if で表現しています。

両方めくってみる人なら、

   1: <?php
   2:     // 無作為におかれたカード2枚(ここではカード1がB、カード2がA)
   3:     $card1 = 'B';
   4:     $card2 = 'A';
   5:  
   6:     // カード1判定
   7:     if($card1 == 'A') {
   8:         echo 'カード1 は A です。';
   9:     } else {
  10:         echo 'カード1 は B です。';
  11:     }
  12:  
  13:     // カード2判定
  14:     if($card2 == 'A') {
  15:         echo 'カード2 は A です。';
  16:     } else {
  17:         echo 'カード2 は B です。';
  18:     }
  19:  
  20: ?>

こんな感じ。 両方めくるので if が 2つになっています。

こんな風に、その人の思想によってプログラムも変わってきます。 思考の流れがプログラムから読めます。

片方だけみる派閥の人から見れば、片方だけめくるだけでよく、効率がよいので、両方みる派閥の人に対して「なにやってんだか」となります。 なんだかあたまのわるさを露見しているみたいなときもあるわけで、このへんがプログラマの一番のストレスとなるぶぶん。

そして3人目の人が現れて、は?って。

   1: <?php
   2:  
   3:     // 無作為におかれたカード2枚(ここではカード1がB、カード2がA)
   4:     $card1 = 'B';
   5:     $card2 = 'A';
   6:  
   7:     // は?
   8:     echo "カード1 は $card1 です。";
   9:     echo "カード2 は $card2 です。";
  10:  
  11: ?>

まー最後のは半分冗談ですが、状況によって、将来 C カードが増える可能性を考慮してプログラムをかかなければならないこともあり、結構神経をつかう部分でもあります。

職業柄、(自分のことはたなにあげ) 人の書いたプログラムをなおしたり、アドバイスしたりしなければいけないこともありますが、最近は"思想的な部分"については、きちんと動作しているかぎり自分のイメージと違ってもそっとしておくことにしています。 お疲れのときもあるですしね。

その部分についての指摘は、どーも人格まで否定しているような気がして・・・。 考えすぎですか。(笑)

ちなみに、人のつくってくれたラーメンにはコショウをいれない派です。 🙂

PHP で遊ぼう(ハテナ) – 手続き型とアルゴリズムと」への2件のフィードバック

  1. このコラムを読んで思ったんですが、こういうことって文章を書くのに似ていますね。
    どういう風に持っていってから結論付けるとか、その文章自体に人柄とか表れたりします。

    僕はPHPをやりだしてから、「段取りをしっかりと考える」ということが身についてきているような気がします。
    「こういうことがしたいから、その前段階でこういう処理をしておく・・」とか。

    最近ではだらだら1000行以上ののコードを書くよりも、functionで自分で関数を作って、1000行分の処理を分割した方がソースコードが見やすいということがわかってきました。

    どうやらちょっとずつ進歩しているようです(笑)。

    ちなみに僕も出てきた料理は基本的には何もつけない派ですねー。

  2. naoki さん、こんにちは。 🙂

    おー、もう 1000行近いコードかかれているんですね。 すごいです!

    ソースコードみるとなんとなくその人のことって分かりますよね。
    麻雀をやる人は、一度打つだけでその人の性格が分かるそうですが、それと似ているのかも知れません。

    >「こういうことがしたいから、その前段階でこういう処理をしておく・・」とか。

    そうなんですよね! 一生懸命前段階で処理して、最後に簡潔にぱっと処理を終わらすのは格好いい書き方に見えます。

    WordPress は、code is poetry ってフッターに書かれていました。
    コードは詩のように、でしょうか。 🙂

コメントを残す