今回は1つのプログラミング言語のみでも初心者エンジニアを卒業できる方法を説明します。
- 1つの言語を集中して学習すべき理由
- 得意言語を1つ身につけたら他の言語の学習ハードルが下がる
プログラミング言語はたくさんあります。
Webで使われているプログラミング言語であれば、Ruby、PHP、JavaScriptなどがそれにあたります。
たくさんあるからこそ、「この言語が得意!」といったものを持っていない状態で、
Ruby on Rails興味あるから勉強してみようっと。
とチュートリアルを一通りやった後、Ruby on Railsで自分のWebサービスを作らずに
PHPも興味あるから今度はPHPを勉強しようっと。
といった感じでチュートリアルを終わらせただけで満足してしまった経験は無いでしょうか?
そして、複数のプログラミング言語を習得することがエンジニアとしての価値を上げると考えて、すぐに別の言語の勉強をした経験はないでしょうか?
実はぼくがそのように考えていた一人で、まさにこの罠にハマっていました^^;
- とりあえず動くものは作れるけど、自分のコードに自信を持てない
- 大きめのコードが書けない
複数の言語を勉強することは悪いことではなくむしろ色々な言語の強みや弱みを比較できるようになるため良いことなのですが、
ぼくはこの罠にハマっていたせいで、書けるプログラミング言語は複数あるけど、中級者の壁をしばらく乗り越えられていませんでした。
ここでは中級者の壁とは以下のように定義します。
- チュートリアルに書いてあることは出来るけど、フロントエンド・バックエンド技術を使って自分のアイデアを形に出来ない
- 動くコードは書けるが綺麗なコードが書けないため、すぐにコードがごちゃごちゃになり管理ができなくなる。
この壁を乗り越えると下記の内容が実現出来ます。
- どの言語でも汎用して使えるスキルが身につき、どの言語でも綺麗なコードが書けるようになる
- 管理しやすいコードが書けるようになり大きめのコードが書けるようになる
- 自分のアイデアを形にする力が身につく
目次
1つの言語を集中して学習すべき理由
初心者の時点で1つのプログラミング言語が書けるようになった時点ですぐに他の言語の学習を始めてしまった場合、
あくまでもそのプログラミング言語の基礎の部分を学んだだけなので、まだ応用のスキルを身につけていない状態になります。
アイデアを形にするためには基礎スキルを組み合わせた応用スキルが必要
たとえば以下のようなサービスアイデアが思いついたとしましょう。
- 特定のユーザーをブロックする機能
- 退会ユーザーのデータをデータベースに保持し続ける
- 一部のユーザーだけが見れるページを作る
実際にこれらの機能は会員制のサービスを作るときにはよく実装する機能です。
①の機能を実現するためには、「誰が誰をブロックしている」を表すデータベースのテーブルを作る必要があります。
②の機能を実現するためには、論理削除という概念を知る必要があります。
③の機能を実現するには、ユーザーの中でも「管理人」と「一般ユーザー」のようにユーザーには種類があることを理解する必要があります。
これらの機能をチュートリアルなどで学べたとしても、実際に自分のアイデアを形にする場合はチュートリアルの内容を完全にコピーするわけにはいきません。
(完全にコピーするとはチュートリアルと全く同じものを作るという意味。)
また、チュートリアルでは「〇〇という名前のファイルを△△ディレクトリに作成して、□□ファイルから読み込んでください」などと親切に解説されてますが、
自分のサービスを作るときはこのようなことも自分で考えて解決していく必要があります。
この「自分のアイデア」を形にするという実践の中で発生するトライ&エラーを繰り返すことで、
「こういうエラーメッセージが出てきたときは〇〇が怪しい」といった経験値が溜まって応用スキルが身についていきます。
逆にこの経験をしないで、一通りチュートリアルを終えたり本を一通り勉強した後に、
エンジニアとしての価値をあげようと新しい言語の勉強を始めてしまうと、冒頭でも書いたように下記のような状態に陥ります。
- とりあえず動くものは作れるけど、自分のコードに自信を持てない
- 大きめのコードが書けない
例えば、英語を例にして考えてみましょう。
英単語・文法・英文を書く勉強(=基礎スキル)は一通りしたけど英会話(=実践)はしなかった場合どんなことが考えられるでしょうか?
おそらくその人は英会話(=応用スキル)がしっかり身についていないためスラスラと会話は出来ないでしょう。
もう一つ自転車の乗り方を例にしても同じことが考えられます。
自転車に乗る理屈(バランスを保ちながら右足・左足を交互にこぐ)がわかっていたとしても、実際に乗って練習しないといつまでたってもうまく乗ることは出来ないはずです。
何度も自転車に乗る練習(=実践)を経験をして自転車に乗れるようになります。(=応用スキル)
プログラミングもこの理屈と同じまずは自分のアイデアを形にするという実践を経験を積むことでプログラミングで出来る幅を広げていきます。
1つの言語に集中すると応用スキルを身につけることに専念できる
さきほどのサービスアイデアの例をもう一度見てみましょう。
- 特定のユーザーをブロックする機能
- 退会ユーザーのデータをデータベースに保持し続ける
- 一部のユーザーだけが見れるページを作る
何も知らない状態でこれらのことを学ぶだけでもハードルはだいぶ高いですが、その状態で新しい言語も学ぼうとするとマルチタスクになり脳に負担が強くかかります。
新しいことを学ぶ際は1つのことに専念したほうが効率的に学ぶことが出来ます。
上記の機能を実装することに専念して、使うプログラミング言語は既に自分が使い慣れているものを使うと、
苦労せずに自然とそのそのプログラミングスキルが高くなっていきいつの間にかその言語が得意になっていきます。
そうなると毎回グーグルで検索しなくても、「〇〇を実現するためにはこの関数を使えば良い」といったような状態になります。
英語でいうとスラスラと英語が話せる状態です。
新しい機能を実装するときだけでなく、新しいプログラミング言語を学ぶ以外で実践すべきことには以下のようなこともあります。
- 綺麗なコードを書くためにはどうすればよいか学ぶ
- どれくらいの粒度でファイル分割をすべきか学ぶ
- テストコードの書き方を学ぶ
これらのいずれも重要であることは理解していたとしても、実際に使えるレベルになるためには何度も実践を重ねていくしかありません。
これらのスキルを身につけることによって下記のことが実現されて、自分のコードに自信を持つことが出来るようになります。
- 綺麗なコードだから読みやすい
- ファイルが分割が適切だから大きめのコードでも管理できる
- テストコードによってコードが正しく動いていることを保証できる
得意言語を1つ身につけたら他の言語の学習ハードルが下がる
プログラミング言語は1つ身につけてしまえば、2つ目以降のプログラミング言語の学習ハードは下がります。
その理由は下記のとおりです。
- プログラムがやることはどの言語でも同じ
- どのプログラミング言語も文法は似ている
- 身につけたプログラミング言語の知識を使って調べることが出来る
プログラムがやることはどの言語でも同じ
プログラムがやることは「入力」→「処理」→「出力」だけです。
計算機を例にするとイメージが付きやすいと思います。
- 計算したい数値を入力する(例: 1と2)
- 計算する(例: 足す)
- 計算結果が出力される(例: 1+2=3)
プログラミング言語ごとに文法に違いはありますが、どの言語もやっていることはこの3つのプロセスになるので、
1つプログラミング言語を身につけていれば、同じようにどんな処理を行うかの実装をするだけです。
どのプログラミング言語も文法は似ている
プログラミング言語によって、関数の定義方法や使われている単語に多少違いはありますが、同じ単語が使われているものも多いです。
- 関数・・・ function, def
- 条件分岐・・・ if, else, else if
- ループ・・・for,
- クラス定義・・・class
身につけたプログラミング言語の知識を使って調べることが出来る
「どのプログラミング言語も文法は似ている」でほとんどの言語で同じような単語を使っていると話しましたが、同じ関数の定義でも異なる単語を使っている言語もあります。
例えばJavaScriptで関数を定義するときは「function」という単語を使いますが、Rubyになると関数の定義には「def ~ end」という単語を使います。
このように全く違う単語を使っている場合でも、既に1つ言語を身につけていればわからないことが出てきた場合も比較的かんたんに問題は解決されます。
もしJavaScriptをすでに習得していて、Rubyで関数を定義方法を知りたい場合は
- 「function 定義 ruby」
- 「関数 定義 ruby」
のように、「既にもっている知識 + ruby」のように検索すれば良いのです。
まとめ
チュートリアルを一通り終わらして1つの言語を身につけた後すぐに別の言語の勉強をするのではなく、以下を実践することで初心者エンジニアを卒業することが出来ます。
- 身につけた言語を使って実際にサービスを作ってみる
- どの言語でも使う汎用的なスキルを身につける
汎用的なスキルとは何かもう一度見てみましょう。
- 綺麗なコードを書くためにはどうすればよいか学ぶ
- どれくらいの粒度でファイル分割をすべきか学ぶ
- テストコードの書き方を学ぶ
これらを習得すれば扱えるプログラミング言語が現時点で1つだけだとしても、市場的には価値のあるエンジニアになります。
今回の記事が初心者エンジニア卒業のお役にたてたら幸いです。