アラサーコーダーのコーダー精神論 -コンピューターは電卓のオバケです-

# まえがき

「個人ブログにでも書けよ」

もっともである。
しかしながら、今まで組織で働いて後輩は居ず、昔に塾の特別講師としてプログラミングを教えたときや、[CoderDojo](https://coderdojo.com/)でメンタリングしてるときに、何となく通じ合ってないところを感じたしたため、
「もしかしたら、プログラミング初心者・初学者がステップアップできない、思想的なハードルが存在するのでは？」
と思ったため、この記事を書いてみた。

* 問題あればQiita運営に通報してください。
* ツッコミ場所はたくさんあります。

# 「コンピューターって電卓のオバケだからね？」

口を酸っぱくして伝えているつもりなのだが、うまく伝わってないことがままある。
もしくはそもそも当人に伝わっていないのかもしれない。

なので改めてここに記させてもらう。
**今のコンピューター（スマートフォンも含む）は、電卓のオバケだ**

今のコンピューターすごいよな。行ったことも無い国の会ったことも無い人の撮影した動画が見れたり、それどころか同じ時間にそんな人とビデオチャットもできるのだし。
（「うん？　*インターネット*では？」　その通りなんだけど、ここではいったんとばす）
さらに言うと音楽聞けたりアニメ見れたり、一人でもゲームできたり……さらに言うと作れたりね。

でも、電卓のオバケなんだ。さらに言うとその電卓も、例えばの話、
「電気が5ボルト以上でその場所を通ったか通ってないかの組み合わせ」
で、ボタンを押されたことを知って、計算して、画面に数字を表示している。
（「え？　液晶の表示はそうじゃないだろ……」　その通りなんだけど、ここもとばす）

「モールス信号」って知っているだろうか。理屈はあれである。
むしろコンピューターは、「トン・ツー」の「トン」だけで動いてる。

それなのに、なんで5桁の足し算や3桁同士の掛け算が一瞬で終わるのかという話だが、早いからだ。
最近のコンピューターは1秒に300億回、電気を通したり通さなかったりしてる。
（「え、I/Oとかメモリアクセス考慮してないだろ？」　その通りである）

人間はよっぽどの超人でない限り、コンピューターの300億分の1秒の世界を認知して処理することはできないだろう。
しかし人間の想像力を使えば、たとえ完全ではなくとも、ごくほんのちょっと一部はわかるかもしれない。

ということで、ここからバカげたことを承知だが、

* コンピューターの気持ちになれ
* CPUの気持ちになれ
* パケットの気持ちになれ

を記しておきたい。

「『気持ち』ってなんだよ……」
気持ちになれなくてもいいや。
とりあえず、
「自分の部屋がもしコンピューターの中身だったら」
「自分がもしCPUみたいな仕事をしたら」
「自分がパケットと一緒にWi-Fiでとんでたら」
みたいなことがイメージできたら、もっとプログラミングができる……かもしれない。

そんな話を、 Too long; Don't Read に書いてく。

## コンピューターのきもち

[コンピュータのき・も・ち / 新教養としてのパソコン入門](http://cruel.org/asciipc/)。

上記リンク先の各記事を、何度も読んで頂けるとすっごくありがたい。

実は上記リンク先の記事を読んだのは書籍で、それこそ2002年、自分が小学生の頃に移動図書館でたまたま見つけたので、読んで感動したことは覚えてる。特に[第3回：コンピュータの孤独と虚無](http://cruel.org/asciipc/kimochi03.html)は一読して頂けるとありがたい。

読んで頂けるとわかるかもしれないが、コンピューター（というより計算機？）そのものは、
「その信号が何を意味しているか知らずに、興味もなく電気信号をやり取りしている」
装置に過ぎないことは分かっていただけるだろう。

……なに？
「考え事しないでどうして計算ができるんだ？」
ということで、分かりづらい例え話を。

### 記号と意味付け

あなたがもしも言葉のわからない国でジャガイモ一つを渡されてその国の市場に放り出されても、
ジャガイモを売っているお店を見つけて以下の手順を踏めば、お店の人に、
「手に持ってる芋と同じものが3つ欲しいのか」
と伝えられるかもしれない。

1. 左手にジャガイモを持って相手に見せる
2. ジャガイモを右手の人差し指で指差す
3. 右手の人差し指と中指と薬指を立てて相手の目を見る

なぜ通じるのか。

幸い、人間は「数」という概念を持っている。
また、国ごとに多少違いはあるが、指の立ってる本数で数を伝える国は比較的多いはず。
そして、お店の人がこちらが伝えようとしている情報を汲み取ろうとしていれば、頑張れば多分通じる。

---

この記事を書いている当人は当人なりに頑張って、
「どうやったらこの気持ち含めた考えを伝えられるか」
と書いているが、所詮長文駄文ポエムなので、読み手が意味が無いと思えばただの変な記事なのだ。
ましてや日本語が分からなければ、異国の一般人の戯言である。

戯言ではあるが、コレをプリンタでコピーしたり、このようにQiitaというWebサービスを使って伝達することは可能である。
（「伝達に利用する資源が無駄だ。もったいない」という話は少し小脇に置いていただきたい）

なので記号にはせめて共通の意味付けをしなければ記号の受け手には理解されないとは思うが、伝達だけを考えればその限りではない。

そしてコンピューターはその伝達の途中で決まりきったルールに該当すれば、別の決まりきった信号に変換したりするということしかしてない。
あなたのパソコンやスマートフォンが、どれだけ美麗な映像と感動的な音声を流していて、あなたが脳汁がドバドバ出る衝撃を受けていたとしても、パソコンやスマートフォンは電気工学と物理法則に従って、信号を右から左に渡してるだけである。

---

「じゃあ、なんで電気が通っているか通っていないかの情報や信号だけで音や映像が出来上がるの？」
と思った方は、*標本化*, *符号化*, *量子化* 等のワードで調べて頂けると幸いである。
2進数や16進数というものが、コンピューターでどうして扱いやすいのか分かるかもしれない。

## とっつきづらいディレクトリという考え方

元ネタ、[連載第 10 回：コンピュータは、電子ファイルの夢を見るか？](http://cruel.org/asciipc/kimochi10.html)

筆者はファイルシステムについての専門家ではないし、趣味で[Unix-vx6](https://pdos.csail.mit.edu/6.828/2016/xv6.html)のソースコードを3ヶ月に1回読むか読まないか程度の人間である。

しかしながら、CoderDojoのメンタリングをして毎回、
「おや？」
と思うのは、深いファイル構造を把握しきれてないNinjaが居ることである。
と言うと語弊はあるが、がっかりしている訳ではなく、パソコンにあまり親しくない少年達が、
「Windowsのスタートメニューで呼び出されるアプリの実体がどこにあるか」
なんて、いちいち気にすることのほうが珍しいし、気にするのは大抵何かうまく行かないことが起こって、自分しか頼りになる人間がいない時である。

そしてこんなことを偉そうに書いている自分も、Linuxのルートディレクトリ直下のそれぞれのディレクトリが何を担っているのか把握していないし、WindowsやAndroidやiOSなら尚更わからない。

さて、元ネタの文章を引用。

> 　初めてこの話をきいたとき、ぼくはまさかと思ってとても信じられなかったんだけれど、その後会社で、自分の作ったあらゆるファイルをすべてデスクトップに並べている人を見かけて、その認識を改めた。「フォルダ作って整理したらどうですか」ときくと、「いや、それをやるとどこにあるかわからなくなるからこの方がいい」と言う。ぼくから見ると、そうやって全部広げてあるほうがわかりにくそうなんだけれど。まさに何がどこにあるかわかるようにするために、フォルダを作って整理するんじゃないのー？　でも、コンピュータの構造を空間的にとらえていない人にとっては、そういう考え方自体がわかりにくいわけ。階層型のフォルダが好きな人は、「ファイルがフォルダの奥深くにある」と言ったりする。その人は、「深く」とか「浅く」とか、無意識に何か立体的な構造をそこに思い描いているのね。それに対して、すべてを広げる人は、平面的な理解をしているか、あるいはそういう空間とか場所的な考え方をまったくしていない。

らしい。（とは言え、15年前（執筆時点）に書かれた記事だが）

筆者個人としては、そんな「立体的な構造をそこに描いている」意識はない。
むしろ平面的な樹形図を思い描いて、今やりたい操作に対して関係ない枝は隠しているようなことをしている気がする。

### 木構造って便利か？ -コンピューターにはとてつもなく便利-

便利なんだよなあ……。
なんて言ったって、木構造の考え方はアルゴリズムの教本に必ずと言っていいほど書いてるものなあ……。

筆者は総和とかはわからない。∑の周りの数字の意味をWikipediaで調べて分かっても、右辺の数式に展開できないくらい頭は弱い。

とは言え、木構造の強みはフィルタリングが数学的に行えることが強みだ。

フィルタリングするということは、余計な情報・信号をカットする。カットした分計算する量が減るのである。

「そんなもの、適当にカットできるだろうに……」
なにを言ってるんだ？　コンピューターは **適当が（基本的に）分からないんだよ**。

2018年現在の深層学習技術を駆使すれば、適当加減や塩梅が人間よりも早くつかめるかもしれない。
しかし適当を学習するために、馬鹿正直に総当りして白黒ハッキリさせた後に適当加減が分かるので、人間よりもいっぱい計算するし、その時に消費する電気エネルギーと排出する熱エネルギーは莫大。
僕の5畳で9℃の部屋が、パソコンの排熱で暖が取れるか、パソコンが燃えるか、その前にブレーカーが落ちるかもしれない。

とはいえ、コンピューターにはたくさんの情報を元に計算させたいので、コンピューター自身でもある程度適当に楽に計算できるデータ構造に予めしておけば、コンピューターが計算しやすいよね。
だから木構造って便利だよね。ということで木構造が採用されているし、他のデータ構造を考える必要も思い当たらないのだと筆者は思う。

コンピューターは暗記するより計算したほうが早いことがある。
データとして補完するより、何らかの数値を計算して再現した方が早い場合がある。
とはいえ、時間を削るために電気エネルギーと計算時の排熱は、はかりにかけることは偶にある。

# 本題 -コーダーとして-

元ネタ、[ハッカーになろう (How To Become A Hacker）](http://cruel.org/freeware/hacker.html)

このエッセイも読むと良いと思う。

筆者がこんなポエムを書いている時点で心構えだけのコーダーなのは、読者の皆様ならお気づきだろう。
実際そのとおりだ。

小学生時代（2000年頃）にHot Soup Processorで、ifとGotoだけのプログラム（？）を書いたり、HTMLとコピーペーストのJavaScriptで、無料のレンタルサーバーに空想癖こじらせWebページ作ったり。
高校時代（2009年頃？）に初めてUbuntuを触ってPythonで初めてWhileを使ったプログラム（？）を書き、
専門学校、新卒でVB.netプログラミング。
その後PHPやC#やったりPythonでハードウェアプログラミングやったり、
Webコーダーの需要が一時期多かったのでHTML,CSS,CoffeeScript,関数型パラダイムのJavaScript、
今はUnityC#用のデータ作成のPowerShellを書きつつ、趣味でNimとかRustとかHaskellとか触ってる。

*人間のやりたいことをある程度コンピューターにやらせれる。そんだけだ。*

プログラミング言語が書けるだけなんだ。
アルゴリズムを自分で組んでどうのこうのなんてできない。
実際、新卒の会社でVB6案件に携わった時は、可変長配列データをVB6で自作で作れなかったため（VB6でそんな便利な配列データもあるわけ無く）、リストボックスを隠してそこにデータを格納してやりくりしたことがある。
今考えてもひどいし、実は未だに二分岐探索のプログラムを自力で組める自信が毛頭ない。

今の学生見てるとすごいよ。Arch LinuxでXmonad使ってたりするし、27歳独身コーダーはUbuntuもよく分からないで、雰囲気でコマンド打ってるし、Windows10も雰囲気で使ってるよ。

本当はもっと姿勢だけのダメ人間エピソード書きたいのだが、この辺で。

# もっとミになりそうな話を

ということでToo Long; Don't Readな文章を書いたが、まさかここまで読んでる人は居ないと思いつつ、まとめを。

* コンピューターは電卓のオバケ
* 信号、数字列、文字列に意味はない。意味付けは人間がする

とりあえずこの2点。
それとまだ書き足りないことがあるとすれば。

* 「分かるかもしれない」と思う
* 「チョットデキル」は大事

時間は多少書かるし、個人差はあるものの、勉強や学習って本当に一生やるものである。
自分だけかもしれないが、「分かるかもしれない」と思って勉強すると、「チョットワカル」。
ただの思い込みかもしれない。いや、むしろそうなんだろう。

でも時には思い込みの力がすごいと思うのだ。

意外と関係ないと思ってた知識が、どっかでつながることもあるし。
少しでも分かるところがないかとUnix-xv6のソースコード読んでたら、（基本的なことだろうけど）無限ループ内でデカイデータの移動とかはしちゃいけないとか、読み解ける。

ましてや今GitHubなんつーソースコードSNSがあるんだから、いい時代になったとオジ……オニイサン思うよ。

読んで、咀嚼して、書いてみて。
そのままコピペで終わらせないで。
余裕があれば数学的アプローチも勉強すると楽しいぞ。
言語学も学ぶと、別の視野が広がるかもね。

したっけね。