ウォーターフォール方式に関する記事を読んだ

 周回遅れもいいとこだけど、SIer的には気になる記事
  私は間違っていた。ごめん。ウォーターフォールは何のメリットも無い - メソッド屋のブログ

 「ウォータフォールは起源から異なっていた」の項でなるほどそうかと思いました。IT業界で使われるウォーターフォールに対しての誤解(要件定義してUI決めてSS書いて下流工程に流れていくのだがその過程は一回きりで戻らないことを想定、ではない)があるので手戻り厳禁ということになっているが、最初から過程をぐるぐる回す想定で少しずつ品質を上げていくようにすれば手戻りも少なくて済むよという話。多分

 ところですごくアホっぽいこと書くけど、手戻りが発生した場合なんで余計に工数掛かっちゃうんだろ。あらかじめ考えておかなくてはならなかったことが抜けていたから途中までやってたことが無駄になってしまうということだろうけど、それを最初から考えていたとして、その分が手前に上乗せされるってだけの話ではないのだろうか。他チームとの折衝を怠ってI/Fが合わないとかいうことならわかるけれど、個人の担当で収まるとこならそこまで問題でもないような気がする。モチベーションが下がるのは否めないけど……

Excelでフォーマットを移し替えたいとき

 Excelで作成した資料を別のフォーマットに移し替えたいという場合、すんなりコピーできない場合がある。
 コピーしたはいいがセルの幅が違ってるせいで字がつぶれて読めなくなってるとか、セル結合してるところがやたら長くなってかっこ悪いとか、別のセルを参照していたところがセルがずれたせいで値が変わってしまって参照しなおさないといけないとか。
 僕の場合、そういう作業が素早く出来なくて平気で一時間二時間消費したりする。多分上司や残業代を出す側からしたらふざけんなだし、自分だってそうだ。そんな非生産的なことに時間を費やすぐらいならさっさと家に帰りたい。

 で、いい方法はないかなあ、と思って調べたらやっぱりあった。

 http://komitsudo.blog70.fc2.com/blog-entry-105.html

 図の貼り付け。ちぃ覚えた。
 移し変えた先で内容を編集しなきゃいけない場合には使えない小技だけど、フォーマットを変えなきゃいけないケースって見た目さえあってればいい(客先に紙媒体にして提出しなきゃいけないとか)って場合がほとんどだろうから、多分有用な方法。

 で、僕は今日この方法を知らなかったがために定時退社が出来なかったわけだが、この方法を知っていれば今日費やした二時間がまるまる浮いたわけだ。
 仕事が早い人ってこういうことをたくさん知っているんだろうな、と思う。それとも常識なのかなあ。

釈迦に説法

 一月から僕のチームに新しい社員が配属された。勤続15年超のベテランの方(名はS氏とする)で、立ち居振る舞いや言葉の端々から実力者であることがありありと伝わってくる。事実S氏が最初に担当した案件では、外部設計からコーディングまで二週間程度で引いた線表を一週間近く前倒して終わらせてしまった。
 現在僕と僕の上司が担当している業務があり、S氏には3月半ばからヘルプに入って頂く予定となっている。少々込み入った業務であるため、ヘルプがスムーズに行えるように仕様を噛み砕いた資料を作成しているのだが、上に書いたことが理由でこの作業が実に心苦しいものとなっている。
 前述の通りS氏は仕事の出来る方である。恐らく、僕の知っていることなど簡単に学び飛ばしていくだろう。仕様書やソースの在処は前もって伝えてあるので、下手をするとこちらが教えるまでもなくシステムの流れを理解してしまっているかもしれない。
 僕の作る資料なんて不要ではないのか、という話である。


 そんな資料に何らかの意味付けをしてみようと思う。
 例えばそれは、自分が今までやってきた業務を振り返るということだ。
 プログラムの流れを文章化していると、不意にタイプの手が止まる瞬間がある。仕様上、理解が曖昧な部分にぶつかるとそうなる。自分ではわかっているつもりでも、深い部分までわかっているわけではないから、文章に落とすことが出来なくなるのだ。
 そういう「ある程度」の理解でもプログラムの修正は出来るし、テストも出来る。だがいざその部分に対して突っ込んだ指摘をされると、すぐに言葉に詰まってしまう。どこぞの数学書の言葉を借りれば『ゆるゆるで、あまあまな理解』ということになる。
 そういう中途半端な部分を洗い出し、再度学び直すことで、より深い理解が得られる。そうすれば他人からの厳しい指摘にも自信を持って対応出来るようになるし、説明資料の精度も上がるはずだ。


 正直、S氏に業務を教えるというよりは、逆に胸を借りるようなつもりでいる。
 相手が相手なのでそれくらいの方が気が楽だ。

何をするにしてもエンタメ的視点は大切なんだろう

 2008年10月からこっち、C言語の学習をするつもりだったのに一切手を付けられていない。学習の成果物として、元々会社に提出する予定でひとつ真面目なプログラム(テキストファイルを読み込んで整形し、HTML形式で生成するツール)の作成を考えていたのだけれど、どうにもモチベーションが上がらない。
 余りにもやる気が出なさすぎるので、開き直ってADVっぽいRPGを作ることにした。といっても、大掛かりなものを計画してもすぐに挫折するのが目に見えているので、規模は限りなく小さめ。
 プロトタイプとして、外部からテキストファイルを読み込んで画面に表示し、その後バトル画面に遷移するような処理を組むつもりでいる(実際に戦闘を行えるようにするのは、また追々の話)。
 簡単に書くとこんな感じ。


 スライムが現われた!
  ↓
 バトル画面開設
  ↓
 コマンド?


 恐ろしい程に単純な処理なのは自分でも解っているが、何しろ僕のC言語に関するノウハウが極めて少ないため、こんなものでも意外に時間を食ってしまう可能性はある。何しろGUIウィンドウの表示方法すらろくに知らない程だ(ちょっと調べた限りでは、意外と簡単に出せるような気がしているが……。)
 だが、真面目なプログラムを考えている時よりもずっとやる気が出ていると自分でわかる。子供の時分からテレビゲームには慣れ親しんでいるので、自分の中での具体的なイメージが組み易いのだろう。
 とはいえ、熱しやすく冷めやすい自分のこと。モチベーションがまた下がってしまわないうちに形にしておきたいところだ。

IPアドレスに惑わされる

 職場のパソコンを立ち上げると、突然IPアドレス競合のエラーメッセージが出現した。
 現在の職場のIPアドレスは総務部で一括管理されており、どの端末にどのIPが割り振られるかということも厳密に決められている。ただし、アドレスの設定自体は各々の利用者が手動で行うため、入力ミスが発生する可能性も当然ある。
 自分のパソコンはここ数日立ち上げていなかったため(なぜなら試験用端末だから)、手違いでIPを書き換えてしまったということは有り得ない。事実、ネットワークのプロパティから確認した当端末のIPには、ちゃんと管理された通りの値が設定されていた。
 どこかの誰かがIPを振り間違えたのか? 総務部に質問を投げた所、ちょっとうちでは解らない、との返答。仕方がないので総務部管理の端末IP一覧表を参照し、一件一件に対してpingを投げることにした。
 最初は競合端末の電源を落とし、その端末のIPに対して。返答あり。やはり誰かが使っている。
 次に、当該IPと前後の連番になっているIPを所有する端末に対して(100.10.1.20だとしたら、19とか21)。やはり返答あり。pingアドレスにマシン名を打ち込んでみたが、同じ返答が戻ってきた。
 本当に二重で使われているのか? 疑問の湧きだした手が、あるpingの実行後で止まった。

 pingの飛び先がおかしい……。

 投げたpingは100.10.1.057(勿論仮の値)。だが、ping送信先が100.10.1.47になっていた。
 僕はどこにpingを投げたんだ? 再度確認。今度は100.10.1.060。送信先は100.10.1.48。もう一度、今度は100.10.1.048。すると送信先が100.10.1.48になった。


 何これ?


 慌ててgoogle先生にお伺いを立てる。わかりやすいサイトが引っかかった。→http://oshiete1.watch.impress.co.jp/qa4088524.html

 -------------引用------------
  前ゼロがつくと8進数表記とみなされるから。
  (1×8)+1=9,(2×8)+2=18,(3×8)+3=27,(4×8)+4=36
 ---------引用終わり----------

 だそうで。
 確かに8進なら57は47、60は48だ。48が40にならないのは何故だ、と中の人がアホを発揮しかけたが、冷静に考えれば8進数で8が来るとか有り得ない話である。どうやら入力値が一桁分でも8を越えた場合は10進数扱いになるらしい。
 しかし、そう考えると疑わしいIPのパターンが増えてくる。すなわち、IPを振った人間がこの事を知らず、自分のIPに対して前ゼロを付与していたとしたら?
 僕のマシンのIPは100.10.1.72だ(くどいようだが仮の値)。72を8進数で表すと110。前ゼロを付与して0110。つまりIPが110の端末を使っているユーザが最も疑わしいということ……!


 ………。


 んなわけあるかい……。


 そんなところでオチに入る。
 虱潰しに全てのマシン名を探索したところ、まったく違うマシンが引っかかっていた。
 その端末はテスト環境用の端末であり、テスト期間を除けば滅多に起動されない代物だった。恐らくずっと以前からこの端末には間違ったIPが振られていたのだろう。折しも職場は先日からテスト期間に入っていた。問題の発生条件が整っていたわけだ。


 以上、どうでもいい事で随分時間を無駄にしてしまった一日の話。
 プログラミングを仕事にしているとまれにこういう事象に見舞われる。原因不明のバグの調査なんかが最たる物だ。原因が不明すぎると胃が痛むのも事実だが、必要な事実と無関係な事実との入り交じり具合が現実で体験するミステリのようで、少しだけ楽しくもある。

キャストに関して素人丸出しの勘違いをしていた件

 仕事でJavaを扱っていた際、キャストの考え方に関して大いに勘違いをしていたことに気付いた。
 以下、現象を説明する適当なコード。

                                                                                • -
class A {
	// 何もしない
}

class B extends A {
	private String strB;

	public String getString(){
		return strB;
	}

	public void setString( String strB ){
		this.strB = strB;
	}
}

public class MainClass {
	public static void main( String[] args ) {

		B clsB = new B();

		// Bに適当な値をセット
		clsB.setString( "仕事辞めたい" );
		
		// メソッド呼び出し
		caster( clsB );
	}
	
	private static void caster( A clsA ) {

		String strMain;
		
		// ここでエラー
		strMain = (B)clsA.getString();
		
		// 取得した値を出力
		System.out.println( strMain );
	}
}

  出力結果
    C:\practice\java\practice>javac MainClass.java
    MainClass.java:34: シンボルを解決できません。
    シンボル: メソッド getString ()
    場所    : A の クラス
                    strMain = (B)clsA.getString();
                                     ^
    MainClass.java:34: 互換性のない型
    検出値  : B
    期待値  : java.lang.String
                    strMain = (B)clsA.getString();
                              ^
    エラー 2 個
                                                                                • -

 呼び出し元からの引数が親クラスの型で送られてきているが、使用したいメソッドは子クラスの中で設定されているため、キャストを行う必要がある、という場合。


  strMain = (B)clsA.getString();


 動作のイメージとしては、clsAをB型にキャストし、変換された後の型でgetString()を呼び出し、その値をstrMainに対して引き渡す――という流れにしたつもりだったのだけど。
 解答を探して手元のC++の本(なぜJavaじゃないんだ?)のキャストの項を見てみると、この括弧は通常の演算子ではなく、キャスト演算子であることを示すためのものである、との記述があった。というわけで、


  strMain = ((B)clsA).getString();


 こうすると無事コンパイルが通った。


 わかってみれば、何ともしょぼい所で躓いていたのだなあ、という気がしてくる。
 普段から趣味やら何やらでコーディングをやっている人なら、多分こういうミスは起こさないのだろう。経験不足が身に沁みる。

2009年4月までの間にしなくてはいけないことリスト

 リスト。

  1. C++
  2. Java
  3. Oracle Master Silver

 1は自分の勉強用(つまり趣味の世界)で、2と3は会社都合。Javaの方は4月までの間にSJC-Pの資格試験を受ける予定になっている。
 SJC-PってJavaのバージョン毎に別の資格として扱われるらしいけど、僕が受験するものは1.5でいいのだろうか? まあ、1.4.2からの変更点なんて大したものはないんだろうけど。


 C++にしてもJavaにしても、基礎的なことしかやっていない上に表面的なことしか理解できていないので、試験として体系的な知識を問われると厳しそう。
 インスタンスやクラスの概念程度なら問題ないけど、マルチスレッドとかインタフェースとか言われると頭が痛くなってしまう。幸い手元にJavaの本があるので、頑張ってはみるつもり。