無料ブログはココログ

立食とコース料理 -「現場で役立つシステム設計の原則」批判の一考察 -

高級食材をリーズナブルに提供する立食タイプのレストランがはやっている。景気が少しは上向いたものの本格的な好景気と言いがたい中、たまには良いものを食べたいというニーズに応えるべく、立食で回転率を上げることで原価率の高いリーズナブルな商品を提供しているのだ。

これに対して本格的なコース料理を出すレストランの方々は、苦々しく思われているだろう。食事というのは文化であり、美味しく食べるには順番があり、ふさわしいサービスと共に提供することで至福の時間を楽しんでいただける。それなのに、メインディッシュ中心で、イスすら無い。そもそもイスが無ければ落ち着かないじゃないか、と。

もちろん、単なるアイデア勝負では勝てないので、立食サービスを提供する側も顧客の特性を見据えて方針を変更する。たとえば大阪と京都だけはイスを設置するなどして、ニーズに応えようとする。

オブジェクト指向

前置きが長くなったが、増田さんの本と杉本さんの批判を読んで頭に浮かんだことである。

杉本さんの「現場で役立つシステム設計の原則」批判 (1) ~何のために、「データとロジックを一体に」するのか?~「現場で役立つシステム設計の原則」批判 (2) ~ポリモーフィズムは何のために?~ を読んでいると「なるほど」と思うものの「現場で役立つシステム設計の原則 ~変更を楽で安全にするオブジェクト指向の実践技法」の増田さんはなぜそのような本を書かれたが気になった。

そこで話題の本を読んでみると、私の知っているオブジェクト指向をベースに戦略的な内容が書かれていた。ベースとなるオブジェクト指向は、デザインパターンが話題になるまでのオブジェクト指向に近いものだ。

オブジェクト指向の主張や流派には色々あるが、Smalltalkで学ぶオブジェクト指向プログラミングでは、アラン・ケイさんが「生物がどのように複雑な構造を作るかを考えました」という言葉を引用し「オブジェクトは細胞のアナロジー」としている。

そこには、小さなものを作り、確認しながら、方向性を見極めながら、徐々に大きなものを作るアジャイル開発やリーンスタートアップにつながる戦略が垣間見える。

アジャイル開発とリーンスタートアップの戦略に求められるもの

アジャイル開発も最近ではモダンアジャイルと言って、定期的なタイムボックス管理にこだわらず、ビジネスの成長に直結するソフトウェアを、よりコアな部分から段階的に、しかも安全に開発する方法として実践されつつある。

そのような開発では、従来型開発で重視された、業務全体を見渡して最適化すること、技法本来の使い方を熟知すること、将来的に必要と思われる機能をシステム一式を開発するよりも、ローコストで、シンプルで、業務に役立つ最低限のシステム、の開発が求められる。

もちろん、アジャイル開発に向いた開発法には欠点もあり、初期の開発では業務全体に最適化されておらず、技法としても不十分で、将来的に継続的な改修が必要となる。

しかし、収益を出すことが難しいスタートアップ企業のに求められるのは

  • ビジネス(業務活動)が実施できること
  • 理解が容易な程度に単純なこと
  • リファクタリングが容易なこと

といった点である。これらはビジネスの存続・発展のためには重視されるだろう。

立食 vs コース

さて、機能の抜けが無く良い設計のソフトウェア開発と、リファクタリングを前提に最低限の機能から実装する方法は、本格的なコース料理を提供するレストランと、メインの料理を中心に立食で提供するレストランの様に戦略が異なる。

今後も発展するだろうが、ブームは過ぎるかもしれないし、立食で無くなるかも知れないが、回転率を重視する店は今後も存在するだろう。逆に、コースを提供するレストランは淘汰が進むかもしれないが、こちらも全てが無くなることは無いだろう。

それぞれに特長があり、調理師に求められるスキルも異なる点があるだろう。互いに相手のやっていることは、自分のやりたいことではないと言うかもしれない。

しかし、相手の立場に立ってその戦略を見たとき、自分の技術に書けている点や自身の強みが見えてきて、技術を磨くための肥やしになるだろう。

おわりに

今回の議論はとても興味深く、とても参考になる。その背景には感情的な対立でなく、若い人にわかって欲しいとか、偏った考えを持って欲しくないという前向きなものだ。

すでに若いとは言えない年だが、色々と学ばせていただいた。今後もぜひ前向きに議論を続けていただき、技術の発展に貢献していただきたい。

このエントリーをはてなブックマークに追加


[#Node-RED] 7〜8分でわかるファンクションノード

Photo

Visual IoTツール Node-REDには、データセットや基本的な制御構造がありますので、簡単なプログラムならコーディングなし(設定だけ)でプログラムを書くことができます。

しかし、少し複雑な処理になるとファンクションノードが便利です。ファンクションノードはjavascriptでコーディングできますので、複雑な処理をフローにまとめることができ、シンプルなわかり易いフローが書けます。

1.基本

まずは基本的な内容から。

1.1 名前をつけよう

ノードには日本語で名前を付けることができます。処理内容を表す名前を付けておくとフローが読み易くなります。「XXに変換する」「msg.cnt++」などわかり易い名前を付けてください。

1.2 入力は最大一つ、出力は複数可能

ファンクションノードの入り口は一つだけです。デフォルトの出力は一つですが、下部にある出力数を変更して増やすことができます。出力が複数場合は戻り値を配列で返します。出力しない出口にはnullをセットします。条件によってどれか一つに値を出力するだけなら、スイッチノードに渡した方が、修正が楽な場合もあるでしょう。
(追記:バージョン0.17以降では端子に名前をつけるとマウスオーバーで表示できますので、入出力などをわかり易く書いておくと良いでしょう。)

1.3 javascriptでコーディング

内蔵エディタはjavascript構文を理解してエラーやワーニングを表示してくれます。Node-REDが動作するNode.jsのバージョンの文法で記述します。msgオブジェクトを受け取って処理し、リターンバリューがmsgオブジェクトになります。

2.あらかじめ定義されたオブジェクト

msgオブジェクト以外のあらかじめ定義されたオブジェクトを説明します。

2.1 グローバルオブジェクト

プログラム全体で利用可能なグローバル変数が使えます。
global.get(‘オブジェクト名’)で取得し、 global.set(‘オブジェクト名’,値)で値を設定します。現在は永続化されないので、再起動で初期化されます。

2.2 フローオブジェクト

タブ内で有効なフロー変数もあります。
flow.get(‘オブジェクト名’)で取得し、flow.set(‘オブジェクト名’)で値を設定します。
永続化されないので、再起動で初期化されます。

2.3 node.send()

一つの出口に複数返す場合や、無名関数内で終了する場合は、returnでなく、 node.send(msgオブジェクト)を用います。returnは最後の一度死活変えませんし、無名関数内のreturnは全体の戻りではないからです。

2.4 require は setting.js で

ファンクションノード内で requireできません。requireが必要な場合は、ユーザーディレクトリ( ホームディレクトリ/.node-red)のsetting.jsのfunctionGlobalContextにrequireを追加します。Node-REDを再起動すると、設定したオブジェクトを global.get(‘オブジェクト名’) で取得できます。もちろん、必要に応じてユーザーディレクトリで、モジュールをnpmインストールする必要があります。

3.オブジェクトの管理

簡単に見えるNode-REDプログラミングですが、意外とハマるのがオブジェクトの管理です。

3.1 msg.payloadは基本

標準的な出力はmsg.payloadですが、破壊されることも多いです。payload以外のプロパティを使えば多くの場合は大丈夫です。しかし、新しいmsgオブジェクトが生成される場合は、フロー変数やグローバル変数を使います。

3.2 新しいmsgオブジェクトで返す

受け取ったmsgオブジェクトを渡したくない場合は、「return {payload: 値};」とすると新しいオブジェクトのmsg.payloadとして値を返すことができます。ただし、後続の処理で、受け取ったmsgオブジェクトの値を渡せないので注意してください。特にhttp inが出力するmsgオブジェクトには、http responseに必要な情報が含まれますので注意してください。

3.3 コピーされるオブジェクト

「return [msg, msg];」のようにmsgオブジェクトを複数同時に返すと、オブジェクトッがコピーされ、異なるオブジェクトが渡されます。また、一つの出口から複数のノードに繋いだ場合もコピーされます。大量データを扱う場合には注意してください。新しいmsgオブジェクトを生成するか、node.send()で出力すると参照が渡されます(参照を渡すと想定外に内容が破壊されてしまうことがありますので注意してください)。

4.おわりに

簡単に始められるNode-REDプログラミングですが、ドキュメントをきちんと読んだり、色々試さないとわからないことがあります。ここに挙げた内容がわかっていれば、少し複雑な処理もスラスラと書けると思います。

詳しくは、公式ドキュメント(英語)の確認や、実際に動かすなどしてください。それでも困った時は、ユーザー会slackやメーリングリストなど(英語)で聞いてみると良いと思います。

このエントリーをはてなブックマークに追加

Node-REDで品質の高いソフトウェアを開発する

開発者へのアンケートによると、Node-REDを用いると高品質なソフトウェアが開発できることがわかりましたが、そこには注意点がありました(Visual開発ツールNode-REDの導入によるプロセスの変化と考慮点 - SS2017 -)。

Node-REDで開発する際にはNode-REDに合わせた設計やテストが必要です。順に説明しましょう。

データ設計

Node-REDのノードは関数ではなく、msgオブジェクトを加工しながら処理を進めますので、msgオブジェクトのデータ構造をきちんと決めておかないと、混乱してバグの原因になります。

msgオブジェクトと同じ様に処理館の共通データであるフロー変数やグローバル変数、データベースも同様にデータ構造をきちんと決めておきます。

構造設計

フローをどのように構成するか、非同期並行処理(コールバック地獄よさようなら。Node-REDで非同期処理を使いこなせ! )か順次処理かを検討します。非同期処理は処理が速く効率的です。一方の順次処理はメモリーをあまり消費しないので、大量データを扱う際に有利です。メモリー消費が多いとシステムやDBノードが止まることもありますので、注意深く検討してください。

システム間連携

前回(Node-REDでより大規模な開発を - モジュール化とフロー・システム間連携 - )に書いた様に様々な連携方法があります。それぞれの長所短所を検討して方式を決めてください。

いずれの場合もなるべく早い時期から結合すれば、信頼性を高めることができます。

モジュール設計

いわゆるモジュール強度(凝集度)や結合度を考慮してモジュール化します。なるべく単機能のノードやサブフローになる様に、インタフェースのデータ構造が単純になる様に設計します。

また、ノードの出力するオブジェクトがが参照なのか、データのコピーなのか、あるいは新しいオブジェクトにするのかを検討します。新しいオブジェクトにすると、渡していないデータは破壊されます。特にhttpレスポンスには多くのデータが必要ですので注意してください。

逐次開発・テスト

いわゆるxunitはカスタムノードでないと利用できません。改造する際はデグレが生じ易いので気をつけてください。良いモジュール構造にして、逐次開発とテストを並行して行います。

少しずつ開発しながら随時テストすることで、信頼性の高いソフトウェアを増やしていきます。常に追加した部分を動作確認すれば、まとめてテストした場合よりも抜けが少ない様です(Visual開発ツールNode-REDの導入によるプロセスの変化と考慮点 - SS2017 -)。

機能テスト

機能テストを行う際は、機能の観点だけでなく、データの網羅性に注意すると良いでしょう。いわゆる界値に注目してテストデータを決めます。

Node-REDはスタブやモック、ドライバなど、いわゆるテストダブルの開発にも向いています。実機の利用が難しい場合に検討すると良いでしょう。特にDashboardを利用すると、使い易いテスト環境が実現できるでしょう。

非機能テスト

デバッグノードなどを不用意に繋ぐと、フローの二股に分かれたところでデータがコピーされ、メモリー負荷や、処理速度の低下に繋がるので注意してください。

Node-REDはNode.js上で非同期に動作しますので、スレッドによる実装よりも線形に性能が出ますが、残念ながら上限性能は存在します。小規模なテストで安心しないで、想定される負荷を実際に与えてテストしてください。

おわりに

Node-REDを使うと簡単に動くプログラムができます。しかし、ある程度規模が大きくなると、設計やテストの戦略が必要になります。

ここに挙げた方法は一例に過ぎません。開発対象や環境に合わせて実施してください。

このエントリーをはてなブックマークに追加

Node-REDでより大規模な開発を - モジュール化とフロー・システム間連携 -

Node-REDはマルチユーザ対応に向けてバージョンアップが進んでいますが、現在のエディタは基本的に一人でしか使えません。しかし、モジュール化やフロー・システム間連携を使えば、複数人で連携してより大規模な開発ができます。

1.  機能モジュールの作成方法

(1-1) エクスポート/インポート

エディタ上の任意のフロー/現在のタブ/全てのタブをJSONでエクスポートして人に渡したり、エクスポートしたJSONを受け取ってインポートすることができます(もちろんバックアップや複製にも使えます)。

エクスポートはフローを選択した後に、
 右上のハンバーガー(3本線)メニュー ⇒ 書き出し ⇒ クリップボード
を選択すると、 エクスポートのダイアログが表示されますので、選択したフロー/現在のタブ/全てのタブ、 それをコピーします。インデントのないJSONフォーマット/インデントのあるFOMAとを選択し、クリップボードに書き出します。

インポートは、
 右上のハンバーガーメニュー ⇒ 読み込み ⇒ クリップボード
を選択すると、 インポートのダイアログが表示されますので、現在のタブか新規のタブを選択して、エディタにコピーします。

(1-2) サブフロー

フローが大規模になると、同じフローが何度も出てくるなど見通しが悪くなりがちです。フローの一部をサブフローと呼ばれるモジュールを定義して扱うことができます。

右上のハンバーガーメニュー ⇒ サブフロー ⇒ サブフローを作成を選択すると、左ペインにサブフローが追加されサブフローのタブが開かれます。プロパティを編集するとサブフロー名や情報タブに表示される詳細情報を編集できます。入力(最大1つ)や出力(0以上)を設定すると、inputやoutputが表示されます。

またはサブフローにしたいフローの部分を選択しておいて、ハンバーガーメニュー ⇒ サブフロー ⇒ 選択部分をサブフロー化を選択するとその部分がサブフローになり、左ペインにサブフローが追加されます。左ペインのサブフローをダブルクリックするか、エディタ上のサブフローをダブルクリックして「フローのテンプレートを編集」をクリックすると、サブフローのタブが開かれます。

サブフローのタブを閉じてもサブフローは消えませんので、サブフローのタブを開いて削除します。

(1-3) カスタムノード

ユーザが独自のノードをJavascriptとHTMLで書くことができます。requireもできますので、様々なノードを 作ることもできます。 詳しくはCreating Nodesを見てください。

2. フロー・システム間連携

機能モジュール毎に担当者を分けて開発し、それらを以下のような方法でつなぎ合わせれば、より大きなシステムを作ったり、外部のシステムと連携することができます。

(2-1) デバッグノードの出力をインジェクトノードで送信

別の担当者のモジュールと接続する部分にデバッグノードをつないで、その出力のJSONをコピー(取り出)して担当者に渡します。担当者は受け取ったJSONをインジェクトノードに設定すると、異なるNode-RED間を直接つながないで、JSONデータを介してフローの続きを開発することができます。

(2-2) 異なるタブをリンクノードでつなぐ

機能ごとにタブを分けて、それぞれに担当者を決めておくとマージが容易になります。各タブのフローを繋いで大きなフローとするには、出力と入力のリンクノードを使います。

リンクノードは複数への出力や、複数からの入力の設定が可能です。リンクノードにわかりやすい名前をつけておくと良いでしょう。

(2-3) グローバル/フロー変数結合

取得したデータをメモリーやストレージに保存し、それを一定のタイミングで取得することも可能です。インジェクトノードで繰り返しを設定すると、一定間隔や指定日時、あるいはその組合せで処理を実行して、いわゆるポーリング処理やタスク処理を実現できます。

最も簡単な方法はグローバル変数やフロー変数を用いる方法です。グローバル変数は全てのノードから参照・更新が可能で、(いまのところ)Node-RED起動時に初期化されます。フロー変数は同じタブ(フロー)内のノードから参照・更新が可能で、デプロイ時に初期化されます。

(2-4) 処理間連携

httpノードやwebsocketノードを使えば、他のシステムと連携することができます。http inノードで要求を受けたら、同じ処理のフローにhttp responseノードを入れないと呼び出しが終了しないので気をつけてください。また、http requestノードは出力形式を文字列、バイナリバッファ、JSONを選ぶことができます。

他システムのデータをタスク処理やポーリング処理をするなら、ファイルやデータベースを使うと良いでしょう。ファイルは入出力のほかwatchノードで更新を検出することができます。また、カスタムノードをインストールすればPostgreSQLやSQLiteなどのデータベースを利用することができます。

3. おわりに

Node-REDで開発する際のモジュール化とフロー・システム間連携についてまとめました。

ここに挙げた方法を用いれば、複数人でNode-REDを用いてより大規模なシステムを開発することができます。みなさんも色々と工夫してください。

開発者へのアンケートによれば、大きなシステムを開発する場合はここにあげた方法だけでなく、設計やテストを工夫することで高品質なソフトウェアを短期間で開発することができます(Visual開発ツールNode-REDの導入によるプロセスの変化と考慮点 - SS2017 -)。設計やテストの工夫もいつかまとめたいと思います(Node-REDで品質の高いソフトウェアを開発する)。

このエントリーをはてなブックマークに追加

[#TiDD] プロジェクトを成功させるチケット管理

QuaSTom高品質ソフトウェア技術交流会 2017年度第2回例会で講演させていただきました。

Redmineの勉強会ではないので初心者の方が多いかと思いきや、9割の方がチケットシステムを使われていて、そのうちTracが24%、Mantisが8%、残りがRedmineを使われていました。

幹事の松谷さんに用意していただいたグループディスカッションも、みなさんのお悩みや経験で盛り上がりました。やはり、メンバーにきちんと理解してもらえないとうまくいかないようです。

同じような議論は、90年代後半以降のプロセス改善ブームの頃にもありました。みなさんの意見をうかがっていると、やはり「ツールの導入はプロセス改善である」という思いが強くなりました。

ディスカッションへのコメントで「ゴールはプロジェクトの成功」とお話ししたことや、講演のおまけでお話しした「サーバントリーダーシップ」もリーダーシップの議論をされているとのことで喜んでいただけました。

久しぶりに大いに刺激を受けることができました。ありがとうございました。

おまけ

講演の仲であまり詳しく説明しなかったチケット駆動開発のレフトウィングとライトウィングのお話は、以下の発表が元になっています。

[#redmineT] 裾野が広がるRedmine「チケット駆動開発導入のヒント - 自律と規律 -」

(今回はお話ししませんでしたが、改善にはフィードバックやタイミングも重要だと思っています)

この発表の際にも使わせていただいた乗松さんの資料(PDF)の23ページ「SPIモードの遷移」は認証の罠を標準化の罠に読み替えるとツール導入にも同じような問題が起きると思いますので、参考にしてください。

このエントリーをはてなブックマークに追加


アジャイルジャパン大阪サテライト2017の感想

SS2017のポストイベントがなくなったので、 急遽スタッフとして参加しました。


(1)キーノート:シンアジャイル(Joshua Kerievsky)

モダンアジャイルについての説明。タイトルはAgileJapan2017のタイトルにあわせて変更されたようです(シン・ゴジラをまねた?)。

個人的にアジャイル開発のタイムボックス管理は、作業タイミングを固定化するので超短期開発にはフィットしないと思っていました。Kerievsky氏は早くからタイムボックスを守るよりも顧客のメリットを考えようと言われていたそうです(そのとおり!)。

提案する新しい4つの原則は従来のアジャイルマニュフェストに対応しながらも、顧客やソフトウェアの安全性に配慮したものでした。

講演概要
http://www.agilejapan.org/session.html#session01

Agile 2016の基調講演: モダンアジャイル
https://www.infoq.com/jp/news/2016/08/agile2016-modern-agile

チェンジビジョン/英和システム 平鍋さんの説明
https://anagileway.wordpress.com/2016/10/07/modern-agile-jp/


(2)ヴァル研究所 新井さんの講演

アジャイルを社内に広げる際の話。みんなが積極的になるように色々と工夫された中で、権限(部長)があるので、一部の活動が社内評価と連動するようにした。と言われていたので懇親会で質問させていただきました。

質問は、社内の仕組みと連動すると、義務感ややらされ感が出ると思うが、どのようにバランスをとられているか?

答えは、社員には積極的なできる人と、受身の人と両方いて受身の人も働いてもらわないといけない。ルールを決めても相手によって変えている。とのこと。

つまり、ルールはがちがちにせず、運用時に人を見て、たぶんチームによっても変えているのでしょう。エンジニアは、ついつい一貫性が気になりますが、個人個人を良く見ると言うことが重要だと思いました。

ちなみに、「上から見てなので、みんながどう思っているかはわからないですけどね。」と謙虚に言われていたのが印象的でした。


(3)コニカミノルタの久保さんによるエモイ話

人はなぜ生きているのか?それは人生を楽しむためである。

なぜ苦しみがあるのか?それは、いつかより人生を楽しめるからである。

いい人である必要は無い。人の顔色ばかり見る必要は無い。わかってあげるだけでいい。

そう、生きているだけで素晴らしい。

そう思いました。

このエントリーをはてなブックマークに追加

Node-REDから見えた未来 - 変わるもの、変わらないもの - SS2017 WG13

ソフトウェアシンポジウム(SS2017)では、前回紹介した論文発表のほか、ワーキンググループにも参加しました。

ワーキンググループでは各グループのテーマに沿って、参加者がそれぞれのポジションを発表して議論します。私が参加したのはWG13「ソフトウェア開発の現状と今後の発展に向けたディスカッション」で「Node-REDから見えた未来 - 変わるもの、変わらないもの -」を発表しました。

Node-REDは高機能なノード(モジュール)がたくさんあり、それらを組み合わせて高機能なシステムを効率的に開発できます。また、簡単にデバッグできるほか、デプロイが一瞬で、開発から確認の繰り返しを素早く実行できます。

このような環境を使っていると、面倒臭いことがなくなり、ソフトウェア開発に重要な作業を中心に実施する様になります。この重要なことはみなさん合意できますよね。という発表でした。

しかし、Node-REDのデモのインパクトが大きかったのか、Node-REDに対する質問で持ち時間が終わってしまいました。Node-REDを知ってもらえたので、良かったことにしておきます。

このエントリーをはてなブックマークに追加

Visual開発ツールNode-REDの導入によるプロセスの変化と考慮点 - SS2017 -

ソフトウェアシンポジウム2017(SS2017)で経験論文の発表をしてきました。経験論文とは研究論文の様に新規性はないものの、事例報告の様に経験を報告するものですが、問題設定や結果・考察を整理してより有効性や信憑性を高めて論文にまとめたものです。

今回はVisual IoTツールと呼ばれているNode-REDのアンケート結果を報告しました。ソフトウェア開発にツールは欠かせませんが、その導入報告はあまりありません。上流のツールであれば、コンサルタントに依頼することもできるかも知れませんが、下流のツールは小さい規模から始めることが多く、導入経験は他の人にも役に立つと思ったからです。

発表ではNode-REDの基本、長所・短所の説明と共にデモもしました。基本的な Hello World のノードを入れ替えてPathをセットするだけで、そのビジネスロジック(文字列の代入)をそのままWebサービスにできる様子をお見せしました。

このようにNode-REDは確認しながら開発するので短期間に品質の高いソフトウェアを作ることができ、アンケートにもある様に非同期処理が簡単に扱えます。その反面、ある程度の規模になれば、データやアーキテクチャなどの設計をきちんとしておかないと複雑になってしまいます。

そういった知識を持ち、ふさわしいプロセスで開発しないとうまくいかないことがアンケートからわかりました。まとめると

  • ツールの知識やノウハウを共有 する
  • 特性を活かした設計を行う
  • 実装を繰り返して常に確認する
  • 主体的にプロセスを変更し、品質 を上流から作りこむ

となり、これは、モダンアジャイル

  • 人々を尊重する
  • 安全な状態を前提とする
  • 素早い実験と学習
  • 価値を継続的に届ける

の基本理念と対応していて、Node-REDの良い導入が開発のアジリティ(機敏さ)を高めると考えられます。詳しくは以下の論文を読んでください。
(実は最終原稿の段階でモダンアジャイルの基本理念と対応していることに気付いたので追加しました)

Node-REDから見えた未来 - 変わるもの、変わらないもの - SS2017 WG13 につづく

このエントリーをはてなブックマークに追加

複合主キーの扱い方

緊急開催:複合主キーは必須なのか?<第55回IT勉強宴会Light> に参加しました(主催者まとめ)。

議論の発端は渡辺幸三さんの「単独主キー専用環境」と賢くつきあうためにという記事。

乱暴に説明すると「データベースではきちんと複合キーを使うべきだ。OOPだからといってカスケードキーでいい加減に作るから、あとでわからなくなって保守ができなくなるんだ。ばかやろう!」ということ。

ここにはいくつか議論をしないといけないことがあります。一部追記したスライドを元に説明しましょう(追記部分は灰色の小さい文字になっています)。


RDBだから複合キーを使わずにできてしまう

渡辺さんのブログを読んでいると、RDBなのになぜ複合キーを使わないのか、という気持ちが透けて見えます。でも、実は多機能なRDBだから複合キーを使わずにできてしまうのではないでしょうか?

複合主キーを持てないKVSや連想配列があります。これらを使うとき、シーケンスの管理が
難しいこともあり、「キー1_キー2」のようにして開発しています。

このことから考えると、RDBなのに複合主キーを使わないのではなく、RDBだからサロゲートキーを作りやすいので、複合キーを使わない開発が簡単にできてしまうのだと思います。

つまり、単独主キーで開発を安易に行うことが問題です。

本来、複合主キーで表現されるデータをどう扱うかは、モデリングの問題ではなく実装の問題です。

複合主キーを使わないのは実装の都合なので、そこにある危険性を周知することが重要だと思います。

(もちろん、、モデリングしているのはあたり前としてです)


オブジェクト指向だから単一主キーとは限らない

渡辺さんのブログでは「OOP好きからは『テーブルに別途ユニーク制約を置くなり、クラスの中に制約のためのロジックを盛り込むなりすればよいだけではないか』と反論されそうだが、」と書かれていますが、それは時代に流されている人ではないでしょうか?

オブジェクト指向システム分析―上流CASEのためのモデル化手法には「オブジェクトのそれぞれのインスタンスを唯一に識別する1以上の属性の集まりは,そのオブジェクトに対する識別子です。」と複合主キーを認めています。

ソフトウェアを開発する場合、様々な視点で特徴や制約をモデリングしないとシステムの詳細は表現できないと思います。複雑な要素を如何に矛盾なく、いかにわかり易く統合していくかが設計者の腕の見せ所では無いでしょうか。


保守性の考慮

もちろん、実装の都合でモデルと異なる方法をとったり、モデル自体を実装に最適化することもあるでしょう。しかし、その場合は注意深く開発する必要があるでしょう。

渡辺さんのブログには「複合主キーを扱えない」という環境自体の特性ゆえの問題が書かれています。

  • エンティティのまとまりやそれに適用される複雑な制約が、開発者自身によって見い出されない
  • 使いづらく保守しにくい業務システム開発が生まれる
  • 単独主キーだけを用いた設計スタイルに逃げ込んでも、問題が見えにくくなるだけで事態はさらに悪化する

つまり、きちんとモデリングされず、保守しにくいシステムが作られ、どんどん深みにはまってしまいます。

このように考えると、複合主キーを使ったモデルそのままに実装できるならDBを見ればわかるかも知れませんが、モデルと異なる実装ならモデルからどのように実装に持ち込んだかわかる様にしておかないといけないと思います(もちろん、モデリングしている前提です)。


おわりに

渡辺さんの主張をより単純化すると「バグを出すなバカやろう」だと思います。

なぜ、バグが出るか、それは「複合主キー環境でないから」ではないと思います。たぶん、複合主キーが使えても同じようなDB設計をするのではないでしょうか?

もし、きちんとモデリングができるなら、本来必要な制約を理解し、わかり易く制約を実装し、必要ならドキュメントも作成するでしょう。

「もともとDB設計というものは高度な専門職」とは思いません。もし、そうなら、ソフトウェア開発のインタフェース設計、システムチューニング、保守、運用、すべて高度な専門職です。

エンジニアリングは一定の努力で誰もが習得できる専門知識です。きちんと勉強して、危険性を理解すれば良いと思います。

問題はすでにできてしまったお客様のシステムをどうするかです。危険性を考慮せずに勝手な思い込みで作られたやっつけシステムは、問題が起きた際は大変だと思います。作り直したくても予算も期間も無いからです。

担当される方のために祈らずにおられません。

彼らをお赦しください。自分が何をしているのか知らないのです(ルカによる福音書/ 23章 34節、日本聖書協会)

このエントリーをはてなブックマークに追加


映画「沈黙」 - ダメな自分を受け入れてたくましく生きる -

映画「沈黙 - サイレンス -」を見ました。遠藤周作さんの告解(赦しの秘跡、いわゆる懺悔)共言える原作を読んでいたので、過激なシーンがないかと少しドキドキしていましたが、良い感じで遠藤周作さんの思いが表現されていました。

ソフトウェア業界ではメンタル面で問題を抱える人が増えています。その根底には主人公のロドリゴの苦しみに繋がる問題があると思いました。

ストーリー

徳川の時代になって禁教令が出た頃、音信不通になった神父を追って日本に宣教に来た神父ロドリゴ、踏み絵を踏んでマニラに逃げ延びたキチジローを案内として神父ガルベと共に日本に忍び込み、隠れながら宣教活動をします。

しかし、キリシタンに対する弾圧は激しさを増し、最後には捕まってしまい、棄教を迫られます。ロドリゴは神に祈りますが神の声は聞こえず、棄教しないと他の人間が殺されていまいます。

踏み絵を踏む事を迫られてついに棄教しようとした時、ロドリゴは神の声を聞きます。

遠藤周作さんに必要だったもの

実話を元に描かれたロドリゴは、宣教師としては失格でしょう。この姿は自ら「ぐうたら」と称する遠藤周作さんの人生の写像の様です。教会からフランスに留学させてもらったものの、結核で帰国。しかも、フランスでは婚約者のいる女性と恋仲になるなど、自慢できない過去がありました。

そんな遠藤周作さんが求めたのは、ダメな自分をゆるして、次に進む力を与えてくれる優しい神様でした(注参照)。そのような信仰が遠藤周作さんに世界から賞賛される作品を生ませました。

これは自己肯定感と言われているものです。

次に進むための自己肯定感

信仰に関係なく、人には自己肯定感が必要です。もし自己肯定感が無いなら、理想の自分とのギャップに苦しむことになります。

その結果、自分の責任ではないと犯人探しをして責任転嫁や言い訳をするか、自分はダメだと自己嫌悪から落ち込む事になります。何れにしても現状を受け入れていないので次に進む事ができません。

プロジェクトをより危険な状態にしてしまう

自己肯定感は個人の問題ですが、その影響でプロジェクトの問題をさらに悪化させ、より危険な状況にしてしまいがちです。

責任転嫁をする人は自分は悪くないと思っていますので、批判しかしません。他の人にたしなめられても受け入れる事ができす、かたくなな姿勢で問題解決に向けた行動を取ろうとしません。

逆に落ち込む人は、迷惑をかけるとか、怒られるからと、問題を報告しないでもう少し自力で何とかしようとしがちです。でも、そもそも問題の原因があまり理解できていないことで問題が顕在化したのですから、問題は大きくなるばかりです。

自分は一人じゃない

「沈黙」の神様は最後の最後にならないと声を聞かせてくれませんでした。しかし、プロジェクトは会社という組織活動ですので、一人ではありません。

わからない事は聞けば良いですし、困った時は相談すれば良いはずです。それができないのは、自分や現実を肯定できないからです。

(もちろん、逃げ出さざるを得ない時もあるでしょうが、そのような状況なら、一人で努力するだけ無駄です)

より良い未来をめざす!

現実を受け入れた後の未来は、理想どおりではないかも知れません。しかし、合理的で、自分一人で悩むよりもより良い未来です。

人の助けを借りても負い目を感じる必要はありません。今度は他の人を助ければ良いのです。そうすれば、幸せの輪がどんどん広がります。責任逃れをしている自分、情けないほどにダメな自分を認めれば、人に優しく、社会に貢献できるのです。

ダメな自分を受け入れてたくましく生きましょう。映画「沈黙」を見て、その思いを強くしました。


遠藤周作さんまでのキリスト教は、明治時代の内村鑑三を初めとする厳しいキリスト教でした。キリスト者として生きる事が神の証であり、悪い事をせずに清く生きる事が求められました。

しかし、現実には戦時中に「父と子と聖霊と天皇陛下万歳!」と言わなければ、教会を存続できませんでしたし、闇市に依存するなど法律を破らなければ生きていけない時代だったようです。

そのように誰もが罪の十字架を背負っている時代を踏まえて、遠藤周作さんは傍にいる神の愛と赦しを信仰の中心としました。より愛を重視する考え方は世界的にも注目され、「沈黙」は多くの国で翻訳されて読まれることになりました。

このエントリーをはてなブックマークに追加


«「深層学習の概要とドメインモデル」に参加してエモーションチップを考える