多くの日本人がオブジェクト指向プログラミングを苦手とするのは英語アレルギーだからか?

やはり、多くの人からいろいろなコメントをいただくと、意外な発見がありおもしろいです。
プログラミングと設計は本来切り離せないものなのでは - 達人プログラマーを目指して
のブクマのコメントに

何か、主語がないから理解が難しい読み物

というのがありました。私の文章の拙さをまずは反省しなくてはなりません。ただ、普段から日本語を話したり、文章を書いたりする際にはあまり意識していなかったのですが、よくよく考えてみると日本語の文章で「主語」と呼ばれるものがなんとなく省略されることも多いように思えてきました。中学校の国語の授業では「は」や「が」という助詞がついた言葉が主語であると習ったと記憶しているのですが、実際に、文中で明示的にそのような文節が表れない現れないことが多いように思います。
そこで「日本語 主語」で検索してみたら、非常に興味深い記事がいくつか見つかりました。
http://www.geocities.co.jp/CollegeLife-Labo/6084/shugo.htm
リベラル21 日本語に主語はあるのか
主語 - Wikipedia

「花は美しい。」や「花が咲く。」は文である。
学校文法では、「花は」や「花が」を主語だと教える。(日本語に主語はある)
三上文法では、「花は」を題、「花が」を主格とする。(日本語に主語はない)

上司が部下に「この仕事、やってくれないか?」と声をかけたとする。これに答えるときには、「やります」というのが普通であろう。しかし、これには「主語」らしきものがない。かといって、「私はやります」と言っても、「私がやります」と言っても、意味は微妙に違ってきてしまう。「私はやります」だと、「他の人は知らないが私はやる」という意味になり、他に誰かに手伝ってもらいたいようである。「私がやります」だと「自分がやって手柄を立てたいから他の者にはやらせないでくれ」といっている感じとなる。このことは、「やります」が「私はやります」の省略形でも「私がやります」の省略形でもないことを意味している。つまり、日本語では、「主語」などなくとも、「やります」だけで十分に一つの文だということになる。

つまり、日本語にそもそも主語という概念が存在するかどうかという点については、専門の学者の間でもまだ統一的見解がないというのが事実のようです。そもそも主語がないという説によれば、主語は省略されているのではなくて、そもそも存在しないということになるのだそうです。だから、主語が必須である英語を機械的に翻訳した文章では、「それは」「我々は」「彼女は」などといういかにも不自然な言い回しが多用されることになってしまうのでしょう。主格をはっきりとさせたい契約文書などでは「甲は」、「乙は」などという様に「主語」を明示しますし、技術文書などでも曖昧さをなくすために多少日本語としては不自然でも主語を明示するということはあるかもしれません。ただし、本来日本語の文法は英語やフランス語などもともと主語(subject)という概念が存在する言語とは構造が違うのであるということを今になって知り、目からうろこの落ちるような思いです。(そんなこと学校の授業では教わらなかったので)
ところで、主語の問題だけでなく、語順、複数形、時制の考え方なども日本語と英語ではまったく異なるのですが、そもそも、英語を母国語として日常から使っている人が作った多くのプログラミング言語*1で書かれたプログラムを理解するためには、好むか好まざるかにかかわらず、やはり、英語脳を相当鍛えておく事が大切なのかと考えざるを得ない気がします。日本人プログラマーにとって英語の壁が大きなハンディということは事実として受けとめ、それを乗り越えるだけの努力が必要なのだと思います。*2

コードが読めない顧客は設計で読むしかない。

というコメントで、確かに顧客がエンドユーザーということなら無理はないですが、元請SEということだったら、プログラムが読めない以前に、単に英語アレルギーなのでプログラムを読もうとしないのではないかとも思ってしまいますね。カプセル化などをきちんと行った設計をした場合、特にサービスレイヤーなど比較的上位のレイヤーに属するクラスのプログラムは、ほとんど英語と変わらないようなレベルの記述になると思いますので。SEと名乗っている以上、ある程度英語が読めるくらいの英語力は持っていてほしいのですが。*3
ちなみに、Javaだと普段は意識していないかもしれませんが、細かいところを見ていくと言語を作った人ができる限り自然な英語に近づけたいという思いを汲み取ることができて面白いです。たとえば、クラス宣言では

public class Customer extends Party {
}

という書き方をしますが、「extends」の部分に3人称の「s」がついていることから、この宣言文は「現在形」の英語を意識したものであると推測されます。実際、

The public class Customer extends Party.

という英文とほとんど変わりません。(冠詞のTheとピリオドがついたくらいの違い)現在形なのはこの文書が「publicなクラスであるCustomerがPartyを拡張する」という事実を宣言していると考えると非常に自然な表現です。同様にメソッドの宣言も現在形であることは例外宣言をするケースを考えれば明らかとなります。

public String doSomething() throws Exception  {}

この場合もthorwsに「s」がついており、この場合の主語はdoSomething()メソッドと考えることができます。
一方で、ロジックの実行中に出現するメソッド呼び出しには動詞に決して多くの場合「s」が付きません。つまり現在形ではなくて原形なのであって、これは英語の命令文を意識したものであると考えることができます。*4

Paul, pass me the salt!(ポール、そこの塩をとって)

中学校の英語の教科書に載ってそうな例文ですが、このような直接話法の命令文の場合、passという動詞は原形で「s」をつけません。実際、Javaの場合を考えると、たとえば、以下のようなDAO(データアクセス)クラスの実装に対して

public class CustomerDao {
  @PersistenceContext
  EntityManager entityManager;

  public void persist(Cusutomer customer) {
    entityManager.persist(customer);
  }
}

entityManager.persist(customer)の部分は

EntityManager, persist the customer!

と英語で叫んでいると思えば「エンティティ管理人よ、その顧客を永続化せよ」とごく自然に読めるのです。この場合entityManager*5というオブジェクトを擬人化して、それに対して命令をしているという形になっているため、英語として読むと、ごく自然にオブジェクト指向で考えているということになるのです。オブ脳以前に英語脳になっていないと、単なる関数の呼び出しに見えてしまい、オブジェクトに命令するという発想で考えにくいと思います。
その他、Ruby on Railsでは規約でDBのテーブル名を複数形の名詞にします。(Customerに対してはCustomersなのですが、ChildならChildsでなく当然Childrenとなります。)どうしてこうなっているかというと、もちろん、SQLでSELECT文を書いた時に英語に近くなるからです。単数、複数の使い分けも日本語には概念のため、日本人の非常に苦手とするところです。

SELECT child FROM children

さらに、最近はDSLという考え方があり、より英語に近い構文でプログラムを書くという発想もあるようです。*6こうなってくると、顧客がプログラムを書かないまでも、少なくとも読んで理解し、プログラマーと会話するということもまったく非現実的なこととは思えなくなります。
既に、どこかで誰かが指摘されていることかもしれませんが、やはり、多くの日本人がオブジェクト指向プログラミングを苦手とするのは英語アレルギーの人が多いからなのかと思ってしまいますね。もちろん英語がペラペラならJavaのプログラムが得意かというとそんなことはないですが、少なくとも達人プログラマーであれば英語がある程度理解できるのは当然ということは言えると思います。特に、業務アプリケーションのような場合だと、複雑なアルゴリズムは既にフレームワークなどでカプセル化されたものが再利用できるため、多くの場合は英作文の力の方が論理的思考やアルゴリズムの理解よりも重要とさえいえるかもしれません。(英語力とプログラミング力との相関関係について何らかの客観的、科学的な調査が存在するかどうかは今のところ不明。)
英語力は情報を調べたり、エラーを解析したり、英文の技術書を読んだり、適切な変数名を考えたり、プログラマーやSEとしては必須の事項なのではないでしょうか。時々上級職のSEでさえ「私は英語はまったく苦手で」と堂々と言っている人がいますが、それはエンジニアとしては本来すごく恥ずかしいことだと思います。

*1:Rubyなどは日本人が作った言語ですが、発想は英語を元にした他の言語を参考に作られているから、結局日本人向けではないのが悲しいところでしょうか?有名な日本人向けの言語としては、「なでしこ」などもあったとおもいますが、残念ながら仕事で使ったことはありません。

*2:英語の学習方法は人によってさまざまだと思いますが、私の場合はCDの英語教材を聞きまくるというのが有効でした。もちろん学校で習う程度の基本文法や単語の理解はある程度前提ですが。特に最近は速聴を行うソフトもありますから(http://www.wweden.com/)、3倍速などで聞き取る訓練をすることで、相当英語脳が鍛えられますのでお勧めです。

*3:ライブラリーの英文マニュアルやエラーメッセージなど日々英語と触れ合わなくてはならない下流プログラマーと比較して、多くの場合上流SE(hands-offアーキテクト含む)は業務上英語にまったく触れることがないということも英語力低下の原因かもしれません。

*4:booleanを返す述語関数は通常現在形でis〜()、has〜()となる。また、getter、setterは対象オブジェクトに対する命令というよりIを主語とした現在形と考えるのが自然。ただし、Javaでは構文上メソッドと区別がつかないが、C#などの言語ではこれらのメソッドは本来プロパティとして定義できる。英語脳には、customer.getName()よりcustomer.nameの方が自然に読める。

*5:クラス名やインスタンス名に-er、-orなどの接尾辞のついた単語を使うことが多いのは、英語nativeの人がオブジェクトを擬人化している証拠ではないでしょうか。Manager、Translatorなどは人に対して使ってもおかしくない単語です。

*6:プログラムを英語に近づけようという試みは実はCOBOLの時代からあったものと考えることもできます。COBOLには何百という英語の予約語があり、文、節、段落などはまさに英文をモデルにしています。英語脳でないと、アルゴリズムやデータ構造ばかり考えてしまい、プログラムの文章としての可読性というところまで頭がまわらないのが問題です。