今日はプログラミングの生産性に対して気づきがあったのでシェアしてみたい。

なぜ米国の人は生産性が高いのだろう

プログラミングの生産性に関しては以前から興味がありいくつかのポストで考えたことをシェアしてきた。私は職業柄、いろんな国でいろんな人々とプログラミングを一緒にする機会が多い。その時に頻繁に感じるのは、平均的に言うと、アメリカの人プログラマが生産性が高い確率が高くて、しかもコードもきれいだという傾向にある。アメリカでお客さんと一緒にコードを書くと、お客さん自体が物凄く良く知っているし、実行力もある。アメリカの次と言うことでいうと、英語がネイティブの国もそれに近く、フランスなどの言語が近いところが続く感じなので、英語が物凄く影響すると思っていたし、実際すると思う。そのあたりの話はこちらのポストに書いてみた。

simplearchitect.hatenablog.com

定義での理解と、例での理解

アメリカのエンジニアと自分や、日本のエンジニアを比較すると、「理解」のロジックの傾向があるように感じる。日本の多くのエンジニアの場合は、「例」で理解するのを好むように感じる。「定義」をみても、今いいち理解しにくくて、例を見て理解する傾向が強いように感じる。一方、アメリカのエンジニアや、いけてるエンジニアは、「定義」で理解する傾向があるように感じる。定義の短い文章だけを見て、それがどういうものかをさっと理解できてしまう。

一方、「例」先行の人の場合、もちろん私もだが、最初に、定義を見るより、先にググって、ブログやコードサンプルを見つけて、どうやったらできるかを見つけて、その後で定義を見て理解するといったステップになっている。ひどい時は、サンプルをコピーして動けばOKで、なぜそのコードが動いているのかも理解していない人もいる。短い定義だけをさっと見て理解してコードをかける同僚や、師匠を見て凄いなぁ、、、といつも思っていた。やっぱこれは、言語と文化による違いだろうか？ 理解を重視するのと、動くことを重視する姿勢とも言える。

シンガポールでの出来事

この仮説を覆す出来事が先日シンガポールに行った時に発生した。シンガポールの人はビジネスは全部英語なので英語が大変堪能だ。自分の仮説上は、英語が堪能なので、アメリカに近いつまり、定義と理解を重視する人々と思ってハックをすると全く違った。彼らは私たちと全く同じく、例を重視して、理解よりも動くことを重視していた。インドの人も混じっていたが、インドの人は、定義重視と理解重視の感じだった。この「定義での理解」と「例」での理解は、言語に大きく影響しているのかと思いきやもしかすると違うのかもしれない。もちろん、コンピュータサイエンスの場合英語がリーディングやネーミングやメタファで圧倒的に有利なのは間違いないが、この部分に関しては違ったらしい。

アメリカのインターンとのペアプログラミング

そういえば、シンガポールに行く前は、アメリカでハックをしてきた。そこで、Javascript のコードを書く必要があったのだが、最近触ってなくてすっかり忘れていることともあり、堪能な人に助けを求めた。すると、コーディネーターが Javascript できるインターンのハンサムガイを連れてきてくれた。

一緒にペアプログラミングをしたのだが、一つ衝撃的だったことに、彼はほぼググらなかった。見るとしても、リファレンスか、公式のサイトのみ。それでも、定義だけを読んで、「このメソッドがこのように使えるはずだ」とか言って、さっとプログラムを一緒に作ってくれた。インターンのせいか、彼のコードは綺麗ではなかったが、彼は十分に挙動を理解して、全然サンプルを見ないままコードを一緒に書き上げてくれた。ある一瞬彼が、「どうしたらいいんだろう？」と悩んで、リファレンスなどを見ながら悩んでいたので、私が、自分のブラウザでその時困っている現象をグーグルに打ち込んで検索してブログを見つけて、一瞬で解決した。なぜ彼にそうしなかったのかは聞かなかったけど、彼はそもそもそういうことをするという素ぶりも見せなかった。そういえば他の同僚もあまりググらないし、見ても公式ドキュメントで次にコードという感じだ。

全ては習慣ではないだろうか？

Extreme Programming で著名な Kent Beck は、「私は偉大なプログラマではなく、偉大な習慣を身につけたプログラマ」だ。と語った。つまり習慣は誰でも身につけられる。もしかすると、「定義」vs 「例」、「理解」vs 「動くこと」の違いは習慣で埋められるのかもと思うようになってきた。つまり、英語云々ではなく、彼らは幼少の頃から、「定義」で理解し、「理解」する方法を習ったか、練習してきたから、自然とそうなっているのでは？という仮説で、そうであるならば、「定義」だけを見てゴリゴリにコードをかけるようになるのではないだろうか？という仮説だ。だったら実際に自分で試してみよう。

仮説の検証

仮説に基づいて、次のことを気をつけてコードを書いて見た。自分がまだそんなに慣れていない Go 言語で実行して見た。

可能ならリファレンスのみを見てコードを書く

公式ドキュメントは見ても良い

サンプル / ブログの類は見ない

速く完成させようと思わない

この単純な３つの条件をつけて、自分が今までコーディングしたことのないトピックを Go で実装して見ることにした。

実践した気づき

実際にコードを書いて見ると、色々気づきがあった。最初は、例を全く見ないでコードを書くのに不安があった。「早く作る」ことだけを考えると、自分のやりたいことで検索して、ブログを読んで書いてあることを真似するのが一番速い。ただし、この作戦は、その１回限りに於いては確かに速いのだが、本人がちゃんと理解できているか？はとても怪しいものがある。つまりどうなるか？というと、普段の私だと、何かが出てくるたびに、前にやっていても忘れているので、またググって、同じページを見て、同じコードを真似て、実装するという感じだ。確かにコードは出来るのだが、結局速くないし、理解も浅い。

今回の作戦をやって見ると、確かに初回の時間はかかるのだが、定義だけを見て、コードを書こうとすると、深く理解しないと書けないので、しっかりと定義を読むようになるし、コードサンプルがないので、自分の頭で考えてアルゴリズムを毎回考える必要があるので、コピペ作戦がこれまた使えないので、アルゴリズムを書くときに使われるイディオムも深く理解しないと結局遅くなってしまう。すると、２回目似たようなロジックが出てきたときには高速にコーディングが終わったし、サンプルの無いようなコードでもリファレンスだけを見てさっとコードが書けるようになってきた。しかもたった１日で。出来るか不安だったが、やろうとしたら出来るやん！

おおおお！これこそわしの求めていたものや！

実践のポイント

ただし、一つポイントがあって、先ほどの条件にもあった「速く完成させようとしない」というのがものすごいポイントで、他者からも、自分からも、速く終わらせようと思うと、どうしても「ブログ検索」の甘い汁を吸ってしまいそうになる。しかも、「速く終わらせよう」と思ってなかなか終わらないととってもイライラするのだ。つまり楽しく無くなる。「速さ」は、後から付いてくるから心配しなくてもいい。それよりも「理解できていない」ことを恐れたほうが、絶対的に安全だし、スピードも結局上がることに気づいた。

後、「ヤクの毛刈り」ともいうけど、あるコードを調べているときに、その中でわからないことが出てきて、またそれを調べて、、、起こった時にはどうするか？それも焦らず理解するようにした。作戦としては、調べ物をするときに、ブログを同時に書いて、調べた内容や、自分で作り上げたコードを書いていく。その過程でわからないところが出てきたら、理解してブログに書くようにして見た。これは、先日紹介した、自分の動作を先に書き出してから実践するの応用作戦だ。急ぐのをやめると、コードを書いている過程できになる「ああなったらどうやって書くんだろう？」みたいなものもみんな調べて試すようになってきて、深さも出るようになってきた。

simplearchitect.hatenablog.com

書いていてどうしても解法がわからない時とか、書けるけど多分なんかいい API ありそうみたいな時もある。そういう時は、まず自分の解法で書いてみて、その後、ググってみて、あーこんな API あるんだとわかったら一瞬でブログや、サンプルを閉じて、リファレンスのページを見るようにすると良さげです。

まとめ

サンプルコードを求めて、ググってブログや、Stack Overflow のサンプルに頼るのをやめると、理解が高まり、高速にコードが書けるようになってきたと思う。そういえば日本人の技術イケメンや師匠もあまりやたらとググってなかった気がする。この方法を継続してやってみて、どうなるか実験して行きたい。実際にやっていると、初めのうちは高速なのかわからないけど、確実にわかるのは、完璧に自分でコントロールできている感を持てているということだ。これは自分にとっては大きい。

ちなみにこちらのブログは、初めて、リファレンスのみを見て技術調査をしながら書いたブログだ。単純なものだが、今後もっと複雑になっても、この姿勢をキープしながら継続してみたい。

qiita.com

最近気づいてきた、「日本人」のいいところは、我々は真面目ということだ。平均のレベルは圧倒的に米国に負けているが、トップレベルの日本人プログラマは向こうに行って十分通用するどころか、向こうに行ってもすば抜けていると思う。彼らは、言語やら習慣やらでコンピュータサイエンスは強いけど、私たちほど頑張ったりしない。だから、積み重ねていけば私たちでも世界で十分に活躍出来る素養は十分にあると思うのだ。