トップ «前の日記(2006-11-09) 最新 次の日記(2006-11-11)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2006-11-10

_ インストールできる.NET Framework 3.0

tsuneさんが教えてくれた再頒布可能パッケージをインストールしたら、修復インストールになって本当に「完了」したようだ。

_ Joelの影響力

ソフトウエア開発者の危うい「更地主義」

Joel on Software(Joel Spolsky/青木 靖)

どこかで読んだようなネットスケープの凋落の物語が語られているが、歴史に学ぶ方法の問題点は、ほとんどの場合、反例が見つかり、しかもそのどちらが正しいかを検証する手段がないことだ。成功したものは成功したために検証のためにそれをやり直す必要はなく、そのために別の方法を取った場合にそれがどうなるかがわからないからだ。

反例1: マイクロソフトの市場シェアのほとんどを占めるExcelという表計算ソフトは、そこそこ成功したマルチプランとは独立して更地に作られた。(Mac版が)

反例2: OS Xは、OS9を捨てて更地に作られた。

反例3: Unixは、Multixとは全然無関係に更地に作られた。

反例4: SQL Server7は、それまでのSybaseのコードベースを捨てて更地に作られた(らしい)

反例5: (憶測)大成功をおさめたNetscape Navigatorは、Mosaicに見切りをつけて更地に作られた(アンドリューセンがコードを盗まなかったと仮定して)。

別意見:Netscape凋落の原因は、更地に開発ではなく、モチベーションの欠如による

なぜか? 会社がイノベーションを止めてしまったからだ。会社は大きくなり、そして大会社はどうしても創造性がなくなる。例外はもちろんある。しかし一般的に、すごいことをやるのは、動機づけが高く、目的を一つにした人たちの小集団だ。関わる人たちが増えれば増えるほど、その集団はグズでまぬけになる。

(辞職そして追悼。)。

(ただし、公平を期すならば「6 ヶ月から 10 ヶ月の手戻りとなった。」という更地主義のもたらしたマイナス面を見ておく必要がある)

何が言いたいかというと,アプリケーション開発者の多くが「既存コードベースを拡張/修正する」ことを一番良いと信じていることを問題視しているのだ。最初からやり直さなければもっとうまくできるだろうという考えが間違いであることは再三証明されてきた。間違わないでもらいたいが,ビジネスの状況や技術的な理由によって,アプリケーションを捨てないですませなければならないこともある。しかし,その方がいいと思ったからといって,(最初から書き直すのではなく)アプリケーションの既存の機能を書き換えるのは,十中八九間違っている。

どちらにしても、最初のリリースから幾度か待つ必要があるのは当たり前の話だ。

良く読めばすぐにわかるが、最初に挙げた2番目の「認識」が不適切だからだ。「Microsoft製品「XXX』の次期バージョン」のほとんどが、既存コードベースの修正/拡張だからだ。たとえばVistaはXPのコードをまったく使わずに更地に作った? まさか。にもかかわらず、最初のサービスパックを待つつもりだよ(実運用については)。次期Officeが更地に作られた? 誰もそうは思わない。

2番目の認識はリリース直後の製品は、それが更地に作られようが、修正/拡張であれ、キャズムを超えるには人柱(アーリーアダプター)をソフトウェアのモロク神に捧げる必要があるということを示しているに過ぎない。

というか、まさかパッチレベルで済むような修正に対してまで更地主義で挑む愚か者がいるということを書いているのかね? そうは読めないのだが。

結局のところ、本人が書いているとおり、新築と増築のどっちを選ぶかは「ビジネスの状況や技術的な理由」に依存している。したがって、タイトルはミスリードを招くため極めて危うい。

_ 再帰のバグ

新人の作ったプログラムにバグがあった。
実際にはC#だったのだが、面倒なんでRuby。
複数のデータをDBにinsertする。すでに登録済みならdeleteしてからinsert(なぜupdateを使わないのかは別の問題)。
class DupError < RuntimeError
end
class Database
  def add(key)
    unless @data[key].nil?
      raise DupError
    end
    @called += 1
    @data[key] = true
  end
  def remove(key)
    @data[key] = nil
  end
  def renew
    @data = Hash.new
    @called = 0
  end
  attr_reader :called
end
 
Storage = Database.new
 
#複数のデータを登録する処理
def create(args)
  args.each do |x|
    begin
      Storage.add(x)
      return
    rescue DupError
    end
    Storage.remove(x)
    create(args)
  end
end
 
#データの数を1から16まで増やしながらテストしてみる 
(1..16).each do |x|
  Storage.renew
  args = Array.new(x) {|i| i}
  args.each do |val| #全データが登録済みという状態をテスト用に作る
    Storage.add(val)
  end
  create(args)
  puts "#{x} by #{Storage.called} times"
end
その破壊力にはすごいものがあった。それにしてもなんでちゃんと停止するのか、最初わけがわからなかった。
#この再現コードからはまったくわからないが、実際には再帰を使おうと発想したことはプログラム的にはすごく慧眼だったので、そこはむしろポイントがとても高い。
本日のツッコミ(全6件) [ツッコミを入れる]
_ Kazz (2006-11-10 07:35)

>ソフトウエア開発者の危うい「更地主義」<br><br>翻訳の元記事はこれですかね。<br>http://www.sqlmag.com/Article/ArticleID/93775/Filling_a_Green_Field.html<br><br>標題は"Filling a Green Field"となっていますが、印象が随分と違いますね。どうしてこのような邦標題になったんでしょう。

_ にわかmac使い (2006-11-10 10:12)

>OS Xは、OS9を捨てて<br>CopelandとRhapsodyのことを考えると、OS Xはむしろ反・更地主義の一例になるのではないでしょうか?

_ arton (2006-11-10 11:08)

(いや、別にならない|まったくその通り)と思います。この2元論は、最初から破綻していて、プロジェクトのスコープとどこまで戻ったら更地と見なすのかに依存したくだらない話です(本気で更地がどうのと言い出したらCから作らなければならない−Unixくらいかな)。したがって、どうとでも言えます。あまりにもくだらないのでネタにしただけです。ただし、元ネタは注意深く「アプリケーション」と前提しているのに、あまりにも構成要素が多いOSを出したのは無理がありましたね。たとえばCoplandは修正ベース(そのため、Toolboxの制限に捉われた)、Rhapsodyは更地ベース(ただしOPENSTEP+MACHの修正ベースと見られなくもないのでは)とも言えます。

_ ogijun (2006-11-10 16:54)

技術的にはMac OS XはNeXTからものすごくスムーズに連続していると感じますね。<br>あと、更地主義(という言葉をあえて使う)では、大抵は新旧の対立や葛藤が伴うのでそのオーバーヘッドの分は確実に不利だと思います。強烈なリーダーがいたり(例:Jobs)、個人の欲求だったり(例:Unix)すればその分を補って逆転できるのではないかと。

_ Typo (2006-11-10 20:41)

>それまでのCybaseのコードベース<br>Sybase ですよね?

_ arton (2006-11-10 21:35)

ですね。


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|

ジェズイットを見習え