.NET 開発者は「本当に」、低レベルの C 言語の学習に時間を費やす必要があるでしょうか?

StackOverflow https://stackoverflow.com/questions/125791

  •  02-07-2019
  •  | 
  •  

質問

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

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

記録のために言っておきますが、私自身も学生時代に C 言語を学んだことがあり、支持者の主張を完全に理解し、理解することができます。しかし、物事をよく考えてみると、.NET 開発者はいきなり C に飛び込むべきではないと個人的に感じています。なぜなら、より多くの開発者が時間をかけて学んでほしいと思うのは、 MSIL そして CLR.

もしかしたら、私が異常な同僚たちに悩まされているのかもしれない、わかりませんが、多くの人が自分の考えを保てていないように私には思えます。 意識的な認識 C# または VB コードは、JIT が導入されて生のマシンコードになる前に、まず IL でコンパイルされます。ほとんどの人はILのことを知りませんし、その方法にも興味がありません。 その通り CLR は、作成したコードを処理します。ジェフリー・リヒターの本を読む C# 経由の CLR 非常に多くの点で私にとって非常に衝撃的でした。同僚が「レベルが低すぎる」と却下したにもかかわらず、読んでよかったと思います。私は IL の専門家ではありませんが、基本的な知識があれば、IL のスタック動作にすでに慣れていたため、彼のテキストに従うのは簡単であることがわかりました。特定のコードを書いたときに IL がどうなるかを確認するために、アセンブリを逆アセンブルしていることに気づきました。

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

役に立ちましたか?

解決

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

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

他のヒント

もちろんそうすべきです。過度に専門化され、一心不乱になる(そして、それに応じて、市場価値のあるスキルが限られてしまう)最大の方法は、1 種類の言語のみを使用し、その他の言語を「現在のタスクに関係ない」ものとして避けることです。

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

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

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

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

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

私の考えでは、コンパイル言語とアセンブリを学ぶことは重要です。 しなければならない. 。それがなければ、言語とスタック間の切り替えに必要な汎用性を得ることができません。

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

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

これらのことを知っているかどうかは、自分が使用するシステムで作業する場合との違いです。 理解する そしてご存知のとおり、このシステムは魔法によって機能します。:)

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

最終的には 2 種類の開発者がいることになります。

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

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

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

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

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

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

  • jQuery でのコーディングには JavaScript の理解が必要です
  • 回路設計には物理学の知識が必要です
  • 優れたバスケットボール選手は、筋肉、骨、栄養について学びます。
  • ヴァイオリニストは松脂、摩擦、弓の毛、弦、木の乾燥の相互作用について学びます。

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

C を学ぶことは、アセンブリでコーディングする苦労をせずに、低レベルの概念を学ぶのに適した言語であると感じています。

しかし、私は、Haskell、Python、そしておそらく正規表現 (正確には言語ではありませんが、私の感覚がわかりますか?) などの言語から教訓を学ぶことは、C から収集する教訓と同じくらい重要だと感じています。

そこで私が言いたいのは、CLR と MSIL が専門分野であれば仕事中に CLR と MSIL について学び、空いた時間に時々別の言語を習得してみてください。今年それが C だったら、それは良いことですし、ポインタの操作を楽しんでください ;)

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

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

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

C は、より優れた構文を備えたアセンブリ言語に似ており、非常に低いレベルで何が起こっているかを把握するのに最適な方法です (ただし、いくつかのことはまだ隠されています)。

逆に言えば、より高いレベルのものについてのアイデアを得るには、誰もが Haskell や Lisp のようなものを少し知っておくべきだと思います (そして、よりクリーンな形式で C# 3 に導入されているいくつかのアイデアを参照してください)。

自分をプログラマーだと思っているなら、C を学びなさい、と私は言います。

コードを書く人の多くは、自分自身をプログラマーだと思っていません。私は職場で1日3時間かもしれない.NETアプリを書いていますが、自分自身を「プログラマー」とラベル付けしていません。私はプログラミングとは何の関係もないことをたくさんしています。

一日中プログラミングをしたり、プログラミングについて考えたりすることに費やし、キャリア全体をプログラミングを中心に回すつもりなら、自分のことをよく知っていることを確認したほうがよいでしょう。C を学習すると、プログラミング スキルをさらに深める場合に役立つ知識ベースを構築できるでしょう。

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

.net 開発者は C を学習する必要がありますか?私は「必ずしもそうとは限りません」と言いますが、どの言語も問題についての新しい考え方をもたらすため、私たちは専門的な言語以外の言語にも常に手を出すべきです。.net (およびその前は VB 2 ~ 6) 開発者としてのキャリアの中で、Pascal、LISP、C、C++、PHP、JavaScript、Ruby、Python で小規模なプロジェクトを作成し、現在は Lua を少しかじっています。パール。

C++ 以外については、いずれも専門家になることを目指しているわけではないので、履歴書には記載しません。代わりに、私はそれぞれから興味深いアイデアを持ち帰って、.net ベースの仕事に使用します。

C は、実際に OS に近づくことができるという点で興味深いものですが、優れたプログラマーになるために知っておく必要があるレベルはそれだけではありません。

CLR です バーチャル したがって、それだけを学習した場合、仮想レベルで何が起こっているかを知ることしかできません。

学ぶ C について詳しく教えてくれるでしょう 物理的な メモリ使用量に関しては、あなたが言及したように、CLRが下で使用するものです。CLR がどのように機能するかを学習しても、C を学習する場合ほどガベージ コレクションについての洞察は得られません。Cと一緒に、あなたは 本当に メモリ管理に関係するものを理解してください。

学ぶ CIL 一方、.NET での実行については、学習するよりももう少し詳しく説明します。 C. 。それにしても、どうやって イリノイ州 機械語へのマップは依然としてほとんどの部分が謎であるため、型のキャストなどの高レベルのオペコードの一部を知っていても、実際に何が起こっているのかを理解するという点ではあまり役に立ちません。ほとんどの部分。学ぶ C ただし、ポインタはそれらの側面の一部について説明します。

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

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

これを別のスレッドに投稿しましたが、ここでは次のことに当てはまります。

優れた基礎が必要だと思いますが、実際に使用するものを学ぶことにほとんどの時間を費やしてください。

  • 2 つの数値を加算し、結果をコンソールに表示するためのアセンブラを十分に学習してください。コンピュータで実際に何が起こっているのかをよりよく理解できるようになり、バイナリ/16 進数を使用する理由も理解できるようになります。(これは 1 日で完了できます。 cmd.exeからデバッグ).
  • メモリを割り当ててポインタを使用する必要があるくらいの C を学習してください。シンプルな リンクされたリスト 十分なものです。(これは 1 ~ 2 日で完了します)。
  • これから使用する言語の学習により多くの時間を費やしてください。どの言語 (C#、Java、Ruby、Python など) を選択するかは、あなたの興味に任せてください。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top