14

Joel Spolsky と Jeff Atwood がポッドキャストで、業界や配信プラットフォームに関係なく、プログラマーが C を学ぶべきかどうかについて意見の相違を始めたとき、開発者コミュニティ内で非常に爆発的な議論が巻き起こりました。私は、多くのプログラマーブロガーから、この問題についての彼らの意見を読んでいます。双方の主張には確かに重みがありますが、私が見つけられなかったのは、.NET Framework のみに焦点を当てた開発者の観点から独自の角度から見た視点です。ほぼ全員が、一般的なプログラマーの観点からコメントしていました。

私は何を手に入れようとしていますか?このような高レベルの開発者が費やす時間のほとんどは、ビジネス/ドメインの学習に費やされ、それらのドメイン要件を達成するためのテクノロジを学習するために必要なすべての時間に費やされるという Jeff Atwood の意見を思い出してください。私の実務経験では、多くの人の仕事生活を非常に正確に説明しています。.NET 開発者が「課外」学習の時間を分岐できると仮定すると、それは Cである必要がありますか?

記録として、私は学校で C を学んでおり、支持者が何を理由にしているのかを完全に理解し、評価することができます。しかし、よく考えてみると、個人的には、.NET 開発者は C に直接飛び込むべきではないと感じています。なぜなら、より多くの開発者に時間をかけて習得してもらいたいのは、MSILCLRです。

たぶん、私は異常な同僚の集まりに行き詰まっているのかもしれませんが、私にはわかりませんが、多くの人は、JIT が導入されて生のマシンになる前に、C# または VB コードが最初に IL でコンパイルされることを意識していないようです。コード。ほとんどの人は IL を知らず、作成したコードを CLR がどのように正確に処理するかに関心がありません。Jeffrey Richter のCLR を C# 経由で読んだことは、私にとって非常に多くの分野で衝撃的でした。同僚が「レベルが低すぎる」と却下したにもかかわらず、読んでよかったです。私は IL の専門家ではありませんが、基本的な知識があれば、IL のスタック動作にすでに精通していたので、彼のテキストに従うのがより簡単であることに気付きました。特定のコードを記述したときに IL がどのようになるかを確認するために、アセンブリを逆アセンブルしていることに気づきました。

CLR と MSIL を学習するのは、それが自分の直下の層であることを知っているからです。自分の作業のレイヤーを実行できるようにするレイヤー。C、実際にはさらに下にあります。私たちの「現実」に近いのは、CLR と MSIL です。そういうわけで、私は他の人にそれらを試してみることをお勧めします. それとも、あなたのチームはすでに MSIL に精通していますか?

4

15 に答える 15

35

もちろんそうすべきです。過度に専門的になり、ひたむきになる (そして、それに応じて市場性のあるスキルが限られる) ようになるための最善の方法は、1 種類の言語だけを使用し、「現在のタスクに関係のない」他のすべての言語を避けることです。

すべてのプログラマーは、最新の JIT 化された OO 言語 (C#/Java)、低レベルの単純な言語 (C、FORTRAN など)、非常に高レベルのインタープリター言語 (Python、Ruby など)、および関数型言語 (Scheme、Lisp、Haskell など)。それらのすべてを日常的に使用しなくても、そのような知識が与える思考プロセスの拡大は非常に役立ちます。

于 2008-09-24T07:19:31.307 に答える
6

私はすでにCを知っており、それは.NETベースライブラリにまだ含まれていないものがたくさんあり、PlatformSDKから何かをP/Invokeする必要がある1。1日間に役立ちました。

私の考えでは、私たちは常に、まだ知らないことを学ぶための時間を割り当てる必要があります。あなたの質問に答えるには、Cを学ぶことは必須ではないと思いますが、時間があれば、Cは学ぶのに適した言語であり、他の言語と同じように有効です。

于 2008-09-24T07:50:26.240 に答える
5

確かに、C はチェーンよりずっと下にあります。MSIL を知ることは、開発者がアプリをより適切に最適化する方法を理解するのに役立ちます。C または MSIL の学習に関しては、なぜ両方ではないのでしょうか? :)

于 2008-09-24T07:19:54.163 に答える
4

.NET 開発者は、CLR について学ぶ必要があります。しかし、C も学ぶ必要があります。ベア メタルで何が起こるかについての低レベルの理解なしに、CLR がどのように機能するかを本当に理解できる人はいないと思います。

高レベルの概念について時間をかけて学ぶことは確かに有益ですが、低レベルを犠牲にして高レベルに集中しすぎると、ホワイトボードにボックスや線を描くことができる「アーキテクト」になる危険があります。しかし、実際のコードを書くことができない人。

C を学ぶことで学んだことは、今後のキャリアに役立ちます。Microsoft がプラットフォームを変更すると、CLR について学んだことは時代遅れになります。

于 2008-09-24T13:56:26.830 に答える
3

C# の記述を十分に進めるには、言語自体を学習していなくても、C の概念を理解する必要があります。

より一般的に言えば、何らかのスキルに真剣に取り組んでいる場合は、主要な作業レベルよりも少なくとも 1 つ下の抽象化レベルで何が行われるかを知っておく必要があります。

  • jQuery でのコーディングは、JavaScript の理解と組み合わせる必要があります。
  • 回路設計には物理の知識が必要
  • 優れたバスケットボール選手は、筋肉、骨、栄養について学びます。
  • バイオリニストは松脂、摩擦、弓毛、弦、木材の乾燥の相互作用について学びます。
于 2009-11-04T19:30:33.160 に答える
3

私の見解では、コンパイルされた言語とアセンブリを学ぶことは必須です。それがなければ、言語とスタックを切り替えるために必要な汎用性が得られません。

より具体的に言えば、優れた/優れたプログラマーは、直接の経験からこれらのことを知っている必要があると思います:

  • レジスタと変数の違いは何ですか?
  • DMAとは?
  • ピクセルはどのように画面に配置されますか (低レベルで)?
  • 割り込みとは
  • ...

これらのことを知ることは、あなたが理解しているシステムで作業することと、あなたが知っている限りでは魔法のように機能するシステムで作業することの違いです. :)

いくつかのコメントに対処するには

最終的には、次の 2 種類の開発者がいます。

  • 1 つまたは 2 つの言語で 10 通りの方法で 1 つのことを実行できる人
  • 10 の異なる言語で 1 つまたは 2 つの方法で 1 つのことを実行できる人

2 番目のグループは、全体的に優れた開発者であると強く思います。

于 2008-09-24T07:25:31.713 に答える
3

私は次のように考えています。

  1. プログラマーはおそらく、適切な最高レベルの言語で実際に作業する必要があります。適切なものは、シナリオによって異なります。デバイス ドライバーまたは組み込みシステムは、CRUD デスクトップ アプリまたは Web ページとは異なるクラスにあります。
  2. プログラマーには、使用している言語でできるだけ多くの練習をしてもらいたいと考えています。
  3. ほとんどのプログラマーは一般的なデスクトップ アプリや Web アプリで作業することになるため、プログラミングを学ぶ学生には在学中にできるだけ早く高水準言語に移行してもらいたいと考えています。
  4. ただし、高水準言語は、ポインターなどのいくつかの基本的なプログラミングの問題を難読化します。学生にも適切なものを使用するという原則を適用すると、それらの高レベルの言語は 1 年生には適切ではない可能性があります。それは、Java、.Net、Python、および他の多くのものを捨てます。
  5. そのため、学生は、学校の最初の 1 ~ 2 年間は基本的な概念をカバーするために C (またはさらに良いのは、C++ は「高レベル」であり、同じ概念のほとんどをカバーしているため) を使用する必要がありますが、すぐに高レベルの言語に移行して、より難しいプログラムを早期に有効にします。
于 2008-09-24T13:44:25.347 に答える
2

私は毎年新しい言語を学ぶのが好きです。必ずしもそれを習得する必要はありませんが、私の脳にさまざまな方法で考えさせることです.

C を学ぶことは、アセンブリでのコーディングの苦労なしに低レベルの概念を学ぶのに適した言語だと思います。

しかし、Haskell、python、そして間違いなく正規表現 (正確には言語ではありませんが、私のドリフトを理解できますか?) などの言語から教訓を学ぶことは、C から収集する教訓と同じくらい重要であると感じています。

だから私は、CLR と MSIL について仕事で学び、暇なときに時々別の言語を習得してみてください。もしそれが今年Cだったら、あなたにとって良いことであり、ポインターで遊んで楽しんでください;)

于 2008-09-24T07:28:24.453 に答える
2

彼らがすべき理由がわかりません。Java や C# などの言語は、低レベルの詳細について心配する必要がないように設計されています。これは、WinForms 開発者が Win32 API の学習に時間を費やすべきかどうかを尋ねるのと同じです。

それを学ぶことは悪いことではありませんが、低レベルの技術的な詳細を学ぶ必要がない限り、使い慣れた言語やプラットフォームの学習により多くの時間を費やすことで、おそらくより多くのことを得ることができます.

于 2008-09-24T17:15:01.190 に答える
1

あなたが自分をプログラマーだと思っているなら、私はイエスと答えます。C を学びましょう。

コードを書く多くの人は、自分自身をプログラマーとは考えていません。仕事で 1 日 3 時間ほど .NET アプリを書いていますが、自分を「プログラマー」とは呼んでいません。プログラミングとは関係のないことをたくさんしています。

一日中プログラミングをしたり、プログラミングについて考えたりして、キャリア全体をプログラミングにまつわるつもりなら、自分のことをよく知っていることを確認してください。C を学ぶことは、プログラミング スキルを深く追求する場合に役立つ基礎知識を構築するのに役立つでしょう。

何事にもトレードオフがあります。より多くの言語を学び、テクノロジーに専念する時間が増えるほど、他のスキルを学ぶ時間が減ります。たとえば、C を学んだり、プロジェクト管理に関する本を読んだりした方がよいでしょうか。それはあなたの目標に依存します。あなたは最高のプログラマー EVAR になりたいですか? C を学びましょう。何時間もかけてコードを書き、クラフトに専念してください。一日中コーディングする代わりに、他の誰かを管理したいと思ったことはありませんか? プログラミングに費やす時間を使って、ソフトスキルを向上させる方法を見つけてください。

于 2008-09-24T13:54:55.787 に答える
1

Should .net developers be learning C? I would say "not necessarily," but we should always be dabbling in some language outside of our professional bailiwick because every language brings with it a new way of thinking about problems. During my professional career as a .net (and before that, VB 2-6) developer, I've written small projects in Pascal, LISP, C, C++, PHP, JavaScript, Ruby, and Python and am currently dabbling in Lua and Perl.

Other than C++, I don't list any of them on my resume because I'm not looking to be a professional in any of them. Instead, I bring back interesting ideas from each of them to use in my .net-based work.

C is interesting in that it really gets you close to the OS, but that's hardly the only level you need to know about to be a good programmer.

于 2008-09-24T17:05:25.737 に答える
1

MSIL を学ぶのは悪い考えではありませんが、ある意味では、MSIL は別の .NET 言語にすぎませんが、厄介な構文を使用しています。ただし、それは別のレイヤーであり、人々はすべてのレイヤーについて少なくともある程度のあいまいな理解を持っている必要があると思います.

C は、構文が優れたアセンブリ言語にやや似ているため、非常に低いレベルで何が起こっているかを理解するのに適した方法です (ただし、いくつかのことはまだ隠されています)。

反対に、誰もが Haskell や Lisp のようなものを少し知って、より高いレベルのアイデアを得る必要があると思います (そして、C# 3 で導入されたいくつかのアイデアをよりクリーンな形で確認してください)。

于 2008-09-24T07:24:53.027 に答える
0

私はこれを別のスレッドに投稿しましたが、ここに適用されます:

良い基盤が必要だと思いますが、ほとんどの時間を、何を使用するかを学ぶことに費やしてください。

  • 2つの数値を足し合わせて、結果をコンソールに表示するのに十分なアセンブラーを学びます。コンピューターで実際に何が起こっているのかをよりよく理解でき、バイナリ/16進数を使用する理由について理解できます。(これは1日で実行でき、cmd.exeからのデバッグで実行できます)。
  • いくつかのメモリを割り当ててポインタを使用する必要があるのに十分なCを学習します。単純なリンクリストで十分です。(これは1日か2日で行うことができます)。
  • 使用する言語の学習により多くの時間を費やしてください。私はあなたの興味があなたをどの言語(C#、Java、Ruby、Pythonなど)に導くようにします。
于 2008-09-24T18:07:40.953 に答える
0

CLR仮想マシンであるため、それだけを学んだとしたら、仮想レベルで何が起こっているかしかわかりません。

Cを学習すると、メモリ使用量に関する限り、物理マシンについて詳しく説明されます。これは、CLR がその下で使用するものです。CLR がどのように機能するかを学んでも、たとえばガベージ コレクションについて C を学ぶほど多くの洞察は得られませ

一方、CILを学習すると、 Cを学習するよりも .NET での実行について少し多くのことがわかります。それでも、ILが機械語にどのようにマッピングされるかは、大部分が謎のままであるため、型のキャストなどの高レベルのオペコードを知っていても、実際に何が起こっているのかを理解するのにはあまり役に立ちません。ほとんどの場合不透明です。ただし、 Cとポインターを学習すると、これらの側面のいくつかについて理解が深まります。

于 2008-09-24T07:19:23.587 に答える
0

問題は C または MSIL の学習ですか、それともより基本的なものですか? 一般に、より多くの開発者が、コンピューターが物理的または仮想的にどのように機能するかについてもっと学ぶことができると思います。箱の中の言語と API を理解するだけで、かなり有能なプログラマーになることができます。職業を次のレベルに引き上げるには、開発者がスタック全体を本当に理解する必要があると感じています。必ずしも詳細である必要はありませんが、問題の解決に役立つ十分な一般性があります。

ここで話されているこれらのスキルの多くは、コンパイラーと言語設計についてさらに学ぶことで習得できます。おそらく、これを行うには C を学ぶ必要があります (おっと、卑劣です) が、コンパイラーの作成は、C を学ぶのに最適なコンテキストです。Steve Yeggeは彼のブログでこれについて語っています。大学でのコンパイラ作成コースは、私がこれまでに受講した中で最も目を見張るようなコースの 1 つでした。400 レベルのコースではなく、200 レベルのコースだったらよかったのにと思います。

于 2008-09-24T17:27:15.293 に答える