質問: ### 教えて頂きたいこと プログラムの学習をしていると英語情報しかない場合があり読解に苦労しています。 少し英語に慣れた方が今後の学習上プラスになると考え、プログラミングに特化した英語学習方法を模索しています。 皆さんお勧めの学習方法はどういったものでしょうか? ### 具体的な利用シーン * 英語マニュアルを読む * 英語のgithubやQ&Aサイト等を読む。 * 英語のコーディング練習サイトで問題を解く 等 ### 現在利用している教材 現在自分が使っている教材は、英文マニュアルと翻訳された日本語マニュアルです。 簡単な説明だと、文章の量がフレーズレベルなので、見比べてフレーズの勉強をしています) 例) 英文)Test your extraction code in an interactive environment. 翻訳)インタラクティブな環境で抽出コードをテストする.
回答: 私はkatoyさんの言っていることに概ね賛成です。 ### 対訳は役立たず まず、対訳を見比べる手法ですが、技術文章の翻訳で優れているものは希です(もちろん、良訳といわれるものもありますが、少数です)。中にはGoogle翻訳の方がマシというレベルもあります。なぜなら、技術がわかる、かつ、翻訳ができるという能力の人は少ないからです。 例えば、有名なStricture and Interpretation of Computer Programs(通称SICP ハル・エイブルソン、ジェリー・サスマン、ジュリー・サスマン共著)の翻訳を見てみましょう。ネットですぐに入手できる翻訳は三つあります。 1. 計算機プログラムの構造と解釈 第二版 和田英一訳 2. PDF版SICP日本語翻訳 minghai訳 3. SICP - Long Gamma 有志による訳 SICPの1.1.2 Naming and the Environmentの冒頭で変数と名前の関係を述べています。 > > A critical aspect of a programming language is the means it provides for using names to refer to computational objects. We say that the name identifies a _variable_ whose _value_ is the object. > > > それぞれの訳とGoogle先生の訳(Google翻訳)を見てみましょう。 和田訳 > > プログラム言語の重要な点は, 名前を使って計算オブジェクトを指す手段を用意することである. オブジェクトを **値**(value)とする **変数**(variable)を識別するものが 名前である. > > > minghai訳(PDFですので、リンクはありません) > > プログラミング言語の重要な特徴は演算対象を参照するための名前を利用 するためにそれが提供する手段です。名前は_value_(**値**) としてオブジェクトを持 つ*variable*(**変数**) を識別します。 > > > 有志訳 > > プログラミング言語の重要な特徴は、演算オブジェクトを参照するための名前が使えるということである。名前こそが、オブジェクトを値として持つ変数を特定するのである。 > > > Google翻訳 > > プログラミング言語の重要な側面は、計算オブジェクトを参照するために名前を使用するための手段です。この名前は、値がオブジェクトである変数を示していると言います。 > > > 和田訳は、古いこともあり、少々お堅いです。技術的には理解しているが故に、やや直訳風になってしまっています。逆にminghai訳は、技術的に理解しているのか疑わしいほど、何を言っているのかわからないという感じです。有志訳は内容の意味だけではなく、日本語として意訳しています。Google先生は少々言い回しが変ですが、意味は通じる感じです。 このように一つのものに対する翻訳でも訳者によってかなり異なります。この違いは、訳者が知っている事の差です。 * 訳者が翻訳の仕方をわかっていないと、直訳になり、日本語として違和感が出る。 * 訳者が技術の仕組みをわかっていないと、日本語は正しいのに、とらえ方の間違いで部分的な訳が間違ってしまい、言っていることがおかしくなる。 SICPは有名なだけあって翻訳は複数ありますが、ものによっては翻訳は一つだけも珍しくありません。本当に酷いものは酷く、英語の原書を読んだ方がマシと言われるものがたくさんあります。 なお、機械翻訳はかなり酷かったのですが、ここ最近は技術の向上で大分マシになってきました。ただ、すごい誤訳をしている場合もたまにありますので、鵜呑みにするのは危険です。 ### 技術英語はフレーズよりターム 技術英語ではそれほど難しい言い回しは余りされません。それこそ仕様書のような文章では、かなり簡素な英語で書かれていますので、SHOULDとMUSTとNOTの違いさえ気をつければ、それなりに読めるはずです。それよりも重要なのはターム、つまり用語です。たとえば"object"とあった場合、普通は「物体」とか「対象」とか「目標」とかに訳されます。しかし、プログラミング言語の言い回しで"object"と言った場合は「オブジェクト」と訳されます。なぜなら、このときの"object"はテクニカルターム(技術用語)であり、もともと日本語に存在しない意味で使われているからです。 先ほどのSICPでは"computational objects"という表現が出てきました。直訳すると「計算的な対象」でしょうが、これでは全く意味がわかりません。「プログラムの計算で用いられる(技術用語としての)『オブジェクト』」と理解すると、なんとなくわかると思います。また、ここでのオブジェクトは次の文の"object"と同じであり、その関連性がさらにわかることでしょう。 ※ では、オブジェクトとは何かと言われると、一言で説明するのは難しいです。それは確かに、コンピュータの中の「物体」であり、計算の「対象」であり、プログラミングする「目標」でもあります。ニュアンス的にそういった英語の元々の意味から技術用語になったと言うこともあり、英語圏の人には違和感がないのかも知れません。 このように、技術用語を知っているか知っていないかで全く別の解釈をしてしまうことがあります。しかし、技術用語を知るにはその技術自体を知らないと難しいです。オブジェクトという技術用語も、プログラミングを理解して初めて理解できる物になるからです。 ### 近道はない じゃあどうすればとなると、まずは最低限の基礎知識を身につけることでしょう。最低でも、まともなプログラミング言語を一通りやっている、または、大学の情報系学部レベルの知識がある、とか、そういった物がないと意味不明で終わると思います。逆にそういった知識があれば、より知識を深めるためにも、知っている事の関連書籍を読むことはかなり助けになるでしょう。 対訳を見ることは、最初に言ったとおり、翻訳の善し悪しがかなり出るので良訳に巡り会わないときついです。ましてや、良訳の本が初心者向けとは限らないため、そもそも訳された本を読めるレベルにならないといけません。結局は、基礎知識に立ち戻ってしまいます。 普通に勉強してからは嫌だ、同時に進めたいと言うのであれば、「英語の本しか読まない」しかないと思います。英語が得意なら、さらさらいけると思います。私もHaskellを初めて学ぶのにLearn You a Haskell for Great Goodというのを英語だけで読み進めていった事があります。ただ、ジョークのような言い回しの部分がわからなかったので、あとで日本語訳(これ自体は良訳だと思っていますが、残念ながら、この本はCやPythonなどの普通のプログラミング言語を知っている人でないとちょっと厳しいです)を買って読み直しましたが...。 ### 更なる先 技術英語にはもう一つレベルがあります。上の話は仕様書とか入門書とか書物レベルです。次に必要なのは会話レベルです。メーリングリストやGithubのissuesなどを読み解かないといけません。ネイティブの人は砕けた英語を使いますし、ネイティブじゃない人(私を含む)は壊れた英語を使います。そこに、なんとか英語で投稿して、会話する必要があります。 ただ、この世界は「通じれば良い」という感じなので、なんちゃってでもそれなりに大丈夫と言えば大丈夫のような気がします。(私は正しい英語になることを諦めました)