標高+1m

Don't be rational.

プログラマが人間である必要はないか

 人工知能について一瞬考えてたんですよ。一瞬の思いつきを書きながら考えただけなので大した話ではないです。

東雲ブラックボックス

 もし、機械(以下、東雲なの)が、人間がやっていることを置き換えられるなら、端から見れば東雲なのが人間か機械かなんてわからないでしょう。クリーニング屋さんに服を持っていくとき、クリーニング屋さんはブラックボックスになっていて、人間が手洗いしているのか洗濯機が洗っているのかはわかりません。チューリングテストは、端末(これもブラックボックス)越しに人間と東雲なのそれぞれと対話してどっちがどっちかわからなかったら、東雲なのには知能があると結論づけます。

 チューリングテストやクリーニング屋さんテストは、人工無能も通過します。洗濯機は考える能力をもっていません。東雲なのもチューリングテストだけでは、本当に考えているのかはわかりません。「考える」というのがどういうことかは僕はまだよく知りませんが、ここでは条件や経験をもとに複雑な連想ゲームをする能力くらいの意味で使います。

 今まで、東雲なのに仕事を代わってもらった職業は、単純な製造業や洗濯、食器洗いなど、あまり考えることを必要としないように見える、反復処理のようなものが多いです。考えることが必要なように見える職業は、東雲なのに肩代わりしてもらう事はできないのでしょうか?

機械はプログラミングできるか

 僕はプログラマです。他の職業については他の職業の人に考えてもらうとして、プログラマが東雲なので置き換えられるかが気になります。

 僕がプログラミングをするときは結構頭を使います。「こういう機能を作るなら、関数Fと関数Gを組み合わせて関数Hと作ればいいな」とか、「この関数はやってることが多くて後から把握し辛そうだから分割しよう」とか。でもこれって実は、洗濯をする人が「石鹸は右手が届くここ置いておこう」とか「右手で石鹸付けながら左手で濯ぐと速いな」とかって考えるのとあんまり変わらない事なんじゃないでしょうか。そしてソフトウェア開発にだって、プロジェクトを跨いでみれば、毎回バリエーションはありますが反復性は確かにあります。ということは、考える能力がなくても、東雲なのはプログラマになれるのではないでしょうか。
 
 仕様をもとにプログラムを作る東雲なのは、実はもうほとんどできています。 制約プログラミング*1は、仕様を変数の制約として記述すると、ソルバが答えを見つけてくれます。こんな感じでもっと進めていけば、受け入れテストを与えたらウェブアプリを作ってくれる東雲関数とかも作れるでしょう。家を造る機械を作れば大工が不要になると言っているような物ですが、もしこうなったらソフトウェア開発の現場にプログラマは不要になります。やったー!

 ソフトウェア開発に人間のかわりに東雲なのを使う利点について考えてみましょう。まず、均一で綺麗なコードが出来上がるようになるでしょう。人間のプログラマに「forを使うな」とか「関数定義と関数適用以外書くな」とか「クラスを書くな」とか教え込むより、東雲なのに一度教える方が簡単です。コードの綺麗さも、行数や実行速度を基準にして遺伝アルゴリズムとかを使うようにしておけば、人間が考える曖昧な綺麗さよりも良い物ができるでしょう。
 次に、そもそもコードを読んで修正するという行為が不要になります。テストを書き換えてもう一度東雲なのを走らせればいいんです。古いテストと新しいテストを両方与えるとデルタを計算してパッチをコミットする東雲なのなんてこともできるでしょう。

機械に置き換えられないプログラマになるには

 理論上は、プログラマは機械で置き換え可能、というか置き換えた方が良いという結論が出ました。受託開発や、ウォーターフォール開発に従事するだけのプログラマは、機械がやるべきことをやっている存在、もっと言うと機械そのものなんです。このままでは胸くそが悪い人もいると思うので、機械に置き換えられないプログラマになるにはどうすればいいのか考えます。

 まず簡単なのは、一段メタることです。つまり、東雲なのを作るプログラマになればいいんです。これは実は大げさに考えなければ僕らは普段からやっています。作業を自動化するためにシェルスクリプトを書いたりChefのレシピを書いたり、手動テストを自動化するためにユニットテストを書いたりというのは、プログラマがする作業を東雲なので置き換えているのと同じです。次の段階として、プログラムを作るプログラムの開発をはじめるんです。

 次に考えられるのは、プログラミングという言葉の意味を見直すことです。上で、ソフトウェア開発の現場からプログラマが不要になると書いたのは、受け入れテストはプログラマでなくても書けるという暗黙の前提に依拠しています。受け入れテストが書ける企画やプロマネがいればプログラマは不要ということです。でも彼らには、プログラマが、長年培ってきた抽象化能力がありません。テストは冗長で、網羅的でなく、あとからの解読が難しいものになると考えられます。テストを書く事=プログラミングと捉え直せば、プログラマの仕事はなくなりません。でもこれも結局機械っぽいです。

 一番良いのは、自分で考えて自分で作るプログラマになることです。仕様書をプログラムに変換する作業は機械にやらせて、プログラマは自分で企画し、自分でテストを書き、まだソルバが存在しないプログラムを考えるんです。これができる人ならソフトウェア開発に不要なのはプログラマではなく企画だと言うことができます。

プログラマが人間である必要はないか

 まとめです。

  1. 受託開発やウォーターフォール開発しかしないプログラマは機械と同じ
  2. プログラマでありつづけるには、メタるか、自分で考えたプログラムを作らないといけない
  3. 東雲なのちゃんはかわいい

 こんなとこです。