読者です 読者をやめる 読者になる 読者になる

謎言語使いの徒然

適当に気になった技術や言語を流すブログ。

ああ、確かにすごい覚えがある。

日記

すごくどこかで聞いた気がする、、、、とその疑問を追っかけた。

http://d.hatena.ne.jp/JavaBlack/20100801/p2

ああ、、、、、こっちの業界だとこうなるのか

今年に入り、MSが、製造中止したWindowsXPについて「アップデートを終了する」と発表している。

OSだけを入れ替える手段もあるが、ソフトが必ずうまく動作するとはかぎらない。もし基盤業務システムを再設計するなら○千万円単位の費用が必要。更新を迫られる側にとって大きな出費だ。

「5年以上、仕様追加を含むスパゲッティ保守の代金をSI会社に支払ってきた。今も問題なく使えている。なぜ作り直す必要があるんでしょうか」

不満顔なのは、質問を寄せてくれた下請けさんだ。「XPが5年でサポート打ち切るのは販売当時既に公表していたなのに、上流設計で移植性のない設計したせい。せめて、最初からまともに設計させていただけたら…」と憤る。

…悲しいけど、コレ現実なのよね。

こっちもメモ
このブログエントリの言いたいことからは離れてるところの突っ込みなので、正直揚げ足取りになるのですが、言語好きとして言いたい。

http://kinokoru.info/?p=366

自分もC++PerlRubyJavaPHPJavaScriptなど、いろいろやってきましたが、毎回全く新しいことを勉強している感覚は皆無です。「ああ、この言語ではこう書くのね」程度の認識で、方言くらいにしか思えません。
クラス作って関数作ってロジック書いて・・・そのへんの設計技術って、どの言語でも同じですよね?設計能力と実装能力があれば、どんな言語でも同じ水準の仕事ができて当然。「C++ではスペシャルだけど、Javaではヘボイです」とか言う奴は絶対C++もヘボイ。間違いなく。

半分くらい気持ちはわかります。
大学卒業前までは「方言くらいにしか思えません。」で同意していたことでしょう。そう思っていた時期が私にもありました。

なので『「ああ、この言語ではこう書くのね」程度の認識で、方言くらいにしか思えません。』はやっぱり駄目!ということを主張したい。

もちろん認識が深くなると言語特有の小技が生かせたりしますが、別にそれができるできないで、プログラミング能力の差にはならないはず。

と切って捨ててるけど、オブジェクト指向の世界感が違えば、設計レベルの話もだいぶ変わってきます。
言語仕様もきちんと理解すれば、間違いなく設計にハネます。これだけで十分小技程度の問題ではありません。
そういうことを言い切るのは、文法レベルの小手先のものしか言語仕様を把握していないからだと思います。

たとえば RubyJavaScript か、、、、JavaScript系のオブジェクト概念はただの関数、変数ホルダだから、追加、削除その他もろもろできるし、ダックタイプを利用することで継承関係、依存関係を削ったりとか、、、、。
DIを使ったファクトリーパターンを見ても、実装が大きく分かれますよね。
Java なら Aspect とかいう真似もあるし、アノテーション、メタタグを利用したフレームワークもあります。Generic/Template が使えるかでも設計は変わりますし、ダックタイプの有無だったり、メッセージ式オブジェクト指向等の条件下も設計は変わります。

設計方式、方針に関わる内容すら「小技」と済ますのでしょうか?「同じ設計」で通すのは正直どうかと思います*1

今まで業務に関わった中でも、ここはAspect分離してとか、DynamicObject 使ってデータバインドして…とか、この言語は message 式のオブジェクト指向だからオブジェクトの関係はこうして…とか挙げると切りが無いです。

逆にまったくわかってない上位設計で火を噴いた例を幾つも見てるし、経験もしています。
せめてオブジェクト指向設計がしっかりしてれば、それでも大分良いというのはわかるんですが、、、。

言語を極めろとは言わないし、言語は手段であって目的ではないので、研究者でもないのに研究してくださいとは言わないけど、言語の特性を覚え、効率がいいとか、どうすれば保守性が上がるか?それに使える言語仕様はあるのか?とか、そういうのを理解して設計してほしい。

というかぶっちゃけ「どの言語も同じだ」なんて思ってそっちの理解(勉強)を放置するのは絶対にしないで欲しい。*2

*1:幸いにもリファクタを平然とやれるプロジェクトなら言いのでしょうが、基礎設計レベルに根ざす箇所なら下手すれば作り直しになります

*2:全部種の言語や概念知った上で言ってるならもう止めませんが、、、、