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