その本の「はじめに」には、著者の「伝えたいこと」がギュッと詰め込まれています。この連載では毎日、おすすめ本の「はじめに」と「目次」をご紹介します。今日はコーリー・アルソフさんの 『独学コンピューターサイエンティスト Pythonで学ぶアルゴリズムとデータ構造』 です。
【第0章 イントロダクション】
私のプログラミングを学ぶ道のりは、大学で政治学科を卒業してから始まりました。大学を卒業したものの、企業が欲しがるようなスキルを持っていなかったため、仕事を探すのに苦労しました。もっと実用的な学科を出た同級生たちが良い給料の仕事に就いていく中、私も求人に応募し続けましたが、仕事は得られず、お金を稼ぐこともできず、落ちこぼれたように感じていました。そのような状況でしたが、シリコンバレーに住んでいてプログラマーたちに囲まれていたこともあって、プログラミングを学ぼうと決意しました。当時は、とても挑戦に満ちていて、人生でもっともやりがいがあることを始めたんだとは、気づいてもいませんでした。
プログラミングを学ぶのは初めてではなく、以前にも学ぼうとして挫折したことがありました。大学1年生のときにプログラミングの授業を履修しましたが、全く理解できなくてすぐにやめてしまいました。多くの学校では最初のプログラミング言語としてJavaを教えていますが、残念ながら初心者にとってJavaを理解するのはとても難しいのです。そのため初心者にとって学びやすい言語のひとつ、Pythonを習得しようと思いました。しかし、プログラミングを学ぶには多種多様な情報を集めて組み立てなければならず、そのストレスからPythonすら投げ出しそうになりました。一人っきりの孤独な学習を続けるのもストレスでした。一緒に学んだり、頼ったりする友だちがいなかったのです。
Pythonをあきらめそうになった頃、スタック・オーバーフロー(プログラマー向け質問サイト)のようなオンラインコミュニティに参加するようになりました。コミュニティへの参加によってモチベーションが維持できるようになり、再びやる気も出てきました。プログラミングを学ぶという壮大な決心をして始めましたが、うまくいくときもいかないときもあり、やめようと思うときもありました。しかし、プログラミングを学習し始めてから1年も経たないうちに、EC大手のeBay(イーベイ)でソフトウェアエンジニアとして働き始めることができました。1年前の私はカスタマーサポートの仕事ができればラッキーだと思っていたのに、有名な会社で時給50ドルのプログラミングの仕事を得るまでになったのです。これは自分でも信じられませんでした。時給も良かったのですが、それ以上に良かったのは「ソフトウェアエンジニアになれた」ということです。これで自信を持てるようになりました。プログラミングを学ぶことで、何かを成し遂げる自信がついたのです。
eBayを退職後、カリフォルニア州のパロアルトにあるスタートアップで働き始めました。その後しばらく仕事を休んで、東南アジアでバックパックの旅をしました。雨の中、バリのスミニャック地区の細い通りでタクシーに乗っていたとき、アイデアが思い浮かびました。アイデアの元になったのは、休暇前にソフトウェアエンジニアとしての経験をたくさんの人からたびたび尋ねられていたことです。シリコンバレーで働く多くのソフトウェアエンジニアたちの中で、コンピューターサイエンスの学位を持っていない私は珍しかったのです。
そのアイデアとは、 『独学プログラマー』 という本を書くことでした。プログラミングのことだけでなく、ソフトウェアエンジニアの仕事に就くために学んだことすべてを書こうと思いました。同じ道のりを歩もうとする人たちを助けたいと思ったからです。そんな思いから、独学プログラマーを目指すためのロードマップを作り始めました。1年かけて『独学プログラマー』を書き、自費出版しました。読んでくれる人がいるかどうか分かりませんでしたが、自分の経験を共有したいと思っていました。それが最初の数カ月で何千冊も売れたのには驚きました。本が売れるとともに、世界中にいる独学プログラマーや、そうなりたいという人たちからメッセージが届きました。
このメッセージがきっかけになり、プログラミング学習中に感じたもう1つの問題を解決しようと思いました。1人で大変な学びに向き合っているという孤独感です。そこで、参加者がお互いにサポートできる場所として、独学プログラマーのためのFacebookグループ「Self-Taught Programmers」を作りました。このグループは今や6万人以上のメンバーがいて、独学プログラマーたちがお互いに疑問を解決したり、情報を交換したり、成功事例を共有したりする独学コミュニティへと進化を遂げています。この独学コミュニティには、以下から参加できます。
https://facebook.com/groups/selftaughtprogrammers
また、私が発行しているニュースレターを以下から購読できます[訳注1]。
https://theselftaughtprogrammer.io
以前は、コンピューターサイエンスの学位を持たずにソフトウェアエンジニアとして働くことについて投稿すると、必ずといっていいほど、学位なしにプログラマーとして働くことは不可能だ、という悲観的なコメントが付きました。「独学でプログラミングを学んでどうするんだ? 学位を持ってない人を採用する企業なんてないよ!」と強く否定してくる人たちもいました。近頃では、こういうコメントはずいぶん減りましたが、この手のコメントを書いてくる人たちには、独学プログラマーのグループを紹介しています。そこには独学でプログラミングを学んだ、新人エンジニアからエンジニアを束ねる責任者まで、世界中の企業のあらゆるポジションで活躍している独学プログラマーたちがいるのです。
書籍『独学プログラマー』は私の想像を超えて売れ続け、Udemyのコースも人気講座になりました。プログラミングを学ぶ多くのすばらしい人たちと交流を持つことは、楽しく、多くの気づきもありました。本書を通して、またその経験ができることをとても楽しみにしています。本書は『独学プログラマー』の続編です。プログラミングの基礎を知らない場合は、先に『独学プログラマー』を読んでおくと良いでしょう。本書は、Pythonでプログラミングができる人を想定しています。もしそうでなければ、『独学プログラマー』を読んだり、私のUdemyのコース[訳注2]を受講するか、あなたに合った方法で事前にPythonを学んでください。
https://www.udemy.com/user/coryalthoff/
この本で学ぶこと
前作『独学プログラマー』では、プログラミングとプログラミングの仕事をするうえで必要なスキルを紹介しました。本書はコンピューターサイエンス(計算機科学)の入門書で、特にアルゴリズムとデータ構造について紹介します。コンピューターサイエンスは、コンピューターとその動作について学ぶ学問です。ソフトウェアエンジニアになるために大学に行く場合、プログラミングを専攻するのではなくコンピューターサイエンスを専攻します。コンピューターサイエンスの学生は、数学、コンピューターの設計、コンパイラ、オペレーティングシステム(OS)、データ構造、アルゴリズム、ネットワークプログラミングなどを学びます。
それぞれの分野について詳細に解説している分厚い書籍がいくつもあり、本書ですべてを扱えるものではありません。コンピューターサイエンスという学問が扱う範囲は広大で、一生をかけても学びきれないものだと思います。本書はコンピューターサイエンスの学位に必要な内容を網羅するのではなく、独学プログラマーが活躍するうえで役に立つ、コンピューターサイエンスの基本的な概念に絞って紹介します。
独学プログラマーが理解しておくべきもっとも大切な分野は、アルゴリズムとデータ構造です。本書ではこの2つに焦点を当てることにしました。本書は第1部と第2部に分かれています。第1部はアルゴリズム入門です。アルゴリズムとは何か、アルゴリズムの優劣を決めるのは何か、そして線形探索、二分探索などのさまざまなアルゴリズムを学びます。第2部はデータ構造入門です。データ構造とは何か、そして配列、連結リスト、スタック、キュー、ハッシュテーブル、二分木、二分ヒープ、グラフについて学びます。最後に、本書を読み終えた後にやるべきこと、プログラミングを学び続けるのに役立つ情報や次のステップについて紹介します。
前作『独学プログラマー』では、プログラミングを学ぶ前にコンピューターサイエンスを学ぶのは有意義ではない、と伝えていました。それはコンピューターサイエンスを無視して良いといっているのではありません。プログラマーとして成功したければ、コンピューターサイエンスを学ぶべきです。そもそも、コンピューターサイエンスを理解していないプログラマーは採用されません。大抵の企業はプログラマーを採用するとき、技術面接を行います。技術面接で重視することはどの企業でも同じで、コンピューターサイエンス、特にアルゴリズムとデータ構造を重視します。FacebookやGoogle、Airbnbなど著名な企業では、多かれ少なかれアルゴリズムとデータ構造に関する技術面接があり、これに合格する必要があります。この2つについての深い知識を持っていないと、技術面接で落とされてしまいます。技術面接はぶっつけ本番で対応できるものではありません。アルゴリズムやデータ構造などについて、採用に値する知識を持っているかを確認するため詳細に質問されるので、採用されたいのであれば準備をしておくべきです。
採用後は、上司や同僚たちはあなたがコンピューターサイエンスの基礎をすでに身に付けているものとして接してきます。O(n3)のアルゴリズムが良くない理由から説明しなければならないとしたら、同僚たちにとって嬉しいことではありません。私がeBayでプログラミングの仕事を始めたときが、まさにこの状況でした。私は当時、スタンフォード大学、カリフォルニア大学バークレイ校、カリフォルニア工科大学を出た優秀なプログラマーと一緒のチームにいました。コンピューターサイエンスを十分に理解している同僚たちの中で、不安で、居心地の悪さを感じていました。独学プログラマーとしてコンピューターサイエンスを学ぶことで、このような不安を最小限に抑えられます。
さらに、アルゴリズムとデータ構造を学ぶことで、プログラマーとして成長できます。成長の鍵は、フィードバックループにあります。フィードバックループとは、学んだことを実行してみて、それが期待どおりかどうかすぐに確認することです。プログラミングを学ぶときには、答えが1つではないので分かりやすいフィードバックを得るのは難しいでしょう。たとえば、あなたの作ったウェブサイトは動作しているものの、そのコードはひどい出来かもしれません。コードの良し悪しを判断する基準がないのです。しかし、アルゴリズムを学んでいるときは違います。コンピューターサイエンスにはたくさんの有名なアルゴリズムがあります。自分が書いたコードと既存のアルゴリズムの実行結果を比べて、適切な結果を出せたかすぐに分かります。建設的なフィードバックを頻繁に受け続けることで、コーディングスキルが上達します。
独学プログラマーになりたてだった頃の私が犯した最大のミスは、アルゴリズムやデータ構造について十分に学ぶ時間をとらずにソフトウェア業界に入ろうとしたことです。この2つを学ぶことにもっと時間をとっていたら、もう少し順調だったでしょう。同じ間違いをしないでくださいね。
コンピューターサイエンスの分野は広大で、学ぶべき内容がとても多いので、大学では4年かけて学生に教えます。だからといって、独学プログラマーがコンピューターサイエンスに4年かけるわけにはいかないでしょう。そこで本書では、ソフトウェアエンジニアとして成功するために必要な、もっとも重要な内容を網羅しています。本書はコンピューターサイエンスの学位の代わりにはなりませんが、本書を読み、例題を練習すれば、技術面接を合格するためのしっかりとした基礎を身に付けられます。コンピューターサイエンス専攻の同僚ばかりのチームにいても気後れせず、プログラマーとして大きく成長するでしょう。
対象読者は誰?
独学プログラマーは、プロとしてプログラミングができること、そしてコンピューターサイエンス、特にアルゴリズムとデータ構造を学ぶ必要があると納得してもらえたと思います。授業でプログラミングを学んでいる学生もぜひ本書を読んでください! 私が始めた独学コミュニティには誰でも参加できます。前作『独学プログラマー』は意外なことに、大学生にも人気があります。大学でも『独学プログラマー』を授業で使っていると、何人かの教授から連絡をもらいました。
時々、コンピューターサイエンス専攻の学生から、中退するかどうかの相談を受けることがあります。そんなときは、大学を辞めるべきじゃない!と伝えています。私の目標は、できるだけ多くの人にプログラミングを学ぼうと思ってもらえること、そして、コンピューターサイエンスの学位がなくてもプログラミングの仕事に就けるのを知ってもらうことです。若いうちに大学で学べるのであれば、それに越したことはありません。そして、学校に通いながらでも独学コミュニティの一員として「常に学ぶ」姿勢を勉強に活かし、大学で教えてもらう以上に学びましょう。
では、自分がコンピューターサイエンスを学ぶ準備ができているか、どうやって確認したら良いでしょう? 簡単です。プログラムの書き方さえ知っていれば準備はバッチリです。本書はコンピューターサイエンスをもっと学びたいという人に向けて書きました。知識の不足を補いたい、技術面接の準備をしたい、仕事で必要な知識を得たい、プログラマーとして成長したい。本書はそんな人たちのためのものです[訳注3]。
独学プログラマーの成功例
私自身も学位なしでソフトウェアエンジニアの職に就きましたが、ほかにも独学プログラマーの成功事例を毎日のように聞いています。学位のない独学プログラマーがソフトウェアエンジニアになれるのか、人によってはとても気になる点だと思います。そこでコンピューターサイエンスの前に、独学プログラマーの成功例をFacebookの独学コミュニティからいくつか紹介します。
Matt Munsonさん
最初は、Matt Munson(マット・マンソン)さんです。彼はFacebookの独学プログラマーグループのメンバーです。ここからは彼による文章です。
すべては、FinTechの仕事を失ったことで始まりました。生活を支えるための臨時の仕事として、眼鏡のレンズを削ったり、クルマの修理をしたり、お祭りのバイトなどをしていました。ちょっとしたプログラミングをしたこともあります。頑張りましたが、数カ月後には家を失うことになりました。これは、プログラマーになりホームレスを脱出した話です。
仕事を失ったとき、私はまだ学校に通っていました。家を失った後の数カ月間は、クルマやテントの中で学校の勉強を続けていました。家族の援助はありませんでした。最低賃金の仕事では、住まいを確保しつつ1人の人間を養い、生活に必要な車を維持することができないのを家族は理解していなかったのです。そんな状況でしたが、友だちに頼りたくはありませんでした。9月に入り、自分のトラックを手放し、残っていた401k[訳注4]を現金化し、チャンスを求めてモンタナ州のヘレナにある故郷から約1,800マイル[訳注5]離れたテキサスのオースティンに向かいました。
[訳注5]3,000km弱。日本領土の北端から南端までと同じくらい。
オースティンに着いて1週間のうちに面接を2、3回受けましたが、スキルの有無にかかわらず、ホームレスにチャンスをくれる企業はありませんでした。数カ月後、私のGoFundMe[訳注6]に友だちや見知らぬ人が自立支援の寄付をしてくれるようになりました。この頃は1日に一度の食事でなんとか食いつないでいました。まともな食事は一度もできませんでした。この状況から抜け出す最後の手段が、プログラマーになることでした。
ついに、もうひと頑張りする決意をしました。少しでも受け入れてくれそうな求人に、一斉に職務経歴書を送りました。その中で、小さなスタートアップ企業が面接に呼んでくれました。私は、身なりを整えベストを尽くしました。ひげをそり、清潔な服を選び、髪を整え、シャワーを浴びて(ホームレスにとっては大変なんです)、面接に向かいました。自分の状況や、なぜオースティンにチャンスを求めて来たかを正直に説明し、この時点では最高の人材ではないかもしれないけれど、機会をもらえれば、最高の人材になるために必死に働くことを全力で伝えました。
面接の後、あまりにも正直に話してしまったのは大失敗だったろうと思いました。10日後、すっかりあきらめた頃に、そのスタートアップから2回目の面接の連絡がきました。
面接に行くと、そこには責任者だけがいました。その人は「あなたの正直さに感心したので、チャンスを与えたい」と言いました。続けて「あなたは、ちゃんとした素養があり、頑丈な空の箱のようだ。どんな仕事にもめげず、学びながらこなしていけるだろう」と。最後に「12月6日から働いてくれ」と言われました。
それから1年が過ぎ、今はプログラマーになる前よりずっと良い住まいで暮らしています。同僚から敬意を払われているし、会社の重要なことについて意見を求められることもあります。あなたは何でもできるし、何にでもなれます。挑戦することをためらわないでください。たとえ何もかもうまくいっていないときだとしても。
Tianni Myersさん
次はTianni Myers(ティアニ・マイアーズ)さんです。『独学プログラマー』を読んで私にメールをくれました。ここからは学校の外でプログラミングを学んだ彼の冒険についての話です。
私の独学の冒険は大学でメディアコミュニケーションの学位を取るために履修したウェブデザインのクラスから始まりました。この頃の私はライティングに興味を持ち、マーケティング関連の職種で働くことを夢見ていました。でも、プログラミングを学ぼうと決めたことで目標が変わりました。お店のレジ係だった私が13カ月で新人ウェブ開発者になるまでの、独学についての話を書きたいと思います。
はじめは、Code Academy(プログラミング学習サービス)でHTMLとCSSの基礎を学びました。初めて書いたPythonのプログラムは数字当てゲームで、コンピューターがランダムな数字を選び、ユーザーが正解を推測して3回まで数字を入力できる、というものでした。Pythonによるこのプログラミング経験によって、私はコンピューターに夢中になってしまいました。
朝4時に起きて珈琲をいれ、1日に6時間から10時間はコードを書いたりプログラミングの本を読んだりしました。そのとき21歳で、リサイクルショップのバイトで生活を支えていました。自分用のツールとしてプログラミング言語を作るなど、大好きなことを1日中していたので、とても満たされた日々でした。
あるとき、軽い気持ちで求人サイトの採用募集に応募しました。返事がくると思っていませんでしたが、数日後にマーケティングの会社から連絡がありました。SQLの試験、電話面接、コーディング試験と続き、その後すぐに対面での面接がありました。面接ではウェブ開発のリーダーと2人のベテラン開発者が参加し、コーディング試験での私の回答についてレビューが行われ、良い感触を得ました。試験で提出した回答に驚いていたようだし、独学だと伝えたときにはもっと驚いていたようでした。私の試験回答のいくつかは、同じ試験を受けた先輩開発者のものより良かったと言っていました。そして2週間後には採用が決まりました。
努力や挑戦をして、つらさを乗り越えられれば、私が経験したように夢を叶えられるのです。
さあ、はじめよう
本書のコードの例は、Pythonで書かれています。Pythonを選んだ理由は、もっとも読みやすい言語の1つだからです。本書では、コード例とその実行結果を以下のように提示していきます。
1 for i in range(100):2 print("Hello, World!")
>> Hello, World!
>> Hello, World!
>> Hello, World!
...
プログラムの後半に登場する >> は、Pythonの対話シェルからの出力です。... がついているときは、長い出力を紙面上省略しています。プログラムからの出力がない、またはコンセプトを説明しているため出力が重要ではない場合、 >>の記載はありません。等幅フォントで書かれた部分は、コードの一部かコードの出力、またはプログラミング用語のいずれかです。
Pythonのインストール
この本を読み進める前に、Pythonのバージョン3をインストールしておきましょう。公式サイト https://www.python.org/downloads/ からWindowsとmacOS用のPythonをダウンロードできます。もしUbuntuを利用しているのであれば、Python3はデフォルトでインストールされています。Python2ではなくPython3をダウンロードするように気をつけてください。この本のコード例にはPython2では動かないものがあります。
Pythonは32bitと64bitのどちらの環境でも利用できます。もし2007年以降に発売されたコンピューターを利用しているのであれば、64bitであると考えて良いでしょう。不安であれば、インターネットで調べておきましょう。
WindowsかmacOSを利用しているのであれば、それぞれのOS向けの32bitか64bitのインストーラーをダウンロードしてファイルを開き、画面の指示に従ってください。次のURLで、Pythonのインストール手順を動画で説明しています[訳注7]。
https://theselftaughtprogrammer.io/installpython
https://www.python.jp/install/install.html
https://pycamp.pycon.jp/textbook/1_install.html
困ったときは?
Pythonのインストールに困ったら、独学プログラマーのFacebookグループ https://facebook.com/groups/selftaughtprogrammers で相談してみてください[訳注8]。オンラインでコードの質問をする場合、GitHub Gistにコードを置くなどしてください。コードのスクリーンショットを投稿するのはやめましょう。コードが画像だと、手伝おうとしてくれる人が実際にコードを動かそうとしたときコードをすべて手入力しなければなりません。GitHub Gistにコードをおいておけば、コードをコピー&ぺーストしてすぐに試せます。
https://ja.stackoverflow.com
https://teratail.com/
チャレンジ
本書では、各章の最後にチャレンジ問題があるので挑戦してみてください。このチャレンジ問題は内容の理解を確認するためのものですが、プログラマーとしての成長を促し、技術面接への準備にもなります。
この本を読んでいることやチャレンジ問題を解いていることなどを、Twitterでハッシュタグ #selftaughtcoder を付けて独学コミュニティの仲間にシェアすることをお勧めします。コードを学ぶ道のりで感じた成長や興奮をシェアすることで、独学仲間たちも励まされるでしょう。またツイートに @coryalthoff を付けて、気軽に私にメンションしてください。
断固として継続しよう
最後に、コンピューターサイエンスを学ぶ前に1つだけ伝えておきたいことがあります。本書を読み始めたあなたは、もうプログラミングの独学を始めています。プログラミングのような新しいスキルを身に付けるうえで一番難しいのは、学ぶ内容の難しさではなく、学び続けることです。私も学習を継続するコツを見つけるまで何年ももがいていました。見つけたコツというのは、「鎖を切らすな」です。
「鎖を切らすな」はジェリー・サインフェルド[訳注9]が考えだしました。彼がこの言葉を思いついたのは、最初のスタンダップコメディのネタを考えているときでした。まず、部屋の壁にカレンダーをかけます。ジョークを書けた日はカレンダーに赤のXを付けます(私は緑のXのほうが好きです)。それだけです。これがコツのすべてで、とても強力なものでした。
Xが並び、鎖ができ始めると、途切れさせたくない気持ちになるのです。緑のXが2つ並び、やがて5つ並びます。そして10になり、20になります。鎖が長くなると、途切れさせるのがつらくなります。想像してみてください。月末にカレンダーを見たとき緑のXが29並んでいて、あと1つあればパーフェクトなのです。最後の1日に鎖を途切れさせる理由などないでしょう。ジェリー・サインフェルドはこうも言っています。
何日か経つと鎖ができます。後はその鎖を維持するだけで、鎖は日々長くなっていくのです。何週間かして、それが自分のものになってくると、鎖を見るのが楽しみになりますよ。後やるべきことは、この鎖を切らさないことだけです。
私もいくつか鎖を作っていますが、その中の1つ「ジムに行く」を切らさないよう夜中にジムに行くなんていう、とんでもない行動をしたこともありました。最初に制覇した月のカレンダーを見て、緑のチェックでいっぱいになっていると、最高の気分になります。マンネリ化してしまった場合でも、カレンダーを振り返ってちゃんとできていた月のことを思い返せば良いのです。
技術書を読み進めるのは難しいものです。私も途中であきらめた本が何冊あるか数え切れません。本書はできるだけ楽しく理解しやすいように作ってみましたが、さらに保険として「鎖を切らすな」で本書を最後まで読み終えてください。
コンピューターサイエンスを学ぶ準備はできましたか? さあ始めましょう!
【目次】