技術メモ
■彼によって覆された僕の中の常識
※一応、冷静に評価しているつもりですが、完全に愚痴ですね。
前提
彼は一月に入って一ヶ月で抜ける予定。契約社員。
僕は一月に入って二月までいる予定。契約社員。
※納品が二月中旬なので二月に二人抱えられなかったらしい。
・共通認識するための○○って必要かな? って相談したら いらないんじゃないって言い返してくるヤツにこそ○○は必要!!
具体例としてはコーディング規約です。開発部隊が二人で短期で画面数が少なかったのでコーディング規約を決めても窮屈でやりにくくなり、それでいて成果が上がらないかなーと思ってました。作業ルールは”今の手間”を増やしたことで”将来の大手間”を減らさないと意味がないです。「こういったもんだからヤレ!」はドMの方々のローカルルールなので僕に押し付けないでください。(「習慣付けておかないと必要なときにやらなくなる」という不器用な方々もたまにいらっしゃいますが別問題ということで)
僕が「コーディング規約とかどうします?最低限そろえておきます?」相手(45歳前後)「いやぁ、いらないっしょ!」。……危なかった....。フォーマットが僕とそろってなくても最低限のコメントは書いてくれると思ってたんだが.....彼は関数の使用方法もスクリプトが対応している画面も何も書く気なかった...orz。
……お互いに一画面を作った後にソースレビューをしておいて本当に良かった。(ソースレビューを自分から言い出すなんて始めてでした)
あの人、”将来の大手間”の事態になったときに「大手間をやりくりしてる俺スゲー!」になるんだろうなぁ。決して「あの頃、整理しながら進めればこんなことにはならなかった」方向には考えないんだろうなぁ...
・java使いでも隙あらばメンバー変数を直接使う。1
今回の開発はphpですが、javaと同じようにクラスを使えます。僕がDBクラスを作ったのですが、メンバ変数をprivate設定しませんでした。重要なクラスを一日で二つ仕上げなくてはいけなかった(下記参照)ので細部まで行き届かなかった。ってか使えるとしても使っちゃいけないものだって知っていると思うんだけどなぁ...。アクセスできちゃうってことは使っていいってことなの?javaとphpは違うものを思ったの?「public」「protected」「private」「final」は大事なのが良く分かったさ。ドキュメントで「このメンバ変数を使うときは必ずこの関数から呼んでね」と書いても絶対に破ってくるやつらがいる。だからプログラム言語のほうで食い止める。javaが大人数開発に向いているといわれるゆえんですね。クラス作成者の気持ちは伝わらなくても強固な意志は末端まで必ず伝わる。
・java使いでも隙あらばメンバー変数を直接使う。2
書いてて思い出した。前の現場で話していたこと。
javaをはじめとする今の言語は難しいところは少数精鋭(高レベルでなきゃダメ)で作ってそれこそ開発のコアを「protected」「private」「final」で握り、それを使うその他大勢(中低レベルでも可能)で開発を進めます。そのプロジェクトはそれでいいかもしれないけど少数精鋭とその他大勢のレベル差が縮まりません。っていうか広がります。考える人と作業をするだけの人。業界としちゃそれはどうなのかなぁという話をしていたのですが、彼はもろにその他大勢側?上記のようにモラルも育ってないっすよ。
・どうやら僕は一人前の開発者らしい
開発当初、上流工程の人から画面案を見せてもらいました。一緒に開発する彼はスタイルシートがわからないけど、経歴は僕よりはるか上。ならば分担は分かりやすい。僕がスタイルシートを使いながら基本的な画面の形を作る。彼が共通関数を作る。
上流工程の人とのミーティングが終わって彼が画面案を見ているので話しかけました。
僕「共通関数ってどんなん作ります?」
彼「この画面で最大20分待つことになりそうだけどapacheは大丈夫かな?」
僕「あー、それは僕が調べておきますよ。それより、たぶんこの画面とこの画面の処理が大体一緒だから関数化して....」
彼「でも20分待つんだよ?平気かな?」
僕「えーとですね、画面を担当することになった僕が調べてみます。分からなかったらヘルプをお願いするかもしれませんけど、とりあえずこっちを」
彼「うーん、20分だよ?本当に....」
僕(あれ?ひょっとして僕の意見を押し付けちゃってるかな?)
僕「あ、そうだ、最初にDBクラスを作ってもらえませんか?」
僕(これは作らなくちゃならないでしょ?そして作ったことがあるでしょ?)
彼「だって、大きなファイルを指定して....その後Aの処理があってBの処理があって....」
僕(ひょっとして....裏側まで思考がたどり着かない人なのかな?)
僕「....わかりました。ちょっとその画面がうまくいくか調べてください。僕がDBクラスとか作りますから」(あきらめた)
ー30分後ー
彼「ヤンさん分かったよ。設定でいけるみたい!」
僕「そーですか、良かったですね」
彼「ちょっとこの画面作ってみるね」
ーさらに一時間後ー
彼「大体できたよー。流れの中でDBが必要になったから繋いでみた。よかったら参考にして!」
見てみるとソースの中でDBにつないでqueryして値を取得している。
僕の中に湧き出た感情は「それは俺が作るっていったろーがー!」という怒りではありませんでした。寒気でした。「やべえ!こいつ(←呼び方変わった)、話を聴かない上に共通化って言う概念がない!目の前の面倒が終わればいいと思ってやがる!!」
そこから高速でソースのフォルダ構成を考えて
DBクラスを作り、VIEWクラスを作り、ファイルヘッダのコメントのテンプレートを作って、
サンプルソース(スタイルシート込み)を作り、サンプルソースの簡単な解説を書いてレビューしました。(期間:1日弱)
レビューのときに同席した上流工程の人はうんうん頷きながら僕の作ったルールや成果物の意味を分かってくれていたようなので独りよがりにはなっていないはず!……一方彼は!静かに聴いてました。まるで意味の分かっていない新人のようでした。
しかし作業をするうちに意味合いを分かってきてくれたようです。そして僕の作ったDBクラスに関数を追加してくれるようになりました。それなりに意識が揃ってある程度同じ方向を向きました。メデタシメデタシ。
……メデタシじゃねーよ。若いのならこれでいいかもしれないけど彼は僕より年上です。ソースを書いているうちに「あ、ここは共通化できるかもしれないね」って関数化するのではなく、すでにあるものに「これも必要だよね」と足すだけでもなく、仕様を見た段階である程度は裏まで想像して先回りをしないと「普通の開発者」とはいえないです。....と思っているんだけどなぁ。僕が思っている「普通の開発者」はちょっとレベルが上なの?なんかレベルが低い話をしてない?僕が普通に考えることって一人前の開発者として一定レベル以上ってことなのかなぁ。
・select * from hoe where a = hoehoeでデータを拾ってくる。
彼のソース見てびっくりした。select * from hoe where a = hoehoe でインスタンスを全部メモリに乗っけて使うのは1項目。僕の中の常識ではありえないんだけど、彼はこれで20年食ってきているんだよね。訂正してくれる人はいなかったの?それとも僕が気にしすぎなの?
・彼の褒めてほしいところ、僕のやりたいこと。
だんだん彼に慣れてきて分かってきたこと。技術的なことに目をランランと輝かせて没頭します。ですが、僕が提示したような作業を効率的に進めるためのローカルルールなどには一切興味がわきません。本格的に開発が始まる前にこちらでDbクラス、VIEWクラス、共通初期化ファイルを提示できたのでどうにか収拾がつきましたが、これが一日遅れてたらどうなってたことか……。
ところで半日に一度ぐらい、彼がやったことを僕に雑談っぽく報告してきました。イレギュラーだったけど対応できたよと自慢っぽく話してきたんですが、あれはひょっとして……イレギュラーの対応がこれで正しいか僕に報告と確認してたのかもしれない。(本人も気づいてないかもしれないが)
そういったわけで彼は誰かに技術レベルの高い自分を褒めてほしいみたいです。スゲー!って言ってほしいみたいです。残念だけど僕はそれに感動したりしないです。彼以上の方々を見てきてるしね。僕はうまくやって「精度の高いもの(←彼にはない概念っぽい)」を「最高の効率で無理のない速度」で作ってさっさと帰りたいんです。そのために最重要なのがローカルルールの遵守と先んじて作っておくライブラリ群だと思ってます。
あー、でも彼も早く帰りたがってたなぁ。悪意を持った言い回ししかできませんが、彼は「技術レベル的に高いところで周囲を助けているのだから俺は特別さ。だから早く帰ってもいいのさ」地位を狙ってるの?僕の「さっさと帰る」は「チーム全員がさっさと帰る」です。誰かに面倒を押し付けて自分だけが帰るって言うことじゃないのね。(この考え方にも賛否あります。代表的な反論:大事なのは自分じゃん。仕事場でしか会わないような他人を気遣って自分の時間がなくなっちゃしょうがないでしょ?お前が気遣っているそいつらだって大事なのは自分だよ)
・プログラムは動けばいいらしい。
基本的には僕もそう思ってます。でも最低限の美しさってのがあるはずです。クライアントは動きのチェックをすることはあってもソースのチェックをすることはありません。でも仕事するに当たって美学があるはずです。後で誰かが見たときに「美しい!」と感嘆を上げるソースまでは言わないけど、「アホすぎる」と言われない程度の物を作りたいです。
最初にfor文で処理をして最後のほうで同じfor文を行い内容は一行だけ違う。彼の中では全然OKらしい。お前は1ファイルの中でさえ全体を把握できないのかと。新卒かと。でも彼はこれで20年食ってきているんだよねぇ....。そこそこ有名なメーカーに数年常駐したりもしてるんだよねぇ....
・彼の目線。仕様の抜けを見つける
仕様からどんなソースを書かなくちゃいけないかを想像するのが苦手な彼ですが、仕様を理解して鋭い質問を返します。考え抜けしているパターンを見つけるとかね。なのでクライアントの受けはいいんじゃないかなぁ。同僚や下の人間からはローカルルールを守らないいい加減なやつ扱いされてそうだけど。
たぶん彼からすればプログラムをゴリゴリ書く下流よりも仕様を考える上流のほうが得意と思っていると思う。けど、下流の下地がない上流でしょ?俺は下につきたくないなぁ。
あ、そうそう「俺は強引に話を通して前に進めるのも得意」と自慢してたなぁ。僕は純粋な感想として「強引に進めないといけない場面があるのも知ってますけど、それ相応のカリスマ力やら求心力がないと周囲に憎まれてますよ」と返した。あれは嫌味だったか?....いや、彼は俺の話なんて聞いてないか。そして言えなかった続き「あなたが強引に進めた道を頑張って帳尻合わせて舗装している人がいます。”あいつは細かい作業が好きなんだ”とかではなく、その彼に深い感謝を。あなたの尻拭いをしてくれているその彼に上から目線ではない感謝をして下さい」
・言い回しでごまかす……という気もないらしい
作ったスクリプトを彼が実機に入れました。実機は役割が違う2台。同じソースで動くように作ってきました。実機に入れて動かしてみると、ちゃんと動かない箇所が出てくる。その場で直す(=もう一方には反映されない)。他方も動かないからその場で直す。片方には反映しない。
両者が役割ごとに動き始めたコロに一言。「各PCは動かすのに必要なソースだけ入ってます」。いやいや、だったら使ってないソースは削除しといてよ。ごみが残っているよ。こっちの部分はこっちのPCが最新、あっちのソースはあっちのPCが最新になっちゃってるよ。
それを言い回しでごまかした。ということではなく、心底そういったものだと思っているみたい。ストレスたまらなそうだなぁ。
・今の困難が避けられれば後はどうでもいいらしい。
実機がこちらの設定が終わり、よそで本格的にテストするために郵送されていきました。その後、彼が僕に寄って来ました。
彼「実機なんだけどさー。ひょっとしたらココのとこの設定をデモバージョンにしちゃったかもしれないから何かあったら訂正しといて。ま、デモバージョンでも正常に動くけどさ」
僕「動くかもしれないけどデモバージョンはカッコ悪すぎでしょう。ちょっと見てみますね」
彼「実機はもう送っちゃったじゃん。見れないじゃん」
僕「バックアップとってありますよー。DBのダンプもあります。もちろん二台とも」
彼「えぇ!?」
なめんなと。俺はそれほどマヌケに見えていたのかと。信用されているとでも思っていたのかと。あれだけ「終わったらバックアップとってくださいね」と言っていたのにクライアントに「終わったー」と告げるお前を信用していると思っているのかと。
それと告白するタイミングが良すぎ。宅急便がPCを持っていった直後ってことは分かってていってるだろ?発覚するだろうけど、そのころに自分はいないという計算の元に僕に言っているだろう。こすいんだよ!
一月にフェードアウトして詳細設計書も俺に押し付けようとしたろ!分かってんだよ!やってから去れ!!
・僕が歩いてきた道。技術運用と業務運用。
僕が数年運用をやりながら開発してました。今も基本的にはそうです。運用っつっても自分が開発したところをメンテナンスしたり仕様追加で修正していただけですが。だから開発時に何をどうしておけば調査が楽なのかが身に染み付いています。一方、業務運用(特にサイト運用)も隣で見てきています。客(クライアントではなくエンドユーザー)の使い勝手がいいかアピールするにはどうすればいいかが、いつも頭をかすめます。
どうやらこれは特殊技能らしい。開発が終わったらすぐに去っていく人たちは言われたとおりすれば自分たちの仕事が終わる。そこには客の使い勝手とかは関係ない。仕様がこうだからこう作った、しかない。より良いものをつくろうって考え方がないんですね。僕は運よくシステムに深くかかわった(しかも移ろいやすいエンドユーザー向けに商売するサイト)ことがあるので、デフォルトでユーザーの使いやすさまで考えが進みます。僕は自分が平々凡々ちょい下の人間だと思っているので僕の考え方は普通にみんな持っているものだと思っていたのですが、僕のそれなりに広い視野はどうやら特殊技能らしい。
・契約社員が嫌われる理由
たまに面接の条件として正社員であることが含まれていることがあります。
きっと強い身元の保証がほしいんだと思ってたんですが、少し違いますね。
契約社員とかピンで仕事をしている人の印象として
・仕事に美学がなく終われば何でもいいと思っている。
・上の逆で、自分のやり方に固執して周囲にあわせない。
・ローカルルールを守る気がない
・視野が局地的
ってことなのかなぁ。彼を見てて思ったよ。
・そして僕も同じようなもの
彼の揚げ足取りをしてきましたが、僕も誇れる人間じゃないです。締め切りが近づいてきたら美学だの何だの言ってられないし。ただ、最初からまるっきり美学がないのとは一線を画と思ってます。
たとえば僕はドキュメントやソースの日付がいい加減です。特に第一次リリースまでの日付はいつでもいいと思っています。日付が生きるのは第一次リリースの後にバージョンを積み重なるときに生きてくると思っています。この考えを許せない人もいるでしょうね。
彼は僕の常識からはみ出たところが多かったですが、僕も「誰かが大事にしている部分」をどうでもいいと思っている部分、誰かが「これは紳士ルールで普通は守るだろう」と思う分を無意識に無視しているかもしれない。人の言うことに耳を傾けてないかもしれない。
他人から見たら彼も僕も同じようなものなのかもね。
■htmlで<input type="file"> の value値は初期設定やjavascriptで入力できない。
javascriptでvalue値の取得はtype="text" と同じような感じで
var hoe = document.form名.name名.value;
で、できるけど、
document.form名.name名.value = hoe;
はできない。(エラーは出ない)
同じような感じで
<input type="file" value="c:\windows\system32\hosts">
と書いても値が入ることはない。
もちろん
<input type="file" value="<?=$hosts_file ?>">
と書いても同様。
IEがtype="file"の値を画面以外で入力されるのをセキュリティのために止めているらしい。
確かに、画面以外からの入力を許すとローカルのファイルを好き勝手に盗むことができちゃうか。
<body onload="submit">と<input type="file" value="c:\windows\system32\hosts">のコンボで
ユーザーが知らない間にhostsファイル(ソコソコ重要なシステムデータ)を盗むことができて、ユーザーは盗まれたことに気づきません。
これをIEが防いでいるのね。
※最近はフラッシュでアップロードさせるとか増えてきてますけどもフラッシュのほうも対策はされているんですかね?
■perl
大半(ってか9割そうだと思っています)の言語は何も書かずに変数を使用し始めれば内部変数。global等を宣言すると外部変数になる!
けど、perlは逆。変数は外部変数であることがデフォルトで my をつけて初めて内部変数になる!!(これを知っているだけでも敷居がかなり低くなるはず)
変数のヘッダに $ をつけたりつけなかったり!!
perlをちょっと触っただけなので細かいことや概念は分かりません。ですが、perlには省略の美学なるものがあるそーです。おかげでサンプルソースを読み解くのも一苦労...orz。今回僕はperlの進む方向とは別に丁寧に書かせていただきました。(不慣れに省略しても後で誰も追いかけられなくなっちゃう)
■windowsのハンドルはしつこい
もうちょっとフェイクをかぶせられる。
今回windowsにapache突っ込んで動かしてたんですけど、
内容の一つに画面から設定を入力されたらバッチ処理をキックするってのがありました。
IEでボタンをクリック
→ perl起動・forkで別プロセスにしてbatをキック
→ batの中で localhostを pingで30秒つつく(sleepの代わり)
この流れでIEは次の画面に行かずに pingが終わるのを待ってました。
(perlのところを Win32::Process::Create を使っても同様)
一番簡単な解決方法はhttp通信の文字列長を決定してしまうことです。
IEでボタンをクリック
→ php起動
header( "Content-type: text/plain\n");
header( "Content-length:300\n");
print 画面のhtml;
print " "; × 300個
→ perlをキック
→ perl起動・forkで別プロセスにしてbatをキック
→ batの中で localhostを pingで30秒つつく(sleepの代わり)
とすると、とりあえず、IEは次の画面に遷移します。(phpも裏で生きてますが)
ですが、入力条件によって複数キックだと同じようには行きません
IEでボタンをクリック
→ php起動
header( "Content-type: text/plain\n");
header( "Content-length:300\n");
print 画面のhtml;
print " "; × 300個
while(hoe){→ perl起動・forkで別プロセスにしてbatをキック
→ batの中で localhostを pingで30秒つつく(sleepの代わり)
}
ですと、画面は遷移しますが、裏では一つ目が30秒pingして終わったら二つ目が30秒pingして....になっちゃいます。
一つ目と二つ目のpingを同時に走らせたい場合は