C#
Excel
ASP.NET

Excel主義者に思うこと。

コードファーストいずこ…

Excel主義者といっしょに仕様書を作るのはたいへんだなぁと、このところ毎日思っている。テーブル定義書とかER図は、ASP.NET MVCを使うと、コードファーストまたはデータベースファーストで、じっさいに動くコードからちょろっと作れるわけで、Excelで書いてからデータベースを作ったりコードを作ったりする、というのの隔靴掻痒さに、途方にくれるのだ。

Excel主義者

「Excel主義者」とでもいったらよいのか。よのなかに存在するソフトウェアは、まあおおむねExcelしかないのだろうとは思うけれども、そのExcelを使って、いわゆるExcel方眼紙のようなものを作り、表であることを無視して絵を描いたり、セルを結合して不定形な表を作ったりする人たちがいるわけである。

究極の手作業

それはもうなんというか、とても究極的な手作業のようなものであって、そういう人たちにとってはセルが結合しているかどうか、セル内の文字の位置がどうなっているか(上寄せとか)、見出しのセルの色がグレーになってめだっているか、表の罫線があるか、みたいなことがきわめて重要な価値観なのである。

画面仕様書byExcelとプロトタイピングの画面キャプチャー

こちらはプロトタイピングが好きなので、Excelで動きもしない縦横の崩れた--したがって実物を作ると再度レイアウトをやり直す必要があるか、あるいは無理やり一部を縮小したりしていれ込むか--みたいなばかげた表示のやりくりを押しつけられるような仕様書を書くのは苦痛で、プロトタイピングの画面のキャプチャーでよいのではないかというと、プロトタイピングで実物に近いものを見せると、「お客さんからもっと要望が出てくる」などというのだが、お客さんから要望が出るのならそれを反映したほうがよりニーズを満たしたものができるだろうし、わざわざ意図を伝えあうのに不向きな線画をExcelで描くよりもずっと効率がよいだろうし、それをわざわざExcelで描く理由も必要性もぜんぜんわからないので、途方にくれる。
ボタンだってテキストボックスだって、htmlで書けば実物そのものだし、クリックイベントで動かすくらいはほとんどたやすい。
コードファーストで作るER図やテーブル定義書ならコードと完全互換だけれど、Excelで手書きした奇矯なテーブル定義書をコードに起こすのは、途方もない想像力や判断力、あるいは単調な再入力が必要になる。
Excel主義者が自分で描くのならどんなものでも受け入れようと思うが、プロトタイピングやhtmlを使える人に、「Excelで描け」と強制するのには強烈な違和感、あるいは不愉快さを感じるのだ。

データの流用

セル結合したExcel方眼紙に吹き出しをつけて描いたような画像は、そこから文字を抜き出すのもたいへんだし、あとからソフトウェアに流用できるところがほとんどひとつもない。こういうときは、文字を打ち直したりすることになるが、打ち直すと当然打ち間違いが起きたりするから痛しかゆしで、慣れないExcelを使うはめになる。当人にしか理解できない複雑なマクロを使っていたりして、コピーしても文字をうまく抜き出せないことだってある。そんなわけでExcel主義者と仕事をするのが日々苦痛。縦横に広がりタブデシーとが複数になった途方もないサイズの(1000行とかの)一部を折り畳んだ表とかを見ていると、めまいがしてきて、そのあと3-4時間もめまいが止まらず、仕事にならなかったりする(実話)。

セル結合でできる不自然な空白

セル結合した表をたとえばcsvのような形で抜き出すと、不自然に空白セルができてしまって、それがなぜ空白なのかデータからはわからない。単純にデータがないのか、それとも画面のセル結合の理由でぜったいにデータが入らない、はいっても表示できないので入れてはいけないのか、ぜんぜんわからない。おなじデータの入ったセルを並べようとしてもかんたんには並ばないし、プログラムで加工して最終的にExcelに出すときには、おなじ数の空白セルを入れる必要がある。これは単純にデータを整形して出すことに較べて、ちょっと手間がかかる。
ちょっとといいつつ、あまりにも手間がかかるので、専用のメソッドを作ったくらいで、まあ専用のメソッドを作れば、空白の数をコントロールしてくれるとは言い条、すべての出力で見栄えのための整形が必要というのは、単純なデータではないということで、それもなんというかげんなりする。
たとえば「タイトル」「著者」「内容」みたいな3項目の表が、じつはそれぞれ20、10、30個のセルを結合してできてたりする。ってことは、19、9、29個の空白を入れる必要があるわけだ。

タイトル\t著者\t内容
ギケイキ\t町田康\t源義経を主人公にした冒険譚
アルモニカ・ディアボリス\t皆川博子\t18世紀ロンドンのロマンティック犯罪捜査
時を刻む湖7万枚の地層に挑んだ科学者たち\t中川毅\t水温の低い湖の湖底をボーリングして過去の地球の変遷をたどる。

みたいな単なるタブ区切りの表をセルに入れるのに、次のようにする必要があるわけだ。

foreach (var line in lines)
{
    var linecells = new List<string>();
    for (int i = 1; i <= 19; i++)
        linecells.Add("");
    linecells.Add("タイトル");
    for (int i = 1; i <= 19; i++)
        linecells.Add("");
    linecells.Add("著者");
    for (int i = 1; i <= 29; i++)
        linecells.Add("");
    linecells.Add("内容");
}

みたいになる。これはもうなんというか、黙っちゃうようなコード。書いていていやになる。

セル内改行

セル内改行というのもまたなんというか、どうしようもない機能だ。そもそも、セル内で改行するということは、データがデータのかたちをしていない、ということを如実に示す例といってもいいくらいだと考える。セル内で改行するくらいなら、1行一データになるように項目を立てればいい。そういうように項目を分離できないから、セル内で子項目みたいな不細工なことになるわけで。

仕様書をExcelで手作業で書く

依頼者のサンプルをもとに、テーブル定義、項目仕様書、ER図を作ることになっている。サンプルが届かないので、当然いっさいの作業はまあ不毛なのだが、さらに不毛に拍車をかけるのが、仕様書をExcelで手作業で書くということだ。基本的にテーブル定義さえできれば、項目仕様書やER図は、自動で生成できる。自動で生成できるものに手間をかけるのは無駄だと思う。自動でできないところに注力すべきだからだ。マンパワーは有限で、自動でできることをわざわざ時間をかけてやっているからたとえばそのうち残業したりするわけだろう。
というわけで、テーブル定義から項目仕様書を自動で生成するツールを作っている。
それに対して、手でExcelで項目仕様書を書け、と指示するExcel主義者には、なんというか言葉を失うな~。としかいえん。

コミュニケーションが不足している

わたしは自分の強みはプロトタイピングだと思っていて、そのわたしにExcelで図を描けと指示する上長というのは、まあ無能というか信頼に足りないというか。あるいはコミュニケーションが不足しているというか。
そういう上長に対して、まあ自動生成ツールを作ってなんとか指示をこなしているものの、不毛感強し。たぶん相手も、「こいつ自分の指示聞かんな~」と思っているだろうから、コミュニケーションで問題が発生しているとは思うな~。う~む。
「承知しました」といって自動生成ツールを作るのと、「プロトタイピングやコードファーストを使って楽しましょうよ」と提案するのと、(提案はしてみたがスルーされた)、まあ彼の耳にここちよいのは「承知しました」なんだろうな。
っていっても、まあ顔に出ちゃうからな~。きっと。
クールにツール作って遊ぼう。

コミュニケーションツール

コミュニケーションの方法もいろいろで、たとえば最新のファイルがどこにあるのかとかでさえ混乱している。
・社内用SNS 比較的自由に使えるがプロキシを通さないと使えないので、たとえば出先やスマートホンからはアクセスできない。
・社外用SNS 客との相互やりとりのため使用する。基本的にはビューオンリー。
・メール 当然プロキシ必須。外では読めない。スマートホンも無理。
・共有フォルダ サーバー名が組織名を使っていて複雑で長く、コードをおくとしばしばファイルパスの文字数制限にかかってしまう。
・Subversion
・口頭
というありさま。最新のファイルがどこにあるのか、共有フォルダの受領フォルダなのか、提出フォルダなのか、Workのtmpなのかぜんぜんてんでんばらばら。
しばしばメールに添付だったり、メールに添付したExcelの表に貼ってあったりする。そんなものどうやってファイルとしてあつかうんねん!
予定はExcelファイルに書いたものを不定期に共有フォルダにアップしている。
共有フォルダはoldとかtmpとかworkとかを散見する。

いや~。最新のファイルと指示だけをとりあえずするっと見たいんですけど…。