優れた開発者が知っておくべき中心的な数学的概念は何ですか?[閉まっている]

StackOverflow https://stackoverflow.com/questions/52176

質問

2006 年に、形が悪く時代遅れのプログラムで非常に小さな学校を卒業して以来 (私は外国人で、当時これより良い学校を知りませんでした)、私は大学で学んだ多くの基本的な概念を見逃していたことに気づきました。数学とソフトウェアの観点は、主に他の上位概念の基礎となります。

つまり、MIT のオープンコースウェアを聞いたり見たりしてみました アルゴリズムの概要 しかし、コースをよりよく理解するためにいくつかの数学的概念が欠けていることにすぐに気づきました。

では、優れたソフトウェア エンジニアが知っておくべき中心的な数学的概念は何でしょうか?また、お勧めの本やサイトは何ですか?

役に立ちましたか?

解決

プログラマーのための数学. 。良い読み物です。

他のヒント

ブール代数は、制御構造とリファクタリングを理解するための基礎です。たとえば、ドモルガンの法則を知らなかった(または使えなかった)プログラマーによって引き起こされた多くのバグを見てきました。別の例として、これをすぐに認識できるプログラマーがどれだけいるでしょうか。

if (condition-1) {
    if (condition-2) {
        action-1
    } else {
        action-2
} else {
    action-2
}

次のように書き換えることができます

if (condition-1 and condition-2) {
    action-1
} else {
    action-2
}

離散数学と組み合わせ論は、さまざまなアルゴリズムとデータ構造のパフォーマンスを理解するのに非常に役立ちます。

Baltimark が述べたように、数学的帰納法はループと再帰についての推論に非常に役立ちます。

集合論はリレーショナル データベースと SQL の基礎です。

例えとして、大工は屋根や階段などの建設にさまざまな経験則のテクニックを日常的に使用していることを指摘しましょう。ただし、幾何学の知識があれば、「既定の」経験則がない問題も解決できます。それは、基本的な語彙を視覚的に認識するのではなく、音声学によって読むことを学ぶようなものです。90% 以上の場合、大きな違いはありません。しかし、不慣れな状況に遭遇したときに、自分で解決策を見つけるためのツールがあると非常に便利です。

最後に、数学で要求される厳密さ/精度は、特定のテクニックに関係なく、プログラミングの準備として非常に役立ちます。繰り返しになりますが、私がこれまでのキャリアの中で見てきたプログラミング (あるいは仕様) のバグの多くは、根本的な原因にずさんな考え方がありました。

私は Landon が述べたフィールドに従うと思います。

離散数学、線形代数、組み合わせ、確率と統計、グラフ理論

そして数学的論理を追加します。

これにより、CS のほとんどの分野を把握できるようになります。特別な分野に進みたい場合は、特に次のいくつかの分野に飛び込む必要があります。

Computer graphics -> Linear Algebra
Gaming -> Linear Algebra, Physics
Computer Linguistics -> Statistics, Graph Theory
AI -> Statistics, Stochastics, Logic, Graph Theory

重要度の順に:

  • カウント (ループに必要)
  • 加算、減算、乗算、除算。
  • 代数 (変数の使用法を理解するためにのみ必要です)。
  • ブール代数、ブール論理、バイナリ。
  • 指数と対数 (すなわち、O(n) 表記を理解してください)。

それより高度なものは通常、アルゴリズム固有またはドメイン固有です。興味のある分野に応じて、以下も関連する可能性があります。

  • 線形代数と三角法 (3D 視覚化)
  • 離散数学と集合論 (データベース設計、アルゴリズム設計、コンパイラ設計)。
  • 統計 (統計および/または科学/経済アプリケーション用。アルゴリズム設計にも役立つ可能性があります)。
  • 物理学 (シミュレーション用)。

関数を理解することも役に立ちます (その分野の数学用語を覚えていないでください) が、プログラムの作成方法を知っている場合は、おそらくすでに理解しているでしょう。

私の言いたいことは次のとおりです。10 歳の子供は、プログラミングを理解できるほどの数学を知っている必要があります。物事の基本的な理解には、それほど多くの数学は必要ありません。本当に、すべてはロジックの問題なのです。

「帰納法による証明」は、プログラマが知っておくべき中心的な数学的概念です。

ビッグオー表記 一般的なアルゴリズム分析、および標準コレクション (並べ替え、検索の挿入、削除) に関連する

離散数学の場合、 ここ は、アルスデジタ大学の 20 の講義からなる素晴らしいセットです。それぞれの長さは約1時間20分です。

私たち CS 担当者が「離散数学」と呼ぶものから始めます。微積分と線形代数も、多くのアプリケーション領域への入り口となるため、非常に役立ちます。これら 3 つをマスターしたら、確率論に進みます。これら 4 つを習得すれば、アプリケーション ドメインの 95% (私が作ったものです) のコンピテンシーを獲得できます。

具体的な数学 主要なトピックのほとんどをカバーしています。ローゼンのような離散数学に関する良書 離散数学とその応用, 、隙間を埋めます。

それはあなたの集中力次第だと思います。数年前、私は Donald Knuth の『Art of Computer Programming』のセットを購入しました。本を読んだ後、ほとんどすべてが微積分の証明であることに気づきました。独自の汎用アルゴリズムとその証明を開発することに興味がある場合は、その世界で扱うことになるので、上記の本を理解できるようにしておくことをお勧めします。一方、さまざまな並べ替え/検索/ツリーなどを使用したい/使用する必要がある場合...ルーチンの場合は、少なくとも Big O 記法、ブール演算、および一般的な代数は問題ありません。3D を扱う場合は、ジオメトリとトリガーも同様に扱います。

私はプルーフを作成するよりも使用する側に立つ傾向があり、長年にわたっていくつかの賢いことをしたと思いたいのですが、座って新しい並べ替えルーチンを開発したことはありません。私ができる最善のアドバイスは、自分の分野に必要なことを学ぶことですが、より高いレベルに自分自身をさらして、それが存在し、さらにどれだけ学ぶべきかが分かるようにすることです。そうしないと大きな成長は得られません。

ブール論理と言えます。AND、OR、XOR、NOT。プログラマーとして、これを他の数学概念よりも頻繁に使用することに気付きました。

基本的な代数と統計は良い出発点であり、他の多くの分野の基礎となります。

これを理解していない開発者を見ると私を困惑させる単純なものを次に示します。
- 操作の順序

『The Art of Computer Programming』の第 1 章は、まさにこれを提供することを目的としています。

勧められた本があって…具体的な数学みたいなタイトルでした。いくつかの質問で推奨されました。

学校に戻ると、私の講師の一人は、ビジネス アプリケーションについて知っておく必要があるのは、加算、減算、乗算、除算だけであると言いました。他のすべての式は、要求者が知っており、必要なものが通知されます。ここで、これが財務報告とアプリケーションに重点を置いた学校向けであることを理解してください。今日に至るまで、これは私にとっても当てはまります。それ以上のことを知りたいと思ったことは一度もありません。

本をチェックする コンピューターサイエンスの基礎
この本の著者は次のとおりです。アル・アホとジェフ・ウルマン、そして本全体がオンラインで入手可能です。

この本の目的について、著者は序文で次のように述べています。

"コンピューターサイエンスの基礎 分割されていることが多い主題をカバーします
離散数学コースとコンピュータの 2 年生レベルのシーケンスの間
データ構造の科学。数学的なものを選択するのが私たちの意図です。
ではなく、コンピュータ ユーザーが本当に必要とするものに目を向けた基盤
数学者なら何を選ぶだろう。」

数学をブラッシュアップするためのサイト:http://www.khanacademy.org/

私の数学の背景は非常に貧弱ですが(地質学者の訓練を受けています)、 離散数学 高校のクラスで私はプログラマーとしてこの概念を毎日使用しています。これは私の現在の職業に関連するものであり、おそらくこれまでの教育の中で最も価値のある授業です。

離散数学
線形代数
組み合わせ論
確率と統計
グラフ理論

  • ブール代数
  • 集合論
  • 離散数学

まあ、それはあなたの目標が何であるかによって異なります。誰かが言ったように、難しい問題を解決したい場合は、線形代数、組み合わせ論、確率と統計、グラフ理論が重要です。関数の漸近的成長 (bit-Oh 表記) は非常に重要です。より複雑なアルゴリズムの分析に取り組む必要がある場合は、合計と級数をマスターする必要もあります (Cormen&others のアルゴリズム入門に関する付録を参照)。

「エンタープライズ向け Java」や「サーバーサイド PHP」に興味がある場合でも、上司があなたにサーバーを手に入れたいと思ったときに、いくつかの統計とアルゴリズムの複雑さ (つまり、組み合わせ論、帰納法、総和、級数など) が役立つことがわかるでしょう。新しいハードウェアを追加しても効果がないようです。:-) 私も一度経験したことがあります。

  • ブール代数
  • 集合論

なぜ誰もが微積分について言及せずに、ゴールドリストに確率と統計を含めるのですか?少なくとも極限、導関数、積分、級数に関する実践的な知識がなければ、確率と統計が何であるかを理解することはできません。そして全体として、微積分は (線形代数とともに) 全て 数学。

アルゴリズムと理論は非常に重要だと思います。素早く思いつくことができ、 正しい ソリューションは、優れたプログラマーとそれ以外のプログラマーを区別するものです。また、(帰納法、矛盾法などの標準的な証明手法を使用して) アルゴリズムを証明できることも同様に重要です。

はい、帰納法の基本を理解していれば、アルゴリズムで n が何を表すかを理解するのに役立ちます。また、いくつかのロジックと離散構造も役に立ちます。

確率と統計 機械学習に似た作業を行う必要がある場合に非常に役立ちます。

基本については「」で説明しています。自分のスキルを計算する「Xbox Live の TrueSkill ランキングとマッチメイキング アルゴリズムがどのように機能するかについて説明するブログ投稿。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top