計算の複雑さの概念はソフトウェア開発者にとって重要ですか?[閉まっている]


11

私は時間と記憶の複雑さの概念はcompsciコースの卒業生にとって必須であるという印象を受けていましたが、工学を勉強していたので、その場合は知識がありません。私は最近、概念さえ知らない地元の大学の卒業生の何人かにインタビューして驚いた。私の質問は:

計算の複雑さの概念はソフトウェア開発者にとって重要ですか?そして、それは学部課程で教えられるべきですか?


1
例を使用して質問を説明するには:私が出会った卒業生は何をO(n^2)意味するのか分からない。
ムハンマドアルカウリ

回答:


12

ほとんどの大学では、時間と記憶の複雑さが間違いなく彼らのコースの一部であると思います(願っています!)。

現在、これらの「複雑さ」は非常に弾力性のあるトピックです。「ZPPは、多項式時間で確率的チューリングマシン上でゼロエラーで解決できる決定問題の複雑性クラスです」のようなすべての理論を本当に知っておくべきかどうか。そして、そのようなものは疑わしいです。私は個人的に、これらの高度な理論はソフトウェア開発とは無関係だと考えています。

反対に、私はすべての開発者が使用するデータ構造とアルゴリズムの時間/空間の複雑さを認識する必要があると考えています。


8

多くの初心者は、ミクロ最適化に執着しています。学習コンプ。私の経験では、複雑さにより、学生はパフォーマンスとスケーラビリティを推定するはるかに実用的な方法に向かって進んでいます。


6

私が見たものから、ビッグO表記法と時間とメモリの複雑さが正式なコンピュータサイエンス教育で非常に強調されているようです...言って書きます。

一般的なアイデアや概念は重要だと思いますが、コミュニケーションの目的を除いて、その公式化(big-O表記法やさまざまな用語など)がほとんど問題になるとは思いません。誰かが正式な表記法や用語に慣れていないからといって、特定のケースであるアルゴリズムが別のアルゴリズムよりも高速である理由を理解できないわけではありません。バランスの取れた二分木を検索するのにかかる時間は、木がどのように機能するかを理解し、高さを合理的に把握していれば、正式な意味で複雑性理論を最初に学習しなくても、ノード数の2を底とする対数に関係していることがわかります学校の数学。ただし、複雑さとメモリ使用量に注意を払うタイミングを把握し、一般的なケースと最悪のケースを検討することが重要ですが、一部の人々はそうではありません。

表記と用語はコミュニケーションにとって重要になります。アルゴリズムのパフォーマンスの定量化を他の人に伝える良い方法を提供します。論文や説明で頻繁に出てくるので、読者が理解しやすいように、少なくとも漠然と理解しておくと便利です。

そのため、はい、概念は重要です(ただし、リソースと時間は十分だがデータはそうでない場合はそうではありません)。しかし、概念は重要ですが、それらの形式化はそれほど重要ではない場合が多く、表記法や用語は概念自体と同じではないことを覚えておく必要があります。

編集:

正式に勉強した人ほど詳細に概念を理解しているとは言いませんが、一般的なアイデアの多くは理にかなっています。これを正式に研究することには価値があると思いますが、その価値の一部はそれなしでも存在し続けることができます。

概念の導入(公式研究以外)については、データ構造のメモリオーバーヘッドの量、アルゴリズムに含まれるステップ、およびこれらの事柄がさまざまなデータでどのように変化するかについて人々に考えることから始めることをお勧めします。

また、仮想的な状況と変化を検討するのに役立ちます。たとえば、ツリーのバランスが取れている場合と、できるだけバランスが取れていない場合の動作、またはほとんどのノードがツリーに入るレベルの数、またはそれ以上のノードの数深さが1レベル増加した場合に保持します。この考え方は、複雑さを見るときだけでなく、プログラマにとって一般に有用です。また、異なる状況でアルゴリズムとデータ構造がどのように機能するかについて考える場合、複雑さのより正式な検査と同じ方向を自然に指し示します。


興味深い代替ビュー。コンセプトをどのように紹介しますか?それとも、どうやってそれらを理解したのですか?これは、必要な理解を得るための別の方法を指すかもしれません。
ムハンマドアルカウリ

1
@MuhammadAlkarouriこれに少し対処するために答えを編集しました。
ドミトリ

4

はい

複雑さの基本を理解することは重要であり、学部生として学ぶべきものでなければなりません。実際、データ構造についてどのクラスがあなたに教えるかについて、通常それは触れられると思います。卒業生が理解していない、または覚えていないことは理解できますが、複雑さの基礎を教えられていないことはわかりません。

更新:重要な理由

特定の仕事でデータベースの移行を行っていました。移行を完了するのに必要な期限がありました。スクリプトを書いた人は複雑さの根拠を持っていませんでした。残念ながら、彼がスクリプトで使用したロジックをよく見た人はいませんでした。彼がハッシュテーブルの代わりに二重にネストされたループを使用したこと以外の詳細は覚えていません。1週間連続してスクリプトを実行した後、ロジックを見て、問題を認識しました。変更後、完了するのに5時間ほどかかりました。誰かが複雑さを理解していなかったため、移行完了の期限をほとんど逃しました。

ポイントは、桁違いに遅いものを誤って作成したり、ジョブが完了する前に常にメモリ不足になることは簡単です。 より多くのメモリを搭載した高速のマシンは小さなミスを軽減できますが、複雑さの問題を軽減できないことがよくあります。


それでも、問題は「重要ですか?」です。ペアのリストを繰り返し処理する場合でも、最終製品が本来の動作をしていないということですか?遅いということですか?彼らは彼らがするために支払われている仕事を実行しなかったことを意味しますか?
ヤムマルコビッチ

プログラムが2日で終了するが、代わりに2年かかる場合は、支払われた仕事を実行できなかったと思います。
-Dietbuddha

あなたが説明した問題は、貧しい開発者の問題ではなく、資格のないプログラマがそのようなプログラムを担当することになった意思決定プロセスの問題でした。
ヤムマルコビッチ

または、「jr。ソフトウェア開発者」または「インターン」ではなく「ソフトウェア開発者」としてプログラムする資格のない人を雇うことにつながる意思決定プロセス。
-Dietbuddha

3

「重要かどうか」を尋ねるのはかなり曖昧だと思います。

多くの人々が、この世界のあらゆる極小の知識が彼らの意見で厳密に必要とされる方法について伝道しているのを見つけるでしょう。しかし、それは少し無意味です。なぜなら、すべてを知ることは決してできないからです。そして、それが彼の仕事が課す要件を満たすのを助けない限り、期待するべきではありません。私は、趣味やpreference意的な個人的な好みの問題でない限り、一般的に教育の前提条件に対してより実用的なアプローチを取ることを好みます。

非常に効率的なコードまたは革新的なインフラストラクチャアルゴリズムを記述することが期待されるプログラマにとって重要ですか?はい。

従来のWebアプリケーションを開発するプログラマーにとって重要ですか?彼らはそれなしで管理するか、オープンソースの世界で効率的な実装を得ることができます。

アプリケーション用のGUIを開発するプログラマーにとって重要ですか?おそらくそうではありません。成功したGUIフレームワークは、これらの小さな詳細をすべて抽象化するからです。

何かと同じように知っておくのはいつでもいいことですが、多くの(またはほとんどの)プログラマーが雇用主の満足を得るために単純に仕事をすることを妨げません。

一方、基礎教育および理論教育を求めて高等教育に登録した場合、定義から実際よりも理論的な科目を学ぶことが期待されます。私の意見では、CompSciが不可欠です。微積分について学ぶことが重要であるように、生徒は複雑さについて学びます。

しかし、とにかく、CompSciはいつからですか。プログラムは、優れたプログラマーになる方法を人々に教えますか?そのためには、専門のトレーニングプログラムと実践的な経験があります(あなたまたはあなたと共有できるプログラマー)。


1
2番目の部分はおそらくそれほど曖昧ではありません。BScレベルでcompsciの学生に教えるべきですか?
ムハンマドアルカウリ

1
私もその質問に答えるように投稿を編集しました。
ヤムマルコビッチ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.