俺の報告

RoomClipを運営するエンジニアの日報(多分)です。

日報 #56 - また反省か!

当たり前ですが、意思決定って大事ですね。

「できない、とはどういうことか?」
ということについて最近考えます。

「あれが出来ない」「なぜか?」「分からない」

頭のなかでこんなやりとりをしたり。
実際はどうやったってやらねばならんので、やりきります。
そして終わった後、 「ま、一応できたけど、なんか、、、んー、、、できたって言っていいのかな」
と不完全燃焼な、消化不良な様子。

こういう時、大概は「(技術的に)出来ない」ということが本質なんじゃなくて、 「(意思決定が)出来ない」ということになるんだと思います。
これは「難しい」という状況でも同じだと思います。
「(技術的に)難しい」ことは事実かもしれませんが、
それより本質は「(意思決定が)難しい」ことの方にある。
そんな風に思うことが増えたような気がします。
ま、改めて書いてみると間抜けな話なんですけどね、、、

例えば、すごい極端な話をしましょう。
「2つの変数の掛け算を行う関数を作る」
というプロジェクトがあったとします。
これを実装しましょう、となったときどこまで考えますか?
分かりやすくphpでいきますか。

function multiply($a,$b) {
  return ($a * $b);
}

で、はい終わり。
これはかなり雑ですね。
じゃぁ例えばこうします。

function multiply($a=0, $b=0) {
     return (int)a * (int)b;
}

適当な初期値と、キャストをしています。
これでいいでしょうか?
でももしかしたらベクトルの掛け算もするかもしれませんね。
だからこうします。

function multiply($a=NULL, $b=NULL) {
     $result = array();
     foreach ((array)$a as $a_key => $a_value) {
          foreach ((array)$b as $b_key => $b_value) {
               $result[] = (int)$a_value * (int)$b_value;
          }
     }
     return $result;
}

いやいや、行列かもしれませんよ。
そもそも内積でいいんですか?外積の可能性は?
いやいやいや、もしかしたら、テンソルかもしれません。
じゃぁ直積ですね。
そしたらreturnじゃなくて、写像先のクラスを継承していないと駄目ですね。
えぇーーー、そんなの「できない」「難しい」となりますね。

これは有り得ないレベルのかなり極端な例ですが、つまりこういうことってかなりあると思います。
「その辺はよしなに、、、」
という感じなことがほとんどだと思いますが、
例えばセキュリティとか、
例えばAPIのルールとか、
「どこまで考えて、どこまで対応して、どこまで設計するのか」
ということは意思決定しなければなりません。
当たり前ですが。
開発最中はそれの連続です。
いつも誰かに聞きたくなります。
「これ、どこまで、どういう状況にまで対応しなければならないの?」
考え出せばきりがないです。
ですがもちろん、意思決定しなければなりませんから、意思決定します。
でもそれが難しかったり、出来なかったり、しちゃう。
ましてや、実装してから想定外の事が起きて「うわぁ」となっちゃう。
なので、技術的にというより、意思決定の困難さを如何に軽減するか、
ということに工夫を凝らして考えるという視点も大事なんだなと思います。
あぁ眠くなってきたから、今日はここまで。
じゃぁね。