田舎で並行処理の夢を見る

試したこと、需要がないかもしれないけど細々とアウトプットしてます

はじめてのプログラミング言語習得のコツ。挫折しないためにはどう学ぶべきかを現役エンジニアが考察する

この記事を書く理由

個人的にElixirというプログラミング言語の勉強会を主催したり、セミナーに登壇する中で多くのプログラミングの初学者や、現在、学習をしているが、何をしていいのか分からないなど多くの相談を受けた。毎度、回答する中で「参考になりました」と良い反応をもらうことが多くなってきたので、せっかくなので記事にして多くの方に情報を共有できればと思う

  • 挫折を防ぐため
  • 効率的にプログラミング学習を進めるため
  • 楽しくプログラミングの学習を続けるため etc...

にぜひ参考にして頂ければと思います

想定している読者

この中で1つでも自身に当てはまるものがあれば、この記事を読んでいただく価値はあるかと思います

  • これから新たにプログラミングを始めたい
  • プログラミングの学習は何からやっていいのか分からない
  • プログラミングの学習をしているがどこまで学習すればいいのか分からない
  • どのプログラミング言語を選べばいいのか分からない
  • 過去にプログラミングに挑戦したが挫折したことがある

著者について

twitter.com

OKB(岡部)と言います。今年度から新卒として名古屋のITベンチャーでエンジニアをしています。学部生の頃は土木と建築を学んでおり、挫折の結果、独学でプログラミング学習をして今に至ります。情報系の学部の出身ではないため、いわゆる未経験という状態からのスタートをしました。プログラミング自体は始めて2年未満になります
業務ではWebアプリケーション開発のバックエンド、機械学習案件の取り回し(まれに実装)に携わっています。経験言語は以下の通りです

ほかに気休め程度に触っているものもありますが、今のベースになっているのはこのあたりです。とは言いつつも、私自身、過去に一度、プログラミング学習に挫折をしたことがあります。「猫でもわかるC言語」という著書があるのですが、全く分かりませんでした。なので挫折した面と、それでも業務にありつけたという面の両面を知っているからからこそ見えてくる視点があると思っています

これから記述することは格闘技と同じように流派があり、必ずしも正解ではありません。私の考えであって世間の考えではありません。しかしながら、先ほど書いた通り、「挫折」と「業務にありつけた」という両面を知っているからこそ自信を持って、この情報を共有します

それでは順に説明をしていきます

プログラムを書くという意味を見失わないで

f:id:takamizawa46:20191208014733p:plain
あなたはなぜプログラミングを学習しようと思うのか、またしているのか。今、世間ではエンジニアになるというのが一種のブームになっている。自由な時間に勤務でき、高額な報酬が手に入る。そんなイメージだけが一人歩きしてしまっており、プログラミングを始める人の頭にあるのは上記のような理想ばかりだ
それを悪いことだとは思わないし、私自身も同じような理由でプログラミングを始めた。誰だって楽して儲けたいものだ。Pythonってのを覚えたら年収が増えるんか!!!」という学生の浅知恵で始めただけのことである。しかしながら、その思いだけでこの長く辛い、独学の道を走り続けるのは難しい

「なぜ挫折するのか?」

答えはシンプルで、お金儲けが目的になって、プログラムを書くという意味を無視して通り過ぎているからだ
プログラミングの根本にある考え方は「自動化・効率化・高速化」のような人間の惰性の解決である。同じような計算処理を何度も繰り返すのが面倒臭い、毎日、水を汲んで温めるのが面倒臭い...など

プログラムを書いてお金を貰うということは自身の、もしくは誰かの面倒ごとをプログラムを書くことで効率化した、自動化したという結果ということになる。プログラマーになりたいだけという考えは止めよう。きっと続かない


まとめ

【プログラムを書くことを楽しもう】
面倒ごとをどのようにプログラミングという方法で自動化、高速化、効率化するという所にプログラミングの面白さがある

ほとんどのプログラミング言語の習得の進め方は同じ

楽しくプログラミングをするためには「プログラミング言語の習得」は欠かせない。しかし、このステップで挫折をしてしまう人が多く非常にもったいない。向き不向きはあるが、興味を持っただけに悲しい結果となってしまった

人間誰しも1つは言語を習得して日々、話しては聞き、使いこなしているのになぜプログラミング言語の習得に挫折するのか
それは「自動化、高速化、効率化」するために、なぜプログラミングが必要なのかを理解していないからだと言える

実際にプログラムを書いて、入荷した100個の果物(りんごとオレンジ)を仕分けるプログラムを書くことになったとする。さて何から始めるか。ざっくり作業の流れを書き出してみると以下のようになるだろう

  • 箱から果物を1つ取り出す
  • 取り出した果物がりんごなのかオレンジなのかを判定する
  • りんごであればりんご用の箱に。オレンジであればオレンジ用の箱に
  • まだ箱に果物が残っていればこの作業を繰り返す。もう無ければ終了する

別になんら難しくない作業の流れだと思う。このようにプログラムを書く際には処理の流れを書き出すことが重要であるが、今重要なのはそこではない。この作業の流れに登場する処理は3つだけであり、基本的にはどの言語でも3つの処理が用意、もしくは記述可能であるということだ

ではその3つの処理とは何なのか。凄くシンプルだ  

  • 変数の宣言(値を用意する)
  • 繰り返し(同じ処理を何度も行う)
  • 条件分岐(条件によって行う処理を変える)

たったこれだけだ。作業の効率を無視すれば、どのような処理も上記3つの処理を組み合わせれば記述することが可能になる。まずは各言語に用意された上記3つの構文を覚えることがスタートだ。逆に言えば、3つの処理の書き方を知っていればほとんどの処理は記述することが可能になっているはずだ
それにプログラミングという作業をめちゃくちゃ抽象化してしまえば、データをAという状態からBという状態に変化させているだけだ。先ほどの3つの処理を用いて説明をすれば、変数(用意した値)を繰り返し処理や条件分岐を使って、別の状態にするという訳になる

しかしながら、手が動かないという場合はプログラミング言語の知識の他にOSネットワークの知識が不足している可能性がある。安心しよう。プログラミング言語を習得出来ていないからではない

配列オブジェクトマップなどのデータ構造やその他の構文は必要になった時、処理が面倒だと思った時に「こんなものが用意されているんだ」という流れで覚えた方が使用すべきケースも分かるし、理解も深まる

例えば「配列を覚えるタイミング」は変数の宣言を10個、100個...もしなくてはいけないようになった時。どう考えても面倒だし、効率化するためにプログラムを書いてるのに全く効率化されていない。そこで配列というものが登場する。配列を用意すれば1つの変数(配列)に100個の値を格納することが出来る

このように「あれ、効率化されてない?」と思ったタイミングが新たな学びのタイミングになる

まとめ

プログラミング言語で最も基本的な構文を覚える】
- 変数の宣言
- 繰り返し
- 条件分岐

どのプログラミング言語を学ぶべきか

最初のプログラミング言語を何にするかは、常に現役のエンジニア間でも議論が行われている

  • コンピューターサイエンスを学ぶために
  • 楽しくプログラムを書くため
  • お金儲けが出来る言語を選ぶべき

色々な考え方があるため、確定的な答えを出すことが難しいが、私はプログラムの根本にある「自動化、高速化、効率化」が達成できるものなら何でもいいと思っている。その一方で最初の言語は、やはり楽しくシンプルに学ぶことができるものを選んだ方が良い
初学者の状態で「メモリ管理」だの「変数のスコープ」だの、「静的型付け」だということを考えて覚える時間を費やすよりも、シンプルな構文と処理を覚えて実際にプログラムを書く時間を用意した方が良い

オススメはPythonRubyのどちらかだ
Pythonは構文がシンプルで覚えやすい。また、コミュニティも活発で分からないことがあっても調べたら何となる可能性も高い。また、Webに機械学習にと採用される範囲が広く書けて損はないだろう
Rubyも同様に構文がシンプルで覚えやすい。Rubyの一番の強みはやはり、日本産(まつもとゆきひろ先生)であり、豊富な日本語情報が用意されているという点にある。それにRuby on railsという強力なWebフレームワークがあり、Web業界の仕事に繋がりやすい

この2つの言語、もしくは他の言語に触ったのちに「プログラミングってどうやって動いているんだろう」とか「なぜ、配列というデータが扱えるのだろう」とか「なぜPythonは処理が遅いと言われているんだろう」という話に興味を持ち始めた時、それからC言語などを始めてみれば良い。ありがたさが分かるのはそれからで良い。まずは書いて楽しむことが重要だ


まとめ

【最初の言語のオススメ】
PythonRubyが良い。まずはシンプルな構文を覚えて実際にプログラムを書いてみよう。難しい話に触れるのはその後で十分だろう

プログラミング言語の学習は書籍でサクッとやればいい。最初の一冊は1週間あれば、全てに目が通せるようなもの(P200ぐらい)の物がオススメ。いきなり、難しい書籍を対象に選んで、途中で挫折するのが典型的な残念パターンだ

Rubyに関しては良書を知らないので、省略するが、Pythonの学習にはサクッと読める「スラスラ読めるPythonふりがなプログラミング」がオススメだ。初学者の高校時代の部活の後輩に読んでもらったが、非常に分かり易かったと高評価を頂けた

どんなレベルの情報でも良いのでアウトプットしよう

これからエンジニアとしてやっていこうと考えているのならば、アウトプットをする癖をつけておくと良い。なぜアウトプットをする必要があるのかをRubyの作者のまつもとゆきひろ先生がこう答えている

インプットは必要、でも差別化要因にならない
しかし、アウトプットすることで差別化になる

アウトプット、ブログの記事にしたりという作業は面倒臭いし、100%お金が貰えるというわけではない。ではなぜ、アウトプットをするのか。エンジニア視点では2つ理由があると考えている
1つはアウトプットすることで自分の学習になるからで、学習した内容をブログ記事にまとめようとすると半端な知識では不可能だ。順序よく理解している必要がある。それに言語化してまとめることで自分の再学習にもなる。そうすると簡単には忘れなくなる
もう1つは世間に自分の存在を知ってもらうことが出来るからだ。アウトプットしないエンジニアは世間からすれば、無名の選手と変わらない。どんなレベルの情報であれ、アウトプットをしているということはGoogle検索に自分の情報が現れるということになる。また、アウトプットした情報はそのままポートフォリになる上に、どういった事柄に興味があるかという証明書にもなる

これだけのメリットがありながらアウトプットを実行しているエンジニアは少ないのだ
私がアウトプットをこのブログでし続けて得られたものは非常に多い。ぜひ、興味があればこちらの記事で詳しい話をしているので、一度目を通して見て頂ければと思う

www.okb-shelf.work

反応を貰える状態を作る

結局、ブログにしろyoutubeにしろ続かない理由は凄くシンプルで反応がもらえないから、もしくは報酬が発生しないからのどちらかになる。例を挙げてみると、「誰も食べもしない料理を作り続ける(反応がもらえない)」、「無賃できつい仕事を続ける(報酬が発生しない)」というイメージだろうか

この状態を抜け出すために何かしらの工夫をすると良い。プログラミングのコミュニティに所属してみるのも良いし、ハッカソンに出場してみるのも良い。プログラミングのアルバイトを初めてみるのも良い戦略だ

独学する上で大切なのは「続けられる仕組みを作ること」だと考えている。何を選ぶかはあなた次第だが、決まった期間にやり切りたいというのであれば、プログラミングスクールに通ってみるというのも手だ。しかしながら、決して安い額ではないのでスクールの評判や得られるものは慎重に選んだ方が良い

最終的に伝えたいこと

長々と自分の考えを記述してきた。ここまで読んで頂いた方には感謝しかありません。現在、エンジニアになるということが一種のブームのようになり、悪質な情報や、デマカセが多く、多くの初学者を混乱させる原因となっている。しかしながら、プログラミングの根底にあるのは今回の記事で紹介したような内容であり、楽しいものだと伝われば嬉しい

twitterのDMなどでも相談を受けているので気軽に相談してもらっても問題ない
学習の際の参考に少しでもなればと思います

参考文献