どの言語を学ぶべきか 学習コストと報酬の怪しい関係

ゲームばっかりやってても金にならないし(むしろ金が減っていくし)、こんな収入じゃぁ、結婚なんて到底ムリだし、やっぱ、なにか手に職をつけてガンバるしかねぇなぁ、とか。

 

まあ、動機はいろいろあるでしょうけど、「分かったよ、そのプログラミングとやらを覚えれば、明るい未来が開けるっていうんだな」と思って調べてみると、主要な言語だけでも、その名前を覚えるのでさえ大変、いったいどうなっているんだ?!とイラついてしまった人も多いのではないでしょうか?

 

週末プログラマー歴3年のわたくしが語るのもまったくおこがましく、むしろわたし自身の「脳の整理」として、知ったかぶりの知識を並べてみようと思います。

 

・レベル 1 ーーほんのちょっと触ってみるーー

この段階でオススメなのは、やはりJavascriptです。

ほとんどどの言語をやっても、まず「変数」を覚えて、「型」がいろいろあって、「うわぁ」っとたじろいで、For文でフィボナッチ数かなにかをループさせたりして、If文で条件分岐させて、条件が多くなったらSwitch文で分岐させて...とこんな感じに一通りやっていくわけです。まあ、この段階で面白いと思えなかったら、もう別の道を探すべきで...

 

2013年度TIOBE発表プログラミング言語ランキングとweb系にオススメする言語

↑わたしが「そろそろ子供が欲しいな」という願望と、そしてその責任から来る恐怖を覚え始めた3,4年前にこのサイトを読んだのをいまでも薄っすら と覚えています。ほかのサイトもいろいろと読んでみたのですが、「CとJavaが首位を争い続けて久しい」というようなことが書いてあったので、ひとまず その2つから始めました。このサイトの初期の記事はその2つの言語から始めているのがその証拠です。

恥ずかしながら、Javaをインストールして「Hello, World」を実行しようとしても、コンパイルができません、Javacが見つかりません、というようなエラーが出て、2時間位、インストールとアンイン ストールを繰り返したりしながら、イライラして、ふと「Java コンパイル できない」と検索してみようと思い、ようやく「パスを通す」ということを学び、「Hello, World」を表示させることができたという苦い思い出があります。

 

自分がつまづいていることは、世界のどこかで同じようにつまづいて助けを求めて、そしてどこかの心優しい人がそれにヒントを与えているというネット上の助け 合いを知ったのは、とても大きな経験になったのですが、CもJavaも、あまり初心者向けではないということが、あとで分かりました。

 

先ほど述べた、基本構文を覚えても、それでいったい何ができるんだろうというのが具体的にイメージできないことに長い間モヤモヤしました。 Javascriptをオススメする第一の理由は「ウェブサイトなら、パソコンを持っている人なら見たことがない人はいない」わけで、HTMLと組み合わ せることで、具体的に自分でもなんとなくイメージできることを実際に作ってみる、という経験ができることです。

もちろん、メリットとデメリットは常に裏表(うらおもて)で、コンパイラーが不要で、インストールやパスに悩まされることがない反面、ちょっとややこしいプログラムになってきたときに、バグがどこにあるのか見つけるのが難しいという点があります。

FirebugやChromeのコンソールから調べられるのですが、わたし自身もその方法を調べるのにけっこう時間がかかりました。

 

プログラミング言語ランキングより:2016年 動向を見守るべき言語は Elixir、Julia、Rust、Swift、TypeScript

2013年と16年を比べると、わずか3年のうちに大きな変化があったのが読み取れます。週末プログラマーのわたくしとしては、実務面での詳細はよく分からないのですが、この「言語の進化」の過程がすごく面白いのです。

 

 

13年に9位だったJavasciptが、なんと首位に踊り出ていますね。

 

最高のプログラミング言語(または私は如何にして心配するのを止めてコードを愛するようになったか)

こちらのサイトにはわたしも同感です。下のコメントをご覧ください。

 

「コミュニティが言語にとっての最大の資産の一つ」というのが、わたしがJavascriptをオススメする大きな理由の一つなのです。とても分かりやすい日本語の入門サイトもたくさんありますし、ちょっとしたことを実現しようと思った時、ググればすぐに情報が出てきますし、なによりもそれらの情報がかなりの初心者にも分かるように、噛み砕いた口調で紹介されているのも重要だと思います。

 

先ほどJavaのコンパイルがうまく行かなかった時の話をしましたが、或るサイトでは「今時のひとはパスを通すことすら知らないのは、ほんとに嘆かわしい」とかなんとか書いてありました。

わたしはその当時はまだ、まったくのWindowsユーザでしたから、インストールというのは「インストーラーをダウンロードしてきて、そいつをダブルクリック」としか知りませんでした。「パスを通すのを知らないことが嘆かわしい」という意見には腹が立ちましたし、自動的にパスが通るようになっていないOracleのインストーラーにも「初心者お断り、とでも言いたいのか?」と頭に来ました。

まあとはいえ、16年現在でもJavaは2位を保持しているので、こちらにも活発なコミュニティが存在するのでしょう。

 

 

・レベル 2 ーーオブジェクト指向ーー

さて、Javaと言えば「オブジェクト指向」。

いちおう、今もプロのプログラマーの主流は「オブジェクト指向」であるのは、(2016年現在) Top10の言語を見渡してもよく分かります。

 

初心者を悩ませる第一の難関としては「オブジェクト指向っていったい何なの???」という疑問ですよね。

 

何度も書いているように、わたしは一番最初に学んだのがJavaでした。

ただ、なにも考えずにClassを作って、newでインスタンス化して(合ってますよね?)、メソッドを呼び出して、というお決まりのパターン。

 

クルマというClassがあって、そのオブジェクトには名前があって、動作があって、云々。。。というのは、とにかく呪文のように覚えるものなのかと思って、忠実に写経することに専念しましたが、これまたすでに書いたように、これで一体なにができるのだろうか?というのが、まったくイメージできませんでした。

 

わたしが実務で使っているのは、今のところ、Excel VBAだけです。

これは2016年のランキングで言うと19位の「Visual Basic」の一員ということで間違っていないと思います。ということで、ご存じの方も多いかと思いますが、Excel VBAのユーザのほとんどはあまりオブジェクト指向なんてことは考えずに、日々の面倒な作業をかるく自動化できるように、ということだけを考えて、おそらく「手続き型言語」的な発想でコードを書いていると思います。

ちなみに、実務をこなしていて思うのは、この言語にも初心者にやさしいコミュニティが、日本語環境に存在しているのがとてもありがたいです。

 

そうこうしているうちに、VBAを一通り覚えたので、久しぶりにCode AcademyでJavaを復習してみました。最初にJavaを写経していた頃は、ClassとかMethodとか、ほとんど意味がわかっていなかったのですが、Javascriptをイジったり、会社でVBAと格闘しているうちになんとなく大まかなことがつかめてきました。そうして復習してみると、Javaの面倒くさい「クラスの定義」というのは、つまり、自分で或る目的に適した道具そのものを作っていて、それを必要に応じて使い分けたりすることができるわけだな、ということがなんとなく想像することができました。

(※プログラミングが総じて、どういうことをしようとしているのかが、ざっくりとでも分かっていなければ、この説明もまたモヤモヤですよね...)

 

そして、大規模なシステム開発では依頼者の要求に応じて、さまざまな必要性が生じて、それを満たすことができるように一つ一つ道具を作っていって、それがしかも、ほかのチームやグループ、あるいはまったく別のソフトウェア開発会社が同時に、それぞれに割り当てられたモジュールをコツコツ作っていって、それらがぶつからないように考えられているんだなと想像することができました。※あくまで、いまだにわたしの実務経験のないままでの想像ですので、ぜひ実務経験者の方からいろいろご意見をいただければ幸いです。

 

初心者のかたは、この説明を聞いても、やはり意味が分からないと思います。

これはなんだか悪循環に思えてなりませんね。 初心者は仕事を探したいから「オブジェクト指向」を理解したいのに、実際に仕事に携わってみないとほんとの感覚としては理解できない。じゃあ、初心者はどうしたら良いのか?

 

専門学校か何かに通って、例のClassとかMethodとか、そのほかにもいろいろとややこしい機能なんかをちゃんと説明できるのに、いざなにかを作りなさいというと、どこからコードを書いていいか分からない人がけっこういるという話をなにかの本で読んだのですが、そんなバカなことが起こるのだろうかとすぐには信じられませんでした。ただ、今はプログラミングという世界では起きてしまうのもなんとなく分かるような気がしてきました。

 

もうすでに「プログラミングの道で生きていくんだ」という強い決意のある方なら、具体的にどういうものが作れるのかイメージができないままでも、とにかく一つ一つの知識を覚えていくというのも、「有り」なのかもしれません。が、個人的にはそんなのって面白くないでしょと思えてなりません。まあ、そこは個人の価値観なので深く立ち入りませんが...

ソフトウェア開発会社というとかなりブラックなところが多く、ボロボロにされてしまうというような話をよく耳にします。が、ボロボロにされてしまうほうにも、してしまうほうにも問題があるのではないでしょうか? ビジネスの基本とか、コミュニケーションとかのごくごく基本的なところが欠落した人間が集まってしまったがゆえに、そこまで問題が大きくなるのではないだろうかと思えてならないのです。

みなさんがこれから、プログラミング言語を習得するためにどれだけの「時間と労力」(総じてコスト)をかけるかは分かりませんが、「基本」を見なおさないと、とんでもない泥沼に飲み込まれてしまうかも知れません。

 

さて、これ以上「オブジェクト指向」について考えてみても、結局この問題は、ある程度プログラミングのことが分からないうちには理解できないことなので、初心者がどの言語を最初に学ぶべきかという問いには、答えを与えてはくれそうにありません。

 

実務でVBAしか使ったことのないわたくしだからこそ、お伝えしておきたいことがあります。それは今の会社で1年半ほど前に、初めてVBAでの仕事をやってみないかと言われた時、Javaをほんのちょっとカジったことしかなかったわたしでも、JavaとVBAは書き方がけっこうちがうのに、やろうとしていることはすぐに理解できたということです。

Switch文がSelect Caseだったり、波括弧で囲わなかったり、セミコロンで区切らなかったり、文字列を結合するのに「+」ではなく「&」を使ったり、こまごました違いを挙げていけばキリがないのですが、それはほとんど問題にはなりませんでした。

 

 

たとえば「Pythonをやるべきか、Rubyをやるべきか」とか「Railsをやるべきか、Angularをやるべきか」とか。いろいろと甲乙つけがたい選択というのはたしかにあります。

わたしの意見としては、なにかしら自分に興味を持たせてくれるきっかけがあったのなら、その言語をしばらくやっていればいいですよ、ということです。

 

たとえば、なにかのきっかけで「Railsチュートリアル」を見つけて、やってみたら面白かったのなら、とにかくそれを最後までやって、できれば2回3回と繰り返すと良いでしょう。ウェブ開発のFrameworkがどういうコンセプトなのかを理解できれば、そのあとに「Django」をやっても「Angular」をやっても、分からないことがあればググッてすぐに解決できるようになっているはずです。

まあ、今のわたしのように「データ分析」に興味が移ってきた場合など、どちらに進むべきかすぐには決められないと思いますが、心ゆくまで悩むしかないですね。ひたすら自己問答を続けるのみ!

 

 

レベル 3 ーー高速化ーー

さて、ここまで来たということは、もうすでにある程度の経験者ということですね。

もしまだ初心者の方でしたら、まあ将来的にはこういう壁が待ち構えているということは知っておいても損はないでしょう。

 

ネイティブの言語と、そうでない言語があるというのは、プログラマーでなくても、一般教養として知っていると、コンピュータの世界がどんどん面白くなっていくと思います。

具体的なところは、C言語のポインタとか参照がいまだにおぼつかないわたしは語りませんが、「ネイティブ」という語からも分かるように、コンピュータ君がそのまま理解できる言語と、通訳を介さなければいけない言語とイメージすれば分かりやすいでしょう。

 

ちょっとポインタとか参照という話を出ましたが、C言語はネイティブなプログラミング言語の代表選手と言って差し支えないでしょう。

うーん、ちょっとむずかしい説明ですね。

まだ詳しいことは分からないのですが、C言語はコンピュータの深いところを細やかに制御することができるようです。それをこの世界では「低水準」と呼ぶからややこしいんですよね... 「低水準」というとなんだか途上国の生活レベルのように、いろいろ残念な問題をたくさん抱えてそうなイメージが浮かんできてしまいますが、それとはまったく正反対で、ほかの言語では操作しないような深いところ(コンピュータの世界ではそれが低いところにあると考えるのでしょう)を直接コントロールすることができるという意味です。

その代わり、自分がなにをやっているのか「常に自覚して、それを伝えなければ」けっこう大変な問題を引き起こす危険性もはらんでいるそうです。(それだけ技術のレベルとしてはすごく高水準なことをやっているのに、低水準と呼ばれています、面白いですよね。昔のエンジニアさんが最初に翻訳した時にまちがったのでは、とさえ思えてきます。例えば、システムの低層域にアクセスできる、とか、そんな表現ならもっと直感的に理解できたかも)

 

先ほど「オブジェクト指向」のくだりで紹介したJavaは、書き方が面倒くさいように見えても、こちらはネイティブではありません。JVM(Java Virtual Machine)という、いわばコンピュータ君にとっての通訳があいだに入ります。そのおかげで、一度プログラムを書けば、どのプラットフォーム(Windows、Mac、Linuxなど)でも動かせることができるというメリットがあり、その代償として処理速度が遅くなってしまいます。

通訳を介する会話はどうしても遅くなってしまうのは、よく分かりますよね。

 

ここで個人的にはすごく面白いと感じたことを一つ紹介します。

C++という言語は世界中で広く使われているにも関わらず、あまりよろしくない言語のようですね(13年には3位だったのが、16年には5位に。下落傾向にあるとはいえ、まだまだかなりの上位です)

 

Linuxを作ったプログラマーとして絶大な尊敬を受けるLinus Torvals氏は、下の動画を見ていただいても分かるように、非常に温厚で知性の漂う人間なのですが、C++にはよほど腹に据えかねた怒りを覚えたのでしょう。彼のEmailを一部翻訳してみます。

From: Linus Torvalds <torvalds <at> linux-foundation.org>
Subject: Re: [RFC] Convert builin-mailinfo.c to use The Better String Library.
Newsgroups: gmane.comp.version-control.git
Date: 2007-09-06 17:50:28 GMT (2 years, 14 weeks, 16 hours and 36 minutes ago)

On Wed, 5 Sep 2007, Dmitry Kakurin wrote:
>
> When I first looked at Git source code two things struck me as odd:

わたしが初めてGitのソースコーを見た時、2つのことがおかしなものとして眼に飛び込んできました:
> 1. Pure C as opposed to C++. No idea why. Please don't talk about portability,
> it's BS.

1つめは、純粋なCではなくC++。 さっぱり分かりません。 頼むからポータビリティについては語らないでください。それはBS(Bullshit デタラメとか時にはクソッタレと訳されることもある、直訳すると牛の糞)ですよ。

*YOU* are full of bullshit.

"あなたたち(たぶん複数形)"はみんな糞のかたまりです。

C++ is a horrible language.

C++はひどい言語です。

It's made more horrible by the fact that a lot of substandard programmers use it, to the point where it's much much easier to generate total and utter crap with it.

低レベルなプログラマーによって使われているという事実によってさらにひどくなっています。それはもはや完全な紛れもないクソをつくったほうがマシだというところまで来てしまっています。

Quite frankly, even if the choice of C were to do *nothing* but keep the C++ programmers out, that in itself would be a huge reason to use C.
率直に言って、Cを使うという選択が、もし、ただC++プログラマーを締め出すという目的でしかないとしても、それ自体がCを選ぶ大きな理由なのです。


In other words: the choice of C is the only sane choice.

言葉を変えるなら: Cを選ぶということが唯一まともな選択なんです。

I know Miles Bader jokingly said "to piss you off", but it's actually true.

マイルス・ベイダーが冗談で「むかつかせる」と言ったのは知っています。でも、それは事実なんです。

I've come to the conclusion that any programmer that would prefer the project to be in C++ over C is likely a programmer that I really *would* prefer to piss
off, so that he doesn't come and screw up any project I'm involved with.

わたしはある結論に達しました。それはもしCよりもC++を好むプログラマーがいるとしたら、わたしは彼をむかつかせるでしょう。そうすればわたしが関わっているプロジェクトから彼を遠ざけて、メチャメチャにされないですむのですから。

 

 

彼の不満はまだまだ続くのでこの辺にしておきますが、一見とても信頼のあるもの(理由としては多くの人々によって使われているから)も、実は内側を詳しく見てみると、とんでもなくグチャグチャになっていることがあるという事実は、わたしが今働いている外資系金融機関ととてもよく似ているのです。

 

ネイティブか、非ネイティブか、という話を先ほどしましたが、たとえば、Pythonでは処理時間に時間がかかってしまう部分だけをCでコーディングする「Cython(たぶん、発音はサイソン)」というアプローチがあるそうで、とてもスマートなアプローチだと思います。ゆくゆくはそんなカッコいいことができるようになりたいものです。

 

 

レベル 4 ーービッグデーターー

みなさんも「ビッグデータ」という言葉は、ちょくちょく耳にするようになったのではないでしょうか?

明示していませんでしたが、これまではおおむね大規模なシステム開発とかウェブアプリ開発なんかをモヤっと想定しながら話を進めてきたわけですが、この分野はちょっとちがいます。実務経験はないので、あくまで「たぶんちがいます」と言っておきましょう。

 

ここで使われる技術はプログラミングのなかでも「データ分析」とか「データ解析」というもので、システムとかアプリを構築していくというよりも、日々どんどん増えていく「データ」を必要に応じて、どのようにサバくのかということが、あまり定型的ではなく臨機応変にできる必要があるように思われます。

「ビッグデータ」を活用したAI(人工知能)のようなシステムになるとやはり大規模開発というような様相を呈してくるのかも知れませんが、そちらの現場がどのようになっているのかは、ほとんど想像すらできません。

 

個人的には「機械学習」などにとても興味があるので、今後このサイトでもちょくちょく紹介していこうと思っています。今のところの記事としては:

初めてのデータ分析(Data Analysis)

Python データ分析 100万件の映画評価データ

 

この分野の変遷をちょっと詳しく見てみましょう。

13年の15位「MATLAB」というのは、Wikipediaによると「MATLABは、MATrix LABoratoryを略したものであり、行列計算、ベクトル演算、グラフ化や3次元表示などの豊富なライブラリを持った、インタプリタ形式の高性能なテクニカルコンピューティング言語、環境としての機能を持つ。」だそうです。

 

13年の20位には「SAS」というのが見えますね。

SASとは何か

SAS(サスと呼ばれています)とはStatistical Analysis Systemという名前の、コンピュータソフトウェアの1つです。SASの主たる目的は、その名の通り、統計計算です。いわゆる「統計パッケージ」として分類されるものです。

 

16年には「MATLAB」は18位にランクを落とし、13年には名前も見えなかった「R」が13位へと急上昇をしています。

16年には「SAS」は姿を消してしまいました。

Pythonにもデータ分析のライブラリーが充実してきて、しかも汎用的な言語でもあるので、順位を上げつつ(8位→4位)、他の言語を押し下げたのかも知れません。

 

 

「NO SQL」というのも、とても面白いと思います。

データベースといえば、現代の主流はなんといっても「リレーショナル・データベース」ですよね。まあ、或る本によると、もうすでに古臭いと思われているモデルのデータベースも実はかなりの割合で現役として使われていると書かれていましたが…

ともあれ、リレーショナル・データベースの基本的な考え方として、データを正規化して構造化して、トランザクションを厳密に制御して、狂いのない"堅牢な"システムを構築するというところに、信頼性があり、多くの企業で採用されている所以でもあります。が、NO SQLはそれをあえてバラバラにして、「堅牢性」を犠牲にしても、速さや柔軟さを実現しようというところに、これまでの既成概念を根底から覆すような発想の転換があって、素晴らしいと思いました。

また、「ユニケージ開発」はUnixのシェルプログラミングという、いわば昔ながらの、今時の新しい機能を持っていない、ある種、原始的な言語で、かえって保守性に優れた柔軟な開発手法ができ、それが徐々に広まりつつあるというのは、わたしのようにまだまだプログラミングの世界に入りたての者としては、価値観を根底からグラグラと覆されるような思いで、今は眼が回っています。16年には「Shell」が11位に食い込んでいるのは、その浸透がけっこう進んでいることを示しているのかも知れません。

 

個人的にはこういう「古くてシンプルなものがかえって新しくてカッコよさげに見えるものよりも、実は優れている」という事例はとても好きなんですよね。サムライ・スピリッツのようなカッコよさを感じます。

 

レベル 5 ーー関数プログラミングーー

もうすでにここに来るまでに、完全な初心者のかたなら「船酔い」ならぬ「情報酔い」を起こして、早々にどこかへと行ってしまったことでしょう。

これまでも、「ネイティブ対非ネイティブ」とか「オブジェクト指向」と「データ分析」とか、「構造化された堅牢性VSシンプルな柔軟性」とか、時には対照的だったり、時にはまったく別分野だったりと、プログラミングと一口に言っても、さまざまな種類があることが分かってきました。もちろん、言うまでもありませんが、それらはどれが良いとか悪いとかではなく、どこに重点を置いているのかとか、向き不向きとして考えるべきものです。まあ、Linus Torvals氏のメールからは、C++はほんとにダメなような印象を受けましたが...

 

とはいえ、これまでダァっと語ってきたことは、いわば「ニュートン物理学」のようなもので、もちろん、論理的な知性と緻密な性向を持ち合わせないと楽しめない世界ではありますが、これから語る「関数プログラミング」に至っては、もはや「量子論」の世界で、アインシュタインですら理解に苦しんだような、わたしにはそんな印象を与える世界です。

 

Common Lisp 入門

Emacs Lisp 入門

いちおう、いくつかの本を読みかじってみたのですが、それでも概要を説明するのすら躊躇してしまいます。興味のある方は、上の入門サイトをご覧ください。

また、インストールが面倒な方は、「Tutorialspoint」でかるく動かしてみることができます。

 

この分野の変遷もまた、なかなか興味深いです。

Lispというのは、世界で2番目に生まれた「高級言語」(1つ目はFortran)だそうで、非常に歴史が長いです。また、FortranはC言語に引き継がれ、その他の主要な言語の原型となったのに対して、Lisp(関数プログラミング)もまた独自の進化を遂げていっているという対比も興味深いです。

 

まず大御所のLispは13年の時点では16位(前年13位)で、16年には上位から姿を消してしまいました。しかし、「Haskell」「Scala」「Clojure」「Groovy」がどんどん順位を上げているという意味では、むしろ関数型プログラミングが勢いを増しているということでしょう。

 

しかしここで、わたしは興味深い事例を知りました。

Elixir試飲録 (1) – 今、プログラミング言語を選ぶということ: Scala, Go, Elixir

 

Scalaというのは、マスターできるとかなり"カッコいい"言語だとはちょくちょく聞いていましたが、「オブジェクト指向と関数型」を融合させるというのは、実際の継続的なビジネスの現場ではこのような困難を引き起こすものなのだと分かりました。

 

いちおう、わたしが「関数プログラミング」についてはっきりと理解しているのは、「関数プログラミング」はバグが起こりにくく、それゆえに「並行処理」に向いているという点です。

 

今はひとまず「データ分析」の基礎をしっかりと身に着けたいと思いつつ、ほんのちょっと「並行処理」にも寄り道しています。

Linuxでの並行プログラミング

 

上記の記事にも書かれているように、その会社はScalaを捨てて、Goに乗り換えるという決断をしたそうですね。

Go言語は、ネイティブでありながら、マルチプラットフォーム。並行処理もサポート。「ユニケージ開発手法」と比較してどうなのか知りたいところですが、将来の保守性も高いそうで、かなり理想的な印象を受けます。

そして、なにより面白いのが、すっかり時代遅れになったのかと思っていた「手続き型プログラミング」だそうです。大規模開発には「オブジェクト指向」はなくてはならないと思い込んでいたところに、またしてもカウンターパンチを食らったような気分です。

この言語の開発には、UnixやC言語を開発したケン・トンプソンというプログラマーが参加していたそうで、プログラミング言語の栄枯盛衰はこんなにもめまぐるしいのに対して、人間の寿命はすごく長いように感じられて、なんだか妙な気分です。

ここにもまた古いものが新しいものを追い越すような現象が見られますね。