AI 時代に真っ先に駆逐される職業は(コピペ)プログラマなんじゃないだろうか
面白い記事を見かけた。
この手の話はこの時期特有の風物詩みたいなものだ。 春の季語といってもいいかもしれない(笑) 似たような話で印象深かったのが3年前に読んだこの記事。
この記事ではプログラミングができない人の問題を「習慣」に求めている。 また最初に挙げた記事では
とし,主に教育または学習方法の問題と考えているようだ。
しかし,世の中には「文章またはコードが読み書きできない人」というのが存在するのだ1。 何故そう言い切れるかというと,私も(どっちかというと)そちら側の人間だからだ。
数学の問題を解くのに公式の暗記から始める人はプログラマには向いてないので諦めた方がいい
私のようなタイプの人間が「職業プログラマ」としてかろうじて禄を食む生活が成り立っているのは「理解に時間をかけることを苦としない」性格だからに過ぎない(頻繁に間違うので人生ブレまくりだがw
)。
その一方で,競技プログラミングとか「なんたらキャンプ」とか「なんとかジャム」みたいに,特に短期で解(理解ではない)を求められるものは本当に苦手だったりする。
学校教育の問題でも習慣の問題でもなく読解力の弱い人は一定数いる。 これについて端的に語られているのが『AI vs. 教科書が読めない子どもたち』であろう。 (感想文にも書いたが)この本に書かれている将来予測はともかく,読解力に対する調査結果は非常に興味深い。 以下に一部を挙げてみる。
母国語の文章の読み書きがうまくできないというのは日常生活が辛い状況だが,プログラミング言語に関してはそうでもない。 プログラミング言語を知らなくても日常生活には困らないからだ。
私はこれをセンスの(優劣ではなく)差異と考える。 プログラマに向いてないなら他の職業に就けばいいのだ。
プログラミングってのは算法(algorithm)の塊でしかない。 それを理解し記述するのに必要なのは,昔も今も,美術(art)ではなく算術(arithmetic)である2。 故に数学の問題を解くのに公式の暗記から始める人はプログラマには向いてないので諦めた方がいい。
【付録】 Fizz Buzz で遊ぶ
「世の中にはプログラミングを理解できない人間が存在する」に出てくる Fizz Buzz は以下のルールで遊ぶゲーム(暇つぶし)である。
- プレイヤーは複数(独りでは「世界のナベアツ」になってしまう
W
) - プレイヤー間で順番を決め 1 から順番に数を数えていく。ただし
- 3 の倍数の場合は “Fizz” と唱える
- 5 の倍数の場合は “Buzz” と唱える
- 3 と 5 の公倍数の場合は “Fizz Buzz” と唱える3
このルールのプログラミングが新人研修の演習問題とかで行われているらしい。
というわけで,まずは Go 言語で書いてみる。 今回は素朴にこんな感じ。
package main
import (
"fmt"
"strconv"
)
func newCounter() func() int {
ct := 0
return func() int {
ct++
return ct
}
}
func fizzBuzz(n int) string {
if n%3 == 0 && n%5 == 0 {
return "Fizz Buzz"
} else if n%3 == 0 {
return "Fizz"
} else if n%5 == 0 {
return "Buzz"
}
return strconv.Itoa(n)
}
func main() {
max := 30
c := newCounter()
for n := c(); ; n = c() {
if n < max {
fmt.Print(fizzBuzz(n), ", ")
} else {
fmt.Println(fizzBuzz(n))
break
}
}
}
数列を発生させるカウンタ関数4 と Fizz Buzz を唱える関数を使って for 文でぐるぐる回してるだけだ。 終了条件として30まででカウンタを止めるようにした。 これを実行するとこうなる。
$ go run fizz-buzz.go
1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, Fizz Buzz, 16, 17, Fizz, 19, Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28, 29, Fizz Buzz
とりあえず正しく動いてるかな。
そして今度はこれを C++ で書き直してみる。 こんな感じかな。
#include <iostream>
#include <string>
auto newCounter() {
return [ct=0]() mutable {
return ++ct;
};
}
auto fizzBuzz(auto n) {
if (n%3==0 && n%5==0) {
return std::string("Fizz Buzz");
} else if (n%3==0) {
return std::string("Fizz");
} else if (n%5==0) {
return std::string("Buzz");
}
return std::to_string(n);
}
int main() {
auto max = 30;
auto c = newCounter();
for (auto n = c(); ; n = c()) {
if (n < max) {
std::cout << fizzBuzz(n) << ", ";
} else {
std::cout << fizzBuzz(n) << std::endl;
break;
}
}
return 0;
}
完全に動くコード(の筈)なので動作確認は各自でどうぞ5。 ロートル・エンジニアから見ると auto 変数めっさ便利(笑) でも if 文や for 文の式を括弧で括るのかったるいし,型を前置するの違和感が半端ない。
今ふと思ったが,私の母国語って既に Go 言語になってるな。 Fizz Buzz のコードを脳内で記述するときに Go 言語で考えてたもんな。 この歳になって母国語が変わるとか結構すごいことなんじゃないだろうか。
ブックマーク
参考図書
- プログラマの数学 第2版
- 結城 浩 (著)
- SBクリエイティブ 2018-01-16 (Release 2018-02-08)
- Kindle版
- B079JLW5YN (ASIN)
- 評価
タイトル通りプログラマ必読書。第2版では機械学習に関する章が付録に追加された。
- いかにして問題をとくか
- G. ポリア (著), Polya,G. (原著), 賢信, 柿内 (翻訳)
- 丸善 1975-04-01
- 単行本
- 4621045938 (ASIN), 9784621045930 (EAN), 4621045938 (ISBN)
- 評価
数学書。というか問いの立てかたやものの考え方についての指南書。のようなものかな。
-
人は生まれながらにして平等,ではない。包摂と排除は表裏一体であり「人は生まれながらにして平等」と考える人がいるのならそれは平等でない人から「機会」を奪う不遜な人間である。 ↩︎
-
もちろん美術も算術も両方持ち合わせているならそれに越したことはないけど。私は美術センスが壊滅的だからなぁ。 ↩︎
-
言うまでもないが 3 と 5 は素数なので 3 と 5 の公倍数とは $3 \times 5 = 15$ の倍数を指す。しかし,この記事では知らないふりをする。 ↩︎
-
最初は(いつもの如く) channel を使っていたのだが, C++ に変換することを考えて関数閉包(closure)に書き直した。ただしこのままではスレッド・セーフにならない。 ↩︎
-
手元では C++ コードの動作確認を MinGW-w64 Windows版の GCC 7.3 でコンパイルしたバイナリで行った。 ↩︎