35

質問は解決したようで、殴打されて死ぬことさえあります。賢い人々はこの問題について賢いことを言っています。本当に優れたプログラマーになるには、Cを知る必要があります

それともあなたは?

私は今週2回啓発されました。最初のものは、私の仮定がそれらの背後にある私の知識よりも進んでいないこと、そして私のマシンで実行されているソフトウェアの複雑さを考えると、それはほとんど存在しないことに気づきました。しかし、実際にそれを家に追いやったのは、このスラッシュドットのコメントでした:

その結果、従来のCの「ベアメタル」プログラマーが高級言語が実装されていると想定する多くの素朴な方法に気づきました。彼らは、コンパイラがどのように機能するか、または優れたランタイムシステムが彼らが理解する素朴なマクロアセンブラモデルとどのように異なるかを知らないため、影響を与えるプロジェクトで悪い「最適化」決定を下します。

それからそれは私を襲った:Cは他のすべてのように、もう1つの抽象化です。CPU自体でさえ抽象化にすぎません!私はそれを測定するためのツールを持っていないので、私はそれが壊れているのを見たことがありません。

よくわかりません。ダイクストラがBASICについて言ったように、私の心は回復を超えて切断されましたか?私は時期尚早の最適化の一定の状態に住んでいますか?何も知らないことに気づいた今、希望はありますか?知っておくべきことはありますか?そして、なぜそれがとても魅力的で、過去5年間に私が書いたすべてが根本的に間違っていたのでしょうか?

要約すると、APIドキュメントが教えてくれる以上のことを知ることに価値はありますか?

編集:CWを作成しました。もちろん、これはまた、私たちよりも優れたインタープリター/ランタイム最適化の例を投稿する必要があることも意味します:)

4

19 に答える 19

38

Cを知ることも、実装の下位レベルの詳細を知ることも、それ自体があなたを傷つけることはありません。あなたがあなたを傷つける可能性があり、そしてあなたを傷つけるのは、それが不適切であるときでさえ、あなたが一貫して低レベルの詳細に関して考えそして働くならばです。

古いことわざは、「実際のプログラマーは、どの言語でもFORTRANを書くことができる」というものでした。Cを使用して同じことを行う場合、それは改善ではありません。Lispを書いているのなら、Lispを書いてください。Pythonを作成している場合は、Pythonを作成してください。Cにとって適切で合理的なのは、それらのいずれか(または他の多くのいずれか)ではありません。

優れたプログラマーは、さまざまな抽象化レベルで考え、(さらに重要なことに)目前のタスクに適した抽象化レベルを認識して適用できる必要があります。

Cの抽象化のレベルに関する知識は害にはなりません。代替案を無視することは可能です(そしてそうするでしょう)。

于 2010-05-21T14:05:36.680 に答える
20

知識は害を及ぼしません。これまで。高水準言語で悪いコードを書いたのは、彼らが高水準言語を適切に習得していなかったためです、悪い開発者。

于 2010-05-21T13:49:18.250 に答える
12

悪い開発者にとって、どんな種類の知識も危険です。

優れた開発者にとって、あらゆる種類の知識は資産です。

于 2010-05-21T14:34:35.353 に答える
7

自然(口頭)または人工(プログラミング)の言語を使用するには、心が特定の方法で適応する必要があります。各言語には独自の文法、独自の語彙(API)などがあります。ほとんどがJavaプログラマーでRubyに切り替える場合は、基本的にJavaコードを記述しない場合でも、少なくともJavaプログラマーの思考パターンに従います。 Ruby。新しい環境(Ruby文法、Ruby API)に慣れ、 Rubyコードの記述を開始するまでは、少しの努力と練習が必要です。

したがって、プロセスは完全に正常であり、以前のパターンの悪影響は非常に短命です。さらに重要なことは、あなたが学ぶすべての言語はあなたの視野を広げ、次の言語をより簡単に学ぶことを可能にします。よい旅路を。:]

于 2010-05-21T14:03:05.773 に答える
6

プログラミングはプログラミング言語ではありません。それは問題を解決することです。問題を解決するために使用されるツールは、たまたまプログラミング言語です。コードを書くためにコードを書くのではなく、それを実行して問題を解決するためのコードを書きます。

ツールをよく知っているほど、問題をより適切かつ迅速に解決できます。しかし、ハンマーを使用してネジを木に物理的に打ち込もうとすると深刻な問題が発生しますが、ソフトウェアには優れた特性があります。特定の問題には、途方もないさまざまな解決策があります。

したがって、ネジが収まるようにネジが木に穴を開けるように指示するような角度でネジを打つハンマーを書くことは完全に可能です。次に、ボタンの後ろに隠すことができます。ユーザーはそうしません。ハンマーが実際に何であるかを知る必要さえあります。

これは最も効率的なソリューションではありませんが、それでも有効で機能するソリューションです。使用したツールが上手くいくと、APIがドライバーを提供していないときにドライバーを作成する方法がわかります。

知っているツールが多ければ多いほど、また問題を解決する方法を知っている方法が多ければ多いほど、選択肢が増え、使用するソリューションについての決定がより適切になります。仕事に適したツールを選択してください。しかし、ツールと可能な解決策がわからない場合、どうすればよいでしょうか。

于 2010-05-21T14:31:31.613 に答える
4

他の人のコメントを拡張するために...自然言語に関してはhttp://en.wikipedia.org/wiki/Whorfian_hypothesis">WhorfianHypothesisを信じているかどうかはわかりませんが、それはかなり明確に真実です。プログラミングに。あなたが知っている言語はあなたが問題を解決する方法に影響を与えます。2つの例:

1)私が何年も前に持っていた教授から:彼は文字列の配列に重複があるかどうかを調べようとしていました。これは70年代だったので、彼はこれをFORTRANで書いていました。彼のブルートフォースn^2の実装には、時間がかかりすぎていました。それで彼は友達に話しかけました。彼の友人は、ソート演算子を持つPL1(おそらく、APLだったと思います)を知っていました。ですから、その言語では、物事を分類することを学び、それがどれほど役立つかを学びます。それは簡単だからです。友人は最初に明白なソートを思いつき、次に隣接する要素のアルゴリズムを調べました。はるかに高速で、FORTRANで完全に実装可能であったとしても、私のFORTRAN執筆教授には起こりませんでした。

2)大学院生の時、ルームメイトに物理学の大学院生がいました。彼はMITに行き、プログラミングクラスを1つだけ受講しましたが、それはもちろんSchemeにありました。ある日、私は彼のオフィスに立ち寄り、彼は「ねえ、ブライアン、このコードを見て、それが機能するかどうか教えてくれませんか?」と言いました。それは仕分けルーチンでした。私はそれをちらっと見て、それは明らかにバブルソートだったので、おそらく機能しないと言いましたが、それでもループは1つしかありませんでした(いいえ、病気の場合にバブルソートを書くことができる1つのファンキーなループではありませんでしたツイスト)。だから、私はそれを言いました。彼は「ああ、でも一番下に再帰的な呼び出しがあります!」と答えました。再帰的なバブルソートを書くことは私には思いもよらなかったでしょう。しかし、もっと重要なことは、非再帰関数を書くことはHIMには決して起こらなかったでしょう!

重要なのは、あなたが知っている言語が、あなたが書くコードの種類を大部分決定するということです。あなたが知っている言語が多ければ多いほど、あなたが持っているツールも多く、そしてそれらのそれぞれをいつ使うべきかを知っている限り、より多くのツールが決して悪いことはありません...

于 2010-05-21T14:54:48.390 に答える
3

Cを知っていてもコードの品質を損なうことはありませんが、「Cだけ」を知っていると確実に害があります。

于 2010-05-21T16:41:50.683 に答える
3

本当に優れたプログラマーになるには、Cを知る必要があります。

これに同意する。

しかし、私はまた、本当に優れたプログラマーであるためには、別の言語でコードを書く方法を本当に知っている必要があることにも同意します(別の言語でCコードを書く方法ではありません)。

于 2010-05-21T14:12:44.203 に答える
2

ソフトウェアエンジニアリングとは、抽象化を理解し、抽象化を使用して問題を効率的に解決する方法です(効率的には、コストの削減、パフォーマンスの高速化、機能の提供までの最短スケジュールを意味します)。Cを理解することは、私たちが使用する抽象化のレイヤーに対するもう1つの洞察です。このレベルの詳細に「ズームイン」するために必要な日とスキルは、必要に応じて「ズームアウト」するスキルも開発する限り、価値があります。このスキルセットは、オブジェクトモデルの設計、クリーンな機能構成の設定、または明確さと保守性のための個別の方法の構築など、分野のあらゆる側面で役立ちます。

于 2010-05-21T14:38:14.283 に答える
2

番号。

傷ついたのに知りたい、改善したいという気持ちを失ったら。

于 2010-05-21T13:50:53.927 に答える
2

さまざまな言語を知ることは資産です。コンパイラーとインタープリターがどのように構築されているかを知ることも資産です。最後に、すべてのプログラマーは、より高い言語を理解するために、アセンブリ言語に時間を費やす必要があります。:-)

私の大学では、「プログラミング言語」というクラスを受講し、LISP、SNOBOL、ADAを学びました。これらの言語は、プログラミングの問題を解決する際のさまざまな概念的思考にあなたの心を開きます。要約は、問題に最も適した言語を選択することでした。

プログラミング言語を知ることは基礎にすぎません。データ構造、アルゴリズム、線形代数、ブール代数、マイクロプロセッサの設計と通信(人々の間)など、他の関連トピックを知らなければ、私のキャリアはそれほど遠くありませんでした。誰でも本を手に取り、言語を学び、自分たちをプログラマーと呼ぶことができます。熟練した開発者と道を外れた開発者を区別するのは、他のスキルです。

プログラミング言語を学びます。手元にある他のタスクにより多くの頭脳の力を集中できるように、それをよく学んでください。プログラミングマニュアルを頻繁に参照するべきではありません。私の集中力のほとんどは、タスクの要件と、最小限の時間で正しく実装するためのアルゴリズムとデータ構造にあります。

于 2010-05-21T18:28:54.807 に答える
1

Cを学ぶことは良いことです。高水準言語でCコードを書き込もうとするのは悪いことです。

于 2010-05-22T03:58:33.290 に答える
1

それが本当に必要とされないときにあなたがその知識を高級言語に適用する場合にのみそれは傷つくでしょう。確かに、私自身のコレクションクラスを作成する際の低レベルのCの経験があれば、たとえばJavaでもそれを行うことができます。しかし、それは既存のコレクションライブラリ(CommonsCollectionsエクストラとしてのJavaAPIの両方)のより良い代替手段でしょうか?多分。

実際には、投資した時間がそれだけの価値があるかどうかを計算する必要があります。

実際には、コードをハッキングする前に、単に調査を行う必要があります。組み込みまたはサードパーティのツールを使用して、実行しようとしていることが実行できるかどうかを確認します。可能であれば、組み込みツールまたはサードパーティツールが希望どおりに機能するかどうか、およびそれらが良好に機能するかどうかを確認します。そうでない場合は、その理由を調べてください。/本当に/そうでない場合は、書き直してください。

他の人が述べているように、すべての知識は価値があります。つまり、/ all /を意味します。つまり、十分に開発されたライブラリへの高レベルの呼び出しとして、低レベルの最適化されたCコードの両方です。両方を知っていれば、どちらをいつ、なぜ使用するかがわかります。

于 2010-05-21T14:39:54.203 に答える
1

C(またはそのことについては任意の言語)を学ぶことはプログラマーにあなたを傷つける可能性があるということは、 Cを学んだ後に何も学ぶことができないことにかかっているようです。ここでのレッスンは学習をやめないでください。さらに、他の言語やテクノロジが必ずしもC(またはお気に入りのCコンパイラ)のように機能するとは限りません。

そうは言っても、Cを学ぶことは、ハードウェアがどのように機能し、マシンで実際に何が起こっているかを学ぶ良い方法になると思います。これを知っていると、どういうわけかあなたを傷つける可能性があるのか​​わかりません。私は無知であることには何の利益もないと思います(彼らが偶然でない限り)。私は、Cを学ぶことが機械について学ぶ唯一の方法ではなく、それを行うための1つの方法にすぎないことを認めます。

于 2010-05-27T22:58:04.970 に答える
1

いいえ、プログラミング言語の複数の実装を知っていると、それらの抽象化をよりよく理解するのに役立ちます。

問題は、1つを最高の抽象化として受け入れることです。これにより、他の抽象化が少ないと思われるものを使用しても成功しなくなります。

各抽象化は特定の異なる目標で設計されており、ニーズに最適なものを選択してください。Linuxを知っていると、WindowsやMac OSを知るのが難しくなりますか?それらが異なるというその受け入れ。

于 2010-05-21T13:56:48.610 に答える
1

短くて甘い:

優れたプログラマーになるには、体系的に考えることができる必要があります。CまたはLUAまたはJava、何でも。

于 2010-05-21T14:20:22.003 に答える
1

ここでの本当の問題は仮定です。それらの他の開発者は、それがどのように機能するかを知っていると想定しています。仮定は、それがすべてを理解していると思う経験豊富な開発者からのものであろうと、すべてを理解していると思う初心者からのものであろうと、悪魔です。

少なくとも、それは私がここで想定していることです

于 2010-05-21T16:17:34.560 に答える
0

複数の言語/フレームワークとプログラミングパラダイムを理解することは決して害になるべきではありません-それは有益であるはずです。

重要な点は、実装の選択を行うことの意味を理解している範囲で、現在作業している言語/フレームワーク/環境を理解することです。ここで、他の言語での作業で得られた知識は、より広い範囲の可能性に目を向ける可能性がありますが、現在の環境の観点からそれらの可能性を評価する必要があります。

本当に困っているのは、ある言語、たとえばCを学び、それ自体の長所、長所、短所(ハンマーを持った便利屋のようなもの)で学ぶのではなく、Cの観点から別の言語を学ぶ人々です。彼の唯一のツールとして-すべての問題は彼にとって釘のように見えます)。

于 2010-05-21T14:33:02.250 に答える
0

たとえば、Cを知り、私のお気に入りの高級言語(Python)で作業することは、Cを知ることが役立つと思う理由の例です。

Cを知っていると、Pythonを使用するときにいくつかの点で役立ちます。

(a)Pythonのリスト、辞書、組み込み型に感謝します。これにより、コードライブラリを選択して学習し、リンクする必要があるコードを1行で繰り返し実行できるようになります。 (ハッシュテーブル、データ構造など)そしてそれで自分自身を足で撃つことは避けてください。

(b)PythonはCで記述されています。Cプログラマーであるということは、Pythonが99%の道のりを進んでいる場合でも、Pythonで追加の抽象化が役立つ場合は、その抽象化をPythonで記述できることも意味します。CPythonインタープリターのソースコードを調べて、内部で何が起こっているのかを理解できます。私は事実上、Pythonプログラマーとして、C言語の上に構築されたものをまだ使用しています。したがって、その言語を知ることは依然として価値があります。

私が上で言ったことはすべて、Perl、Ruby、およびPHPを使用している人々にも当てはまります。

于 2010-05-21T15:58:01.587 に答える