プログラミング上達のコツは経験と創意工夫

山と谷のある成長グラフオブジェ

プログラミングの経験をしばらく積んだ後に昔の初心者だった頃の自分のコードを見ると今の自分の成長を感じることができます。

プログラミング上達のコツは色々なコードに触れる経験と自分の中から湧き出る創意工夫だと思います。

経験が発想を豊かにする

自分以外の様々なコードに触れることで自分の発想外の経験を得ることができます。

例えばPHPのループ中で交互に「#000000」と「#FFFFFF」を出力しないといけない処理があったとします。

初心者が最初は以下のPHPコードを書いたとします。

<?php
for ($line = 1; $line < 100; $line++) {
    if ($line % 2 == 0) {
        echo "#000000";
    }
    if ($line % 2 == 1) {
        echo "#FFFFFF";
    }
}
?>

プログラミングにもPHPにも慣れてきて、ifの処理をもっと効率よく以下のように修正したとします。

<?php
for ($line = 1; $line < 100; ++$line) {
    if ($line % 2 === 0) {
        echo '#000000';
    } else {
        echo '#FFFFFF';
    }
}
?>

でもここまでの修正コードは自分の発想の範疇を超えてはいないと思います。

そして経験の中で同じような処理を行う以下のコードを目にしたとします。

<?php
$color = ['#000000', '#FFFFFF'];
for ($line = 1; $line < 100; ++$line) {
    echo $color[$line % 2];
}
?>

このようなコードを目にして初めてこういう考え方もあるのかと自分のものとして取り込みます。

察しの良い人ならば「ハッシュ(配列)を上手く使えばループ中のif文を減らせる場合もある」とさらに上位の本質を理解して自分に取り込みます。

またトグル動作するスイッチを利用した以下のコードに出会うかもしれません。

<?php
$color = ['#000000', '#FFFFFF'];
$switch = 0;
for ($line = 1; $line < 100; ++$line) {
    echo $color[$switch];
    $switch = 1 - $switch;
}
?>

上記のようなコードを見て「変数をこのように使えば値のトグル動作が可能」なことを学び自分のコードの幅を広げることができます。

こういう細かい経験を重ねていくことで処理を書く時のコードの発想力が上がっていきます。

発想が豊かになれば創意工夫できる

細かい経験を積んでいき発想力が高くなると、色々な発想を組み合わせてプログラミング上で創意工夫できるようになっていきます。

例えばとても生成が重いクラスvery_heavyがあって別々の場所でnewしないといけない場合があったとします。

<?php
A();
B();
function A() {
    $vh = new very_heavy();
    $vh->hoge_func();
}
function B() {
    $vh = new very_heavy();
    $vh->hoge_func();
}
?>

重いクラス生成処理は少しでも減らす必要があります。

すぐに思いつくのは生成したインスタンスをパラメータとして渡す処理です。

<?php
$vh = new very_heavy();
A($vh);
B($vh);
function A($vh) {
    $vh->hoge_func();
}
function B($vh) {
    $vh->hoge_func();
}
?>

しかしこれだと汎用性がありませんし呼び出し元や呼び出し先でパラメータの追加が必要だったり影響範囲が大きく調査が大変です。

そこで今までの経験から創意工夫することになります。

例えばシングルトンパターンでラッパークラスを作ってしまう方法です。

※si_very_heavyクラスはパスの通った場所に別ファイル化

※シングルトンパターンの乱用は混乱を招くので避けて下さい

<?php
A();
B();
function A() {
    $vh = si_very_heavy::get_instance();
    $vh->hoge_func();
}
function B() {
    $vh = si_very_heavy::get_instance();
    $vh->hoge_func();
}
class si_very_heavy {
    private static $vh = null;
    public static function get_instance() {
        if (is_null(self::$vh)) {
            self::$vh = new very_heavy();
        }
        return self::$vh;
    }
}
?>

クラスの生成にパラメータが必要な場合は以下のようにsi_very_heavyのget_instanceを修正して他のクラスにも応用する創意工夫が生まれるかもしれません。(数値や文字列など単純なパラメータの場合)

<?php
class si_very_heavy {
    private static $vh = null;
    public static function get_instance($param)) {
        if (isset(self::$vh[$param])) {
            self::$vh[$param] = new very_heavy($param);
        }
        return self::$vh[$param];
    }
}
?>

※外部サービスへの接続クラスなどで、同一サーバ(パラメータ)の接続を再利用することが多い処理に使われることが多いです。

※これらのコードは検証なしに脳内でコーディングしただけなので文法や記述にミスがある可能性がありますのでご注意下さい。

いままでに得た経験上から生まれる発想の組み合わせを駆使することにより、創意工夫に繋がりやすくなっていきます。

まとめ

プログラミングの初心者はコーディングしたり他のコードを目にする機会を増やすことが重要だと思います。

プログラミングのスキルアップはそれらの経験を積み重ねることによって徐々に自然と行われて行きます。

そして「もっと良い方法はないか」「もっとスマートな方法はないか」と常に考えて創意工夫していく中でさらにスキルが磨かれていきます。

プログラマーは「楽をするために苦労する」というぐらい大きな処理のための小さな処理をたくさん作ったり、実際にコーディングをするよりも考えている時間の方が長いことが多い職種です。

プログラミングの基礎を学習した後は実践あるのみです。

実践の中で発想力が培われます。

プログラミング初心者はどんどんコーディングして色々なコードに触れましょう!