静かなる名辞

pythonとプログラミングのこと

2019/03/22:TechAcademyがteratailの質問・回答を盗用していた件
2019/03/26:TechAcademy盗用事件 公式発表と深まる疑念



AIでプログラマーが失業するとか、気にしなくていいと思うよ

はじめに

 昨今のAIブームで、AIへの過剰な期待からか「プログラマー」が失業するのでは? ということが囁かれるようになりつつあります。

人工知能によってプログラマーは失業する?AIに仕事を奪われる前にAIエンジニアになる? | アトオシ
プログラマーという職業は10年後にはなくなる?これからの10年をどう生きるか | フリーランスへの道しるべ

 正直「人目を引くために過激なこと言ってるだけだろ」という気もしなくはないのですが、この分野の末席で研究をやっている大学院生として*1コメントしておくことにします。

AIの定義は時代とともに移り変わる

 ある程度ご年配の方だと、「AI搭載でおいしく炊ける炊飯器」「AIが最適に制御するエアコン」といった製品が出てきた時代のことを覚えていると思います。今では「ただのマイコン制御じゃん」と思う訳ですが、それが当時最先端の「人工知能」でした。

 他にも、以下のような技術は少なくとも登場時点では「AI」とみなされていたはずです。もちろん、今ではそんなことを思う人は(ほとんど)いません。

  • プログラミング言語のコンパイラ
  • かな漢字変換
  • 郵便番号の自動読み取り

 その時代の技術で実現できなかったもの、実用化されなかったものが「AI」と呼称されて残る、というシニカルな見方もあるくらいです。

人工知能の歴史 - Wikipedia
http://www.soumu.go.jp/johotsusintokei/whitepaper/ja/h28/pdf/n4200000.pdf

 特にプログラミングに関して言えば、簡潔に問題を解決できるよう、自動的に処理できる部分は自動的に処理させるという方向性の努力はずっと続けられてきています。だからこそ、素晴らしいオブジェクト指向プログラミングができたり、モダンな言語で型推論が使えたりする訳です。

「自動プログラミングとは、いつの時代もその当時のプログラマが使える言語より高水準の言語でプログラミングすることを意味する婉曲表現だった」

D. L. Parnas. "Software Aspects of Strategic Defense Systems." American Scientist. November 1985.
翻訳は 自動プログラミング - Wikipedia

 なので、一つの考え方は「今までどおりのことだから気にする必要はない」というものでしょう。

 だけど、プログラマーが失業する、という予見が世間を賑わせるようになったのは、今までの状況とは少し異なりそうです*2

 もうひとつの考え方、つまり「ついに人間の能力に匹敵するAIができそうなので、これまで高度な知的職業とみなされてきたプログラマーが失業しかねない」という考え方が説得力を持つようになった、とみなすのが自然でしょう。そこで、これについて、もう少し色々な角度から考えてみます。

これつでに技術革新で消滅した職業

 1950年代とか大昔には、ソースコードは手書きしたりタイプライターで打ち込んだりして、キーパンチャという職業の人に渡していました。キーパンチャの人が何をするのかというと、渡されたコードをパンチカードに打ち込むのです。打ってもらったパンチカードをIBMなんかの汎用機のカードリーダに突っ込んで、プログラムを読み込ませていました*3

 キーパンチャの人は、パンチカードが廃れた80年代に当然失業しています。やることはデータ入力なので、パンチカードが廃れても潰しは効いたと思いますが……

 もう少し一般的な例だと、昔は植字工という職業がありました。活字というのはもともと鉛で作られた字のスタンプのことで、それを並べて作った組版にインクを塗って紙に押し当てて印刷するのが活版印刷です。なので人の手で活字をケースから集めてきて並べないと印刷ができないという時代があったのですが、これもオフセット印刷などが普及したことで、職業としてはほぼ消滅しています。

 技術革新で消滅した職業というのは、他にもたくさん、いくらでもあります。そういう職業についていた人は一度は失業して、年配の方ならばそのまま現役引退されたかもしれませんし、まだ若ければ最終的には他分野に転職した人が多いと思います。

 プログラマーがこういう未来をたどる、という可能性について議論したい、ということなのでしょうね。

AIの水準はそのレベルに達しているか:まだ無理

 残念ながら、昨今の人工知能ブームで中心的な役割を果たした深層学習は、「人間のような高度な判断が行える」という域には達していません。「ある程度人間の判断を代替できる」「大量のデータに対して機械的に適用できる」といったあたりが関の山です。

 機械翻訳などがわかりやすいでしょう。最近の機械翻訳は深層学習の技術を取り入れていて、単純な文であればかなり正確に翻訳できます。左の文を現在のgoogle翻訳に入れると「
Modern machine translation incorporates deep learning techniques, so simple sentences can be translated fairly accurately.」と訳されますが、かなり文意の通じる訳文になっています。

 ただし、含意まで読み取るというところまでは実現できていないのが現状です。それに、専門用語やスラングなどを文脈に合わせて翻訳する、といった必要があるケースでは、かなり不満の残る結果しか得られません。

 「コンピュータはあいまいな情報を処理するのが苦手」ということは昔から言われていましたが、最近は「あいまいな情報からも適当に推論してしまう」というあたりまでは達しています。だけど、あいまいに見えても背後には案外しっかりした規則があって、人間にはそれがわかるけど機械にはわからない……というような状況では、あまり深層学習は役に立たないはずです。

 このあたりは技術の発展を待つ必要がありますが、とにかく大量のデータを突っ込んで、深層学習モデルで学習させて……という方向性で人間の判断を模せるレベルのものを作るのは、個人的には不可能だと思うし、AIの分野の人達もそういう方向性は目指していないのでは?

 何らかの技術的ブレークスルーがないと「もっと幅広い応用」は出てこないと思いますが、使えそうな技術の基礎研究はある程度出尽くしていて、その応用に力が注がれているのが現状です。もちろん深層学習の次世代(になるかもしれない)技術を研究してる人はたくさんいると思うんですが、現時点ですごく優秀で使えることがわかっているというものはありません。当然ですね。

プログラマーっていってもけっこう難しいことをしている

 プログラマーという職業の人達がどんな仕事をしているのかを考えてみましょう。機械が代替できるかどうかは、このあたりにかかっています。

 とりあえずどんなプログラムを書くにせよ、その前に要件定義とか仕様の決定とか設計文書の作成とかをやるというのが典型的なケースです。中には、そこまできっちりやらないでとりあえず試作してみて、お客さんの反応を見ながら正式な仕様を決定していくみたいな方針もあると思いますが、考えることが多くなりすぎるのでやめます。

 たとえば、こういうのを考えましょう。「プログラム 設計」とかでググって適当に出てきたサイトからの引用です。

プログラム設計書の書き方の例

定数リスト
No|名称|値|型|クラス名|ファイル名|書式|説明
1|BOOK_LIMIT|30|int|book|testdayo.Java static final int BOOK_LIMIT|収容できる本数の上限

関数定義
書式:boolean check_book_limit(int storage)
機能:収納したい本の数(storage)が収納の上限数(BOOK_LIMIT)内に収まるかを真偽値で返す
引数int strageの意味:収納したい本の数
戻り値:true:収納できる
戻り値:false:収納数が上限を超えるため収納できない

プログラム設計書とは?|各設計書の違いと書き方 - Midworks

 おおすごい、ぜんぶ挙動が定義されてる……これなら機械処理できるんじゃね? と誰でも思います。とりあえず、クラスは省略してpythonで書いてみましょう。

BOOK_LIMIT = 30

def boolean check_book_limit(storage):
    return storage <= BOOK_LIMIT

 上の「プログラム設計書」から下のコードくらいのものを生成できれば良い訳ですね。なるほど、楽勝だ……。20年くらい前にも同じようなことを考えた人たちがいて、やろうとしたのですが、あまりうまくいかなかったそうです。やっぱり、機能が複雑になったり、説明が曖昧だったり手抜きになったりすると破綻するのでしょう。

 思いつく問題点をとりあえず列挙してみると、

  • 上の例だとしっかり書かれていて「収納の上限数内に収まるか」なので曖昧さはないけど、「以上」「未満」「より」とか出てくると途端にカオスになって曖昧さが紛れ込む。自然言語はそんなものです
  • とりあえず、自然言語だと解析が辛いから、曖昧さのない形式言語で書いておきたい→プログラミング言語で書くのと何が違うの? という話に
  • そもそも、この粒度の仕様が作れるなら、仕様書書く代わりにプログラミングしても良いのでは……?(上の仕様からプログラムを書き起こすみたいな仕事は、AIに関係なく減っていくと思います)
  • 現実に与えられる要求は「本が本棚に収まり切るかどうかチェックしたい」「ボタンを押すと画面が明るくなる」みたいなレベルのやつで、文脈とか背景知識があれば要求されている通りのものが作れるが、逆に機械にやらせようと思ったらそういう部分をぜんぶ打ち込まないといけない。つまり、へたにプログラムを打つより苦労する可能性がある
  • 自動生成できてもパフォーマンスは保証してくれないことが多い。出てきたものがすごく遅かったとき、どうする?

 なかなか難しいですね。こういうところを解決できるのは人間だけです。いや、機械でも「ここ曖昧でよくわからんから教えてくれ」って人間にフィードバック返しながらやればできるのかもしれないけど、最初から人間が打ち込んだ方が楽なんじゃないかなぁ。

プログラマーを代替できる水準のAIが作れるなら、プログラマーに限らず色々な職業が消滅する

 こういう問題が解決して、適当に仕事を押し付ければ満足の行く結果を出してくれるAIが仮に作れたとしましょう。

 そういうAIは人間のプログラマーと同じ水準の仕事ができる訳ですが、こういうAIが作れるようになって失業するのは何もプログラマーに限られません。消える職業の方が多いでしょう。

 ことさらにプログラマーがどうの、という話をする前に、考えるべきことがたくさんある訳です。「プログラマーはAIに取って代わられるのか、じゃあなるのやめよう」と思って別業種に就職した就活生がいたとして、その職業が先にAIに取って代わられない保証はまったくないのです。

 だから、真に受けてプログラマーの将来だけ心配するのは馬鹿馬鹿しいし、真剣に考えるなら社会全体の問題です。

まとめ

 AIに関係なく言語や技術が廃れて「これまでやってきた仕事がなくなる」ことはこれまでにも頻繁にあったと思います。それはそれでなんとかしてきた訳で、当分はその延長線上で推移すると思うので、今までどおりなんとかなるでしょう。

 実際問題として20年先のこととかはわからないし、真面目に考えて人生設計に反映している人がどれだけいるんですか? という話でもあります。だから、別に気にしなくていいんじゃないですかね。

*1:といっても、今の研究はデータサイエンス寄りで、この辺にはほとんど絡みませんが……

*2:前もあったよ! といえば、それはまあその通りなのですが

*3:さも見てきたかのように書いていますが、実際に見たことはありません。こういうことをしていた世代の人は、古い人だともう鬼籍に入られている方も多いくらいでしょう