misc.log

日常茶飯事とお仕事と

プログラムのお仕事はロジックのストックが結構ものを言う

新人さんに少し伝えたところ感動されたのでメモしておきます……。

プログラミングを行う仕事をやっていると、「これ、以前もつくったよな……」というものに遭遇することが多々あります。もちろん完全に一致というわけではないのですが、なんとなく似てる、ちょっとだけちがう。そんなものが何度も出てきます。もちろん何度もやっているうちに作り方を覚えてしまって、ソラで作れるようになるという一面もありますが、そうはいっても作るもののバリエーションがあまりに多いですから、完全一致で丸覚えすることはそうそうありません。で、活きてくるのが「以前作ったモノのストック」です。

プログラムを作っていて一番手間なのが、コンピューターに指示をする「手順」、いわゆるロジックとかアルゴリズムと呼ばれるもの。これを考えることです。どんな場合でもこの手順に沿って作業すれば上手くいくよ、というような汎用性のある手順を、作業や想定される場面の漏れなく作るのは案外難しく、それをしくじった結果出てくるのが、いわゆるバグ、不具合というやつですね。なので、一度作ったり考えたロジックは、どこかに書き留めたり保存しておくとよいですよ、という話をしました。

私の場合はこのブログ自体がそういうストックになっていて、自分で検索して過去の処理を掘り返したりしています……。

Effective C# 6.0/7.0

Effective C# 6.0/7.0

たとえばこんな……「C#で、文字列から指定した検索語を全て探す」という処理。

// 重複したものを除外する
IEnumerable<string> distinctList = targetList.Distinct<string>();

int wordPosition = 0;
// Listで指定されたNG文字それぞれについて色替え処理を行う
foreach(string targetWord in distinctList )
{
    // 1回目の検索
    wordPosition = targetText.IndexOf(targetWord);
    while (wordPosition>=0)
    {
        // 検索対象文字が見つかった場合(結果が0以上の場合)
        // wordPositionに位置が入っているので、何か処理を行うならここに書く

        // 次の文字を探す(2回目以降の検索)。検索開始位置を、見つけた文字の次の場所以降にする。
        wordPosition = targetText.IndexOf(targetWord, wordPosition + targetWord.Length);
    }
}

C#のIndexOfメソッドは、不親切なことに指定した言葉が複数対象文字列に混じっていても、最初の1個しか探してきてくれません。なので、「見つけた文字の、さらに後から再度検索」を見つからなくなるまで繰り返す必要があります。が、この「さらに後から」が「文字数を足せばいいのか」「それとも、文字が0番目から始まるから1足したり引いたりするのか……」よく分からなくなるんですね。処理の仕掛けや概要は分かっていても、こういうの細かい所の動きを逐一ためしながら作っていると案外時間が掛かるものなのです。

で、こういう場面で「以前作って、十分テストして動きも問題ない」というプログラムの断片が記録してあると楽なんですよ。もちろん、使う場面に組み込む際に再度テストはしますが、それでも安心感がちがいます。

こういう「ロジックのストック」をブログとかで公開とかしてくれるようになってくれれば、情報発信も出来るエンジニアがじわじわと育つのだけど……。どうでしょうねぇ。