プログラミング言語を本当にマスターするにはどうすればよいですか?


103

言語を学ぶには、本を購入し、例に従ってください。可能な場合はいつでも練習を試すことができます。しかし、私が本当に探しているのは、一度学んだ言語を習得する方法です。

今、私は経験が1つの主要な要因であることを知っていますが、言語の内部を学ぶこと、基礎となる構造などはどうでしょうか。

この本を読んで、その本を読んで、このゲームとそのゲームを作るという記事があります。しかし、私にとってこれは言語をマスターすることを意味するものではありません。どんなに難しくても、他の人のコードを読んで理解できるようにしたい。関数をいつ使用するか、いつ使用するかなどを理解する

リストは延々と続く可能性がありますが、私はポイントを作ったと信じています。:)

最後に、必要に応じて、例としてCを使用しますが、Cを例として使用した場合に最適です。


11
経験が本当に重要なことです。あなたが専門家であるすべての理論は、実際に適用できない限り役に立たない。
サイモンホワイトヘッド

2
この言語のコンパイラを実装します。実際、それが新しい言語を試す私のお気に入りの方法です。ちょっと簡単で退屈に思える場合は、代わりに、Kフレームワークなどを使用して、正式な言語セマンティクスを定義してみてください。
SKロジック

6
「男、ジャガイモは恐竜、車の宇宙」。コードをどれだけマスターしたかは関係ありません。コードが悪くて意味をなさない場合、理解するのは依然として困難です。
レナートディンハニ

2
ポイントが少し欠けていた気がします。Langaugesは進化するため、言語の習得はありません。言語とともに成長するほど、使用すればするほど学ぶ必要があります。
nycynik

2
コードを作成してコードを読み取ります。Linuxカーネル(Cプログラミング)のランダムな部分を取り上げて、関数が何をするのかを理解してください。
アレックスハート

回答:


166

「上記のすべて」と答えなければなりません。コーディングは芸術、工芸、工学の分野、または数学の分野のいずれであるかについて議論します。そのため、言語を習得するために使用するテクニックが多ければ多いほど良いです。以下にリストの一部を示します。

  • 終日、毎日言語を使用します。通常、これは言語でフルタイムで雇用されることを意味します。

  • 言語についてできることすべてをお読みください。特に、「ベストプラクティス」とイディオム。

  • ユーザーグループに参加して、他のユーザーと言語とその言語について話します。

  • 他の人のコードを操作してください!何かひどいことをした人の後を片付けなければならないほど、言語で何をすべきでないかを学ぶより速い方法はありません。

  • あなたが書いたコードをサポートしてください-すべてのバグはあなたの最悪の決定のツアーになります!

  • コンピュータサイエンスと言語全般を学ぶ

  • 非常に異なる言語を学びます。Cに対する大きな賛辞は、Lispのような関数型言語でしょう。これにより、手続き言語についての考え方が裏返しになります。

  • その言語で利用可能なフレームワークとAPIの使用方法を学びます。

  • 時間をかけて、この言語で独自の実験を行ってください。SICPはCには適用されませんが、制限をテストして言語を学習する態度は非常に生産的です。

  • 言語の歴史を読んで、なぜそれがそのままになったのかを学びましょう。

  • 会議に参加して、言語の著者の話を聞いたり、業界のリーダーがその言語で何をしているのかを聞いてください。

  • 言語でクラスを取ります。

  • 言語を他の人に教える(Bryan Oakleyに感謝)

要約すると、考えられるすべてを実行します。ほとんどの言語についてすべてを知る方法はありません。使用するすべての学習テクニックは、あなたの理解にさらなる視点をもたらします。


76
あなたが書いたコードをサポートするために+5-すべてのバグはあなたの最悪の決定のツアーになります!
ジェニファーS

8
最後の文のためだけに+1:Every technique you use to learn brings and additional perspective to your understanding.
Izkata

1
@Izkata:OMG、私はそれを書いたのですか?私は実際にネイティブスピーカーです!修正しました。ありがとう!
グレンペターソン

2
@GlenPeterson ...実は、「オフ」の文章に​​あまり注意を払わずに貼り付けただけです。+1は確かにその背後にある意図のためでした。= P
イズカタ

13
+1の「非常に異なる言語を学ぶ。Cの素晴らしい賛辞は、Lispのような関数型言語です。これにより、手続き型言語についての考え方が裏返しになります。」-これがおそらく最も重要です。プログラミングについて学習する方法(つまり、どのような状況で何を探すか)を学ぶのに役立ちます。
naught101

53

10,000時間の練習が必要です。

「10年間でプログラミングを教える」を読んでください

上からのキーポイント:

  • ゲット興味プログラミングで、それが楽しいですので、いくつかの操作を行います。あなたが10年/ 10,000時間を費やすことをいとわないように、それが十分に楽しみ続けていることを確認してください。
  • プログラム。最良の種類の学習は、実行による学習です。
  • 他のプログラマーと話してください。他のプログラムを読む。

1
それは私が投稿しようとしていたものです!明らかに、P.SEにはまだ十分な時間を費やしていません。
マーティンピーターズ

@MartijnPieters::
D

8
本の素晴らしいタイトル!続編「20年でプログラムを自分に教える!」を待ちきれません。
グレンペターソン

16
ただし、同じ10時間​​を1000回繰り返していないことを確認する必要があります
。– Izkata

自動化またはプログラムの作成対象を誰かが知るのに役立つ技術的な専門知識はありません。これは言っているようなものです-ジムに行き、10年間、毎日1時間、バスケットボールのあらゆる基本的な運動をします。失礼!あなたはバスケットボールのスーパースター(マスター)です...いや、それは単なる技術的なスキル以上のものです。したがって、私はこれを質問への答え、つまりマスターになる方法とは考えていませんか?これは解決策の一部かもしれませんが、マスターシップのための魔法の薬ではありません。私は知っています-私はマスターではありません!
oemb1905

36

決してあなたがそれよりも優れた言語を実装しているまで、自分全体の言語のマスターを検討していません。つまり、特定の言語がどのように機能するかを下から学ぶには、その言語のコンパイラー/インタープリターの概念を教える本を入手してください。例えば:

  • C:LCC Compilerブック

  • C ++:C ++の設計と進化(さらに、独自のC ++コンパイラをビルドするか、GNU C ++コンパイラコードを使用して1つの実装を少なくとも理解する)

  • Java:「Inside JVM」を取得し、javacソースコードを取得します。「java」の.Cコードも役立ちます

  • Python:CPythonの実装。

  • ObjectiveC:AppleのObjCランタイムenvの内部とコンパイラのソースコードに関するほぼすべての資料が役立ちます。

  • Lisp:SICP Book(SchemeとLispのような言語の基本的なインタープリターコンパイラーを教えてくれます):Lisp in Small Pieces(別の良い本)。


1
今、これは私が答えと呼んでいるものです。私はすでに1受け入れているが、それは少し前だったら、これは「最良の答えを」値するだろう
cprogcr

2
あなたの答えがどれだけ助けになったかわかりません。私はあなたが言及した本について読んでいます、そしてそれらは私が必要とする種類のものです。
cprogcr

彼から私は彼らから学んだ。助けてくれてうれしい:-)
アニケインゲ

Cを例に挙げたので、もう2冊の本の名前をプレゼントとして贈りましょう。これは私の手の甲のようにCを習得するために使用していました):1. OOC.PDF(オンラインで無料で入手可能)および2。 Minix Book(OS実装者向けの本ですが、これはLinus TorvaldsがLinuxを実装する前に読んだものです)
Aniket Inge

1
ええ、アンドリュー・テネンバウム、それが本です。どのエディションでも読むことができます。「C」の仕組みはわかりませんが、構築したオペレーティングシステムで動作するようにCライブラリがどのように実装されているかを見ると、Cの理解がさらに深まります。たぶん、十分にあなたがそれを変更できるようにする(そして、OOCの出番それはだ)。
Aniketインゲ

12

それが使用されることを意図していない何かのために言語を使用してみてください。Pythonでデバイスドライバーを作成するか、COBOLでマトリックス操作ライブラリを作成します。言語を習得する最良の方法の1つは、言語を本当にプッシュし、その長所が短所を克服するようにすることだと思います。


1
大学にいたとき、Pongを書いたら言語を「習得」することにしました。MIPSを学ぶまで、これは非常にうまくいきました。私にはまだ悪夢があります。
冷凍エンドウのロディ

CでのWebサイトはできますか?
BigSack

10

簡単にします。言語を習得することはありません。期間。あなたが持っていると思うなら、あなたは非常に明らかに持っていない。あなたが突然到達し、「さて、今、私はその言語を完全に習得しました。今は何ですか?」と言う山頂はありません。何十年も同じ言語で作業してきたベテランのプログラマーでさえ、時には新しいアイデア、プロセス、実践などに出くわすことがあることを教えてくれます。新しい概念を学習する能力と、言語の新しい機能または変更された機能を採用できる速度は、すべてのキーワードと構文の完全な知識よりもはるかに重要です。言語を「マスターする」ことを心配するのをやめ、単にコードの品質と効率を継続的に改善および改善することを心配するだけです。


2
The true goal is to master your conceptual understanding of a language or languages.まさに。それが私が本当に意味したことです。
cprogcr

プログラミング言語には限りがあります。有限個の概念で構築されており、有限個の慣用的なトリックが必要です。したがって、あらゆる言語を習得するのは簡単です。もちろん、一般にプログラミングをマスターすることはできません。常にさらなる改善の可能性がありますが、問題は特定の言語に関するものです
SKロジック

SK-logic:プログラミング言語は変化し、ライブラリと環境も変化します。その結果、言語の操作方法も変わります。たとえば、jQueryはJavascriptの操作方法を変更しました。
-orlp

それは誰もが本当にC ++などの言語を習得することができないことはおそらく本当だが、スキームのような、やや最小限のもののためにそれはかなり可能でなければなりません- SK-ロジックが言う@として、それは本当にだプログラミング習得することができませんどのような言語では、ので、アプリケーションの分野は無限です。
左辺約

1
@nightcracker、言語は「進化」しません。C99は常にC99であり、変更されることはありません。C ++ 11は、次世代言語に置き換えられた後でも、常にC ++ 11のままです。環境は「進化」しますが、jQueryは他の言語コミュニティにこれまで知られていない新しい手法を導入しませんでした。これらは、狭いJavascriptコミュニティにのみ新しいものでした。
SKロジック

5

あなたはすでにこれに対する答えを知っています

  • 言語を使用する必要があります。たくさん。可能な限り多様な問題を解決するために
  • 他の人のコード、できればある程度の習熟度(つまり、言語の少なくともいくつかの側面を深く理解している人)のコードを読む必要があります(理想的には、一緒に作業する必要があります)。拡張により、言語の問題を解決することについて人々と話すことができれば、はるかに良いことです。

それは、勤勉さと決意にかかっています。

用語の由来を考えてみてください。マスター職人になるには、見習いになり、次に職人にならなければなりません。そして、彼らだけがマスターになるチャンスがあるかもしれません。道に沿ってあなたは教えられ、練習し、彼らの技術で他の人を観察し質問し、(できれば)彼らから学びます。

特効薬はありません...


2

SDLC(別名、ソフトウェア開発ライフサイクル)とは何かを読んで理解することから始めます。これは、自己改善、学習、**practicing, practicing...**

ここに画像の説明を入力してください

そうすれば、どの分野を学び、改善する必要があるかについての視野が開かれます。いくつかのコアソフトウェアエンジニアリングの書籍があります。これらの書籍は、いくつかのアプリケーションを自分で構築した後に読むと非常に便利です。

さらに、OOP言語に自信が持てたら、デザインパターンの学習を始めることができます。HeadFirst Designパターンは、検討すべき優れた本です。この本が大好きです。


1
ありがとう。私はこれを読む頃にはすでに答えを選んでいたが、間違いなくあなたのアドバイスを受け取るだろう。
cprogcr

なぜダウン投票したのかわからないので、改善すべき点を教えてください。
ELユスボフ

2

経験に代わるものはありません。何かをマスターするためには、多くの異なることのために、多くの場合それを実行/使用する必要があります。

そのため、エクササイズ(Project Eulerなど)や個人プロジェクト、実際に必要なもの、または単に面白いと思うものにその言語を使用してください。ゲームを作成し、webappを作成し、パーサーを作成します。そして、すべてのステップで、コードを貼り付けたり、指示に従うだけでなく、あなたが何をしているかを理解するよう努めてください。

どんなに難しくても、他の人のコードを読んで理解できるようにしたい。

基本的な構文を理解したら、すぐにできることです。少しコードを取り、時間をかけて詳細に対処してください。理解できないものを調べるか、Stack Overflowのような場所で特定の質問をしてください。


2

問題の上位レベルでは、アーキテクチャについて学習します。プロジェクトを整理する方法、その構造は何ですか。ランダムに成長させないでください。

中級レベルでは、さまざまなテクニックとパラダイムを学びます。レパートリーに多様なツールがあればあるほど、より強力になります。Java、Python、Rubyのみを学習している場合は、プログラミング空間のごく一部にしか触れていません。命令型プログラミングと関数型プログラミングを学び、プロローグとJを学びます。アイデアは、100言語を「マスター」することではなく、同じ問題を解決するさまざまな方法を学ぶことです。

問題の低レベル側では、優れたプログラマーになるために役立つ可能性のあることの1つは(実際、何をするにしても優れている)、プラットフォームの優れたメンタルモデルを持つことです。たとえば、C制御構造がどのように機能するかを学び、最も一般的なライブラリを知ることができますが、ポインターとメモリがどのように機能するかの精神モデルを持っていない場合、適度に複雑な式で問題が発生します。


1

いくつか提案がありますか?

最初に、言語の使用について話し合い、最良のヒントとコツを入手し、ある技術が別の技術より優れている場合に答えるためのメンターを見つけることができる場合。

第二に、可能な限り練習し、言語を最大限に試してください!私はかつてチームで働いていましたが、それは毎日、マニュアルから動詞またはプログラミング言語の他の部分を選び出していました。その日にコーディングに取り組むことができれば、それは名誉な印でした。これは、プログラミングチーム全体が、それを効果的に理解して使用するために、(時には)あいまいな用語を見て理解する必要があることを意味していました。数日は失敗しましたが、そのチームは働くのが楽しく、本当に技術的にスイッチを入れました!!


0

プログラミング言語は、汎用ソフトウェア開発を目的として開発された、または特殊用途のソフトウェアを開発するために開発されたプログラミングパラダイムの背後にある考え方を反映しています。たとえば、Javaのようなプログラム言語はオブジェクト指向のプログラムパラダイムを表しますが、アスペクト指向プログラミングに従ってプログラミングするにはAspectJ(Javaの拡張)が使用されます。

この短い紹介を考えると、実際に言語を習得するためには、本を単独で購入して読むことはあまり役に立ちません。目的の言語を使用してプログラミングできる環境を理解し、パラダイムについて学び、さらに重要なことには、その言語を使用して意味のあるアプリケーションを構築する必要があります。言語が提供するさまざまなツールの味をあなたに与えることができる小さなアプリケーションを構築することは、本当に役立つ学習アプローチです。

私は、オブジェクト指向について何も学習せずに、純粋なCコミュニティーから来ている人々を見てきました。JavaやObjective-Cの学習に苦労しています。また、ユーザーインターフェイス要素、イベント駆動型プログラミングなどの理解を実際に行っていない場合、ユーザーインターフェイスのプログラミングに苦労している人もいます。

これがお役に立てば幸いです!


0

グレンのリストに2つのアイテムを追加します

  • 他の人が持っている難しい問題を解決するようにしてください
  • 言語デザイナーのブログ/本を読んでください。それは、深い知識の最高のリソースです。理由Xの背後にある設計上の決定事項を知っているでしょう。

0

@TMNが言ったことに基づいて構築する。同じプログラムを異なる言語で書くことで、言語学習で大きな成功を収めました。

たとえば、CSVファイルを読み取り、テキストを解析してから、列を逆の順序で2番目のCSVに書き戻すプログラムを作成します。

このような、

Column1、Column2、Column3

Column3、Column2、Column1

これにより、基本的な理解や言語が得られます。次に、他に何ができるかを確認します。値の置換、並べ替え、またはコマンドラインからの読み取りが可能になる場合があります。必要なだけ複雑にします。

また、@ GlenPetersonが言ったことは、

非常に異なる言語を学びます。Cに対する大きな賛辞は、Lispのような関数型言語でしょう。これにより、手続き言語についての考え方が裏返しになります。

素晴らしいアイデアです。Haskellのような言語をお勧めします。最新バージョンでは、オブジェクト指向、手続き型、論理型、機能型の4つのプログラミングパラダイムすべてを使用してプログラミングできます。実際に関数型言語であるにもかかわらず、他のパラダイムを実装することで多少の努力を払うことができます。これは良い学習体験になります。

遊ぶのに最適な言語。


0

本から言語を学ぶことはできません。必要なのは練習と練習だけです。特定の本や特定のソースから言語を学ぶことができるとは思わないプログラミング言語は人間の言語と同じだと思うだけです特定の本を読んで英語やフランス語を簡単に学ぶことはできません。デイライフ。コードを一から作成し、その機能を拡張して、少し満足できるものを構築してみてください。そして、言語を完全に理解し、プログラミング言語の各要素を実際のコーディングで使用することで言語を習得することを考えているなら。または、できても10〜15年かかるかもしれません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.