web-dev-qa-db-ja.com

第一言語としてのC#の学習は間違いですか?

私はこれについて同じような質問があることを知っていますが、最近、Joel Spolskyによるこの投稿を読みました。

プログラミングの経験がない明るい人に、プログラミングの方法を教えるにはどうすればよいですか?

そして、自分の学習方法や、それが長期的には実際に有害かどうかについて考えさせられました。

私はさまざまな言語に手を出してきましたが、C#は私の最初の深刻な言語です。「Head First C#」を読んで、いくつかのプロジェクトを作成しました。しかし、上記の投稿を読んだ後、私はそれがすべて間違っている可能性があることを少し落胆させたことがわかりました。明らかに、私を少し投げたJoelの意見を尊重します。

私はリーディングリストで推奨されているように「コード」を読み始めました。これは、Visual Studioでの私の「無茶なハッキング」の輝きを取り去ったような気がします。

だから今私は私がとるべき道がわからないのですか?一歩下がって、ジョエルのアドバイスに従って読み始めるべきでしょうか?

私の主な目的は、他のみんなと同じように優れたプログラマーになることだけだと思いますが、私が尊重する意見を持っている人が有害だと思ったときに.NET言語を学ぶことによって悪い習慣に陥りたくありません。

考え?

26

私はさまざまな言語を少し試しましたが、C#は私の最初の真剣な言語です。「Head First C#」を読んで、いくつかのプロジェクトを作成しました。しかし、上記の投稿を読んだ後、私はそれがすべて間違っている可能性があることを少し落胆させたことがわかりました。明らかに、私を少し投げたJoelの意見を尊重します。

私もジョエルの意見を尊重しますが、それはそれだけです:opinions。開始言語としてC#を使用することにまったく問題はありません。

私があなたに与えることができる最大のアドバイス、またはすべてのプログラミングをしている人(バニラCで始まっている場合でも!)は、停滞しないことです、と宗教的ではありませんあなたが始めているプログラミング言語、またはその言語がどれほど純粋または正義であるかは気にしません-この時代では、プログラミングの世界だけに座る余裕はありません。

たとえば、私は10代の頃にPHP3でプログラミングを始めました。私はいくつかの小さなWebアプリとそれを使ったいくつかのWebサイトを構築しました。私は天才プログラマーであり、PHP3で何でもできると思っていて、ASPまたはBASIC。男の子、私は間違っていました。

自分の視野を広げ、他のプログラミング言語や概念を勉強し始めるまで、私は本当に開発者として開花し始めませんでした。高校時代にRealBASICを学び、その後Visual Basicを学びました。ビジネススクールを卒業した後、プロの開発者になったとき、C#とJavascriptを本格的に学び始めました。

さて、ここで誤解しないでください-私はあなたがすべての取引のジャックになりたいと主張しているではありません。根本的に、そして貿易において、私はまだPHPプログラマーです。PHPは私のパンとバターであ​​り、私はそれを内外で知っています。しかし、私のPHPスキルは、彼らが単にPHPを実行していたものにはなりませんでした。専門的な仕事をしているにもかかわらず、PHPから理解できなかった非常に重要な概念をいくつか示します。

  • JavaScript:クロージャ
  • jQuery(はい、個別):DOMとAjax
  • Visual Basic:オブジェクト指向プログラミング
  • C#:ジェネリックスとクロージャー
  • Ruby(on Rails):MVCデザインの力

私は続けることができ、このサイトの他の多くの人たちも同様に、何日間も続けることができました。私はPHP=プログラマーですが、これらすべての他の素晴らしい概念を私と一緒に毎日の仕事に持ち帰ることができました。

私のポイントは何ですか? C#を学ぶ。 C#のマスターになる-長く成功したキャリアがあり、おそらくいくつかの素晴らしいことを成し遂げるでしょう。しかし、自分で鳩の穴を開けない。旅に出て、他の言語や環境、コンセプトを味わってください。

80
Jarrod Nettles

私が尊重している意見を持つ人が有害だと思ったとき。

これは私にリチャード・ファインマンが関わる話を思い出させます。カルテックの学生が著名な宇宙学者マイケルターナーに、彼の「バイアス」が暗黒物質を構成する候補としてあるタイプの粒子を支持している理由を尋ね、ファインマンは「なぜ知りたいのかhisバイアス?

プログラマーはすべての人生の歩みから来ています。 Javaは今日、多くの高校やカレッジで教えられていますが、ジョエル・スポルスキーが生まれたとき、発明さえされていません優れたプログラマになるための「本当の道」はありません。SICPのようないくつかの古典はある時点で偶然出会いますが、厳格で迅速な標準はありません。主なことは、優れたプログラマーはかつて次のようなことを言っています。

悪いプログラマーはコードに集中し、良いプログラマーはアルゴリズムに集中します。

C#は最初から良い言語だと思いますが、Visual Studioに注意するように警告します。これはすばらしいIDEですが、DropDownListをドラッグしてGridViewObjectDataSourceにバインドし、Buttonコントロールを使用してDropDownListベースの検索では、ほとんどの作業はIDEによって行われ、実際にはプログラミングを行っていません。IDEsツールを利用しますが、常に概念を構築し、知識を開発するようにしてください。

21
BlackJack

私はただのジュニアですが、無限に経験を積んだ人々への謙虚さと敬意をもって、私はこの態度をとらないことを告白しなければなりません。

あるプログラマーがジョエルの答えの下でコメントしました:「C#能力が強く推奨されるようになった "プログラマー"よりも机の上で頭を叩かなければならなかった誰かとして次のような単純なことはできません非常によく文書化された基本クラスを実装するcおよびc ++プログラムでメモリリークを見つける " ...

しかし、C++アプリでメモリリークを見つけることが、C++を知っていると主張したことがない人にとって簡単である必要があるのはなぜですか。 :)わかりません。それは歯科医のスキルの欠如について心理学者を批判するようなものです。私は確かに良いプログラマではありませんが、C++を知らないからではないように思います。それは、am使用。

"十分に文書化された基本クラスを実装するなどの単純なことはできません(...)または自分で問題を理解するか、適度なペースで新しいアイデアを学ぶだけです"

OK、しかし-相関関係は因果関係を意味するものではなく、一般的なプログラミングスキルの欠如-私が疑う余地はありません-が言語選択の結果結果

または、C#が最初に選択した言語であることの影響、それについてですか?

私は他のもっともらしい説明を見ることができます(おそらくC#は単にトレンディなので、多くの初心者を惹きつけます... C#が第一言語であるほとんどの人は、プログラミングをあまり長くしていません、そしてそれは、他の言語でプログラミングしないことなどよりも、それ自体でハンディキャップです...)。

7
Konrad Morawski

私にとって、その他の記事の内容は、エリート主義の主人公であることに少し気づかされました。はい、私は頻繁に [〜#〜] sicp [〜#〜] 本当に良くなりたい真面目な開発者に、しかし「規範」を超えて深いことを学びたい人にだけ勧めますマジック。実際、何年にもわたって [〜#〜] sicp [〜#〜] は標準でしたMIT新入生のプログラミングテキストですが、多くの堅実なプログラマーはそのすばらしいけれども高価で非常に選択的な機関に参加する機会。

では、あなたの質問に答えてすることをお勧めします。特定の言語を学ぶだけでなく、自分が持っているものから始め、プログラマーのように考える方法を学びます。

たまたまC#実装が利用できる場合は、それが私のような働き者にとって完全に優れた言語であることをお伝えします。Java、JavaScript、Python、Ruby、Scala、Scheme、および私が持っている他の多くの言語も同様です。長年にわたって学びました。結局、私は目前の特定の仕事に適した言語とツールを選択することを試みます、それは帽子のような言語を切り替えることを意味します。

Ruby via Why's Poignant Guide and Shoes (-で推奨したように)に近づくなど、楽しい学習方法を使用することに何の問題もありません。 別の最近の投稿 )。 The Little SchemerThe Seasoned Schemer に頭を叩くなど、不可解で神秘的な道があります- [〜#〜] sicp [〜#〜] 。多くの現代の思想家は、古い学問的および「エンタープライズ」のものをすべてスキップして、代わりにJavaScript、JQuery、およびHTML5に直接飛び込む必要があります。多くの方法があります。始めるので、あまり時間を無駄にしないでください。1つ選んでコーディングしてください。

現実的には、アセンブラーやC/C++を最初に学ぶために逆行してくれるプロの仕事をする人は最近ほとんどいないと思います。率直に言って、彼らがそうしたとしても、彼らがあなたに多くの奉仕をしてくれるとは思えません。

それで、「あなたが持っているものから始める」ことを少し装飾するために、私はさらに3つのアドバイスをします:

  • あなたにとってかっこいいと思われるプログラミング言語を1つと、理にかなっていると思われる学習アプローチを1つ選び、それらをすべて活用してください。選択した言語で文盲になります。あなたが管理できる限り多くの良いコードを読んでください!
  • すぐにキーボードに手を触れて、学びながらコーディングを始めましょう。プログラミングブックのすべての基本的な演習を自分で行い、見つけたすべてのチュートリアルを実際に機能させるために指で離れて喜んでクリックして練習します。動作するはずのコードであるはずのデモのエラーを修正するときに、どれだけ多くのスキルを習得できるかに驚かれることでしょう!
  • 優れたプログラマーが問題をどのように考えているかを学ぶことに、ほとんどの努力を費やしてください。複雑な問題とシステムを分析して分解し、本当に理解するまで分解する方法を学びます。次に、自動化されたソリューションを合成および設計する方法を学び、それらを構築して、この地球上の一部の人間にとっていくつかのタスクを容易にします。

私はFORTRAN IVとQBASICから始めましたが、それらが私を台無しにしない場合でも、C#はあなたを傷つけません!頑張って、学びながら楽しんでください!

5
John Tobler

あなたの質問とここでの答えの多くの焦点はC#にあります。 Wikipedia から:

C#言語は、シンプルでモダンな汎用のオブジェクト指向プログラミング言語であることを目的としています。

それだけに基づいて、あなたの脳に長期的なダメージを与えることなく第一言語としてC#を学ぶことができたと言っても安全だと思われます。けれども、Joelが言語全体を非難していたとは思わない 彼が書いたとき

近道をとって、今すぐ学びたいことを正確に学ぼうとする試み(C#やASP.NETから始めるなど)は運命づけられていません。

問題は言語ではなく、近道です。多くの場合、人々は段階的なチュートリアルや「24時間ですべてを学ぶ」本を読み、最終目標にすばやく到達しようとします。次のような質問がたくさんあることに気づく前に、スタックオーバーフローにあまり時間を費やす必要はありません。「人生でコード行を書いたことはありませんが、iPhoneを使い始めています。プログラミング!誰かが私がやりたいことを正確に行うための段階的な手順を教えてもらえますか?ありがとう!」あなたがそのアプローチを取っていると言っているのではありませんが、それはあなたが守らなければならないものです。

確かなプログラミングスキルを磨きたい場合は、基本的なスキルを学ぶことから始めてください。 OOPおよびGUIアプリケーションなどに直接ジャンプしようとすると、おそらくそれらの基礎を逃すことになります。Joelが指摘した本は確かに非常に優れています。 C#イエローブック (PDF)ですが、店頭で目にするほとんどのC#ブックよりも、プログラミングの入門としてはおそらく優れているようです。

5
Caleb

私は1つの言語を学習し、それにこだわるは、最初にどの言語を使用するかを決定することよりも間違いです。もちろん、もっと簡単に学べる言語もありますが、頻繁に使用する言語を学んでみることをお勧めします(学校の設定では、言語の選択は学校によって既に行われています)。言語を適切に学習し、数か月後に積極的に使用した後は、別のプログラミング言語を試して比較する必要があります。

.NETでは、Visual BasicとC#を切り替えることができるため、2つの(sort-of)異なるプログラミング言語を使用するのは簡単です。したがって、Visual Basicを学び、違いを確認することができます。このレベルでは、3つの基本的なプログラミング構造を備えた基本的な手続き型コーディングに精通している必要があります。それらすべてを使用してクリエイティブに(および変数の使用方法を知っている)ことができれば、優れたプログラマーになるための準備が整います。

  • シーケンス-コードは、指定した方法で互いに続く一連のステップで記述されます(「ジャンプ」、ステップバイステップ、およびgotoを定義します)
  • 条件付き-コードは決定点を持つことができます(ifステートメント、switch-caseステートメントを定義します)
  • ループ/繰り返し-コードは、何らかの決定が与えられた場合にコード自体を繰り返すことができます(これは上記の両方の拡張であり、for-whileループを定義します)

セカンダリプログラミング言語が最もアクティブかどうかは関係ありません。プログラミング言語(特に同じパラダイムに従っている場合)が互いに非常に類似していて、小さなニュアンスが実際に長い道のりを進んでいることを知っているだけです。ソフトウェアプログラミングのしくみを理解してもらいます。

それから、少なくとも年に1回は、新しいプログラミング言語を学習してみてください 別の追随 プログラミングパラダイム 。新しい言語に完全に追いつく必要はありませんが、他のパラダイムを知ることにはいくつかの利点があります。いくつかのパラダイムがあり、いくつかのプログラミング言語は多くの間に混在しています(C#には実際には次の3つのサブセットがあることに注意してください)。

多くのプログラミング言語が独自のイディオムと基本APIに従っていることを学ぶ必要がある最も重要なこと。したがって、新しい言語を学ぶときは、それらのイディオムとAPIをよく学んでみてください。良い理由の1つは、プログラミングの問題の設計と解決が上手になることです。ある言語の慣用句によっては、主な問題の解決方法に関する洞察が得られる場合があります。

また、最もよく使用する主な言語以外に、他のプログラミング言語を学ぶべき非常に良い理由が1つあることも知っておいてください。雇用される可能性がはるかに高くなります。

5
Spoike

「何語を学ばなければならないのか」と尋ねる人に関しては、今まで見た中で最高のアドバイスだと思います。つまり、優れたプログラマーはどの言語でも作業できます。

確かにその意見には反対の意見がありますが、要点は、まず言語の専門家ではなく、優れたプログラマーになることを学ぶことです。ビルダーは、土地の1つの区画での構築に特化していません。彼らは貿易のスキルを学び、必要な土地の区画にそれらを適用します。

4
Andy Hunt

時々、選択した言語は私たちの個性とより多くの関係があると思うことがありますが、それらは私たちが有線である方法であり、私たちが認めたいよりも実際的または学術的な考慮事項とはあまり関係がありません。

そうは言っても、新しいものを学ぶことは決して害はありません。すべてがマニュアルを持っていることに気づき始めると、進化した脳またはおそらく壊れた脳に向かってしきい値を超えた日がわかります(すべて私が推測する視点の問題です)。才能があり、プログラマーとしての側面ではなく、実際にそのことに興味がある場合は、最終的に本当にやりたいことが何でもできます。

少なくともPythonとJavaScriptをいじくりまわしてください。IDLEやサンドボックスなどのファイルI/Oアクセス可能なコンソール環境でコードを記述してすぐに実行できることを確認できることは、確かな学習上の利点です。ブラウザのような環境です。C#とJava=が嫌いなのは、無意味なラッパーを使用した単純な関数を書いていても、ピアまたは過度に制限されたコンパイラは満足しています。JSとPythonについて私が好きなもう1つの点は、実際に独自のパラダイムを設定できることです。多くの開発者設定により、柔軟性が少なすぎます。私はmまだ基本的な演算子をオーバーロードする知恵についてどう考えればよいかわかりませんが、オプションを許可するためにPython=が好きです。

また、ほとんどの求人情報で主要言語を選択するという残酷な嘘に陥らないでください。すべての就職活動をマッチングプロセスよりも多くの宝くじに変える、ほとんどがらくたの不足しがちな魚の群れのメンバーよりも、好きなことをしている中水域の大きな魚である方が良いです。

3
Erik Reppen

C#は、Javaほど大きくはありません)。関数型プログラミング、汎用プログラミング、確定的破壊と値の型、演算子のオーバーロードなど、多くの概念をよりよくサポートしています。これらのサポートはもちろん、機能はまだ多くの作業を使用する可能性がありますが、C++でなくても、Javaよりもはるかに優れています。

第二に、あなたはジョエルが言ったことを誤解していると思います。 canマスターポインターと再帰の場合、現在使用している言語は関係ありません。最も重要なことは、小さなunsafeコードを使用して、unsafe quicksortまたは何か、その後、通常のC#の残りの部分に戻ります。

ああ、そして読んでください:)

3
DeadMG

私にとって生産的な最初の言語はC#でした。学校時代にはFoxproをいじり、大学では少しCをいじっていました。 C#は非常に優れており、誰にとっても非常に素晴らしい出発点です。それは、強い型付け、カプセル化、継承などのプログラミングの一般的な基本原則に従っており、それらを使用するかどうかに関係なく、常に学習する必要があると私は信じています。後で、Pythonのような他の言語にいつでも移動できますが、これは基本的なプログラミングの標準化に従っていません。

人々がC#の学習の側面に実際に追加しない他の追加要素は、私が見たすべての言語で最高のIDEの可用性です。EclipseIDEも良いですが、Visual Studioを使用すると、Microsoftに感謝します。

C#はCよりも強化されており、事前に他の言語を学ぶ必要がないことを保証します。 10年以上にわたるすべての言語は、Javaでさえ、Cの性質から発展してきました。

したがって、評決は次のようになりますC#は、将来、他の言語をすばやく学習できるようにする優れた出発点です

2
Pankaj Upadhyay

C#を第一言語として学習することは、遅かれ早かれ次の段階に進んで第二言語の学習を開始する限り、間違いありません。それははるかに重要です。その第2言語がC#と多少異なる場合はさらに良いです(javascriptまたはRubyはその点でJavaより優れているでしょう)。すべての言語には長所と短所があり、違いはあなたを作るでしょう長期的には、より優れたプログラマーです。

2
henrik

最初にC#を学習したことを心配する必要はありません。最初のステップが左足または右足で行われたことを心配するのと同じです。最初に管理された言語を学ぶことの唯一の違いは、ポインタと詳細なメモリ管理を学ぶ必要があるときに遅れていることだけです。これは、Cを学習するときがきたら、メモリ管理だけが心配になるので、実際にうまくいく可能性があります。制御構造や関数の概念などを習得しようとしてジャグリングすることもありません。ポインタとメモリ管理に完全に集中できる。

ステレオタイプが存在するのは、その2番目の部分を一度も実行せず、CおよびC++を学習してから、CおよびC++ジョブに適用したマネージ言語のプログラマーがいるためです。

それは楽器を学ぶのに似ています。最初の楽器は、書かれた音楽を読む仕組みと、楽器を関節でつなぐことの物理的な仕組みを習得しようとしているため、難しいものです。 2つ目以降の計測器については、その計測器がすでに知っているものと異なる点にのみ集中することができます。

1
anon

間違いなく初心者には厳しいです。私はいくつか例を挙げると、vb、javascript、PL/SQL、T-SQL、Uniface、および少しのC#を実行しました。

以前にVisual Basicについてオブジェクト指向プログラミングについて学び、正直に言うと、VB.NETはこれまでに見たどの言語の構文でも最も理解しやすいと言っていました。最高の機能は、キーワードが密接に説明されている概念と一致することです。

例えば関数myHandler()がmyButton.clickを処理します

またはクラスヒューマンエクステンド哺乳類はインテリジェントライフフォームを実装します

真剣に、あなたが初心者であるときの読みやすさのために、構文を他にどのように見せたいですか

プロパティとメソッド(およびサブと関数の区別)を探しているときは、VBで読む方がはるかに簡単です。

同様に、変数を宣言するとき

Dim myString As string-どちらがタイプでどれがインスタンスであるかは明らか

C#の大文字と小文字の区別は、クラスとインスタンスに同じ名前を使用し、1つを大文字、もう1つを小文字にするという、深刻な悪い習慣を私に助長します。

例えば.

人間人間

  • あなたが大文字で既存の単語を再利用しなければならないほど深刻な単語が少ないのですか?

human.thinkを呼び出すと、インスタンスをクラスと間違えて、静的メソッドを一目で呼び出していると考えるのは簡単です。ちらっとすることは、多くの場合、コードをどのように認識するかであり、すべての要素にマウスを合わせてエディターに何が起こっているのかを伝える時間はありません。

C#にはいくつかの利点があるかもしれませんが、タイピングを省略しても、始めるのははるかに困難です。これが、間違いなく両方の言語のための場所があるべき理由です。

1
Andy R

(他の人が示唆するように)多くの言語を学ぶことをお勧めしますが、学習する言語(の組み合わせ)を知っていることを確認してくださいvery

多くの言語を知ることのリスクは、実際に問題を解決したいときに、完全にフラストレーションを引き起こす言語を決して習得しない可能性があることです。

多くの言語でforループの構造を知ることは楽しいことですが、それらのいずれかでエラーを処理する方法がわからない場合は役に立ちません。

1
Erno

私が目にすることができる最大の欠点は、Visual Studioとそれに関連するツールが非常に優れていることです。インテリセンスやコード補完のようなものは簡単に松葉杖になる可能性があります。私は一般的に、環境がとても良くサポート的である可能性があると主張します。たとえば、テキストエディターでコードをハックするRubyコードを実行する必要があるときに、少し迷ってしまう傾向があります。ああ、そして通常、linqなども見逃してしまいます。

0
Wyatt Barnett

C#はプログラミングを開始するのに完全に適しています。

それは私が最初に言われたことですが、他に手を出す機会すらありませんでした(JavaのHello World、いくつかの基本的なLOGOのもの、およびScratchのいくつかを除いて、「深刻な」ものはありません)。

全体的に、それは難しい場合があります-直感的に見えないものはたくさんあり、それには限界がありますが、それは良いコーディングを奨励し、こつをつかんだら素晴らしいと思います。つまり、これはPython(通常は推奨されます)よりも強力で、少し専門的です。これは、世界に違いをもたらします-C#の後にC++を試してもそれほど苦痛ではありませんでしたがPythonで始めたので、構文レベルでさえ、それは確かに非常に大きなハードルになります。

また、Monoの形式でクロスプラットフォームを適切にサポートしています(Monoは大したことではないと思う人のために、Unityゲームエンジンでは、そのバージョンでコーディングできます)。また、ゲームスクリプト、Webデザイン、Windowsアプリケーションなど、ほとんどの場合に非常に役立ちます。もちろん、一部の言語は特定の行に適しているため、一般的な方向性によって異なります。たとえば、Web方向に進む場合、C#(ASP.NET)は間違いなく良いアイデア。ゲームを始めるつもりなら、代わりにC++について考える必要があります。

最終的には、PythonのシンプルさやJavaの古風な性質(リリースとして)を優先して使用しなくても、学ぶ価値は十分にありますJavaのサイクルは非常に遅い)-初心者が習得できないほど複雑ではなく、優れたコーディングプラクティスを習得します。

0
Sbspider