凸庵の生存戦略

とあるベンチャー企業でプログラマをやっていて発達障害(ASD)をもつ私の生存戦略や技術ネタなんかを書いていきます

表現方法としてのプログラミング論

夏バテにやられ体力が相当削られる夏を過ごしています・・・。信じられないくらい暑いですね。

ブログを書く元気もしばらくなかったのですが、とある文章を読んで触発されたので、つらつらと文章を書いてみようと思います。

f:id:totsuan1545:20180722145854j:plain

今回は共感できるひとはあまりいないと思いますし、誰かのためではなく自分のために書く文章なので要約はなしです。

自己表現の成果物としてのプログラム

f:id:totsuan1545:20180722150111j:plain

26歳くらいまでの私は、自分の考えを言葉で表現するのが苦手でした。
それが必要な時にだんまりを決め込んでしまったり、ぶっきらぼうな言い方や相手の気持ちを鑑みない言い方になってしまうことがよくありました。

「この前こんなことがあったんだ。ひどいよね」と言われても、「それできみはどうしたの?」とか「それは○○しなかったきみが悪いよ」なんてことを平気で返してしまっていました。*1

それから少し時間がたってから、もっといい言い方があったよなぁ・・・なんて一人反省会をするまでがワンセットな生活を送っていました。

しかし黙々とプログラミングをしているときにはこのようなもどかしさは無縁でした。

プログラムは書いたとおりにしか動きませんし、気を利かせて勝手に挙動を変えたりもしません。
書き方が気にくわないから処理が遅くなったり、書いたのとは違う動きをすることもありません。

コンピュータがどんな気持ちになるか全く考える必要なく、純粋に自分が考えているものを形にする作業はとても楽しいものです。

それに加えて、出来上がったシステムを誰かに見せれば、私がどういうものを作りたかったのかを作ったのかを確実に他者と共有することができます。

また、書いたプログラムのソースを見せれば自分がどういう思想でそのシステムを構築したかを雄弁に語ることができます。

他者に考えを伝えるのが苦手な私にとって、こんなに魅力的な自己表現方法は他にはありません。

おそらく、対人関係が苦手だけど素晴らしい絵を書く画家さんや、私生活が破綻しているけれども最高の音楽を作る作曲家のひとなども同様の感覚があるのではないかと妄想しています。*2

技術に興味がない技術者にとってのプログラミング

f:id:totsuan1545:20180722150201j:plain

何を隠そう私は最新の技術にはまったく興味がないタイプのプログラマです。

AIにも今流行りのライブラリやフレームワークにもあまり興味がありません。

それよりもあることを実現するときに、どうやったら最も美しく実現できるか とか どういう構造にすると今後のメンテナンスが楽になるか というポイントにものすごく興味があります。

私にとって技術は、それら実現方法の選択肢のうちのひとつでしかないと思っているふしがあります。だから興味がないのだと思います。*3

そんな思想を持っているので、私がプログラミングするときにはエンジニアリングとしてではなく芸術活動や自己表現の一種と思ってやっているのではないかと感じることがあります。

画家が絵を描くように、音楽家が作曲するように、小説家が文を書くように、プログラマがプログラミングをする。

作るものや題材は何でもよくて、自分がプログラミングするネタが欲しいと思うプログラマ
そういうプログラマがいてもいいと思うんですよね。

具体例を少々

例えば、 「Hello world!」を10回表示する機能を実装してほしい という案件があるとします。

はっきり言って実装難易度はまったく高くありません。
プログラミングを勉強しはじめて1ヶ月くらいの方でも問題なく実装できるでしょう。

ですが私が実装しようと思うと、いろんなことを考えて悩むと思います。

  • どの言語で実装するか(特に指定がない場合)
  • どうやって実装するか
    • どこまで将来への拡張性を用意しておくか
    • この案件にどれだけ時間をかけることが許容されるか
      • さくっと実装したほうがいい?
      • 関数化しておいたほうがいい?
      • なんならクラスでわけが方がいい?
        etc・・・

そうして以下のような実装案を頭の中で作ります。
(面倒なので全部PHPで書きます。動作確認もしていないので雰囲気だけつかんでいただければ幸いです)

1.最高にシンプルなバージョン

<?php
for($count = 0; $count < 10 $count++){
    echo "Hello world!\n";
}

今後使いまわす予定もなく、いま動けばいいのであればこんな感じにすると思います。 *4 とりあえず最速で作る必要がある場合の選択肢です。

2.ちょっと拡張性を持たせたバージョン

<?php
function printHelloWorld($printCount)
{
    for($count = 0; $count < printCount; $count++){
        echo "Hello world!\n";
    }
}

printHelloWorld(10);

将来的に回数が変化しそうだなぁと思ったらこんな実装にすると思います。 このクラスに作ってほしいなんていう指定があったらそこにメソッドを追加するイメージですね。

現実的にはこれか、せいぜい表示する文言も引数で渡すくらいで落ち着くことが多いと思います。

3.実は複雑実装をする必要がある場合

<?php
class Printer{
    private $dispString;

    public _construct($dispString){
        $this->dispString = $dispString;
    }

    public function printString($printCount){
        for($count = 0; $count < $printCount; $count++){
            echo $this->getDispString() . "\n";
        }
    }

    protected function getDispString(){
        return $dispString;
    }
}

$printer = new Printer('Hello world!');
$printer->printString(10);

どうも将来的に表示する方法や仕様が変わりそうなにおいがプンプンするという場合、こんな感じで作るかもしれません。*5

近い将来HTMLで表示することになり、以下のように作る必要が出てくるかもしれないからです

<?php
class HtmlPrinter extends Printer{
    public _construct($dispString){
        super($dispString);
    }

    public function printString($printCount){
        for($count = 0; $count < $printCount; $count++){
            $style = '';
            if($count % 2 === 0){
                // 偶数行の文字色を赤くする
                $style = '"style=color: #FFF;"';
            }
            echo '<p ' . $style . '>' . $this->getDispString() . '</p>';
        }
    }
}

$printer = new HtmlPrinter('Hello world!');
$printer->printString(10);

実際にこんな実装をする必要が出てきたら再設計を上申しますが、もしかしたらこういう実装がベストの解になることもあるかもしれません。*6

表現方法としてのプログラミングの楽しみ

f:id:totsuan1545:20180722150340j:plain

元々はシンプルな案件でしたが、場合によってはどれもが最適な実装方法になりえます。

他にも言語によってはループを再帰で書くのが正しかったり、メソッドの中にprint系*7を書かないのが最適だったり他の正解もたくさんあります。

プログラミングをしていると、どこかで必ず工数と必要な品質と将来性を天秤にかけて実装を進めていくる必要に迫られます。

何度もその選択をしていく結果、出来上がったプログラムは人ごとにまったく違うものになります。そこに書いた人の個性が出てきます。
考え方のクセや好み、どのくらいめんどくさがりなのかなんかが見えてくることもあります。

そういうところを他のひとに読み取ってもらえると嬉しくなりますし、他人のそういうポイントを読み取れるととても親近感がわきます。

これはプログラマ同士だからこそできるコミュニケーションです。 会話が苦手でも十分に楽しめます。
そして会話だけではやり取りするのが難しい考えや感情なんかをやり取りすることができます。

自分の考えをプログラムに表現した結果、会話だけでは成しえないコミュニケーションをとれるというのが、私が楽しむ一番のポイントになっています。

クロージング

最初に書こうとしていたことからかなりそれてしまいましたが、楽しくかけたので結果オーライということにしておきます。

ちなみに触発された文章とはこちらになります→誰かを動かすために「書く」わけじゃなかった|Yuhei Suzuki|note
マメに見ているわけではありませんが、すごくいい文章が多いので考えさせられることが多いです。

私は最新技術が好きで、そういうものを追い求めていくひとを否定する気はまったくありません。
それどころか、彼(彼女)らとは好きなものや技術に対する考え方が違うだけで、好きなものをひたすら追求するという点でやっていることは私まったく同じだと思っています。

お互い尊重していいところを補い合っていけば楽しい開発ができると思うんですよね。

ここまで見ていただきありがとうございました。
見ていただいた方にいいことがありますように。

*1:いまでもそういう返答することが少なからずありますが・・・

*2:特定の誰かを指しているわけではなく、ステレオタイプなイメージを書いたつもりです

*3:正直自分でもよくわかりません

*4:教科書にもそう書いてありますしね

*5:この規模なら現実的には2.の案で作っておいて、必要になってから全部作り直すほうが早いですが

*6:テンプレートエンジンいれろとかむやみに継承するなとか言いたいことはいろいろありますが

*7:printfが代表的なコンソール出力関数