ふつーのプログラマです。主に企業内Webシステムの要件定義から保守まで何でもやってる、ふつーのプログラマです。

魔女の刻 (13) RFC4180

»

 4 月に入ると、私たちの開発センターでの一日が、ルーチンとして定着してきた。
 私の場合、東海林さんか細川くんのどちらかの車にピックアップしてもらい、9:00 から9:30 の間に開発センターに出勤する。周囲のプログラマと挨拶を交わしながら、自席のPC を起動。VDI なので起動を苛々待つこともなく、20 秒後にはログインできる。ログインと同時にEclipse とグループウェアが開く。グループウェアにはその日のアサインチケットが届いている。
 この頃になると、打ち合わせの数ははっきりとわかるほど減っていた。代わりにアサインされるようになったのが、単体テストのチケットだった。私が単体テストのチケットを受け取ったのは、だいたい4 回から5 回に1 回の割合で、これはどのプログラマでも同じようだった。白川さんが各プログラマの適性を見極めるだけのサンプル数が集まれば、この割合もまた変わっていくのだろう。
 打ち合わせと違って、実装は特に制限時間が決められているわけではないが、昼前と16:00 には次のアサインチケットが届くので、ダラダラと進めるわけにはいかない。コンテナ個々の難易度は今のところ高くはないが、単体テストで不具合と判断されるとステータスは「差し戻し」となる。「差し戻し」になったコンテナは、実装者に再度アサインされることが多いが、予定されているチケットとの重複は考慮されないため、それだけ自分の作業が遅れてしまうことになるわけだ。
 作業がスムーズに進めば、19:00 から 20:00 で、その日のアサイン分を消化し、グループウェアに日報を入力して退社できる。帰りも時間が合えば、車に相乗りさせてもらうが、そうでなければバスと電車を乗り継いで、横浜市の自宅まで帰ることになる。
 他のベンダーの参加者も、私と同じようなパターンに落ち着きつつあったが、やはりスキルによる差は出てくるので、私が退社する時刻になっても、疲れた顔でモニタを睨んでいるプログラマが何人かはいた。もっとも、その数は多くはなく、特定の個人に偏っているわけでもなかった。白川さんが最初にスキル不足の参加者をバッサリ切り捨てたため、極端に経験が少ないとか、スキル不足のプログラマはいないはずだ。
 当初は同じ会社の仲間か、せいぜい同じ島の人たちとしか交流が発生しなかった私たちだが、この開発体制に慣れ、作業の1 つ1 つが身体に馴染んでくるにつれて、他の会社の人たちとも食事に行ったり、ブレイクルームで無駄話をしたりする余裕が出てくる。その交流が一通り終わると、次は何となく気の合う者同士のグループが生まれた。私はというと、4 月から弁当のデリバリーが開始されたのを機に、女性メンバーでブレイクルームに集まることが多くなった。やはり女性同士の方が話が弾む、ということもあったが、別の理由もあった。うちの会社の男どもは、揃って濃い味の食物を好み、当然のようにその手の店を選ぶのだ。たまにはいいが、毎日のように横浜家系のラーメン屋ばかりでは、胃がひっくり返りそうになる。デリバリー弁当は品数は多くなく、最大公約数的な味だが、女性向けのヘルシーなメニューが選べる。
 4 月19 日の暖かい午後、私はいつものように、他の3 人の女子とブレイクルームで少し遅めのランチを楽しんでいた。私はデリバリーで注文した「季節のそぼろご飯」、チハルさんは同じくデリバリーの「ヘルシー唐揚げ弁当」と追加のシュウマイ3 個、サクラギ・システム開発の北村キョウコさんは持参したおにぎりと煮物、相模データコネクトの津久井ユミさんはコンビニで買ってきたサラダだ。
 ランチのときは、進行中のチケットにまつわる事柄は一時保存しておいて、他愛のないことを楽しく喋り続けるのが常だった。この日の話題は、チハルさんの注文した弁当がテーマだった。すなわち「ヘルシー」と「唐揚げ」が同時に成立するのか、という重要な命題についてだ。体育会系出身で最年少のチハルさんは胸肉だからヘルシーだと主張し、2 才になる女の子の母親であるキョウコさんは揚げてある以上ヘルシーではないと反論した。私は使っている油が何かによってヘルシー度合いが変わってくるのではないか、という意見を述べ、独身でベジタリアンを自称するユミさんは、そもそも肉を食すという行為を許容している時点であんたたちはみんな頭がおかしい、と切り捨てた。
 議論が白熱し、ブレイクルームにいた男性たちが呆れた目で見つめていたとき、細川くんが入ってきた。コーヒーでも買いに来たのかと思ったが、急ぎ足で私の方に歩いてくる。私はイヤな予感に襲われ、手と口を止めた。その予感は正しかった。
 「川嶋さん、すいません」細川くんは申しわけなさそうに言った。「ちょっと来てもらえますか」
 「ちょっと、ホソッチ」チハルさんが口を尖らせた。「あたしたち、ランチ中なんだけど」
 「終わるまで待てないの?」キョウコさんも不満そうに言った。「せっかくチハルちゃんを論破できそうなんだから」
 「はあ? 優勢なのはあたしの方ですよ」
 「すいません」細川くんは小さく頭を下げたが、引き下がろうとしなかった。「ちょっとお願いします」
 「急ぎ?」私は訊いた。
 「はい。すいません」
 私は半分ほど手をつけたランチボックスに蓋をした。
 「ごめん。ちょっと行ってくる」私はハンカチで口元を拭いた。「すぐ戻ってくるから。チハルさん、私の弁当、食べないでよ」
 3 人の女子が笑い崩れるのを背に、私は細川くんと一緒にブレイクルームを出た。
 「で、何なの?」
 「午前中に川嶋さんがやった単体テストのことで、ちょっと問題が」
 「テスト?」私は首を傾げた。「CSV のインポートのやつね」
 「それです」
 細川くんが向かったのはフリースペースのテーブルの1 つだった。エース社員でサブリーダーの一人である佐野さんと、FCCみなとシステム開発の青柳さんが座っている。
 「ああ、来ましたか」佐野さんは平板な声で言った。「川嶋さんがやった単体テストについて、少し事情を聞きたいと思いまして」
 「そうですか」
 私は座りながら、佐野さんと青柳さんを見た。佐野さんは17:00 に帰るシフトのサブリーダーで、白川さんに言われた業務はこなすが、このプロジェクトに対する熱量は上司の1 %にも満たないようだ。他のサブリーダーやシステムエンジニアとも隔意ありげで、それほど親しくしている様子でもない。
 青柳さんは40 代半ばで、典型的な中年太りの男性だ。打ち合わせで一緒になったことが何度かあるが、それなりの経験を持つプログラマのようだった。言葉を交わした限りでは、非常識な様子ではなかった。
 「どんなことでしょうか」私は丁寧に訊いた。
 「KGCT_821_060 なんだけどね」佐野さんはタブレットを指した。「これ、もう2 回目なんだよね。ちょっと指摘が間違ってるんじゃないかなあ」
 KGCT_821_060 は、図書館システムのコンテナで、所定のフォーマットのCSV ファイルを読み込み、Cassandra 上の一時テーブルに保存した上で、後続のコンテナが処理をするためのid を返す仕様となっていた。CSV がどこから渡ってくるのか、人間が手入力しているのか、何らかの別システムが生成しているのかは仕様に明記されていなかったから、常識的にCSV ファイルを読み込む際に必要だと思われるテストを行った。
 「ちなみに最初の単体テストを行ったのは、細川さんだよね」佐野さんは私と細川くんを交互に見た。「おんなじ指摘をしているみたいだけど。何か相談でもした?」
 「まさか」私は首を横に振った。「細川が同じコンテナのテストをやったことさえ、知りませんでしたから」
 「ふーん。そうなんだ」佐野さんの声に疑いが混じった。「で、同じ結論を出したってことね」
 つまり青柳さんが実装したコンテナを、まず細川くんが単体テストを行ってダメ出しした。青柳さんは修正してコミットしたが、今日の午前中に私が単体テストを行い、同じく×をつけたわけだ。私は細川くんに訊いた。
 「あんたはどこをNG にしたの?」
 「改行を含む行でテストしたら例外になったんです」
 確かに私も同じ内容の指摘をしていた。
 「私も同じです。改行を含んだデータを渡したら例外になったので、そう指摘したんですが」
 それを聞くと、佐野さんはやれやれ、と言いたげな笑いを浮かべ、青柳さんを見た。青柳さんは暗い顔で小さく頷いた。
 「ああ、やっぱり」勝ち誇ったような声だ。「青柳さんの言った通りですね。そもそもテスト方法が間違ってるんですよ」
 私と細川くんは顔を見合わせた。
 「すいません。どういうことでしょうか」
 私としては青柳さんに問いかけたつもりだったが、答えたのは佐野さんだった。
 「あのね」佐野さんは上から目線で言った。「CSV ファイルってテキストファイルでしょう。テキストファイルってことは、行の区切りが改行コードだよね。フィールドの途中に改行が入ること自体、おかしいって思わないかな。改行が来たら、そこでその行は終わり。だよね?」
 私は再び細川くんと視線を交わし合った。細川くんの顔には、説明は年長者の私に譲る、と書いてある。
 「私が仕様をはっきり理解していなかったのかもしれませんが」私は慎重に前置きすると、佐野さんを見た。「このコンテナに渡されるCSV ファイルは、元々、誰が作るんでしょうか」
 「えーとね」佐野さんは手元のタブレットで検索した。「大元は市の発注オンラインで作られる納期回答データだね」
 「確か、備考の項目があったと思うんですが、これは何が入ってくるんでしょうか」
 「何と言われてもね。備考は担当者が手入力するから何が入ってくるかなんてわからないね」
 「その備考欄はテキストですか? それともテキストエリアですか?」
 「さあ」
 頼りないというより、そもそもやる気スイッチがオフになったままのようだ。私は顧客常駐席の方を見た。タスクフォースの赤松さんが座っている。
 「細川くん」私は親指で赤松さんを指した。「訊いてきて」
 「あ、はい」
 細川くんは立ち上がると、小走りで赤松さんの席に向かい、一礼してから話しかけた。赤松さんは細川くんの話に耳を傾けていたが、すぐに頷いて、手元のノートPC のキーを叩き始めた。私たちが見守る中、目的の画面を見つけたらしい赤松さんは、ノートPC のモニタを細川くんに見せながら、一言二言何かを説明した。細川くんは礼を言い、また早足で戻って来た。
 「テキストエリアでした」細川くんは座りながら報告した。「最大文字数は1000 文字ですが、改行やダブルコーテーションなどの制限はないそうです」
 私は頷いて、佐野さんの顔を見たが、相手はだからどうした、と言いたげな不機嫌そうな表情を浮かべただけだった。
 「あの、つまり、備考には改行が入る可能性があるということですが」
 「いやだからね」佐野さんはわざとらしくため息をついた。「CSV ファイルを使っている以上、改行がフィールドの中に入ることはあり得ないじゃない。入力するときがどうかなんて関係ないでしょ」
 細川くんが勢い込んで口を開きかけたが、私はそれを制した。こういう人種の扱い方には、それなりのコツがあるのだ。
 「すいません」私は佐野さんに頼んだ。「コンテナの仕様を見せてもらえますか」
 佐野さんは面倒くさそうにタブレットを操作して私の前に置いた。KGCT_821_060 のコンテナ仕様が表示されている。私は素早く目を通した。
 「仕様によると、備考に限らず、どの項目にも改行が入らない、とは書いていないようですが」
 「そりゃ、常識だから書かなかっただけでしょ」佐野さんは鼻を鳴らした。「テキストファイルなんだから常識じゃないの。それぐらいわかるでしょうが」
 プログラマが嫌うものを上げると長いリストができるが、バカだと思われることや、そうほのめかされることは先頭付近に位置するだろう。私が以前一緒に仕事をしたことのある男性プログラマは、普段はとても物腰の穏やかな人なのだが、冗談であってもバカという言葉を投げられると、瞬時に沸点に達してしまい、人でも殺せそうな視線を相手に突き刺していた。私だって、そんなことも知らないのか、と言われるのは不快だ。知識が明らかに不足している相手からの場合は特に。
 「失礼ですが、CSV のRFC を読んだことはありますか?」
 私がそう訊くと、佐野さんは訝しげに眉を寄せた。青柳さんは顔を背けている。
 「RFC? 何、それ」
 「簡単に言うと、インターネット関連技術の規格書みたいなものです。別に強制力があるわけじゃないですけど」
 「ああ、あれね」佐野さんは曖昧に頷いた。「聞いたことあるよ。で、それが何」
 「CSV にもRFC があるんです」私は説明した。「RFC4180 だったと思います。それによると、フィールドをダブルコーテーションで囲めば改行を含んでもいいんです」
 「は? どういうこと?」
 「つまりですね」私は細川くんが持っていたプリントアウトを1 枚取り上げると、裏に簡単な例を書いた。「こういうことです」

aaa,bbb,"ccc
ddd",eee

 「ちなみに」私はその下に別の例を書いた。「フィールドの中に、ダブルコーテーションを含む場合はこんな風に二重化します」

aaa,bbb,"ccc""ddd""eee",fff

 佐野さんはプリントアウトを手元に引き寄せて見たが、意味がよくわからなかったのか、青柳さんに問いかけるような顔を向けた。青柳さんは小さく唇を歪めると、初めて口を開いた。
 「いや、これは対応するのは難しいですね。1 行読んで、次の行も読まないと、フィールドの区切りがわからないということです。その次の行にまたがるかもしれない。それを全部考慮して、フィールドを切り出すなんて相当工数がかかりますよ」
 「普通に車輪の再発明してればそうですけど、CSV 読み書きするライブラリがあるので、それを使えばいいじゃないですか。OpenCSV が可能なJar ファイルとしてクラスパスに入ってますよ」
 「それはフリーのライブラリなの?」佐野さんが訊いた。
 「そうです」
 「青柳さんはそういうフリーなやつを信頼できないってことを言ってるんじゃないの? 違う?」
 青柳さんは小さく頷いた。
 「私もよく使いますが、普通にパースできてますよ」私は反論した。「一からコード書くより信頼できますが」
 佐野さんは困惑したように時計を見て、私、青柳さん、細川くんの順番に視線を向けた。私たちのテスト方法が間違っていると確信していたのだが、それが揺らいできているらしい。
 「あー、そう」佐野さんは青柳さんに言った。「そのライブラリを使ったことはあるの?」
 「いえ」青柳さんは短く答えて下を向いた。「ありません」
 「確認するけどさ」佐野さんは私を見た。「そのOpen なんとかを使えば、改行が入っていても問題なく区切れるってこと?」
 「はい」
 「ふーん。じゃ、こうしようか。青柳さんはそのライブラリを試してみて、それで間違いなく改行入りの項目が切り出せるのか確認する。その結果を見て、また問題があれば、改めて話を聞かせてもらうってことで。どう?」
 青柳さんも、私も頷いた。佐野さんはランチの約束でもあるのか、また時計を見ながらタブレットを掴んだ。
 「じゃ、そういうことで」
 そう言うと佐野さんは急ぎ足で自席に戻っていった。青柳さんは暗い表情で、私たちを見ないまま、ゆっくりとその場を離れた。
 「ふう」私はため息をついた。「困ったもんね」
 「エースがですか?」細川くんがくすりと笑った。「それとも青柳さん?」
 「どっちもよ。あんたも、これぐらい自分で反論できるでしょう」
 「そうしようとしたんですけど、佐野さんが川嶋さんを呼んでこいってきかなかったんです。川嶋さんに会いたかったんじゃないですか」
 「やめてよ」私は立ち上がった。「じゃ、私はランチに戻るから」
 「はい、すいませんでした。でも、青柳さん、本当にOpenCSV 知らなかったんですかね。わりとスタンダードだと思うんですけど」
 「うちではそうでも、他では違うかもしれないからね」
 全部自分でコーディングするのが好きなプログラマもいれば、できるだけオープンソースのライブラリを使うことを好む人もいる。青柳さんは前者の一人にすぎないのかもしれないし、自社内では独自のライブラリを使用していて、OpenCSV の存在を知らなかっただけかもしれない。
 「でも」細川くんは私と並んでブレイクルームの方へ歩きながら、小声で言った。「青柳さん、FCC みなと開発ですよね」
 「それがどうかした?」
 「KGCT_821_060 の仕様決定の打ち合わせを最初にやった人、誰だか知ってます?」
 「さあ。そこまで気にしなかったから。誰?」
 「名前は忘れたんですけど」細川くんは首を傾げた。「でも、FCC みなと開発の人だったんです。そのとき、備考フィールドに何が入ってくるのかとか、話に出なかったんでしょうかね」
 「出なかったのかもね。いや、そんなことはないか」
 私たちの打ち合わせの相手は、ほとんどがタスクフォースの職員だ。彼らはシステム屋ではないので、まずどんなシーンで使用されるコンテナなのかを説明するはずだ。
 「出たけど、仕様書に盛り込む必要を感じなかったんでしょうね」
 「同じ会社の人同士でそういう話をしそうな気がするんですが」
 「する必要がある? 私だって、あんたが同じコンテナのテストをやってたなんて知らなかったんだから」
 「ですね。じゃ、ランチを楽しんでください。あ、そういえばデリバリーのお弁当って美味しいですか?」
 「まあまあかな」私は肘で細川くんをつついた。「あんたの婚約者はお弁当作ってくれたりしないの?」
 「結婚したら作ってあげるって言ってました」
 「......じゃあね。次に呼びに来るときは、よほどの緊急事態の場合だけにしてよね」
 私はブレイクルームへ通じるドアを開け、その瞬間に関心事が食べかけのそぼろ弁当と、ヘルシー唐揚げ問題に移ってしまい、いましがたの一幕の記憶は、「処理済み」フォルダに放り込まれてしまった。
 後日、私は苦みとともに青柳さんの表情を思い出すことになる。このとき、もう少しだけ深く、その意味を考えておくべきだったのだ。

(続)

 この物語はフィクションです。実在する団体名、個人とは一切関係ありません。また、特定の技術や製品の優位性などを主張するものではありません。本文中に登場する技術や製品は実在しないことがあります。

Comment(24)

コメント

匿名

・あちこちのCSV処理ロジックで同じ問題が発生する。
・青柳氏が、あくまでもフリー・ライブラリの使用を拒絶する。
 →どっちにしても、代替方法を用意する必要があるんだが。
・FCCみなとシステム開発は、実はQ-LICの仕込み。
 →そこまでやるのか、とも思うが、物語の冒頭がアレだしな。


さあどれだ、と、いいたいところなのだが、
三番目は他のと両立しちゃうな。

匿名

CSVにある程度決まった仕様があるの知らなかった。
ウチではコメント入りまくってるな

aoi

それなりに経験があれば改行を含むCSVを扱ったことくらいあるかそういうものがあるくらい知ってそうなものだけど、嫌な予感しかないですねえ。

3STR

この手合いのバカ、白川さんが一番嫌いそうだけど身内には目が届かんのかな…

Dai

>ブレークルーム
>ブレイクルーム

ポンポン

広く使われているライブラリなら大人しく使ったほうが新規開発するより安全なのは理解できるが、方針もなく現場レベルで勝手に使うと決めたりするものかね?

リーベルG

Dai さん、ご指摘ありがとうございました。

もっこす

CSVはRFCに従ってない出力元があったり、改行コードやエスケープ方法にバラつきがあったりするので、実データで確認しないと不安になりますねぇ。
何も見ずにRFC準拠してる前提でテスト書くのはマズいでしょう…

atlan

今他社から貰ったCSVインポートする作業が時々有るんだけど"のエスケーブが違うんだよねぇ・・・
おかげでインポート時のエラー発生行見て毎回手で修正かける羽目に
(まぁ事前に処理するシステム入れてれば済むんだけど数ヶ月に一回数個のデータなんで手修正しちゃうのがいかんのだな)

匿名

そのRFC、現状追認の形であとから出て来たやつだからなー。
未定義仕様があるって仕様書突き返すべきケースやなかろか。

匿名

今回の想定ではOpenCVSが入っているので使う事自体は問題無いですよね。
業務仕様はシステムの動き通りというのは問題な気もしますが。

匿名

>私は使っている油が何かによってヘルシー度合いが変わってくるのではないか、という意見を述べ、

川嶋さんがいちばん合理的だな

> OpenCSV が可能なJar ファイルとしてクラスパスに入ってますよ

「可能なJar ファイル」って直訳みたいな言い方ですが業界的には一般的なんでしょうか?
利用可能なJar ファイルとか可能なを抜いた方がすんなりする気がするのですが、最近ツール系ではこういう直訳的な日本語を見るケースも多く、あんまり違和感もなかったり。

匿名

佐野さんに
「テキストエリアに改行が入力されていた場合、
それがサーバーに届いたとき、改行コードはどんな形をしているんですか」
と、聞いてみたい。


そんなもん、下賤なプログラマの仕事だ、で終わりかな?(´・ω・`)

> 「結婚したら作ってくれるって言ってました」
普段の会話ならこう言っちゃいそうだし、いちいち指摘しないけど、「結婚したら作ってあげる」って彼女は言ったはずですね。

匿名

会話を会話として叙述して何が悪いのか、さっぱりわかりません。

匿名

無理な指摘で存在感アピールは不要ですよね。

>さ さん
確かにちょっと違和感ありました
×:結婚したら作ってくれる って言ってました
○:結婚したら作ってあげる って言ってました
ってことですよね
「」の位置をずらしたせいで、誤解受けてますがw

匿名

「彼女が細川くんにインプットしたもの」を、
「細川くんが『自分の言葉で』アウトプットした」だけのことですよ。


同一の情報であれば、どこでも同じ形をしていなければならない、
プリミティブな状態で保存すべし、というのは、
コンピューターシステムにおいては、そのとおりです。


しかし、日常会話にまでそれを適用するなんて、毒されすぎてますよ。

匿名

あ、直されてる。

そう直すなら『』が欲しいですね。

「『結婚したら作ってあげる』って言ってました」

育野

上のお二人が言われるように,「くれる/あげる」についてはどっちもアリだと思います.
・彼女さんが言った内容をそのまま伝えたとする場合
「結婚したら(彼女が)『作ってあげる』って言ってました」
・細川さん視点なら『(彼女が僕に)作ってくれる』状態を示していて
「結婚したら(彼女が僕に)作ってくれるって言ってました」
厳密には「作ってくれる(みたい|そう)です」な感じでしょうか
#というか常に文法的・用法的に正しい日本語で会話してる人が現実に本当にいます?
#「全然~ない」以外の「全然あり」系の言い方をしたこと無い人だけが石を投げなさい,的な気分
##国会の議事録とか相当アレですよ?

匿名

「カッコがついていることで正しいことが確認できる会話の叙述」って、
いったい、なんなんでしょうね。
白けることこの上ない。


P.S.
作者殿の対応が大人なのは、天下万民が認めるところであります。

言葉の間違いを指摘したというより、「作ってあげる」と細川君に言わせた方が、彼女の言葉をそのままニヘラ顔で言われて川嶋さんがカチンとくる情景が浮かびやすいなと読んでて思っただけなんですけどね。
「結婚したら作ってあげる♥って言ってました」って言われたらイライラするでしょ(笑)
くれるではここまで表現の幅が広がらないと思うんですよねー。

まぁしかし文法の話で盛り上がるところがココらしいというか何というか(笑)

匿名

そんなに瑣末な表現が気になる自分で書けばいいじゃん。
編集者気取りなのかな。

コメントを投稿する