愚かであることに対する報酬は不公平
はじめに
IT業界以外には”誰でも”受け入れることができるように業務の標準化やドキュメントをやさしく書くことが求められます。少なくともSierはその手の”配慮”が強く求められることが少なくありません。そのような”配慮”が続かなくなった経験を話そうと思います。
サンプル
なぜかは分かりませんが日々人間が成長するように成果物の”品質”も日々高めていくことが求められます。その品質の指標としてどれだけ”配慮”できているかを指標にしているケースがありました。
1か所見るだけですべてを理解できるドキュメント
“誰でも理解できる”ことを目指して(?)すべての情報が書かれたドキュメントが出来上がったことがあります。要求は徐々に増えてゆき、最初はそれぞれのドキュメントを見たらわかるから、一つのドキュメントを見たらわかるになり、最終的に1項目見たらすべてがわかるというように少しずつ”品質”を高めることが求められるようになっていきました。
以下のドキュメントがありました。
- テーブル定義
一般的なテーブル定義…それでも普通のテーブル定義より詳細に作られていました。 - 画面項目書
こちらが”進化”を続けていった設計書です。
基本的には画面に表示された項目が定義されています。最終的にそれだけではなくなりましたが…。
1か所見ればすべてがわかるようにしよう
最初は画面に何が表示されるのかを示すだけのファイルでした。しかし、徐々に親切な設計書に進化していきました。
- onLoad、onChangeなどのイベントで更新される可能性がある箇所を記述しよう
- 画面の項目と対応するDBのカラムを書こう
- 実際に値を書き換える処理が走るのがクライアントサイドで自動で項目を更新するか、サーバーサイドで直接更新を書けるのかわかるようにしよう。
- 何らかのボタンを押したらどのテーブルの何のカラムがどの項目の値で上書きされるのかを書こう
- 自動的に入力される項目はどのテーブルのカラムが自動的に入力されるのかを書こう
- 処理で使う変数名に迷わないように設計書に書こう
- ファイル名がわからなくならないように設計書にファイル名を書こう
- 物理名の方がわかりやすい場面と論理名の方がわかりやすい場面があるから両方を書こう
- どんどん書き足したとしても、見た目が変わったら混乱してしまうかもしれないからフォーマットは絶対に変更しないようにしよう。
…ほかにもあるような気がしますが、運用者にも製造者にも親切な設計書を目指していたようです。これが混迷を極めていったのは 最後に書いた親切、フォーマットが変更されないようにしたでしょう。書く内容は増えていくのに書く場所は増えない、その結果として、もはやどこに何が書かれていればよいのかは把握しきれなくなりました。
以下は設計書のイメージです。実際の設計書とは書き方は異なりますが、考え方は合っているはずです。
サンプル
■画面項目
項目 | 必須 | 入力制約 | 型 | 入力チェック | 参照テーブル | 備考 |
---|---|---|---|---|---|---|
姓 | 〇 | 最大40文字 onLoadで取得したユーザ情報の姓を自動挿入 | String | ユーザー.姓[user.first_name] →購入.ユーザ姓[buy.user_first_name] | onLoadでユーザ情報を取得する | |
名 | 〇 | 最大40文字 onLoadで取得したユーザ情報の名を自動挿入 | String | ユーザー.名[user.last_name] →購入.ユーザ名[buy.user_last_name] | onLoadでユーザ情報を取得する | |
姓(カナ) | 最大120文字 姓を入力したら自動挿入 姓をクリアしたらクリア | String | ユーザー.姓(カナ)[user.kana_first_name] →購入.ユーザ姓(カナ)[buy.user_kana_first_name] | onLoadでユーザ情報を取得する | ||
名(カナ) | 最大120文字 名を入力したら自動挿入 名をクリアしたらクリア | String | ユーザー.名(カナ)[user.kana_last_name] →購入.ユーザ名(カナ)[buy.user_kana_last_name] | onLoadでユーザ情報を取得する | ||
フルネーム | 読み取り専用 姓を入力したら自動挿入 | String | ユーザー.フルネーム(カナ)[user.full_name] →購入.フルネーム(カナ)[buy.user_full_name] | onLoadでユーザ情報を取得する | ||
フルネーム(カナ) | 読み取り専用 姓を入力したら自動挿入 | String | ユーザー.フルネーム(カナ)[user.kana_full_name] →購入.フルネーム(カナ)[buy.user_kana_full_name] | onLoadでユーザ情報を取得する | ||
郵便番号 | 〇 | onLoadで取得したユーザ情報の郵便番号を自動挿入 | String | ユーザー.郵便番号[user.post_number] →購入.郵便番号[buy.user_post_number] | onLoadでユーザ情報を取得する | |
都道府県 | 読み取り専用 郵便番号を入力したら自動挿入 郵便番号をクリアしたらクリア | String | 購入.都道府県[buy.user_prefecture] | 郵便番号のonChangeで都道府県を取得する | ||
市区町村 | 読み取り専用 郵便番号を入力したら自動挿入 郵便番号をクリアしたらクリア | String | 購入.市区町村[buy.user_city] | 郵便番号のonChangeで都道府県を取得する | ||
住所 | 〇 | String | (address) →購入.市区町村[buy.user_address] | |||
利用規約 | HTML | 利用規約.本文[terms_of_use.content] →(terms_of_use.content) | onLoadでユーザの言語に応じた利用規約を取得する | |||
利用規約に同意する | 〇 利用規約のscrollで末尾に到達したら必須にする。 | 利用規約が末尾までスクロールされていない 読み取り専用 上記以外 なし | Boolean | (agree) →購入.利用規約への同意[buy.agree] | 利用規約のscrollで末尾に到達したら読み取り専用を解除する。 | |
■更新データ | ||||||
購入[buy] | ||||||
[C] クライアントサイド | ||||||
[S] サーバサイド |
項目名 | 物理名 | 型 | テーブル名 | 設定値 送信ボタン | 設定値 戻る |
---|---|---|---|---|---|
姓 | user_first_name | varchar | 購入[buy] | [C]画面入力値 | |
名 | user_last_name | varchar | 購入[buy] | [C]画面入力値 | |
姓(カナ) | user_kana_first_name | varchar | 購入[buy] | [C]画面入力値 | |
名(カナ) | user_kana_last_name | varchar | 購入[buy] | [C]画面入力値 | |
フルネーム | user_full_name | varchar | 購入[buy] | [C]画面入力値 | |
フルネーム(カナ) | user_kana_full_name | varchar | 購入[buy] | [C]画面入力値 | |
郵便番号 | user_post_number | varchar | 購入[buy] | [C]画面入力値 | |
都道府県 | user_prefecture | varchar | 購入[buy] | [C]画面入力値 | |
市区町村 | user_city | varchar | 購入[buy] | [C]画面入力値 | |
住所 | user_address | varchar | 購入[buy] | [C]画面入力値 | |
利用規約に同意する | agree | boolean | 購入[buy] | [C]画面入力値 | |
Created | created | datetime | 購入[buy] | [S]送信ボタン押下時の日時 | |
CreatedBy | created_by | varchar | 購入[buy] | [S]ログインユーザのフルネーム | |
Updated | updated | datetime | 購入[buy] | [S]送信ボタン押下時の日時 | |
UpdatedBy | updated_by | varchar | 購入[buy] | [S]ログインユーザのフルネーム |
同じようなことが複数の場所に書かれていると思います。ただ、これで1行の項目を見ただけでどのテーブルに書かれているか、どんな景気で更新されるかがわかるようになったね!という事らしいです。私は正直に言ってまだ全容を把握しきれていませんが
無限に出来上がっていくルールとチェックリスト
書くことが難しいためミスが多発していました。同じような内容を複数のか所に記載しているため、直っているところと直っていないところが発生する。イベントを書く場所が間違っているなど、OneNoteで記述した設計書であり、Excelなどで記述した内容を転記することを禁じていたこともそれを助長しました。
そのような状況であったため、ミスを防ぐためのルールやチェックリストがどんどん増えていきました。誰かがミスをするたびに新しいルールが増えていく…。
真面目にチェックリストを先頭からなぞるとどんなに軽微な修正でも数時間はチェックに取られることになる。だからと言って作業が遅くなることは許されないし、もし、チェックリストにある内容であってもミスをしたら新しい対策とミスをしないためのチェックリストを考えさせられる。
IT業界に蔓延る愚かであることに対する報酬
Sier業界では人の入れ替わりが激しいためか、誰でも読み書きできることを保守性の指標とすることがあります。先のサンプルははっきり言って保守性がかなり悪いと感じています。一方でマネージャーあるいはリーダーは”保守性に優れた設計書”という認識をしていたようでした。
リーダーたちにとっては処理という難しい概念を持ち出す必要はなく、製造者にも運用者も理解できる設計書作成できている。また、知りたいと思われる1行分を見るだけでどんな情報が書き込まれて、最終的にどのテーブルのカラムに値が書き込まれるのか理解できる。
これは運用者だけでなく、製造者も満足に条件分岐や繰り返し処理といった基本的な構文すら理解していないことも原因にあります。信じがたいですが事実です。私はこのプロジェクトにおいて、メンバーに20行足らずの処理を記述するために8時間近い時間をかけて説明をした覚えがあります。
このような状況であったため、処理などという難しいことを事前に記述することは難しかったのです。メンバーたちも成長する意思はありませんでした。実際そのまま数年過ごしていたのですから、それは明白です。
リーダーたちはこの状況でも記述することができる設計書や処理を考える必要があったのです。その対策として行われた施策は間違った努力であったと感じています。私にはこれを愚かであることに対する報酬であると感じています。
なぜ不満を感じるのか
私も自分のことは愚か者であるという自覚があり、不公平感を感じているからです。
リーダーたちは自分たちが諦めた割にメンバーが成長するために技術的な説明をすることを私をはじめとしたある程度の能力があるメンバーに押し付けていました。
私もこのような設計書を書かされて、数時間にもわたるチェックリストを先頭からなぞらされるのは非常に面倒くさい。やりたくありません、サボりたいです。その結果、新しい施策を考える羽目になりました。より、面倒くさくなりました。もっとサボりたくなりました。
しかし、私に対する配慮はありませんでした。何故やらないのか?ということを問い詰められたこともあります。他の人にはそんなことしませんよね?
この施策は持続可能ではない
当然である…と思っていますが、自分だけずっと我慢させられているような気持ちにさせられています。そのような感情を抑え続けることには限界があります。愚か者は感情や衝動を抑えることができません。
このようなことに付き合いきれなくなったら、新しいメンバーと入れ替える。もし、入れ替えができなければ限界を迎えるまで使い倒す。
最もよいのはこの状況を何とも思わずに受け入れてくれる程よい技術力があるメンバーを探すことでしょう。そのような人物がいるのかはわかりませんが。