timakin.log

╭( ・ㅂ・)و ̑̑

不自由なプログラミング

プログラミングは自由ではない

ここ最近、 「プログラミングを勉強して自由な働き方を手に入れよう!」 みたいな趣旨の記事や広告を良く見かける。 大方プログラミング教育系の事業が増えてきているからだと思う。

それに対して非常に違和感を感じる。 というのも、自分の中でプログラミングは楽しいものではあっても、 決して自由と近しいものではないと思うからだ。

自由に一番近い職業と言われると、確かにそうかもしれないが、 それでも他の職業と同様にエンジニアは不自由だと思う。 (とはいえ新卒なのでなんとも言えない)

ここ最近プログラミングが楽しくないと感じる機会が少なからずあるので、 その理由と合わせて違和感の原因を整理しておく。 なので、この記事の正確な主旨は、「僕が」プログラミングを不自由に感じる場面とその理由、だ。 (下記は自分の技術力のなさを棚上げしている。このタイミングでまさかりが飛んできたら死ぬ。)

嫉妬やコンプレックス

これが一番大きいと思う。

自分は文系だし、コンパイラを自作したことも、アルゴリズムの授業を受けたこともない。 ハードウェアの話になるとついていけないことが多いし、 「型がぁ〜」「メモリ効率がぁ〜」とか言われると、 相手がどんなユースケースを思い浮かべて話しているのかたまにわからなくなる。 JavaScriptやった後に型が欲しくなるとかならわかるが。

つまりは、相手にあって自分にない、学術的な背景に対して、 僕は大きなコンプレックスなり嫉妬がある。

文系というひとくくりにはできないが、少なくとも理系の人より モラトリアム的な学生生活を送れる可能性が高いことは間違いないと思う。

その分、自分は今の専門と学生時代の専門が離れていることに、 少し寂しさに似たようなものを覚えるし、学校で習ったら 多少違ったものになっていただろうとも思う。

ただ最悪なのが、「 理系に進んでいてもうまくいかなかっただろう 」 という確信に近い考えが、たまに浮かぶことだ。

僕は演繹的な考え方ができない。

ここでいう演繹的な考えというのは、 「理屈を説明されて、そのあとどう応用するかなんとなくでもわかる」という意だ。 特にアルゴリズムを勉強しようとして、何度も挫折している理由はここにある。 以下の記事でいう、「役立つことが分からないと先に進めない子供」というのが僕のタイプだ。 togetter.com

数学とプログラミングの能力はあまり相関がないというが、実際問題 考え方の面では、相関があると思う。 どうしても「これなんの役に立つんですかねえ」という疑問が真っ先に頭の中に浮かぶ。 しかも、その「役に立つ」が、ユーザーから見てどう役に立つのかわからないと全く理解が深まらない。 ページの表示速度が何%早くなったとかならまあまだしも、 「こういう書き方をすれば美しい!」という観点から技術を評価することが、僕にはあまりできない。 (あまりと書いたのは、たまに理解できるからだ。  Rubyenum.inject(:+)なんて書き方を知ったときには、  さすがにカッコイイなあと感じた。  かっこの中身が梅干し食べた人の顔文字みたいになっていることも含めて。)   理屈で言えばすごいんだ、わかるでしょ?これくらい効率化するんだよ? と数字や処理の流れを見せられても、そこでどういう 情報が行き来するのか、生きたものを見ない限り理解できない。 そういう意味で僕は帰納的な理解の仕方だと思うし、 演繹的な理解ができるエンジニアの方に対して、 嫉妬心を覚えることが多い。

説明下手

  • なんの役に立つのか(前述)
  • つまりどういう取引が行われるのか
  • というかお前の言っている言葉はなんなんだ

という疑問について、3段階くらい深堀しないと まともな答えが返ってこないことが多い。 これは人に聞いた時よりもググったときの方が多く感じる。

ググれと言われても、ググってわからないことの方が多いから聞いていると言ってもいい。 その分人に聞いてわからないときは、自分の聞き方が悪いのか相手の説明が悪いのか判別がつかない。

「ウェブの原理なんて、元来人同士のコミュニケーションを置き換えたものなのだから、  頭の中で人同士のやりとりに言い換えられたら、理解が捗るんだよ」  と言った某氏がいたが、本当に目からウロコの考え方だった。  ただそういう説明事例は非常に稀である。   あるいは、 howdns.works

このサイトのように、裏側でどういう登場人物が いるのか明らかにしてくれれば、とても理解がはかどるのに、と思う。(めんどくさいけど)

あとは、単純に用語の問題だ。 名前空間とかもっと言い方あったろ。 モジュールとか、レキシカルスコープとか、 最初聞いてもなんだかわからない単語に出会ったとき、 エンジニア特有の衒学的な雰囲気が垣間見えて逃げ出したくなることが多かった。

このように、自分の理解できない説明が多すぎるのと、 それが自分が原因なのか相手が原因なのかわからないことによる ストレスが尋常じゃないため、学びのモチベが下がることがある。

所詮は技術であるということ

この言葉を見て、僕は所詮手段としてプログラミングを見ているのだな、と感じた。 とはいえ、自分がエンジニアとして働こうと思ったのは、 技術自体に面白みを感じたという点もなくはないので、むしろ賛成派だ。 プログラミングを完全に手段として見ている and ( 軽くしか触ったことがない or 触ってない )のに、 軽々しく共感の空気を醸し出すビジネスサイドの人がいた場合、ちょっと心の奥で反発してしまう。

ただ、どこまで行っても結局スターになる要因は、技術ではなく事業だと思う。 まれに技術自体を追求した結果、うまくいってる事業があるように見えても、 それはただ単にその技術自体が、ユーザーのニーズに合っていて、 市場規模が十分あったからという話であって、 大概はそうじゃないと思う。

周囲のエンジニアに「将来どうしていくの?」と聞いても、 エンジニアとしての道を追求する人が、 存外多いというか、ほとんどがそうであることに驚いている。

それだけの覚悟があるのを尊敬する一方で、いずれか タイプライターのように消えうる職業にしがみついても 良いものだろうか、と思ってしまう。

何より、サービスという箱庭の中でユーザーがどういう行動を見せるのか、 その満足度を上げて、サービスを確固たるものにするには どうしたらいいのか、形骸化しない、経済効果のある サービスを作るにはどういう仕組みを導入すればいいのか、 というような話の方が、内心はずっと興味がある。

いつか事業サイドに移っていかないと、 泥舟に変わる技術に足を取られたり、 自分が成し遂げたいことを見失ってしまったまま、 事業に従属するパーツとしてのエンジニアになってしまうのでは、と恐怖感を覚える。

それでも、自分に確固たる力がないこと、 技術自体にも魅力があること、その途上にあることをわかっているので、 どこかで踏ん切りをつけなければと思っても、 その目処は全く立たないため、喪失感を伴うジレンマに襲われる。 そのせいか、一歩離れて技術を冷めた目で見てしまう自分がたまにいる。

コードが読めない

僕はコードが読めない、というわけではないが、読むのに苦労する。 なぜ苦労するのかというと、

  • 通常の文章のように順序よく読めるものではなく、変数・メソッド単位で縦横無尽に目を移さなければならないこと
  • パラグラフ的な読み方がなかなかできない

の2点が原因だと思う。 コードジャンプ機能がないと色々絶望することが多いし、 コメントがない or 変数名がわけわからないと本当に悶絶する。 (名付けは死ぬほど難しいというか自分もできてないが。)

r7kamuraさんのRubotyの初期commit logを追っていた時に、初めから READMEの冠詞にまで気をつけているのをみて、感動に震えたことがある。 ただ、それは極端に良い例で、ほとんどのコードは順序よくひとつなぎで並んでいるわけではないので、 「コードリーディング」というのは、断じて文章読解とは近くないと思う。

加えて、僕自身パラグラフリーディングというのは苦手で、 「ここのコードは適当でいいか」とか、「ここの処理は詳しく読もう」という割り切りが なかなかできない。

概要把握的な読み方をしたいが、だいたい浅い理解で終わっているだけで、 すごい大きなまさかりが飛んできて涙目になることが多い。 ぼちぼち、コードリーディング履歴を記録したり閲覧できるサービスでも 作ってみようかなと思うくらいにはフラストレーションが溜まる。

職業としての普通さ

冒頭の 「プログラミングを勉強して自由な働き方を手に入れよう!」 という触れ込みに戻るが、 働き方としてそこまで自由とは思わない。

恵まれすぎて働き方に身体が肥えてしまったのかわからないが、少なくとも僕の場合、 ノマド的に自分が居座る座標をxからx'に移したところで、モチベーションは特に変わらない。 むしろ、思ったより制約が多いし、前述のようなストレスもあるので、ただのおしゃれな(に見える)職人でしかない。

天才か、あるいはすごい秀才はこれが楽しいのかもしれないが、 それはあくまで強者の特権だと思う。

逃げの手段としてプログラミングを選んだ場合、 不自由どころかひたすら不幸なだけのプログラミングをする 羽目になると思っている。 あるいは、ただの代替可能な労働資源になるだけなので、 他と変わらない普通の職業人になると思う。

だから、どこか矛盾する気もするが、技術自体に興味があったり、 突き動かされるものがないなら、エンジニアになるべきではないんだろうなと思う。 ましてやそういったことを考えずに、ただエンジニアになれと焚き付け煽動するのは、 もう倫理的によろしくないんではないかなと、思ったりする。

おわり

以上のような理由から、 よくプログラミングやりたくねーなーと思うこともあったりするが、 それでもプライベートで好きにコード書いてるときは、 なかなかノったりするので、別に不自由でもエンジニアでいいんじゃね?と思う。 最善の選択肢を取ったことは間違いないが、自分が後々誰かを不自由に追い込まないように覚え書きを残しておきたかった。。