今回はプログラミング理解してきたけど、実装しようとしていることをプログラムに落とし込むことが出来ないときのコツを話していきます。
プログラミングの勉強始めたばかりのときは、こんな場面によく遭遇しないませんか?
やりたいことは説明できるんだけどそれをいざプログラムに書こうとするとうまくいかない。
頭の中でイメージは出来ているのに、それを形にできないもどかしさ。プログラミングをしていれば誰もが何回も感じたことがあるかと思います。
そんなときは頭の中のアイデアを擬似コード(pseudocode)として一旦頭の中から外にアウトプットすることをおすすめします。
擬似コードを書くことで下記のメリットが得られます。
- 擬似コードの通り実装を進めていけばイメージが形になる
- 時間が空いて忘れたとしてもすぐに思い出せる
それぞれのメリットについて実際に擬似コードを交えながら説明していきます。
擬似コードの通り実装を進めていけばイメージが形になる
これはプログラムに限らず普段の生活や仕事のなかでも起きることですが、複数のことを同時に考えたり処理しようとしたりすると頭が混乱します。
複数のことを整理するためには一旦付箋なり、Todoリストなどで管理するなど一旦脳内から外に書き出すことが一番です。
書き出したあとはこれからやることを1つだけ取り出し、やるべきこと1つに集中して取り組みます。
つまり「マルチタスク」ではなく「シングルタスク」で作業をしましょうと言うことです。
メンタリストDaiGoがマルチタスクからシングルタスクの仕事術へおすすめの本を!
上記はシングルタスクがなぜ良いかをまとめてくれている記事です。
マルチタスクではなくシングルタスクのほうがプログラムを実装する(=作業をやり遂げる)際には効率がよいです。
プログラミングから少し話がそれてしまいましたが、「擬似コード」を使ってどのように頭の中のアイデアを形にするか次のサンプルコードを使って見ていきましょう。
擬似コードを使ったサンプルコード(JavaScript)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// 引数に数値の配列を受け取る関数を作る。 // この関数では受け取った配列の中の値を全て2倍にする。 function double(_numbers) { // 結果値を格納する配列を用意する const results = []; // 引数で受け取った数値の配列を1つずつループで確認する for(let i = 0; i < _numbers.length; i++) { // それぞれの要素の値を取得して const _num = _numbers[i]; // 取得した値を2倍にする const doubledNumber = _num * 2; // 2倍にした値を結果値として返す配列に格納する results.push(doubledNumber); } // 2倍の値を格納した配列を返す return results; } const numbers = [1, 2, 3, 4, 5]; const results = double(numbers); console.log('元々の値: ', numbers); console.log('doubleの結果値: ', results); // 出力結果 // 元々の値: [ 1, 2, 3, 4, 5 ] // doubleの結果値: [ 2, 4, 6, 8, 10 ] |
今回は受け取った数値の配列を2倍にする関数を作成しました。
関数(function)の定義しているところに書かれているコメントが今回の擬似コードになります。
実装前のイメージは以下のとおりです。
1 2 3 4 5 6 7 8 9 10 11 12 |
// 引数に数値の配列を受け取る関数を作る。 // この関数では受け取った配列の中の値を全て2倍にする。 function double() { // 結果値を格納する配列を用意する // 引数で受け取った数値の配列を1つずつループで確認する // それぞれの要素の値を取得して // 取得した値を2倍にする // 2倍にした値を結果値として返す配列に格納する // 2倍の値を格納した配列を返す } |
ここでは関数を作るということはわかっているので「function」を使って関数の箱だけ用意しておきます。
そして、関数の箱を作ったらどんなことをやるのかできるだけ細かくコメントに書いていきます。
- この関数は引数として数値の配列を受け取る
- 2倍にした値を格納する配列を用意する
- 引数として受け取った数値の配列の中身を1個ずつ取り出して2倍にする
- 2倍にした値を先程作成した配列に格納する
- 最終的にはこの配列を返り値として関数の呼び出し元に渡す
ぼくは上記のように関数を実装するために必要な作業を分けましたが、これは人によってもう少し数が少なくなったり、もっと多くなったりするでしょう。
1つの機能(関数)を実装することが「大きなゴール」だとしたら、そのゴールを達成するために必要な小さなステップを「擬似コード」でまとめていく感じです。
これを繰り返していくうちに機能が増えていき大きなサービスを作ることも可能になっていきます。
実装に行き詰まっているときには「擬似コード」でやろうとしていることを書き出すことによって解決される可能性は高くなります。
- 形したいアイデアを書き出す(=目標)
- アイデアを実現するために必要な作業を書き出す(=スモールステップ)
時間が空いて忘れたとしてもすぐに思い出せる
もう一つ頭の中の考えを外に出すメリットとしては「忘れても大丈夫」なことです。
ここで唐突ですが質問させてください。
「昨日の昼に食べたものはなんですか?」
ちなみに今この記事を書いているぼくはタイピングを止めて1分ほど考えましたが、結局何を食べたか思い出せませんでしたw
ぼくのようにすぐに思い出せない人もたくさんいるのではないでしょうか?
あえて技術者っぽく書くと、人間の脳は揮発性メモリなので重要なことは外部ストレージに保存する必要があります。
- 揮発性メモリ: 一時的にデータを記録する領域で、電源が切れたりするとデータが無くなる
- 外部ストレージ: ここでは永続的に保存出来る記録媒体のことを指します。ハードディスクがそれにあたります。
例えば、実装しなければいけない機能がたくさんあったとします。
その時に頭の中だけでそれらの機能実装が必要だと考えていると、「あとどんな機能実装しなければいけないんだっけ?」「昨日考えたあれなんだっけ?」
などと思い出すのに苦労します。場合によっては思い出せないままになることもあります。
これを先程も書いたように付箋やTodoリストに書いておけば、頭の中を空っぽにして休憩を取ったとしても作業再開する時に書いたメモを見返せばすぐに思い出せます。
プログラミングはアイデアを実現するために頭の中で色々と思考してコードにアウトプットしていく作業なので、脳の負担を減らせる作業があればどんどん取り入れていくと良いでしょう。
その1つの方法として「擬似コード」があり、どんな機能をこれから実装していくかあらかじめコードに埋め込み、
Todoリストや付箋のようにメモとして使っていくとプログラミング作業の助けとなってくれるので、
擬似コードで頭の中の整理とスムーズな作業再開を実感してもらえたらと思います^^