Perl初心者を卒業したら

こちらは「Perl入学式 Advent Calendar 2015」の17日目の記事です。
Perl入学式 Advent Calendar 2015 - Qiita

昨日は @gch0929 さんの「Perlを使って簡易Markdownビューアを作ってみた」でした。
qiita.com

一気に読みこむ方法、僕も最近たまたま研究していたところでした。あと、YAPC::Asiaで声をかけたことは覚えていましたが、あれがPerl入学式と関わるきっかけになっていたとは! お役に立てて光栄です。 ;)

さて本日は、そのPerl入学式のカリキュラムを終えた卒業生が、次なる進路としてどんな言語や技術を選択すると良いか? ということについて考えてみたいと思います。

ただ前提として、ここで言う「卒業生」とは、かつて僕がそうであったように、それ以前にプログラミングをしたことがなかった人や、本業がプログラマーではない人などを想定しています。

実際のPerl入学式では、「他の言語の経験はあるけれどPerlは初めて」という、プログラミング自体は初心者ではない方も多く参加されているので、そういう方は自分なりにアレンジして読んで頂けるとありがたいです。

先達と前提を共有する

いきなり結論から言ってしまうと、プログラミングの初心者がPerl入学式のカリキュラムをひと通り終えたら、次はLinuxの基礎やシェルスクリプト、そしてC言語あたりを習得するのが良いと思います。

「ええ〜、今さらシェルスクリプトC言語?」と思われるかもしれませんし、もしかすると一般的には、Perlの次はRubyPython、あるいはPHPJavaScript、いやいや今ならGoでしょ、Elixirでしょ! などと考える方が自然かもしれません。

しかし僕の考えでは、まだプログラミング自体の基礎が固まっていないうちに、他の言語や技術にあれこれ手を出してしまうのは、ちょっと効率が悪いように思えます。

一方、「じゃあ他の言語に目移りせず、ひたすらPerl道を邁進して《Perlの達人》を目指せば良いのか?」と言えば、それもまた費用対効果が薄そうというか、かかるコストに比べて伸びしろが少ないように思えます。

ではなぜ、「LinuxシェルスクリプトC言語」なら良いのかと言えば、それは今までの自分の経験上、Perlに限らず「プログラミング全域に関わる前提的な知識」の少なさが、学習の速度を落としている、足かせになっている、と実感することが多かったからです。

Perl入学式の講義に参加しても、技術書を読んでも、あるいはYAPC::Asiaなどのカンファレンスに参加しても、「ついていけない」とか「理解できない」と思うトピックに当たったとき、その一番の理由は、話の内容が上級者向けだからというより、むしろもっと基礎的な、彼らプログラマーがすでに一般教養や必修科目のように習得し、共有している知識や世界観を自分が理解しておらず、また話し手の方も、聞き手がすでにそれをわかっているという前提で(意識的であれ、無意識であれ)話しているからだと感じることがよくありました。

喩えてみれば、プロのプログラマーが発信する様々な情報は、「プログラマーにとっての常識」とも言える堅牢な地盤の上に立っていて、しかしそうしたものに対する理解が浅い僕の足元は、液状化した土地のようで、その上に立つ理解はいつもグラグラと不安定です。

そんな不安定な地盤の上に、次はRubyだ、Pythonだ、いやDockerだと新たなレンガを積み上げたところで、一定の高さを過ぎた途端にもろくも崩れてしまうことは目に見えています。

このような状況でまず成すべきことは、崩れることがわかっているレンガを虚しく積み続けることではなく、その足元を支える地盤を少しでもマシなものにすることです。

もちろん、そのような基礎的な知識は、応用的な学習をしながら補完していくことも可能だと思いますし、エンジニア界隈で時々話題に上がる「遅延学習法」という考え方(「必要になってからそれを勉強する」という勉強法)などはまさにその例で、それに比べると、わざわざ基礎だけを学習するというのは、何だか精神論的で、無駄が多いようにも思えてきます。

しかし実際には、遅延学習法のような現場主義的な方法が有効なのは、それなりの経験や基礎知識を持っている人であって、そうでない人が同様のことを目論んでも、行き当たりばったりの状況にしかならず、それによってできることはせいぜい、いろんな言語で「Hello, world!」を出せるぐらいのことではないかと思います。

僕はそのような、とくに使い道のない技術を漫然と増やしていくよりは、まずは多くのプログラマーが共有している歴史認識や、前提的に踏まえている共通言語としての原理的知識を集中的に理解した方が、その後の学習をより迅速に、少ない労力で進めていけるのではないかと考えています。

どこからどこへ遡るのか?

さて、原理的知識を学習するといっても、何もFortranPascalやSimulaを勉強しなければいけない、ということではありません。
目的は勉強すること自体にあるのではなく、「多くのプログラマーが共有している前提(背景)知識を自分も知る」という点にあるからです。

また、せっかくPerlの基礎を身につけたのですから、そのアドバンテージを生かさない手はありません。Perlに関する理解をなるべく応用できる、それと地続きのものであればより効率がいいはずです。

そうした意味でも、上記の「LinuxシェルスクリプトC言語」は、Perlの次に取り組む学習対象として適切であるように感じます。

Linuxの知識は、Perl入学式のカリキュラムにおいてはもちろん、今後もターミナルを使ってプログラムを実行する以上は理解しておいて損になるものではありませんし、将来的にWebアプリケーションの開発を視野に入れるのであれば、データベースやサーバーの技術を学ぶ際にも不可欠なものになるでしょう。

また、シェルスクリプトC言語は、PerlRubyをはじめ多くのプログラミング言語に派生する「親」のような存在ですから、Perlと共通する部分を手がかりとして、学習しやすい面が少なからずあるでしょうし、同時にこの早い段階でそれらを習得しておけば、同じ親を持つ「子」にあたる、他のプログラミング言語の共通要素もまとめて把握することができ、それらを学習する際の助けにもなるはずです。

流行に追いつく

とはいえ、いかに基礎学習が重要だと言っても、現実の身の回りでは日々刻々と新たな技術が話題に上がってくるわけで、それらに目を奪われず粛々とシェルスクリプトの習得に取り組むというのは、何だか厭世的な隠遁者のようで、あまり魅力的には思えないかもしれません。

しかしここで言うのは、そうした基礎だけを禁欲的にやるべきだとか、それ以外をやってはいけないとかいう戒律のようなことではなく、あくまで効率的にプログラミングを習得するための一案に過ぎないので、他にモチベーションの高まる学習対象がある場合には、気にせず並行して取り組めば良いと思います。

というより、原理的な知識や歴史を学習することは、最新の技術をキャッチアップすることと矛盾せず、むしろその理解を促進する効果があると僕は考えています。

たとえば、ここ数年流行しているGo言語は「Better C」とも言われていますが、それが「Cの良い要素を受け継いでいる」という意味だとしても、あるいは「悪いところは継承しない」という意味だとしても、いずれにせよ元々のC言語を知らなければ、「何がBetterなのか」を理解することはできません。

同様に、近年よく話題に上がるDockerやAnsible、あるいはHashiCorpが提供する各種のツールにしても、Linuxの知識がなければ一体何が便利なのか、理解の糸口を掴むことすら難しいでしょう。

また個人的に、Linuxシェルスクリプトの基礎知識が必要だと決定的に感じたのは、pecoが出てきたときでした。
github.com

少し前に話題を集めたこのツールも、当時の僕にはパイプを繋げていくLinuxコマンドの知識がなかったため、周りが盛り上がっているのに何が便利なのかまったく理解できず、その後に地味なトライ&エラーを繰り返すことで、ようやく最低限の使い方はできるようになったものの、それまでは随分歯がゆいような、悔しいような感覚を味わいました。

そもそも、僕がプログラミングの学習を始めたきっかけの一つは、プログラマーの人たちが様々な技術に取り組みながら、実に楽しそうにアウトプットする姿を見て、「なんて楽しそうで、なんてカッコイイんだろう! 自分もその仲間に加わりたい!」と思ったことにありました。

そんな僕が、GoやDocker、pecoなどの話題に追いつけないまま満足できるはずがありません。
少しでも彼らに追いつき、その楽しみを味わうために、まずは多くのプログラミング技術に共通する基本要素を押さえ、そこからいわばテコの原理を用いるように、個別の内容を最小限の労力で一気に収めていきたいと考えています。

まとめ

世界一周、その後に

僕は1975年生まれで、二浪して美大に入ったのが1996年の春、卒業したのは2000年の3月でした。
そしてその間、大学でプログラミングの授業を受けたことはまったくありませんでしたし、おそらく当時は(おぼろげな記憶ですが)、そのような授業の選択肢すら無かったと思います。

今は必修科目にプログラミングのある大学も少なくないようで、そのような学生時代を過ごした人とは状況が違うかもしれませんが、僕はその後も2013年にプログラミングを始めるまで、どんなプログラミング言語にも触ったことがなく、Linuxが何かということも知りませんでした。

そんな僕にとって、「Perl入学式」は世界の名所を短期間で駆け巡る「5泊6日、世界一周旅行!」のようなもので、それはプログラミング技術の全体像を知識ゼロの状態から一気に俯瞰するには最適の場所でしたが、当然のことながら、その限られた機会で個々のトピックを背景から細部まで理解することはできません。

だからこそ、最短コースの世界旅行で地球全体を俯瞰してから、各国の歴史や文化を一つ一つ学んでいくように、まずはPerl入学式でプログラミングの世界像を大づかみにしてから、それらの元にある概念や歴史を遡るように学んでいくことによって、多くのプログラマーと思想を共有しながら、やがて盤石になっていく土台の上に希望の塔を建てていく、ということができるのではないかと考えています。

推薦書紹介

最後に、今回の記事を書くきっかけになった書籍を一点、紹介します。

新しいLinuxの教科書

新しいLinuxの教科書

本書を買ったのは今年の6月で、ちょうど仕事のピーク期と重なったこともあって、読み終えるまでに5ヶ月程かかりましたが、それでも読んでいくうちに、自分の虫食い状態で穴だらけだったプログラミングの基礎知識がみるみる埋まっていくのを感じました。

本書では通常のプログラミング言語の入門書ではわざわざ説明してくれないような、基礎的なことを非常に細かく、しかし煩雑にもならず、明快に説明していて、またシェルスクリプトVim、Gitなどについても基本的なことが詳しく説明されているので、どのような言語を学ぶとしても、副読本として合わせて読むことを(とくに初心者には)お勧めできます。

ちなみに、僕は普段は本(というか)の編集を仕事としてやっていて、同時にプログラミングに関してはまだまだ初心者なので、その技術書が「わかりやすいかどうか」ということにはそれなりに敏感なのですが(読者の方にある程度知識があると、説明不足の箇所も勝手に補って読んでしまうのに対し、初心者の読者はそうした読み替えができないので、粗がわかりやすいということ)、その観点から見て、本書のわかりやすさ、細部まで行き届いた著者の丁寧な態度は、結城浩さんの『Perl言語プログラミングレッスン』や、山本陽平さんの『Webを支える技術』などと並んでトップレベルのものでした。本当に良くできてる!

願わくば、本書は大判であるわりに電子版がないので、様々な環境からアクセスできるよう、電子書籍としても出てくれると良いのですが。

なお、上ではC言語の学習についても勧めましたが、これは僕自身、まだ上記のLinux本をようやく読み終えたばかりで、Cの学習はこれから本格的に始めるところなので、参考書籍を推薦することはできず(読んでいる本はありますが)、またそれゆえに現時点では、C言語を「Perlの次に勉強すべき」と言える根拠もありません。

おそらくこれについては、今後1年程の期間をかけて、仕事の合間に少しずつ触れていくことになると思うので、それが済んだ頃、ここに示した提言が正しかったのか、それとも見込み違いだったのか、あらためて報告したいと思っています。

本日の記事は以上です。最後までお読み頂き、ありがとうございました。

明日の「Perl入学式 Advent Calendar 2015」は、@umaaaaa さんです。
Advent Calendarも残り1週間、ぜひお楽しみください!
qiita.com