Hatena::ブログ(Diary)

shi3zの長文日記 RSSフィード Twitter

2012-09-04

英検三級(中学校卒業程度)の英語力で技術文章を読む方法 12:42

僕が「プログラマーに必要なのは中学生英語まで」と書いたことが波紋を呼んでるらしい。


そんなわけがない、と思う人はものすごく英語にコンプレックスがあるのだろう。そのために凄く努力しているのかもしれない。でも僕に言わせれば、プログラマーが技術文書を理解するために英語を専門的に学ぶのは、全く無駄な努力だと思う。


だってアメリカ人の成人が英語勉強してるか?

日本人の子供は日本語を勉強してる。少なくとも高校卒業までは国語の時間がある。

アメリカ人の子供だってそうだ。日本で古文にあたるラテン語、もちろん英語の授業だってある。

けど成人したら誰も英語なんか勉強しない。日本人が成人して日本語を勉強しないのと同じだ。

日本語を勉強している外国人もいるが、それはほとんどの場合は趣味だ。

僕も趣味でギリシャ語とフランス語と韓国語、スペイン語を齧ったことがある。アメリカ人の勉強してる程度の「外国語」なんてせいぜいそんなもんだ。


なぜ日本人だけが成人してまで他国の言葉を学ぶのにそんなに多くの時間を使なければならないのか。

そんなことをやっている間に技術者はどんどん追い抜かれてしまう。英語の専門教育なんかなくても英語で書かれたドキュメントは読める。


そんなことを今回は証明してみよう。


いまどきのプログラマーにとっての英語なんぞは義務教育でほとんど十分なのである。

ましてや今は、機械翻訳もあるし検索エンジンで用例をググれば無数に出てくる。

僕は英語で手紙を書く時、「こんな感じかな」と思って書いてみて、それからダブルクォート付きで検索してみる。すると、正しい用法になっていたら山ほどのページがひっかかるが、へんな使い方だと世界でそんな言葉の使い方をしようとしているのは自分だけだとすぐわかる。こういうテクニックを使えば、面と向かってない相手と英語でコミュニケーションをとることなどほとんど恐るるに足りない。


日本の英語教育では、文法と単語、そしてリスニングと発音、四種類の異なるスキルを一緒くたに扱ってる。英検も五級から既にリスニングはあるが、三級以降は面接がある(はずだ)。

つまり英検三級というのは、面接官と簡単な英会話くらいはできるのだ。


中学生英語で技術文章が読めるわけがないと主張する人は、たぶん同じ内容が日本語で書いてあっても読めないのではないかと思う。


英検三級は中学校卒業程度の英語力とされている。ちなみに僕は四級しか持ってない。だから僕は中学校卒業程度の英語力は、実は持っていない。それでも海外の会社で働けるし、講義することもできる。



どちらにせよ、中学英語程度を使いこなせないようではろくなプログラマーにはなれないだろう。


じゃあ試しにやってみよう。

Name

glTranslate — multiply the current matrix by a translation matrix


C Specification

void glTranslated( GLdouble x,

GLdouble y,

GLdouble z);

void glTranslatef( GLfloat x,

GLfloat y,

GLfloat z);

Parameters

x, y, z

Specify the x, y, and z coordinates of a translation vector.

Description

glTranslate produces a translation by xyz. The current matrix (see glMatrixMode) is multiplied by this translation matrix, with the product replacing the current matrix, as if glMultMatrix were called with the following matrix for its argument:

1 0 0 x

0 1 0 y

0 0 1 z

0 0 0 1

If the matrix mode is either GL_MODELVIEW or GL_PROJECTION, all objects drawn after a call to glTranslate are translated.

Use glPushMatrix and glPopMatrix to save and restore the untranslated coordinate system.

これは http://www.opengl.org/sdk/docs/man/xhtml/glTranslate.xml から引っ張って来た。

まさに僕が学生時代に読んで翻訳していたのはこういう文章だ。

最初の一行めを訳してみよう。

glTranslate — multiply the current matrix by a translation matrix

はい。訳せるかな?

ここに出てくる品詞はtheとbyとaだけだ。中学校でも最初に習う類いの言葉だよね。


じゃあmultiplyは?

ちょっと難しいかもしれないが、辞書を引けば載ってるぞ。そしてたぶん中学校でも習うんじゃないかな。

そう。「乗算」だ。ではcurrent matrixはどうだろう?

これはテクニカルタームだから辞書を引いてみよう。

currentは「現在」matrixは「行列」だね。

ではtranslation matrixはなんだろう?

translationをそのまま解釈すると「翻訳」になるけど、翻訳行列ってのはちょっと変だよね。

テクニカルタームだから辞書を引いてみよう。すると「変換(平行移動)行列」だということはすぐに解るはずだ。


このプロセスを経て、最初の一文を日本語にすると以下のようになる。

glTranslate — 平行移動行列を現在の行列に乗算する

はい。日本語になったよ!

ではこの日本語の意味が解った人?

たいていの人(3Dプログラミング経験者以外)はきっとチンプンカンプンなんじゃないかな。

なぜなら、3Dプログラミングを学んでいれば、glTranslateという関数が平行移動行列に関係するものだということは名前をみれば瞬時に理解できるし、これが日本語になったときにも意味は解る。


そして同時になにもわからない部分もある。

乗算するってどうやって?結果はどこに格納されるの?どのように乗算するの?


そこで続く部分を見る。

C Specification

void glTranslated( GLdouble x,

GLdouble y,

GLdouble z);

void glTranslatef( GLfloat x,

GLfloat y,

GLfloat z);

Parameters

x, y, z

Specify the x, y, and z coordinates of a translation vector.

はい。ややこしくなってきたよー。

これを理解するには英検1級でも無理だよー。

でもプログラマなら余裕。

まず「C specification」これは「C仕様」だね。Cって何?って人はプログラミング勉強して出直して来てね。

まあそんなものが読めなくても、次の「void glTranslated...」以降を読めば誰がどうみてもC言語の関数呼び出し形式であることはわかるよね。

ここは英語じゃない。

英語らしい英語は

Specify the x, y, and z coordinates of a translation vector.

だけだね。

Specify。さあ辞書で引いてみよう。最近は辞書としてはGoogle翻訳がなかなか便利だぞ。

Specifyで引くと「指定」と出てくるね。

coordinatesはなんだ?コーディネート?ザフト?違うぞー。これはテクニカルタームで「座標」という意味だ。

translationはさっきでてきたね。変換だね。vectorはベクトルだね。

さあ日本語にしてみよう。

平行移動ベクトルのx座標,y座標そしてz座標を指定

ちなみにうちの会社のTOEIC700点の非エンジニア社員は「さっぱりわからん」と言っていた。

そりゃそうだよね。だってプログラミングの知識がないんだもん。

しかし重要なのはこの文章ではなく、

void glTranslated( GLdouble x,

GLdouble y,

GLdouble z);

void glTranslatef( GLfloat x,

GLfloat y,

GLfloat z);

この部分だ。


これはTOEICで何点取っていようが全く読めるわけがない。「GLdouble」ってなんだよ。

でもこれは「プログラマー語」だ。プログラマー語では「double」は倍精度浮動小数点型を意味する。floatは単精度浮動小数点型だ。実際にはプレフィクスとしてGLがついているので普通の浮動小数点型じゃないかもしれないが、それはヘッダファイルを覗けばすぐわかることだし、ここでは単に浮動小数点型だと思っておけば問題ないだろう。


また、voidで始まっているのでこの関数は値を返さない関数だとわかる。

プログラミング言語といえど言葉なので、これを日本語に訳すとこうなる

glTranslatedは三つの倍精度浮動小数x,y,z受け取り、glTranslatefは三つの単精度浮動小数x,y,z受け取る。どちらの関数も値を返さない。

こんなことは、プログラムを少しでも齧ったことがあればくどくど説明する必要もない。

さあ、英語っぽくなるのは次のセクションだ。

Description

glTranslate produces a translation by xyz. The current matrix (see glMatrixMode) is multiplied by this translation matrix, with the product replacing the current matrix, as if glMultMatrix were called with the following matrix for its argument:

1 0 0 x

0 1 0 y

0 0 1 z

0 0 0 1

If the matrix mode is either GL_MODELVIEW or GL_PROJECTION, all objects drawn after a call to glTranslate are translated.

Use glPushMatrix and glPopMatrix to save and restore the untranslated coordinate system.

Descriptionってなんだろう?はい辞書だよー。Google翻訳では「説明」と出て来たね。

では最初の文を訳してみよう。

glTranslate produces a translation by xyz.

ここで出てくる品詞もaとbyだけだね。

producesは「プロデュース」の三人称単数現在形だね。

プロデュースは「生成」と訳されるよ。translationはやったね。xyzは明らかに座標のことだね。

つまりこう

glTranslateはxyzによって与えられた平行移動を生成する

はいこの日本語理解できるかな?

難しい概念は日本語でも難しいよ。

まあさっさと次に行こう。

The current matrix (see glMatrixMode) is multiplied by this translation matrix, with the product replacing the current matrix, as if glMultMatrix were called with the following matrix for its argument:

さあこれは難しそうだぞ。でも品詞としてでてくるのはis, with, were,by,the,for,ifなど。ぜんぶ中学校で習うよね。

multipliedは乗算の現在完了だね。productは生成結果、replacingはreplaceの現在進行形で「置き換える」だね。

「as if」はイディオムだ。品詞が二回つづいたらだいたいイディオムだから辞書で調べると「あたかも」という意味らしい。知らなかったよ。

さて、まず訳してみよう。

現在の行列(詳しくはglMatrixModeを参照)はこの平行移動行列に乗算される。生成結果はあたかもglMulMatrixが下記の行列をパラメータとして呼び出されたかのようなものになり、現在の行列との乗算結果が現在の行列に置き換わる。

これはだいぶ難しいね。

ちなみに下記の行列は

1 0 0 x

0 1 0 y

0 0 1 z

0 0 0 1


わーお。出ました。4×4行列。

さあ、実際にこの関数glTranslateがどんな役割を持っているか解ったかな?

たとえばglTranslateをこんなふうに呼び出すと

glTranslate(1.0 ,2.0 ,3.0);

「現在の行列」に以下の行列を乗算して置き換わるということだね。

1 0 0 1.0

0 1 0 2.0

0 0 1 3.0

0 0 0 1

さあ続きも訳してみよう。

If the matrix mode is either GL_MODELVIEW or GL_PROJECTION, all objects drawn after a call to glTranslate are translated.

Use glPushMatrix and glPopMatrix to save and restore the untranslated coordinate system.

ここもあまり難しい文法はでてこないね。

個別の単語の意味は自分で辞書で調べてみよう。訳するとこうなる

行列モードがGL_MODELVIEWかGL_PROJECTIONのどちらかの場合、glTranslateを呼び出した後で描画されるすべてのオブジェクトが変換される。

glPushMatrixとglPopMatrixを使うと変換前の座標系を保存・復元することができる。


完璧に訳せたね。

ただ、もともとプログラミングの知識があれば、こんなややこしいことをしなくても「glTranslate」が単に現在の行列、というかカレントマトリックスを平行移動させる命令だと解る。


本当に技術文書を訳さなきゃいけないような場合というのは、既に出回ってる訳が間違ってるとか、まだ翻訳されていない場合だけだ。それでも重要なのは「translate」の意味と、「current matrix」という単語が出て来た時に、「あ、このアーキテクチャはコンテキスト依存になってるんだな」と解る「勘」の方である。これが教養だ。


教養を身につけるには、多様な技術を知っていなければならない。そのダイバーシティがないと新しい技術がでてきたときにそれがどういう技術文脈で登場したものかわからないので英語だろうが日本語だろうが何が書かれているか解らない。


最近の僕にとっては定理証明支援系言語がそうだった。その元になる素養がないからいきなり英語の解説を見ても全く解らなかった。


JavaならJavaのことしか知らない、では話にならないのだ。



基本的にはこれを繰り返して行けばいい。


さて、非常に簡単な技術文書でさえ、英語力よりもプログラミングの経験や数学の知識がないと翻訳できないことが良くわかったと思う。


ただ、関数の定義とかはちょっとズルいと言われそうなので、オーバービューみたいなもう少し長い文章を見てみよう。

Node's goal is to provide an easy way to build scalable network programs

In the "hello world" web server example below, many client connections can be handled concurrently. Node tells the operating system (through epoll, kqueue, /dev/poll, or select) that it should be notified when a new connection is made, and then it goes to sleep. If someone new connects, then it executes the callback. Each connection is only a small heap allocation.

http://nodejs.org/about/

これも一文一文丁寧に読んで行けば決して難しい文法や凝った文法は使ってないことが解るだろう。

参考訳はこちら。下手だけど許せ

Nodeのゴールはスケーラブルなネットワークプログラムを簡単に作れるようにすることです

以下は"Hello World"を表示するWebサーバのサンプルです。このコードでは、多くのクライアント接続を同時に処理することができます。Nodeは、オペレーションシステムのシステムコール(epoll,kqueue,/dev/poll,またはselect)を使用して新しく接続されるまでスリープします。誰かが新しい接続をするとコールバックが起動するようになっています。それぞれの接続はわずかなヒープ領域しか使用しません。

逆にこの文章は英語力「だけ」がどれだけあろうと正しく訳すのは困難だろう。

実は訳す時にちょっとズルしてる。たとえば「システムコール」なんて単語は原文にはでてこないし、文の形も変えてある。そうしないと意味が通じないのだ。「heap allocation」は直訳すれば「ヒープ割当」だが、不自然なので「ヒープ領域」に変えてある。


しかしヒープがなんなのか解っていなければこんなことはできない。ついでに「epoll,kqueue,/dev/poll,またはselect」はやや直訳気味だが、ネットワークプログラミングの経験がなければ「select」が選択ではなく、UNIXシステムコールの一種ということがわからない。


これが訳せるのは僕に英語力があるからではなく、わずかな英語力と膨大なプログラミングの知識を「組み合わせて」使うことができるからだ。


だから中学生程度の英語力があれば、あと海外の技術文書を読む時に必要なのはプログラミングの知識と経験だけだ。


TOEICなんか何点取ろうが関係ない。

某外資系ソフトウェア企業にはTOEIC美人が山ほど居たが、HQは英語に強い子会社の社員ではなく、英語もまともに喋れない大学生の僕を雇うため、月に何百万というフィーを払い続けた。


実際、プロパーの連中は使い物にならなくて、もっぱら僕が本社のエンジニアと話をつけるのが仕事だった。


だから英語なんか頑張って学ぶより、プログラミングの勉強をしたほうがずっといい、という結論は僕はかわらない。


ただ、プログラマーやデザイナーといったクリエイター以外の人間にはTOEICや英検2級程度の英語力がないと、少なくともARCで働くのは難しい。海外出張が多いし、必然的に海外とのメールのやり取りが業務の大部分を占めるからだ。


繰り返しになるが、僕は英語力が要らないとは決して言ってない。

ただ、プログラマーなら、英語の勉強に時間を割くよりも、プログラミングに関わる知識、言語の知識、プログラミングに使用する数学の知識、オペレーションシステムの知識といったもっと勉強しておかなければならない知識が山ほどあり、駅前留学で下手な英会話で時間を潰してるヒマなどない、というのが結論だ。


また、このくらいの和訳ができれば、英語で手紙を書くことはそれほど難しくない。

ガイジンからくる日本語の手紙よりは僕の英文の手紙は意味が伝わるように書けてる。それでたいていは問題ない。


スピーチ原稿や正式な原稿は、どのみちネイティブチェックが必要になる。

契約書も同様。

ネイティブチェックはどうせネイティブには叶わない。

イギリス英語とアメリカ英語とカナダ英語の区別をつけることさえ日本人には難しい。

アメリカ人が東北弁と関西弁と名古屋弁と東京弁のイントネーションの違いを解るのが難しいのと同じように、得意なものは得意な人に任せるしかない。


MBAホルダーが誰でもiモードのようなビジネスを成功させることができるわけではない。


語学の才能がある人間は、例えばUEIでも社費留学をさせて中国語を勉強するためにしばらく深圳に赴任していた人間も居る。組織のダイバーシティを考えれば、プログラマーはプログラミングを極めておくほうが、結局のところ海外の人と会話するときに「中身」の話ができるのであるのは間違いない。


中身のある話ができるほうが、正しく複雑な言い回しができることよりもずっと大事なのだ。