初心者を卒業!現役が教えるプログラミング上達方法
みなさん、プログラム書いてますか?
今回は今までの経験から、プログラム初心者の方の上達のコツを書いていこうと思います。
ただ 上達 には色々な意味があると思いますが、
この記事では コピペを卒業し、自分で”見やすい”プログラムを書いていけるようになる とします。
また、既にプログラムをがっつり書いている方も軽く目を通してもらうと、参考になることが書いてあるかもしれません。
目次
はじめに
まずはじめに 見やすいプログラムに100%の正解は存在しない ということを述べておきます。
これは複数の要因がありますが、プログラム言語や開発環境、果ては状況によって変わってしまうものだからです。
「うちの会社ではこう書いてる」と言っても、他社では「こっちの書き方をしているから直してくれ」と言われるくらいです。
ですので、初心者の方は 共感・納得できるものから取り入れてみる くらいの感覚で少しずつ取り入れていってみてください。
一気に上達は難しいと思いますが、確実に一歩ずつ上達に近づいていくと思います。
例題はPHPという言語で書かれていますが、本質はどの言語でも基本的に同じです。
環境編
タブとスペース(半角/全角)を混在しない
開発をしているとき、みなさんはタブ、スペースのどちらを使っていますか?
どちらを使っても間違いではありませんが 混在させること は避けた方がいいです。
これの理由は 可読性(読みやすさ)が落ちる可能性がある からです。
これは タブの表示が一定とは限らない ためです。
下記に具体例を見てみましょう。
タブ1つで半角スペース4つと設定されているエディタの場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<!--?php $flg = 1; $apple = "りんご"; $orange = "みかん"; if($flg == 1) { echo $apple; } else { echo $orange; } </pre> <p>インデント(字下げ)が整っていて非常に見やすいですね。<br ?--> 混在して書いた人にはこのように見えています。 |
では別のエディタで開いてみましょう。
タブ1つで半角スペース2つと設定されているエディタの場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<!--?php $flg = 1; $apple = "りんご"; $orange = "みかん"; if($flg == 1) { echo $apple; } else { echo $orange; } </pre> <p> </p> <p>同じプログラムなのにインデントがぐちゃぐちゃで読みづらいですね。</p> <p> </p> <p>様々なサイトからコピー&ペーストをした初心者にありがちなソースコードで、他の人が読むことを意識していない場合に発生します。</p> <p> </p> <p>開発は多人数で行うことも多いので、[marker color="green"]他の人が読むことを常に意識[/marker]しましょう。</p> <h3>文字コードを統一する</h3> <p>プログラムを書いていくとき、複数のファイルに分割していくことがあります。<br ?--> この時、それぞれのファイルで文字コードが違うと、思わぬ問題が発生することがあります。 |
ファイルBのプログラムで、ファイルAの中身を読み込んで使用する時、それぞれの文字コードが異なると読み込んだデータが破損した扱いになってしまう事があります。
データが破損する=読み取れない となってしまいますが プログラム自体には問題がない ため、問題解決時に不要な時間がかかってしまいます。
プロでもこの手の問題解決には時間がかかるため、初心者のうちから文字コードを統一するクセをつけましょう。
エディタのカラーテーマを設定する
メモ帳などの白背景+黒文字でももちろん動きますが、プログラムのミスにつながります。
具体的には 入力ミスに気付きにくくなる という問題があります。
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 30 31 32 33 34 35 |
<!--?php // ミスが無いプログラム $array = array( "foo" => "bar", 42 => 24, "multi" => array( "dimensional" => array( "array" => "foo" ) ) ); var_dump($array["foo"]); var_dump($array[42]); var_dump($array["multi"]["dimensional"]["array"]); // ミスしているプログラム $array = array( "foo" => "bar", 42 => 24, "multi => array( "dimensional" => array( "array" => "foo" ) ) ); var_dump($array["foo"]); var_dump($array[42]); var_dump($array["multi"]["dimensional"]["array"]); </pre> <p> </p> <p>変数はオレンジ、定数はピンク、関数は青 etc.</p> <p> </p> <p>それぞれで分かりやすい色に設定したりすると[marker color="green"]ミスにすぐ気づけます[/marker]。<br ?--> また、タブや全角スペースなども色付けしておくと、スペースとタブの混在にも気づけます。 |
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 30 31 32 33 34 35 |
<!--?php // ミスが無いプログラム $array = array( "foo" => "bar", 42 => 24, "multi" => array( "dimensional" => array( "array" => "foo" ) ) ); var_dump($array["foo"]); var_dump($array[42]); var_dump($array["multi"]["dimensional"]["array"]); // ミスしているプログラム $array = array( "foo" => "bar", 42 => 24, "multi => array( "dimensional" => array( "array" => "foo" ) ) ); var_dump($array["foo"]); var_dump($array[42]); var_dump($array["multi"]["dimensional"]["array"]); </pre> <p>上記の例では、囲い文字(ダブルクオーテーション)が付け忘れていることがすぐにわかります。</p> <h2>書き方編</h2> <h3>固定の値を直接書かない</h3> <p>プログラムに直接固定の値を書くと [marker weight="narrow" color="green"]後で見た人が何の値かわからない[/marker] 、 [marker weight="narrow" color="blue"]他で使う場合もある時、値を変更しようとするとプログラムを全部見直すことになる[/marker] などの問題が発生します。<br ?--> 具体的にプログラムを見てみましょう。 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<!--?php $shincho = 170; if(120 <= $shincho) { echo "乗車可能です"; } else { echo "身長120cm未満の人はご乗車いただけません。"; } </pre> <p>上記プログラムでは身長が120cm未満の場合、ジェットコースターには乗れないという判定になっています。</p> <p> </p> <p>ではもし [marker weight="narrow" color="yellow"]身長を130㎝未満に変更してほしい[/marker] という話が出たら、何か所直すことになるでしょうか?<br ?--> このプログラムでは2か所直すことになりますが、もっと複雑なプログラムで他のファイルにまで使用されていたら、目も当てられません。 |
ですので、下記のように定数化や変数化しておくことが望ましいです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<!--?php const LIMIT_SHINCHO = 120; $shincho = 170; if(LIMIT_SHINCHO <= $shincho) { echo "乗車可能です"; } else { echo "身長".LIMIT_SHINCHO."cm未満の人はご乗車いただけません。"; } </pre> <p>これなら定数の値を変更するだけですぐ終わりますね。<br ?--> 複数のファイルで使用する場合は、定数を集めたファイルを外部化しておき、各ファイルで読み込むのも手です。 |
書き方を統一する(コーディング規約を作る)
たとえば 定数はすべて大文字 や 変数はキャメルケース など、プログラムの書き方を一定に保っておくことで プログラムの読みやすさ(可読性)と管理・修正のしやすさ(保守性) が上がります。
キャメルケースは、複合語をひと綴りとして、要素語の最初を大文字で書き表すことをいう。
キャメルケース – Wikipedia –
悪い例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<!--?php // 書き方が決まっていない定数 const gp01 = "ゼフィランサス"; const GP02 = "サイサリス"; const Gp_03 = "デンドロビウム"; const gP04 = "ガーベラ"; // 書き方が決まっていない変数 $cure_star = "マイアミピンク"; $CureMilky = "青緑"; $cureSoleil = "黄色"; $CURESELENE = "紫"; $curecosmo = "虹色・青"; </pre> <p>書き方が統一されていないプログラムはどうですか? 読みづらくないですか?<br ?--> これは [marker color="yellow"]複数人がプログラムを修正した際、前の人の記述ルールに合わせず自分勝手なプログラムを書いたとき[/marker] によく起こります。 |
では、きれいに直していきましょう。
良い例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<!--?php // 書き方が決まっている定数 (「定数は全部大文字」というルール) const GP01 = "ゼフィランサス"; const GP02 = "サイサリス"; const GP03 = "デンドロビウム"; const GP04 = "ガーベラ"; // 書き方が決まっている変数 (「変数は全部ローワーキャメルケース」というルール) $cureStar = "マイアミピンク"; $cureMilky = "青緑"; $cureSoleil = "黄色"; $cureSelene = "紫"; $cureCosmo = "虹色・青"; </pre> <p>プログラムが統一され綺麗になり、非常に読みやすくなりました。<br ?--> これは他人が見ても [marker color="green"]そういうルールなのか[/marker] と気づきやすくなる効果もあります。 |
コメントを書く
プログラムが書けるようになると 書くことに精一杯 になり 他人が読むことを意識しない プログラムが出来上がります。
この時、大事なことは 明日の自分は他人 であり 他人が自分と同じだけプログラムが読み書きできると思わない ことです。
私は仕事で様々な言語や現場を経験しましたが、コメントが書けない人が本当に多いです。
コメントは自分のためではなく他人のため に残すものと考えましょう。
コメントを残すことで プログラムを読まなくても何をしているかがザックリとわかる ようになります。
逆に 何をしているかよくわからない となってしまうコメントはNGです。
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 30 31 32 33 34 35 36 37 38 39 |
<!--?php /** * 商品コードから生産地・在庫をチェック * * @param string $shohinCode 商品コード * @return boolean(true:チェックOK, false:エラー) */ function checkShohin($shohinCode) { const PREFIX_SHOKUHIN = 1; const PREFIX_ZAKKA = 2; // 先頭1文字で処理を分岐 // 1(食品) : 生産地をチェック // 2(雑貨) : 在庫確認 // その他: エラー $prefixShohinCode = mb_substr($shohinCode, 0, 1); if($prefixShohinCode == PREFIX_SHOKUHIN) { return checkSeisanchi($shohinCode); } else if($prefixShohinCode == PREFIX_ZAKKA) { return checkZaiko($shohinCode); } else { return false; } } // パラメータを取得 $shohinCode = $params['shohinCode']; // 商品コードから生産地・在庫をチェック $checkResult = checkShohin($shohinCode); </pre> <p>関数の中身がどうなってるか分からなくても、何をしているか何となくわかりますよね?<br ?--> あくまで一例ですので「このコメントではよくわからない」と思う人もいると思います。 ただ、こうやってコメントを残すことで、プログラムを読まなくても、ある程度読み取ることができます。 |
スコープの範囲を小さく保つ
ここで言うスコープとは 変数の有効範囲 のことを指します。
このスコープの範囲を大きくしてしまうと、思わぬところで不具合が発生してしまう原因となります。
どういうことか、例を見ていきましょう。
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 30 31 |
<!--?php $title = "期末テスト採点"; // チェックする点数を設定 $checkScore = 30; // テストデータを取得し、採点結果を設定 $testList = getTestList(); for($i = 0; $i < count($testList); $i++) { $score = saiten($testList[$i]); $isAkaten = false; if($score < $checkScore) { $isAkaten = true; } $testList[$i]['score'] = $score; $testList[$i]['isAkaten'] = $isAkaten; $title = "採点結果"; $testList[$i]['title'] = $title; } echo $title; </pre> <p>さて、画面には何が表示されるでしょうか?</p> <p> </p> <p>答えは 「[marker color="yellow"]採点結果[/marker]」 というテキストですね。</p> <p> </p> <p>でも本当に表示したかったのは [marker color="green"]期末テスト採点[/marker] というタイトルでした。<br ?--> これは [marker weight="bold"]変数の初期化と出力の範囲が広すぎた[/marker] 事による不具合の発生です。 |
この例のように短いものではほとんど発生しませんが、プログラムが肥大化していくほど、この問題にぶつかる可能性が大きくなります。
こういう事故にあわないためにも、スコープの範囲を意識し、可能な限り小さく保つように意識しましょう。
先ほどのプログラムは下記のように直すとスコープの範囲が小さくなります。
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 |
<!--?php // チェックする点数を設定 $checkScore = 30; // テストデータを取得し、採点結果を設定 $testList = getTestList(); for($i = 0; $i < count($testList); $i++) { $score = saiten($testList[$i]); $isAkaten = false; if($score < $checkScore) { $isAkaten = true; } $testList[$i]['score'] = $score; $testList[$i]['isAkaten'] = $isAkaten; $title = "採点結果"; $testList[$i]['title'] = $title; } // $titleの有効範囲が2行だけに小さくなる $title = "期末テスト 採点"; echo $title; </pre> <h3>コピペをしないで手打ちする(写経の卒業)</h3> <p>初心者のうちは本やインターネットで調べた内容をそのままコピー&ペーストをすることで動くプログラムを作る方が大半だと思います。<br ?--> しかし、コピー&ペーストは [marker weight="narrow" color="green"]プログラムが書けるようになる[/marker] わけではなく [marker weight="narrow" color="blue"]調べる力が付く[/marker] だけです。 |
調べる力が付いたら、次は自分でプログラムを書きましょう。
具体的には コピー&ペーストしたプログラムを1行ずつ調べていく ということが良いと思います。
プログラムの詳細を調べていくことで、その命令は何をしているのか・何ができるのかをゆっくり自分で咀嚼(そしゃく)できます。
咀嚼した後、今度はコピー&ペーストをせず、自分の力でプログラムを書いてみましょう。
その際、わからない場合は 各言語の公式ドキュメント(マニュアル) を見るようにしましょう。
何故なら インターネットにアップされているプログラムが正しく動く保証はない からです。
ここまで出来た時が本当の意味での プログラムを理解した ということだと思います。
記事執筆時点での各言語の公式ドキュメント
C 言語リファレンス – Microsoft Docs –
C# リファレンス – Microsoft Docs –
C++ 言語リファレンス – Microsoft Docs –
PHPマニュアル – PHP –
Python 3.7.4 ドキュメント – Python –
アノテーションを使い分ける
アノテーションとは、一言で言うと 注釈 です。
プログラムを書いている時 「メモを残しておきたい」 「ここは後で修正しよう」 といったことがあります。
そんな時、すべてコメントで書くのではなく、アノテーションを使いましょう。
アノテーションとは、「注釈」という意味の英単語で、ITの分野ではデータやプログラムの中に特殊な記法を用いて埋め込まれた付加情報のことをこのように呼ぶことが多い。
アノテーション – T用語辞典 e-Words –
悪い例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<!--?php $age = getUserAge($userId); //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ // 2022年からは18歳以上が成人となるため、変更すること! //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ if($age < 20) { echo '未成年の方は保護者の同意が必要です。'; } //=- 不具合あり =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // getUserGenderには不具合があるため、あとで修正する //=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= $gender = getUserGender($userId); if($gender == "male") { echo "男性"; } else { echo "女性"; } </pre> <p>ブロックコメントでの識別や特定キーワードで意味を持たせるオレオレルールは好ましくありません。<br ?--> 他の人には伝わりませんので、プログラムを見た人は結局書いた人に聞くことになり、無駄が発生します。 |
良い例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<!--?php $age = getUserAge($userId); // TODO: 2022年からは18歳を成人とする if($age < 20) { echo '未成年の方は保護者の同意が必要です。'; } // FIXME: getUserGenderに不具合あり $gender = getUserGender($userId); if($gender == "male") { echo "男性"; } else { echo "女性"; } </pre> <p>プログラムの言語ごとにアノテーションは大まかに決まっていますので、それを使用するようにしましょう。<br ?--> 対象箇所の検索や意味などを説明しなくてもすぐ理解ができるようになっています。 また、エディタによってはアノテーションを抽出する機能があるものもありますので、非常に便利になります。 |
ただし、間違っても どれを使えばわからないから全部TODOにしちゃえ といったことはご法度です。
アノテーションの意味がなくなってしまいますからね。
アノテーションについてはよくまとめられているサイトもありますので、一読されてみてはいかがでしょうか?
「かっこ良い」より「わかりやすい」を優先する
他人のプログラムを見ていると 「かっこ良い書き方だな」 と思うことがあるかと思います。
しかし、そのかっこいい書き方のプログラムは果たして読みやすいでしょうか?
例を見てみましょう。
悪い例
1 2 3 4 5 6 7 8 9 10 11 |
<!--?php $price = 1700; $msg = (2000 < $price) ? "送料無料" : ((1000 <= $price) ? "あと".(2000-$price)."円で送料無料です" : "送料がかかります"); echo $msg; </pre> <p>これを見てすぐに何が表示されるかわかる人は少ないと思います。<br ?--> また、デバッグ(プログラムをテストすること)の時、[marker weight="bold" color="yellow"]テスト漏れが発生する可能性[/marker]があります。 |
これはもっとわかりやすくした方が良いです。
良い例
1 2 3 4 5 6 7 8 9 10 |
<!--?php $price = 1700; $msg = ""; if(2000 < $price) { $msg = "送料無料"; } else if(1000 <= $price) { $msg = "あと".(2000-$price)."円で送料無料です"; } else { $msg = "送料がかかります"; } echo $msg; ?--> |
これで初心者が見てもわかりやすいif文になりました。
また、どうやってテストをすれば良いかも一目でわかります。
どれだけかっこ良いプログラムを書いても利用者には全然伝わりませんので、プログラムにカッコ良さは二の次というわけです。
カッコ良いプログラマとは、カッコ良いプログラムが書けるのではなく 「不具合を出さないようにプログラムを作る」 人のことではないでしょうか。
さいごに
ここまで長々と書きましたが、すべてを実践する必要はありません。
最初に書きましたが 共感・納得できると思った事 から始めてみると良いと思います。
カッコ良いエンジニアを目指していきましょう!
- おすすめ記事
-
-
もきち2019.08.27
-
【初心者あるある】プログラミングを始めて2ヶ月の初心者が思うこと
まるちとーる2018.07.17
-
POPULAR
のえる
Full-stack Developer