最近、趣味でiPhoneアプリやプログラミングを始めたいという人からお勧めの勉強法を聞かれる事が多くなってきた。そこで、挫折しがちなプログラミングの覚え方を考えた。どう最初の壁を乗り越えるかについて書いてみます。
ちなみに、僕は超文系で、数学も死ぬほど苦手である。プログラミングを始めたのは28歳すぎで、歴はちょうど2年。PHPから初めて、2011年の3月にiPhoneでObjectie-Cを勉強し始めた。主にネットと本の独学。
小さい頃からプログラミングに慣れ親しんでいるわけでも、理系だったりもないので、当初の「絶対、俺には無理だ、この呪文の羅列は向いてない!」という気持ちも覚えています。文系出身だったり、プログラミングは専門外すぎて無理だと思っている人向けにこの記事は参考になるかもしれない。
ちなみに、プログラミング始める前までの経緯とか、少なくともhtmlとかできたんですかとかもよく聞かれるけど、そういうのは気にしなくてよいのである。それより、楽しくなるかどうかが重要で、楽しくさえなれば、勉強という意識がなくなり持続する。持続さえすれば勝手に上達する。
楽しくなければ続かないし、楽しくない事を続けても人生楽しくない。だから、自分が欲しいものをいきなり最初に作るのがよい。他人を笑わせれそうとか、情熱が続けばなんでもいい。ちなみに最初に作ったものはどうせ途中で辞めるので、あまり長い期間の間に情熱が続くものとか、スタートアップ的には考える必要ないと思う。
よく、まずhtmlから勉強してみたらいいのかなという事も聞かれる。そういう一般的な手順はどうでもよいのである。自分が作りたいものを先に決めて、それに必要なものだけ逆算すればいいと思います。
なので、最初にどんな言語から始めればいいかとかは考えずに、作りたいもの、欲しいもの、情熱が続きそうなものを決めて、それに必要な言語を調べればいい。その頃には選択肢がある程度絞れているから、選ぶのも楽だし。
まず基礎から始めるかと考えて、データベースとか、なになにの基礎とか、猿でも分かるなんたらなんたらの本から始めるかとか、これとこれを読んだら分かるだろうと勉強チックな感じで進めると挫折確率が高まる。別に技術者試験のテストを受けるわけでもないし、CSの学位を取るわけでもないので、楽しく、挫折せず、継続させるの3点だけに集中するのがよい。
例えば、自分が欲しいものがモバイルアプリだったら、iPhoneとかAndroidアプリを作ればいい。Webサービスでもいいし、ゲームが作りたければゲームでもよいし。
自分の場合、本当に初めての時、実はプログラミングの入門書を買って、こつこつ毎日進めていた。死ぬほど退屈で苦行で、レッスン4ぐらいに進んだ頃にはレッスン2の内容は忘れていた。実践で書いてないから高速で内容が頭から消えて行く。いつ使うかも想像できないメソッドとかを順番に覚えるのもやる気がでなかった。
これで、2回ぐらい挫折しました。でも、めんどくさいから作りたいものを決めて、それに必要なものだけその都度調べるというやり方に変えると、一気に面白くなり今に至ります。確か、ポールグレアムのエッセイに、最初からいきなり作り始めろと書いてたのがきっかけだったような。
さて、情熱が続きそうなものは技術が難しすぎてできないよと反論がきそうだ。うーむ、確かに。これは難しい問題である。自分も小さな頃からどこでもドアが欲しいけど、技術的に難しそうで、いきなりどこでもドアを目指したら挫折確率は限りなく高まる。
ここでは、とにかく簡単そうで、なおかつ自分に役立つものか、あるいは笑えるものを作るのはどうでしょうか。サービスと考えるよりも、特定の用途に絞るといいかもしれない。とにかく、小さな分野にまで切り詰めると、そこまで難しくないものに収まると思う。ジョークアプリとかいいかも。簡単で、モチベーションが湧きそうだったらなんでもいい。
さて、だいたい絞れてきたら、それに必要な言語も現実的には複数まで絞られると思う。例えば、Webサービス系だったらPHP、Ruby,Pythonとか。どれを選ぶかに迷ったら、身近に教えてくれそうな人が得意な言語にすればいい。
ところがどっこい、そんな人は普通まわりにいないのが現実。もし周りに教えてくれる人がいたら、とても幸せだと思う。僕の場合、プログラマの知り合いは皆無だったので、入門書籍が豊富な言語という基準で選びました。
ちなみに、たまたまプログラマの知り合いがいたとして、その人にお勧めの言語を聞くとします。十中八九、その人は自分の好きな言語に誘導します。別に自分が作りたいものに必要な言語であれば丁度いいのですが、下手すれば、モバイルアプリ作りたいのにWebサービスしか作れない言語から始めるといいよというアドバイスをもらうかもしれない。注意。
例えば、僕がPHPやってた時に相談を受けた時は、「PHPでWebサービスするのが最初はいいよ、htmlもcssも基本だし。」と誘導尋問してました。最近はiOSアプリ作っているので、「今ならiPhoneアプリだよ。Xcodeが凄く使いやすいし、アンドロイドみたいにいろんな機種に対応しなくてよいから楽だよ。」とか誘導します。
僕の場合、なんで誘導するかというと、単純に知り合いが興味を持ってるならプログラム仲間を増やすチャンスだと目をぎらつかせからです。まあ、熱心に教えてくれる人がいて、Web系でも作りたいもののアイデアがあるとか、どっちでもよい場合は臨機応変に判断すればOK。
とりあえず、言語(技術)から選んで、そこを出発点にすると挫折確率が高まるので注意。
ようやく、自分のやる気が出て、なおかつ簡単な作るモノのアイデアと、言語も決まったとします。ここで、次にぶち当たる壁は、こういう動作をさせたいけど、そもそもなにを勉強すればいいか検討もつかないというジレンマです。
ここは難しい。ここは詳しい人が近くにいると凄く助かる。検索ワードを教えてくれるだけでも仏様のように感謝したくなる。でも、そんなラッキーな境遇にはいないのが現実。こんな時に、技術書を複数買っていると役に立つ。
慣れてくるとネットで検索したほうが早いけど、初期段階では網羅的に方法論を書いている入門者はもの凄い力を発揮します。技術書は高いけど、似たような内容のものを何冊も買うと挫折確率が低くなる。もしお金がなくて、都内に住んでたら大型書店で立ち読みでもいい。
ここのポイントは、自分がこういう動作をさせたいという目的があるので、それについて書いている箇所を数冊の本から探し当てるのです。数冊買っても全部読む必要はなくて、必要な時に串刺し検索みたいにピンポイントで解説してるかを探し当てる。辞書的に使う。
さらに、同じ技術の解説でも、最初はいろいろな角度から解説してくれると一冊目で理解できなくても、三冊目ぐらいで分かる可能性が高いので数冊あると挫折確率がまた低くなる。せっかく実装させたい動作がはっきりして、学習意欲が高まったのにやり方がわからないのはもったいない。
どうしても分からなければ、出来る限り内容を詳しく書いて、誰かが答えてくれるかもという願いを込めて掲示板で質問するしかない。ところがどっこい、頑張って詳しく内容を書いても誰も答えてくれない確率が高いので、自分で検索したり、本を横断したほうが近道だったりします。
最後に、挫折確率を下げるやり方として、なんでも適当におおざっぱに進めていくのがよい。細かい部分は後から修正するという信念で、とにかく最小限の機能に絞って動くものを、デザインはひどくてもよいから早く作ると。
コードも汚くてよいから、動けばよいという哲学で進めると、ここでもまた挫折確率が低くなる。綺麗なコードに書き直すとか、そういうのは後々勉強すればよいので、はやくリリースさせるのを優先する。次は次はというテンポを作って、途中で止まっちゃわないように。
大抵の人の最初の壁となるのは、if構文とかループとか基礎的なプログラミング構文でさえもない。環境構築であったり、サーバへのアップ方法であったり。iPhoneアプリだったらXcodeの使い方であったり、Developer登録であったり、実機への転送方法であったりする。
こういう事は、実際にその都度、検索しながら覚えていくしかない。基礎をすっ飛ばして、こんなやり方で後から困らないの?と心配になるかもしれない。でも、技術的な事を心配する前に、その他の要素で挫折する可能性は限りなく高い。
そもそも、最初の段階で、これをまず覚えて、これも重要でと、あれこれ考えるとめんどくさくなって挫折すると思います。
基礎固めや発展的な知識は慣れてくるとそのうち興味が湧いてきて、自分からいろいろと知りたくなってくると思う。なので、最初はあまり心配せずに、ある程度興味を持ってきてから言語について学んだり、他人の書き方を参考にしたり、リファクタリングとかデザインパターンを学んだらいいと思う。
最後に、iPhoneアプリを始める人にお勧めの3冊を書いておきます。
「よくわかるiPhoneアプリ開発の教科書」
最初に読む本として最適。この本でとりあえず動くものが見れて、全体像が分かる。
「UIKit詳解リファレンス」
iPhoneの見た目の部分をどう実装するかの本。初心者の頃は手放せない。
「詳解Objective-C」
言語のリファレンスとして、辞書的に使う。
※番外
「iPhoneアプリ設計の極意」
UIデザイン、ユーザビリティを扱った海外で評判の本。翻訳も凄くいい。プログラミングは一切出てこないけど、UI設計の基礎知識をつけたり、知識の漏れを埋めるために凄くいい本。