はじめに
訪問ありがとうございます。
本記事では新人プログラマ応援として、ささやかながら私が実践したプログラム学習方法を書きたいとおもいます。
また本記事を見て、「こんな勉強方法があるよ」という方はコメントかリンクを繋げてもらえると幸いです。
想定読者
プログラミング未経験の人
プログラムを学ぼうと思っている人
webエンジニア、プログラマへの転職を考えている人
プログラミングが好きな人
違うプログラミング言語を学ぼうとしている人
私について
京都で宿泊業に携わっていたが、28歳の3月にプログラムを書くことを仕事にすると決める。
7月に東京に引っ越し、アルバイトのマークアップエンジニアからキャリアスタート。
今はエンジニア歴としては一年半ほどで、フロントエンドエンジニアしてます。
転職の際には本記事の実践内容を評価して頂くことができました。
##学習に使っているサイト
CodeWars
使い方参考リンク
【Codewars】ブラウザでコーディングの基礎からトレーニングできるサイト (ブラウザでvimが使えて32種類のプログラミング言語に対応。4000個以上の問題が投稿されています!)
Codewarsとはプログラム問題が投稿されているSNSサイトです。
大きな特徴として多くのプログラミング言語に対応していること、難易度別の出題と解答後に他の人のプログラムを見られることが挙げられます。
プログラムの問題が提供されているサイトは他にもありますので、そちらを使われても大丈夫です。
実践方法
実践方法の流れは大まかに下記になります。
1 問題を解く
2 他の人の解答と自分のコードを比較する
3 解いた問題をQiitaに投稿する
4 別の問題へ
この流れを詳しく記述していきます。
1 問題を解く
問題を解く際、問題を分解して捉えるようにします。
例えば下記のような問題があります。
題
与えられた文字の母音(a i u e o)の数をかえしてください。
*ここで与えられる文字はスペースを含むアルファベットを指します。
*正規表現、使用不可(簡単すぎるので)
この問題を解く際に、
- 文字が母音かどうかの判定が必要
- 文字をひとつずつに分割することが必要
- 母音に該当した文字があった際に増えるカウントが必要
- 対象はアルファベットに絞られているが、大文字小文字の対応が必要
という感じに問題を要素へ分解することができます。
これらを踏まえてJavaScript
の場合、
- 文字の分割には
split('')
が使える - 母音を数える変数
let vowelsCount = 0;
を宣言しよう - 大文字小文字は
toLowerCase()
で小文字に変換して対応しよう - 文字のひとつひとつは
forEach()
で対応しよう
という感じに個々の問題の要素への解法を設定することができます。このひとつひとつの解法を組み立てると下記のようになります。
getCount = (str)=> {
let vowelsCount = 0;
str.toLowerCase().split('').forEach((e,i)=>{
if(e == "a"||e == "e"||e == "i"||e == "o"||e == "u")vowelsCount++
});
return vowelsCount;
}
getCount('abcidsgE');//3
自らの解法の引き出しが増えていけばforEach
でなくてfilter
でもいけるな、という感じに幅が増えていきます。より柔軟な組み立てができるようになっていきます。
しかし...
私はプログラム学習スタートの時、
引数とは...for文とは...if文とは...変数とは...配列とは...???
という状態でした。つまり道具の使い方がわからない状態でした。
ただ、道具の使い方がわからなくても手順を考えることはできます。
ですので、もうどうやって解いたら良いのか分からない!という問題も小さく小さく分解し、
小さな問題を技術書やwebで調べて解法を見つける、次の小さな問題の解法を見つける、を繰り返します。
個々の問題の要素の解法が見つかっても次は解法達を組み合わせる壁に当たりますが、
A B C D E の要素の解法があれば、まずはAとBを組み合わせる。次はABとCを組み合わせる、という感じに試行錯誤をくりかえします。
地道にですが、この作業を繰り返していくと段々と自らの引き出しが増えていきます。
これは実務においても大事な思考の姿勢です。未実装の機能があっても必要な機能を分解し、個々に対応して組み合わせることで要件を満たすことができます。
どこかで「基本は最大の奥義」という言葉を聞いたことがあります。応用はすべて基本の組み合わせであり、基本ひとつひとつの質が高ければ自然と出力されるものの質も高くなるということかもしれません。
2 他の人の解答と自分のコードを比較する
Codewarsでは解法後に他の人のコードを見ることができます。
これは自らの引き出しの幅を広げる絶好の機会になります。
問題を解いて終わり、ではなくて他のコードと比較することで自らのコードの無駄な部分や、知らない関数の使い方を学ぶことができます。
他のコードを真似る際はそのまま写経するのも良いですが、どのような思考で組み立てられているか手順を推察、思考をトレースするようにコードを書くとより腹に落として理解することができます。
またこれによって実務においても他の人のコードを読む力を養うことができます。
3 解いた問題をQiitaに投稿する
解いた問題をQiitaまたはblogに投稿することは思考の言語化という点で非常に有用です。
1 2の手順で浮かんだ思考を他者にわかるように言語化することで、曖昧な部分がなくなり、より明確に理解することができます。
Qiitaに自らの思考を整理して投稿することで読者の方からフィードバックもうらことができ、それもまた自分の幅を広げることにつながります。(まさに本記事を書いていることが該当します)
また記事を投稿することで自分自身が後から見返すことができます。
さらに、実務においても自らが実装したコードの意図を他者に言語化して伝える訓練にもなります。
4 別の問題へ
1 2 3の手順を踏んだら別の問題へ
何よりも大事なのはプログラムを書くことを習慣にすることだと思います。
Qiitaへの投稿、読者からのフィードバックは継続の励みになるのでおすすめです。
おわりに
以上、私がプログラム学習で実践したことになります。
この記事がプログラム学習で悩んでいる方の一助になれば幸いです。
私としては次にjs以外の言語での実践、
アプリケーションの作成をしようかなと考えています。
ご覧頂き、ありがとうございました。