土曜日, 4月 25, 2009

【Google App Engine】 Entityとトランザクション このエントリーを含むはてなブックマーク


Entity設計について

 GAEではEntityというモデルを定義してJDOを使ってデータを永続化する。Entityはオブジェクトモデルであり画面など実際の業務アプリケーションや外部インターフェースなどを直感的に表現できるという点で優れている。しかし、階層型ということもあり、リレーショナルなモデルとはあまり馴染まない。もしかしたら、これまでRDB的な設計を中心にやってこられた方にとっては苦痛さえ感じるかもしれない。Entityをうまく設計するためには、ひとまずRDB的な頭をリセットしてオブジェクト的な発想をすることをおすすめする。一度慣れてしまうと誰でも簡単にサクサク作れるようになるだろう。逆に、RDBの呪縛から開放されOOに覚醒してしまうともう後には戻れないので注意が必要である。RDBって不要じゃん?とか、これからの時代はOOでKey/Valueだ!などと思うようになれば覚醒した証拠だ。だがこのモデルがRDBにとって代われるかというとそうではない。特に運用面を考えると全く使い物にならないだろう。データ操作はSQLとは比べ物にならないぐらい酷いので、完全移行はそれほど甘くはないと心得ておくべきだ。現時点のクラウドはあくまでXTP(eXtreme Transaction Processing)基盤として考え、RDBはデータウェアハウスなど裏で動く情報系システム用として考えるとよいと思う。モノシリックなアプリはRDBで動作するがあくまで正はRDBであるとする。(このようなハイブリッド方式は、Reflex BDBでも採用している)

 オブジェクトモデルを使ってEntityを設計する方法については実はReflexも同じである。ReflexはGAEが出る前から存在するフレームワークであり、決して真似して作ったたわけではないが、偶然にも非常に似た考え方で設計できるものとなった。具体的には、ZEROからRESTfulアプリを作成を見ていただくと分かるのだが、週報アプリ画面から実際にEntityを作成しながら開発している。


 1.画面のモックアップを作る
 2.モデリングを行い画面のEntity(Model)を作成する
 3.テーブルのEntityを作成する(DAO)
 4.Entityのインスタンスを作成する


 また、Entityはマインドマップなどを使って直感的に生成できる利点もある。下図はReflex表現(画面左)を使ってEntityを定義してマインドマップを生成した様子である。
 Reflex表現さえ作成できればマインドマップを作成できるし、Entityのソースも自動生成できる。Reflex表現は、今流行りのドメイン特化言語のようなものだが非常にシンプルな表現でEntityを作成できることが特長である。Reflex表現の詳細は、Reflex Entity Editorを見てもらえればわかるが、要は、要素の型と多重度、および親子関係を定義するだけである。



ReflexとJDOの共存

 JDOのEntityとReflexのEntityは同じ構造をもてる。例えば、上のマインドマップで、one-to-manyを示すものはReportとactivityであるが、これはReportクラスのListプロパティとしてactivityを定義したものとなる。これはJDOもReflexも全く同じ。Entity定義におけるJDOとReflexの違いは、JDOはデータの永続化のために使うマーカとして、@PrimaryKeyや@Persistentなどアノテーションを使うのに対し、Relfexは主にXMLやJSONなどの出力対象をpublicにするなど、CoC(設定より規約)に基づく考え方で生成することである。(詳細=>reflexcore)CoCは規約を覚える必要があり敷居を高くしているがReflex Entity Editorなどの自動生成ツールがそれを補っている。
 また、偶然の産物であるが、両者はお互いに干渉しないため、永続化と外部インターフェースを1つのクラスのなかで表現できるというメリットが生まれている。

Entity Groupsとトランザクション


 GAEでは、全てのentityはentity groupに所属しており、entity group単位でトランザクションを実行できる。先ほどのReportとactivityの例のように親子関係をもっているものは、同じentity groupとみなされ同一トランザクションのもとに扱うことができる。以下の例は1対多の関係を持ったEntityの場合であるが、1対1の場合についてもListの代わりに単独のクラス名になるだけで同様に考えることができる。(追記:親子関係については嵌りやすいので注意=>JDOから直接JSON、XML

Owned_One_to_Many_Relationships


import java.util.List;

// ...
  @Persistent
  private List contactInfoSets;



また、子から親へのパス(双方向パス)をつけたいときは、@Persistent(mappedBy ="employee")のように、子のキーを示すアノテーションを親のクラスに追記すればよい。


import java.util.List;

// ...
  @Persistent(mappedBy = "employee")
  private List contactInfoSets;


 トランザクションは、以下のように、PersistenceManager(シングルトン)を使いpm.currentTransaction()を呼び出すことで、txコンテキストを取得する。tx.begin();でトランザクションが開始、tx.commit();でコミット、tx.rollback();でロールバックとなる。以下の例では、tx.begin();で開始、ClubMembersのインスタンスをキー”k12345"で取得して、インスタンスのカウントを足した後、pm.makePersistent(members);で永続化、tx.commit();でコミットしている。


import javax.jdo.Transaction;

import ClubMembers;  // not shown

// ...
    // PersistenceManager pm = ...;

    Transaction tx = pm.currentTransaction();

    try {
      tx.begin();
  
      ClubMembers members = pm.getObjectById(ClubMembers.class, "k12345");
      members.incrementCounterBy(1);
      pm.makePersistent(members);
  
      tx.commit();
    } finally {
      if (tx.isActive()) {
        tx.rollback();
      }
    }



 これは楽観的ロックの仕組みであり、tx.begin();の後でもロックがかかっているわけではないので注意が必要だ。つまり、他のプロセスが同じインスタンス”k12345"を読むことができるが、使用中の場合は、java.util.ConcurrentModificationExceptionが発生し、JDOはJDODataStoreExceptionかJDOExceptionをスローする。また、JDOは1回しかトランザクション処理を行わないため、何回か繰り返し実行してコミットできたら抜けるように、アプリケーション側(以下参照)でフォローしてあげなければならない。
ちなみに、同一トランザクション内で複数のentity groupを更新しようとしても、JDOFatalUserExceptionが発生してコミットできないようになっている。

What Can Be Done In a Transaction


 for (int i = 0; i < NUM_RETRIES; i++) {
      pm.currentTransaction().begin();

      ClubMembers members = pm.getObjectById(ClubMembers.class, "k12345");
      members.incrementCounterBy(1);

      try {
        pm.currentTransaction().commit();
        break;

      } catch (JDOCanRetryException ex) {
        if (i == (NUM_RETRIES - 1)) {
          throw ex;
        }
      }
    }



関係を持たない複数のEntityのトランザクション

 関係を持たない複数のEntityをEntity groupとすることで1つのトランザクションとして実行できるようになる。それは、以下のように、keyBuilder.addChild()を使って、一方のEntityのキー生成を他方のキー生成と結合させることで行う。
 
Creating Entities With Entity Groups

import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;

@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class AccountInfo {
  @PrimaryKey
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
  private Key key;

  public void setKey(Key key) {
    this.key = key;
  }
}

// ...
    KeyFactory.Builder keyBuilder = new KeyFactory.Builder(Customer.class.getSimpleName(), "custid985135");

    // AccountInfoのキー生成をCustomerのキー生成と結合させる
    keyBuilder.addChild(AccountInfo.class.getSimpleName(), "acctidX142516");
    Key key = keyBuilder.getKey();

    AccountInfo acct = new AccountInfo();
    acct.setKey(key);
    pm.makePersistent(acct);


また、Entity group内の親キーにアクセスするには、以下のようなアノテーションを追記すればよい。


// ...
  @Persistent
  @Extension(vendorName="datanucleus", key="gae.parent-pk", value="true")
  private Key customerKey;


ちなみに、関係を持たない複数のEntityを、Entity Groupとして定義すると、分散ネットワークの同じ場所に格納される。これは、あるトランザクションで遠くにあるentityが関係すると大量のネットワーク通信が発生し性能が落ちてしまうのを避ける目的がある。Entityがあちこちのサーバに散らばってしまうのはまずい。

ただ、What Can Be Done In a Transaction

Every entity belongs to an entity group, a set of one or more entities that can be manipulated in a single transaction. Entity group relationships tell App Engine to store several entities in the same part of the distributed network.


によれば、分散ネットワークの同じ場所とあるだけで、それがBigTableの同一row(行)なのかTabletなのか、あるいは、その両方でもないのか、不明である。(昨日のクラウド研究会でGregor Hohpeさんは、EntityはRow単位で、いろんなところに格納されるといっていたような気がする。資料=>ProgrammingCloud

BigTableの行(row)


 1.名前は、任意の文字
 2.1行のデータへのアクセスは、atomicである
 3.行は、データを格納する際に、自動的に作成される
 4.行は辞書式順序で並べられている
 5.通常、行は1台または数台のマシン上に、辞書式順序の近い順番にまとめられる


BigTableのTablets


 1.大きなテーブルは、行の境界で、タブレットに分割される
 2.タブレットは行の連続する範囲を維持する
 3.クライアントは、局所性を達成するために、行のキーを選択できる
 4.1つのタブレットあたりの100MB~200MBが目処


総括

 1.Entity設計はオブジェクト設計を元にする必要がある。また、ドメイン特化言語を利用することで生産性向上を期待できる。

 2.BigTableなどBASEを元にしたGoogleの基盤技術を使うGAEであるが、トランザクションの機能を使うことでConsistency(整合性)が保証されるアプリケーションを組むことができる。ただし、1UOW(Unit Of Work)= Entity Groupとなる。
 
 今でもモヤモヤしているのは、Entity Groupの粒度をどうすればいいかという点。かなり強引だけどSCAに当てはめて考えてみる。Entity GroupはSCAでいうところのComponentに相当するのだろうが、さらにCompositeで括ったときのトランザクションがどうなるかわからない。今の流れからして、2phase commitはやるべきではない、ということにはなりそうだが。



<関連>
JDOから直接JSON、XML
JDOから直接SOAP、ATOM。それからDeep Copy
AJAX CRUDサンプルとJDO代替ライブラリ
Pagingをどうやって実現するか
RESTfulアプリのCRUDサンプル -Servlet編-
RESTfulアプリのCRUDサンプル -Modeling編-
Entityとトランザクション2

木曜日, 4月 23, 2009

【クラウドコンピューティング】 RDBをクラウドに載せるべきか このエントリーを含むはてなブックマーク


グーグルはリレーショナルデータベースをクラウドに乗せるかというおもしろい記事を見つけた。ビジネスアプリケーションを載せてもらうことを本気で考えているのであればAzureのようにGoogleもRDBを載せるんじゃないかと。

コメント欄には次のようにあった。

RDBを実装するということが、ACID対応バッチリなミッションクリティカルなデータをホストするということであれば、それはやらないんじゃないかという気がします。


それに対して、

これ、異なる二つの方向性が同時に考えられる話だと思います。

「クラウド」の概念は漠然としていますが、方向として

1.ひとつのサーバーに載らないほどの超巨大データテーブルを、分散コンピューターで扱う
2.互いは独立した個別DBを仮想化されたサーバー環境でホストする

前者は、BigTable など、Googleの方向性で、処理場のキーは、個別操作での並列製を失わないためのMap/Reduce 的な仕組み
後者は実は、可用性に配慮しつつ増大するサーバーパワーを背景にパーティショニングを進め、ホスティングコストを低減させること。つまり、ディスクリートなDBの集合を単一環境で複数走らせて並列性を上げること。

おそらく、Azure で考えられているのは、後者の方向なので、一貫性などへの処理も個別には局在化できることで、実装にそれほど困難はないとおもいます。
また、ビジネスで必要とされるDBはかつては巨大とされたものでも、高々テラバイトです。単一サーバーに収まらないサイズではありません。また、局所分散環境(マルチコア)での、性能のリニアさを向上させる Transactional Memory などの技術も出てきています。

一方、超巨大テーブルでの一貫性処理に関しては、レイテンシーという大きな壁があり、並列性を大きく低下させる可能性があります。また、ニーズもそれほど明らかではありません。

おそらく、両者は組み合わされて使われるのではないかと思います。この観点から言えばGoogleが実装することにもそれほどの困難さは無いと思います。



すばらしい意見なのだが後者の論理には重要な点が見過ごされているのではないかと感じる。
それは以下の4点だ。

 1.ビジネスアプリが動作する条件としてハイエンドなマシン(マルチコア構成でメモリも十分なもの)が要求されていたとするとクラウド側でも単一サーバーとして同等以上の能力を用意する必要があるのではないか。
 2.マルチコアのサチュレーションを考慮するとTransactional Memory を使っても向上に限界があるのではないか。また、(特にアプリの)アーキテクチャー変更が必要になるのではないか。
 3.組み合わせて使用した場合、BigTableでの一貫性処理に関するレイテンシーの壁は、その上で動作するRDBも免れないのではないか。
 4.そもそも、ムーアの法則が成り立たなくなった現在において「可用性に配慮しつつ増大するサーバーパワー」なんて幻想なんじゃなかろうか。

「互いは独立した個別DBを仮想化されたサーバー環境でホストする」ことは別に難しい技術ではないが、高々とはいえテラバイトのデータをVMを使って簡単にはホスティングできないだろう。これまでのビジネスアプリは、Scale-upによるアーキテクチャのもとで進化してきた。少なくともVMの1区画は、これまで単一サーバーで出していたパフォーマンスと同等以上の能力が必要となるのではないか。そうなると高価なサーバ構成をとらざるを得なくなる。安価なサーバを使うためには、Scale-outアーキテクチャへの変更が必要となるが、「ACID対応バッチリなミッションクリティカルなデータをホストする」ためのRDBを使っている限りScale-Out変更は望めない。
 たしかにビジネスアプリにとってRDBは非常に重要である。しかしクラウドに載せるのは簡単ではないだろうと私は思う。


火曜日, 4月 21, 2009

【クラウドコンピューティング】 Scaleするかどうか、それが問題だ このエントリーを含むはてなブックマーク


エンドユーザにとってクラウドデータベースで嬉しいことは何もない?


 クラウド時代のデータベースという記事には、「戯れ言を垂れ流してみます」といいつつ、本質的なことが書かれている。

key-value型のインスタンス群に対して集合操作ってのは、例えばJoSQLみたいなのもあって、いやいやそもそもデータ量がねって話に対して、でもGAEってクォータきつくないっけ?(これもよく分かってないんですけど、調査不足で書いちゃって申し訳ないです)ってことを考えると、 BigTableが使えるって言ってもほんとの意味で大量データをブン回せるわけでもないのかな、とか、いやそもそも集合操作無用でござるっていうなら、 HTMLのフォームをPOSTされたらそのままテキストファイルとして保存しちゃってLucene頑張れってほうが良くね? とか、そもそも何だよその「明細」ってスキーマ(クラスでもテーブルでもエンティティでも呼び名はどーでもいいけどさ)はよぉ、とか色々と思うのです。


クラウドデータベースといえばBigTableでkey/valueである。たしかに、エンドユーザからみれば、実際のところクォータがきつく大量データが使えるわけでもない。JOINすらままならないkey/value操作で何かよいことがあるわけでもない。クラウドデータベースって一体何が嬉しいのか、まったくもってわからない、となる。

Google側のメリット


 ところが、クラウドを提供する側であるgoogleの視点で考えると話はがらっと変わってくる。大幅な運用コスト削減のため、googleは、マシンの台数やN/W、ハードディスク容量などの物理リソース各ユーザごとに管理することはしない。1つの論理的な大規模なマシンを管理するだけである。そしてそれをエンドユーザに開放し、彼ら自身の手によるリソースの割り当てを可能にしている。

なぜBASEなのか


 このような論理的に大規模なマシンに必要なのはBASEを元にしたScale-outの仕組み。これまでのデータベースのプログラミングは小規模なACIDの世界で十分であったが、クラウドのプログラミングではBASEという別の世界で動作する。BASEは分散処理技術を元にしたScaleする世界の概念である。
 Googleは、つまり、ScaleさせたいからACIDをやめてBASEにした。それがBigTableでありkey/valueになってしまう理由である。

BASEについて、M先生曰く。


Cloud上のデータベースでは、従来のACID ConsistencyをBASE Consistencyに切り替えようという話があります。ACIDは、たいていの人知っていると思いますが、BASEは、Basically Available, Soft state, Eventually consistentの略ですね。

eBayのDan Pritchettという人の、BASE -- An ASID Alternative という論文です。

彼、面白いです。理論的だけど実践的で。

頭固くしていると、BASEは、「Basicallyが気に食わない」とか、「Softってなんだ」とか、「Eventuallyじゃどうしようもない」と、Initialごとに反発しそうですが、多分、BASE概念、重要です。

ACIDが理想的で、BASEは、何か欠けているものと考えるのは、おそらく間違いです。古典論が、量子論をなかなか受け入れなかったのも、それが統計的にしか未来を予言できないことが、心理的な障壁になりました。

ACIDは、小規模システムの局所的な原理で、Scaleしません。BASEは、大規模システムの原理です。局所的には、ACIDの成り立っている領域を、大域的に接続していくと、システム全体としてはBASEなシステムが出来上がると考えればいいんじゃないのかしら。


ACIDを諦めるというトレードオフ


 ではなぜ、小規模システムのACID原理が大規模システムに通用しないのか。それは、「それぞれの段階を通り抜ける際、我々は、何かを失う」とした、「複雑さにおける基本的な飛躍」に答えを見出すことができる。ScalabilityとAvailabilityのP18

 CORBAの失敗は単なるインターオペラビリティの問題だけではなかった。もしそうであるならSOAPで成功しているはずである。密結合のモデルをそのままインターネットに適用しようとしたことが失敗の原因であったのだ。同様のことがクラウドでもいえる。インターネットのような大規模システムでは「信頼できないマルチマシン」を前提とした新たな原理を適用しなければならないのである。

 信頼できないマルチ・マシンたちへ:誰を信ずることが出来るか分からない難しい状況の中で、我々は信頼を失う。


なぜScale-Outしなければならないのか


 クラウドデータベースは、先に述べたように、ユーザから見たときは、自由にJOINできないなど、時代に逆行しているかのような機能の少なさや不便さを感じてしまう。その不便さに耐え切れず、エンドユーザの強い要求に屈したのがMSのAzureである。結局、エンドユーザの人数分のSQLServerを用意すればいいじゃん、ということをやってしまうのだろうが、そうなると管理運用コストがかさばってくるのは明らかだ。まあ、これはこれでScaleするといえなくもないが、客のデータセンターをMSのクラウドに移動しただけと実質的にはかわらない。

なぜScale-Outしなければならないのか。その第一の理由は、大規模なデータを扱う際にも、パフォーマンスが落ちないないからである。

 エンドユーザには完全なSQLを提供しつつ、内部的にはBASEだなんてものを出してきたら話は別だ。そりゃすごいことだが、「複雑さにおける基本的な飛躍」でも説明したように、これはとても難しいと思う。SQLは最高なんだけれども、ACIDである限りScaleしない。ACIDシステムを使っている限り、データ量増大に起因するパフォーマンス劣化に対しての抜本的な解決策はないと今は考えられているので、増え続ける顧客データに対して、いつまでも耐えられるものではない。
 (2年前に構築したECサイトも実際問題としてデータ量に起因するパフォーマンス劣化を起こしている。どんなにデータ量が増えても未来永劫サクサク動くシステムはできないものか。それが私がクラウドに魅せられる要素のひとつである)

 これに対してGoogleでは、ある一定量以上になると課金されるものの、基本はBigTableであるからスケーラビリティはまったく問題ない。アプリも同様に我慢してGQLを使う限りにおいては理論的に無限の顧客データに対応でき、パフォーマンスを落とさずにスケールできる。
 ただし、我慢しきれずにGAE上にDerbyなどのJavaRDBを載せてしまうと、せっかくのスケーラビリティは崩れ、AzureSDSのSQLServerと同様の問題に直面することだろう。パフォーマンスに問題ないからといって安易にRDB化するのは問題を抱えてしまうことになるので要注意である。パフォーマンスに問題がなく、かつ、データ量がそれほどない場合に限り、JavaRDBを使うという選択肢も使えると思うが、いずれにしても何とかGQLを使って頑張るべきだと私は思う。

第二の理由は、前記事でも述べたように、コストメリットであると思う。BASEによる大規模システムを、コモディティサーバ、OSS、広告モデルといった組み合わせによって実現できるとしたら圧倒的にコスト的に有利である。
大規模なシステムであればあるほどコストメリットは大きくなって競争力がつく。電力などを含めコスト削減努力を極限までやったところでないと生き残れないのだろう。

 エンドユーザにとってみたら、コンピュータリソースをタダ同然のように利用できるのだからとても幸せなことである。将来はクラウドも、電気やガス、水道といったインフラと同じように、蛇口をひねればすぐ使えるぐらいの手頃なインフラになっていくかもしれない。

月曜日, 4月 20, 2009

【Google App Engine】 RewriteServletを使ったBloggerカスタムドメイン移行 このエントリーを含むはてなブックマーク


 GoogleAppEngine for Javaの調査もかねて、RewriteServletというものを作ったので公開する。このアプリはHelloWorldよりちょっとだけ長いが、GAEアプリとして最初に作るものとしてはちょうどよいサンプルになったと思う。ソースや作り方は以下の資料にある。GAEforJavaのチュートリアルになるように作成してみた。

資料=>ダウンロード

追記:2009/5/1
web.xmlに修正があります。資料P12


 1) /feeds/posts/defaultや/feeds/posts/default?alt=rssをrewrite対象にする。
 2) targetの最後の/を取る
 3) skipの最後の/を取る


金曜日, 4月 17, 2009

【クラウドコンピューティング】 弱者連合とスケーラビリティ このエントリーを含むはてなブックマーク


 年初にクラウド予想2009をやった。これはだれでも容易に予想できる内容ではあるのだが、3ヶ月経った今では、「1)コストダウンは急速に進む」、「4)大手ITベンダはクラウドの大合唱」は言わずもがなとなった。
 コストダウンに関しては、Amazon S3は昨年11月に値下げして以降、一括支払いでさらに値下げSimpleDBを使えば6ヶ月間無料になるという話があり、その急激な値下げには驚かされるところとなった。
 「大手ITベンダはクラウドの大合唱」は予想通り自社製品のクラウド化が進んでいる。具体的な中身は、SunによるSun Open Cloud Platformの発表や、国内ではKDDI クラウドサーバサービスの発表があった。またIBMやCISCOなどによる、Open Cloud Manifestoなどの標準化の話も出てきた。
 そして、「5)OracleやMSは自己矛盾には陥らないが苦戦する」予想は、MSがAzureでかなり善戦しそうな感じを受けるもののSDSでの混乱ぶりがニュースとなっており今後どうなっていくか注目である。<関連>Azureに思うこと

 概してクラウドはコンサルがミソクソな話をしだしていることもあってバズワード化に拍車がかかっているのは否めないところである。だが、ここでクラウドの特長であるスケーラビリティの観点から話を整理すると重要なポイントが見えてくる。

 先日、ある大手ITベンダーのクラウド製品/サービスの説明があった。そのサービスがスケーラブルかどうかの質問が挙がったが、担当者はスケールアウトはしないがスケールすると答えていた。VM技術はつかうものの必要に応じてハイエンドの製品も使う。これは自社製品を無尽蔵に並べるサービスを提供することを意味していた。まあ、スケールアウトしなければ困るような大規模トランザクションなんてそうないだろうからそれでもいいのだろう。

 しかし、その話とスケールアウトしない話は別である。スケールアウトしないがスケールするというのはコストを無視した考えである。お金にいとめをつけないからクラウドでよろしくなんていう太っ腹な企業は別にして、コンシューマ相手では、このご時勢もあって相当な低価格でないと競争に生き残れないだろう。そして、それはタダ同然のレベルだと思う。

 先日、Google App EngineのJava対応が発表された。これを受けて、makers-hubという試みもはじまっている。「製造業向けネットサービスは無料に出来るんです。」だそうだ。

 こういったなかで生き残れるのは、GoogleやAmazonといった2強と、日本では、はてなぐらいじゃなかろうか。彼らに共通するのは、コモディティサーバを束ねてスケールアウトできる技術をもっているということ、それから、広告モデルという別の収入源をもっていること。コモディティサーバとOSS、広告モデルが競争力の源泉。とにかくお金をかけないでサービスを運用する技術とノウハウは大変なものである。そういう意味で、SQLServerを並べる戦略に転換したMSのAzureの競争力には疑問が残る。その運用コストは決して安くはないだろうから、しばらくは太っ腹を相手にしながら、スケールアウト技術を開発して競争力をつける戦略なのだろう。MSでさえ競争力に疑問が残るのだから他のベンダはなおさら厳しそうである。Open Cloud Manifestoが弱者連合と揶揄されるのはわかる気がする。しかし、新規の顧客開拓は厳しい一方で既存顧客の囲みこみは成功するとは思う。クラウド要求に応えられない大手ITベンダーはもっと苦戦すると思われるので、何かしら出さざるを得ない状況なんだろう。先の担当者が、「GoogleやAmazonとは真っ向勝負する気はない」といっていたのが印象的だった。

金曜日, 4月 10, 2009

【クラウドコンピューティング】 AzureSDSに思うこと このエントリーを含むはてなブックマーク



先月MIX09で発表されたAzure SDSが物議をかもしている。実際に参加されたM先生のメールにはこうある。


昨年のPDCでは、まず、Partition Keyを必須とするSDSを提供して、その後に順次、Relational型をサポートをするというロードマップを持っていたのですが、今回は、まったく逆に、最初に、SDSとして、クラウド上のRelationalデータベースを出してから、その後に、Partitionの特徴を追加するというように、大きく路線を修正しました。


たしかに、ホームページにもAzure SDSはSQL Serverをベースにしていると書いてある。

Microsoft® SQL Data Services (SDS) is a cloud-based relational database platform built on SQL Server® technologies.


一方、今までのSDSの中核だったWindows Azure Storageは、ACEモデルの、EntityがProperty BagでKey/ValueベースのTableである。

なぜ2つのアーキテクチャーが存在するのか。ゼータの鼓動。SQL Data Servicesにみるクラウドデータストレージの現実解によれば、次のように説明されている。


誤解を恐れず簡単に説明するならば、Azure Storage Servicesがいわゆるクラウド的なアーキテクチャであり、SDSは従来のRDBMS的なインタフェースを提供する役割を担っている。<中略>従来のソフトウェア資産を活かしながら、最終的に完全なクラウド対応でスケーラビリティのメリットを享受するステップとして、SDSを利用したクラウド側の運用に移行できることは、ユーザー企業にとっても、ソフトウェアベンダーにとっても現実的な落としどころではないだろうか。


先生も次のようにおっしゃっている。


概して好意的で歓迎していた人いわく、「今までの資産と開発技術が、そのまま、クラウドで使える」 確かに、Azureのしたたかなところは、そのOn Premiseとの共存や、開発者のスキルの温存といった現実主義にあったわけで、データ・モデルの部分だけが、大きな飛躍を含んでいたわけですので、こうした反応が出てくることは、理解できないわけではありません。


現実主義・・・私はここにMSの文化を強く感じてしまう。ちょっと話がずれてしまうかもしれないが、IBMと繰り広げたOS戦争でも同じことが起きていたように思う。OS2はWin3.1互換モードなどを搭載していたが重いOSにPC側の性能がついていかず敗北した。実はNTもほぼ同じ問題を抱えていたが、Win3.1、Win95などでユーザをつなぎとめつつNTの改善を図り、やっとWin2000で移行に成功したのである。

Windows NT系(wikipediaより抜粋)


しかし、初期のWindowsは見た目はGUIではあったが内部的にはMS-DOSを土台とし、また16ビットのメモリの壁、マルチタスクの不完全さ、ネットワーク機能の欠落など課題が山積していた。
ビル・ゲイツは一から作り直すことを決断し、<中略>サブシステムで致命的な問題が起きてもクラッシュと呼ばれるシステム全体の破綻を起こさない、当時のPCで動作するOSとしては画期的なシステムであった。
<中略>
当初は重いOSにPC側の性能がついていかず、デスクトップ用の業務用OSの後継にしようというマイクロソフトの目論みは失敗した。
しかし、NT 3.1、NT 3.5に続いて発表した NT 3.51において、時をほぼ同じくしてリリースしたWindows 95をクライアントとしたサーバOSとしての性格を強調するマーケティングを行い、NetWareの牙城であったNOSの市場に足場を確保することに成功した。
バージョンアップを重ねる際にマイクロカーネル概念の一部を放棄してWin32サブシステムやグラフィクス・デバイスドライバの論理層などをカーネル空間に展開してスループットを向上するなど、重いオペレーティングシステムという汚名を払拭する為のいくつもの改修が行われた。
<中略>
その後もマイクロソフトはデスクトップ用の業務用OSの後継としても売り込みを図るが、一部のITプロフェッショナルを除いては市場に浸透せず、2000年にリリースしたWindows 2000に於いてようやくデスクトップOSとしても市場に認められることとなった。
Windows 2000が認められたのは、Windows 9xシリーズのプラグアンドプレイやACPI等の電源管理機能、USBへの対応などユーザビリティの高い機能を実装したことと、この頃にはハードウェアの性能がNT系OSの重さを問題としない(つまり重たくない)レベルにまで向上していたことによると考えられる。
Windows 2000は業務用のデスクトップOSとして歓迎されたが、一般家庭向けの市場でNT系OSが普及するのは次のWindows XPまで待つことになる。


 16ビットOSから32ビットOSへの移行は実に10年近くかかっている。このようにアーキテクチャーの変更が伴う移行は長い月日を必要とする。これはクライアントOSに限らずクラウドも同様だと私は思う。

 話を戻して、なぜSQLServerが求められるか。

 ホストを中心としたプロプライエタリな世界を開放してくれたのは、RDBの成功にあったといっても過言ではない。RDB中心のアーキテクチャーは90年代初期のダウンサイジング以降インターネット時代の今に至るまで変わっていない。その間すべてのアプリケーションはRDBを中心に作られている。実はホスト時代のストレージはRDBではなくkey/valueに近いものであったのだが、そこからRDBへのアーキテクチャーの変更が可能だったのは、パラダイムシフトによりUNIXやWindowsといったオープン系OSにまるごと変わってしまったからである。ホストからのデータ移行もそれほど問題にはならなかった。
 
 Azureの事例をみてもわかるように、今後、key/valueへの移行が進むとしても、クラウドデータにおけるUIを担うのはやはりSQLだろうと思う。ACEモデルに限ったことではないがSQLより優れた操作性をもった言語を開発することはとても難しい。またSQLには既存の多くの開発者スキルもある。スケールできるという理由だけでRDBをkey/valueに移行するとは到底思えない。

 となると、内部的なアーキテクチャーはkey/valueでインターフェースがSQLになるのが理想なのだろう。Azure SDSが今後どのように進化していくのか、楽しみである。


金曜日, 3月 13, 2009

【クラウドコンピューティング】 Key/Valueストア Reflex BDBの発表 このエントリーを含むはてなブックマーク


クラウド研究会の面々を中心に、先日Key/Value研究会というのが開催されたらしい。企画の大田さんたちはもう雲の上の存在になりつつあるのかな。

「キー・バリュー型データストア」開発者が大集合した夜

このKey/Valueデータストアだが、弊社もかねてからReflexを拡張して、Berkeley DB JavaEditionを使ったフレームワークを作っていた。それで先日やっとOracle社と販売契約を結ぶことができたので発表したいと思う。本来、BDBはPDAなどへの組込利用を想定されているものらしく、クラウドに応用したいといってきたところは弊社が初めてだそうだ。ライセンス体系など見直さなければならなかったようで契約までに4ヶ月かかってしまった。

さて、このソリューションの概要は次の絵の通りであるが、ポイントを説明すると、

1)Key/Value方式のデータストアを採用
 データストアとしてKey/Value方式のBDBを採用している。1ライセンスあればどんなにインスタンスを増やしても料金はかからない。

2)Scale-Outモデルのクラウドサービス機能
 データストアにはResourceMapperを介してWebサービスでアクセスできる。
 インスタンスは動的に追加、削除が可能である(<=これはまだ研究中)

3)ハイブリッド方式
 バックエンドのRDBと非同期で接続されている。(基本更新の必要のない参照レコードがRDBに送られる。これらは情報系として使用されることを想定している)



なぜこのようなものを提案するのかについては次回以降詳しく説明していきたいと思う。

このようなソリューションに興味がある方はぜひご連絡ください。


水曜日, 3月 11, 2009

【クラウドコンピューティング】 A Berkeley View of Cloud Computing このエントリーを含むはてなブックマーク


クラウドのメーリングリストに流れていた。頑張って後で読もう。

Above the Clouds: A Berkeley View of Cloud Computing

日曜日, 3月 01, 2009

【クラウドコンピューティング】 ScalabilityとAvailability このエントリーを含むはてなブックマーク


 丸レク第四回目の資料がUpされている。

ScalabilityとAvailability

 Cloud = Scalability + Availability の定義に大賛成。

日曜日, 1月 25, 2009

【雑記】 Yes, we can このエントリーを含むはてなブックマーク


 オバマ大統領の就任演説に感動。(1/24)オバマ新大統領の就任演説内容(全文)
 

我々はこの国の偉大さを再確認するとき、偉大さが決して当然のことではないと理解している。それは働いて得たものでなくてはならない。我々の旅路は近道や妥協であったことはない。憶病者や、勤労より娯楽を好み、富と名声の喜びだけを求める者の旅路だったこともない。むしろリスクをとり、行動し、物を作り出す人々が繁栄と自由への長いでこぼこ道を導いてきてくれたのだ。その中には高名な人もいるが、多くは無名の働く男女だ。

 彼らは私たちのためにわずかな所持品をかばんにしまい、海洋を旅し、新しい生活を探してくれた。

 彼らは私たちのために工場で汗を流して働き、西部を開拓し、むち打ちに耐え、硬い大地を耕してくれた。

 彼らは私たちのために(独立戦争の)コンコード、(南北戦争の)ゲティスバーグ、(第二次大戦の)ノルマンディー、(ベトナム戦争の)ケサンのようなところで戦い、命を落とした。

 これらの男女は私たちがよりよい暮らしを送れるよう何度も何度も苦闘し、犠牲を払い、手が腫れるまで働いてくれた。彼らの目に映る米国は、1人ひとりの大望の集積もさらに大きいものだった。生まれや富や党派の違いを超越した国だった。

 これが今日も我々が続けている旅だ。
<中略>
今日から我々は立ち上がり、ほこりを振り払い、米国を再生する作業をもう一度始めなくてはならない。

 なぜなら、どこを見てもなすべき仕事がある。経済の現状は大胆で迅速な行動を求めている。新しい雇用を創造するだけでなく、成長の新しい基盤を築くために我々は行動する。


 史上最低のバカ大統領のせいで歪んでしまった世界。もういちど原点に返ることで再生していかなければならない。どこを見てもなすべき仕事がたくさんある。私たちもマネーゲームや将来を心配することばかり時間を使うのではなく、「なすべき仕事」を見つけて、そこで働いて得たものを大切にしなければならない。我々の旅路は近道や妥協ではない。むしろリスクをとり、行動し、物を作り出すこと。そして、できると信じること。

 話はかわって、今日優勝した朝青龍。左ひじを痛めて進退のかかった場所での優勝を誰が予想できただろうか。
 もし初日の稀勢の里戦で負けていたら引退していたかもしれない場所だった。
 朝青龍の気迫は並大抵のものではない。場所全体の雰囲気を一変させるものすごい気迫。初日から絶対に負けられないという強い気持ちがオーラとなって溢れ出ていた。そしてそれが他を圧倒していたからこそ優勝できたのだと思う。

 できないと思ったら何もできない。できるという強い気持ちが不可能を可能にする。

 Yes,we can

とりあえず、今のプロジェクトメンバーへのメッセージ。

火曜日, 1月 20, 2009

【雑記】 コモディティかイノベーションか このエントリーを含むはてなブックマーク



IBM 技術理事 中島丈夫が語る「IBMテクノロジー戦略」 - Japan

中島さんの話のなかで「コモディティ VS イノベーション」が気になったので一言。

過去において、また現在もなお莫大な費用をかけてイノベーションに取り組む企業はIBMぐらいである。もちろんJCMベンダーにはそんな真似はできない。

IBMはこれまでイノベーションリーダーであった。JCMなどはIBMが発明したものを真似するだけでよかった時代もあった。しかし、最近は研究開発が実らず空回りしているような感じをうける。

IBMも一企業なのでコモディティに敏感になろうとするのはわかる。また、イノベーションのような顧客が少ないところでの商売のあり方に疑問を感じているのもわかる。しかし、イノベーションに取り組まないIBMなんて想像できない。

寂しいけれど今のイノベーションリーダーは明らかにGoogleである。
GoogleにあってIBMにないもの、それはイノベーションに対する貪欲さかな。

<関連>
失敗しないことがよいことか

日曜日, 1月 18, 2009

【雑記】 性善説と無責任 このエントリーを含むはてなブックマーク



性善説というと聞こえはよいが、この業界は時に性善説が災いをもたらすことがある。
性善説、性悪説とは以下のような考え方をいう。

性善説
(人の本性は善であり)人を信じるべきだという考え方
性悪説
(人の本性は悪であり)人は疑ってかかるべきだという考え方


性善説と性悪説のよくある誤解によれば、そもそもこれが誤解であるそうだが、私は他に適切な言葉を知らないので誤解のまま使うこととする。

私は以下のようなケースで性善説が災いしていると感じている。


1)設計書には間違いがない
2)ちゃんとプログラムを作れば正しく動く
3)ちゃんと管理すれば間違いは起こらない


問題は、ちゃんと動かなかったときにどうするか、ということなのだが、それを考えようと言い出すと途端にK.Y扱いされるので困ったものである。

ちゃんとやるだろうことを私も含めて皆が信じている。そしてシステムはちゃんとやれば動くはずである。もし動かなければ動くまで責任もってやるっていってる。なのに、それのどこが悪いのか?

私に言わせれば、「動かない場合のことをちゃんと考えないのが悪い」ということであるが、どうもうまく伝わらない。

ちゃんと動かすことを考えるのだから、動かない場合のことなんて今は考えられないことはよく分かる。ちゃんと動けばそれが杞憂に終わり、そして時間をかけて考えた「動かない場合のこと」は無駄になることになることも分かる。それでも、自分の力でできない可能性が少しでもある場合には、できない場合の対応策は考えるべきである。私はそれを考えない人は無責任に見えて仕方がない。

できない場合の対応策を考えてもらえない場合は、とりあえず、「何が起きても私は知らないからね。」とか、「その日は出張だから絶対にヘルプできないよ」ということで自己防衛することにしている。さらに、「私はうまくいかない方に賭ける」といって脅すことさえある。別に失敗する原因を知っているわけでも確信しているわけではないのだが、システムというのは大抵動かないもので、逆にシステムがちゃんと動いているのは奇跡のなせる業であり、たまたま動いているにすぎないと思っているぐらいがちょうどよい。(これは自分自身の経験に基づくものである)

しかし、性善説の輩は失敗することを全く考えない。

そして、案の上、失敗して私に泣きつく。
「ごめんなさい。私が間違いでした。だから何とかしてください」

私は君を何とかしたい。

月曜日, 1月 12, 2009

【クラウドコンピューティング】 クラウド予想2009 このエントリーを含むはてなブックマーク



久しぶりによい記事を読んだ。

クラウド型ストレージ「Amazon S3」は安いか?

クラウド・コンピューティングバトル2009


<私なりのクラウド予想2009>

1)コストダウンは急速に進む

実はS3はそれほど安くない。しかし、私は楽観的に考えている。Google、MSなどクラウドプレーヤーの大競争が始まればコストダウンは急速に進むだろう。

2)Google Appsの一人勝ちだが一般的には広がらない

セキュリティは技術以外の問題もあり簡単に解決できないので、多くの企業がGoogle Appsに群がることはない。Microsoft Online Servicesは健闘するがGoogle Appsには太刀打ちできない。Notesやサイボウズなどからの移行はあまりない。

3)クラウドを利用したWebサービスは多く登場する

去年ブレークしたDropboxやMorph Appspaceなどのように、Amazon S3を利用したサービスが多く登場するだろう。そして最初は無料。
企業ではアプリケーションの2次キャッシュやデータバックアップ場所として利用されていくだろう。

4)大手ITベンダはクラウドの大合唱

毎度のことだが自分たちの製品をクラウド対応とか言い出す。コンサルがミソクソな話をしだす。

5)OracleやMSは自己矛盾には陥らないが苦戦する

「マイクロソフトやOracleにとって、自社の収益を共食いせずに従来の顧客とSaaSの顧客の双方を取り込むことは難しい」といわれるが私はそうは思わない。新規の顧客開拓は両者にとっては厳しいが、クラウドをやることで既存顧客の囲みこみは成功するだろう。やらない大手ITベンダーはもっと苦戦する。>IBM

日曜日, 1月 11, 2009

【JavaScript】 ISO8601日時をパースする正規表現。ついでにJavaも このエントリーを含むはてなブックマーク



"2002-06-17T09:25:43.4670000+01:00" のようなフォーマットのISO8601日時をDateにして返す関数はJavaScriptでは以下のようになる。正規表現を使ってマッチした()の1つ目が$1、2つ目が$2・・・7つめが$7に入る。(replace()関数外のためRegExp.$7のように参照している)


// http://www.merlyn.demon.co.uk/js-date3.htm#XML
function parseISO8601(isodatetime) {

   var newdate = isodatetime.replace(/^(\d{4})-(\d{2})-(\d{2})T([0-9:]*)([.0-9]*)(.)(.*)$/,'$1/$2/$3 $4 GMT');
   newdate = Date.parse(newdate) + 1000*RegExp.$5;
   var k = +1;
   newdate -= k * Date.parse('1970/01/01 '+RegExp.$7+' GMT') * (RegExp.$6+'1');
   return new Date(newdate);

}



ちなみにJavaではこんな感じ、


   protected Object fromString(String str) {

      try {

         // Date/Time ISO8601 TIME ZONE FORMAT 2006-02-10T10:00Z.
         // slow but,thread safe

         SimpleDateFormat isoformat = new SimpleDateFormat(
               "yyyy-MM-dd'T'HH:mm:ssZZ");
         return isoformat.parse(str);

      } catch (ParseException e) {
         // try with next formatter
      }

   }

   protected String toString(Object obj) {
      SimpleDateFormat isoformat = new SimpleDateFormat(
            "yyyy-MM-dd'T'HH:mm:ssZZ");
      return isoformat.format(obj);
   }



Javaの正規表現


import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Iso8601 {

/**
* ISO8601日時を正規表現で分解して取得する
*/

public static void main(String[] args) {

Pattern pattern = Pattern.compile("(\\d{4})-(\\d{2})-(\\d{2})T([0-9:]*)([.0-9]*)(.)(.*)");
Matcher matcher = pattern.matcher("2002-06-17T09:25:43.4670000+01:00");

if (matcher.find()) {
System.out.println("ALL:"+matcher.group(0));

System.out.println("YY:"+matcher.group(1));
System.out.println("MM:"+matcher.group(2));
System.out.println("DD:"+matcher.group(3));

System.out.println("TIME:"+matcher.group(4));
System.out.println("msec:"+matcher.group(5));

System.out.println("+-:"+matcher.group(6));
System.out.println("TZ:"+matcher.group(7));

}
}

}


水曜日, 1月 07, 2009

【JavaScript】 高速化プロジェクト その2 このエントリーを含むはてなブックマーク


 先の投稿からずいぶん時間が経ってしまったが続編「その2」を書いてみる。

まず、問題となったものがどんなアプリかであるが、これは下図のように、スプレッドシートのような動作をするJavaScriptアプリで、サーバから必要なデータを初期表示の際にいっぺんに取ってきて、あとはブラウザ環境だけで動作するというものであった。タブを押すと別の画面が表示されるがサーバへのアクセスはない。表示されているタブの中に複数のテーブルがあり値を入力変更できる。しかし、値を変化させると隠れている他のタブの値まで影響するので、計算が多岐にわたって遅くなってしまう。これにはいくつか問題となるコーディングがなされていた。



問題となっていた部分を改善して効果があった順に挙げると以下となる。

1)イベントリスナーの多用をやめる
2)DOMへの直接参照をやめる
3)数値計算の誤差は最後にまるめる

1)イベントリスナーの多用をやめる

 図を見てもわかるように、入力域は1テーブルで約50で、それが4~5あるのだから、合計約200~300の入力域になる。これら一つ一つにイベントを登録してしまうと、とっても遅くなる。これで悩んでいたころに、JUIというイベントがあって、JavaScriptいろいろ、個人的にOpenID そこでma.laさんが、DEMOを披露してくれて、DOM操作の高速化についていろいろ教えてくれた。懇談会ではイベントリスナーは1つというようなことをおっしゃっていたが、DEMOでは、on click で実装したおられたので真似してみた。これは非常に効果があった。

2)DOMへの直接参照をやめる

 サーバサイドのオーソドックスな手法だと、テーブル内の入力域に表示される初期値はサーバ側でのHTML生成時にセットされることになる。初期表示だけであればいいのだが、今回のアプリのように、その値を基にして再計算するような場合には、すべての値に対してDOM参照が発生することになる。これがとても遅いのだ。そこで、思い切ってHTML動的生成はやめ、代わりにJSONを動的に出力する機能と、静的なHTMLを出力する機能に別けてもらうようにした。JSONを動的に出力する機能といっても別に難しいことを要求したわけではなく、HTML動的生成でHTMLタグを全部削除してJSONタグを書いてもらっただけである。また、静的なHTMLについてはWebサーバに置いてもらっただけである。
 原理としては、一旦JSONをデータとして受け取り、表示の際にJavaScriptで静的HTMLの入力域に代入するということをしているが一瞬で書き換わるため以前のアプリと何ら変わらないように見える。以降、値に変更があった際には、JSONの値を元に再計算を行い、静的HTMLの入力域に代入すればよい。こうすることで、再計算中はDOMへの参照がなくなり、非常に高速になった。
とはいえ、計算後に全表示したのでは大きなテーブルでは遅くなってしまうので、DOM参照のためのリンクを持つようにした。(現時点では、この部分が一番遅くなってしまっている。何かいいアイデアはないものか・・)
 ついでにいうと、このJSONオブジェクトのことを私たちはEntityと呼び、再計算のためのBlogicを呼び出すパラメータとして使用している。Blogicは、揮発性(ステートレス)であり、Entityを元に計算した結果のEntityを返すことしかしない。一方、Controlerへの呼び出しでもEntityをパラメータとして与えているが、これはサーバへの登録や参照機能を呼び出す際に使用している。(参考)3分で分かる設計の話
 また、高速化とは関係ないが、Blogicをステートレスとすることで、分業という副産物を手に入れることができた。単体テストも機械的に行えることができ、JavaScriptを複数人でシステマチックに開発できるという事例にできた。

3)数値計算の誤差は最後にまるめる

 JavaScriptの数値計算には誤差が含まれることをご存知だろうか。演算誤差とは
これを真に受けてしまうと演算を自前関数でやらなければならなくなる。実際に旧アプリではそうやっていたのだが当然ながら非常に遅くなってしまっていた。一つ一つの計算では誤差が発生するが、今回のアプリのように、実際に表示させる最後に丸めることでOKである場合がほとんどだろう。例えば、最終表示部分での丸めが小数点1桁で2桁目以降を四捨五入するとなっていた場合に、JavaScriptの演算誤差である小数点以下15桁が影響するには、どれだけの計算回数が必要かを検証してみればよいことである。影響ないことが検証できれば自前関数など破棄してNativeのまま使おう。

 以上が主な高速化のポイントであったが、他にもカーソル移動時の高速化(参考)TABキーで移動後にFocus、Select などがある。
 また、ワンソースマルチビューを実現する でも述べたが、以下のようにViewを表示するレイヤを機能で分けるという設計も非常に有効であった。例えば、Validatorで入力チェック、Attributeで表示桁や色、エラー処理などである。




1.Templateを選択する機能
- page id(xxxx.html#001)で指定
2.サーバからEntityを取得しBlogicを実行する
- Entityをチェックしてエラーコードをセットする。その後はAttributeによってエラーが表示される
- エラーがなければBlogicを実行する
3.静的なtemplateの上に動的なEntityをマッピングする。その際、Attributeにより値をフォーマットする(カンマを付けたり色を付けるなど)
4.データ入力時にvalidatorを実行する
5.(エラーが含まれていなければ)Entityをサーバに送信する

 一つだけ注意すべきことがある。それは、Entityへのデータ入力点(この場合、サーバから取得した時点とキー入力の時点)におけるエラーチェックを厳密にすることだ。キー入力の時点では、Validatorとして古くからJavaScriptは一般的に使用されてきたが、サーバから読込んだ時点というのは意外な方も多いだろう。この設計では、ここをチェックしないとハングする場合もあるので要注意だ。


<関連>

高速化プロジェクト その1

日曜日, 1月 04, 2009

【雑記】 工数と期間の関係を知る、それから適材適所 このエントリーを含むはてなブックマーク


短納期、低予算をどうやって解決していくかという問題にいつも悩ませられる。

弊社には請負の仕事を年間30%しかやらないという30%ポリシーがある。
特にお客様メンバーの一員として働く派遣は基本的にはやらないのだが、それは請負型が生産的でないからという理由が一番大きい。まず、お客様は無理難題を平気で主張してくる。いつまでたっても仕様がFIXしないので、議論や調整で疲弊してしまいモチベーションが下がる。そこで、生産性向上のための提案をやっていくのだが、まず受け入れてくれない。そのうち提案にも疲れて、しょうがなく言われたことをそのまま作りはじめる。そして一度作ったものはなるべく変更したくないので変更管理を始めて後工程に廻そうとするのだが、納期が迫ってくると、何とか先にやってくれと泣きつかれてデスマーチとなる。

こういう環境でエレガントなコードや斬新なアイデアはあまり生まれてこない。
たとえお客様への納品物が完成したとしても我々には何も残らない。
これは時間をお金に換える考え方であり、あまり生産的ではない。

弊社はより生産的なソフトウェアやWebサービスのビジネスにシフトしたいと考えているのだが、少なくとも30%は請負の仕事をやらなくてはならないのが今の現状である。なので、どうやってデスマーチを防ぐかという点に注力して、この手の開発案件に取り組むようにしている。

 目標は、いかに無駄な労力をかけずに、不幸な人を出さずに終われるかということ。チームとしてストレスなく仕事をやり遂げ、もう二度と一緒にやりたくないという人が出てこないようにすること。品質はクリアーできれば及第点でよい。<=これが請負の悪いところかもしれないが、酷い環境で酷使されている現状を考えると、これでよいと自分は納得している。

 抑えるべきポイントは以下の2つである。

1.工数見積もりを信用しない

お客様の見積もりと期間には根拠がないことが多い。
人と月は可換ではないことは明らかである。人と月は可換ではない
3人で6ヶ月かかる仕事が,18人で1ヶ月で終わるわけではない
「一人の子供を産むのに妊婦一人で約10ヶ月かかります.では同じ一人の子供を産むのに妊婦10人がかりだと何ヶ月かかるでしょうか?」もちろん,これの答は1ヶ月ではない.
 先日、Akamai主催の会で聞いた大槻先生の話のなかで、「人月に対して人と月は交換できない」という興味深いものがあった。
 これは妊婦の話を数式まで落とし込んだものだ。

 開発期間 = C × (工数)^D




 お客様は納期が迫るときまって人を増やせというが、そのくせ予算はない。
どれくらいの期間でどれだけ可能なのか、自分たちであらためて見積もりを作成することが肝要である。また、工数に応じて最適な開発期間が存在することを、しっかり認識しておくべきである。

2.適材適所

  人には様々なタイプがある。コードを書くのが得意な人、人と調整するのがうまい人、淡々と業務をこなしていく人。私は順に、Geek、Suit、Sweeperと名づけて、彼らに専門的に業務に取り組むように指示する。これら3つのスペシャリストがシステム開発で重要な役割(ロール)を果たす。どのロールが欠けても不都合になる。特にSweeperが見落としがちで、ビルドやテスト、リファクタリング、ドキュメンテーションなど、開発で必要な雑用を淡々とやりこなす。この作業はGeekやSuitは嫌がってやらないから、いてくれると本当に助かる人たちである。彼らがいないとGeekやSuitのフラストが大きくなっていく。

 適材は揃えたが適所を誤ると元も子もない。Geekがお客と調整をやっても効果は望めないし、その逆もしかりである。自分の得意とする作業に集中させてあげることが全体の生産性を高める鍵となる。それからコミュニケーション。Geekとそれ以外の人々との間には何か深い溝があり、コミュニケーションが図れない場合が多い。私は、時間とお金、労力と効果の関係、それから経緯をよく理解しないまま、素朴な発想をそのまま主張するGeekが悪いとは思っていない。先日読んだ革新的ソフトウェア企業の作り方にも書いてあったが、変なのは間違いなく我々Geekの方ではあるが、それをうまく通訳し、価値を伝えるべきはSuitの方だと考えている。

 最後に、弊社のロゴマークの意味を付けて締めくくるとする。




木曜日, 1月 01, 2009

初笑い このエントリーを含むはてなブックマーク


新年あけましておめでとうございます。

再出発した昨年は、優秀な社員に支えられながら、なんとか目標を達成することができました。本当にありがとうございます。

今年は100年に一度のなんとか、とよくいわれておりますが、この逆境をチャンスととらえ、さらに発展できるように頑張ってまいりますので、よろしくお願いします。

さて、正月を田舎で過ごしている私だが、ここで初笑いネタを披露します。

「父母漫才」

何かとトロい親父に向かって「のび太」という私。
父は、それをいうなら「プニュ」だろという。(<=ポニョの勘違い)
それを聞いた母はすかさず、「バカ違う。ポニョニョンたい。」(<=ポニョの勘違い)

ボケてる父に真顔でつっこむ母のボケが一番面白かった。
TVの漫才よりおもしろいや。

今年もよろしくお願いします。

水曜日, 12月 31, 2008

【クラウドコンピューティング】 5年後のIT市場 このエントリーを含むはてなブックマーク



クラウドが5年後にIT市場の4割に、上流シフトできないベンダーは消える

日本IBMの中島丈夫エグゼクティブ・テクニカル・アドバイザー(技術理事)は、クラウドをもう少し過激に見ている。
「クラウドは現在、IT業界や企業のIT部門が開発したり構築・運用している業務ソフトやITインフラ環境のすべてを収容し代替するパラダイムシフトとなり得る。
クラウドでデータセンターが産業化、工場化すると、ソリューション提供とかシステム構築などの業界用語は死語になる。顧客の欲しい“最終製品” がクラウドから出荷されるからだ」


IBMの中島理事は昔から過激だ。私が中島さんからe-DataCenterの話を聞いたのは10年以上前のこと。
 新しいものをプロデュースすることは本当に難しい。
Webサービス、SaaS、クラウドと、世の中はそのとおりに進化してきた。中島さんから未来の姿を教えてもらいながら何もできていない自分がもどかしい。
でもあきらめずに、着実に、頑張るしかない。(ちなみに中島理事は私をハマスのように過激だという)

火曜日, 12月 30, 2008

【雑記】 3分で分かる設計の話 このエントリーを含むはてなブックマーク



 外部設計で重要なのは項目の整理。画面->テーブル->I/Fの順番で見ていく。項目の整理で必要なことは名前と型と多重度の定義。ただし長さの定義は内部設計でやってもOK。
 内部設計で重要なのはロジック。主にControlとBlogicが実装できるかどうか考えていく。ウォークスルーをやって項目の抜けや矛盾を見つけ出し不都合があれば外部設計で定義したI/Fを修正する。(ここで修正作業が起きることを懸念してはいけない。修正はおそらく最後の局面まで発生するだろう)
 Modelはdataとblogicに分かれる。(ドメインモデルではこれが一つになる一方、Controlの定義が曖昧になる)blogicでは外部参照をなくし揮発性(ステートレス)とすることが重要。
 テストはUT、IT、STの順番で行う。UTは内部設計書を元にチェックするテスト。ITは外部設計書、STはユースケースを元にチェックする。

<関連>
MVCモデルは進化する
ドメインモデル貧血症、サービスと振る舞いについて

日曜日, 12月 28, 2008

【雑記】 著作権について このエントリーを含むはてなブックマーク


 今日の日経新聞に出ていた「歌詞は盗作」認めずという記事が面白かったので一言。
問題となったのは、CHEMISTRYの「約束の場所」のなかの「夢は時間を裏切らない 時間も夢を決して裏切らない」という部分で、銀河鉄道999の「時間は夢を裏切らない 夢も時間を裏切ってはならない」という表現からの盗作ではないかということ。漫画家の松本零士さんは作詞した槙原敬之さんが電話で参考にしたことを認めたとも主張していた。

結局、「歌詞と漫画の表現は相似も大きく、漫画に依存しているとは断定できない」、「槙原さんが電話で認めたとも認定できない」との理由で、槙原さんに軍配が上がった。

この話のポイントは、著作権が相対的独占権(あるいは排他権)であること。
特許権や意匠権のような絶対的独占権ではない。すなわち、既存の著作物Aと同一の著作物Bが作成された場合であっても、著作物Bが既存の著作物Aに依拠することなく独立して創作されたものであれば、両著作物の創作や公表の先後にかかわらず、著作物Aの著作権の効力は、著作物Bの利用行為に及ばない。・・wikipedia


つまり、明らかに盗作だと思える表現でも盗んだことが立証されなければ有罪とはならないということ。「槙原さんが電話で認めたかどうか」が勝敗の分かれ目だったのだろう。

ソフトウェアの著作権についても同様の考え方ができる。

オリジナルのソースを入手してcopyrightのコメントをすげかえてもNGだし、コピーしたことがわからないように変数名やコメントを変えてもNG。
ただし、結果的に同じものができたと主張できれば、全く同じものでもOKとなる。

特許などと違い、結果的に同じものができても著作権侵害にはならないがオリジナルのソースを見て作った(=盗作)のであれば侵害となる。

 
© 2006-2015 Virtual Technology
当サイトではGoogle Analyticsを使ってウェブサイトのトラフィック情報を収集しています。詳しくは、プライバシーポリシーを参照してください。