「なかなかプログラミングが上達しない・・・」
「やったことはあるけど覚えられない」
プログラミングを習得しても、勉強と一緒で使っていなければ忘れてしまいます。また、どんどん上達する人や、長い間プログラミングの技術で生計を立てているような熟練者は、日頃からの取り組み方自体が違っているのです。
今回は、現在プログラミング学習で躓いている人や、なかなか上達せず苦戦している人に向けて「熟練者ほど実践するプログラミングが上達する3つの法則」をご紹介します。
マニュアルを読む
プログラミングに取り組む際、Google検索で情報が手軽に手に入れられるため、なかなかマニュアルを見るという機会は減っています。機能を実装するだけであればそれで構いませんが、よりプログラミングへの理解を深めるのであれば、マニュアルにしっかり目を通すようにしましょう。
ここで公式のマニュアルにこだわる必要はありません。中には公式よりもわかりやすくまとめているようなサイトは存在するため、自分が読みやすいと感じ、詳しい説明が載っていると判断できればそちらを参考にしても構いません。
構文を理解する
マニュアルを読んでまず理解すべきことは、構文(書き方)です。サンプルコードで済ませてしまっている人や、解決できてしまっている人の多くが構文の理解が浅くなってしまいがちです。
例えばPHPを例に見てみましょう。
※以下のオンラインエディターを使用しています
<?php
$test = 'テスト' + 'だよ';
var_dump($test);
「テストだよ」と表示されることを期待しているように見えますが、出力結果は以下の通りです。
# 出力結果
PHP Warning: A non-numeric value encountered in /workspace/Main.php on line 2
PHP Warning: A non-numeric value encountered in /workspace/Main.php on line 2
残念ながらエラーが返ってきました。JavaScriptの場合はプラス記号で文字列の結合ができますが、PHPではドットが用いられます。
<?php
$test = 'テスト'.'だよ';
var_dump($test);
出力結果は以下の通りです。
# 出力結果
string(15) "テストだよ"
配列の最終要素にコンマの有り無し、ダブルクォーテーションやシングルクォーテーションの使い分けなど、基本的な構文を理解して置かなければ、些細なミスであっても解決できずに断念してしまうことになります。そうならないためにも、取り組む言語にはどのようなルールがあるかは理解しておきましょう。
返り値を知る
次にマニュアルから学ぶことは、引数や返り値など関数の理解です。
例えば、phpの配列並び替え関数のasort()について動きを見てみましょう。
<?php
$animals = [
'cat',
'alligator',
'dog',
'bear',
];
$animals = asort($animals);
var_export($animals);
$animalsという配列に4匹の動物が入っています。並び順をa-zにしたいので、asortという関数にかけました。並び替えされた配列が出力されること期待したのですが、結果は以下の通りです。
# 出力結果
true
期待に反してtrueという結果が返ってきました。これはasortの返り値を理解していないことが原因です。
公式マニュアルを確認してみましょう。
asortの返り値は整列した配列ではなく、成功したかどうかの判定結果が返ってくるようですね。
それでは、返り値を理解した上でコードを修正しましょう。
<?php
$animals = [
'cat',
'alligator',
'dog',
'bear',
];
asort($animals);
var_export($animals);
asort時に再度$animalsの変数に代入していましたが、それを無くしました。出力結果は以下の通りです。
# 出力結果
array (
1 => 'alligator',
3 => 'bear',
0 => 'cat',
2 => 'dog',
)
期待通りの結果が返ってきました。短いプログラムであればすぐに原因が見つかりますが、長くなってしまえば見つけるのだけで膨大な時間を費やすことになってしまいます。そうならないためにも、返り値としてどんな値を返してくれているのかは重要なのです。
他にも、関数周りであれば引数がどのように指定できるか、初期値がどのように設定されているかを知っておくことが大事です。ライブラリを使用する場合は、その関数やオブジェクトにどういったメソッドやコールバック関数が使えるのかなど知ることで、開発が行き詰まってしまうようなことを防ぐことができます。
エラーメッセージを読む
エラーが返ってくればドキッとしますね。それがなかなか解消されないとなればうんざりしてしまいますし、現在運用しているシステムからエラーが返ってくれば冷や汗が止まらないなんてこともあるでしょう。しかし、エラーメッセージを出すプログラム側としては、間違いを知らせてくれているので、むしろ我々の開発を手助けしてくれています。
だからこそ、よりプログラミングへの理解を深めるためにはエラーメッセージを読み、何を伝えようとしてくれているのか解読すべきなのです。
検索する
手っ取り早い手段の一つが、出力されたエラーメッセージをコピーしてGoogleの検索ボックスに貼り付けて検索することです。よく起こり得るエラーであれば、同じような質問をしているQ&Aが表示されたり、その解決方法が書かれたサイトへたどり着くことができます。
エラーメッセージが長文の場合は、最初の行から順番に検索してチェックしてみましょう。言語にもよりますが、PHPの場合は比較的一番上の行に問題部分が表記されているため、よく起こり得るエラーの場合は解決策に早い段階でたどり着くことができます。
翻訳する
日本人の場合、どうしても英語で出力されるエラーメッセージに抵抗があるものです。検索しても解決できないのであれば、翻訳して読み解いてみるというのも1つの方法です。エラーメッセージになれてくれば、検索せずともメッセージの意味を読み解くことができるようになります。
以下のエラーメッセージを例に見てみましょう。
PHP Parse error: syntax error, unexpected '=', expecting ']' in /workspace/Main.php on line 4
# 日本語翻訳
PHP解析エラー:構文エラー、予期しない '='、4行目の/workspace/Main.phpに ']'が必要です
完璧な翻訳はできなくとも、日本語にすれば大分読みやすくなったのではないでしょうか。1つずつバラして見てみましょう。
- PHPの解析エラー
(PHP Parse error)
- 構文エラー
(syntax error)
- 予期しない’=’
(unexpected ‘=’)
- 4行目の/workspadce/Main.phpに’]’が必要です
(expecting’ ]’ in /workspace/Main.php on line 4)
まずはPHPの解析エラーということが宣言されています。次に、構文エラーと出ているので、記述したコードの書き方自体が間違っているということになります。
次の「予期しない’=’」は、想定外の部分に=が使われているということを伝えています。その該当箇所がMain.phpの4行目だそうです。
では、その問題Main.phpに書かれたコードを見てみましょう。
<?php
$animals = [
'cat' => 'ネコ',
'alligator' = 'ワニ',
'dog' => 'イヌ',
'bear' => 'クマ',
];
var_export($animals);
問題の4行目には「’alligator’ = ‘ワニ’,」と記述されています。これは連想配列なので、=ではなく=>にしなくてはなりませんね。配列内の記述がおかしいため、「’]’で閉じる場所が間違っていませんか?」ということを知らせてくれたようです。
それでは問題の4行目の間違いを修正しましょう。
<?php
$animals = [
'cat' => 'ネコ',
'alligator' => 'ワニ',
'dog' => 'イヌ',
'bear' => 'クマ',
];
var_export($animals);
# 出力結果
array (
'cat' => 'ネコ',
'alligator' => 'ワニ',
'dog' => 'イヌ',
'bear' => 'クマ',
)
正常に出力されましたね。
このように、エラーメッセージがどうしても解読できなければ翻訳してみましょう。意味さえわかれば、エラーメッセージはその原因箇所を詳しく説明してくれているというのがわかります。何度もエラーメッセージに直面するようになれば、英語が苦手であっても、エラーが伝えようとしていることがわかるようになります。
エラーメッセージは、我々がプログラミングを上達することに対して最後まで諦めず付き合ってくれている良き指導者でもあるのです。
理解しながら組み上げる
プログラミングをする際に、コピペで済ませてしまう人の多くが、理解できていないものを組みあわせているという状態です。
例えば、フレームワークやライブラリなどに関しては、そのコアとなるプログラム全てを理解しておく必要はありません。それは「理解しておかなくても使えるセット」として完成されたものであり、そのものをカスタムする必要性がないからです。
ですが、独自の処理を組んでいく場合であれば、その中身がどういった処理で成り立っているか把握しておかなければなりません。
出力結果を確認する
システム開発やサイト制作のスピードを上げるためには、一気に構築していくことです。しかしそれは、ある程度理解ができているからこそできるのであって、関数の挙動や処理の内容が理解できていなければ成立しません。
どういった結果が出力されているかなどは、わからなければその都度試したり、別で書いてどういった動きをしているのかを自分の目で確認してみることです。最初に挙げたように、マニュアルを読めば書いてあることは多いですが、結果の全てを想像するのは難しいということもあります。そういったときは、実際に試すことが最も効率的で確実なのです。
「なんとなく」を解消する
関数やクラス、ライブラリやモジュールなど、言語によって様々ですがプログラミングをする上では覚えなくてはならないものが多くあります。その全てをマスターする必要はありませんが、自分がそれを使う状況になれば、「動いているからOK」というような「なんとなく」は解消しておきましょう。
例えば、DateTimeクラスについて見てみましょう。
<?php
$date = '2020-08-01';
$now = new DateTime();
$date = new DateTime($date);
$diff = $now->diff($date);
echo $diff->format('%a日');
出力結果は以下の通りです。
# 出力結果
23日
処理を実施したのは2020年8月24日です。最初に$dateに代入した’2020-08-01’との日数差が計算されているのがわかりますね。
今日との日数差を計算したいと思い、上記のサンプルコードをコピペすれば内容は理解しておかなくても、$dateに入れる日時さえ変えれば十分に動かすことが可能です。記述量も少なくわざわざ理解しなくても「なんとなく動いているからOK」だと考えてしまいがちです。
しかし、こういった些細な部分をおろそかにせず、どのような処理が行われているのかを理解しておく、「なんとなく」を解消することが上達へのステップになります。
まず$nowに現在の日時をセットして、$dateの値もDateTimeクラスにセットしています。そこから差分を算出するために、$nowのDateTimeインスタンスからdiffのメソッドに比較対象である$dateの日付をセットします。
最後は$diffに格納した日数差を出力するために、formatメソッドを使用して%aで日数差を出力しています。
もちろん余裕があれば、DateTimeクラス自体がどうなっているかなど、深く掘り下げていっても構いません。そこまでしなくとも、自分の作るサイトやシステムで使用している処理だけでも、作った段階で把握しておくようにしておきましょう。この積み重ねが、プログラミングの上達につながるのです。
まとめ
いかがだったでしょうか。
今回は「プログラミングが上達する3つの法則」についてご紹介しました。
現在プログラミング学習に取り組んでいる方、これから副業や趣味、メインスキルとしてプログラミングを検討している方は、ぜひ参考にしてくださいね。