コンピューターサイエンスのどのような概念があなたをより良いプログラマーにしたと思いますか?
私の学位は機械工学でしたので、最終的にプログラマーになりましたが、基礎が少し不足しています。最近学んだCSの標準的なコンセプトがいくつかあります。これにより、私がやっていることをより深く理解することができました。具体的には:
言語機能
データ構造
アルゴリズム
明らかに、現時点ではリストは少し短いので、次のような提案を期待していました。
Steve Yegge(以前はAmazonで、現在Googleに勤務)によるこのブログ投稿をご覧ください。
開発者が知る必要のある5つの最も重要な概念について詳しく説明します。
アルゴリズムの Big-O 表記法とBig-O推定値-それが何であるか、どのように使用されるか、なぜ重要であるか、2つのアルゴリズムをBig-O推定値と比較する方法、単純なアルゴリズムのBig-O推定の作成方法。
コンピューターサイエンスの科目を探しているのは少しおかしいと思いますが、ウィキペディアはアカデミックすぎます:D
とにかく、順不同でここに行きます:
私の開発に役立ついくつかの概念(知性とコード):
これらは離散数学のドメイン全体ですが、CSには真剣な紹介が必要です。
Mark Jason-Dominusによる講義と記事 はしばしばPerlハッカーを対象としていますが、特に Higher Order Perl では、どのプログラマーも明確なプレゼンテーションと実際のコードから恩恵を受けると思います。
いくつかの優れたCSの概念が特定されていますが、数学についてはほとんど話されていません。
離散数学を調べることをお勧めします。コードに条件を記述するのに役立つ論理的な証明から始まる、さまざまな有用な問題があります。グラフ理論と組み合わせ論は、複雑な問題の解決とアルゴリズムの最適化にも役立ちます。
私たちは数学のテーマに取り組んでいますが、通常、線形代数は高度なコンピューターグラフィックスクラスの前提条件です。
最近では、オブジェクト指向プログラミングを毎日使用する必要がない場合でも、オブジェクト指向プログラミングを理解する必要があります。
このことから、最も一般的なパターンを理解することも役立ちます。
Programmer Competency Matrix でこれを詳細に説明しましたが、いくつかを強調します。
グラフと、深さ優先、幅優先検索、最短経路などのいくつかの適用アルゴリズムが非常に役立つことがわかりました。オブジェクトの向きも非常に一般的な概念です。
ルール1:ソフトウェアはナレッジキャプチャーです。ソフトウェアは何かを意味します。意味がわからない場合は、ユーザーが何をしているのかを理解するために、より多くの時間を話します。
アルゴリズムとデータ構造は、同じコインの両面です。アルゴリズムはデータ構造に依存し、データ構造はアルゴリズムに依存します。
できるだけ早くバブルソートを学習します。真剣に。最新のすべての言語(Java、Pythonなど)には、バブルソートよりも優れたソートを実装するコレクションクラスがあります。バブルソートを何かに使用すべき状況はまったくありません。 sortメソッドを含むコレクションクラスを探す必要があります。より良いのは、ソートを完全に回避するアルゴリズムを探すことです。
いくつかの言語を学ぶ必要があります。
プログラミング言語(Java、Pythonなど)
シェル言語。
データベース言語(SQL)
プレゼンテーション言語(HTMLおよびCSS)
その他のデータ表現言語(XML、JSON)
いくつかのデータ構造を学ぶ必要があります。
シーケンス(リスト、タプル、ファイル)
階層(XMLおよびHTMLドキュメント、基本的なファイルシステムなど)
リレーショナル(データベース、およびハードリンクとソフトリンクがスローされるファイルシステムなど)
ハッシュマップおよびツリーマップを含むマップ(またはインデックスまたは連想配列)
セット
さらに、アルゴリズムの複雑さの分析。 「Big O」とも呼ばれます。バブルソートが悪い理由は、[〜#〜] o [〜#〜](n^ 2)、クイックソートは[〜#〜] o [〜#〜](nlogn)。
私にとっては、バーシティでの次のコースから多くを得ました
大学でやりたかったこと
コンパイラがどのように機能するかを十分に理解することは有益だと思います。 Ahoには、コンパイラの作成に使用される概念に関する古典的な本があります。タイトルは、コンパイラ:原則、テクニック、およびツールです。そのニックネームはドラゴンブックです。その本を本当に理解するためには、正式な言語を理解している必要があります。 Hopcroftには、オートマタ理論、言語、計算の紹介という優れた本があります。
OSの概念の一部
( memory, IO, Scheduling, process\Threads, multithreading )
[良い本 " Modern Operating Systems 、2nd Edition、Andrew S. Tanenbaum"]
コンピュータネットワークの基礎知識
[ Tanenbaum による良い本
OOPSの概念
有限オートメタ
プログラミング言語(最初にC、次にC++を学びました)
アルゴリズム(時間\空間の複雑さ、ソート、検索、ツリー、リンクリスト、スタック、キュー)
[良い本 アルゴリズムの紹介 ]
多くの良い応答がここですでに言及されましたが、私は重要なもののサブセットを追加したかったのですが、これまでカバーされていませんでした。
15年の学部卒業後の専門的なソフトウェア開発の後、私は学校で次の概念のいくつかを定期的に使用していることがわかりました。
ご使用の言語/プラットフォームがガベージコレクションをサポートしていない場合、メモリの割り当てとクリーンアップが重要であり、リストに追加されます。
ワームの缶は今開いています! :)
電気工学を始めました。
リレーショナルデータベースの設計:データを追跡することは、「Kindergarden Cop」のアーノルドのようなものです。
それは完全な混乱になる可能性があります。制御する必要があります。
情報の重複を最小限に抑えて、データを最小限の場所に保管する方法。データを軽く保ち、簡単にアクセスできるようにする方法。データの増加と整合性を制御する方法。
ユーザーインターフェイス(UI)デザイン:これは、ユーザーがmust追跡しているデータにアクセスする方法です。
ほとんどのUIは開発者によって設計されています。したがって、残念なことに、ほとんどのUIはデータベース設計と並行しています。ユーザーはデータ設計をまったく気にしません。彼らは単に欲しい、欲しいものを。彼らはそれを簡単に入手したいのです。通常、これにはデータ設計とユーザーインターフェイスからの大きな分離が必要です。 「エンジニアリング」のあなたと「南のホスピタリティ」のあなたを分離することを学びます。
オブジェクト指向プログラミング:多くの言語はこの形式に要約されています。
並列処理-マルチスレッド:多くのプロセッサが作業を高速化します!
並列コンピューターは何十年も前から存在しています。彼らは今しばらくデスクトップ上にいます。 「クラウドコンピューティング」のイベントでは、大規模な並列処理が必須であるだけでなく、望ましいことでもあります。それは信じられないほど強力です!並行開発者には多くの仕事の可能性があります。
ビジネスルールの理解:これにより、多くのロジックをテーブルベースで作成できます。
多くのIFblock条件がビジネスルールテーブルに存在できます。ロジックを変更するには、テーブルの情報を変更するだけです。再コーディングはほとんどありません。再コンパイルはほとんどありません。
イベント監視...メソッドが作業を行います:
コード内で物を分けてください。これにより、他の人が将来更新しやすくなります。また、Model/View/Controller(MVC)フレームワークにやや似ています。
PJ
離散数学を支持します。コンピューターサイエンスは抽象化です。数学者のように考えることを学ぶことは非常に役立ちます。
また、S.Lottが言語について述べたことに加えたいと思いました。たくさんの種類の言語を学ぶことも重要です。コンパイル対スクリプトだけではありません。しかし、機能的(ML、LISP、Haskell)論理的(Prolog)オブジェクト指向(C++、Java、Smalltalk)命令的(C、Pascal、FORTRANも)。
プログラミングパラダイムが多くなればなるほど、ホットな新しい言語が登場したときに新しい言語を簡単に選択できるようになります。
プログラミングのすべてのレベルを理解するようにしてください。最低レベル(アセンブリ)から最高レベルまで。
簡単な機能の例として再帰を取り上げてください:) Assemblyを学び、Assemblyで再帰を使用するプログラムを作成してください。
オブジェクト指向プログラミングをよく理解していること、 SOLID Principles のような優れたガイド原則であり、確立されたパターンと実践に従うことは明らかです。
SOAまたはDDDを見ると、それらはすべて最終的に何らかの形式のOOP概念にフォールバックします。
良い本を手に入れることをお勧めしますOOP本とalosはC#やJava
(PHP、Ruby皆さん、私に下票しないでください。私は彼のためにいくつかの例を挙げています。ここであなた自身の答えと提案を提供できます)
アルゴリズム。
プログラミング言語を下降して使用することを学ぶことは、学習しながら学ぶことができますが、広く使用されているアルゴリズムをすべて自分で発明することは事実上不可能です。少なくとも、できることとできないことを認識する必要があります。いくつかの問題があります。
たとえば、バブルソートを使用していくつかのプログラムを作成することはできず、コードがどれほど優れていても、それが良いと見なされることは期待できません。
まとめると Introduction to Algorithms をご覧ください
それをマスターする必要はありません、ただ何が起こっているかを知って...
コンピューターサイエンスの学位を取得したばかりの卒業生として、次のことをお勧めします。
さまざまな投稿で述べたように、ビッグオー表記法
OOデザイン
データ構造とアルゴリズム(覚えていると、使用した本の正確なタイトルが更新されます)
オペレーティングシステム http://www.Amazon.com/Modern-Operating-Systems-2nd-GOAL/dp/013031358
NPの問題
コンピュータープログラムの構造と解釈 。この本を理解すれば、他のすべてをその基盤の上に簡単に構築できます。本の概念に問題がある場合は、ソフトウェア開発者であってもコンピューター科学者ではない可能性があります。
勉強する特定のコンセプトを説明するつもりはありませんが、代わりに、幅広いトピックにわたって多くの読書を行うことをお勧めします。読んでいる各主題について深く理解することを心配する必要はありません-この時点で、何をkindあなたが実際に直面しているときに、ジャストインタイムの勉強をすることができるように、あなたが見ている問題について。言い換えれば、組み合わせの問題を解決する方法がわからなくても、オブジェクトのセットを配置する方法やサブセットを選択する方法を確認する必要があるときに「組み合わせ」を調べるのに十分な知識がある限り、問題ありません。 。
ウィキペディアは、この種の広範囲なブラウジングに非常に優れたリソースです。特に最初からスキミングしている場合は特にそうです。さらに優れたものは、特にウィキペディアがあまりにもアカデミックであるかアクセスできないと感じた場合、 C2 wiki です。 (これは興味深いことに、Ward Cunninghamによって発明された元のwikiです)。
マルチスレッドの背後にある基本理論を理解することは不可欠だと思います。これがないと、日曜日の朝の4時にライブサーバーでデバッグするまで、問題があることを確認することさえ困難になる可能性があります。
セマフォ、クリティカルセクションおよびイベント。
いいえ、バブルソートではなく、クイックソートです。これは大きなOのことです。バブルソートは平均O(n ^ 2)、クイックソートはO(n * log(n))です。
Big-Oを教える場合、少なくとも、アルゴリズムの時間がより大きい入力でどのようにスケーリングするかを説明していることを説明してください。それは、アルゴリズムの時間が短くなるという意味ではありません。
例として、ピラミッドの構築はO(n)ですが、それらの写真のソートはせいぜいO(n ln n)です。ですから、休暇をきちんと整理するよりも、別のピラミッドを構築する方が迅速です。
学生は、レジスタ、キャッシュ、メインメモリ、ディスク、ネット上の操作にかかる時間を把握する必要があります。非常に高レベルの言語でのみ教えられている多くの人には概念がありません。
(これは誰かが議論したかったコメントです)
バブルソート以外のすべて:
そして最も重要なのは、ビッグO表記法であるため、バブルソートの代わりにこれらのいずれかを使用する必要がある理由がわかります。
ソフトウェア開発ライフサイクル -要件の収集、設計と分析、実装、テスト、およびサポートとメンテナンスのシーケンス。これは、これらの手順を実行するWaterfallやAgileなどの方法論と一緒に学ぶことも重要です。
以下が最も重要なものだと思います
次に、特定の言語関連のものに移動します。これがお役に立てば幸いです!!
引用から始めます。
「あなたが持っている唯一のツールがハンマーである場合、あなたはすべてを釘のように扱います」。 (アブラハムマスロー)
最も重要な原則であるIMOは、さまざまなプログラミングパラダイムや言語を理解し、使用可能なツールについて十分に理解することです。巨大なデフォルトライブラリを備えた本格的なメインストリーム言語であっても、AutoHotKeyのような小さな専用言語であっても、選択したほぼすべての言語で問題を解決できます。プログラマーの最初の仕事は、問題の仕様に従って何を使用するかを決定することです。洗練された、難読化された、パフォーマンス、移植性、メンテナンス、小さなコードサイズなど、いくつかの概念はトピックに対するより良いアプローチを提供します。
そうしないと、必死になって専門化した1つの言語で何かを行おうとするプログラマーのように終わりますが、問題は異なるプログラミングコンテキストでは簡単に解決できます。
このアドバイスは、多言語プロジェクトの今日の傾向に沿っています(たとえば、C#、JS、CSS、XPath、SQL、XML、HMTL、RegExpなどの単一アプリケーションで複数の言語を使用する可能性があるWebアプリケーションを取り上げます。さまざまなプログラミングパラダイム(たとえば、C#は最近、関数型プログラミングパラダイム、ラムダからの概念をいくつか紹介しました)。
したがって、基本的なことは定数学習、永久 :)
D-Graphicsは誰もが学ぶべきものだと思います。または、少なくとも同種のベクトルと行列変換を適切に使用する方法。
これは、3Dアプリケーションの作成だけでなく、ロボットの逆運動学、モーメントなどの計算など、メカニックフィールドでもの作成に役立ちます。
私は、3Dグラフィックを読むまで線形代数を完全に理解していませんでした。これは、先生が悪かったにもかかわらず、これまでに受けた最高のコースの1つです。
複数のコア(CPUとGPUの両方)を備えたマシンが標準になりつつあるため、 Distributed Algorithms (複数のスレッドから複数のマシンへ)を含めると言います。マルチスレッドと分散処理を理解することが重要です。リンクが実際に多くの助けを提供しないことを残念に思う。