著者:张砷镓
初出:WeChat公式アカウント「镓话(jia-talking)」
あるレストランの料理長は腕が良く、評判が広まり、客が全国各地から名を聞いてやって来た。しかし、これはレストランのオーナーにとって、単に良い知らせというわけではなかった。なぜなら客はレストラン目当てではなく、料理長の腕前目当てで来ているからだ。オーナーは何とかしてこの料理長を引き留めなければならない。さもなければ、彼が他社に引き抜かれたら、レストランの商売は一気に落ち込んでしまうからだ。しかし、オーナーが血のにじむような努力で料理長の忠誠を確保できたとしても、リスクは依然として存在する:
料理長が休んだり休暇を取ったりすると、料理の味で客を満足させることができない;
料理長は一人しかおらず、複数の場所で支店を出そうとすると、味を保証できなくなる;
料理長がどんなに優秀でも、同時に作れるのは一皿だけであり、客は増え続けるのに、供給はいつも需要に追いつかない;
料理長も年を取り、いずれ引退する。弟子を取るなら、どうやって弟子の忠誠を引き続き保証するのか?
ある日、オーナーは突然悟った。料理の味を決めるのは料理長の調理の過程であって、料理長本人ではない、と。もし料理長が自分の各料理のレシピを書き出してくれれば、他の料理人に調理させることができるのではないか? 他の人がレシピ通りに作っても元の味の100点には届かないかもしれないが、90点には必ず達する。そしてその程度の差は普通の客には見分けられない。こうしてレシピさえあれば、レストランの料理の品質は保証され、店舗拡大や支店展開なども問題にならない。
そこでオーナーは料理長と一晩中話し合い、レシピという技術を資本として出資させることを説得した。数年後、レストランの商売はますます好調で、無数の支店を出し、オーナーは大金を稼ぎ、料理長も手厚い配当を得て、もはや毎日腕一本で食べる必要はなくなった。
プログラミングとは何か?
洗濯機が登場する前、人々は手でしか洗濯ができず、浸す、もみ洗い、すすぐ、絞るという一連の手順を踏む必要があった。全自動洗濯機の発明により、洗濯という作業は誰でも簡単にできるようになり、かつて洗濯に使っていた時間を他のことに使えるよう解放された。洗濯機の絶え間ないアップデートにより、洗濯の一連の手順は最終的に人々の記憶から忘れ去られるだろう。洗濯機を設計するエンジニアだけがその手順を理解している。彼らがその最適化と改良を担当しているからだ。
いわゆるプログラムとは、ある要求を実現するために設計された論理的な流れである。料理長のレシピも洗濯機の動作手順もプログラムである。ただ、前者は人間が実行し、後者は機械が実行するだけだ。プログラムが媒介として存在するからこそ、私たちは設計者、呼び出し側、実行者の役割を分離できる。プログラムの実行結果は必ずしも設計者の期待を満たすとは限らないが、設計者の時間と空間の制約から離れて存在でき、他の人によって実行・検証・改良されることができる。
いわゆるプログラミングとは、つまりプログラムを書くことである。料理の過程をレシピに書き起こすことは、本質的にプログラミングである。プログラミングを通じて、私たちは物事の本質をより深く理解し説明できるようになり、かつて特定の人、特定の集団、特定の場所、さらには特定の瞬間にだけ属していたものを、独立して存在・発展させることができる。この観点から言えば、プログラミングは生命を創造していると言っても過言ではない。
プログラミングは一種の標準化された執筆と言える。標準化はサービスと製品の品質を保証し、大規模な複製と拡張を可能にする。KFCは、フライドポテトの油の温度や秒数に至るまで詳細な食品加工マニュアルに依存しているからこそ、世界中に支店を展開できたのだ。陶华碧が自分の豆瓣醤(トウバンジャン)のレシピと製造工程を明確に説明し、標準化された生産ラインに委ねることができなければ、今日の「老干妈」はせいぜい小さな村の工房レベルの製品に過ぎず、私たちの食卓に上ることはなかっただろう。
私たちの毎日の生活は、ナビ、検索エンジン、チャットソフトウェアなど、さまざまな技術製品やサービスと関わり合っている。あなたはこれらの製品やサービスの背後にある原理を考えたことがあるだろうか? プログラマーという集団を除いて、大多数の人はこれらの問題を考えないだろう。なぜなら:
そんなの自分には関係ないし! この業界で働くわけでもないし……
きっと専門家だけが理解できるんだろう、私には無理だ!
使えればいいんだよ、あれこれ考えて何になるの、疲れるだけだし!
そう考えるのも間違いではない。なぜならプログラミングの本質とは、指定された要求を実現するための論理的な流れを設計し、呼び出し側が実装の詳細を知らなくても目的を達成できるようにすることである。
プログラムとプログラミングの広義の概念は曖昧すぎるため、概念の混乱を避けるために、以降で述べる「プログラム」と「プログラミング」は、コンピュータプログラミング言語を使って記述され、機械によって実行されるプログラムを特に指すものとする。
時間と注意力を解放する
あなたはもうしばらくあるポジションで働いているとしよう。経験から、毎日退社前に以下の3つのことをやる必要があると分かっている:
A、社内ネットワークシステムで某業務の当日データを照会する(約10分)
B、日報にまとめて保存する(約15分)
C、いくつかの主要データを電子メールで上司に送信する(約5分)
あなたは丁寧に整理した上で、この流れを書き出して、机の前に貼るか、頭の中に覚えておくことができる。これはもちろん、流れを知らない人よりははるかに優れている。各ステップを漏れなく実行できることを保証できるからだ(しかし、完全に保証されるわけではない)。あなたは時間をかけて真剣に考えたけれども、毎日こんな退屈な流れを自分で実行しなければならない……ちょっと待て、この仕事は秘書にやらせればいいのではないか?
もちろんできる。他人を雇うことは、金で時間を買う解決策である。しかし、これは同時に多くの新しい問題を引き起こす:
お金がかかる(当たり前)
やるべきことを秘書に説明し、相手が理解できることを確認する必要がある(コミュニケーションコスト)
秘書が退社したり休暇を取ったりすると、これらのことは自分でやらなければならない(時間的制約がある)
秘書のミスの責任を自分が負わなければならない(品質が保証されない)
秘書がミスをするたびに、教育し直す必要がある(教育コスト)
秘書は業務データや情報に直接触れるため、情報漏洩の可能性を避け難い(安全上のリスク)
秘書を替えれば、上記のことをすべてやり直さなければならない……
これでは物事を複雑にしているだけではないか?人のコストは高すぎるし、提供されるサービスも信頼できない。一方、プログラミングができれば、おそらく次のことができる:
データ照会・レポート作成・メール送信の流れを実行する小さなプログラムを作り、毎日自動実行するためのスケジュールタスクを設定する;
慎重にするなら、プログラムにまず自分のメールアドレスへ送らせ、問題がないことを確認してから上司に転送させることもできる;
必要なら、プログラムに実行中に異常が発生した場合、あなたのメールや携帯電話にアラート通知を送らせることもできる;
望むなら、社内ネットワークの業務システムにメールレポート機能を直接追加することさえできる……
仮に、あなたが手作業でABCの流れを完了するのに元々30分かかるとすると、プログラムが1回実行されるたびに、30分の時間が節約される。プログラムを書くのに3時間かかったとしても、1週間で元が取れ、以後はすべて丸儲けだ。プログラムの稼働時間が十分に長ければ、1回当たりの平均コストはゼロに近づく。このことから分かるように、プログラミングは、時間で時間を買う解決策である。
もちろん、やるべき流れを機械が読めるプログラムとして書く必要がある。要求が変われば、それに応じてプログラムを修正する必要がある。実行時にバグが出れば、デバッグして修正する必要がある……しかし、もっと重要なのは:プログラムは給料をもらわず、辞職することもなく、休息も必要とせず、不機嫌にもならず、ミスも犯さない。あなたの流れが正しく、依存するリソースに問題がなければ、7*24時間稼働し続けることができる。
プログラムを書いてある要求を実現するたびに、それはまるでハンマーを作り出すようなものだ。今後、似たような問題に直面したら、そのハンマーを使って解決できる。もちろん、ハンマーが手に合わない場合もあり、継続的なアップグレードと最適化が必要だ。しかし、ほとんどの場合、そのハンマーはすぐに使える。つまり:まったく同じ問題は一度解決するだけでいい。繰り返しの作業に時間を無駄にすることはない。
プログラミングを通じて、あなたは退屈でつまらない反復作業の一部または全部を機械に任せることができる。これにより、あなたの時間と注意力を具体的な業務から解放し、より価値のあることに使うことができる。例えば、仕事の流れを研究・最適化することや、家族と過ごすこと、あるいは本を読むことなど……
「チート」を体験する人生
オンラインゲームが好きな人なら「外部ツール」というものを知っているかもしれない。これはゲームと一緒に動作し、ゲーム体験を向上させるための小さなプログラムである。外部ツールは一般的に2種類に分かれる。1つ目は、ゲームシステムの枠組み内でプレイヤーの操作を簡略化する補助的な外部ツールで、自動拾い、自動狩り、キー変更などの機能を提供する。2つ目は、ゲームのバグを利用して不平等を作り出すチート的な外部ツールで、マップ全開、加速、無敵などの機能を提供する。
ゲーム業界の急速な発展に伴い、現在の多くのオンラインゲームには、かつて補助的な外部ツールが提供していた機能がすでに搭載されている。補助的な外部ツールは徐々に消滅しつつあり、残っているのはチート的な外部ツールと、そこから派生した一連の闇の産業チェーンだけだ。お察しのとおり。
私たちが誰かを「チートだ」と言うとき、実際にはその人のパフォーマンス(量、速度、精度……)が明らかに正常な範囲を超えていることを言っている。原始的な先住民がさまざまなテクノロジー製品を使う現代人に出会ったとき、おそらく「**、このやつチートしてるだろ?」という感覚になるだろう。
知っておいてほしいのは、体がそれほど強くない人類が地球を征服できたのは、私たちが道具を作り出し使うことで生理的な限界を突破し、元々不可能だったことを成し遂げてきたからだ。まもなく到来する全情報時代において、プログラミングは道具を創造し、さらには道具を使う主要な方法になるだろう。
ほとんどの人は、受動的に誰かが自分のニーズを満たしてくれるのを待っている。{'translated': '{'translated': '彼らは友人の推薦や広告などのさまざまなチャネルを通じて自分に届けられたソフトウェアを使い、「わあ、こんなこともできるんだ!」と感慨に浸る。彼らは既存ソフトウェアが提供する標準機能を使うだけで、個別の特殊なニーズはソフトが対応していないという理由で諦めてしまう。これは洋服と同じで、ほとんどの人は標準サイズを買って着るだけであり、ここがきつい、あそこがゆるい、ここが長い、あそこが短いとしても、我慢するしかない。'}'}
また一部の人は、自分の特殊なニーズを満たす方法を自ら考える。彼らは「もしXXX機能があればいいのに……」と考える。自分のニーズを満たせるソフトウェアを自ら探し、ソフトウェアのカスタマイズを研究し、開発者に機能提案を送る。同様に、個性を追求する人は、仕立て屋に自分のためにオーダーメイドしてもらったり、服を修正してもらったりして、できるだけ自分に合うようにするだろう。
ただごく少数の人だけが、他の人が満たせないニーズを自分で実現する能力を持っている。彼らは既存のソフトウェアを基盤にプラグインを開発し、ソフトウェアを二次開発し、さらにはまったく新しいソフトウェアを書くことさえできる。同様に、完璧を追求する人は、自分で服をデザインし、完全に納得するまで一枚の服を何度も何度も直し続けるだろう。
もし英語をしっかり学ぶことが、あなたの世界に一つの扉を開き、より多くの選択肢をもたらすと言うならば、プログラミングをしっかり学ぶことは、あなたに「神の視点」でこの世界を認識し改造する機会を与え、ほぼ無限の可能性をもたらす。なぜなら現実のすべては最終的に情報化され、プログラミングによって情報をあらゆる形で加工・処理できるからだ。思いつくことができれば、実現できるのだ。
「チート」な人生を体験してみたいですか?それなら、いますぐプログラミングを学び始めましょう。
深い思考力を養う
すべての人はプログラミングを学ぶべきだ。それはあなたに考え方を教えてくれるからだ。——アップル創業者 スティーブ・ジョブズ
考えることは、人間が人間であるゆえんの行為であり、プログラミングは人間の思考を再考する行為である。私たちはすべてのことをはっきり考えなくても、現実社会で生きていける。機械的な作業に従事する職業によっては、まったく思考する必要すらない。しかしプログラミングでは、はっきり考えてからでなければプログラムを書くことはできない。正しく、効率的で、優雅なプログラムを書くと同時に、私たちは自分の脳を鍛え、より明確に考え、より効率的に働かせているのだ。
プログラミングは、物事の本質を客観的に考え、物事と自分との関係ではなく、物事そのものに注意を向けることを要求する。昔の女性が川辺で汚れた服を洗っているとき、彼女はこう考えていたかもしれない。「川の水は冷たいな……この服の色は本当にきれいだ……うちの子はどうしてこんなにやんちゃなんだろう……」一方、私たちが洗濯機用のプログラムを設計するときは、「ああ、ここに洗うべき汚れた服がたくさんある」としか考えない。実は、長い間あなたを悩ませてきた多くの問題も、「私」という枠を飛び出し、「忘我」の思考をすれば、とても簡単で解決しやすくなる。
プログラミングは人間の考えを「具現化」するプロセスであり、より深く、より細かく、より包括的に考えることを要求する。ある要件を実現するには、その原理と動作プロセスを徹底的に理解していなければならない。そうでなければ、プログラミング言語で正確に記述して機械に実行させることはできない。具現化の過程では、考えの構造的な欠陥や論理の穴が自然に浮き彫りになり、考慮していなかった可能性や、さらに考える必要のある細部に必ず気づくものだ。
プログラミングは、物事やプロセスを分解し、さまざまな抽象度のレベルで完全に整合性のある思考を行うことを要求する。これにより、途方もなく大きな規模の問題を解決できる可能性が生まれる。ある程度の規模を持つ要件を実装する際、私たちは主要なプロセスと操作の細部を同時に考えることはほぼ不可能であり、複数の角度から同時に考えることもほぼ不可能だ。合理的に分解された後の細かい要件はシンプルで明確になり、実装の難易度が大幅に下がると同時に、複数の人に割り当てて共同で進めることもできる。成熟したソフトウェア企業やインターネット企業では、数千人のエンジニアが同じ製品を一緒に開発するのはよくあることだが、そんなに大勢の人で一冊の本を書くことを想像できるだろうか?
プログラミングは絶えず問題を解決するプロセスであり、問題解決の方法論を絶えず改善していくプロセスでもある。優秀なプログラマーは常に問題解決の達人である。プログラミングの各段階(要件定義、設計、コーディング実装、デバッグ・修正……)では、尽きることのない問題に直面する。この問題を解決すべきか?いつ解決するべきか?その根本原因は何か?どのような側面を考慮すべきか?どう取捨選択するか?どのような選択肢があるか?選択の原則は何か?……問題解決の方法論は詳しく説明すれば本一冊分になるが、いずれ時間があれば別の記事で述べたい。
未来をよりよく生き抜くために
半世紀前、アメリカでは人口の70%が農場で働いていた。自動化された耕作が広く普及した現在、それは1%未満になっている。——ケヴィン・ケリー『必然』
月面着陸からナノロボットの製造まで、私たちはさまざまな機械を設計・使用することで、人間が本来手作業ではできなかった様々なことを成し遂げてきた。現在までのところ、人間が従事してきた単純で反復的な仕事(洗濯、耕作、製造など)は、ほぼ完全に機械に取って代わられ、人間の仕事の方向性は機械の研究開発と保守へと移っている。そして、複雑な知識と精密な操作を必要とする仕事(自動車の運転や外科手術など)も、機械に徐々に取って代わられつつある。
洗濯機は主婦たちの手を解放し、全自動の流れ作業ラインは工場の労働者の大半を解雇した。人口ボーナスを享受している一部の発展途上国(中国やインドなど)だけは、技術導入コストが人件費よりも高いため、今のところ肉体労働者にもまだ生存の余地がある。しかし、技術のコストは不可避的に急速に下がり続け、人口ボーナスの窓は急速に閉じ、転換点はすぐそこに来ている。
資本は意志を持っており、人間性によって変わることはない。生産物の品質が同じで、技術のコストが人件費を大幅に下回る場合、ほとんどすべての肉体労働者が失業するだろう。機械は疲れを知らず、文句も言わず、人間より速く、良く、安く働く。人間が機械と競争できるはずがない。
それと同時に、人工知能は、人間の単純で反復的な思考活動(経路探索や翻訳など)を徐々に引き継ぎつつある。人間は命令を下し、原則を定め、選択をするだけでよくなる。人工知能は、人々が「人間が人間であるゆえん」と考える領域、つまり執筆、作曲、絵画などにもすでに進出している。
グーグルのAlphaGoが李世石に勝ったのは画期的な出来事であり、人工知能が人間が最も得意とする思考の領域で人間を超えられることを証明した。現在、最強の棋士たちはAIから囲碁を学んでおり、プロ棋士がAIと日常的にトレーニングするのが当たり前になっている。純粋な機械は純粋な人間より強く、人間と機械の組み合わせは純粋な機械より強い。これは囲碁界の共通認識となっている。
人工知能の能力が、ある思考領域において人間に近づくか超えるとき(これは多くの領域ですでに達成されている)、そしてそのコストが極めて低くなるとき(これも時間の問題だ)、資本の意志の下で、その領域は不可逆的に人工知能によって急速に占領されるだろう。今日私たちは、暗算の代わりに電卓を使うことにすでに慣れている。遠くない未来には、本来は自分で考える必要があった多くの問題を、無数のプログラムからなる人工知能に任せることにも慣れるだろう。予見可能な未来において、経験とスキルの上に成り立つ創造的でない仕事はすべて消滅し、人間の仕事の方向性は人工知能の研究開発と保守へと変わるだろう。
人工知能が完全に普及する時代は、光のような速さで私たちに向かって突っ走っており、次の瞬間には私たちを遥か後ろに置き去りにして、テールランプさえ見えなくなるかもしれない。その時、ほとんどすべての仕事が人工知能と切り離せないものになっているだろう。人工知能を理解し、人工知能とうまく協力し、人工知能の改良を支援できる人だけが、その時代によりよく生き残ることができる。
すべての人はできるだけ早くプログラミングを学び始めるべきだ。私の子供たちは始めるのが遅すぎた。ABCと色を教えるときから始めるべきだったと思う。——アメリカ合衆国第44代大統領 バラク・オバマ
『未来、私たちは何語を学ぶべきか?』という記事の中で、私は将来登場するかもしれないブレイン・インターフェース技術と、それに対応する人間と機械が共用する構造化言語について思いを巡らせたことがある。その時、私たちの脳はインターネットと人工知能に直接接続され、必要な知識や情報を瞬時に脳にダウンロードできるようになる……私たちは神のような存在になるだろう。しかし、そのためにはプログラミングの基礎を身につけていることが前提であり、そうして初めてこの革命的な技術の成果を享受できる。
え、その頃になってもまだプログラミングを学んでいないの?それなら、もう諦めて寝てなさい。
あなたが尋ねたいことは分かっている……
でも、プログラマーになるつもりはないし、プログラミングを学ぶ必要あるの?
あなたは車を運転できるかもしれないし、ベテランドライバーで運転の楽しさをよく知っているかもしれない。しかし、タクシー運転手になりたいとは限らないだろう?同様に、プログラミングを学ぶことは必ずしもプログラマーになるためではないが、新たな視点、深い思考方法、効率を最適化する思考力を身につけることができ、これらはすべてあなたの重要なソフトスキルとなる。遠くない将来、プログラミングは英語や運転のように、誰もが身につけるべき必須スキルになるだろう。その時、あなたは自分がベテランドライバーでありたいと思いますか、それとも乗せてもらう側でありたいと思いますか?
「これを学んで役に立つの?」という考えは、実はとても恐ろしい考えだ。多くのものは今のところ役に立ちそうに見えないため、ほとんどの人は学習を諦めてしまう。一方、ごく一部の人は「学んでみて何の役に立つか見てみよう」という気持ちで試してみる。後のある日、本当にそのスキルや知識が必要になったとき、諦めた人たちは「あの時やっていればよかった!」と感慨に浸るしかなく、学んだ人たちは「わあ、こんなところでも使えるのか!」と驚きを見つけるのだ。いわゆる「驚き」や「運」とは、実はこういうことだ。知らないうちに、前もって準備を済ませていた、ということ。
じゃあ、今必死にお金を稼いで、プロのプログラマーを雇うことはできないの?
確かに、プログラマーを雇って自分の考えを実現することはできるだろう。しかし、以前に秘書を雇ったときに遭遇した多くの問題がまた次々とやってくるだろう。さらに重要なのは、プログラミングができなければ、まともなアイデアさえ思いつかないかもしれないということだ。それは、自動車を見たことがない人が、もっと速い馬車を作ってくれと他人に頼むことだけを考えるのと同じだ。ある物事の原理を理解して初めて、その物事の概念はあなたの頭の中で明確になり、本当にあなたの認知構造の中に溶け込むことができる。
明確な概念があって初めて、それについて考え、何に使え、何に使えないかを判断できる。概念が不明確だと、自分の要件すらうまく説明できず、プログラマーとのコミュニケーションや協力はさらに難しくなる。すべてのプログラマーは、「淘宝(タオバオ)を作ってくれ」といった要望を突き付けられたら、誰でも頭を抱えてしまうだろう。
私の英語はとても苦手ですが、プログラミングを学べますか?
英語はプログラミング学習のボトルネックではない。重要なのは、その概念と原理を理解し、考え方を変えることだ。ほとんどすべてのプログラミング言語のキーワードは英語だが、よく使うキーワードはほんの数個だけだし、人気言語の関連書籍には翻訳版もある。望めば、プログラム内の変数や関数、命名に中国語を使うことさえできる。start / save / load / quit の数語が分かれば英語のゲームを遊べるし、sorryとhow muchが言えれば海外旅行に行けるのと同じことだ。
もう何年も働いていますが、今から学び始めても間に合いますか?どこから始めればいいですか?
いつ始めても遅くはない。もちろん早ければ早いほど良い。中国初のウイルス対策ソフトウェアKV300の作者である王江民氏は、38歳になってからプログラミングを学び始めた。どう学ぶべきか、どこから始めるべきかについては、これが今年の私の主要な検討テーマになるだろう。今後の連載記事にご期待ください。まずはこれらのWebサイトを試してみるとよいかもしれない:
http://www.codecombat.com :ゲームをプレイしながら学べる入門向け。中国語版あり、初心者に適している。
http://www.khanacademy.org :オール英語の動画解説による教学。優秀な学生やノートを取る派に適している。
http://www.codecademy.com :インタラクティブな実践形式で効果が最も高いが、ある程度の基礎が必要。
あとがき
かつて、Webサイトサービスを立ち上げようと思ったら、数万元もする専門サーバーを購入し、高額なデータセンターの委託管理料や帯域幅のレンタル料を支払い、専門の開発人材やチームを雇って開発し、さらに広告や運営キャンペーンでユーザーを集める必要があった……その参入障壁は非常に高く、大多数の人が尻込みし、企業だけが負担できるものだった。
ところが現在では、クラウドサーバーは家庭のブロードバンドより安くなり、さまざまなオープンソース技術を簡単に手に入れられ、各種オープンプラットフォームが無料のユーザーとチャネルを提供しており、1つのAPPがSNSを通じて瞬く間に全国で流行る可能性もある……Raspberry Piのような超安価なカード型コンピューターが登場し、さらに現在はさまざまな家電がスマート化に向かっているため、プログラミングで自分の小さなアイデアを実現するのは、本当に簡単この上ない。
私たちは、考えさえすれば世界を変えられる時代に生きている。では、あなたは世界を変えたいと思うのか、それとも世界に変えられるのを待つのか?
参考資料
[1] Steve Jobs - The lost interview (1995), http://v.youku.com/v_show/id_XNDI1NjE1OTIw.html
[2] Obama: Everybody's Got to Learn How to Code, http://www.recode.net/2015/2/14/11559052/obama-everybodys-got-to-learn-how-to-code
作者紹介:86年生まれの射手座、陝西省西安市出身。独立した思考力とコード潔癖症を併せ持ち、趣味嗜好が広いプログラマー(プログラム猿)。筋金入りのゲーマーで、ルービックキューブ、マインスイーパー、テトリスなどの分野で国内一位を獲得し、何度も全国記録を更新。ゲストとして『佳片有约』『天天向上』などの番組収録に参加。マインスイーパー網(saolei.net)の創設者。