web-dev-qa-db-ja.com

言語の詳細を単に学ぶのではなく、プログラミングの方法を実際に学んでいることをどのように確認できますか?

本物のプログラマは一週間でどんな言語でも簡単に習得できるとよく耳にします。言語は物事を成し遂げるための単なるツールであると私は聞いています。プログラミングは、習得して習得する必要がある究極のスキルです。

言語の詳細を単に学習するのではなく、実際にプログラミングの方法を確実に学習していることをどのように確認できますか?また、1つの言語だけでなく、すべての言語に適用できるプログラミングスキルを開発するにはどうすればよいですか?

83
Ryan

次のようなステートメントでよく聞かれる「スキル」のとんでもない概念を満たすことを心配しないでください。

  • すべてのプログラミング言語は基本的に同じです。
  • 1つの言語を上手く選択したら、他の言語をすばやく簡単に選択できます。
  • 言語は単なるツールであり、実際にソフトウェアを作成するいくつかの包括的な頭脳の魔法があります。

これらのステートメントはすべて欠陥のある前提に基づいており、幅広いプログラミング言語での経験の欠如を裏切っています。それらは非常に一般的なステートメントであり、多くのプログラマーによって強く信じられています。私はそれについて論争しませんが、私はそれらの正確性について論争します。

これは簡単に証明されます: HaskellProlog 、または の基本を学習するために、1週間(または実際には2日以上の任意の時間)を費やしてくださいAgda 。古い セサミストリート の曲を頭の中で聞くと、すぐに「これらの1つは他のものとは異なります...」と聞こえます。

結局のところ、私たちの95%がやったことのある、または今まで行ったことのないようなプログラミング言語、手法、およびアプローチの範囲が広がっています。多くの他の人は、これらの他の概念が存在することさえまったく気づいていません。これは問題ありません。これらの概念は、採用され、効果的なプログラマである必要はありません。

しかし、事実は残っています。これらのテクニックとアプローチは確かに存在し、さまざまなことに役立ち、非常に便利ですが、慣れ親しんだものとは異なり、人々は午後のいじりで簡単にそれらを拾うことはできません。

さらに、人々がプログラミング言語などの複雑なことを1週間ほど速く持っている、または習得できると主張するほとんどの場合、彼らは少し Dunning Kruger Effect 、Wikipedia(強調私の):

Dunning–Kruger効果は、未熟練者が幻想的な優位性に苦しみ、平均よりはるかに高い能力を誤って評価する認知バイアスです。このバイアスは、未熟練者が自分の間違いを認識できないメタ認知能力が原因です。

Peter Norvigによるプログラミングの学習の概念について、このより経験豊富な視点を人々に紹介します:10年でプログラミングを学ぶ

研究者(ブルーム(1985)、ブライアン&ハーター(1899)、ヘイズ(1989)、シモン&チェイス(1973))は、チェスの演奏、音楽など、さまざまな分野の専門知識を開発するには約10年かかることを示しています作曲、電信操作、絵画、ピアノ演奏、水泳、テニス、神経心理学とトポロジーの研究。鍵となるのは熟慮の練習です。何度も繰り返し行うだけでなく、現在の能力を超えたタスクに挑戦し、それを試し、実行中および実行後のパフォーマンスを分析し、間違いを修正します。その後、繰り返します。もう一度繰り返します。


確かに、すべての言語を学習しやすくする一連の包括的な原則があります。

おそらく、しかし、私はこの原則のセットが非常に大きいため、ほとんど常に1週間の範囲外の言語が存在すると主張します。慣れ親しんでいるリストに新しい概念を追加すると、すぐに手が届かないこの言語のリストは縮小する可能性がありますが、それがなくなることは信じられません。 連結言語 から ベクトルベースの言語 から [〜#〜] ai [に特化した言語へ〜#〜] または メタプログラミングまたは完全に正規表現をサポートするために存在する言語 )。

10年後、あなたは一般的にプログラムすることができます。これは、いくつかの言語または言語のスタイルである程度まともなコードを書くことができることを意味します。 10年後、あなたは残りの人生でこれらの無数の幅広い分野横断的な概念に取り組み始める準備が整いました Edsger W. DijkstraDonald Knuth または John D. Carmack 、あなたはそれらすべてに到達するつもりはありません。

96
Jimmy Hoffa

... 1つの言語だけでなく、すべての言語に適用できるプログラミングスキルを開発するにはどうすればよいですか?

この質問の鍵は、言語を超越し、コーディングしている言語をではなく考えることです。

WAT?

経験豊富なポリグロットプログラマーは、独自の言語のメンタルモデルの 抽象的な構文ツリー (AST)を考えます。 「ここでforループが必要」とは思わず、「何かをループする必要がある」と考えて、その言語の適切なfor、while、または反復子または再帰に変換します。

これは、話し言葉の学習で見られるものと似ています。多くの言語を話す人は、流暢に意味と考え、特定の言語で出てきます。

これのいくつかの手掛かりを見ることができますAST一対の視線追跡ビデオ視線追跡によるコード理解およびアイトラッキングコード実験(初心者)初心者と経験豊富なプログラマの目の動きは経験豊富なプログラマがコードをメンタルモデルに「コンパイル」して頭の中で「実行」しているのを見ることができますが、初心者はキーワードごとにコードキーワードを反復する必要があります。

したがって、すべての言語に適用するプログラミングスキルを開発するという問題の鍵は、メンタルモデルを持つことから遠ざけることができるように複数の言語を学ぶことですone言語の1つであり、ASTを生成する機能を開発します。その後、所定の言語に翻訳されます。

ASTを頭の中で使用できるようになると、似たような考え方の範囲内で別の言語を学ぶ(- Befunge に行くのはJavaから少しジャンプする) 、しかしそれほどではない Forth )ははるかに簡単になります-それは、ASTを3、4、5番目がはるかに簡単な新しい言語に翻訳するだけですなど...)完了した時間。


古典的な記事があります、本物のプログラマはPascalを使用しません。この一部は次のとおりです。

...決定的な本物のプログラマは、Fortranプログラムを任意の言語で記述できる

メンタルAST-あなたも言語で考える必要があります。これを達成するには少し時間がかかります(私はまだ書いていると非難されています) Perl コードPythonと私の最初の [〜#〜] lisp [〜#〜] コードは、「これは非常に良いCプログラムです。」)。

これには、ACMから発行された記事Fortranを任意の言語で記述しない方法を指摘する必要があります。記事の3番目の段落(先行引用符ではありません)は、目前の質問に直接対処しています。

すべての汎用プログラミング言語を超える優れたコーディングの特性があります。自分に当てはめれば、ほとんどすべてのコードに優れたデザインと透明なスタイルを実装できます。プログラミング言語で不適切なコードを記述できるからといって、それを行う必要があるとは限りません。また、優れたスタイルとデザインを促進するように設計されたプログラミング言語は、コーダーが十分に創造的である場合でも、恐ろしいコードを書くために使用できます。 1インチの水が入った浴槽で溺れる可能性があります。また、例外処理とジェネリック型とガベージコレクションを使用して、完全に読み取り不能でメンテナンス不可能なプログラムを、gotoや行番号のない言語で簡単に書くことができます。 Fortran、Java、C++、Smalltalkのいずれを作成する場合でも、悪いコードではなく、良いコードを書くことを選択できます(すべきです)。

AST-他の言語に翻訳できるASTが必要です。Fortranを使用するASTとJavaでFortranコードを書くのは良いことではありません。言語とそのイディオムを十分に理解していなければなりませんthink言語で(私が一番上で言ったにもかかわらず)。

Java Cコードの記述を止めていない誰かによって記述されたコードを確認しました。メインメソッドを持つオブジェクトが1つあります。このオブジェクトには、main、およびパブリックフィールドを持つ(したがって、Strutsのように見えた)内部プライベートクラスです。これは、Javaで記述されたCコードです。行われたのは、構文ある言語から別の言語へ。

この点を乗り越えるには、複数の言語でコードを書き続ける必要があります。notコードを設計するときはそれらの言語で考えますが、言語イディオムで正しく機能するようにデザインをコードに変換します。

そこに到達する唯一の方法-すべての言語に適用できるプログラミングスキルを開発できること-は、言語を学び続け、その精神的プログラミング言語を1つの言語にリンクするのではなく柔軟に保つことです。

(ChaosPandionから 彼が提示したアイデア から大量に借用したことをお詫びします。)

51
user40980

言語を選択して、コーディングを開始します。 Pythonは初心者に適した選択肢であり、 オンラインで利用できるチュートリアル があるので、正しく実行する方法を学ぶことができます。

それからすべてが続きます。あなたの興味はあなたのプログラムに洗練を加えるフレームワークと設計概念にあなたを導くでしょう。基礎と理論の基礎となるオンラインコースを受講したり、さまざまなプログラミングパラダイムを探索したりできることがわかります。

そしてはい、あなたはHaskellのような言語を発見します。これは、基礎にしっかりと根拠があれば、何か新しいことを教えてくれます。

おそらく一部のプログラマーは、すべての言語は同じだと考えています。最も一般的に使用される言語はすべてALGOL(これらは基本的に手続き型言語です)から派生しており、そのうちのほとんどはCに似た中括弧言語です。他のものよりも洗練されているものもありますが、基本的に同じことを行います。

12
Robert Harvey

プログラミングとは、ソリューションをプログラミング言語で実装できるように制限された文法で表現できるように、問題を解決することです。したがって、プログラミングの技術は問題を解決する技術です。

特定の言語では、オブジェクト指向、イベント駆動型、マルチスレッド、MVCフレームワークベースなど、他のプログラミングパラダイムが導入されています。これらはすべて単なるモデルとパターンであり、実装とはまったく関係ありません。

簡単にコードに変換でき、プラットフォームに適したモデルに関連付けられるような方法で、紙に座って問題を解決できる場合は、プログラマーです。あなたがそれを行うことができるすべてがそれらの解決策を取り、私たちの選択した言語でそれらを実装するならば、それは別の問題です。

私は30年間プログラミングしている(OMFG!)が、最初の言語ではないため、php.netを使用してPHPでコマンドを検索します。

言語の専門知識は、マニュアルやスタックオーバーフローを見る頻度に反比例すると思います。プログラミングの専門知識は、コンピュータプログラミング言語と互換性のある方法で問題をいかに簡単に解決できるかです。

関連ニュースで、先週Rubyを学びました。私は「専門家」ではありませんが、Perlで記述できる問題を解決し、それをRubyに翻訳する年齢をかけて、さらに学ぶことができます。

5
stevemarvell

何でもそうですが、練習は完璧だと思います。いつも同じことをしたり、いつも同じ言語を使ったりして、すべてのプロジェクトで物事を学び続けようとしないでください。

ギターを弾くことを学ぶようなものに、簡単に類似点を描くことができると思います。優れたミュージシャンは、非常に短い時間で新しい曲を演奏することを学ぶことができます。なぜなら、彼らはすでにすべてのコードと、コードが現在の方法で演奏される理由の背後にあるすべての理論を知っているからです。彼らはどうやってそれを良くするのですか?彼らは非常に多くの曲を演奏したため、すべてのパターンが混ざり合っただけでなく、同時に、それらのパターンもサブスクライブするという実際の文書化された理論で知識を補足しました。

したがって、おそらくいくつかの曲を上手に再生できますが、逸脱したり、新しい曲をすぐに拾ったりすることはできません。これはおそらく、同じ [〜#〜] crud [〜#〜] アプリケーションを何度も作成し続ける 。NET プログラマと同等です。新しい何か、いくつかのWebサービス呼び出しまたは高度なUIを追加するか、まったく新しい言語で記述します。思わぬ障害が発生した場合は、なぜ物事がそのように行われるのかを調べ、Stack Exchangeで質問するなどしてください。最終的には、継続的に発生するすべてのパターンがわかり、基礎となる理論の一部を理解し、新しい言語を学ぶことはできません。ほぼ同じくらい気が遠くなるようです。

3
KDiTraglia

言語を学習するのにかかる時間や、言語を学習することの意味を説明するのではなく、実際の問題に対処します。プログラミングを学んだか、プログラミング言語を学んだかを判断する方法。

問題を個別のプロセスに分解し、それらのプロセスを使用して問題を解決する方法を学んだ場合は、プログラミングを学びました。言語の構文を学び、その言語で実装された場合にプロセスの動作を調整する方法を知っていれば、プログラミング言語を学びました。

これは、LISPを使用するときにFortanでプログラムする必要がある、またはカーソルを使用してデータベース内のテーブルの列の値を合計する必要があると言っているのではありません。言語が実装の詳細であるということだけです。必要なプロセスを変更できるものの、プロセスを識別して作成する必要はありません。最終的には、実際の実装があり、入出力と望ましい結果が得られます。

1
jmoreno

私の戦略は、常に特定のスキルではなく純粋なスキルに焦点を当てることでした。

Python(または任意の言語)の特別な構文を学習するのではなく、そのカテゴリのすべての問題を最適に解決する方法など、抽象的な問題の解決に頭脳サイクルを費やしてください。

そうすれば、言語に関係なく何をすべきかがわかり、ほとんどの場合、どの言語でのプログラミングにも使用できる時代を超越したスキルを身につけることができます。

MySQLなどの落とし穴が多いツールやJavaなどの意欲的な言語は特に避けてください。これらのツールを使用して学んだことは、ツール固有の知識の大部分を占めるため、かなり早く役に立たなくなります。

多くの答えで言われていることとは逆に、他のプログラマの言うことを聞かないでください。あなたは初心者であり、本当の取引から偽物を区別する方法はないので、塩のスプーンですべてを取る方がよいでしょう。

常に質問し、ソリューションが高速でエレガントで信頼できる場合にのみ受け入れたいと考えています。

1
Morg.

分析的に考えることができれば、良いスタートを切ったと思います。

必要な言語を学び、一連の例を通して自分で作業します。プログラミングを教えるほとんどこれまでにない本で示されるように。

次に、自分の問題を解決してみてください。さまざまな解決策を見つけて比較してみてください。速度とメモリ使用量は、よく使用される重要な要素です。他のプログラマーとソリューションについて話し合います。

他のプログラマーのコードを読んで、なぜ彼らがこの方法で問題を解決したのかを理解しようとします。

また、標準的なアプローチの概要を理解するには、アルゴリズムに関するいくつかの本を読む必要があります。新しい問題は、多くの場合、古い問題を修正したものです。

チームでの多くの練習とコードの操作は、スキルを段階的に向上させるのに役立ちます。

私の意見があなたの質問に少なくとも部分的に答えることを願っています。

0
MrSmith42

理論的なアプローチがあります。コンピュータが実際にどのように機能するかについて説明します。基本的なプロセッサの命令がどのように連結されて、高レベルのプログラミングの世界で当たり前のように、より複雑な操作と構造を作るか。

次に、より実用的なプログラミング方法があります。人々が通常「良くないプログラマ」と分類される主な問題点は、彼らが本当に1つの言語しか知らないことです。そして、他の人を知っていても、彼らのネイティブ言語で行うのと同じようにプログラムします。彼らがプログラムの方法を本当に学びたければ、それは破らなければならないサイクルです。これに対するデフォルトの答えは、各プログラミングパラダイムから少なくとも1つの言語を学ぶことです。したがって、OOP言語、関数型言語、スクリプト言語...などを学習します。そして、学習によって構文を学習することを意味しません。言語を実際に使用して何かを作成することにより、言語を学びます。

個人的に、私は新しい言語を学びたいとき、私は Project Euler パズルを使います。 OOP=言語(例として))で既に解決したパズルに行き、新しい言語のベストプラクティスに従って、機能的な言語を使用してそれを解決しようとします。 2つの根本的に異なるアプローチを使用して同じ問題を解決すると、実際の違いがわかるだけでなく、共通領域がどこにあるかも示されます。すべての言語で共有されるこれらの共通領域は、実際プログラミング、違いはそれを達成するための異なる方法です。

0
System Down

私の場合、次の方法で実際にプログラミングする方法を学びます。

  1. マスターから学ぶ。プログラミングポッドキャストを聴いたり、選択したプログラミングトピックでプロのブログを読んだり、ウェブ全体に散らばっているgurusによるすばらしいチュートリアルを読んだり、最後に The Pragmatic Programmer のような壮大な本を読んだりしてください。この本には、作者のキャリアを通じて蓄積されてきたプログラミングの宝石がたくさんあります。実際にコーディングする方法を学ぶための確実な方法の1つは、他の成功したプログラマーがそれを行う方法を知ることです。
  2. することで体験。それについて読んで知ることは1つのことであり、実際にそれを実践し、それを機能させることは別です。経験に勝る先生はいないので、コーディングキャップをかぶって始めましょう。
  3. 知っている人に聞いてください。今と同じように、チームの先輩からのベストプラクティスやより良い方法について質問することを恐れないでください。または、先輩やメンターやグルにアクセスできないほど不幸な場合は、その後、stackexchangeの残りの部分とインターネットに問い合わせます。

また、コメンターが述べたように、ツールもマスターすることを忘れないでください。すべてのベストプラクティスと最高の理論を学ぶことは、まったく役に立たないか、ツール(この場合はプログラミング言語)について十分に知らなければ、十分に実装されません。

0
Maru

さて、私が言いたかったことのほとんどはすでに述べられています。追加したいのは非常に単純な類推です。

プログラミング言語が単なるツールと見なされている場合でも、一方が得意であっても、他方が得意であることには絶対的な論理はありません。

評判の良いマスター剣士の束を検討し、突然彼らの剣を下に置き、7日間の訓練の後に槍と戦いに行きました。どうなりますか?彼らは虐殺されるでしょう。

言語を学ぶのは難しいことではありませんが、上手になるには忍耐と訓練が必要です。さらに、プログラミングを学ぶためのright方法はありません。

プログラミングを学ぶことは、RPGゲームをプレイするようなものです。時には剣、時には槍、時には盾を使います。敵を倒すごとに経験値が付与されます。十分な経験値を取得したら、レベルアップします。剣を習得しても、弓矢は上手くいきません。しかし、以前に得た経験の一部は、スタミナとスピードを向上させます。

ここでは、言語を学習するときに実行する可能性のあるいくつかのことを示します。

  • 言語について読んでください。面白そうな場合は、hello worldアプリを自分で試してみてください。
  • チュートリアル、トリック、ブログを読んでください。
  • ただ楽しむために、その中にシンプルなアプリを作成します。
  • さまざまな機能をテストします。
  • 本当に気に入ったら、本やビデオチュートリアルを購入してください。
  • 適切なライブラリを検索します。
  • 回答を検索し、回答が見つからない場合にのみ尋ねます。
  • 他の人が答えを求められるように手助けする(ここより良いところは?)
  • 何か役に立つものを作ってください。電卓アプリを作ってみるのもいいかもしれませんが、TO-DOリストアプリを作って実際にPC /電話で使うと100倍満足です。

新しい言語を体験し、新しいライブラリを探索し、自由な時間に新しいトリックを学びましょう。あなたがそれを知る前に、あなたはあなた自身のスキルであなた自身を驚かせるでしょう。

0
Sayem Shafayet