2012/02/02

インド人のプログラマーはココがスゴイ!!

私はインド人の方と何人か仕事をしたことがあるのですが、出身や階層で全然キャラクターが違います。(関西人と東京の人が違うのと同じですよね。)

そんな個性豊かな方達ですが、変わらないものがあります。

それがプログラミングスキル!!

これがめっちゃ凄いんです。

ちなみにここで言うスゴイ・・・は、最低品質のお話です。
上を見てしまったら日本人でもスゴイ人はいますよね。

あくまでも全体のレベルとしての品質のお話です。


で、その凄さを伝えようとすると、「プログラムを見れば一発だよ。」という話なんですが、それを見ることは難しいですよね。

なので、その凄さを伝えることができず5-10年ぐらい経とうとしているのですが、ここにきて、その一端を伝えることができるかもしれない・・・という表現方法を見つけましたので、書いてみようと思います。

とは言え、拙い可能性が高いので、興味がある方やお時間のある方だけどうぞ。

目標としては、これを読むことで、グローバル化であったり、自分の仕事のスキルを見直すきっかけになればいいなあと思っています。


さて、突然ですが、トランプタワーってご存知ですか?

北中米カリブ海サッカー連盟本部が入っているニューヨークにあるビルのことではありません。

トランプを重ねて作るタワーのことです。



では、ここで問題です。

このトランプタワーを10段作るとしたら、一体、何枚のトランプが必要でしょうか?
(画像では一番下の段にトランプはないですが、一つの三角形3枚で考えてみてください。)


単純に考えていくと・・・

(3x10) + (3x9) + (3x8) + ・・・ + (3x1)

3枚で一つの三角形を作るので、それが1段にいくつあるか?
今回10段ですので、10, 9, 8,・・・と続いていきます。
それを足していけばいいわけです。

上記表現だと、ちょっと野暮ったいので、算数的な表現にすると・・・

3(10 + 9 + 8 + ・・・ +1)

3 x 55

=165

このような感じでしょうか?

さて、これをプログラムで書いてみたとします。

とすると、ひとつ課題が出てくるんです。


それは、10段の場合は問題ないですが、仮に11段になったとしたら?


業務が変わると当然、それを支えるシステムも変更になります。

仮に11段となったら、3(11 + 10 + 9 + ・・・+1)とプログラムを変更しなければなりません。

これは実は大変なことです。
きちんと動くかテストしなければなりませんし、ソースコードは極力いじりたくない。

ということで、そんな時のために変数というものを使います。

変数とは「プログラムのソースコード中で、データを一時的に記憶しておくための領域に固有の名前を付けたもの。」とネット辞書で書いてありましたが、箱みたいなものです。

方程式でXやらYやらというものが出てきましたが、あんな感じでポイポイデータを放り込むことができます。(って、こんないい加減な言い方で大丈夫だろうか・・・。ちょいと心配。。。)

参考:変数
http://e-words.jp/w/E5A489E695B0.html


変数を使えば、その数字を変えるだけなので、プログラム自体のロジックは変わりません。
これならソースコードにバグと言われるミスが発生する可能性も減りますよね。



では、ここでは、その箱をXとしておきましょう。
Xをトランプタワーの段の数とします。

すると・・・

3X + 3(X-1) + 3(X-2) + ・・・ + 3

と、Xが1になるまで続ければいいわけですよね。

で、それをどこまで続ければいいか・・・というのをプログラムで書いてあげるんです。


-----変数定義--------

X=11   (Xにトランプタワーの段数11を入れる)

----プログラム処理----

if X > 1  (もしXが1より大きければ)

3 x X   (3をかける)

X = X-1  (Xの数を一つ減らす)

return if  (ifの処理に戻る)

else    (X > 1じゃなければ)

next step  (次の処理に進む)


プログラム言語的にはありえない書き方をしているので、違和感を持つ方もいるかと思いますが、例えばifなどの条件分岐ではなく、whenやcaseみたいなX回まわす・・・みたいな処理の仕方もあると思います。

ここで言いたいのは、「変数の判定処理」と「ループ処理」があるということで、この2つを覚えておいてもらえれば問題ないです。


さてさて、これでプログラム的には問題ないものができました。
仕様書、設計書などを書いて、プログラマーの方に渡せば、後はばっちり作ってくれます。



ここでインド人、やることが凄いんです。


出来上がってきたプログラムを見ると、彼らはどんなプログラムを書いてきたと思いますか?


先ほどのプログラムは「変数の判定処理」と「ループ処理」があります。

このプログラムには実は課題があって、この2つの処理があることで、プログラムが重くなっています。

重いとは処理に時間がかかってしまう・・・ということです。

段が増えれば、増えるほど、ループする回数が増えてしまいますから・・・。



でも、インド人に任せれば、こんなのへっちゃらね。

さて、どう解決したでしょうか?


ちょっと考えてみてください。







彼らはこんな感じで解決しました。



-----変数定義--------

X=11   (Xにトランプタワーの段数11を入れる)

----プログラム処理----

3(X+1) x X/2



さて、これはどういう意味でしょう?



解説します。


まずトランプタワーですが、三角形ですよね。
その三角形が2つあって上下逆さまで重ねると・・・


平行四辺形になりますよね。


となると、1段における三角形の数は・・・(X+1)

1つの三角形に3枚のトランプを使うので、3(X+1)

で、その段がX段あるので・・・ x X

ここで出てきた数は平行四辺形で使うトランプの数なので、三角形の場合は/2



おお!!


「変数の判定処理」と「ループ処理」がない!!

ソースコードの行数も少ない!!
(ソースコードの行数が少ないと、処理が早いだけでなく、メンテナンスも楽になります。)


もちろん段数の変更にも対応できる!!


凄いよ、インド人!




これ、算数の解法として捉えると、なあんだ・・・となりがちですが、実際の話はこんな単純ではありません。


プログラムは業務に即したものではなくてはなりません。

実際には裏で業務が紐づいているんです。

すると・・・


一番下の段は、補強しておきたいから、三角形のトランプは2倍にしておいて。


とか、


真ん中は三角形ではなく四角形でお願い


とか、


とかく複雑な業務があったりするわけです。

もちろん先ほども書きましたが、業務は日々改善・・・で変更があるわけで、それにも耐えうるものでなければなりません。

そんな現実に縛られた仕様書、設計書を、現実に対応しつつ、プログラムとしてもシンプルにする・・・というのは、簡単な話ではないです。




さらに・・・


仕様書、設計書と異なったソースコードを書いています。


それってどうなのさ!!


というツッコミもありますよね。


そこが、開発のすり合わせのお話です。

こちらは業務がわかっている・・・。
向こうはプログラムのプロ・・・。

お互いがすり合わせて、最善の解を出していく・・・。




若かりし頃の私は、最初のような設計書を作成してインド人に渡した時にこう言われていました。


”アライサンが作成する仕様書はシンプルでわかりやすい。”


で、出来上がってきたのが、変なものだったら「言われた通りにしていればいいんだよ」とツッコミを
入れていた所でした。

ところが、もっとスゴイものだったので、「オレのこと馬鹿にしてんのか?」と最初は思っていました。

実際はそうではないことはわかると思います。


三角形ではなく四角形にして・・・みたいな余計なものがなく、業務プロセスがシンプルだったので、向こうも何がやりたいのか、わかりやすかったのでしょう。


確かに、何がしたいのか、何をやっているのか・・・といった説明を必要以上にやって詰めていった記憶はありません。



こちらも引き継ぎ作業がカップラーメンより早く終わるぐらいシンプルなプログラムが出来上がってきて、何をしているのかすぐにわかりました。


このシンプルな業務プロセスをどうやって実現したのか・・・は、また機会を改めて、気が向いたら書こうかなと思いますが、とにかくインド人は凄いです。



さて、その凄さをどう身に付ければいいのか・・・は依然としてわからないままですが、これだけ凄いなら、さぞ人気ものでしょう・・・となると、これまた話が変わってきます。


日本人以外と仕事をする場合に、コミュニケーションコストと管理コストが別途かかってきます。

これはお金・・・というのももちろんですが、時間などリソース全般として・・・という意味でのコストと捉えてもらえれば。


例えば、今は日本語以外の言語ができる人は全員というわけではないですよね?
できる人もできない人もいる。

ただ、それが一般化、みんなが出来て当然・・・となったら?

グローバル化の名のもとに、全員が英語を話せたら・・・。


日本人プログラマーはインド人プログラマーと戦っていかなければなりません。


となると、分が悪そう・・・。


高収入、差別化を目指し・・・身に付ける特殊技能という位置付けならば問題ないです。
ただ、それが一般的な教養として必要とされるまでになったとしたら・・・。

英語などは、古くから、そんな傾向がありますよね。

言語の壁を取り払ったら、たちまち今までと同じ賃金レベルは維持できなくなりそう・・・。
みたいな業種、職種がいっぱいありそうです。


例えば、インド人と同じ賃金で働かなければならなくなったので、日本では物価水準が高く生活できないので、彼らと同じインドへ移住して生活します・・・なんて、できないですよね、たぶん。

となると、単純に雇用がなくなって失業者が増える・・・。


あながちおかしなストーリーではないと思います。

何か長くなりそうなので、端折りましたが、日本で株式会社を設立している以上、日本の雇用とか豊かな生活とか、その辺に貢献したいなあと考えると、ざっくりと大きなレベルから、こんなことも意識していて、どうしたもんかねえと考えることがあります。

正解を出す話ではないので、日々の行動に落として進むのみですが、危機感を持って自分の仕事内容とパフォーマンスは整理した方がいいかも・・・という形で締めさせてもらいます。