96

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

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

言語機能

  • ポインターと再帰 (Thanks Joel!)

データ構造

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

アルゴリズム

  • バブルソート

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

  1. どのような概念を理解する必要があるか、
  2. それらを適切に理解するための優れたリソース (ウィキペディアは少し内容が濃く、学術的である場合があるため)。
4

33 に答える 33

62

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

開発者が知っておくべき 5 つの最も重要な概念について詳しく説明します。

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

アルゴリズムのBig-O記法と Big-O 推定を確実に理解する必要があります-それが何であるか、どのように使用されるか、なぜ重要なのか、Big-O 推定を考慮して 2 つのアルゴリズムを比較する方法、Big-O 推定を構築する方法単純なアルゴリズムの場合。

于 2009-04-14T12:31:58.637 に答える
30

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

とにかく、順不同で次のようになります。

于 2009-04-14T12:38:09.993 に答える
14

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

  • 字句解析、解析、文字列照合、正規表現
  • メモ化
    • カプセル化/スコープ/クロージャ
    • キャッシング
  • 再帰
  • イテレーター/ジェネレーター
  • 関数型プログラミング - John Hughes の素晴らしい記事で「なぜ」がわかりました

これらは個別の数学のドメイン全体ですが、CS については本格的な導入が必要です。

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

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

于 2009-04-14T13:25:22.517 に答える
10

今日では、たとえ日常的に使用する必要がなくても、オブジェクト指向プログラミングの理解は必須です。

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

于 2009-04-14T12:32:00.463 に答える
10

優れたコンピュータ サイエンスの概念がいくつか特定されていますが、数学についてはほとんど話されていません。

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

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

于 2009-04-14T13:21:01.483 に答える
5

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

于 2009-04-14T12:30:17.737 に答える
4

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

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

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

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

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

ビジネス ルールを理解する: これは、多くのロジックをテーブルベースで作成するのに役立ちます。
多くの IFblock 条件は、ビジネス ルール テーブルに配置できます。ロジックを変更するには、テーブル内の情報を変更するだけです。ほとんど/なしの記録。ほとんど/まったく再コンパイルしません。

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

PJ

于 2009-04-14T17:01:16.837 に答える
4

ルール 1:ソフトウェアはナレッジ キャプチャーです。ソフトウェアには意味があります。意味がよくわからない場合は、ユーザーとの対話にもっと時間を費やして、彼らが何をしているのかを理解してください。

アルゴリズムとデータ構造は表裏一体です。アルゴリズムはデータ構造に依存し、データ構造はアルゴリズムに依存します。

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

あなたはいくつかの言語を学ばなければなりません。

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

  • シェル言語。

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

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

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

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

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

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

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

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

  • セット

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

于 2009-04-14T12:38:26.703 に答える
3

私にとって、私は大学での次のコースから多くを得ました

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

大学でやりたかったこと

  • コンパイラの構築
  • デザインパターン
  • オートマトン理論
于 2009-04-14T12:34:40.987 に答える
3

コンパイラがどのように機能するかをよく理解することは、知っておくとよいと思います。Aho には、コンパイラの作成に使用される概念に関する古典的な本があります。タイトルは Compilers: Principles, Techniques, and Tools です。愛称はドラゴンブック。その本を本当に理解するには、形式言語を理解している必要があります。Hopcroft には、それに関する優れた本があります - Introduction to Automata Theory, Languages, and Computation です。

于 2009-04-14T16:19:21.570 に答える
2

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

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

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

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

于 2009-04-14T13:48:44.943 に答える
2

低カップリング、高凝集性を目指してください。

低結合、高凝集

(上のリンク先のサイトから画像をお借りしました)

于 2009-08-25T20:08:13.767 に答える
2

OS の概念の一部

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

[良書 " Modern Operating Systems , 2nd Edition, Andrew S. Tanenbaum"]

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

[タネンバウムの良書

OOPS の概念

有限オートメタ

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

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

[アルゴリズム入門の良書]

于 2009-04-14T12:33:56.493 に答える
2

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

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

プログラミングのパラダイムを知れば知るほど、ホットな新しい言語が登場したときに新しい言語を習得するのが簡単になります!

于 2009-04-14T14:59:08.300 に答える
1

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

于 2009-04-14T12:49:25.803 に答える
1

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

ウィキペディアは、この種の幅広いブラウジングに適したリソースです。特に、最初からざっと目を通すだけの場合はなおさらです。特にウィキペディアが学術的すぎる、またはアクセスできない場合は、C2 wikiをお勧めします。(興味深いことに、これはWard Cunningham によって発明された元の wiki です)。

于 2009-04-14T14:51:16.680 に答える
1

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

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

于 2009-04-14T12:34:38.257 に答える
1

オブジェクト指向プログラミング、 SOLID Principlesなどの優れた指針、および確立されたパターンとプラクティスをよく理解していることは明らかです。

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

優れた OOP の本を入手し、C# や Java などの豊富な言語から始めることをお勧めします。

Grady BoochによるOOP

(PHP、ルビーの皆さん、私に反対票を投じないでください。私は彼が最初にいくつかの例を挙げているだけです。ここで独自の回答と提案を提供できます)

于 2009-04-14T12:37:36.440 に答える
1

アルゴリズム。

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

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

要約すると、アルゴリズムの紹介をご覧ください

マスターする必要はありません。何が起こっているのかを知っているだけです...

于 2009-04-14T12:44:24.537 に答える
1

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

于 2009-04-14T13:08:15.897 に答える
0

big-Oを教える場合は、少なくとも、アルゴリズムの時間が入力が大きくなるとどのようにスケーリングするかを説明していることを説明します。これは、アルゴリズムにかかる時間が短くなるという意味ではありません。
例として、ピラミッドの構築はO(n)ですが、それらの写真の並べ替えはせいぜいO(n ln n)です。したがって、休日のスナップを片付けるよりも、別のピラミッドを構築する方が簡単です。

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

(これは誰かが話し合いたかったコメントでした)

于 2009-04-14T19:16:37.150 に答える
0

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

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

于 2009-04-14T12:53:23.063 に答える
0

ソフトウェア開発ライフ サイクル- 要件の収集、設計と分析、実装、テスト、およびサポートとメンテナンスのシーケンス。これは、これらのステップが実践されるウォーターフォールやアジャイルなどの方法論とともに、学ぶべき重要なことです。

于 2009-04-14T14:05:29.363 に答える
0

バブルソート以外:

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

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

于 2009-04-14T14:48:06.967 に答える
0

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

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

次に、特定の言語関連のものに移動します。これが役立つことを願っています!!

于 2009-04-14T13:15:42.010 に答える
0

私は引用から始めます:

「持っている道具がハンマーしかない場合、すべてを釘のように扱います」. (エイブラハム・マズロー)

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

そうしないと、別のプログラミング コンテキストで問題を解決するのは簡単であるにもかかわらず、専門の 1 つの言語で必死に何かをしようとする一部のプログラマーのように終わることになります。

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

したがって、基本的なことは、永遠に継続的に学習することです:)

于 2009-04-14T13:15:59.123 に答える
0

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

3D アプリケーションの作成だけでなく、ロボットの逆運動学、モーメントの計算、その他多くの機械分野でも役立ちます。

私は 3D グラフィックスを読むまで線形代数を完全には理解していませんでした。

于 2009-04-14T13:16:18.810 に答える
0

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

于 2009-04-14T12:55:31.903 に答える
0

複数のコア (CPU と GPU の両方) を備えたマシンが標準になりつつあるため、(複数のスレッドから複数のマシンへ)分散アルゴリズムを含めることをお勧めします。マルチスレッドと分散処理を理解することが重要です。リンクがあまり役に立たなくてすみません。

于 2009-04-14T13:17:30.073 に答える