コンピュータサイエンスのどのような概念を知っておくべきですか?[閉まっている]


94

コンピュータサイエンスのどのような概念で、あなたはより優れたプログラマになったと思いますか?

私の学位は機械工学でしたので、結局プログラマーになっていたので、基本的に少し不足しています。最近学んだいくつかの標準的なCSの概念があります。これにより、自分が何をしているのか、特に次のことがより深く理解できるようになりました。

言語機能

  • ポインタと再帰(ありがとうJoel!)

データ構造

  • リンクされたリスト
  • ハッシュテーブル

アルゴリズム

  • バブルソート

明らかに、現時点ではリストが少し短いので、次のことを提案したいと思っていました。

  1. 私が理解すべき概念は何か、
  2. それらを適切に理解するための優れたリソース(ウィキペディアは時々少し密度が高く学術的なものになる可能性があるため)。

5
バブルソート?それらからできるだけ離れてください!むしろ、クイックソート/ヒープソートの仕組みを学びます。
Carra

18
はい、bubblesortを学びます。そのひどい理由を学びましょう。クイックソート、マージソート、および個々の弱点を含むその他すべてを学びます。ただし、本番用コードで記述しないでください。現在使用しているプラ​​ットフォームが提供するソート関数を呼び出します。
Brian Ensink

@Roger Pate-あなたのための+1、1つはアルゴリズムまたはデータ構造が何に適しているか、そしてそれが何に不満があるかを知っているべきです。QuicksortとBubblesortはどちらも最悪の場合のパフォーマンスは同じですが[O(n ^ 2)]、入力の種類が非常に異なる場合、BubblesortはQSがO(n log n)であるO(n)の最高のパフォーマンスを示します。もちろん、バブルソートを検討している場合は、代わりに挿入ソートを使用することをお勧めします。
Andre Artus

回答:


60

Steve Yegge(以前はAmazon、現在はGoogle)による次のブログ投稿をご覧ください。

開発者が知る必要のある5つの最も重要な概念について詳しく説明します。

  1. 基本的なプログラミング(再帰、ファイルI / O、フォーマットされた出力、ループなどを含む)
  2. オブジェクト指向設計(設計パターンなどを含む)。概念を理解するだけでなく、賢明なオブジェクト指向デザインを作成できる必要があります。
  3. スクリプトと正規表現。
  4. データ構造-リスト、セット、ハッシュテーブル、ツリー、グラフなど-Big O表記法とアルゴリズムの複雑さ。
  5. ビット、バイト、および2進数-コンピュータ内で数値がどのように表されるか、およびそれらを操作する方法。

素敵なリンク。少しUNIX側に焦点を当てていますが(.NETが完全にありません)、それでも素晴らしいです。
Toon Krijthe 2009

すばらしいリンク-私が取り組むべきことがたくさんあります。それらを説明する良いページへのリンクがいくつかあればいいのですが。
Jon Artus

リンクは私が自分自身をチェックし、基本に追いつくために非常に役立ちます。おかげで..
rpr

同意した、素晴らしいリンク。特定された考えられるソリューションの多くはUnixベースですが、関連する全体的な概念は、言語やプラットフォームにとらわれないものです。ほとんどのプログラマーにとって、再帰、ツリーなどのADTの作成、ビット単位の演算などは非常にまれですが、それらは重要な基盤です。
ザックバーリンゲーム、

4
正規表現以外のすべてに同意します。それらは素晴らしいボーナスですが、ほとんどのものが基本レベルの基本であり、すべてが構築される基盤です...正規表現は素晴らしいですが、私はそれらを決して使用せず、使用する必要がない優れたプログラマーをたくさん知っています。
Beska

35

アルゴリズムのBig-O表記とBig-Oの見積もりを必ず理解する必要があります-それが何であるか、それがどのように使用されるか、なぜ重要であるか、2つのアルゴリズムをBig-Oの見積もりで比較する方法、Big-Oの見積もりを作成する方法単純なアルゴリズムの場合。


1
リンクしたWikipediaの記事から始めることができます。これは非常に単純で、数学的に正しいです。
シャープトゥース2009

3
あなたは高度な数学についてかなり低い意見を持っている必要があります。大学1年生のとき、私は微積分学の途中でしかなかったので、これを理解しました。
GoatRider 2009

1
NPの概念を忘れないでください。NPに問題が含まれている場合、TSP(Travelling Salesman)を各データベーストランザクションに検索目的でコーディングしようとする開発者は、主要な問題=]
Edジェームズ

2
また、ビッグOは、どのアルゴリズムがより少ない時間で済むかを通知しないことも知っておく必要があります。ほとんどのCS卒業生が理解できない何か
マーティンベケット

3
それは一種のことです。これは、入力セットに依存するため、どれが「高速」である必要はなく、どのワーストケースが最も良いかを示します。
エドジェームス

30

コンピューターサイエンスの科目を探しているのは少しおかしいと思いますが、ウィキペディアは学術的すぎると思います:D

とにかく、ここでは、順不同です。


2
+1あなたはデータベースについて言及しているため、これらのタイプのリストでは見過ごされがちですが、CSの卒業生が知るための非常に重要な概念です。
Brian Ensink

14

私の開発に役立ついくつかの概念(知性とコード):

  • 字句解析、解析、文字列照合、正規表現
  • メモ化
    • カプセル化/スコーピング/クロージャー
    • キャッシング
  • 再帰
  • イテレータ/ジェネレータ
  • 関数型プログラミング-John Hughesの驚くべき記事で「なぜ」に私を驚かせた

これらは離散数学の完全なドメインですが、CSには真剣な導入が必要です。

  • 行列/線形代数
  • グラフ理論

マークジェイソン・ドミナスによる講義や記事は、多くの場合、Perlのハッカーに向けられている、私はプログラマは特にで、彼の明確なプレゼンテーションと実際のコードの恩恵を受けるだろうと思う高次のPerl


10

今日では、オブジェクト指向プログラミングを理解することは、日常的に使用する必要がない場合でも必須です。

このことから、最も一般的なパターンを理解することも役立ちます。


10

いくつかの優れたCS概念が確認されましたが、Mathについてはほとんど話していません。

離散数学を調べることをお勧めします。コードで条件を記述するのに役立つ論理的な証明から始まる、幅広い有用な問題があります。グラフ理論と組み合わせ論は、複雑な問題の解決とアルゴリズムの最適化にも役立ちます。

数学についてですが、線形代数は通常、高度なコンピュータグラフィックスクラスの前提条件です。


1
一つだけ選ぶとすれば、それは離散数学でしょう。それはかなりCS 101です。DMによって何らかの方法で触れられていない一般的なプログラミングの領域やパラダイムを考えるのは難しいです。
Andre Artus

6

プログラマコンピテンシーマトリックスでこれを詳細に説明しましたが、いくつか強調しておきます。

  • データ構造
    • Bツリー、二項およびフィボナッチヒープ、AVL /レッドブラックツリー、スプレイツリー、スキップリスト、試行などの高度なデータ構造
  • アルゴリズム
    • ツリー、グラフ、単純な貪欲および分割統治アルゴリズムは、このマトリックスのレベルの関連性を理解することができます。
  • システムプログラミング
    • プログラミングスタック全体、ハードウェア(CPU +メモリ+キャッシュ+割り込み+マイクロコード)、バイナリコード、アセンブリ、静的および動的リンク、コンパイル、解釈、JITコンパイル、ガベージコレクション、ヒープ、スタック、メモリアドレス指定…
  • ソースコードのバージョン管理
    • 分散型VCSシステムの知識。Bzr / Mercurial / Darcs / Gitを試しました
  • ビルドオートメーション
    • システムを構築するためのスクリプトをセットアップし、ドキュメント、インストーラー、リリースノートを生成し、ソース管理のコードにタグを付けることができます。
  • 自動テスト
    • 自動化された機能、ロード/パフォーマンス、UIテストを理解し、セットアップすることができます
  • 問題の分解
    • 適切なデータ構造とアルゴリズムを使用し、変更される可能性のある問題の側面をカプセル化する汎用/オブジェクト指向のコードを考え出します。
  • システム分解
    • 複数の製品ラインと外部システムとの統合により、複雑なシステムを視覚化および設計できます。また、監視、レポート、フェイルオーバーなどの運用サポートシステムを設計できる必要があります。

5

グラフと、深さ優先、呼吸優先検索、最短経路などのいくつかの適用アルゴリズムが非常に便利であると思います。オブジェクト指向も非常に一般的な概念です。


4

ルール1:ソフトウェアはナレッジキャプチャです。ソフトウェアは何かを意味します。意味が不明な場合は、ユーザーと話をして、ユーザーが何をしているのかを理解してください。

アルゴリズムとデータ構造は、同じコインの両面です。アルゴリズムはデータ構造に依存し、データ構造はアルゴリズムに依存します。

できるだけ早くバブルソートを学習解除します。真剣に。すべての最近の言語(Java、Pythonなど)には、バブルソートよりも優れたソートを実装するコレクションクラスがあります。バブルソートを使用する必要がある状況は絶対にありません。sortメソッドを含むコレクションクラスを探す必要があります。さらに、並べ替えを完全に回避するアルゴリズムを探す必要があります。

あなたはいくつかの言語を学ぶ必要があります。

  • プログラミング言語(Java、Pythonなど)

  • シェル言語。

  • データベース言語(SQL)

  • プレゼンテーション言語(HTMLおよびCSS)

  • その他のデータ表現言語(XML、JSON)

いくつかのデータ構造を学ぶ必要があります。

  • シーケンス(リスト、タプル、ファイル)

  • 階層的(XMLやHTML文書、基本的なファイルシステムなど)

  • リレーショナル(データベース、およびハードリンクとソフトリンクがスローされたファイルシステムなど)

  • ハッシュマップとツリーマップを含むマップ(またはインデックスまたは連想配列)

  • セット

さらに、いくつかのアルゴリズムの複雑さの分析。「Big O」と呼ばれることもあります。バブルソートが悪いのは、それがOn ^ 2)であり、クイックソートがOn log n)であるからです。


ちなみに、実際にはバブルソートは使用していません。私はそれがどのように機能するかを学ぶのが面白い経験であることを発見し、人々が選択した言語で書くために十分に理解する必要がある他のいくつかのそのようなアルゴリズムがあることを理解しました。
Jon Artus

無数のアルゴリズムがあります。それらのほとんどは悪い。それらのいくつかは良いです。バブルソートは単に悪いです。アルゴリズムに関する本を購入して次に進んでください。
S.Lott、2009

単なるピッキングですが、クイックソートは最悪の場合O(n ^ 2)です。基本的なアルゴリズムを研究する場合、これが真実である理由を理解することは貴重な教育課題だと思うので、私はそれを指摘するだけです。
Brian Ensink

クイックソートについては、そうです-重要な練習です。バブルソートの場合、唯一のことは、アルゴリズムがどれほど悪いかを確認することです。一般に、一般的なケースと最悪のケースを理解することが重要です。
S.Lott、2009

4

さて、ワームの缶は今開いています!:)
私は電気工学を始めました。

リレーショナルデータベースの設計: データの追跡は、「幼稚園警官」のアーノルドのようなものです。
それは完全な混乱かもしれません。制御する必要があります。
情報の重複が最も少ない、データを最も少ない場所に保持する方法。データを軽量化し、簡単にアクセスできるようにする方法。データの増加と整合性を制御する方法。

ユーザーインターフェイス(UI)デザイン: これは、ユーザー追跡しているデータにアクセスする方法です。
ほとんどのUIは開発者によって設計されています。したがって、残念なことに、ほとんどのUIはデータベース設計に対応しています。ユーザーはデータ設計をまったく気にしません。彼らは単に欲しい、欲しいものを。彼らはそれを簡単に手に入れたいと思っています。通常、これにはデータ設計およびユーザーインターフェイスからの大幅な分離が必要です。「エンジニアリング」のあなたと「南のホスピタリティ」のあなたを分離することを学びましょう。

オブジェクト指向プログラミング: 多くの言語がこの形式に要約されます。

並列処理-マルチスレッディング: 多くのプロセッサが作業を高速化します!
並列コンピュータは何十年も前から存在しています。彼らは私たちのデスクトップでしばらく使用されています。「クラウドコンピューティング」のイベントでは、大規模な並列処理が必須であるだけでなく、望ましいです。それは信じられないほど強力です!並列開発者には多くの潜在的な仕事があります。

ビジネスルールを理解する: これにより、多くのロジックをテーブルベースで作成できます。
多くのIFblock条件がビジネスルールテーブルに存在する可能性があります。ロジックを変更するには、テーブルの情報を変更するだけです。リコーディングはほとんどありません。少し/再コンパイルなし。

イベントは監視します...メソッドが機能
しますコード内で物事を分離してください。他の人が将来更新しやすくなります。また、モデル/ビュー/コントローラー(MVC)フレームワークにもいくらか類似しています。

PJ


3

私にとって、varsityの次のコースからたくさんのことを学びました

  • プロジェクト管理
  • ヒューマンコンピュータインタラクション(オタクがユーザーフレンドリーな画面を作成するのに役立ちます)
  • データベース設計(データベースの動作、トランザクションログ、ロックなどを含む)
  • データウェアハウジング
  • グラフィックス(OpenGL)
  • 高度なアルゴリズム
  • データ構造

私が多種多様でやっていたらいいのに

  • コンパイラの構築
  • デザインパターン
  • オートマトン理論

3

ロジック -プログラミングにおけるロジックの重要性を強調しすぎます。あなたはあなたが機械工学をやったと言ったので、あなたはあなたの人生をより簡単にすることができる数学の量を知る必要があります。

命題論理一次論理二次論理:これらは非常に強力なツールです。おそらく私が大学で学んだ最も(そして唯一の)重要なこと。ロジックはプログラマーの重装砲のようなものです。非常に複雑な問題(およびそれほど複雑ではない問題)の多くは、体系化された論理的な形式にすると、はるかに単純になります。それは、機械工学者にとっての線形代数のようなものです。


3

コンパイラがどのように動作するかをよく理解することは知っておくとよいでしょう。Ahoには、コンパイラーの作成に使用される概念に関する古典的な本があります。タイトルはコンパイラ:原則、テクニック、ツールです。そのニックネームはドラゴンブックです。その本を本当に理解するには、正式な言語を理解している必要があります。ホップクロフトには、オートマタの理論、言語、および計算入門という優れた本があります。



2

良い応答の多くはすでにここで言及されていますが、私は重要なもののサブセットを追加したかったのですが、これまでのところカバーされていません。

15年間の大学卒業後の専門的なソフトウェア開発の後、私は学校で以下の概念のいくつかを定期的に使用していることに気づきました。

  • OOの一般的な概念、および最新のプログラミング言語機能(クラス、データ非表示など)。
  • アルゴリズムパフォーマンスメトリック(Big O表記)。アルゴリズムを設計するとき、アルゴリズムのコストを決定するためにBig O分析を実行し、ボトルネック領域でより効率的な代替案を検討します。
  • リンクされたリストおよびその他の複雑なデータ構造。
  • 高速ソート、およびさまざまなソートの概念。
  • ツリーと高速ツリー操作。

言語/プラットフォームがガベージコレクションをサポートしていない場合、メモリの割り当てとクリーンアップは重要であり、リストに追加されます。


2

私は離散数学に賛成です。コンピュータサイエンスは抽象化です。数学者のように考えることを学ぶことは非常に役立ちます。

また、S.Lottが言語について述べたことに加えたいと思いました。TYPESの言語をたくさん学ぶことも重要です。コンパイルされただけでなく、スクリプトも。しかし、機能的な(ML、Lisp、Haskell)論理的な(Prolog)オブジェクト指向(C ++、Java、Smalltalk)は必須(C、Pascal、FORTRANでも)。

プログラミングパラダイムが多ければ多いほど、新しい新しい言語が登場したときに新しい言語を選択するのが簡単になります。


2

OSの概念の一部

 ( memory, IO, Scheduling, process\Threads, multithreading )

[良い本「Modern Operating Systems、2nd Edition、Andrew S. Tanenbaum」]

コンピュータネットワークの基礎知識

タネンバウムの良い本

OOPSの概念

有限オートメタ

プログラミング言語(最初にCを学び、次にC ++を学びました)

アルゴリズム(時間\空間の複雑さ、並べ替え、検索、ツリー、リンクリスト、スタック、キュー)

[優れたアルゴリズム入門書]


自動メタ?-最初の編集によると確かに「オートマタ」。
トムダッカリング2009

おっとっと!私は推測するスペルチェックに行き詰まりました。修正します。ありがとう。
aJ。


1

プログラミングのすべてのレベルを理解するようにしてください。最低レベル(アセンブリ)から最高レベルまで。

簡単な機能である再帰を例にとります:)アセンブリを学び、アセンブリで再帰を使用するプログラムを作成してみてください。


1

アルゴリズム。

下降してプログラミング言語を使用することを学ぶことは、あなたが進むにつれて学ぶことができるものですが、広く使用されているすべてのアルゴリズムを自分で発明することは事実上不可能です。いくつかの問題があります。

たとえば、コードがどれほど細かいかに関係なく、バブルソートを使用して一部のプログラムを記述して、それが良いと見なされることを期待することはできません。

まとめると、アルゴリズムの概要をご覧ください。

それを習得する必要はありません、何が起こっているのかを知ってください...


1

コンピュータサイエンスの学位を最近取得した私は、次のことをお勧めします。

  • さまざまな投稿で言及されているように、ビッグO表記

    OOデザイン

    データ構造とアルゴリズム(覚えていると、私が使用した本の正確なタイトルが思い出せないので更新します)

    オペレーティングシステム http://www.amazon.com/Modern-Operating-Systems-2nd-GOAL/dp/0130313580

    NP問題


1

それは明らかに、オブジェクト指向プログラミング、SOLID原則などの優れた指針、および確立されたパターンと実践に従うことをよく理解しています。

SOA、つまりDDDを見ると、最終的にはすべて何らかの形のOOP概念にフォールバックします。

良いOOPの本をいくつか入手して、C#やJavaなどの豊富な言語を最初に選択することをお勧めします。

OOP by Grady Booch

(PHP、ルビーの人は私に反対票を投じないでください。私は彼のためにいくつかの例を挙げているだけです。ここにあなた自身の答えと提案を提供できます)



1

学習する特定の概念を説明するつもりはありませんが、代わりに、幅広いトピックにわたって多くの簡単な読書を行うことをお勧めします。あなたが読んだそれぞれの主題について深く理解することを心配しないでください-この時点では、あなたが見ている問題の種類を認識することがより重要であるので、いくつかのことを行うことができます-あなたが実際にそれに直面したときに時間内に勉強します。言い換えると、オブジェクトのセットを配置したりサブセットを選択したりする方法がいくつあるかを確認する必要があるときに「combinatorics」を検索するのに十分な知識がある限り、combinatoricsの問題の解決方法がわからなくても問題ありません。 。

ウィキペディアは、このような幅広いブラウジングのための非常に優れたリソースです。特に、最初からざっと目を通しているだけの場合はそうです。さらに良いのは、特にウィキペディアが学術的すぎたり、アクセスできない場合は、C2 wikiです。(これは興味深いことに、ウォードカニンガムによって発明され元のwikiです)。


0

マルチスレッドの背後にある基本的な理論を理解することは不可欠だと思います。これがないと、日曜日の午前4時にライブサーバーでデバッグするまで、問題が発生していることさえわかりにくいかもしれません。

セマフォ、重要なセクションとイベント。


0

いいえ、バブルソートではなく、クイックソートです。これは、ビッグOであり、バブルソート平均O(n ^ 2)、クイックソートはO(n * log(n))です。


0

以下は最も重要なものです

  • オブジェクト指向プログラミング
  • オペレーティングシステムの概念
    • プロセスとスレッド
    • スケジューリングアルゴリズム
  • データ構造
    • データの保存と収集のタイプ、タイプ(リンクリスト、ハッシュ、配列など)
    • 並べ替えアルゴリズム
    • アルゴリズムの複雑さ

次に、特定の言語に関連するものに移動します。これがお役に立てば幸いです!!


0

私は引用から始めます:

「あなたが持っている唯一の道具がハンマーであるならば、あなたはすべてを釘のように扱います」。(アブラハムマズロー)

最も重要な原則であるIMOは、さまざまなプログラミングパラダイムや言語を理解し、自由に使えるツールについてよく理解することです。巨大なデフォルトライブラリを備えた本格的な主流の言語でも、AutoHotKeyのような小さな特殊言語でも、選択したほとんどすべての言語で問題を解決できます。プログラマーの最初の仕事は、問題の仕様に従って何を使用するかを決定することです。いくつかの概念は、主な目的が何であれ、トピックへのより良いアプローチを提供します-洗練、難読化、パフォーマンス、移植性、保守、小さなコードサイズ...

そうしないと、専門化した1言語で必死に何かをしようとするプログラマーのように終了しますが、問題は異なるプログラミングコンテキストで解決するのは簡単です。

このアドバイスは、今日の多言語プロジェクトの傾向と一致しています(たとえば、C#、JS、CSS、XPath、SQL、XML、HMTL、RegExp ...などの単一のアプリケーションに複数の言語が関与する可能性があるWebアプリケーションを取り上げます...さまざまなプログラミングパラダイム(たとえば、C#では最近、関数型プログラミングパラダイム、ラムダからいくつかの概念が導入されました)。

だから、基本的な事がある永遠に、一定の学習 :)


0

3Dグラフィックスは誰もが学ぶべきものだと思います。または、少なくとも均質なベクトルと行列変換を適切に使用する方法。

これは、3Dアプリケーションの作成だけでなく、ロボットのインバースキネマティクス、モーメントの計算、その他の多くのメカニックフィールドにも役立ちます。

3Dグラフィックスを読むまで、線形代数を完全には理解していませんでした。これは、先生が悪かったにもかかわらず、これまでに取った中で最高のコースの1つです。


0

複数のコア(CPUとGPUの両方)を備えたマシンが標準になりつつあるので、(複数のスレッドから複数のマシンまで)分散アルゴリズムを含めると言います。マルチスレッドと分散処理を理解することが重要です。リンクが本当に多くの助けを提供していないことを申し訳ありません。

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