プログラミングを学ぶということ
こんにちは。
株式会社CHILLNNという京都のスタートアップにてCTOをになっております永田と申します。
現在積極的にエンジニア採用を行っており、多くの方と面談をさせていただく機会があります。自分自身まだまだ若いとは思っているのですが、もっと若いエンジニアの方々とお話をさせていただく中で 「とにかく技術力を高めたい」という話を聞きます。
自分は学生起業をしたのですが、起業する以前に複数のスタートアップでのエンジニアインターンと受託開発会社で仕事をさせていただいており、スタートアップ・メガベンチャー・上場企業などいろいろな開発現場に入らせていただいてきました。
どの現場においても、優秀な方々が日々猛烈に切磋琢磨していました。
技術力を高めたいという曖昧な表現の裏側からは、強い焦りを感じます。
何かを知るたびに知らないことが増えるので、それは焦るよなあと非常に共感するのですが、技術力を高める上で重要なのは、常に、今やっていることに全力でフォーカスできるかどうかです。
そこで、より長期的な視野でプログラミングを俯瞰し、少しでも焦りから解放され、目の前のことに集中できる人が増えればいいなと思い、ポエムを書くことにしました。
ちなみに、全く技術的な話は出てきません。すいません!
zennに出すか迷いましたが、一応長期的なキャリアの話だと捉えられるのでは?と思い、投稿することにしました。
プログラミングを学ぶということ
プログラミングを通して身につけるべき能力は「ものの見方」だと思っています。
プログラミングの世界は閉じています。
コードは、input
とoutput
とその変換処理によって構成されます。全ての結果に対してinput
という自明な説明を加えることができます。コードの外部から突然新しい機能が生まれたり、書いてある以上にいい仕事をしてくれることはありません。
幸運なことに自分は、エンジニアに限らず、広告会社のクリエイティブディレクターであったり、IT以外の事業をしている経営者であったり、学者の方であったり、プログラミングではない何かを極めた方々とお話をさせていただく機会があります。
そういった方々と、例えば事業戦略についてディスカッションをさせていただく際、結論は同じでも思考プロセスが全く異なることが多々あることに気づきます。
どのようなプロセスで結論に至ったのかを詳しく聞いていくと、思考のとっかかりとなる課題の認識すら丸々違っていたりします。
当然、背景となる情報も常に異なっているわけですが、不思議なことに、自信のあるアウトプットに至った時ほど結論が一致していることが多いのです。
それはなぜでしょうか?
答えのない問いに対しては推論を行うわけですが、推論は過去に入力した学習パターンに照らして確率的に行われます。
推論における情報処理のプロセスは異なっていたとしても、input
とoutput
は現実世界という同一の系に束縛されているため、教師データとなる正解は同じになります。
つまり、十分に練り上げられた精度の高い推論では、どのようなプロセスを辿ったとしても、現実の問題に対してであれば、同一のアウトプットが得られることが期待できるわけです。
自分の思考が上述した方々と同等だとは全く思いませんが、少なくとも思考が上手くハマった際には、こういった理由で同じ結論に至ることができます。
プログラミングの思考様式
上記の例で伝えたかったことは、
同じ思考プロセスでトライアンドエラーを繰り返すことの重要性です。
私は大学時代にプログラミングと出会ってのめり込んでからというもの、それ以外知らないからという理由で、あらゆることを無意識にプログラミングのモデルで解釈する癖がつきました。
ビジネスモデルを表現するときも、与条件をもれなく数え上げ、プロダクトが介在することによる状態遷移を表現するために、疑似コードを使うことが多いです。
ビジネス上の戦略も、これまでのケースをinput
とoutput
の因果と捉えてトライアンドエラーを繰り返すことで、いづれinput
として見落としていた要素に気づけるようになり、未来予測の精度が上がっていきます。
プログラミングを通して、因果律に執着するという基本的なスタンスが身につきました。
言い換えるなら、適切なinput
を見出すことができさえすれば、output
は高精度で予測することができるというスタンスです。
意識的に何か特定のものの見方を自らに強制することは通常困難です。
人間の思考は自然言語を扱うことによって行われますが、自然言語は曖昧です。
しかしプログラミング言語は、融通の効かない機械に命令をするための言語です。
自然言語に比べて曖昧さはなく、驚くほど簡単に思考のルールを強いることができます。
制約とは、すなわちクリエイティビティの源泉であり、
同じ思考様式を用いることで、その周辺に知識を積み上げていくことができます。
知識と思考力は複利で伸びていく
同じ道具を使い続けることで、その道具の扱い方が上手くなっていきます。
人間の能力の本質は後天的に身につくものだと思っていますが、能力は、すでに獲得した知識の周辺に構築されていくものだと考えています。
世界を見るために同じ道具を使い続けると、インプット量が増えるごとに記憶力が増し、ものごとを解釈するスピードも上がっていきます。
新たな知識を獲得する際にも、すでに解釈した既存のパターンとの差分を認識することができれば解釈が容易になります。
解釈が容易であるとは、すでに持っている情報と結びついているということなので記憶にも容易に残ります。
なんでこの人は、なんでも知っているのだろうか?
なんでこの人は、何を聞いてもすぐに自分の頭で考えて、それなりの意見を言えるのだろうか?
そんな人が、身の回りにいるのではないでしょうか。
彼らは極端に記憶力がよく、頭の回転が速いのでしょうか。
私はそうは思いません。
彼らは、自分の思考モデルに当てはまるように情報を抽象化するのが上手いのです。
抽象化が上手いから、新しい情報を簡単に自分の頭に収納することができます。
抽象化が上手いから、新しい議題を素早く自分の思考パターンに当てはめることができます。
私がこれまでに出会ったすごいなと思う人は、みな、20代の頃に何か特定のスキルをとことんまで突き詰めていました。
そして、年を重ねるなかで、スキルの適用範囲を専門領域から積極的に外に押し広げています。
特定の思考パターンを徹底的に叩き込み、それが染み付いた後に色眼鏡を通して世界を見ています。この色眼鏡こそが、知的活動において何よりも価値があるものであると思っています。
プログラミングを通して得た知識と思考プロセスは、これ以降の人生の知的活動を豊かにするための基礎となり得ます。
自信をもって、プログラミングの融通の効かなさを楽しんでいけたら最高ですね。
まとめ
ユニクロの柳井さんの需要予測は、現時点でどんな数値モデルよりも精度が高いらしいです。
どうやら、何かに固執して、長年磨き続けることでしか見えてこないものがあるようです。
私は、プログラミングこそ至高だとは思いませんが、上でも散々語ってきたように、少なくとも単なる課題解決のツール以上の価値があると思っています。
プログラミングは一人でできます。
社会からのフィードバックを待たずして、高速にトライアンドエラーを繰り返すことができます。
プログラミングは豊かだから、迷うことなく技術力高めていこうぜ!という話でした。
次回以降はちゃんと技術記事を書きます。
Discussion