カテゴリ別表示

全体

最近の日記

仕事納め
12月らしく
年末
忘年会2
休み

最近のレス

なおき (12/9)
やす (12/9)
なおき (12/3)
しろへび (12/3)
なおき (11/25)

日記アーカイブ

2008年
1 2 3 4 5 6 9 10 11 12
2007年
1 2 3 4 5 6 7 8 9 10 11 12
2006年
1 2 3 4 5 6 7 8 9 10 11 12
2005年
1 2 3 4 5 6 7 8 9 10 11 12
2004年
1 2 3 4 5 6 7 8 9 10 11 12
2003年
1 2 3 4 5 6 7 8 9 10 11 12
2002年
1 2 3 4 5 6 7 8 9 10 11 12
2001年
1 2 3 4 5 6 7 8 9 10 11 12
2000年
4 5 6 7 8 9 10 11 12

管理人
naoki   [HP]
RSS FEED
149881
カテゴリ : プログラム

2008/02/18(月) 00:17:29
Maven雑論
Mavenはビルドに適したツールか?

http://www.infoq.com/jp/news/2008/02/maven-debate

僕はまだ、ビルドにMavenを使っていない。
多くの人が、Mavenに対する賛美と批判の声を送っている。
それを使うかどうかは、君次第だ。

2008/01/17(木) 20:24:03
jaxenバグ修正
とりあえずメモ。
jaxenのサロゲート判定にバグがある。
今回見たのは、最新版の1.1.1。

org.jaxen.function.StringLengthFunction
を見ると、140行目あたりに
    if (c >= 0xD800) {
とある。これは上位サロゲートを判定するものなのだが
正確には以下のようにしなければならない。
    if (c >= 0xD800 && c <= 0xDBFF) {
これでうまくいく。

ちなみに今回これが発覚したのは、jaxanを使ってるPMDで
バグ報告を受けたから。
日本語名の変数を使ってるときに、パーサが日本語を
違法サロゲートだと誤判定してエラーになってしまう。

例えば「D」の文字はUnicodeで0xff24なので
    if (c >= 0xD800) {
に引っかかってしまい次の文字が下位サロゲート(DC00?DFFF)じゃないと
「サロゲート違反だよ」ということでエラーになる。
にしても、下位サロゲートの処理は正しいのに
なんで上位サロゲートの処理だけ間違っているのか。

http://www.limy.org/program/articles/

ここに修正版の jaxen-1-1-1.jar を置いといた。
いずれjaxenにバグ報告しとかなきゃならないが
どうやらしばらく開発が止まってる様子。
再開してからにしよう。

2007/12/06(木) 21:31:48
苦戦中
久しぶりに家でプログラムに苦戦中。
今悩んでるのは、Apache - Tomcat 経由でURLを書き換える方法。
要するに…

http://www.limy.org/context/XXX/YYY

みたいなアドレスを

http://www.limy.org/context/id=XXX&value=YYY

のように置き換える。
Apacheだけだったら mod_rewrite 使えば一発。

ただ Tomcat 経由だと話が厄介になる。
もともと

http://www.limy.org/context/id=XXX&value=YYY

というApacheへのアクセスを

http://www.limy.org:8080/context/id=XXX&value=YYY

っていうTomcatのポートに繋いでいる(正確にはajpというコネクタを使用)
ので、mod_rewrite による書き換えはうまくいかない。
mod_proxy_jsp と mod_proxy_balancer を使ってやる方法がどっかのサイトに載ってたので
試してみたらうまくいって喜んでいたんだけど、
なぜかFirefox以外のブラウザから見ると失敗する。
全然糸口が見当たらないので別の方法を探すことにした。

Url Rewrite Filter っていうTomcat上で動くフィルタを発見。
これならうまくいくはずなのだが、今苦戦中。
とりあえず時間がないので今日はここまで。
残りは明日…あぁ、もっと先だな。また今度にしよう。

2007/05/29(火) 23:06:18
TopCoder
今日はTopCoderのCompetitionに初チャレンジ。
お題が3問出題されて、なるべく速い時間で解いた方が得点が高くなる。
が、回答が間違えていると得点は0。
だから確実に正解してることを確認してからSubmit(投稿)しなくちゃならない。

過去問題を何問か見てたけど、今回のはそれよりちょっと難し目だった。
1問目はすんなり解けたものの、2問目で苦戦。
ようやく解けたんだけ、うっかりミスがあって結局得点は0。
3問目にいたっては回答すらできなかった…
やっぱアルゴリズム問題っていうのは難しいね。

まぁ何はともあれ、これは面白い。
時間に追われながらコード書くのは精神的にちょっと辛いけど
それを上回る楽しさがある。
Competitionは毎週開催されるらしいから、これらも続けようっと。

2007/01/23(火) 20:49:34
30秒ルール
僕がコードを書くときに、常に意識しているルールがある。
それが、30秒ルール。
確かJavaの偉い人(名前忘れた)が言っていた言葉で、
Javaのメソッド(処理の最小単位)はそれを見て30秒で何をしているのかが
わからなければ駄目だという理論だ(10秒だったかも…)。

わかりやすく書くなんてのは、現場でコードを書くときには基本的な考え方。
これに反して、1時間読んでもそれが何をしているのかが
全く掴めないコードもある。
こういったコードは本来すぐにでもゴミ箱に捨ててこの世から葬ってあげたいところだが
そうはいかないのが現実だったりする。

--- 読めないドキュメント ---
同じように、ドキュメントにも僕は30秒ルールを適用することにしている。
何が言いたいんだかわからないドキュメントに、僕は何度も遭遇して困っているからだ。
これは僕の理解力が足りないんじゃない。
コードに関してもそうだけど、僕は読解力は割とある方だと思っている。

ということは、そのドキュメントがただ読みにくいというだけだ。
多分、こういう文章を書く人というのは作文能力が不足しているんだと思う。
しかし、どこかの記事にもあったようにプログラマの中で
きちんとした文章を書ける人というのは世界的に見ても割合が少ないそうだ。

これは困った。そんな人達が書いたドキュメントを読んで
僕らは作業しなきゃいけないのか。
SE、コンサル、目指す前にまず、わかりやすい日本語で文章を書く練習をした方がいい。
あと、物事をまとめられる力ね。
毎日日記を書くだけでも大分上達するはずだ。

やす 2007/01/25(木) 01:44:43
日本語がおかしくなっている人のドキュメントを見ると、統一された記法であるはずのUMLですら読み辛かったりしますね。そんな人の作ったものはコードも読みづらい・・・。
人に伝えるという目的が失われているんでしょうかね。

開発サイクルの中で最も生産効率の低い作業は実装とコミュニケーションだと思うのですが、非効率な理由の殆どが伝え方(コミュニケーション)の無駄にあるよなぁ、と確信する今日この頃です。

なおき 2007/01/26(金) 22:25:46
UMLで読みにくいのなんてもう最悪ですね(笑)
そうなんです、人に見せようって意図で作ってる人は
ビックリするほど少ないですよ。
とりあえず提出物的な感覚なのかもしれません。

仕事が出来ない人ほど、周りとのコミュニケーションを取らなかったりします。
で、締め切り間際になって慌てだすと。

あ、そうそう。全然関係ないですが。明日はよろしくです。


2007/01/14(日) 15:13:13
サーバ移行中…
そろそろ家のサーバも新しくしようと思い、
以前「Linuxクライアント化計画」の為に買ったPCを使うことにした。
LinuxのGUIは正直まだまだWindowsの足元にも及ばないというのが今の結論。
サーバはLinux、クライアントはWindowsでいくのが
一番妥当な選択だと思う。

とりあえずOSはLFSにしてみた。最新の6.2。
FTP、SSH、Sambaはただ入れるだけ。
Apache、Tomcatも何なく移行に成功。

--- Courier-Imap ---
つまづいたのがメールサーバ。
今回はImapサーバを導入しようと思い、qmailとの連携が良さそうなCourierに決定。
qmailのインストールは何度もやってるので簡単に終わるが、
予想通り(?)Courier-Imapの認証でハマる。
インストール直後はshadowからのパスワード認証に成功してたのに
その後色々やってたらこれが失敗するようになってしまった。

仕方無いので、別ファイルで認証ファイルを作ることにする。
まずはshadowファイルから設定ファイルを作成。

% /usr/local/sbin/pw2userdb | grep -e "^mailuser" > /usr/local/etc/authlib/userdb

mailuser ってのは、Linuxのユーザ名ね。
こうすると、shadowファイルからパスワードを引っ張ってきて
authlib用の設定ファイルを作ってくれる。
結果はこんな感じになる。

mailuser uid=1007|gid=1008|home=/home/mailuser|systempw=$...

あとはこの設定ファイルからバイナリデータを作成…
とその前に、なぜかうちの環境ではユーザ名にドメインを付けなければ動かなかったので
こんな感じで修正。

mailuser@limy.org uid=1007|gid=1008|home=/home/mailuser|systempw=$...

そしたらコマンドを実行。

% /usr/local/sbin/makeuserdb

これで、/usr/local/etc/authlib/userdb.dat というファイルが作成される。
これが認証時に使われ、無事認証が確実に成功するようになりました。

--- コンテンツにしない理由 ---
こういう情報はコンテンツとして起こしておけって話もあるんだけど
なかなかそれが難しい。
いつも試行錯誤しながら正解にたどり付くから、
それをコンテンツとしてまとめるのは大変なのだ。

だからこうやって日記の形でずらずら書くことにしている。
とりあえずこれでも検索エンジンには引っ掛かるからね。

--- IMap ---
やっぱりIMapサーバは便利だ。
僕はいつも複数の環境でメールを使うから
メールがサーバに保持されるIMapサーバは役に立つ。

これで今後、半永久的にメールを保管しておくことが出来るし
環境を変えたときにも以前のメールを破棄することなく
簡単に取り込むことが可能になった。
Courierの動作についてはまだまだよくわからない事も多いので
ある程度わかってきたらコンテンツとして公開しよう…かな。

2006/12/20(水) 20:15:16
最近の状況
最近はまぁまぁ仕事がある。
今やってるのは、うちで開発してるiアプリをWebで焼き直そうというもの。
とりあえず仕様はざっとしか決まってないんで
プロトタイプ的なものを作ればいいという気楽なお題。
僕一人の作業なんでさらに気が楽だ。

で、今日一通り形になったのでリーダーに見せてみた。
「おぉ?」って感心してくれてるのは喜ばしいことだけど、
厳しい言い方をすればその程度で喜んでるようだからまだまだなんだ。

--- 作るのは初歩 ---
物をただ作るなんてのは、言ってみれば初歩の初歩。
誰でも出来るとまでは言わないまでも、とりあえず最低限のレベル。
問題はここからなのだ。

バグの出ないようなシステムにしなきゃいけないし、
ユーザの突拍子も無い行動や不正アクセス、
そして雨あられと降り続いてくる仕様変更。
こういうものをスパッと片付けられる作りになっていて
初めて褒められたシステムと言えるんじゃないだろうか。
もちろん、出来る限り短期間でね。

--- 外側と内側 ---
よく言われるのが、外側の小さな修正は
内側の小さな修正に留めなければいけないという事。
システム内部を何も知らない人間が「これ簡単でしょ」と言えるような変更で
内部を大幅に修正しなければならない事態は避けなければいけない。

これが出来てないシステムは、世の中に山のようにある。
根本の原因は、変更に対応できる作りにしていない事。
例えば、消費税の5%をハードコードしてるような人達は
世の中の仕組みを全くわかってないって事だ。
システムの大部分は、変えられる事を想定して作らなければならない。

--- 今後 ---
これが出来るようになるとどうなるか。
世の中にはもっと便利で使いやすいシステムやWebサイトが増えていく。

現状、便利なシステムにはおそらく相当の額をつぎ込んで作り上げている。
でもこれからはそうじゃいけない。
少ない投資で、もっと便利なものが作り出せたら
もっと多くの人達がITに目を向けるようになる。

僕は敢えて、その答えを最近流行りのフレームワークだとは言わない。
どんなに便利なフレームワークが出てきても
それを使う側のスキルが向上しない限り、彼らの意識が変わらない限り
システムの質は向上しない。

答えは簡単だと思う。
物を作る。それに全力で取り組んでみろって事だ。
中途半端な人達が多い。
物は作りたい。サービスは提供したい。
コンサルタントはしたい。金は稼ぎたい。

結局、どれも身に付かずに10年後には路頭に迷うことになるよ。
誰にも負けない自分の得意な事を見付けた方が、最後には得すると思うけどね。

日本橋の相方 2006/12/24(日) 13:27:36
あえて反論しておきます。
自分の持論なんだけど、可搬性、汎用性、拡張性、可読性・・・全てを充足しているコードなんてものは存在しません。どこまでいっても主観的なものです。
先の例でいうと、消費税をXMLなんかに外だしにする事は、システムによってはセキュリティ上の問題で脆弱性を問われてNGだったりする。
ハードコードっていっても、5%を全てのコードが同じ箇所を参照していれば、そこまで悪い作りではないと思うし。
なおきさんが日本橋でやってたプロジェクトも、早くも拡張要求がきてるんだけど、その中のひとつに、クライアントからの1リクエストに対して、ホストに複数の電文を投げなきゃいけないものがある。
現状のActionクラスの作りはそんなものを想定していないし、実装している時も、そこを指摘した技術者はいなかった。修正ボリューム的には大した事なくても、Actionという上位レイヤーをいじる訳だから、影響範囲を精査したり、テストやドキュメント修正などを含めると、結果として大改修ということになる。

つまり、どんな要求にも耐えうる作りにするには、先人の知恵であるデザインパターンを駆使しつつ、階層構造も初期の段階から「無駄に」深くする必要がある。でもそれでは可読性は落ちる(と感じる技術者もいる)し、パフォーマンス要件を満たせないかもしれない。

完璧なシステムを作る必要は全くなくて、お客さんにとっていいシステムであればいいわけです。
「自分はプログラマーですから」って事で要求定義や仕様に興味を示さない技術者が多い気がする。「株のことは詳しくないけど、株の仕様をシステム的に説明してくれさえすれば、自分がいい作りで作ってやる」、そんな技術者がほんとに多い。それではお客さんにとってのいいシステムなんて作れるわけないのに。
前も書いた気がするけど、大事なのは、要件定義をしてる人と実装者との間の距離です。将来的にどういう事をやろうとしているのかが分からないのに、「いい作り」って言葉がでるのは、プログラマーの勝手な思い上がりです。

まあ、いいシステム、いいプロジェクトってものを目指すのはほんとにハードルが多いって事ですか。だから飽きずにこの業界にい続けられてるのかも。

なおき 2006/12/25(月) 02:25:16
う?ん、まぁ色々ありますけど
結局は客が満足するシステムが作れればそれでいいんですよ。
完璧なものなんて、作ろうとは思ってないし。作れるわけも無いし。
ただ、あまりに作りが適当なコードが多いんでね、こういう話をしたまでです。
「できた、わーい」的なノリじゃなく、もうちょっと真面目に作ろうよっていう。
ハードコードのはあくまで例ですよ。
ちなみに、定数化してあれば僕はハードコードとは呼びません。

どんな要求にも耐えうる必要は全然なくて、ある程度予想できるものは
想定して作っておけば、仕様変更に掛かる時間が短くて済むっていう話です。
例えばその複数の電文を投げるなんていうのも、
外部から見たら大した仕様変更ではないかもしれないわけで。
修正に時間が掛かってしまうということは
作りがあまり良くなかったということになります。

もちろんそういう事を完全に無くすことは不可能なんで、減らしていくっていう
意識が大切ですよね。そうすれば自分達の負担も減るわけですから。
経験を積むことで、
「ああ、ここはおそらくこういう要求が出てくるかもしれないから
 そのためにこんな作りにしておけば後々楽だな」
とか思うようになっていくはずなので。

内面だけを指して「いい作り」なんて言ってるような技術者はホント最低ですね。
「仕様をシステム的に説明」なんて、客が出来るわけ無いんですから。
それが出来ないから僕らに開発を発注してるんですよ、だって。
そういう人の作るシステムはおそらくバグだらけですよ。
要求もわからずに、優れたシステムが出来るわけ無いんです。
ちなみにあんまり僕の周りにそういう人はいないです。
フリーの世界には多いんですかね。

ただ、客っていうのは感性でシステムを作りたがるんで
そういう場合には理論的に考えてあげることが大事です。
さっきの技術者と同じように、
「こっちが言ったものを作ればいいんだよ」的な発注者もいますから。
感性で作り上げようとしても、システムは矛盾だらけで成立しなくなります。
やっぱり、そこを補助してあげるのが僕らの役目だと思いますよ。

あのプロジェクトはそもそも客と作り手の距離が相当遠いですから
現状のようになる事はもう誰の目にも明らかだったんです。
僕はそこを変えていこうとは思いません。
派遣という立場ではどうしても限界がありますから。
だから僕は別の現場を探す道を選んだんです。

常に学べるというのが、この業界の魅力じゃないですかね。
コンピュータも常に進化してますから、僕ら技術者もそれに負けないように
進化し続けないといけないわけです。

最後に。
僕は自分のことをプログラマーだと思ってます。
でもそれは「ただプログラム組んでればいい」とか「要件定義はしなくていい」とか
そうじゃないんです。
要件定義からコーディング、保守まで全ての事を統括してやれる人こそ
真のプログラマーだと信じてます。
そんな全部無理だろって意見もありますけど、僕はそうだとは思いません。
一部しか見ていないと、より良いシステムが出来ない事が多いんです。

他に良い職種名があればいいんですけどね。
スーパープログラマーなんて良く言われますけど、
どうも「スーパー」が付くと小馬鹿にされてる気がしないでもないんで(笑)。

マネージャーとプログラマー。あとはハードウェア担当とか。
これ位だけで充分足りると思うんですけどね。
SEとかホント要らねぇよって感じです。

やす 2006/12/28(木) 03:20:25
どうも、こんばんは。

私は「あれに対応するためにこれを!」とかやってる暇があったら、
必要超最低限だけをガンガン実装してしまいますね・・・。

いらないものを削る、リファクタリングをする(凝集度を上げて結合度を下げたりはそのタイミングで良い)、
必要最低限だけコメントを書く。
インタフェースの設計に間違いがなければ保守性はある程度維持できるんじゃないでしょうか。
後は、適切な単体テストコード(xUnitとか)は必須。

なんで実装を削るかというと、とにかく何でもいいから動く成果物をとっととお客さんに見せて、
「こんな動き(仕様)で良いですか?」と確認し続けたいからなんですけどね。
お客さんとの対話に時間を使いたいから、実装で時間を使ってる暇はない、という感覚です。
あと、前工程が制限となって後ろ工程に圧し掛かることから、作るものは最少は素敵!
という思い込みもありますが(^^;

今の現場ではお客さんがすぐ近くにいるため、確認と提案のコミットが速いのが最も嬉しい所です。

なおき 2006/12/29(金) 21:57:11
必要最小限だけ作るのが基本ですね。
ただ、その後の機能拡張のために多少の準備が必要になります。
小さいシステムならともかく、それなりに大きなシステムだと
そう簡単にはいかないのです。
必要な機能が実装されてるというのは、最低限のレベルです。
大きなシステムだから仕様変更が少ないなんていうのは全くの机上論で
実際にはどんどんと仕様が拡張され変更され続けていきます。

必要最小限を実装しながら、その後の機能拡張に柔軟に対応できる作りにしておく。
これが理想です。

だから、一番いいのは必要な機能を実装してなおかつ
実装の詳細にも気をつかえるほどの余裕を持って開発することですね。
物を作る速さは最大の武器になります、言うのはたやすい事ですが。
大きなシステムになればなる程、実装に時間が足りなくなり
その結果テストに掛ける比重が減ってしまいます。

皆があと2倍の速さでものを作れたら、状況はずっと良くなります。
そしてそれは経験を積むことによって可能なんです。
客が望む以上の速さで物を作れるようになると
他の色々なことに時間を掛けることができるので良いですね。
相手によっては、質問しても2?3日返答が返ってこなかったりしますんで(笑)


2006/11/17(金) 17:12:17
言語選択
新しくシステムを作る場合、まず何の言語で作るかという事は大きなテーマです。
それは客の要望であったり、作る側の希望であったりと
色々あるわけですが、どんな基準で選択すればいいのかって事をちょっと考えてみます…暇なので(笑)。

まずいきなりテーマをぶち壊しそうで何なんですが、
「言語を一つに決める」という事自体が、そもそもの失敗であるという事があります。
言語には、適材適所というものがあるのです。
一つのシステムを、全て一つの言語で統一してやる必要はありません。
昔とは違い、今は言語同士の連携がしやすいようになってるんですから。

まぁそれは置いといて。
例えば、Webアプリを作りたいとしましょう。
現在で主な選択肢と言えば、Java / PHP / Rails / Flash のような感じでしょうか。
まぁこの中のどれかが一般的でしょう。

--- 選択方法 ---
よく、生産性がどうのとかいう理由で言語を選びたがる人がいますが
実際にはそれは全くのナンセンスです。
生産性は、言語で決まるのではなく「開発者がどれだけその言語での経験があるか」
で決まるのです。

確かに Rails の生産性はかなり高いとは思いますが(記事などを読んだ印象では)、
それが全ての技術者に当てはまるわけではありません。
まだ何の言語も知らない人を集め、一から学んでもらうことを考えたら
おそらく Rails が一番早くWebアプリを完成させられるでしょう。

しかし、実際にはそうではないはずです。
既に開発者はいくつかの言語を使った経験があるでしょうから
「プロジェクトに関わるメンバーが最も得意な言語」というのが
最良の選択肢となるのです。
それ故、まだメンバーが決まっていないような場合
経験者の数が多い言語(例えばPHP)が必然的に選ばれることになります。

--- マルチリンガルの必要性 ---
僕は最近ほとんどJavaの現場でばかり働いていますが
それしかやってない訳ではありません。
例えば前の現場ではASPも使っていたし、今の現場では
PerlやPL/SQLも書いています。
そして、どの現場でも共通して使う言語に Ruby があります。

言語が変わったからって、別に大したことはありません。
色んな言語を学んでいけば、「プログラムの書き方」というものが身に付いていきます。
これはどの言語でも通用する普遍的なスキルです。
一つの言語しか使えないという人は、一度他の言語も学んでみることをお勧めします。
そうすることで、あなたのスキルはぐっと上がるはずです。
そこから新たなヒントが発見できるかもしれません。

2006/10/24(火) 14:57:35
多機能アプリケーションの甘い罠
さて、この日記をしょっちゅう読んでいる方ならご存知かとは思いますが
これは言わずと知れたOracleの事です。
「あぁまたかよ」と思った方、そう言わずにつき合って下さいな(笑)。

Oracle はDBサーバの枠を超え、ありとあらゆる機能を提供しようとしています。
いずれこの会社が Oracle OS を発売したとしても何の不思議も無いのです。

なぜ、Oracle がこのような多機能アプリケーションになったのか。
向こうの言い分としては「全てが統合されていることでシステム開発がより効率的になる」
というような感じでしょうか。
しかし、これはちょっと信じ難い言葉です。全てが統合されたからといって
必ずしも開発の効率は上がらないのです。
逆にほとんど100%の確率で開発効率を落としている事に皆、気付いていないだけなのです。

ではなぜ気付かないのでしょうか?
それは、他のものを使ったことが無いからです。
比べる対象が無ければ、非効率だと気付く余地がありません。
または、データベースというものが本質的に何なのかを理解していません。
「おそらくこんなもんなんだろう」という程度の意識しか無いのでしょう。

「別にそんな事言われても、Oracleを使ってうちは幸せな開発をしているよ」
という人には、僕は何も言うことはありません。
でも、もしそうじゃない考えを持った人がいるならば
あなたにはまだOracleを捨てる選択肢があるのです。

現在、ほとんどの企業ではデータベースに Oracle を採用しています。
しかし、その理由を彼/彼女たちに尋ねたら一体どんな答えが返ってくるでしょうか。

「いや、特に理由は…」
「客がOracleじゃないと駄目だって言うから…」
「他に使ったこと無いから…」

そう、別に誰も Oracle に固執しようとは思っていないのです。
僕はまだ、Oracleのメリットを適切に説明できるような人に会ったことがありません。

--- 全てを提供する事 ---
先程も話したように、Oracleはこの製品でシステムの全てを提供しようとしています。
例えば Oracle10g にはWindowsのタスク、UnixのCronと同じような機能を持つ
「スケジューラ」という機能があります。
これを使えば、毎日決まった時間に特定のSQLを実行させる事などが可能になります。

これを知ったITアーキテクト達はこう思うのです。
「よし、次のプロジェクトではOracle10でスケジューラを使おう」
そして開発は始まり、スケジューラも無事動きました。

ある時、「スケジューラの実行が失敗したときに、管理者充てにメールを送信したい」
という要望が客から出てきました。

さて、どうしましょう。スケジューラにはそんな機能はありません。
結局開発者が取った行動は、Cronを使った従来の方式で作り直すというものでした。
こうなるんだったら、最初からスケジューラを使わなければ良かったのに。
もっと言えば、このプロジェクトで Oracle を採用したメリットがあったでしょうか?
他のDBを使っていれば、かなりの予算を節約できた上に
開発効率もずっと上がったはずです。

確かにOracleは様々な機能を実装していて魅力的かもしれませんが
それは決して客の全ての要望を満たすまでには至っていません。
そしてそれは当たり前の事なのです。
人間の要望は、一つのシステムでは到底達成できないほどに膨れ上がってくるのですから。

だとしたら、僕達の取る行動は何でしょう?
そんなものに任せず、自分達で機能を実現することです。
その為に僕達がいるのです。
Oracleが全てを実現できるようなら、プログラマの存在価値なんてあるでしょうか?

もう一つの方法は、特定の機能に特化した製品を組み合わせて使うことです。
これが、ほとんどの場合において最適な選択肢となります。
製品に達成できない機能が出てきたら、自分達で作ればいいのです。
その為には、多機能アプリケーションを切り捨てる必要があります。
これらは外部システムとの協調など、何一つ考えていないのですから。

--- 柔軟な対応 ---
ちょっと話を変えて。
上の例で、こうなってしまった原因を考えてみます。

「ITアーキテクトの決断が誤っていた」と誰かが言うでしょう。
しかし彼はこう言うのです。
「メールを送信するなんて、設計の段階では一言も言ってなかったじゃないか」
確かにそれも一理あります。

一番大事なのは「システムの変更には柔軟に対応できなければならない」という事です。
今回の例は、客の我侭でも何でもありません。
こういった事は、よくある事であり避けられない事なのです。

「実際にシステムを構築しない限り、そのシステムを理解する事は絶対に出来ない」

システムを作りもしないで、設計の段階で全てを決定する事など
人間にはもはや不可能なのです。それが、システム開発の現実だと知っておきましょう。
ですから開発者には、システム製作中に発生する様々な要求を随時受け止め
実装していくための力が必要なのです。

もちろん、「設計の段階である程度を決めておかなければ発注もできない」
という立場の人もいるでしょう。
そのやり方を否定するつもりはありません。
しかし、その最初の決定を全てにおいて正だとする考え方はやめてほしいのです。
家とソフトウェアは、同じ方法では作れないのです。

ソフトウェアの初期設計はあくまで初期設計であり、それで完成ではありません。
システムを構築していく段階で様々な要因によって
設計は常に変化していきます。

それを認められないような古い体質の企業は、
おそらくシステム開発で多大な額の損失が出ています。
それを続けていたら、何年後かには大勢をリストラする羽目になるでしょう。
あなたの会社は、大丈夫ですか?

日本橋の相方 2006/10/25(水) 03:16:42
全く関係ない話から入りますけど、先週バイクを買ったんですよ。仕事帰りに衝動買いで。馴染みの店で買ったんだけど、その店は夜中24時くらいまでやってて、夜中に店に行くとバイク好きがたくさん集ってるわけです。自分のバイクをいじったり、雑談したり。店のオヤジは雑誌にも載ったりしてて結構有名人らしいんだけど、自分はバイクに関しては素人同然なんで全く興味なしです。普通に乗れればいいだけの人間なんで。

最初、オヤジが(合法の範囲内で)改造したバイクを勧められたんですよ。安い値段で。でも小心者の自分は断って新車を買ってしまいました。しかも中型バイクの王道って車種を。
バイク通から言わせると、オヤジの改造車の方がコストパフォーマンス的には圧倒的に優れてるらしいんです。
でもでも、理由は説明できないけど新車がいいんだもーーん!!

そうです、Oracleの話も要はこれと同じです。よほどの匠でない限り、一般人はブランドや知名度には勝てないという特性があります!

あと情報量やサポートが充実してるのも関係してると思います。Oracle社のサポートだけじゃなくて、Oracleと提携して保守サービスをやってる企業がたくさんあるって意味で。日本橋の現場でいうF社のようなものです。F社はOracleはインストールと保守をしてくれるのに、某JMS製品はサポート対象外ですからね。自分達で保守しなきゃいけないわけです。知名度がいかに大きいか。それにぶら下がって商売してる企業も多いわけです。
よほどのメリットがないと、あえて労力がかかるマイナーな方には行かないんじゃないでしょうか。MySQLやPostgreSQLが優れてると分かっていても、インストールから全て自己責任でやるのは・・・って発想だと思います。

自分もRichard M. Stallmanの著書を読んでから、オープンソース支持者ですけど、オープンソースもバグだらけですからね。OracleやMicrosoftみたいに1つの会社で閉じてない分、バグの量が少ないってレベルであって、所詮ソフトウェアはバグバグです。Sambaなんて、長い間フィックスできなかった大量のバグをOracle社が直して、Sambaに無償提供すると同時に自社のMiracleLinuxにバインドさせて販売を伸ばしたっていう珍しい例もあるし。オープンソースたって万能じゃないです。
所詮バグバグだったら、多少の高品質を求めてマイナー系に行くより、大きな流れの中にいた方がいいだろうって。
良いか悪いかは別にして、みんな自分のお金で購入してる訳じゃないから、楽な方がいいんですよ。


話題が逸れますけど、なおきさんが挙げた例でいうと、一番の敗因は、アーキテクトと要件定義をした人との間に距離があった事だとおもいます。
結局、プログラムひとつ取っても、可読性、可搬性、保守性、拡張性etcを全て充足させる作りなんてあり得ないわけですよ。ハードやミドルウェアや言語の選定についても同じ。
じゃあどうすればいいかと言うと、仕様を検討している人やお客さんと、実際に物作りをする人との距離を縮める事じゃないかって思います。

前に要件定義のフェーズの仕事を何回かやった事があるんですけど、正直「不平等だ!」って思いましたね。設計やプログラミングやテストなんかは、バグやミスがあって当然、それを検出する為に工数を割くんだっていう共通認識をみんなが持ってますけど、要求定義だけはミスを認めないって空気がどの現場に行ってもある。「仕様変更になるんですけど・・・」っていうと白い目で見られて。いや、むしろ上のフェーズに行くほどミスは多くなるんだよ!って言いたい。

仕様変更ってのは、いつなんどきでも発生する可能性があるって事をメンバー全員が自覚するべきだと思う。
そんな事言ったら、可搬性、保守性・・・とか全て満たしたプログラムを書かなきゃいけないって事になるけど、それは無理なんで、要件を決める人と開発者とが密にコミュニケーションを取らなきゃいけないんだと思います。
システムによって、こっちの方向での拡張は将来的にあるけど、あっちは絶対にないっていう大まかな方向性はあるはずだから。
上の例でいうと、障害時にはメールで知らせてほしいけど、障害が発生しないような冗長構成は必要ないとか、障害の詳細を報告する為のログ解析や帳票機能までは要らないとか。

大雑把な方向性が分かっていれば、開発者がへんな所で技術者魂を燃やして、無駄に凝った作りにするという事はなくせるはずだし。汎用的にいいシステムを目指さなくても、そのお客さんの要求が実現できればいいわけだから。

でも、そんな理想的な現場には巡り合った事はないですね。
経営側からすると、要求定義のフェーズからそんなに人員は投入できないとか、基本設計以降の案件を受注したから要件定義をできる立場にないとか、色々事情があるんでしょうけど。

まあ、ソフトの開発をしてる限り、この辺の悩みは尽きないんでしょうね。

すっかり夜更かししちゃいましたけど、月末あたりにぜひ飲みに行きましょう。

なおき 2006/10/25(水) 09:55:25
まず…長っ!(笑)

まず、バイクの話から。
彼らは趣味でやってるわけだから、まぁ別にいいんです。
でもこっちは一応仕事で金もらってやってる訳だから、
「一般人」って意識じゃまずいんですよ。
働く人間に、プロ意識が足りない気がします。

もちろん、サポートとか無いと不安だ?って人はOracle使ってれば
いいと思います。
僕も、全ての人にMySQLを勧めてるわけじゃないですし。

オープンソースにも、質の違いはあります。
少なくともMySQLは、Oracleと比べて圧倒的に使いやすいし
バグも少ないから僕はただ使ってるだけです。
別にフリーだから高価だからという理由じゃなく、
単純に使いやすいものを使えばいいんです。
MySQLの場合、それがたまたまフリーだっただけで。

そう、その「距離」っていうのが一番大事ですね。
お互いに協力し合うことをしなかったら、良いシステムが出来るはず無いですよ。
全てを完璧にするなんて絶対に無理なんで
なるべく改善していって良いものを作ればいいんですよ。

そういう意味では、Agileっていうのは有効な方法論だと僕は考えています。

http://capsctrl.que.jp/kdmsnr/wiki/bliki/?AgileImposition

「プロセスやツールより個人と相互作用を重視します」
ってあるように、Agileってのはプロセスじゃないんですよ。
そこら辺を勘違いした現場が多いから
Agileが評価されないんじゃないかと思いますね。

それじゃぁ、30か31。都合の良い方で飲み決定(笑)。
場所は日本橋でいいですか?僕が適当に探しておきます。

やす 2006/10/27(金) 03:35:30
どうも、こんばんは。

Oracle採択については、メリットとデメリットを認識しないで採択することにも問題がある気がします。側面理解してないから、変化がおこったときの対応が出来ないんじゃなかろうかと。
そもそも、最初に決めたことがすべての制約になる、っていう発想で上流やってないからこうなるんじゃない?というのは・・・Oracle採択に限らず何にでも当てはまりますね。

ここ一年以上アジャイル(XP)+テスト駆動開発づいてますが、確かにこれはひとつの解答なのかも知れません。いらないものは作らない。常に変化に対応する。最軽量が最良。
ただ、アジャイルであったりXPであったりは、かなり開発者に近い観点での思考法なので、その発想を持ってマネージメントできる人はかなり貴重な気がします。
顧客から出たものが開発者を通って顧客にフィードバックされて、という流れが密に回り続ければ、「よくわかんないけど有名だから使っとこう」とかは減る、はず。

#眠眠なので文章まとまらず・・・

なおき 2006/10/28(土) 23:19:47
メリットデメリットをわかってる人なら、多分何の問題も無いんですよ(笑)
変化という点で言えば、最初に決めたことを全ての制約にしてしまうってのは
変化に対応できてないということになりますね。

もちろん現状でデータベースを途中で変えるというのは
かなりの工数を要することなんですが
それが長い目で見て良い方向に転がるようなら
検討する余地は少なからずあるということです。

アルコール量高めの為、文章まとまらず…(笑)


2006/10/16(月) 12:00:20
XMLによるプログラミング
ちょっと今回はプログラム寄りの話。
開発の仕事に携わったことのある人なら、XMLという言葉くらいは聞いたことあると思う。
XMLっていうのは簡単に言えばツリー構造のテキストフォーマットの事。

  <root>
    <child>
      ...
    </child>
  </root>

まぁこんな感じの。
HTMLも似たようなもんです(正確に言えばHTMLはXMLではない)。

たかが一種のテキストフォーマットが何故そんなに流行っているかよくわからないけど
彼らに言わせれば、XMLは「魔法の箱」なんだそうだ。
SOAのWebサービスなんかもそう。

今やXMLはありとあらゆる場面で使われている。
しかし、それが本当に最良の選択肢だとは到底言い難い場所でも使われているのだ。
例えばJSP。これはHTMLを動的に作成するための技術で
多くの場所で使われている。
JSPも正確に言えばXMLでは無いんだけど、とりあえず今回は例という事で紹介する。

  <html>
    <body>
      <div>Title</div>
      <c:out value="${subject}" />
    </body>
  </html>

こんな感じで、HTMLの中に独自タグを埋め込んでいく。
c:out という見慣れないタグがあるが、これがその独自タグ。
これがJSP内にあると、JSPコンパイラはそこからJavaコードを実行して
動的なHTML生成を可能にするという訳だ。

では次に、JSPの中にif文を埋め込んでみよう。

  <c:if test="$count % 5 == 0">
    count は5で割り切れます。
  </c:if>

count という変数を参照して、それが5で割り切れるかを判定して文言を表示させるという
簡単なロジック。
さて、ここからが問題。同じようにして今度はif?else文を埋め込んでみる。

  <c:if test="$count % 5 == 0">
    count は5で割り切れます。
  </c:if>
  <c:if test="$count % 5 != 0">
    count は5で割り切れません。
  </c:if>

elseは使わず、ifブロックを二つ並べている。
そう、XMLではif?elseという極めて単純なブロックさえも表現できないのだ。
XMLでロジックを表現することがいかに無謀かという事は、他にも山ほど実感できる。

XMLが持てる状態は、
・ルート要素
・属性
・その子要素
たったこれだけだ。
ツリー構造を持ったデータ格納先として使う程度で充分だろう。
XMLにデータを扱う以上のことはさせるべきでは無い。

XMLでロジックを記述するなんて、割り箸を組み合せて棚を作るようなもんだ。
そんな苦労をしなくても、棚を作る方法はいくらでもある。
物事を実現するために最適なものを選択して使うスキルが、今の技術者には欠けている。
「流行ってるから使おう」とか「これしか知らないから仕方無くこれ使おう」じゃダメなのだ。
自分で良いものを見極める力を身に付けることが大事だね。



Limyweb