こんにちは、上杉周作と申します。米国在住のプログラマ兼ブロガーです。2019年に日経BP社から発売された『ファクトフルネス』の共訳者でもあります。詳しいプロフィールとブログはこちら。
本稿「コンピュータサイエンスと魔法のYコンビネータ」は、プログラミング未経験者向けの、邪道なコンピュータサイエンスの入門書です。どういう意味かは、すぐに説明しますね!
ちなみに、本稿は最後まで無料で公開しており、スマホからもパソコンからも閲覧できます。
本稿は、初級・中級・上級それぞれ5ページずつ、それにこのページと「エピローグ」を加えた全17ページで構成されています。記事というよりは、電子書籍に近いかもしれません。
大半の方は、読了までに約2〜3時間ほどかかると思います。長いので、少しずつ読み進めてくださると嬉しいです。
↓ クリックすると各ページに飛べます。
公開日:
ソースコード: GitHubで公開中
英語版: 英語版はこちら
Twitter: @chibicode
「前置きはいいから早く読みたい!」という方は、下のボタンを押して先に進んでください!
反対に「本稿についての説明を聞いてから読むかどうか決めたい!」という方は、そのまま下に読み進めてみてください。
本稿のタイトルは「コンピュータサイエンスと魔法のYコンビネータ」ですが、「そもそもコンピュータサイエンスって何?」 と思われる方は多いでしょう。そんな方向けに、非常に単純化したコンピュータサイエンスの定義を書いてみたいと思います。
わたしたちの身の回りには、パソコンやスマホといった「コンピュータ」と、そのコンピュータ上で動く「ソフトウェア」がたくさんあります。身近なものでいえば、 グーグルなどの検索エンジン、 地図アプリのナビ機能、 カメラアプリの顔認識機能は、どれも「ソフトウェア」です。
アプリ・ウェブサービス・ゲーム・AI・組み込みシステムやITシステム・仮想通貨など、「コンピュータプログラムによって機能するもの」はすべて、「ソフトウェア」と呼ばれます。
そして「コンピュータサイエンス」とは、こういったソフトウェアを開発したり、またはソフトウェアを用いて情報を処理する際に、根幹となる学問のことを指すのです。
コンピュータサイエンスという言葉をはじめて聞く方に、コンピュータサイエンスについて説明しようとすると、「プログラミングと何が違うの?」というご質問をよくいただきます。
非常に単純化して言うと、「コンピュータサイエンスは、プログラミングを支える『学問』」です。この『学問』の部分が重要なのですが、そう言ってもピンと来ないかもしれないので、例えを用いて説明します。かなり乱暴な例えなのですが、わかりやすさを優先しているのでご了承ください。
まず、コンピュータサイエンスは「医学」に、プログラミングは「治療」に例えることができます。お医者さんは、患者を治療することができますが、その治療法は医学に基づいていますよね。「こうすれば治る可能性が高い」と医学的に根拠があるからこそ、それに基づいた治療法を選ぶわけです。
それと同じで、プログラマも、プログラミングをすることでソフトウェアを作ることができます。そして医者にとっての医学のように、ソフトウェアを設計する際に指針のひとつとなるのがコンピュータサイエンスという学問なのです。
医学の知識が浅い人が医者になってしまうと、間違った治療を施しかねません。それと同じで、コンピュータサイエンスの知識が浅い人が高度なプログラミングを行った場合、非効率なプログラムを書いてしまいサーバー代がかさんだり、セキュリティーが脆弱なものになってしまうかもしれません。
また、医学もコンピュータサイエンスも、日々研究が行われ、進歩しています。医学の進歩によって、昔はどれほど優れた医者でも治療できなかった病気が、根絶できるようになったりしますよね。
同じように、コンピュータサイエンスの進歩によって、以前はどれほど優れたプログラマでも作れなかったソフトウェアが、最近なら誰でも作れるようになったりします。最近だと、人工知能分野の進歩が著しく、以前は作るのが不可能とされていたようなAIアプリを、多くのプログラマが作れるようになりました。
医学もコンピュータサイエンスも「学問」であり、日々の研究による学問の進歩が、治療やプログラミングといった現場の改善につながるわけですね。
先ほどの例えを使えば、「コンピュータサイエンスを学ぶメリットはあるの?」という質問にも答えることができます。
医学の場合、まず大前提として、ほとんどの人が医者になることはありえません。その一方で、簡単な医学の知識は誰にでも身につけることができるし、身につけておくべきです。たとえば、「タバコは体に悪い」というのは、誰もが知っておくべき初歩的な医学的知識ですよね。
これと同じ話で、ほとんどの人がプログラマになることはありえません。その一方で、世の中はソフトウェア無しには回らなくなっており、この傾向は人工知能の発展とともに加速するでしょう。
だからこそ、多くの人が簡単なコンピュータサイエンスの知識を身につけるべきだと思うのです。たとえば最近だと、人工知能や仮想通貨がどういう仕組で動いているかなどは、基礎的なコンピュータサイエンスの知識があればすぐに理解できます。
まとめると、コンピュータサイエンスを学ぶメリットは、簡単な医学の知識を学ぶメリットと似ていると言えるかもしれません。
余談 (読み飛ばしてもOK): コンピュータサイエンスと医学は似ている部分もありますが、似ていない部分もたくさんあります。たとえば、医者にはそう簡単になれませんが、コンピュータサイエンスの知識が無くてもプログラマになることはできます。
誰もがコンピュータサイエンスを学ぶべきというわけで、このたびコンピュータサイエンスの入門書を書きました。それが、本稿「コンピュータサイエンスと魔法のYコンビネータ」です。
ただ、本稿はよくある入門書とは違い、邪道なコンピュータサイエンスの入門書です。
わたしはアメリカの大学でコンピュータサイエンスを学んだのですが、当時から教育者気質・作家気質だった筆者は、「いつかコンピュータサイエンスの入門書を書いてみたい」と考えていました。
ただ、もちろんコンピュータサイエンスの入門書なんて掃いて捨てるほどあるので、何らかの差別化をしないと書く意味がありません。そこで思いついたのが、「正統派の入門書ではなく、『邪道』な入門書を書く」ということです。
本稿が「邪道」である理由は以下の2点です。
それぞれどういうことか説明しますね!
先に進みたい方へ:「前置きはもういいから早く読みたい!」という方は、下のボタンを押して先に進んでください!
本稿がコンピュータサイエンスの「邪道」な入門書である理由のひとつめは、プログラミングを行わないからです。
正統派のコンピュータサイエンスの入門書は、「プログラミングを行いながら、コンピュータサイエンスを学ぶ」という教え方をします。
たしかにそのほうが効率が良いのですが、ほとんどの人はプログラミング未経験者ですし、将来プログラマになることもありません。またプログラミングは、スマホからだと非常にやりにくいです。
だから、プログラミングをコンピュータサイエンスを学ぶための必須事項にしてしまうと、それだけで学ぶハードルがひとつ増えてしまいます。
個人的には、プログラマになる気がない、またはコンピュータサイエンスを専門として目指さないのであれば、プログラミング抜きにコンピュータサイエンスだけを学ぶほうがいいと考えています。
そのためにはどうすればいいかというと、プログラミングの代わりに、プログラミングに似たパズルを使って学べばいいのです。
本稿では、以下のようなパズルを解きながらコンピュータサイエンスの題材を学んでいきます。以下のパズルがどういう仕組みかは次のページで説明しますが、とりあえず実行 ボタンを押してみると、パズルが動くことを確認できます。
上記のように、本稿で紹介するパズルはすべて、スマホからでもパソコンからでも行えます。
将来的には、「スマホから、プログラミング無しにコンピュータサイエンスを学ぶ」ことが当たり前になればいいなと考えています。
余談 (読み飛ばしてもOK): 「プログラミング無しにコンピュータサイエンスを学ぶべき」というのは、あくまで対象が忙しい大人である場合に当てはまります。
本稿がコンピュータサイエンスの「邪道」な入門書である理由のふたつめは、高度な内容を取り扱っているからです。
正統派のコンピュータサイエンスの入門書は、初歩的な内容を教えます。それはそれで良いと思うのですが、本稿では逆に、みなさんに高度な内容を学んでもらいます。
本稿は2〜3時間程度で読み切れる長さを目標にしているのですが、そのくらいの文量だと、コンピュータサイエンスのすべてを語ることは到底できません。 だから、わたしはその限られた文量の中で、「自分にもコンピュータサイエンスを学べるかも」と思うきっかけを読者に提供したいと考えています。
そのためには初歩的な内容ではなく、高度な内容を教えるほうが良いと思っています。
なぜなら、もし高度な内容を理解することができれば、それより易しい他の分野も理解できるということを自覚してもらえるからです。「わたしでも高度な内容を理解できた。だったら、他の内容も学べるはずだ!」と思ってもらいたいのです。それが、「自分にもコンピュータサイエンスを学べるかも」という自信につながると考えています。
また、このページを開き、ここまで読んでくださったあなたは、おそらく知的好奇心がとても旺盛な方なのでしょう。そういう方々は、あまりにも内容が簡単すぎると、退屈で物足りないと感じてしまうかもしれません。だから、知的好奇心が旺盛な方にでも「面白い」と思っていただけるように、内容は高度にしています。
とはいえ、内容が高度すぎて、誰にも理解されなかったら本末転倒です。だから、内容は万人向けとは言えないものの、なるべく多くの方に最後まで読んでいただけるように、できる限り分かりやすく説明させていただきます。
また、高度な内容とはいえ、数学やプログラミングなどの事前知識は一切必要ありませんので、ご安心ください。
では、本稿で取り扱う高度な内容とは何かというと、タイトルにもある「Yコンビネータ」です。Yコンビネータとは、タイトルにもある通り魔法のような力を持つ、とあるコンピュータサイエンスの概念です。
Yコンビネータは、初歩的な題材では全くありません。わたしの大学だと、Yコンビネータはコンピュータサイエンス専攻の2〜3年生が学ぶ高度な題材でした。しかも、マニアックな題材で実用的ではなく、知っていても業務に役立つことはありません。
なぜそんなマニアックな題材を選んだかというと、Yコンビネータには、コンピュータサイエンスの面白さや魅力が凝縮されているからです。これについては、最後まで読んでいただくと分かると思うので、ぜひ楽しみにしていてください。
ちなみに: IT業界にいる方の中には、「Yコンビネータって、シリコンバレーにあるITベンチャー養成機関のこと?」と思われた方もいるかと思います。そんな方は、↓の「続きを読む」を押してみてください。「聞いたことない」という方はそのまま先に進んでください。
もし本稿が正統派のコンピュータサイエンスの入門書だったら、みなさんからお代を頂戴していたかもしれません。しかし、本稿は邪道な入門書なので、最初から最後まで無料で提供しています。
だからというのも何ですが、内容には期待しすぎないでください。無料なので、有料の入門書に比べてクオリティは高くはありません。
さらに言うと、本稿は実用的な内容ではありません。最後まで読み終えても、日々の暮らしや、キャリアに役立つ気づきは得られないないでしょう。
ただその代わりに、もしかしたら読後に「コンピュータサイエンスを学んでみたい」という気持ちが芽生えるかもしれません。
あるいは、「難しすぎる。自分には向かない」と思われる方もいるかもしれません。そう思われたとしたらわたしの力不足ですので、申し訳ないです。
本稿はプログラミング未経験者向けです。プログラマの方にとって有益かどうかは、正直微妙かもしれません。
本稿で説明する内容は、プログラミングを使うと一瞬で説明できます。しかし、前述の理由から、あえてプログラミングを使わないで説明するので、プログラマの方にとっては非常に回りくどい説明に感じられると思います。数式を使わずに数学をやるようなものです。
したがって、プログラマの方向けのYコンビネータの教材としては、本稿はおすすめできません。しかし、その代わりにおすすめできる教材があります。プログラマの方で、「Yコンビネータって何?」と思われた方は、↓の「続きを読む」を押してみてください。