キャリア

【一点突破】1つのプログラミング言語で中級エンジニアになる方法

今回は1つのプログラミング言語のみでも初心者エンジニアを卒業できる方法を説明します。

この記事で話すこと
  • 1つの言語を集中して学習すべき理由
  • 得意言語を1つ身につけたら他の言語の学習ハードルが下がる

プログラミング言語はたくさんあります。

Webで使われているプログラミング言語であれば、Ruby、PHP、JavaScriptなどがそれにあたります。

たくさんあるからこそ、「この言語が得意!」といったものを持っていない状態で、

Ruby on Rails興味あるから勉強してみようっと。

とチュートリアルを一通りやった後、Ruby on Railsで自分のWebサービスを作らずに

PHPも興味あるから今度はPHPを勉強しようっと。

といった感じでチュートリアルを終わらせただけで満足してしまった経験は無いでしょうか?

そして、複数のプログラミング言語を習得ことがエンジニアとしての価値を上げると考えて、すぐに別の言語の勉強をした経験はないでしょうか?

実はぼくがそのように考えていた一人で、まさにこの罠にハマっていました^^;

コードに慣れてきたくらいに陥りやすい罠
  • とりあえず動くものは作れるけど、自分のコードに自信を持てない
  • 大きめのコードが書けない

複数の言語を勉強することは悪いことではなくむしろ色々な言語の強みや弱みを比較できるようになるため良いことなのですが、

ぼくはこの罠にハマっていたせいで、書けるプログラミング言語は複数あるけど、中級者の壁をしばらく乗り越えられていませんでした。

ここでは中級者の壁とは以下のように定義します。

中級者の壁
  • チュートリアルに書いてあることは出来るけど、フロントエンド・バックエンド技術を使って自分のアイデアを形に出来ない
  • 動くコードは書けるが綺麗なコードが書けないため、すぐにコードがごちゃごちゃになり管理ができなくなる。

この壁を乗り越えると下記の内容が実現出来ます。

  • どの言語でも汎用して使えるスキルが身につき、どの言語でも綺麗なコードが書けるようになる
  • 管理しやすいコードが書けるようになり大きめのコードが書けるようになる
  • 自分のアイデアを形にする力が身につく

1つの言語を集中して学習すべき理由

初心者の時点で1つのプログラミング言語が書けるようになった時点ですぐに他の言語の学習を始めてしまった場合、

あくまでもそのプログラミング言語の基礎の部分を学んだだけなので、まだ応用のスキルを身につけていない状態になります。

アイデアを形にするためには基礎スキルを組み合わせた応用スキルが必要

たとえば以下のようなサービスアイデアが思いついたとしましょう。

Twitterのような会員制投稿サービスを作る
  1. 特定のユーザーをブロックする機能
  2. 退会ユーザーのデータをデータベースに保持し続ける
  3. 一部のユーザーだけが見れるページを作る

実際にこれらの機能は会員制のサービスを作るときにはよく実装する機能です。

①の機能を実現するためには、「誰が誰をブロックしている」を表すデータベースのテーブルを作る必要があります。

②の機能を実現するためには、論理削除という概念を知る必要があります。

③の機能を実現するには、ユーザーの中でも「管理人」と「一般ユーザー」のようにユーザーには種類があることを理解する必要があります。

これらの機能をチュートリアルなどで学べたとしても、実際に自分のアイデアを形にする場合はチュートリアルの内容を完全にコピーするわけにはいきません。
完全にコピーするとはチュートリアルと全く同じものを作るという意味。)

また、チュートリアルでは「〇〇という名前のファイルを△△ディレクトリに作成して、□□ファイルから読み込んでください」などと親切に解説されてますが、

自分のサービスを作るときはこのようなことも自分で考えて解決していく必要があります。

この「自分のアイデア」を形にするという実践の中で発生するトライ&エラーを繰り返すことで、

「こういうエラーメッセージが出てきたときは〇〇が怪しい」といった経験値が溜まって応用スキルが身についていきます。

逆にこの経験をしないで、一通りチュートリアルを終えたり本を一通り勉強した後に、

エンジニアとしての価値をあげようと新しい言語の勉強を始めてしまうと、冒頭でも書いたように下記のような状態に陥ります。

コードに慣れてきたくらいに陥りやすい罠
  • とりあえず動くものは作れるけど、自分のコードに自信を持てない
  • 大きめのコードが書けない

例えば、英語を例にして考えてみましょう。

英単語文法・英文を書く勉強(=基礎スキル)は一通りしたけど英会話(=実践)はしなかった場合どんなことが考えられるでしょうか?

おそらくその人は英会話(=応用スキル)がしっかり身についていないためスラスラと会話は出来ないでしょう。

もう一つ自転車の乗り方を例にしても同じことが考えられます。

自転車に乗る理屈(バランスを保ちながら右足・左足を交互にこぐ)がわかっていたとしても、実際に乗って練習しないといつまでたってもうまく乗ることは出来ないはずです。

何度も自転車に乗る練習(=実践)を経験をして自転車に乗れるようになります。(=応用スキル)

プログラミングもこの理屈と同じまずは自分のアイデアを形にするという実践を経験を積むことでプログラミングで出来る幅を広げていきます。

1つの言語に集中すると応用スキルを身につけることに専念できる

さきほどのサービスアイデアの例をもう一度見てみましょう。

Twitterのような会員制投稿サービスを作る
  1. 特定のユーザーをブロックする機能
  2. 退会ユーザーのデータをデータベースに保持し続ける
  3. 一部のユーザーだけが見れるページを作る

何も知らない状態でこれらのことを学ぶだけでもハードルはだいぶ高いですが、その状態で新しい言語も学ぼうとするとマルチタスクになり脳に負担が強くかかります。

新しいことを学ぶ際は1つのことに専念したほうが効率的に学ぶことが出来ます。

上記の機能を実装することに専念して、使うプログラミング言語は既に自分が使い慣れているものを使うと、

苦労せずに自然とそのそのプログラミングスキルが高くなっていきいつの間にかその言語が得意になっていきます。

そうなると毎回グーグルで検索しなくても、「〇〇を実現するためにはこの関数を使えば良い」といったような状態になります。
英語でいうとスラスラと英語が話せる状態です。

新しい機能を実装するときだけでなく、新しいプログラミング言語を学ぶ以外で実践すべきことには以下のようなこともあります。

実践すべき応用スキル
  1. 綺麗なコードを書くためにはどうすればよいか学ぶ
  2. どれくらいの粒度でファイル分割をすべきか学ぶ
  3. テストコードの書き方を学ぶ

これらのいずれも重要であることは理解していたとしても、実際に使えるレベルになるためには何度も実践を重ねていくしかありません。

これらのスキルを身につけることによって下記のことが実現されて、自分のコードに自信を持つことが出来るようになります。

  • 綺麗なコードだから読みやすい
  • ファイルが分割が適切だから大きめのコードでも管理できる
  • テストコードによってコードが正しく動いていることを保証できる

得意言語を1つ身につけたら他の言語の学習ハードルが下がる

ステップアップ

プログラミング言語は1つ身につけてしまえば、2つ目以降のプログラミング言語の学習ハードは下がります。

その理由は下記のとおりです。

プログラミングの汎用的なスキル
  1. プログラムがやることはどの言語でも同じ
  2. どのプログラミング言語も文法は似ている
  3. 身につけたプログラミング言語の知識を使って調べることが出来る

プログラムがやることはどの言語でも同じ

プログラムがやることは「入力」→「処理」→「出力」だけです。

計算機を例にするとイメージが付きやすいと思います。

計算機の処理の流れ
  1. 計算したい数値を入力する(例: 1と2)
  2. 計算する(例: 足す)
  3. 計算結果が出力される(例: 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. 綺麗なコードを書くためにはどうすればよいか学ぶ
  2. どれくらいの粒度でファイル分割をすべきか学ぶ
  3. テストコードの書き方を学ぶ

これらを習得すれば扱えるプログラミング言語が現時点で1つだけだとしても、市場的には価値のあるエンジニアになります。

今回の記事が初心者エンジニア卒業のお役にたてたら幸いです。

【やる気満々な方向け】学習サポートとオンライン講義やってます!

Webエンジニアになりたい人向けに、MENTAにて『【やる気満々な方向け】未経験からのWebエンジニア育成コース』というプランを用意しております。

誰向けのプラン?

こちらのプランは次のような方に向けて作られています。

プラン対象者
  1. Progateやドットインストールで一通り学習したけど、次に何をすればよいかわからない
  2. Webエンジニアになるまでの学習プランがあると助かる
  3. 学習していてわからないところが出てきたときに質問したい
  4. コードレビューして欲しい
  5. オンライン講義に参加したい
  6. 学習した内容をアウトプットした際に、フィードバックがもらえたら嬉しい
  7. おすすめの学習教材を知りたい
  8. Webフロントエンド・バックエンドを学習したい
  9. フルスタックエンジニアになりたい
  10. 文系出身で今までプログラミングをしてこなかったけど、将来Webエンジニアになりたい
  11. 将来フリーランスになることを目指している

プラン内容は?

【やる気満々な方向け】未経験からのWebエンジニア育成コース』では次のことを行っております。

プラン内容
  1. Udemyの教材や、Web白熱教室の学習コンテンツを使った学習プランの提示 (学習プランに沿って学習を進めていただきます。)
  2. 教材・学習コンテンツの課題をこなしたあとは、僕にコードレビュー依頼を投げていただくことで、コードを添削する(課題クリア後は、引き続き学習プランの内容を続けていただきます。)
  3. プラン契約者が参加するSlackグループにて質問し放題
  4. Slack内にある「アウトプットの場」チャンネルにて、学習したことをアウトプットをしていただくことで、それに対しフィードバックをする (学習内容のアウトプットは復習にもなるため、アウトプットすることを強く推奨します。)
  5. 画面共有を使ったオンライン講義 (オンライン講義は録画して、いつでもふり返れるようにしています。(オンライン講義動画(ウェビナー動画)))
  6. 学習プラン以外の内容に対しての質疑応答 (内容によっては回答できないものもありますが、まずは気軽に質問していただけたらと思います。)

その他注意点

1人で対応していることもあるため、対応が難しくなった場合は急遽募集を終了する可能性もあることをご了承ください。

もしくは、僕以外にメンターを増やすことで募集を継続するということも考えているため、その場合は現在のプラン料金の値段を上げることなると思います。

仮にプラン料金を上げる場合は、『現在のプラン料金 × メンター人数』の料金になるかと思います。

現在の値段が5000円なので、1日1本ペットボトルジュースを買うのを我慢することで(約160円)、効率よく学習できるので費用対効果はかなり高いかなと自負しています。

また、今後メンターが増えて、プラン料金が10000円15000円と上がったとしても、月々の料金は申し込んだときの料金となるので、5000円のときに契約した場合はずっと5000円で受講することができます。

詳しく話を聞いてみたい方は

以下のいずれかでメッセージをいただけたらと思います^^

 

プラン内容については以下のリンク先からも確認することが出来ます^^

【やる気満々な方向け】未経験からのWebエンジニア育成コース

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です