MIT 6.00.1x(MIT:コンピュータサイエンスとPythonプログラミング入門)。このコースはPythonを教えるが、優れた入門コースとして、コンピュータサイエンスの重要な概念とパラダイムを強調している。特定の言語だけを教えるのではなく、理解を深めることを目的としている。非CS専攻の人も、自己学習の視野を広げるのに良い。内容:計算の概念、Pythonプログラミング、基本的なデータ構造とアルゴリズム、テストとデバッグ。
能力向上には、XとYを最適化し、関数F(X, Y)を改善する必要がある。多くの書籍はこの三つのポイントを同時にカバーしていないが、これを明確に示したのが『Structure and Interpretation of Computer Programs』(SICP)だ。これを読むことで、問題を抽象化し、分解し、より複雑な問題に取り組む能力が身につく。これはプログラミング能力の大きな飛躍となり、問題の考え方や解決方法を根本的に変える。SICPの言語はSchemeで、関数型プログラミングの入門にもなる。文法も非常にシンプルで、すぐに習得できる。
もしSICPがどうしても難しいなら、無理に取り組まずに次の本に進もう。『The Elements of Computing Systems』を読もう。これは最も基本的なNandゲートからコンピュータを構築し、最終的にロシアのブロックが動作するまでの過程を学べる。入門段階の最終目標は、この本のすべてのプロジェクトを完遂することだ(最小限のコンパイラとOSも含む)。
プログラミング入門ガイド - 暗号デジタル通貨取引所プラットフォーム
プログラミング入門ガイド
序章
今やプログラミングはますます重要な「スキル」になってきている:デザイナーとして、少しでもプログラミングを理解しておくことで自分の仕事の内容をより良く理解できるようになる;起業家として、技術的な創業者の立場は多くの仕事をより簡単にしてくれる。そして、初心者として最初の一歩を踏み出すとき、目の前の膨大な情報に圧倒されて、どこから始めればいいのかわからないこともある。初級教材を学び、入門を軽やかに乗り越えた後、学習が次第に難しくなり、急な学習曲線に挫折しそうになることもある。ページ上で文字列を出力することはできるが、いつ本格的な有用なプロジェクトに取り組むべきかがわからない。自分には何が足りないのか、次に何を学べば良いのかも見えない。
この記事の内容は、そのような悩みに対していくつかの方向性のアドバイスを提供し、また基本的なコアに焦点を当てたプログラミング入門のガイドも含む。もちろん、ステップバイステップの道筋は現実的ではなく、各人にはそれぞれの特徴があるため、この入門ガイドは読者の思考を喚起し、最終的に自分に適した学習ルートを形成する手助けを目的としている。
ただし注意:この文章は、本気でプログラミングを学びたい人向けに書かれている——「とにかく何かを作りたい」「学ばずにはいられない」人たち。単に「プログラミングは面白そう」と聞いた人たちではない。私の見解では、そのような人は永遠にプログラミングの扉を開けることはできず、まともなものを作ることも難しいだろう。
全体のトーンは「強い意見、弱い執着」(Strong Opinions, Weakly Held)と呼ばれるものであるが、読者は周囲のすべてを疑うように、私たちの書いた内容の正確性も疑うべきだ。何か疑問があれば遠慮なく議論を歓迎する。
心構えの調整
目標を明確に
プログラミングを学ぶ前に、自分の目標を一度考えてみてほしい。最終的な目標が明確になれば、道筋もよりはっきり見えてくる。では、何を作りたいのか?ウェブサイト?ゲーム?iOSやAndroidアプリ?それとも、面倒な作業を自動化して、もっと外の景色を楽しむ時間を増やしたいのか?あるいは、就職競争力を高めて良い仕事を見つけたいのか。これらすべてが価値ある目標であり、これらはあなたのプログラミング学習の原動力の一部だ。動機がなければ、退屈な長い学習の旅を続けることはできない。
この動画も参考になるかもしれない:《ほとんどの学校では教えないこと》
焦らないこと
悪いプログラミングは簡単だ。初心者でも21日あれば学べる。良いプログラミングには思考が必要だが、誰でもできるし、その極致の満足感も味わえる。糟糕なプログラミングは容易だ。たとえ初心者でも21日で習得できる。良いプログラミングには思考が必要だが、誰でもでき、その達成感を経験できる。
書店やオンラインショップには、「21日でマスターX」などの短期集中書籍が溢れている。これらは短期間で技術を習得させることを約束している。Matthias Felleisenは彼の著作『How to Design Programs』の中で、この「短期集中」の傾向を明確に批判している。
いわゆる「近道」や「魔法の弾」は存在しない。賢者は言った、何かを極めるには10年または1万時間が必要だと。これは中国語の「十年磨一剣」に通じる。焦る必要はない、努力は無駄にならない。
興味を育てる
ほとんどの優秀なプログラマーは、報酬や称賛を期待してプログラミングをしているわけではなく、ただ楽しさがあるからだ。
大多数の優れたプログラマーは、報酬や称賛を求めているわけではなく、プログラミングの面白さに惹かれている。
– Linus Torvalds
プログラミングに夢中になり、趣味として楽しむことも大切だ。興味は絶え間ない推進力の源泉であり、その充実感を持ち続けることが、10年や1万時間の学習に投じるエネルギーとなる。プログラミングは楽しい、探索の喜びだ。創造の喜びだ。自分の作品が画面に映し出されるのを見るのは楽しい。自分のコードに驚嘆する人がいるのも楽しい。公共の場であなたの製品を褒められる、隣人が使っている、メディアで取り上げられるのも楽しい。プログラミングはとても面白いものであるべきだ。もしそうでなければ、問題の原因を見つけ出し、それを解決することに取り組もう。
学習を始める
心に響く話
中学に入ったばかりの頃、私はプログラミングの学習を始めた。不幸なことに、当時一般的だった『21日でC++をマスター』のようなゴミ本を何冊も読んだ。読了しても大きな問題はなかったし、ちょっとしたプログラムも書けた。しかし、ソフトウェアが故障したとき、その原因がわからず、少し大きな問題には手も足も出なかった。既存のライブラリでは解決できないことも多く、ただ手をこまねいていた。毎日コーディングは続けていたが、自分のプログラミング能力は非常に遅いペースでしか向上しなかった。「反復」や「再帰」の概念もほとんど理解しておらず、コンピュータを計算機としてしか使っていなかった。
大学に進学し、物理学を専攻した。最初の頃は物理公式を丸暗記していたが、それらがどうやって導き出されたのか、どのような関係性があるのか、意味は何なのか理解していなかった。日々物理の問題を計算して解いていたが、その背後にある「なぜ(Why)」についてはほとんど理解していなかった。
また、物理を基にしたコンピューターゲームを作ろうとしたとき、再び壁にぶつかった。新しい問題に直面したときに手が出せず、恐怖が積み重なり、理解を避けてGoogle検索やコピペで解決しようとした。幸運なことに、ある授業が私の学習方法を一変させた。それは初めて「天眼」を開いたような感覚だった。苦痛を伴いながらも、少しだけ本当の理解に近づいた気がした。自分が学んできた物理やコンピュータサイエンスの知識は、ほんの少ししか理解していなかったことに気づいた。
その授業について:当時、私たちは電気学と特殊相対性理論を学び終え、教授は黒板にこれらのテーマを書き、それらを線で結んだ。「仮に電子が相対論的速度で導線を動いているとしたら…」と始まり、最初は馴染みのある電気学と特殊相対性理論の公式を書き連ねていたが、数枚の黒板を使った代数の推論の後、磁場の公式が奇跡的に現れた。何年も前にこの公式は知っていたが、そのときはこれらの現象の潜在的な関係性に気づいていなかった。磁気と電気の違いは「観測角度」の問題に過ぎないと悟った瞬間、私は目が覚めた。それ以降、「どうやって(How)」だけでなく、「なぜ(Why)」も問い始め、基礎的な部分に立ち返り、学ぶべき知識をしっかりと学び直した。この振り返りの過程は痛みを伴ったが、皆さんもこれを教訓にしてほしい。二度と馬鹿なことはしないように。
警鐘と反省
この図はDouglas Hofstadterの著作『ゲーデル、エッシャー、バッハ』からの引用だ。図中の各文字は、より小さな文字から構成されている。最上層では「MU」を見ている。Mは三つのHOLISM(全体論)から成り、Uは一つのREDUCTIONISM(還元論)から成る。前者の各文字は後者の全体を含み、逆もまた然り。そして最下層では、最小の文字もまた「MU」の繰り返しでできている。
各層の抽象は情報を含んでいる。もしあなたが幼稚に全体論だけを用いて最上層から観察したり、還元論だけで最下層を見たりすると、「MU」(一部の方言では何も意味しない)しか得られない。問題は、どうすれば各層の情報をできるだけ多く得られるかだ。あるいは、より簡単に言えば、複雑な分野(例:プログラミング)に含まれる多くの知識をどう学ぶかだ。
教育や学習には、次のような重要な問題がつきまとう:初心者はしばしば全体論に偏り、基礎を軽視しがちだ。例を挙げると、学生はロボットを作りたいと強く願うが、その背後にある理解は浅く、物理モデルや電子工学の基礎、サーボシステムやセンサーの理解などが疎かになっている。これでは、興味を持てず、学習意欲も続かない。
このような初心者の落とし穴は二つある:
しかし、還元論に過度に陥るのも良くない。最初から大きな理論を追い求めると、理論だけに偏り、退屈さや飽きが生じる。特にコンピュータサイエンスの学生にはありがちな罠だ。
学習をより良く理解するために、プログラミング学習を料理の勉強に例えることもできる。良い料理を作るためにレシピ本を買うのは良いが、家族のために料理を作るだけなら十分だ。レシピの手順通りに作れば悪くない料理ができる。しかし、友人の前で披露したり、シェフになりたいなら、レシピの背後にある思想や理論を理解しなければならない。単なる模倣ではなく、理論を理解し、応用できるようになることが重要だ。ただし、毎日厚い理論書を読むだけでは、実践が伴わず、良い料理人にはなれない。数日間の読書で飽きてしまい、料理の学習を諦めてしまうこともある。
要するに、プログラミングは理論と実践をつなぐ橋であり、コンピュータ科学と応用技術の融合分野だ。正しい学習方法は、自己主導の探索とプロジェクト実践を通じて、直感と推進力を養うことだ。底から積み上げる基礎学習を通じて、最も重要な普遍的な方法を身につけ、プログラミング思想を深く理解することだ。
初心者は、これらを主軸に、補助的に進めるのが良い。
プログラミング基礎
「どの言語を学ぶべきか?」これは初心者が最初に尋ねる質問だが、実は誤った問いだ。最初に考えるべきは、「プログラミング学習の基礎を構成するものは何か?」だ。
プログラミング知識のピラミッドの底には、次の三つの重要な部分がある:
入門段階の初心者がC言語を最初の言語として選ぶと、非常に難しく退屈になる。これは、これら三つの部分を同時に学ばなければならず、何かを作る前に多くの時間を費やす必要があるからだ。
したがって、「文法」と「システムの基礎」の二つを最小限に抑えるために、Pythonを最初の言語として学習することを推奨する。Pythonは初心者に優しいが、決して「おもちゃ」ではない。大規模なプロジェクトでもその強力さと柔軟性を発揮している。Pythonに慣れたら、次にC言語を学ぶのも良い選択だ。Cは、より低レベルの視点から問題を考える助けとなり、後のOSの仕組み理解にも役立つ。
以下は、入門段階の参考ガイドだ。これを終えると、頭の中に全体の枠組みができ、自己主導の探索に役立つ。順序は特に決まっていないので、気になったものから選んで取り組もう。詰まったら別の資料に切り替えるのも良い。
MIT 6.00.1x(MIT:コンピュータサイエンスとPythonプログラミング入門)。このコースはPythonを教えるが、優れた入門コースとして、コンピュータサイエンスの重要な概念とパラダイムを強調している。特定の言語だけを教えるのではなく、理解を深めることを目的としている。非CS専攻の人も、自己学習の視野を広げるのに良い。内容:計算の概念、Pythonプログラミング、基本的なデータ構造とアルゴリズム、テストとデバッグ。
Harvard CS50x(ハーバード大学:コンピュータサイエンス)。こちらも入門コースだが、MITのコースと補完し合う。言語はC、PHP、JavaScript + SQL、HTML + CSSを扱い、内容の幅と深さも適切。最新の技術成果も学べ、コンピュータへの興味を大いに刺激する。補助教材:『コーディング』を読む。
この入門段階を終えると、一定のコードの理解とプログラミングの感覚が身につく。次に、Web開発、Android、iOSなどの具体的な技術を学びたくなるかもしれない。まずはシンプルなものから始めて、自分に正のフィードバックを与え、推進力を補強しよう。ただし、深く入り込みすぎないこと。これらの技術には多くの細部があり、将来的に学ぶ時間は十分にある。今は、コンピュータサイエンスの普遍的な基礎知識を学ぶ時だ。近道やショートカットを狙わず、今学びたいことをただ追い求めるのは間違いだ。
では、入門段階で何をすれば良いのか?それは、自分が書いたプログラムを振り返り、「なぜこう設計したのか」「どうすればより良いプログラムを書けるのか」を考えることだ。プログラミングの本質を探求し、問題解決に役立てる。
想定:
X = 問題解決にかかる時間(「解決策」)
Y = コード実装にかかる時間(「コンピュータを使う」部分)
プログラミング能力 = F(X, Y) (X>Y)
能力向上には、XとYを最適化し、関数F(X, Y)を改善する必要がある。多くの書籍はこの三つのポイントを同時にカバーしていないが、これを明確に示したのが『Structure and Interpretation of Computer Programs』(SICP)だ。これを読むことで、問題を抽象化し、分解し、より複雑な問題に取り組む能力が身につく。これはプログラミング能力の大きな飛躍となり、問題の考え方や解決方法を根本的に変える。SICPの言語はSchemeで、関数型プログラミングの入門にもなる。文法も非常にシンプルで、すぐに習得できる。
Peter Norvigは、SICPについて次のように評している:
例え話をすれば、SICPが自動車について書かれていたら、それは車の仕組みや作り方、燃費や安全性を設計したい人向けだ。運転だけを知りたい人には不要だ。
もしあなたが前者なら、SICPは入門と実践の橋渡しとなる重要なポイントだ。
ただし、SICPは初心者には少し難しい部分もある。以下は役立つ補助資料だ:
これらを終えると、自分のプログラム設計モデルができあがり、頭の中に全体像が見えてくる。ライブラリや文法を覚えるだけでは問題解決には役立たないことに気づき、次に何を学ぶべきかも明確になる。これこそが、実践的なプロジェクトに取り組む絶好のタイミングだ。入門者には、オープンソースに参加するのは早すぎる。まずは簡単なプロジェクトから始めよう。例えば、ウェブサイトを作って運用したり、小さなゲームを作って拡張したり。アイデアが曖昧なら、Re:ゼロ研究所やMega Project Listから好きなものを選ぶと良い。
もしSICPがどうしても難しいなら、無理に取り組まずに次の本に進もう。『The Elements of Computing Systems』を読もう。これは最も基本的なNandゲートからコンピュータを構築し、最終的にロシアのブロックが動作するまでの過程を学べる。入門段階の最終目標は、この本のすべてのプロジェクトを完遂することだ(最小限のコンパイラとOSも含む)。
この本を完遂し、基礎を固め、将来の飛躍のために、次の点も押さえておきたい(順不同):
コンピュータシステムの基礎
プログラム設計の基礎を身につけたら、より深くコンピュータサイエンスの流れを理解したい。おすすめはこの本:
『Computer Systems: A Programmer’s Perspective, 3/E』(深く理解するコンピュータシステム)。このタイトルは誤訳も多いが、実際はCMUの「コンピュータシステム入門」の教材だ。CMUのCSはソフトウェア寄りのため、この本は「プログラムがコンピュータ上でどう動くか」を中心に、内部実装の詳細を網羅している。
もし読むのが退屈なら、CourseraのMOOC『The Hardware/Software Interface』もおすすめ。これはCSAPPの一部を移植したもので、最も基本的な実験も含まれている。併せて『The C Programming Language』も復習しておくと良い。
この本を終えると、システムの基礎が固まり、OSやコンパイラ、ネットワークの学習に備えられる。より高度なシステムを学ぶときは、対応章を読み、例を実装してみると理解が深まる。データの流れ(ネットワーク→メモリ→キャッシュ→CPU)も理解できる。
データ構造とアルゴリズムの基礎
今や、多くの人はプログラミング(特にWeb開発)の主な部分は他人のコードを使い、シンプルに表現することだと考えがちだ。ソートや二分探索などの基本的なデータ構造やアルゴリズムは内蔵されているからだ。仕事では使わないと思っている人もいるが、実はそうではない。理論的な背景なしに行き詰まるのは避けられない。
データ構造とアルゴリズムはセットで学ぶべきだ。入門段階では、「この問題にはどのアルゴリズムとデータ構造が最適か」を理解することが重要だ。よく使われるデータ構造とアルゴリズムに慣れ、紙とペンで手書きのフローチャートを描くのも効果的だ。理解できていない部分は調べ、その用途やシナリオを把握しよう。
参考資料:
その他の基礎
入門段階で見落としがちなポイント:
まとめ
これらの内容に恐れる必要はない。プログラミングの入門は数週間で終わるものではない。途中で壁にぶつかることも多いが、「ファーマンのテクニック」を使って問題を小さな部分に分解し、一つずつ解決し、他者に説明できるレベルまで理解すれば良い。解決できない問題も出てくるが、そのときは無理をせず、後で振り返るとすべてが見えてくる。
また、上記以外にも多くの良書がある。Stack Overflowのプログラマ必読書リストの上位二冊を紹介しておく。
『Code Complete』:経験豊富なプログラマも初心者も、知識の穴を埋めるのに役立つ。特に変数名やテスト、性格に関する章はおすすめ。
『The Pragmatic Programmer』:通称「コーディングの小全書」。DRYやKISS、良いプログラマになるための考え方が詰まっている。
著者のDaveは、次のように述べている:
あなたはプラグマティック・プログラマだ。特定の技術に固執せず、広い知識と実践経験を持ち、状況に応じて最適な解決策を選ぶ。理論と実践を融合させ、常に状況に合わせてアプローチを調整し続ける。彼らは仕事をきちんとやり遂げ、しかも上手にやる。
この言葉と彼の『The Pragmatic Bookshelf』は、私に大きな影響を与えてきた。だからこそ、このガイドもこの思想を反映し、皆さんが真のPragmatic Programmerになれるよう導きたい。
後書き
もしこれらすべてを達成できたら、おめでとう。あなたは本当にプログラミングの入門を終えたことになる。これから深く学ぶとき、未知の言語や複雑なAPIに恐れることはなくなる。技術の習得も容易に感じられるだろう。ただし、これらを身につけるには多くの練習が必要だ。腰が痛くなったり、歩くのが大変だったり、5階に上がるのも一苦労だろう。でも、心の変化や自信は計り知れない。師や仲間、CSDNの目線も変わるだろう。プログラミング入門を終えた今、あなたはプログラマ精神の高みへと登ったのだ。いや、違う。たとえ高収入でも精神的に強いわけではない。自分に疑問を持ち続けることもあるだろう。だが、正しい道を歩み続ければ、「会当凌绝顶」の感覚を味わえるはずだ。