web-dev-qa-db-ja.com

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

言語を学ぶには、本を購入し、例に従い、可能な限り演習を試すことができることは知っています。しかし、私が本当に探しているのは、言語を習得したらその言語を習得する方法です。

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

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

リストはどんどん続くかもしれませんが、私はポイントを作ったと思います。 :)

そして最後に、必要に応じて任意の言語を例として取り上げますが、Cを例に取るのが最善です。

106
cprogcr

私は「上記すべて」と答えなければなりません。コーディングが芸術、工芸、工学分野、数学の分野のどれであるかについて人々は議論していますが、私はそれがそれぞれの一部であると言うのが最も公正だと思います。そのため、言語を習得するために持っていくテクニックが多ければ多いほど、優れています。これは部分的なリストです:

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

  • 言語についてできる限り読んでください。特に、「ベストプラクティス」とイディオム。

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

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

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

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

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

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

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

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

  • 会議に参加して、著者が話す言語を聞いたり、業界のリーダーが言語を使って何をしているのかを聞いたりします。

  • 言語でクラスを受けます。

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

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

168
GlenPeterson

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

読む "Teach Yourself Programming in 10 Years"

上からの要点:

  • プログラミングで興味のあるを取得し、楽しいのでいくつかしてください。それがあなたの10年/ 10,000時間を喜んで入れられるように、それが十分に楽しいことを続けることを確認してください。
  • プログラム。最良の種類の学習は、実行することによる学習です。
  • 他のプログラマーと話す;他のプログラムを読んでください。
55
vartec

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

  • C:LCCコンパイラブック

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

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

  • Python:CPythonの実装。

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

  • LISP:SICP Book(SchemeとLISPのような言語用の基本的なインタープリターコンパイラを教えます):LISP in Small Pieces(another good book)。

37
Aniket Inge

使用するつもりがなかった言語を使ってみてください。 Pythonでデバイスドライバー、またはCOBOLで行列操作ライブラリを記述します。言語を習得する最良の方法の1つは、実際にそれをプッシュして、その長所を短所を克服しようとすることです。

13
TMN

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

11
Chris Pratt

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

  • 言語を使わなければなりません。たくさん。さまざまな問題を可能な限り解決する
  • 他の人のコード、できればある程度習熟している(つまり、少なくとも言語のいくつかの側面を深く理解している)コードを読む(そして理想的には操作する)必要があります。ひとことで言えば、言語の問題を解決することについて人々と話すことができれば、はるかに良いでしょう。

それはハードワークと決意にかかっています。

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

魔法の弾丸はありません...

6
Murph

経験に勝るものはありません。何かを習得するためには、多くの異なることに対して、多くの場合、それを行う/使用する必要があります。

だから先に進んで、その言語を練習問題( Project Euler など)や個人的なプロジェクト、実際に必要なもの、または単に興味深いと思うものに使用してください。ゲームを書き、ウェブアプリを書き、パーサーを書きます。そして、すべてのステップで、単にコードを貼り付けたり、指示に従うだけではなく、何をしているのかを理解するよう努めてください。

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

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

2

[〜#〜] sdlc [〜#〜] (別名、ソフトウェア開発ライフサイクル)を読んで理解することから始めます。自己改善、学習、**practicing, practicing...**を含む反復プロセスです

enter image description here

そうすれば、どの分野を学び、改善する必要があるのか​​、視野が広がります。いくつかのコアソフトウェアエンジニアリングブックがあり、自分でいくつかのアプリケーションを構築したら読むと非常に役立ちます。

さらに、いったんOOP言語に自信があると感じたら、デザインパターン、および Head First Designパターン は、検討に値する本当に良い本です。私はこの本が大好きです。

2
Yusubov

問題の大まかな側面では、アーキテクチャについて学びます。プロジェクトの編成方法、構造は何ですか。ランダムに成長させるだけではいけません。

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

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

2
José Dinuncio

いくつか提案してもいいですか。

最初に、言語の使用について話し合い、最良のヒントとコツを得て、あるテクニックが他のテクニックよりも優れている場合に答えるメンターを見つけることができる場合。

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

1
Nicholas Sibson

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

0
sumit

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

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

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

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

0
hsnm

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

  • 他の人が持っている難しい問題を解決してみてください。 SOについて回答する
  • 言語デザイナーのブログ/本を読んでください。それは深い知識の最良のリソースです。理由Xの背後にある設計上の決定は何かを知っているでしょう。
0
Lukasz Madon

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

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

このような、

列1、列2、列3

列3、列2、列1

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

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

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

素晴らしいアイデアです。 Haskell のような言語をお勧めします。最新バージョンでは、手続き型、論理型、関数型のOOの4つのプログラミングパラダイムすべてを使用してプログラミングできるためです。これは実際には関数型言語ですが、努力して他のパラダイムを実装することができます。これは良い学習経験になるでしょう。

いじめるのに最適な言語。

0
Dan