... 1つだけではなく、すべての言語に適用できるプログラミングスキルをどのように開発できますか?
この質問の鍵は、言語を超越し、あなたがコーディングしている言語ではなく考えることです。
ワット?
経験豊富な多言語プログラマーは、言語のメンタルモデルの抽象構文ツリー(AST)で考えます。「ここにforループが必要」とは思わず、「何かをループする必要がある」と考えて、その言語の適切なfor、while、または反復子または再帰に変換します。
これは、話し言葉の学習で見られるものに似ています。多くの言語を話す人々はその意味を流thinkに考え、それは与えられた言語で出てきます。
このASTの手がかりは、アイトラッキングビデオとアイトラッキングとアイトラッキングコード実験(初心者)のペアで、初心者と経験豊富なプログラマーの目の動きを見ることができます。経験豊富なプログラマーは、コードをメンタルモデルに「コンパイル」して頭の中で「実行」しますが、初心者はキーワードごとにコードを反復処理する必要があります。
したがって、すべての言語に適用するプログラミングスキルを開発する問題の鍵は、複数の言語を学習して、1つの言語のメンタルモデルを持つことから距離を置き、自分で問題のASTを生成する能力を開発することです特定の言語に翻訳される主要言語。
頭の中でASTを使用するこの能力が得られると、同様の考え方の学校内で別の言語を学習する(Befungeに行くことはJavaからのジャンプですが、Forthからではなく)はるかに簡単になります-「ただ」 ASTを、新しい言語に翻訳します。新しい言語は、3回目、4回目、5回目(など)に、より簡単になります。
古典的な記事、Real Programmers Do n't Use Pascalがあります。この一部は次のとおりです。
...決定した本物のプログラマは、Fortranプログラムを任意の言語で書くことができます
また、メンタルASTだけを使用することはできない部分もあります。言語でも考える必要があります。これを達成するには少し時間がかかります(私はまだPythonでPerlコードを書いていると非難されており、私の最初のLispコードは「これは非常に良いCプログラムです」と言ってレビューされました)。
これには、ACMが発行した記事「Fortranを任意の言語で記述しない方法」を指摘する必要があります。記事の3番目の段落(先行する引用符ではありません)は、当面の質問に直接対処します。
すべての汎用プログラミング言語を超える優れたコーディングの特性があります。自分に適用すれば、ほとんどすべてのコードに優れたデザインと透明なスタイルを実装できます。プログラミング言語が悪いコードを書くことができるからといって、それをしなければならないという意味ではありません。そして、コーダーが十分に創造的であれば、優れたスタイルとデザインを促進するように設計されたプログラミング言語を使用して、ひどいコードを書くことができます。少しの水が入ったバスタブに浸ることができます。また、例外処理とジェネリック型、ガベージコレクションを使用して、gotoや行番号のない言語で完全に読み取り不可能で維持できないプログラムを簡単に書くことができます。Fortran、Java、C ++、Smalltalkのどれを書いていようと、悪いコードの代わりに良いコードを書くことを選択することができます。
ASTを持っているだけでは十分ではありません。他の言語に翻訳できるASTが必要です。Fortran ASTを頭に入れ、JavaでFortranコードを書くのは良いことではありません。また、言語で考えることができるように、言語とそのイディオムに十分に精通している必要があります(一番上で言ったことにもかかわらず)。
私は、Cコードの作成をやめなかった誰かによって書かれたJavaコードを見てきました。mainメソッドを持つオブジェクトが1つありました。このオブジェクトには、によって呼び出される静的メソッドの束とmain
、パブリックフィールドを持つ(したがってストラットによく似た)プライベート内部クラスがありました。Javaで書かれたCコードでした。行われたのは、ある言語の構文を別の言語に翻訳することだけでした。
この点を乗り越えるには、コードを設計するときにそれらの言語で考えるのではなく、言語イディオムで正しく動作するようにデザインをコードに変換するときにそれらの言語で考える、複数の言語でコードを書き続ける必要があります。
そこに到達する唯一の方法-すべての言語に適用できるプログラミングスキルを開発できる-は、言語を学び続け、その精神的なプログラミング言語を1つの言語にリンクするのではなく柔軟に保つことです。
(彼が提示したアイデアから多額の借り入れをしてくれたChaosPandionに謝罪します。)