web-dev-qa-db-ja.com

知っておくべきコンピューターサイエンスの概念は何ですか?

コンピューターサイエンスのどのような概念があなたをより良いプログラマーにしたと思いますか?

私の学位は機械工学でしたので、最終的にプログラマーになりましたが、基礎が少し不足しています。最近学んだCSの標準的なコンセプトがいくつかあります。これにより、私がやっていることをより深く理解することができました。具体的には:

言語機能

  • ポインターと再帰(Joelに感謝!)

データ構造

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

アルゴリズム

  • バブルソート

明らかに、現時点ではリストは少し短いので、次のような提案を期待していました。

  1. 理解すべき概念、
  2. それらを適切に理解するための優れたリソース(ウィキペディアは、少し密度が高く、学術的である場合があるため)。
91
Jon Artus

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

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

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

アルゴリズムの Big-O 表記法とBig-O推定値-それが何であるか、どのように使用されるか、なぜ重要であるか、2つのアルゴリズムをBig-O推定値と比較する方法、単純なアルゴリズムのBig-O推定の作成方法。

35
sharptooth

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

とにかく、順不同でここに行きます:

30
Rik

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

  • 字句解析、解析、文字列照合、正規表現
  • メモ化
    • カプセル化/スコープ/クロージャー
    • キャッシング
  • 再帰
  • イテレータ/ジェネレータ
  • 関数型プログラミング-ジョン・ヒューズのすごい 記事

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

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

Mark Jason-Dominusによる講義と記事 はしばしばPerlハッカーを対象としていますが、特に Higher Order Perl では、どのプログラマーも明確なプレゼンテーションと実際のコードから恩恵を受けると思います。

14
bubaker

いくつかの優れたCSの概念が特定されていますが、数学についてはほとんど話されていません。

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

私たちは数学のテーマに取り組んでいますが、通常、線形代数は高度なコンピューターグラフィックスクラスの前提条件です。

10
Berkshire

最近では、オブジェクト指向プログラミングを毎日使用する必要がない場合でも、オブジェクト指向プログラミングを理解する必要があります。

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

10
Jeremy French

Programmer Competency Matrix でこれを詳細に説明しましたが、いくつかを強調します。

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

グラフと、深さ優先、幅優先検索、最短経路などのいくつかの適用アルゴリズムが非常に役立つことがわかりました。オブジェクトの向きも非常に一般的な概念です。

5
Mork0075

ルール1:ソフトウェアはナレッジキャプチャーです。ソフトウェアは何かを意味します。意味がわからない場合は、ユーザーが何をしているのかを理解するために、より多くの時間を話します。

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

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

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

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

  • シェル言語。

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

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

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

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

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

  • 階層(XMLおよびHTMLドキュメント、基本的なファイルシステムなど)

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

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

  • セット

さらに、アルゴリズムの複雑さの分析。 「Big O」とも呼ばれます。バブルソートが悪い理由は、[〜#〜] o [〜#〜]n^ 2)、クイックソートは[〜#〜] o [〜#〜]nlogn)。

4
S.Lott

私にとっては、バーシティでの次のコースから多くを得ました

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

大学でやりたかったこと

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

コンパイラがどのように機能するかを十分に理解することは有益だと思います。 Ahoには、コンパイラの作成に使用される概念に関する古典的な本があります。タイトルは、コンパイラ:原則、テクニック、およびツールです。そのニックネームはドラゴンブックです。その本を本当に理解するためには、正式な言語を理解している必要があります。 Hopcroftには、オートマタ理論、言語、計算の紹介という優れた本があります。

3
zooropa

[〜#〜] logic [〜#〜]-プログラミングにおけるロジックの重要性を誇張しています。あなたは機械工学をやったと言ったので、あなたは数学がどれだけあなたの人生を楽にしてくれるかを知らなければなりません。

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

3
Tamas Czinege

OSの概念の一部

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

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

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

[ Tanenbaum による良い本

OOPSの概念

有限オートメタ

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

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

[良い本 アルゴリズムの紹介 ]

2
aJ.

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

15年の学部卒業後の専門的なソフトウェア開発の後、私は学校で次の概念のいくつかを定期的に使用していることがわかりました。

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

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

2
pearcewg
2
David Basarab

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

リレーショナルデータベースの設計:データを追跡することは、「Kindergarden Cop」のアーノルドのようなものです。
それは完全な混乱になる可能性があります。制御する必要があります。
情報の重複を最小限に抑えて、データを最小限の場所に保管する方法。データを軽く保ち、簡単にアクセスできるようにする方法。データの増加と整合性を制御する方法。

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

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

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

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

イベント監視...メソッドが作業を行います:
コード内で物を分けてください。これにより、他の人が将来更新しやすくなります。また、Model/View/Controller(MVC)フレームワークにやや似ています。

PJ

2
PJ

低結合、高凝集を目指します。

low coupling, high cohesion

(私は上記のリンクされたウェブサイトからこの画像を盗みました)

2
Joe Phillips

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

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

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

2
Brian Postow

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

簡単な機能の例として再帰を取り上げてください:) Assemblyを学び、Assemblyで再帰を使用するプログラムを作成してください。

1
Chrys

オブジェクト指向プログラミングをよく理解していること、 SOLID Principles のような優れたガイド原則であり、確立されたパターンと実践に従うことは明らかです。

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

良い本を手に入れることをお勧めしますOOP本とalosはC#やJava

OOP by Grady Booch

(PHP、Ruby皆さん、私に下票しないでください。私は彼のためにいくつかの例を挙げています。ここであなた自身の答えと提案を提供できます)

1
Srikar Doddi

アルゴリズム。

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

たとえば、バブルソートを使用していくつかのプログラムを作成することはできず、コードがどれほど優れていても、それが良いと見なされることは期待できません。

まとめると Introduction to Algorithms をご覧ください

それをマスターする必要はありません、ただ何が起こっているかを知って...

1
Liran Orevi

コンピューターサイエンスの学位を取得したばかりの卒業生として、次のことをお勧めします。

1
CodeMonkey

コンピュータープログラムの構造と解釈 。この本を理解すれば、他のすべてをその基盤の上に簡単に構築できます。本の概念に問題がある場合は、ソフトウェア開発者であってもコンピューター科学者ではない可能性があります。

1
lambdabunny

勉強する特定のコンセプトを説明するつもりはありませんが、代わりに、幅広いトピックにわたって多くの読書を行うことをお勧めします。読んでいる各主題について深く理解することを心配する必要はありません-この時点で、何をkindあなたが実際に直面しているときに、ジャストインタイムの勉強をすることができるように、あなたが見ている問題について。言い換えれば、組み合わせの問題を解決する方法がわからなくても、オブジェクトのセットを配置する方法やサブセットを選択する方法を確認する必要があるときに「組み合わせ」を調べるのに十分な知識がある限り、問題ありません。 。

ウィキペディアは、この種の広範囲なブラウジングに非常に優れたリソースです。特に最初からスキミングしている場合は特にそうです。さらに優れたものは、特にウィキペディアがあまりにもアカデミックであるかアクセスできないと感じた場合、 C2 wiki です。 (これは興味深いことに、Ward Cunninghamによって発明された元のwikiです)。

1
John Hyland

マルチスレッドの背後にある基本理論を理解することは不可欠だと思います。これがないと、日曜日の朝の4時にライブサーバーでデバッグするまで、問題があることを確認することさえ困難になる可能性があります。

セマフォ、クリティカルセクションおよびイベント。

0
Jim T

いいえ、バブルソートではなく、クイックソートです。これは大きなOのことです。バブルソートは平均O(n ^ 2)、クイックソートはO(n * log(n))です。

0
GoatRider

Big-Oを教える場合、少なくとも、アルゴリズムの時間がより大きい入力でどのようにスケーリングするかを説明していることを説明してください。それは、アルゴリズムの時間が短くなるという意味ではありません。
例として、ピラミッドの構築はO(n)ですが、それらの写真のソートはせいぜいO(n ln n)です。ですから、休暇をきちんと整理するよりも、別のピラミッドを構築する方が迅速です。

学生は、レジスタ、キャッシュ、メインメモリ、ディスク、ネット上の操作にかかる時間を把握する必要があります。非常に高レベルの言語でのみ教えられている多くの人には概念がありません。

(これは誰かが議論したかったコメントです)

0
Martin Beckett

バブルソート以外のすべて:

  • ヒープソート
  • クイックソート

そして最も重要なのは、ビッグO表記法であるため、バブルソートの代わりにこれらのいずれかを使用する必要がある理由がわかります。

0
Carra

ソフトウェア開発ライフサイクル -要件の収集、設計と分析、実装、テスト、およびサポートとメンテナンスのシーケンス。これは、これらの手順を実行するWaterfallやAgileなどの方法論と一緒に学ぶことも重要です。

0
JB King

以下が最も重要なものだと思います

  • オブジェクト指向プログラミング
  • オペレーティングシステムの概念
    • プロセスとスレッド
    • スケジューリングアルゴリズム
  • データ構造
    • データストレージとコレクションのタイプ、タイプ(linkedlist、hash、arrayなど)
    • ソートアルゴリズム
    • アルゴリズムの複雑さ

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

0
Mutant

引用から始めます。

「あなたが持っている唯一のツールがハンマーである場合、あなたはすべてを釘のように扱います」。 (アブラハムマスロー)

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

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

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

したがって、基本的なことは定数学習、永久 :)

0
majkinetor

D-Graphicsは誰もが学ぶべきものだと思います。または、少なくとも同種のベクトルと行列変換を適切に使用する方法。

これは、3Dアプリケーションの作成だけでなく、ロボットの逆運動学、モーメントなどの計算など、メカニックフィールドでもの作成に役立ちます。

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

0
TheDude

複数のコア(CPUとGPUの両方)を備えたマシンが標準になりつつあるため、 Distributed Algorithms (複数のスレッドから複数のマシンへ)を含めると言います。マルチスレッドと分散処理を理解することが重要です。リンクが実際に多くの助けを提供しないことを残念に思う。

0
Erich Mirabal