これからプログラマを目指す方向け、プログラミングとは一体なにか、どうやって勉強するか
何かとゆえあって「フリーランス目指しているんです」といった人や「プログラミングやりたいんです」という人の話を聞くことがある。そういう人に対して、プログラミングって何なのかについて、私なりの解釈を書いておきたい。
どっちかというとポエム的で、技術的な話は一切ない。「そいつは違うよ!」というご意見もあるとは思うが、そういう場合はGitHubなりにissue立てるなりPR出すなり、Twitterでコンタクトを取るなりして欲しい。
本題に入る前より先に宣伝をしておく。この度MENTAに登録をしてみたので、プログラムについてなにか相談したいという人は利用してみて欲しい。
正直なところ、あまり利用されることはないだろうなと思っていて、本当に相談きたら私が逆にびっくりするかもしれない。ちょっとMentaの仕組みもよくわかっていない部分もあるので、スムーズにいかず迷惑をおかけするかもしれない。もしそうなったらごめんなさいと、先に謝っておく。
多分ページ的にはここであってるはず。もうこのあたりで使い方がよくわかっていないのが丸わかりである。
今の所値決めはかなり適当なので、そのうち値上げするかもしれないし値下げするかもしれない。トライアルはもうちょっと安くしてもいいかもなぁと思いはする。しかし、現状相談は受け付けるけれど、家庭の事情が忙しすぎて手が回らない部分があるので、値下げしてまで案件取りたくない。もしかしたらこれでも安すぎるかもしれない。
ともあれ、なにかあれば利用してもらえるとうれしい。ただ、私のの能力で解決できるかどうかは別問題なので、対応できないものは正直にお断りするのであしからず。
宣伝終わり。
プログラミングとは、あなたが解決したい問題をプログラムを利用してコンピュータを動かし問題を解決するためのものである。そんなのは当たり前じゃないかと思われるかもしれないが、ここは大事なところなのでもう少し噛み砕く。
まあこれは別に何でもいい。世界を平和にするとか壮大な問題としてみようか。ここで、定義が大事になる。世界とはどこからどこまでを意味するのか。平和にするとはどういう状態を平和とするのか。これをしっかり明確にしなければならない。これを要件定義とかいう。
この部分があやふやな案件には手を出してはならない。人間の時点で何をどうしていいかわからないからである。人間がどうしたらいいかわからないものを、融通の効かないコンピュータにどうやって処理させるのかという話になるので、そっと距離を置こう。
コンピュータには曖昧性がない。
たとえば学校の授業で、先生が教室に入ってきた。当番の生徒が「起立」という。人間ならばそのあたりの処理はどうとでもできる。
- そもそも最初から立ってる(授業前には席についとけよ)
- 椅子を後ろの人の机にがんと当たるくらいの勢いでとりあえず立つ(元気はいいが後ろの人は迷惑してるぞ)
- 椅子を引いてから横に出て椅子を机の下に戻してから立つ(お嬢様か)
- そもそもめんどくさいから中腰になって立ったように見せかける(不良か、でも立とうとするだけ真面目か)
- そもそも起立しない人
まあ人間ならいろいろだ。かけられた命令をそれぞれが解釈し、その後どう対応するかも人それぞれである。
しかしコンピュータはそうはいかない。かけられる命令は厳密でなければならない。曖昧な命令はコンピュータには理解できないのだ。つまり、コンピュータに命令を下すには厳密に命令する必要がある。そして、コンピュータはその厳密な命令を律儀に守り、命令されたとおりにしか動かない。
「この命令はたぶんこういうことを意味しているから、こういう結果を返してあげたらいいんじゃないかな」とかそんなことは絶対にしない。なんだその超高性能AIはという話である。
さて順番が前後したが、ここで出てくるのがプログラミングである。
つまり人間が解決したい問題を、コンピュータが処理できる形に書き換える作業、それがプログラミングである。
人間の解決したい課題は曖昧である。だからこれをコンピュータで解決できる形に変換してやる必要がある。このあたりは設計とか企画の段階の話だろう。それが済めば、あとはコンピュータに忠実に命令を実行してもらうべく、プログラミングを行うわけである。
プログラミング言語は世に数多くある。Java、JavaScript、Python、Ruby、Goなどなど。正直書ききれない。いろんな言語がある。
その中で、これまたよく聞く話が「どれを勉強したらいいですか」という質問である。これもよく目にする。その答えは人それぞれである。回答者の好きな言語を答える人もいる、市場でよく利用されている言語を推す人もいる。つまりこの部分に明確な正解は存在しない。
そこで思い出していただきたいのは前段である。プログラミングとはなにか。
あなたが解決したい問題を、コンピュータで解決できるようにして、その橋渡しをするのがプログラミング言語である。
そこで大事になってくるのは「あなたは何がしたいのか」になるのだ。私の場合でいうと、Androidアプリが作りたかった。だからJavaで今はKotlinになっている。
プログラミング言語にはそれぞれ特色があって、得意・不得意な分野があったりする。それはプログラミング言語だけではなく、周辺のライブラリやパッケージを含めての話になるが。例えば機械学習=Pythonみたいな図式はある。だから、あなたがやりたいことにあわせて、それに合う言語をまずは選ぶといい。
そしてこれまたよく目にするのが「就職に有利な言語はなんですか?」という質問である。そういうのはエージェントにでも登録して聞いたらいいんじゃないかと思う。少なくとも私ではわからない。なんちゃってフリーランスで活動している私には、市場でどのようなプログラミング言語がもっとも必要とされているのかなど知らない。
そんな言語のことを気にするくらいなら、コンピュータサイエンスなり数学なりアルゴリズムなりを勉強するのがもっとも有効だと思う。今作りたいものがない、だけどプログラミングやりたいというのならば、プログラミング言語よりも前の段階の、コンピュータの基礎を勉強すべきである。ちなみに即効性はまったくないので、今すぐ就職してお金を稼がないといけないんですという人には向かない。でも、このあたりの知識は、プログラマとして活躍するようになってくると勉強してこなかったことを後悔する分野である。そこは覚えておいほしい。
プログラミング言語は数多くある。言語ごとに得意なこと、不得手なことがあったりする。利用者の数の多さもわりと大事で、マイナー言語を選ぶと問題にぶち当たったときに検索しても解法が見つからない=自力で解決しなければならないこともある。
ただ言えるのは、どの言語を学ぼうとも何かしら得るものはある。どんな言語でも基礎的な部分は大体同じなのだ。細かい文法が違ったりするが、その中で使われるアルゴリズムなんかはどんな言語でも応用が効く。
大体の言語でifによる条件分岐はあるし、細かい文法は違うがループ処理があるし、変数を使ったり関数を使ったりするところは、どんな言語でも同じ。
私は最近いろいろな言語に中途半端に手を出しているが、1つの言語を極めるのもいいけれど、複数の言語を触ってみるのもまたいいと思う。Kotlinをやっていて思うのが、他の言語の学習しているときに「ああ、Kotlinでいうところのあれか」みたいな理解の仕方ができるのである1。
とりあえず気が向いたものを勉強するのもよし、学習しやすい言語をやるのもよし。うだうだ悩む前にとりあえずなにかやってみるのがいい。それでも何やればいいですかなんて聞く人には、もうとりあえずJavaScriptでもやっとけばいいんじゃないのと答えておこう。ただ厳しいようだが、そうやって答えを求める人にプログラミングは向かないのではないかと私は思う。
プログラミングを学習するためには2つのアプローチがある。つまり、あたなた解決したい問題を、コンピュータが解ける形に分解していく方向からのアプローチ。そしてももう1つが、コンピュータは一体どういう問題なら解決できるのか、コンピュータができることを知っていくという2つのアプローチがある。
そしてプログラミングを学ぶ上では、この両方が大切である。とはいえ、まずはコンピュータで何ができるかを知ることから始めることが多いだろう。
そしてコンピュータが何ができるかについては、このような疑問を持つくらいだから、パソコンは持っていると思っていいのだろう。ならばネットで調べれば良い。
世の中には無料でプログラミングについて教えてくれるサイトが山のようにある。日本語だと少ないかもしれないが、英語まで広げると本当にいろいろある。まあ英語がわからないと利用できないし、英語を理解する方に時間が取られてプログラミングの勉強どころではなかったりするかもしれないけれど。
まずは無料でできるプログラミング学習コンテンツを利用してみるべきだろう。その前に、どの言語を勉強するかくらいは決めておいたほうがいいと思うけれど。これは、さっきも書いたけど、あなたが何をしたいかによるので、そこはまず考えておこう。
無料でプログラミングを学習できるコンテンツは探せばいくらでもあるだろうからここでは紹介しない。ただ、まずは無料でできる範囲でやりたまえ。いきなりプログラミング学習塾とかに高いお金を払っていくのはおすすめしない。
学習塾がクソだからという理由ではない。きっといい学習塾だってある。だが、あなたがプログラミングに向いているのか、プログラミングをやっていけるのかをわからない段階で、いきなり高いお金を払って学習を始めるのはリスクが高すぎると私は思うのだ。
世には無料で利用できるコンテンツがある。まずはスモールスタートでそういうところからはじめてみたらどうだろうか。あなたの家の近くには図書館があるだろう。図書館を利用したまえ。プログラミングの本、古いかもしれないけれどそういう本を利用して学習してみるといい。
それが無理なら本を買って勉強してみるといい。いきなり学習塾に申し込むよりは安く始められるはずだ。そして、そうやって自ら勉強しようとする姿勢がないと、学習塾に通っても効果は得られないと思う。自ら学ぶ姿勢が大事なのだから。
プログラミングを学ぶ上で、大切なのは正解にこだわらないことである。
おまじない的に「とにかくこのように書きなさい」というお作法的な部分はある。そこは守ってほしい。ただ、プログラミングにおいて解き方はいろんな方法が存在するのである。
たとえばFizzBazz問題という、初心者がやるのに有名なプログラミング問題がある。3で割り切れる数字はFizz、5で割り切れる数字はBazz、3と5両方で割り切れる数字はFizzBazz、それ以外の数字は数字をそのまま出力するという問題だ。たしかそんな感じの問題だったはず。
この解法はネットで調べればすぐに見つかる。そしてその解法のバラエティ豊かなことにすぐに気がつくだろう。単なるifの条件分岐で解くのが一般的だろうが、そうではない、まるで意味のわからないコードで解決しているものもある。ここで大事なのは、プログラミングにおいて正解は1つではないということだ。
ただその中に、効率的な解法だったり人間に読みやすい解法だったりがあるだけである。これにはどっちが正しいとかはなく、最終的にぶっちゃけてしまうと、仕様どおりに動けば何でもいいのだ2。
特にプログラミング学習をしているときは、どう書くのが正解なのか不安でたまらなくなる。これは私の経験談である。
私はどう書くのが正解なのか分からず、うだうだ迷い続けた挙げ句、学習が進まずムダに時間を浪費してしまった。そんなことならたとえ汚くても動くコードをどんどん作っていけばよかったと思っている。これに関しては変な癖がつくからよくないという意見もありえるだろう。それももっともなので、ここは参考程度に聞いて欲しい。
ただ私は、プログラミング学習初心者に対しては、正解を気にして前に進めなくなるよりはとにかく動くコードをどんどん書いていってほしいと思う。
プログラミングに限らず、えてして唯一絶対の正解など存在しないのだ。色んな意見があるのだから、「あの人はこう言っていたけど、この人はこう言っている、どっちが正しいんだ」となることだってあるだろう。その答えは、どっちも正しい、ただ背景や見方・意見が異なるだけという場合が多いのだ。だからあなたは「そんなもんか」と参考程度に受け取って先に進めばよいのである。
学習を進めていくと何をどうやってもうまくいかない場面に出くわすだろう。私もよく出くわす。
そんなときは、全く別のことをするのがよい。好きな音楽を聞くなりゲームをするなり、気分転換をすべきだ。イライラしながら学習を続けてもいいことにならない。それに、別のことをしているときにふと「ああやれば解決するじゃん」と解法をひらめくこともある。だから、にっちもさっちも行かなくなったら休憩するのがいい。
基本的にはプログラミングのエラーは、どこにエラーがあるのか、なにがまずいのかがエラーメッセージという形で表示される。英語で読めませんとかじゃなくて、まずは読む努力をしよう。初心者はそこからがんばろう。
エラーメッセージを読んだら、とりあえずそれをコピペしてぐぐるのだ。同じようなエラーメッセージを検索して、すると「こうやったら解決しました」なんていう情報に出会えるかもしれないし、解決の糸口が見つかるかもしれない。次はこれをやってみよう。
それでもどうしても自力で解決できないときは、誰かに聞くしかない。質問サイト使うなり、知り合いに聞くなりして、誰か他の人を頼ろう。
ただこの時点で忘れてはいけないのは、聞かれる相手はエスパーではないということだ。あなたが、これまでどういうことをやっていて、何をやろうとして、どういう方法をとって、その結果うまくいっていないなんてことはあなたがすべて説明しなければ相手にはわからないのである3。
間違っても「XXをやろうとしてエラーが出ました、どうしたらいいですか」なんて聞いてはいけない。そういう聞き方をしても答えてくれる仏のような人もいる。だが、その回答に相手の時間をムダに使わせていることを自覚したほうがいい。そんな質問の仕方をオンラインのQAサイトでやったら、放置されるのが関の山である。
そういう聞き方しかできないのに回答が欲しいのであれば、高いお金払ってスクールにでも通いたまえ。しかしスクールに通ったとしても、そのような質問の仕方しかできないのであればこの先通用しないことを肝に銘じておこう。そもそも質問の仕方まで懇切丁寧に教えてくれるスクールがあるかはわからないし。
質問の仕方についていいことが書いてある記事があるのでリンクしておく。
https://qiita.com/seki_uk/items/4001423b3cd3db0dada7
- 自分の環境はどんな環境か(使っているOS、言語のバージョン、ライブラリのバージョンなど)
- 自分がやりたいことはなにか
- 自分がやったことはなにか
- 何がうまくいかないのか
- どんなエラーメッセージが表示されているのか
そういった情報を書いた上で質問を行うべきだ。まあ毎回長ったらしく全部説明する必要はないけれど、省略すればするほど相手の時間を無駄にするし、解決に必要な情報が欠落していく。これは相手の回答しようという気持ちを削ぐ結果になることは覚えておいたほうがいい。
ちなみに偉そうなことを書いているが、私もできていないことがある。だからこれは自戒も込めている。
そんなのまるでわかんねえよという人は、何度もいうが高い金を払ってスクールに行くといい。ただスクールに通ってもこのあたりをまったく教えてくれないところもあるので、期待しすぎないほうがいいとは思う。
ただ、間違っても質問することに恐怖感を持ってほしくない。そこは履き違えないで欲しい。私は質問するなとは言っていない。難しいかもしれないけれど、質問する際にあなたも努力してみてよと言っているだけである。
初心者なのであれば、自分が初学者であることを含めて自分の背景をしっかり説明するべきなのだ。そのうえで、よく意味がわからないんですけどこういうエラーが出ました。私は勉強を始めたばかりで何をどう調べたらいいかすらわからず途方にくれています。何かヒントでもいいので教えていただけないでしょうかと。
あなたも質問をするのに力を使うべきなのである。うまく行かなくて落ち込んでたりイライラしてたりするだろうけれど、それでも冷静になって自分のぶち当たっている問題について書いてみるのである。たとえ無駄な情報で溢れていようと、あなたがなんとかがんばって問題を解決しようとしている姿勢はきっと相手には伝わる。それならばと、手を差し伸べてくれる人もきっと出てくるはずだ。少なくとも私は助けてあげようと思う、答えられるかどうかは別問題だけれど。
質問するなら最初のうちは書きすぎる・説明しすぎるくらいがちょうどいいのである。
プログラミング開発、プログラミング勉強に関して思っていることをつらつらと書き連ねてみた。たぶん、そいつは違うよっていう反対意見もあると思う。なんせ私は一人でプログラミングを学習してやってきて今に至るのだから。それでいて大したものは作れていない底辺の存在である。どこの馬の骨ともわからんやつがなんか言っている程度に思ってもらえばいい。
そして何かこの記事で気になるところや、もうちょっと話を聞いてみたいなと思った人は、Mentaで相談してみて欲しい。
と最後に宣伝しておく。
地方在住の名ばかりフリーランスなので、あまり力になれないかもしれないが、迷える子羊がいたらコンタクトを取ってみて欲しい。私にできる範囲のことで力になりたいと思う。
そしてこの記事に対しての異論や間違いの指摘は、GitHubやTwitterで随時受け付けているので、先輩方には厳しく指摘してもらえるとありがたい。