私が知っておくべきコンピューターサイエンス理論のビットは何ですか?[閉まっている]


27

コンピューターサイエンスの学位ではなく電子工学の学位を持っている人として、私をより良い現実世界のプログラマーにするために知っておくべきコンピューターサイエンスのビットは何ですか?

(現実世界では、プログラマとして日々の仕事で使用し、恩恵を受けるものを意味します-たとえば、データベースの正規化を理解することは、多くの種類があるクイックソートを理解するよりも実用的であることをお勧めしますライブラリの)。


42
1(申し訳ありませんが、しなければなりませんでした)
ヘイレム

5
ああ、または最も重要なもの!(私は今行きます...)
ヘイレム

Theoretical Computer Science stackexchangeは、ここで他の誰もが言及していることを確認します。複雑さ、データ構造、アルゴリズム cstheory.stackexchange.com/tags
chrisaycock

2
この質問に反対する必要があると感じています。学ぶのに十分な「1ビット」はありません。さらに、「IMHO」の「最も重要な」ビットはありません。CSにも同様に不可欠な(繰り返しますが、IMHO)いくつかの側面があります。ですから、この質問への答えは興味深いかもしれませんが、質問はより良く定式化されたかもしれません。
コンラッドルドルフ

1
もしまだあなたがあなたのeengを持っていなかったら、私はブール論理および/または離散数理論を言ったでしょう。ほぼすべてifloopこれまでに書かれた文は、研究のこれら二つの領域のサブセットを使用しています。
スティーブンエバーズ

回答:


52

1つだけ選択しなければならない場合、これは難しい決定です。ビッグO表記法に進みましょう。O(n)、O(ln n)、O(n²)、O(2 ^ n)、O(n!)の意味を理解することは、多くの高価な間違いを避けるのに役立ちます。環境をテストしますが、本番環境で悲惨な失敗をします。


2
+1と私は、O(n ^ 2)がO(lg n)よりも悪いことを知ること(たとえば)が、特定のコードに対してBig-O を導出する方法を知ることのほうが重要だと思います。
ディーンハーディング

3
強く反対。これは比較的些細なことであり、CSにはさらに興味深いトピックがあります。また、私は彼らが複雑にそれを呼び出さない可能性があり、彼らはそれ二次、指数関数などを呼び出していない可能性がありますが、ほとんどの人は、直感的に複雑考える考える
マグヌスWolffelt

Magnus:私の経験では、ほとんどのプログラミング以外の人は複雑さをまったく考えず、直感的にすべての問題に対してO(n)を想定しています。
user281377

これはまだ正式には必要ありません。
CaffGeek

1
チャド:過度に形式的なビッグO表記については何もありませんが、物事の名前がなければ、それらについてはほとんど考えられません。
user281377

19

これは質問です。誰もが別の答えを持っています。複雑さの理論は最も重要な要素であり、プログラマーとして(アルゴリズムやデータ構造のように)直接学ぶことはありませんが、作業に影響を与える可能性があるものです。問題が立方体の複雑さを持っていることを知っていれば役立ちます。問題のサイズが大きくなると、スケーリングがひどくなります。


あなたが簡単な言語で簡単に言い直すことができる問題を解決しているかどうかを知ることは多くの助けになると付け加えます。
哲学者

複雑さは概念として重要ですが、実際に計算することはそうではありません。それほど複雑ではないものを理解することが重要です。
ビル

@ビル:そのとおり。しかし、その部分は、あなたが必ずしも練習を通して得られるわけではない一つのことです。理論はその部分で非常に役立ちます。
Mnementh

12

データ構造、アルゴリズム、複雑さについて学びます。

マシンは無制限のパワーを備えた魔法の箱ではないということを理解するためだけではありません。あなたはそれに何も投げることができず、ミリ秒でそれをクランチすることを期待する あなたが知っている制限があります。コードでテストしないことを学ぶ必要があります。

また、プログラミングにおける特定の設計問題を解決するための一般的なアプローチもご覧ください。つまり、デザインパターン。彼らを単に崇拝するのではなく、彼らが伝えるアイデアを取り入れてください。

データベースモデリングの知識も不可欠です。

その後、コアコンセプトを実装または実装できるのは、異なるプログラミング言語、フレームワーク、およびライブラリだけです。好きなものを選んで練習してください。


詳細-多くのアルゴリズムとデータ構造があります。
ジョンホプキンス

物事のアイデアを得るための基本的なものです。厚すぎない本を手に取り、それをやり通してください。

1
それは1ビットよりもかなり多いです。

7

これは少し難しい質問です。

コンピュータサイエンスのすべての側面は、何らかの形で重要です。

日々のメリットとしては、おそらくコードがCPUから「内部」でどのように機能するかの一般的な概要です。

Big O Notationを理解することは重要です。また、コードがどのように実行されるかを理解することも、現実の状況では非常に重要です。


7

ええ、これは何時間も考えさせられました。

その過程で、私はここで与えられたいくつかの一般的な答えをすでに削除しなければなりませんでした。

リストなし

  1. ビッグO(n)表記法。ここに置くのは難しいですが、いいえ、非効率的なアルゴリズム分析をリモートで聞くことなく、非効率を直観的に解決し、異なる手順のセットを比較できます。

  2. 関数型言語 いいえ、単一の言語ファミリは、問題について考えるための1つのアプローチにすぎません。なぜこのビットだけが重要なのでしょうか?

  3. 停止の問題 一部の人はあまりにも具体的であり、人々は彼らが存在することを知らずに人生を送ってきました。

  4. 聞く聞い ていない場合は、自分の世界に住んでいます。必ずしも有害ではありません!

  5. ソフトウェア開発サイクル いや!それでも、信じられないほどのソフトウェアや単独の英雄的な努力に道を譲ることができます。

  6. 複雑性理論 私はこれがそれかもしれないと思うが、すべての形式主義なし

Comp Scienceのアイデアのほんの一部

私は言うだろう-「抽象化抽象化抽象化...」。それについて学ぶ。その周辺の例を参照し、それを使用してビルドする方法を学びます。どこでもあります。コンピューターサイエンス、エンジニアリング、およびアプリケーションの全体は、抽象化のレイヤー上のレイヤーのように見えます。

これを知ったら、よく見て回ることを学び始めます。

list insertionin pythonとを使用している人がnot appendいる場合、Pythonリストは配列の抽象化を使用して構築され、挿入にはコストがかかり、安価に追加されることを知っているため、笑顔になります。

これはほんの一例です。


あなたが明らかに多くの考えを与えた答えのために+1。
ジョンホプキンス

停止問題に関するコメントへのコメント:「既存を知らずに人生を生きる」は、どのコンピューターサイエンスのトピックにも当てはまります。


3

データ構造の競合的なユースケース。

パフォーマンスを保証するために赤黒のツリーを持つマップが必要な場合と、パフォーマンスを保証するために配列を使用できない場合があります。どのデータ構造をいつ選択するかを知ることは、かけがえのないスキルです。


3

重要な数字は3つだけです。

  • ゼロ
  • 1
  • たくさんの

しかし、それは「3」も重要であることを意味しないのですか?
ハビエル

それはゼロ、1、そして無限であるはずです:en.wikipedia.org/wiki/Zero_One_Infinity
トーマス・オーエンズ

@ハビエル:3は多くのサブセットです
スティーブンA.ロウ

@トーマス:誰が言ったの?
スティーブンA.ロウ

@Stevenここでの私の理解は100%ではないかもしれませんが、アイデアは、あなたは何か、単一のもの、またはあなたが持っているものの数に制限はないということだと思います。インスタンスを1つにも制限しない場合、または1つのインスタンスに制限しない場合は、インスタンスを制限しないでください。しかし、なぜそうなのか完全にはわかりません(Zero / One / Infinityの概念に漠然としか精通していません)。
トーマスオーウェンズ

3

CSで(そして長年の開発者として、またアーキテクトとして)私が学んだ最も重要なことは、機能ではなくボラティリティに基づいて問題を分解する能力です。優れたデザインはすべて、ボラティリティを隔離してカプセル化します。すべての優れた開発者/アーキテクトは、思考で形式化していない場合でも、直感的にこれを行います。プロジェクトが失敗する大きな理由は、ボラティリティに基づいて問題を分類し、それをカプセル化できないことです。ボラティリティのカプセル化に失敗すると、必然的に複雑性が失われ、プロジェクトが失敗します。


ボラティリティとは正確にはどういう意味ですか?
アマラ

3

停止の問題

コンピューターでは解決できないコンピューター関連の問題が存在するという事実。


3

あなたが扱っている問題が形式言語の階層のどこにあるかを知ることができるのに十分なオートマトン理論を知っている必要があります。それから、HTMLを解析するためにREGEXを使用しない理由(HTMLはそれを記述するためにコンテキストフリーの文法が必要な理由)や、C ++をコンパイルするのに比べてC ++ JavaまたはC#(C ++にはチューリングマシンが必要ですが、JavaとC#はコンテキストのない文法で記述できます)。

形式言語の最も重要な層は、最も弱いものから最も強いものまでです。

  1. 有限オートマトンまたはREGEXで解析できる言語(後方参照付きのREGEX実装はこのカテゴリよりも強力ですが、カテゴリ2のすべてを解析することはできません)

  2. スタックメモリを備えたオートマトン、またはコンテキストなしの文法で解析できる言語。

  3. チューリングマシン、またはランダムアクセスメモリを備えたオートマトンによって解析できる言語。


いいえ。正規表現は、正規の文法を解析します。それはまさに、有限状態オートマトンによって受け入れられる文法のカテゴリーです。そして、「Chomsky Grammar」は、スタックマシンが処理する文脈自由文法だけを指すものではありません。
哲学者

@philosodad-文脈自由文法はより正確であり、この用語を使用するように投稿を更新しました。正規表現について私が言ったことに関してあなたの問題を理解していません。
ダンモネゴ

@Dan-私の問題は、正規表現は有限状態オートマトンとまったく同じくらい強力であり、マシンで任意の確定的コンテキストフリー文法を解析できる場合、すべての確定的コンテキストフリー文法を解析できることです。
哲学者

または、より正確に言うと、スタックが必要かそうでないかのどちらかです。言語を解析するためにスタックが必要な場合は、言語を解析するためのスタックが必要です。したがって、言語が解析するためにスタックを必要とする場合、その言語を解析できます。
哲学者

@philosodad-2種類の正規表現があります-理論上の正規表現と、ソフトウェアで実装される正規表現です。理論上の正規表現については正しいですが、ほとんどの実装には理論上の基礎を超えるいくつかの機能があり、非素数nのa ^ nのような非正規言語に一致する場合があります。これは実際の理論についてのスレッドであるため、正式な定義と実際に使用されている定義との間には違いがあることに言及するために、私は話を進めました。
ダンモネゴ

2

まあ、私はあなたに鈍い答えを与えることができます:オートマトン理論と情報理論。

または、私がずっと前にハードウェアコンサルタントから学んだことを伝えることができます。

  • 「Good Enough」では十分ではありません。

1

ソフトウェア開発ライフサイクルは、まだお持ちでない場合は知っておくことをお勧めします。これは2年目のコンピューターサイエンスコースで導入されたものであり、ソフトウェアプロジェクト内で繰り返し使用されるものです。これは、プロジェクトが最初から最後までどのように進むかについての一般的なアイデアを得るのに役立ちますが、より詳細に知りたい場合は、より具体的な知識を得るために勉強できるWaterfallやAgileのような方法論があります。


2
マーフィーの法則:うまくいかないものは何でも間違ってしまう
リチャード

CS理論ではありませんが、これは優れた答えです。
justkt

1

プログラミング

数学およびコンピューターサイエンス学科のホバートおよびウィリアムスミス大学から、コンピューターサイエンス124プログラミング入門

トピックには、制御構造、オブジェクト、クラス、継承、単純なデータ構造、ソフトウェア開発の基本概念が含まれます。

プログラムできない場合は、現実の世界のコンピューティングにはあまり行きません。

そして、はい、あなたがプログラマーであることに注目しました。これは、プログラミング理論の全体的な知識と、利用可能な他のアプローチを改善するためです。

私たちが知っているように、コンピューターサイエンスをプログラミングしていますか?

プログラミングは厳密にはコンピューターサイエンスではないことを(まさしく)指摘した@Thomas Owensからのコメントに対して、ウィキペディアのコンピューターサイエンスの記事から引用したいと思います。

...コンピューターサイエンスの焦点は、ゲームやWebブラウザーなどのソフトウェアの実装に使用されるプログラムの特性を理解し、その理解を使用して新しいプログラムを作成したり、既存のプログラムを改善したりすることにあります...

したがって、私が読んだように、プログラミングすることにより、プログラミング理論の理解を示しています。これは、他の人が作業する喜びであるシンプルでエレガントなコードを作成するのに役立つはずです。


プログラミングはCS理論ではありません。実際、プログラミングはコンピューターサイエンスではない、と簡単に主張できます。
トーマスオーエンズ

@Thomas Owens回答を更新して、それが有効であるという主張をバックアップしました。それを見直して、あなたの考えを教えてください。
ゲイリーロウ

1
それでもプログラミングはCSだとは思わないでください。プログラミングMIGHTは、アルゴリズムまたはデータ構造を実装したいコンピューター科学者にとって有用ですが、CS理論のトピック(私のIntroからCS理論の本まで、おそらくより高度なトピックもあります)には、論理、オートマトン理論、グラフ理論が含まれます、計算可能性、計算の複雑さ、アルゴリズムの分析。また、プログラミング言語(言語の設計と実装の背後にある理論)もコンピューターサイエンスの一部であると言えます。ただし、優れたコンピューター科学者になるためにプログラミングできる必要はありません。
トーマスオーエンズ

@Thomas Owens私はあなたの主張を見て、そして(純粋主義者の帽子をかぶって)同意します。しかし、OPは現実世界で彼を助けるCSを少し求めています。私は、(良いコードで実装された)プログラミング理論がその1ビットであるという私の意見に固執します。それに応じて少し編集しました。
ゲイリーロウ

うん。CSからは、プログラミング言語とパラダイムを理解すると役立つと思います(特にDSLを実装しているが、手続き型、関数型、オブジェクト指向、ロジックなどの多くのパラダイムを知っていると、ソフトウェア開発に役立ちます)。アルゴリズムとデータ構造を理解することは、最も効率的な方法で問題を解決するために適切なものを選択するのにも役立ちます。オートマトン理論が役立つかもしれません(私はかつて巨大なFSMであったシステムで働いていましたが、それがどれほど一般的かはわかりません)。したがって、データ構造、アルゴリズム、PL理論がCSから知る最も有用なものになると思います。
トーマスオーエンズ

1

コンラッド・ルドルフに反対しなければなりません。より良い「現実世界のプログラマー」になるために知っておくべき「ワンビット」のコンピューターサイエンスがあります。あなたがここで得ている答えから他に何も取り上げない場合、少なくともこれを考慮してください-要件を満たすことはクライアントを満足させることと同じではありません!エンドユーザーは常に、あなたが考えもコーディングもしない方法でプログラムを使用しようとします。常に、常に、常に。

したがって、より優れたプログラマーになるためには、まず聞く必要があります。クライアントの話を聞いてください。彼らのニーズに耳を傾けます。彼らの欲求に耳を傾けます。そして特に、彼らのレベルの「技術専門」を聞いてください。要求されたとおりにビルドされたプロジェクトを見た回数はわかりませんが、クライアントが実際に必要としていたものではありません。それは、要求を収集するプログラマーが実際に聞いていなかったからです。

UIデザインのバックグラウンドがなければ、他の人にUIをデザインしてもらうことができます。UIが専門家ではなくプログラマーによって設計されたアプリを常に見つけることができます。論理的であなたにとって意味のあることは、クライアントにとって意味がありません。また、クライアントが技術に精通していない場合(そして誰がそうですか?)、「機能的には正しいが、審美的にallyい」ソリューションは、ディナーパーティーでスカンクの温かさに出会うでしょう。


3
この答えは、ホプキンスが尋ねたものであるCS理論を扱っていません。
ジェームズ

1

関数型言語!

関数型言語を学習すると、ステップや名前付きの可変状態(変数)ではなく、表現の観点から考えることができます。これは、毎日のプログラミングの問題に効果的に対処する能力に大きな影響を及ぼします-特に今では、ほとんどすべての一般的な言語に機能的な特徴があります。

アルゴリズムと複雑さの理論も重要ですが、通常はすでに知っていて推測できるものに名前を付けることができるという点で、やや面白くありません。


0

そのコンピューターは本質的にパターンマッチャーであり、それ以上のものではありません。すべては、チューリングマシンに要約されます。これは、パターンマシンを説明する古典的なコンピューターサイエンスの概念です。


-2

問題解決と学習を続けたいという願望!

クイックソートとデータベースの正規化を知っているよりもはるかに役立ちます。


6
これはコンピューターサイエンスの理論ではなく、電子工学(またはその他の形式)工学にも同様に適用されます。
ジョンホプキンス

クイックソートを知っているあなたの例を考慮するために私がそれを見る方法は、ちょうど役に立たないです。それが存在し、何が特別なものであるかを知ることは役立ちますが、それについて何も知らなかった場合は、グーグルで検索することもできます。いずれかのアルゴリズムを知っていることも役に立ちません。ただし、作成および解釈の方法を知っていることは重要です!おそらく、答えを変えることができれば、おそらく複雑さが最も重要です。
ブライアンハリントン

1
あなたがそれを必要とするか、それが存在することを知らないなら、あなたは何かを探すことができません。回答には、開発者が持つべき重要な資質がリストされていますが、提起された質問には答えていません。
アダムリア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.