ソフトウェアエンジニアは本当に低レベルのものを本当に知る必要がありますか?[閉まっている]


23

C#、Javaなどの高レベルプログラミング言語が開発されているため、多くの人は、アセンブリ言語やC / C ++などの言語に代わるものになると主張しています。プログラムを作成して問題を解決することで、コンピューターを処理するために時間を無駄にすることはありません。ハードウェアの改善が進むにつれて、C / C ++とJavaのパフォーマンスの違いはそれほど大きくなくなり、大きなゲームはJavaなどの言語でプログラミングできるようになる可能性があります。

これは、インターネットでこのトピックを見てから簡単に要約した一般的な考え方です。近い将来に実現すると思いますか?それは、低レベルのものについて学んだことすべてがソフトウェア業界にとってもはや実用的ではないということですか?それは、アセンブリ言語とC / C ++が電気技術者のみに関係するようになるということですか?電気部品のプログラミングが必要なのは彼らだけだからです?


どれだけの学習で十分ですか?低レベルのものを学びすぎると、最終的には電気工学の指向になり、数学を学びすぎると、プログラマーではなく数学者になることを学ぶことになります。私が学んだ数学教材(この本に似た教材(異なる教科書を使用しました):ディスクリート数学とその応用をカバーする数学コースを受講しました)が実際にプログラミングスキルセットと同じくらい有用かどうかを知りたいです。多くの数学の演習では、ほとんどの時間を費やすことができ、真剣に取り組んでいる場合は、プログラミングを勉強する時間が少なくなります。私たちのgamedevフォーラムでは、数学と物理学でさえ、プログラミングと比較して1つのセクションしかありません。

今、私は「コンピュータープログラミングの芸術」を読み始めたところです。数学は本の約4分の1でしか取り上げられていませんが、非数学者にとってこの演習は困難です。そのような「初歩的な」数学でさえ、私たちはそれをキャリアで同じように使用しましたか?この本はすべてプログラミングに関するものですが、TACOPは時間の無駄であり、より実用的なものに時間を費やすべきだと言う人もいるかもしれません(本と比べて少しアカデミックなことは似ています)。しかし、著者はそれを作成するために多大な時間と努力を注いだと思います。彼は5冊の本すべてを書くことさえできますが、私たち-聴衆-はそれを読む使命しか持っていません。何故なの?


1
「C / C ++とJavaの間のパフォーマンスは重要ではありません」。これがすぐに起こる場合は、私のJavaスキルを修正するためにPMを送ってください。こうした理由から、数年前にJavaの使用をやめました。
サヤスク

3
ほとんどのC / C ++コードはハードウェアにアクセスしません。簡単になりますが、通常はデバイスドライバーによって隠されています。私は、CまたはC ++コードの95%以上がハードウェアと直接対話することは決してないと言ってさえ思います。
ペムダス

1
タイトルを低レベル言語に変更することをお勧めします。C ++やAssemblyがわからなくても価値がある低レベルのもの(スレッドがどのように機能するか、OSがどのように機能するかなど)がたくさんあります。
シェーン

2
@faif、長時間実行されるアプリケーションの場合、JavaアプリはC / C ++アプリに対応できます。 Javaがウォームアップした。これは、時間の経過とともにホットスポット技術がJavaコードをネイティブコードに再コンパイルするためです。ただし、実行時間が短いアプリケーションの場合、Javaの起動時間は依然として恐ろしいものです。ある時点で、特にサーバーアプリの場合、通信は実際の処理よりもボトルネックになります。
ベリンロリチュ

1
@BerinLoritsch Javaは比較的高速です(ただし、メモリオーバーヘッド、ランタイムライブラリのオーバーヘッド、低レベルハードウェアへのアクセス、実行前のVMの事前構成(たとえば、異なるヒープ制限を実現するため)は、すべてに比べてひどいです。 OS上で実行される単なる低レベルのプログラム。すべての命令を同じ大きさで実行することではありません。

回答:


18

興味深い質問。私は現在C#で作業しているC ++プログラマーです(パフォーマンスが重要な作業のためにアンマネージC ++を少し使用しています)。

質問への回答を準備する際のいくつかのポイント:

  • 比較のために、言及する言語であるC#とJavaを他のセットであるAssembly、C / C ++と区別する主な理由は、前者がマネージランタイムを使用してガベージコレクションを提供することです。他にも違いがあります(バイナリポータビリティ、フレームワークサイズ、ポータビリティなど)が、パフォーマンスの違いを比較すると、これは(?)主要な要因です。

  • アセンブリ、C、およびC ++は、同等の「低レベル」とはほど遠いものです。アセンブリとC言語をハードウェア/ファームウェア/ドライバーの開発者に関連付けるのは正しいと思いますが、C ++は通常、より高い層で使用され、現在も頻繁に使用されています。インデックス。

  • C ++層では、Objective-Cを追加します。これは、C#/ JavaよりもC ++に似ているためです。最後に、shared_ptr <>およびその他の自動リソース管理機能の追加により、これらの言語はガベージコレクションに近いものをサポートすることに注意してください。

OK-あなたの主な質問: ソフトウェアエンジニアは、低レベルのものを本当に知る必要がありますか?

私の答え: はい

理由:

  • C#/ Javaを使用している場合でも、明示的なリソース管理を必要とするフレームワークエンティティに遭遇したり、重要でないアプリケーションで「固定」メモリグラフの問題に遭遇する可能性があります。これらの問題を効果的に回避およびデバッグするには、これらのシステムの仕組みを理解する必要があります。
  • モバイルプラットフォームのリソースは限られています。一部のバージョンではJavaと.NETの限定バージョンのサポートがありますが、iOSとObjective-Cの現在の優位性は、それが長く更新されることを示唆しています。
  • パフォーマンス:パフォーマンスの壁にぶつかったときはいつでも、ネイティブにコンパイルされたコードチャンクにドロップして回避する必要があります。
  • レガシーサポート:マネージコードで公開されていない(まだ)機能にアクセスするために相互運用する必要があるときはいつでも、同じことを行う必要があります。

良い質問ですが、近い将来、管理されていない言語がなくなることはありません。


お返事ありがとうございます。私はコンピューターの基礎についてさらに勉強し続けます(OS、ネットワーク、より多くの数学など...基本的な原理を理解するのに十分で、プログラミングの改善にあまり集中しません)。いつか役に立つといいのですが。
アムム

1
また、下位レベルで何が起こっているかをより深く理解することは、あなたの決定を知らせるのに役立ちます。
-Dietbuddha

1
私の0.02を追加するには、それが起こることを要求したときに何かがどのように行われるかを知ることは、通常良いことです。あなたの要求をより合理的かつ効率的にするのに役立ちます(高レベルのプログラミングと多分ボスに適用されます;))。
-ssube

43
  • その誰かが合法的になりません学び、ない低レベルの機能を理解し、まだ非常に生産的で価値のある開発者も、すでにケースです。
  • 誰も低レベルの機能を学習したり理解したりする必要がなく、常に時間の浪費になることは決してありません。

エンジニアリング分野と同様に、最終製品には多くのステップがありますが、それらはすべて重要であり、専門知識を必要とし、価値があります。特にソフトウェアエンジニアリングでは、多くの抽象化層があります。すべてが必要であり、誰もそれらのすべての専門家になることはできません。

とはいえ、Assemby / C開発者よりも多くのC#/ Java / Ruby開発者が必要です。「高度な」開発者にとって、「内部」で何が起こるかについてより多くを理解することは有用であり、より良い開発者になります。しかし、他の多くのものも同様です。.NET開発者として、exmapleのため、ありますそんなに私たちの勉強ということ、それは私がより生産的になります学ぶことができるという中間言語非常に参考にかかわらず、(はるかに少ないC ++ / C / Assmebly)を、頻繁に席を取るために持っています。


7

低レベルのものを知らなくても、プログラマーとして今日生計を立てることができます。それを知ることで、あなたはより良いプログラマーになると思います。

しかし、低レベルのもので高いレベルの能力を維持することは、ますます重要ではなくなります。つまり、20年もアセンブリを何もしていなかったので、生産性を上げる前に深刻な復習が必要になると思いますが、そのレベルで物事がどのように機能するかという全体的な概念はまだ意識の一部です。より高レベルの言語で作業している場合でも、時々役立ちます。


3

私はそうは思わない、カーネル開発者は常に低レベルのものを必要とするだろう。また、すべてがどのように機能するかを理解するのに害はありません。あなたが書いているコードが実際に何をしているのかを根本的に理解すれば、より良いコードを書くことができます。低レベルのものを削除することは恐ろしいアイデアだと思います。この抽象的な思考は時には役立つが、問題を最善の方法で解決したい場合には実際に障害になる可能性があるからです。たとえば、文字列を連結するとき、実際に新しい文字列を作成することが重要ですが、文字列の実装方法がわからない場合は、連結して、プログラムの実行にかかる5分間待つことができます。これは、次のようなものに関する優れた記事です:http : //www.joelonsoftware.com/articles/fog0000000319.html


3

これは、ソフトウェアエンジニアが実際に取り組んでいるものに依存します。低レベルのものに触れることなく、生産的で幸せで収益性の高いキャリアを築くことが可能ですが、それがすべてのプログラミングの仕事ではありません。オペレーティングシステムとコンパイラが存在するためには、オペレーティングシステムとコンパイラに取り組んでいるエンジニアが必要であり、C、C ++、およびそれらのマシンのアセンブリ言語を知っている必要があります。

パフォーマンスも重要です。私の現在のラップトップは、最初の家庭用コンピューターよりも約100万倍強力であり、ソフトウェアの実行にはまだ時間がかかります。私はまだビデオゲームで遅れをとることができます。もちろん、ビデオゲームの方が見栄えが良いのは、画面上の百万を超えるピクセルのそれぞれに、数百万色のうちの1つを与えることができるからです(1000文字の白黒文字の位置とは対照的に、一部の文字はグラフィックに使用されます) )。近い将来、コンピューターの処理能力がさらに1000倍になるとは思いません。そうすれば、ますます複雑化するソフトウェアで使用されると予想されます。

ビジネスソフトウェアの大部分は、通常はCではない、最速で作成されて出て行くもので書かれ続けますが、CおよびC ++の専門家のためのスペースは引き続き多くあります。


2

「ハードウェアが改善し続けると、C / C ++とJavaの間のパフォーマンスはそれほど大きくなくなり、Javaなどの言語で大物をプログラムできるようになるかもしれません。」

その声明がいつでも正しいとは思わない。背後でチェックが行われるため、マネージコードには常にヒットがあります。また、ハードウェアが向上するため、ハードウェアの問題ではなく、その上で実行されることが期待されるアプリも改善されます。ネイティブコードで記述されたシステムには、マネージコードへのインターフェイスが必要です。2つを切り替えるとパフォーマンスが低下します。

ただし、この最適化されたコードを実際に必要とするのは、一般的にごく一部のアプリケーションだけです。ほとんどの基幹業務アプリケーションは、マネージコード、.net、javaなどで問題ありません。それを必要とするアプリケーションがすぐに切り替えを行うという意味ではありません。ただし、最適化C / C ++コンパイラが非常に優れているため、手書きのアセンブリは現在あまり使用されていません。ところが最近、完全にアセンブリで書かれたOSがあったので、まだいくつかのOSがあります。セキュリティ分野でも非常に重要です。

しかし、本当に良い開発者になるには、低レベルで何が起こっているのかを理解する必要があります。特にネイティブコードを呼び出すときに、いくつかの難しい問題のトラブルシューティングに役立ちます。


@Adam Tuliper「完全にアセンブリで書かれたOS」興味深い。OSの名前を教えてください。トラブルシューティングについて良い点を挙げました。
アムム

@Adam:アン組立専用「OS」は、おそらく、むしろ1つまたは2つのユーザーモードプロセスを実行することができるかもしれない、多くの添えものを(空想がGUIとペイントプログラムをアニメーションなど)がありません...
マッケ

@マッケ:冗談ですか?Cで記述されているよりも多くのマルチタスクオペレーティングシステムがアセンブリ言語で記述されています。NT(Windowsカーネル)のクローン作成元のオペレーティングシステムは、主にMacro-32アセンブリ言語で記述されています。
ビットツイダー

1
@ bit-twiddler:確かですか?私が見た情報源のほとんどはBLISSにありました...-
TMN

@TMN:BLISSは、高レベルのOSのものにのみ使用されました。VMSカーネル全体はMacro-32で作成されました。私はフォークレベルの処理コードのリストを何年も保持しました。なぜなら、それはとてもクールなアイデアだと思ったからです。フォークレベルの処理は、割り込みハンドラーがコードの時間的に重要でない部分をより低い割り込み優先度レベルで実行するようにスケジュールできるメカニズムでした。NTカーネルでは、フォークレベルの処理の名前がDeferred Procedure Callsに変更されました。
ビットツイダー

2

低レベルのものを知ることはデバッグに非常に役立つと思います。たとえば、組み込みプログラミングの場合のように、ほとんどはCで行われますが、特定のマイクロコントローラーのアセンブリを知ることは非常に便利です。


同意する。私は約30年間組み込みプログラミングを行ってきましたが、アセンブリコードを書く必要はもうありません(すべてCで記述されています)が、命令ごとにプログラムをステップスルーすることがよくあります。
tcrosley

ちなみに、WindowsではCPUモードでCおよびC ++コードをデバッグすることがよくあります。プロセッサのアーキテクチャと命令セットの知識、および使用中のコンパイラのランタイム構成は、強力なスキルセットです。次programmers.stackexchange.comの質問I詳細GCC生成されたコードを参照してくださいprogrammers.stackexchange.com/questions/59880/...
ビットtwiddler

2

コンピュータが最初に発明されたとき、少数の人々だけがそれらを使用する方法を知っていました。現在、裕福な国のほとんどの家には、平均的な人が使用できるコンピューターが1台以上あります。多くの一般人は、毎日コンピューターで仕事をしています。平均的な人はコンピューターを使用する能力を持っていますが、それでもプログラマーが必要です。

同様に、平均的なプログラマーは、アセンブリ言語を知っている必要も、定期的にプログラミングする必要もありません。これは市場のスキルの条件であり、技術の世界で私たちがどれだけ進歩したかに対する敬意でもあります。ビジネスには、タスクを自動化するコンピューターが必要です。そのため、.NET / Javaでプログラミングできるプログラマーが大いに求められています。

自動化できるタスクは自動化されます。すべてのタスクを自動化できるわけではありません。すべての自動化が完璧というわけではありません。それで、アセンブリは重要ですか?もちろん。「プログラマー」である必要がありますか。もちろん違います。


0

うーん、私は実際に低レベルのものを学ぶことを楽しんでいます。

たぶんそれは最も正確な直notではないかもしれませんが、私にとっては車の中の陰謀を学ぶようなものです。すべての部品が互いにどのように機能するかはわかりませんが、エンジン、クランクシャフト、シリンダー、ディファレンシャル、クレーン、ブレーキ、オイル、燃焼、冷凍、そして摩擦、応力、熱、力があることを知るのは楽しいです科学—熱力学、物理学、流体力学...

たぶんあまり役に立たないかもしれませんが(これをすべて知って車を修理することはできません)、確かに専門的に実用的ではありませんが、楽しいです。L'art pour l'art:la connaissance pour la connaissance。


0

有用な経験則は-高速であるほど、より低いレベルを取得する必要があると思います。

したがって、グラフィック集約型のファーストパーソンシューティングゲーム、またはアルゴリズムFXトレードシステムは、速度が重要であるため、まだかなり低レベル(C ++など)です。しかし、時間通りに販売レポートを作成するWebアプリはどうでしょうか?地獄、あなたはシンクレアBASICでそれを書くことができた、そしてそれはまだ受け入れられるだろう。


1
-1:有用な経験則は-高速であるほど、より低いレベルを取得する必要があると思います。 -ちょうど興味があります、あなたは何歳ですか?より優れたアルゴリズム、より優れたアーキテクチャ、およびより優れたハードウェアは、最新のソフトウェアアプリケーションを加速します。コンピューターゲームと組み込みシステムは、この規則の例外です。
ジムG.

古すぎる!:-)あなたはより良いアルゴリズム、より良いマシンアーキテクチャ、より良いハードウェアについて言及していますが、私の考えでは、これらはプロセス実行速度に同等の影響を及ぼします。プロセッサの速度を上げてから、開発された言語に関係なくすべてのプロセスを高速に実行する必要があります。低速のソートアルゴリズムを使用すると、アプリケーションの記述に関係なく、アプリケーションの実行速度が必要以上に遅くなります。高レベルのプログラミング言語は、依然として実行速度に相対的な違いをもたらします。ミリ秒が重要な場合は、低くします。アルゴリズム取引システムはJavaで書かれていません。
エイドリアンパーカー

0

すべてのソフトウェアエンジニアリングの仕事が同じというわけではありません。オペレーティングシステム、コンパイラ、フレームワーク、デバイスドライバー、組み込みシステム、および高性能科学計算に取り組んでいる人々は、「低レベルのもの」をよく知っている必要があります。Access CRUDフォーム、またはママとポップのストア用のPHPショッピングカートを書いている人は、それほど多くはないでしょう。どんな種類のソフトウェアエンジニアリングをしたいですか?そして、あなたはそれを残りの人生でやりたいですか?

私の意見では、通常作業しているレベルよりも少なくとも1レベル抽象化を学習する必要があると思います。C/ C ++で作業する場合は、マシンアーキテクチャとアセンブリを選択する必要があります。PHPで作業している場合は、HTTPと少しのC / C ++またはPerlを理解する必要があります。Accessがお好みであれば、RDBの理論と、COMまたは.Netについて少し知っておくとよいでしょう。キャリアのどこかで、最終的には抽象度の低いレベルの問題によってトラックで停止してしまいます。その分野の専門家と少なくとも少しコミュニケーションをとることができる必要があります。このようなものなしで「通り抜ける」ことはできますか?確かに、競争の激しい仕事の市場でただ「通り抜ける」計画は危険です。


-1

私自身はC#.NETで幅広く働いており、常にC、C ++から離れています。最近、仕事を探し始めましたが、C、C ++の経験が必要な仕事がいくつあるかを見て驚きました。私は当初、C、C ++が時代遅れになっていたが、利用可能なジョブを見ると、そうではないようです。


-1

リストしたすべての管理言語には、C / C ++で作成されたインタープリターまたは仮想マシンがあります。これら2つがなければ、ほとんどのマネージド言語またはインタープリター言語は存在しません。その価値を過小評価していると思います。


-1

「実用的な」知識という概念が本当に嫌いです。あなたが今までに学んだことはすべて同様に実用的です。ハードウェアに近い抽象化レベルで操作しない場合でも、別の抽象化レベルで新しい知識を構築するには、そのドメインの概念を知るだけで常に有益です。関連する概念が多ければ多いほど良いです。

私が普段やっていることにとって、C#は非常に低レベルの言語であり、ハードウェアに非常に近いものだと考えています。それでも、デジタルエレクトロニクス、CPU設計などの初歩的でさびた知識でさえ、これまでやってきたことすべてに非常に役立つと信じています。


@アムムは言った:あなたは良い点を挙げた。人々は通常、多くのお金を稼ぐ知識を「実践的知識」と関連付けます。ただし、ポイントがあります。少なくとも、私たちが学んだこと、特に私たちの生活に役立たないことでお金を稼げないなら、私たちは何かを社会に貢献することを期待し、期待されています。たとえば、哲学や人生をより有意義なものにする方法を学びたいと思うかもしれません。しかし、数学の勉強に時間を費やした場合、電気は使えますが、途中でしか何もできず、時間を無駄にします。
アダムリア

@Anna Lear、問題は、「非実用的」を非常に幅広くカバーしないと、「実用的」で直接適用可能なスキルを習得できないことです。単に、この世界のすべての知識が密接に結びついているからです。どんな実践からどれだけ離れていても、知識は「時間の無駄」にはなりません。
SKロジック

1
-1:これまでに学んだことはすべて同様に実用的です。- ワオ。たぶん、私はすべての「些細な追跡」質問カードへの答えを記憶すべきです!;)
ジムG.

@Jim G.はい、そうする必要があります。ただし、十分な空き時間があり、これ以上の進歩をもたらすものを学ばなくてもかまいません。「役に立たない」ことを記憶することは、実際に記憶を改善する非常に堅牢な方法です。
SKロジック

-1

大多数は必要ありません。低レベルのテクニックを実践することで、開発者はサイクル全体に影響を与える可能性のあるものをよりよく知ることができますが、今日では、開発者はその時間を利用して新しい技術を研究することができます。に。


-1

私の見解では、「エンジニア」という言葉を使用するとき、あなたは男性/女性が非常にゼロから物を設計および構築する人であることを意味します。ソフトウェアエンジニアの本当の問題は、問題を解決することですが、どのような問題ですか?それは大きな質問です。

開発者は、多くの点でエンジニアとは異なります。「開発者」とは、通常、既存のプラットフォームで物事を構築する人です。彼は確かに親システムのコンポーネントを使用して、既存のプラットフォームを開発するか、古いプラットフォームから継承した新しいプラットフォームを構築します。

開発者は通常、ビジネスの観点から考えますが、彼は科学者ではありません。:)開発者はシステムのユーザーにより近く、ユーザーの観点から物事を考えるため、テクノロジーを使用してユーザーの問題を解決することになります。

賢いエンジニア。彼は科学者であり、非常に純粋な問題を解決しています。ほとんどの問題は、コンピューター自体が機能として持っているものです。ユーザーはその問題に決して近づかない、カプセル化されています。エンジニアは、既存のシステムで多くの調査を行った後、研究を残し、ソリューションが必要な場合、システムが新しい言語を必要とする場合、既存のシステムでは対応できないため新しい言語を発明する場合、問題を解決するために新しい何かを考え出しますその問題を解決しました。エンジニアは、開発者がシステムを構築するシステムを構築することになりました。

確かに、ソフトウェアエンジニアは、低レベルのものを学び、十分に理解する必要があります... :)

一方、開発者は、彼の興味に完全に依存しています。:)


1
-1:うーん...役職は無意味です。
ジムG.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.