サムライズムさんのハンズオンに参加しました

サムライズムさんのハンズオンに参加しました。
ブログ枠ということで参加したため、無料にしていただきました。
というわけで感想を書いてみます。

私はVisual StudioResharperを主に使っているので、関係ないかなとは思ったのですが、KotlinをつかったときにIntelliJが使いやすかったという印象があったので、情報収集を行うつもりで参加しました。
当日、少し早めに会場に行くと、怪しそうなビルの上のほうに会社がありました。ゲーム機などがおいてあり、いかにもスタートアップという感じの会社です。
開始時刻にはほぼ席は埋まりました。冷蔵庫の中のビールを飲みながら参加してもよいそうです。誰も飲みませんでしたが・・・。

ハンズオンの内容はIntelliJを用いて、htmlとJSを実際に書いていく中で、いかに開発が変わるかということを体感していきます。
もちろんマニュアルを読めば、あるていどの機能はわかります。しかし、このハンズオンで強調していたのは、キーボードショートカットの威力です。
JetBrainsのツールはIDEとはいえ、キーボードによる入力にこだわりを感じました。とても多くのことができ、インクリメンタルなサーチが可能なものが多いです。
詳しくは一部をQiitaにResharper
qiita.com
にしてまとめましたので、参照ください。
なお、私はVimmerなので、JetBrainsさんの中の人がVimmerの人が多いということを聞いて、信頼できました。

最後にGit連携の話が出てきました。割としっかりしたdiffツールがついていて、衝突の解消は楽そうです。
うちではdiffツールを別途購入しているものを使っているのですが、これとほぼ同機能レベルのものと感じました。

このハンズオンは、JetBrainsの開発ツールを購入しようと検討している人で、まずは試用版で軽く体感したいという人におすすめです。
どうしても英語のマニュアルやヘルプが大量にあって、どこから手を付けていいかわからないことがありますが、こういうところから入るのが良いかもしれません。

少し気になったのは、講師の方のものがEAPという開発版だったせいか、一部不安定な動作が見られ、導入を検討している人に不安感を与えた可能性があります。
すくなくともResharperはしっかりしていて、動作は安定していますし、実際に仕様版で体験すればすぐに評価できることだとは思いますが。

Table Data Gateway(3)

Table Data Gateway

Example(C#)

  • 検索SQLごとにメソッドを作り、引数に検索したい値を渡し、検索結果をIDataReader型の戻り値で返す。IDataReaderはデータベースのカーソルライクなインターフェースで、一度にすべてを取り込むわけではないので、大量処理などには向いている。(ちなみに、IDataReaderはGetValues(Object[])メソッドを使って、列の値を全て取得し、Readメソッドで次の行にすすめるようなIF)
  • 更新などは引数に必要な値を渡して実行する

Example(ADO.net Data sets)

この部分は、コードを見て私が分析したことを中心に記述しています。

  • DataAdapterを使用し、検索・更新する。DataAdapterからの抽出結果はDataSetで受け、DataSetを書き換えた後に、これをDataAdapterに渡して保存する。本書では、これらをもつDataSetHolderを定義している。
  • DataGatewayは「全データ取得」「一部条件取得」などのメソッドを定義して、DataSetを取得できるようにする。DataSetはDataSetHolderを経由して取得する。DataAdapterはDataSetHolderが管理するため、DataGatewayからは見えない。
  • 個別のテーブルはDataGatewayを継承したクラスを作成し、具体的なテーブル名称をプロパティで定義するだけとする。このテーブル名称を保持する抽象プロパティを使用してDataGatewayを実装する。
  • 更新時は修正したDataSetをDataAdapterのUpdateメソッドを使用して書き換える。これらの処理はDataSetHolderに記述する。
  • DataSetは複数のテーブルから取得することができるため、DataAdapterはDataSetHolderにHashTableで管理し、適切なDataAdapterを使用できるようにする。これにより使用側はひとつのDataSetを取得・更新しているように見えるが、一方で、複数のテーブルから取得・更新できる。つまり、テーブルの実装を隠蔽することができる。

はてなスター

昨日の記事に、はてなスターをいただきました。まさか見ている人がいるとは・・。自分用のつもりでした。
都合により週末は書けないので、次は来週の火曜日の予定です。

カッコは私が補足したほうがわかりやすいと感じて追加したものです。
また、後から内容を訂正する場合があります。まだ理解できていない部分も多いです。

Table Data Gateway(2)

Table Data Gateway

When to Use it

  • このパターンはデータベースを扱う上で最も単純である
  • Domain Modelパターンでは小規模で使用する。Data Mapperのほうがよりデータベースと分離することができる。
  • Table Moduleパターンで、Record Setを作る際にはうまく働く。
  • Transaction Scripts パターンにも合う
  • Data MapperがDatabaseからデータを取るときに、Table Data Gatewayを経由して使用することがある。手作業で関連付けるのではなく、メタデータを使って(自動的に)関連付けるのであればとても効果的である。
  • Table Data GatewayはDatabaseへのアクセスをカプセル化しているので、更新時にSQLとストアード・プロシージャーの両方を(透過的に)使うことができる

Table Data Gateway(1)

Data Source Architectural Patterns

Table Data Gateway

  • ひとつのインスタンスがテーブルの全ての行を制御する
  • 一つのテーブルやビューに対するselectやupdate, deleteなどをすべて(1つのクラスに)集約する
How it works
  • selectに対応するfindメソッドを条件により複数作る
  • update, delete, insertといった操作に関するメソッドも作る
  • 通常は各メソッドはステートレス(状態を持たない)
  • 問題はどのようにしてクエリの結果を返すか。マップのような構造に詰めて返すこともできるが、(データベースの項目とマップに格納されるキーとの関係は)コンパイルなどでもチェックできず、誤りやすい。Data Transfer Objectパターンを使うのがよい選択肢となる。SQLの結果としてのRecord Setをそのまま返すこともできるが、データベースに特化してしまい、インターフェースをファイルなど他のものに置き換えにくくなるかもしれない。
  • 実際のデータベースのテーブルごとに(=正規化したあとなど、RDBとして格納に適した形で)つくるのではなく、ビューごとに(=実際に使用する形で)、Table Data Gatewayを作ることで、データベースとの結合性を低くすることができる
  • ビューベースのTable Data Gatewayにupdateなどの振る舞いをもたせるときは、その元になっている実際のテーブルに対する更新を行う。それができるのなら、Table Data Gatewayはよいテクニックとなる。
  • Domain Modelを使用している場合は、Table Data Gatewayが適切なDomain Objectを返してくれる。しかし、両方向に依存性がある(=変更があれば、両方に影響する)。

SIerがなぜ、こうなってしまうのか

ほぼ、1年ぶりに日記かな。

SIはやめておけ


そもそもSIとは要件定義から保守までを一括請負するという意味であって、例えば、いわゆるWeb系エンジニアがそれの対極かというと、どうも違うような気がする。SIでもWeb系の仕事をするだろうし、いわゆるWeb系エンジニアがコンサルティングだけを請負ったり、プログラミングだけを請け負ったりするわけでもない。

では、いわゆるWeb系エンジニアとの違いは何か?私はこう思う。

他社向けのシステムを、請負契約などに基づいて構築するか、社内のエンジニアとして自社のためのシステムを構築するか

こういう意味では実はSierの中でも、社内システムやパッケージ開発などを行っているセクションはWeb系の開発のように新しい技術を受け入れやすいはずだ。実際は違うかもしれないが。

他社向けのシステムを構築する場合、契約が非常に重要になる。これはそう簡単に変えられるものではない。契約を守るために必要なものは、納期・予算・品質(いわゆるQCD)である。一方、社内向けのシステムであれば、システムの構築自体が契約によって定められているわけではない。ある程度の調整はできる。
契約を履行するうえで、新しい技術を導入して大きな失敗を生むわけにはいかない。このため、できる限り保守的な解決を図ろうとする。
また、他社向けのシステムが大規模な場合は、様々な下請け会社を含めて大量の人員を使ってQCDをコントロールするため、過剰なルール主義に陥りやすい。できる限り作業する人に考えさせないようにする。これにより、同質のものを大量に製造することができる。とにかく想定の範囲内にプロジェクトをコントロールすることが最も重要な関心事であって、この匿名日記の作者のようなルール以外のことをしようとすると、はじかれるのだ。

よって、SIはこうなりやすい。

もう少し幸せに働くためには、

  • 要件をあいまいにしない。何を作るのかを明確にする。固定コスト・納期の厳守が顧客のニーズであるなら、要件の厳密化は譲れないはずだ。(アジャイル開発等を受け入れてくれるならともかくとして)
  • ルール作りは重要だが、ルールの改良を行うのも重要
  • 初期の学習コストを投資して、効率性を改善するための新技術の投入を行う

SIというビジネスがなくなるとき、それはきっと、顧客企業がシステム会社に丸投げするのではなく、自製し始めたときだと思う。