Excel 列名変換問題やってみた2011年11月12日 16時50分01秒

問題1: Excel列名変換問題
  • 仕様
    • 入力されたアルファベットを数字に変換する。
    • 変換ルールはExcelの列名と同等。
    • 例) A=1、B=2、Z=26、AA=27、XFD=16384
  • 起動時引数
    • [0] アルファベット (A~ZZZZ...[上限なし])
  • 実行例
    • ExcelColConv.pl A → 1
    • ExcelColConv.pl AA → 27

問題2: Excel列名変換問題(逆変換)
  • 仕様
    • 入力された数字をアルファベットに変換する。
    • ただし、問題1で作ったプログラムを拡張すること。
  • 起動時引数
    • [0] 0=数字へ変換、1=アルファベットへ変換
    • [1] 変換する数字またはアルファベット(どちらも上限なし)
  • 実行例
    • ExcelColConv.pl 0 AA → 27
    • ExcelColConv.pl 1 27 → AA

90分はかからなかったけどなぁ… まぁ、時間なんてちゃんと測ってないけど。

use strict;
use warnings;

sub exCol2Num ($) {
    my $col = shift;
    $col =~ /^[a-z]+$/io or die "Invalid Excel colmun name '$col'";
    my $num = 0;
    for my $letter ($col =~ /[a-z]/igo) {
        $letter = uc $letter;
        $num = $num * 26 + (unpack('c', $letter) - unpack('c', 'A') + 1);
    }
    $num;
}

sub num2ExCol ($) {
    my $num = shift;
    $num =~ /^\d+$/io or die "Invalid number '$num'";
    $num == 0 and die "Can't convert 0 to Excel colmun name.";
    my $col = '';
    do {
        my $subnum = $num % 26;
        $subnum = $subnum == 0 ? 25 : $subnum - 1;
        $col = pack('c', $subnum + unpack('c', 'A')) . $col;
    } while (($num = int(($num - 1) / 26)) > 0);
    $col;
}

my ($mode, $input) = @ARGV;
my $result =
    $mode eq '0' ? exCol2Num $input :
    $mode eq '1' ? num2ExCol $input : die "Unknown mode parameter '$mode'";
print "$result\n";

まぁでもよい問題ですた。

最近買った本、捨てた本2011年09月04日 16時43分11秒

仕事部屋を片付け中なんですが、疲れたので一休みがてらブログでも…。

最近買った本

会社の会計期が変わったので、参考書を 2冊ばっかし買いますた。わーい、昨期は赤字だー (泣

  • Android NDK ネイティブプログラミング

    会社での当面の主要テーマと称して、otoco という音楽制作・再生環境システム・ライブラリ群 (予定) を開発 (しようと) しているわけですが (全然着手できてないけど T-T)、将来的にこいつを Android に移植する可能性を鑑みて (というか妄想して) 今のうちにある程度勉強しておきたいなー、と購入。

    なんだかおいらの予想に反して結構な勢いでフィーチャーフォン(笑) がスマートフォンに置き換えられて行っているようなので (あんまり望ましい進行状況では無さげですが… 商習慣含めて)、当初予定していたケータイゲーム SNS 向けゲーム開発プロジェクトも中止にして Android アプリ開発に注力しようかなという魂胆でもあります…。まぁ iPhone でもいいんだけど。

  • Android Hacks —プロが教えるテクニック & ツール

    で、NDK の解説書だけだと Android での開発における基本的な文化というか慣習を身につけるのは困難だと思ったので、それほど古くない範囲で Android での開発に関するトピック全般を網羅的にかいつまんで解説してくれていそうな本書を合わせて購入。当面はこっちを読み進めることにしています。

    開発環境ぶち込んでエミュレータぶち込んでとりあえず動くものから代表的なライブラリを扱ったものまで作って覚えて NDK とかにももちろん踏み込んでいてさらにデバッグに関するアドバイスとかまで押さえてくれているっぽいです。さすがは安心の O'REILLY ブランド。

最近捨てた本

っていうか、今日の片付けで捨てることにした本です。明日の資源ゴミに出す予定。

  • Networking Linux

    何でこんなのずっと持ってたんだろう…。 1997年に刊行された本です。流石に古い…。

    いや、なんぼ古くてもネットワークの基礎知識として体系的に学べるような本であれば捨てることはないのですが、内容的にはモデム接続の時代にローカル PC に Linux を入れて PPP 接続することを前提とした解説書なので、DSL 接続に必要な情報ではないし、 BIND (named) とかにも触れてないし、メールサーバーは Sendmail オンリーだし… といった感じだったので、流石に捨てちゃうことにしました…。

    ネットワーク周りの知識は正直あんまり自信がないので、ちゃんと体系的に学べる本が欲しいんですけどね…。

  • Vine Linux 2.1システム管理ブック

    未だに Vine とか使ってる人いるの? っていう… これも相当昔に買った本です。捨てずにいた自分にも驚きですが、ちゃんと Amazon で検索して Hit する (しかも画像もちゃんとある!) ことにさらに驚きです (苦笑)。

  • PERLクイックリファレンスPerl5.6完全リファレンスブック

    前者は確かラクダ本と間違えて買った本ですw。後者は Perl5.6 が出た後にいち早く出版された本で、情報管理社さんの思惑通りに掴まされましたw。いずれにせよ、この手のリファレンスは perldoc にアクセスすれば十分なので (完全ではないけど日本語訳も充実してるし)、古くなってきたし、もう持ってる意味ないかな、という感じです。

  • MySQL徹底入門―ウェブに最適な高速フリー・データベース・サーバー

    この本、もう第3版まで出てるんですね。最新版ではもうちょっとマシになってるんでしょうか? 少なくともこの最初の版は、はっきり言ってセキュリティーホールそのものでしたね。ネット上で prepared statement 使えよっていう議論が盛り上がるよりずっと前の本だったので仕方なかったのかもしれませんが…。

  • HTMLポケットリファレンスJavaScriptポケットリファレンス

    もう、ゴールしてもいいよね…。

    まぁ古いというのもそうなんですが、最近はこの辺は専ら Web 上の情報を参照しています。そっちの方がむしろ正確だったりするんですよね…。 HTML と CSS はとりあえず閲覧性の高いとほほのWWW入門、正確な仕様を確認したい場合は W3C が公開している勧告仕様、 JavaScript は MDC や、 DOM ならやっぱり W3C のこの辺のテキスト辺りを見に行けば大体事足りちゃうので…。

  • 入門CVS 第2版

    sshd_config の書き方とかもあって結構参考になったのですが、今は専ら Subversion (+Trac) を使っていて、流石にもう使うことはないかな、という感じなので…。さらに git に移行すべきかどうかも思案中だったりはするのですが…。

  • 入門 Ajax

    買ったはいいものの、序盤で掲載されている「簡易クロスブラウザライブラリ」という名のオレオレライブラリに辟易してあんまり読んでいません。それだったらもうちょっとまともなライブラリ拾って使うよ、っていう…。

  • 改訂新版 基礎PHP

    当時仲間内で PHP を使うことがあったので買ったんですが、 PHP5 対応を謳いながら内容的にはほとんど PHP4 で止まっている感じで、もうちょっと新たに盛り込まれた言語仕様を活用して愉しみながら楽をしようという発想には至らないものかと首をもたげた覚えしかないです…。 PHP 絡みで優良なリファレンスって公式マニュアルだけなんじゃないかな… いやその公式も結構怪しいもんだけど…。

    その後、おいらもどちらかというと PHP を dis る勢力に荷担することになるわけですが、最近は modern perl と似たようなノリで Modern PHP Programming を謳う勢力も出てきているようで、 PHP プログラミングの慣習も大分まともなものに様変わりしつつあるようですね…。そういう意味でももはや過去の情報となった本書は紙資源へとリサイクルされるべきなのでしょう。

  • 基礎からのJava2

    古いってのもあるんですが、他にも Java の参考書は持っていて、内容的に被るので、より古くて内容の薄い本書は廃棄することに…。つってももう一つ持ってる方も相当古いんですけどね…。

    Android の開発が基本的には Java が主体になるので、できれば Java 言語をちゃんと学べる本 (で、比較的情報が新しいもの) が欲しいんですが、結城さんの本も望洋先生の本も内容が 4~6年前ぐらいで止まっちゃってるのでどうしたもんかなぁ…でも洋書に手を出すほどの元気もないし…っていう。

目的指向プログラミング2010年08月14日 13時53分57秒

からリンクを辿って

を読み、ブクマで糞を投げてみたものの、年配の日本人プログラマーにおいては割とありがちな傾向なのではないかと思うところもあり、ちょっと書いてみようかしらとか思った次第。

オブジェクト指向にありがちな、それもとっても日本人的な誤解のひとつに、「オブジェクト = 物、物体」という解釈があると思う。確かに object という英単語には「物、物体」という意味があるのだけれど、実際には物体を表現しているわけではないオブジェクトについてまで、それを物体だと見立てて思考展開するんだ、と無理矢理自分を納得させながら Java や C# やその他のオブジェクト指向 (に対応した) プログラミング言語で頑張っている人って、実は若手でも少なくないんじゃないかと思う。

object という英単語には他にも「対象」や「目的、目標」などの意味がある。そのことを踏まえた上で、オブジェクト指向による設計について考えてみて欲しい。

例えば Window という名前のクラスがあるとする。このクラスの概要を説明する際、大抵の人は「ウィンドウを表すクラス」と書いてしまうのではないかと思う。これは多分、「オブジェクト = 物、物体」という前提をかなり意識した書き方だと思う。

あるいはポリモーフィズムを意識している人ならばもう少しマシに、「ウィンドウを表す基本クラス」などと書くかも知れない。そして派生クラスとして、FrameWindow があったり、 DialogBox があったり、はたまた見た目にも概念的にもウィンドウとは似ても似つかない FormControl なんてのがあったりするかも知れない。それでもこれらは「ウィンドウを表すオブジェクト」の一種をインスタンスとして生成するためのクラスとして扱われることになる。

まぁでもここまでは、それはそれでいいのかも知れない、とある程度納得できてしまうレベルの話なのかも知れない。フォーム部品もウィンドウの一種だと無理矢理納得することが、思考展開する上で圧倒的に不可能なことだとは思わない。でもそう思えるのは、これらは実行したときに、画面上で割と物体っぽく振る舞う概念だからなのではないか。

ちょっとしたゲームを作ろう、ということになって、その設計を考えたときに、そんなにたいそうなプログラムになるわけでもないし、ということで、実行時のシーンに応じてクラスを分けてみよう、と考えたとする。例えば以下の通りだ。

  • GameTitle
  • GamePlay
  • GameOver

名前を見ただけで、これらのクラスの「役割」は理解できると思う。GameTitle クラスはゲームのタイトルを表示する。プログラム実行時に最初に呼び出されるシーンだ。GamePlay クラスは実際にゲームを遊ぶプレイ中の制御処理を行う。タイトル表示シーンから特定のコントロール操作 (「start」ボタンを押す、等) により呼び出される。GameOver クラスはゲームオーバーになったときに行われる動作だ。スコアを表示したり、ハイスコアランキングに登録したり、といった処理が考えられる。

そもそもこのような設計手法は妥当なのか? 現実問題としてこのプログラムを実行時のシーンに応じてモジュール分けすると言うことは十分考えられることなので、少なくとも手段のひとつとして絶対にあり得ないと言うことはないだろう。個人的にはこれはこれで十分アリだと思うが、実際の開発においてはチームで議論するなり、リーダーが自身のセンスに基づいて主導するなりすればよいことだ。閑話休題。

さて、これらのクラスの概要を書くとしたら、あなたはどんな風に説明するか? 「ゲームタイトルを表すクラス」? 「ゲームプレイを表すクラス」? 「ゲームオーバーを表すクラス」? どれもクラス名以上のことは書いていない。そろそろ、「○○を表すクラス」論法は無理が生じてきていると言えるのではないだろうか?

それよりも、「本クラスにおいて、」と前置きして (あるいはそう前置きされている物と仮定して)、「ゲームタイトルのアニメーション表示を実装する」、「ゲームプレイ中の中枢的な制御を実装する。具体的には以下の制御が対象となる: …」、「ゲームオーバーの処理を実装する。ハイスコアランキングの登録を含む」などと説明した方が、すっきりするだろう。

オブジェクト指向の「オブジェクト」とは、観念的に「物」や「物体」を表すことを指す、と考えるより、設計においてプログラムを個別の部品というかモジュールに分ける際に、そのモジュールが何を「目的」として実装されるのか、そのモジュールが「目的」としている「対象」は何なのか、をはっきりさせるための、プログラミング上での表現手法、と考えるべきだ。

生成されるインスタンスを観念的に「物」と言い表すことはできるかも知れないが、オブジェクト指向プログラミングにおいて重要なファクターは、必ずしもそこだけではないはずだ。「クラスもインスタンスも両者を含めてオブジェクトと言います」なんて説明で日本人プログラマーをはぐらかすのはもう止めよう。オブジェクト指向とは、プログラムを「目的」単位でモジュール化する手法である。その単位こそが (文字通り) クラスであり、従ってクラスの説明は実装の目的を記述することであるべきだ。

そのことを念頭に置き、そうした観念に頭が慣れるまでは、「オブジェクト指向」という語は封印し、代わりに日本語で潔く、「目的指向」と言い表すようにした方がよいのではないか、と提案する次第なのである。

JavaScript: どんな型の値でもとりあえずメンバフィールドに値を突っ込んでみるテスト2010年08月05日 13時06分43秒

えー。長らく更新をサボって申し訳ない。しかも今回の内容は完全に個人的なメモなのでなおさら申し訳ないw

JavaScript って割とオブジェクト指向的な性格の強い言語だと思うんだけど、いわゆるオブジェクト型の値に限らず、関数型の値であってもメンバフィールドを持つことができたりして、その辺どうなっているのか、っていう辺りを整理しておきたかった。

で、以下のような HTML を書いてみたわけだ罠。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0//EN">
<html>

<head>
	<meta http-equiv="content-type" content="text/html; charset=UTF-8">
	<meta http-equiv="content-style-type" content="text/css">
	<meta http-equiv="content-script-type" content="text/javascript">
	<title>member field test</title>
    <script type="text/javascript" language="JavaScript"><!--
window.onload = function() {
    var table = document.getElementById("result");
    if (table.firstChild.nodeName.toLowerCase() == "tbody") // IE6 対策
        table = table.firstChild;
    var testdata = [ 1, "", true, undefined, null, Infinity, NaN, function() {} ];
    for (var i = 0; i < testdata.length; i++) {
        var tr = document.createElement("tr");
        // 値を表示
        var td = document.createElement("td");
        td.appendChild(document.createTextNode(
            typeof testdata[i] == "function" ? testdata[i].toString() :
            typeof testdata[i] == "string" ? '"' + testdata[i] + '"' :
            testdata[i] === null ? "null" : // Gecko はこうしないと空欄になっちゃうので…
            testdata[i]));
        tr.appendChild(td);
        // 型を表示
        td = document.createElement("td");
        td.appendChild(document.createTextNode(typeof testdata[i]));
        tr.appendChild(td);
        // フィールドへの代入を試みる
        td = document.createElement("td");
        var result;
        try {
            testdata[i].hoge = "Hoge!!";
            result = testdata[i].hoge;
        }
        catch (ex) {
            result = ex.toString();
        }
        td.appendChild(document.createTextNode(result));
        tr.appendChild(td);
        table.appendChild(tr);
    }
};
    //--></script>
</head>

<body>

<table id="result" frame="border" border="1" rules="all">
  <tr><th>値</th><th>型</th><th>x.hoge</th></tr>
</table>

</body>

</html>

結果はこんな感じ。一応 IE6、Firefox、Safari にて動作確認済み。

結論をまとめると以下の通り。

  • ブラウザ間で動作の差異は見られなかった。
  • null の動作が意外なほど undefined の動作に酷似している。オブジェクト型のくせに。ていうか、全くの別物なのに。
  • メンバフィールドに入れた値をその後も利用できるのは、通常のオブジェクト型の値を除けば関数型の値のみ。
  • 数値、文字列、真偽値については、メンバフィールドへの値の代入のようなことをやっても例外は発生しない。が、あとでそのフィールドを参照すると undefined が返される。中途半端な動作だな。 undefinednull は代入しようとした時点で例外が発生。
    • ついでに言うと、undefinednulltoString() メソッドを適用することもできなかった (例外を送出する)。undefined についてはそも値ではない (より厳密には「インスタンスではない」) からということで納得がいくんだが、null についてはなんだろ…オブジェクトなんだけどオブジェクトじゃないものであるということをことさらに表現したい、ってことなのか??

問題を生じる可能性のあるアドオン2009年10月17日 13時37分47秒

Firefox の主張

これ、どちらも Express 版の Visual Studio と一緒にインストールされたものだと思うのだが (製品版でも入るのかな?)、今日 Firefox を起動したらこんな alert が表示されて、ブロックされてしまいました。もともとこいつら 3.5 には対応していなかったよーな気もするんだが… (WPF はんなことなかったっけかな?)

IE のテーブルセルに width スタイルを指定する気力が失せる例2009年04月23日 11時13分33秒

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>

<head>
	<meta http-equiv="content-style-type" content="text/css" />
	<title>teble cell width test</title>
	<style>
table {
	width: 100%;
	border-collapse: collapse;
}
table td, table th {
	border: 1px solid #666;
}
table th {
	width: 10ex;
	background: #cef;
	text-align: right;
	padding-right: 1ex;
}
table td {
	text-align: left;
	padding-left: 2px;
}
	</style>
</head>

<body>

<table>
  <tr>
    <th>name</th> <td colspan="3">T.MURACHI</td>
  </tr>
  <tr>
    <th>age</th> <td>31</td>
    <th>sex</th> <td>male</td>
  </tr>
  <tr>
    <th>comment</th>
    <td colspan="3">
      Hi! I'm a fat programmer.
      I like music, playing, listening, singing, and so on...
      I own a company named "Harapeko Inc."
    </td>
  </tr>
</table>

</body>

</html>
  • Firefox での表示例:
    firefox で表示
  • Safari での表示例:
    safari で表示
  • IE7.0 での表示例:
    IE7 で表示

結論: 神は死んだ

…いや、とぼけている場合ではなくて、この現象、ネットでうまく検索することができないので、対策が分からずにいます。誰か教えて下さると有り難いデス…。

Visual Studio で日本語を入力すると「アクションが完了できませんでした。」と怒られたりする。2009年01月22日 16時50分13秒

とってもうざいアラート。

Visual Studio 2008 Express Edition の Visual Web Developer 2008 を使用しているのですが、 Javascript ファイル (.js ファイル) の編集中に、特定の日本語を入力した際、アラート「アクションが完了できませんでした。」が表示される。例えば、「時刻」の「刻」の時が入力されたときにこのアラートが表示される。「刻一刻」のように入力すると、最初の「刻」の字がエディタに反映されるタイミングで 1回と、次の「刻」の字がエディタに反映されるタイミングで 1回の、計 2回表示される。

コメントを入力中にひっきりなしにアラートに遭遇するため、はっきり言ってうざい。生産性が著しく低下する。でも整形ルールをこいつのエディタにお任せしちゃっているので、今更他のエディターを併用するのも面倒くさい。ぐぐってみたけど、特に情報も出てこないので困った。似たような症状に見舞われた方、何か情報を提供していただけると助かりまする…。


2009年 1月 24日 土曜日 18:10:27 JST - 追記

id:dsl さめが追加調査をしてくださいました。多謝!!

  • Unicode の下位オクテットが 0x3B となるような文字で再現する模様。
    • この中の「画」の字は当方でも当初より再現を確認していました。
  • 再現するのは一行コメントを入力中のみで、リテラルや C のコメントを入力中には再現しない (これは手元の環境でも確認しました)。
  • 下位オクテットが 0x3B ではない字でも再現するものが存在する模様 (「好」など)。

あんまりしつこく原因探っても仕方ないような気もしてきたw やっぱり .js ファイルの編集だけ他のエディター使って凌ごうかなぁ。あるいはいっそのことおいらも Eclipse に乗り換えるか…。

ちなみに Javascript (in HTML) で記述されていた力作ですが、 Perl の場合だとこんな感じで書けるっぽいです。

$ perl -MEncode -e 'print encode("UTF-8", pack("U", ($_ << 8) + 0x3b)) for (0..0xff); print "\n"'

ただ、結果がこんな感じで激しく乱雑になったりする訳ではありますがw

;ĻȻ̻лԻػܻ࠻ऻ਻଻఻഻฻༻ျᄻሻጻᐻᔻᘻ᜻ᠻ᤻ᨻᬻ᰻ᴻḻἻ※℻∻⌻␻┻☻✻⠻⤻⨻⬻ⰻⴻ⸻⼻〻ㄻ㈻㌻㐻㔻㘻㜻㠻㤻㨻㬻㰻㴻㸻㼻䀻䄻䈻䌻䐻䔻䘻䜻䠻䤻䨻䬻䰻䴻主伻倻儻刻医吻唻嘻圻堻夻娻嬻尻崻帻弻总愻戻挻搻攻昻朻栻椻樻欻氻活渻漻瀻焻爻猻琻画瘻眻砻礻稻笻簻紻縻缻耻脻舻茻萻蔻蘻蜻蠻褻註謻谻贻踻輻逻鄻鈻錻鐻锻阻霻頻餻騻鬻鰻鴻鸻鼻ꀻꄻꈻꌻꐻꔻ꘻ꜻ꠻ꤻ꨻ꬻ갻괻긻꼻뀻넻눻댻됻딻똻뜻렻뤻먻묻밻봻븻뼻쀻섻숻쌻쐻씻옻윻젻줻쨻쬻찻촻츻켻퀻턻툻팻퐻픻혻휻��������;;碌層כּﰻﴻ︻[

…ってそこ、張り合うところじゃないから! >ヲレ (^_^;A

ブログ内スクリプトが Firefox 3 でも動くようになったー2008年12月06日 19時25分19秒

Firebug でエラーが出てる正確な場所を突き止めることができたので追ってみたら、スタイルシートにスタイルを追加している部分で複数あるスタイルシートすべてに同じスタイルを追加しようとしていて、それでこけてたらしい。最初に見つけたスタイルシートにだけ書き込むようにしたら動くようになった。よかったよかった。

Ubuntu 入れてみた。2008年11月13日 16時24分34秒

あんまりにもあっさり入ってしまうんで逆に怖くなるんですがw

しばらく腰を据えて使いつづけてみますかな…。


2008年 11月 14日 金曜日 00:45:02 JST - 追記

オンボードのサウンドデバイスがあるマシンで別途サウンドデバイスを増設して使用したい場合、オンボードのサウンドデバイスを BIOS の設定で無効化しないといけないらしい。Windows だと両方同時に使えたりするんだけど、この辺はもう Linux カーネル 2.6 の制限事項、なのかなぁ。 2.4 + ALSA のときは両方同時もいけたような気がしたんだけど…。

あと、ネットで拾った PDF ファイルでうまく閲覧できないのがあった。これなんだけど、日本語部分がまったく表示されない。多分フォントの問題だな。うちの会社の決算報告書は問題なく見れたけど。

デスクトップアプリも概ね充実してる。動画とかも大抵のファイルはそのまま見れちゃう。.fla とかも見れちゃう。knoppix では見れなかったからこれはちょっと嬉しかった。うん。もうちょっとゆっくり使ってみますw


2008年 11月 14日 金曜日 10:58:53 JST - 追記

Ubuntu には標準で PulseAudio というサウンドマネージャが入っていて、アプリケーションごとの音量コントロールとかができるようになっているらしいんだけど、各方面で重い重いと結構不評らしい。まぁ重いのも厭なんだけど、それ以前においらが使っている Delta 66 が PulseAudio と相性が悪いようで、 PulseAudio のプロセスが生きている間は音が鳴らないという有様だった。

で、これは PulseAudio を削除すれば解決するんだけど、Ubuntu 8.10 だと PulseAudio を起動しようとするセッションスクリプトを自分で削除する必要がある。その辺のやり方も含め、やり方が書かれているブログがあったので紹介します。超絶感謝 m(_ _)m 。

「妄信」とやらがプログラムを「複雑」にするという迷信2008年10月27日 16時04分38秒

職場からなので簡潔にw

  1. 「変数のスコープは狭いほど良い」と妄信する
  2. 「同じロジックのコードを2度以上書くな」と妄信する
  3. 「プログラミング言語を極めるのが大切」と妄信する

変数でもメソッド名でもクラス名でも言えることだが、単純に「スコープは狭いほどよい」という方針でプログラムすると、逆に保守性も可読性も悪いプログラムができあがることがけっこうある。

同じようなパターンがプログラムの複数箇所に現れる場合、それらを抽象化して一つの共通ロジックへのパラメータ渡しとして実装し、それを複数箇所から呼び出すように実装すると、プログラムコード量が小さくなり、保守性が良くなったような気がするので、未熟なプログラマが、なんでもかんでも共通ルーチン化しまくって、非常に保守性の悪いプログラムにしてしまうことがある。

レベルの高いエンジニアは、同じロジックのコードが複数箇所に現れている方が、適切な判断の結果であることはけっこうあるということをよく知っている。

とりあえずこの、最初の二つ。個人的な経験においては、この二つでそれほど困ったことになったということって、実はあんまりない。それは、多分、おいらの個人的な仕事経験において、こういうことで困るほど、周囲の方々に能力的に拙い方が多くいらっさるような現場に、お世話になっていたということが、まったくと言っていいほど無かったからなんだと思う。

そういう意味ではおいらはこれまで非常に幸運なんだけれども、反面、そういう意味での不幸な状況というのは、個人的には異常事態なんじゃないか、とも思う。

とりあえず、シンボルのスコープは必要以上に大きくなりすぎないように気をつけようとか、安易なコピペはなるべく避けよう、といった指針は、作業効率を考慮した場合において、逆の指針にしておくより明らかに安全であるはずだ。もちろん、「無理に」スコープを狭くしようとしたり、「無理に」抽象化しようとしたりさえしなければね。逆に言えば、無理のないスコープの限定の仕方、無理のない抽象化の方策が考えつくのであれば、多くの場合、これはやるに越したことはない。初心者の方がこういう部分でトライ&エラーに躍起になるのは、おいらが上司なら応援したいところだし、それが原因でスケジュールに多少の支障をきたしたとしても、かばってあげたいと思う。各人の戦力を考慮し、そういう部分も織り込んだ上でスケジュールを組むのが、多分最も正しい。

セオリーとされる物事に対して、「必要以上に○○すべきじゃない」と言ってしまうのは、その○○に技術的な難しさを感じる「未熟な」プログラマーに、妥協の余地を与えてしまいかねない。プログラマーとして、技術者として先輩風を吹かせたいのであれば、そう言う部分については政治的な考慮がもう少しあってもいいんじゃないかなぁ、とは思った。

一方で、この件に関して大きく対立する意見を表明されている方がいらっしゃるんだけれども、

まず,実際には多くのフレームワークやライブラリを用意するだけで事足りる場合が多い.独自の言語仕様を制作するのは『車輪の再発明』でしかなく,作られた言語は一般的に普及した言語に比べより未熟で質が悪いことが多い.開発者にとってアプリのデバッグだけでなく言語のデバッグも同時に行うことは非常に大きな負担となる.なにより似て非なる二つの言語を覚えることは単なる時間の浪費だ.よほど大きなメリットがない限り,独自仕様『粗悪』言語の出番はない.

プログラミング経験がほとんどない初心者に毛が生えた人が,このように主張する事が多い.特に抽象の取り扱いは開発者の素質に大きく依存するらしいので,素質のない人がこういう結論に至るのは驚くに値しない.自分のプログラミングテクニックの未熟さを棚に上げて,抽象に責任転嫁することがないよう注意しよう.

ひじょーに Java 屋さんらしい意見だなぁとか思った。いや、厭味とかではなくて。世の中にはこういう技術者さんも確実に必要だと思う。

でも、「おいらは今 Lua でプログラムを書いているはずなのに、言語仕様には存在しない MVC モデルに躍起になっている…」なぁんて環境での開発を1年間ほど経験させていただいたりしたおいらとしては、言語拡張にも近い現場ルールの適用程度の「自由度」も楽しめないプログラミングというのも面白くないなぁとか思ってしまうしw、単に抽象化と言ってしまうよりもアクロバティックなテクニック (演算子オーバーロードとか TMP とかw) も、「正しく」活用できるところでは活用したいよなぁとか思う人なのでw、そういう意味では若干相容れないかなぁ、とか、ちょっと悲しいことを言ってみたりもするわけなのですよ。

よーするに論を決してしまうならば、言語仕様的にも設計テクニック、セオリー的にも間違っていない事柄について、知識も向上心も無い人たちを前提とした職場づくりというのは、下策なんじゃねーの? ということ。自分たちが現場において要求すべき技術レベルというのをある程度高めに設定したうえで、そういったレベルでの開発についていけない方々に、無理に仕事をお任せする必要もないんじゃないかなぁ。厳しいことを言うようだけれども。

もちろん、現場はそうせざるを得ないんだと断末魔を上げたい気持ちもよく分かる。そんな優秀な人を雇い入れるお金もない。でも、安全で住み心地の良い街に住みたいなら税を高くして福祉に金を賭けろ、って言う議論があるのと同様、モチベーションを維持しつつ気持ちよく仕事をしていきたいならば、経営者が従業員に金をかけるべきなのは至極当然なんだよね。本来そうやって技術に明るい技術者を育てたいなら、積極的に技術に明るい人間を雇い入れ、根っこから技術に特化した風土を社内に培っていかなきゃならないんじゃないかな。それが、技術で食っていく会社の、経営者の責任だと、おいらは思うわけですよ。

せめて、PHP で「関数の引数以外の場所での参照渡しは禁止」みたいな、あるいは値の型でモンゴリアン、じゃなかった、ハンガリアンの強制とか、そういう、優秀な人々の生産性を抑制するようなルール作りは、廃絶していくべきなんじゃあないかなぁ。