すべてのプログラミングは本当に数学のサブセットであると何度も聞いたことがあります。 一部の提案 OOは、そのルーツでは数学に基づいていますが、いくつかの明らかな例を除いて、接続を取得できません。
私は数学がプログラミングにとって非常に重要であることを知っていますが、この「サブセット」ビューに苦労しています。数学のサブセットをプログラミングする方法は何ですか?
十分に強いつながりがある場合、つまり、エンタープライズ/オブジェクト指向の開発に関連する可能性のある説明を探しています。
全体として、数学は論理を正式にコード化したものであり、これはソフトウェアで行うことでもあります。
質問のトピックのリストには、数学的な問題がたくさんあります。私達はかなり高度な抽象化でプログラミングを行うことができるので、生の数学があなたを正面から見ているわけではないかもしれません。たとえば、DFAについて言及しました。数学を知らなくてもプログラムで正規表現を使用できますが、優れた正規表現エンジンを設計したい場合は、数学がさらに必要になります。
興味深い点にぶつかったと思います。プログラミングは芸術と科学です。 「貿易の道具」はたくさんありますが、単に座ってプログラムを書くために多くの高度な数学をする必要はありません。実際、プログラミングをしているときは、数学やのコンピュータサイエンスをあまり行っていない人がたくさんいます。
数学が現れるのは、コンピュータサイエンスの難しい問題を解決し始めたときです。あなたが深く行くほど、それはより多く肉付けされます。しばしば、より低い抽象化レベルで。
必ずしも作業する必要のないプログラミングの領域もありますが、それらにはより多くの数学が含まれます。たとえば、確かに言語を学び、正式な数学を使わずにいくつかのアプリを書くことはできますが、適用される数学がなければアルゴリズム分析にそれほど遠くなりません。
アルゴリズムなどについて抽象的な考えが必要であるという意味では数学です。
計画、成果物、テストを含むエンジニアリングです。
それが最終的にどうなるかがわからないときのアートです。
プログラミングは応用数学の最も難しい分野の1つです。貧しい数学者は純粋な数学者のままでいるほうがよいでしょう。
--E W.ダイクストラ
ええと、私は大学で数学とCSを専攻していました。セットAが数学で、セットBがCSの場合、AはBと交差します。サブセットではありません。
コンピュータサイエンスの父と母の多くがチューリングやダイクストラのような数学者だったことは間違いありません。インターネットの創設者のほとんどは、数学、物理学、または工学のいずれかの博士号を取得しています。コンピュータサイエンスのコアコンセプトのほとんどは数学から来ていますが、プログラミングの行為は実際には数学ではありません。数学は私たちの日常生活に役立ちますが、2つは同じではありません。
しかし、コンピューターの背後にある本来の理由が、物事をうまく計算することであったことは間違いありません。私たちはそんな短い時間でそこから長い道のりを歩んできました。
プログラミングについては触れていませんが、アイデアは依然として重要です。
アインシュタインは1917年に有名な数学者として知られていました。ようやく一般市民がやっと物理学は数学を応用しているだけではないということに気づいたのは広島です。
人は何かを理解できないとき、自分が理解しているものの一種としてそれを理解しようとします。彼らは類推で考える。プログラミングは、数学、工学、科学、芸術、工芸、建設の分野として説明されてきました...これらのどれも完全に間違っているわけではありません。これらすべてから借ります。本当の問題は、プログラミングの分野がたった約50年前のものであるということです。人々はそれを彼らの精神的な分類法に統合していません。
ここには多くの混乱があります。
まず第一に、「プログラミング」は(現在のところ)「コンピュータサイエンス」とは異なります。ダイクストラが自分を「プログラマー」(多かれ少なかれタイトルを発明した)と呼んだとき、彼はCRUDアプリケーションを汲み上げるのではなく、実際に応用コンピュータサイエンスを行っていました。私たちを混乱させないようにしましょう。今日、ビジネス環境のほとんどのプログラマが行うこととコンピュータサイエンスとの間には大きな違いがあります。
さて、コンピュータサイエンスは数学の一分野であるという議論をすることができます。しかし、クヌースが指摘しているように(彼の論文「コンピュータサイエンスと数学との関係」で、彼のコンピュータサイエンスに関する選択された論文で収集)、数学はコンピュータサイエンスの一分野であると主張することもできます。
実際、Knuthが領域をうまくレイアウトしているので、数学とコンピューターサイエンスの関係について考える人には、このペーパーを強くお勧めします。
しかし、元の質問に戻ると、実務家にとって、「エンタープライズ/ OO開発」は数学からかなり遠く離れていますが、それは主に、低レベルの操作に関連する深刻な数学のほとんどが抽象化されているためです(コンパイラーによって) 、オペレーティングシステム、命令セットなど)。同様に、自動車の運転には、内燃機関の物理に関する高度な知識は必要ありません。もちろん、より効率的な車を設計したい場合は...
数学の定義にすべての形式の論理が含まれ、プログラミングがコード内に存在する論理と計算によってのみ定義される場合、プログラミングは数学QEDのサブセットです;-)
しかし、これは絵画が単に表面に着色された顔料を置くことであると言っているようなものです-それは芸術、洞察、直感、創造的なプロセス全体を完全に不鮮明にします
同じ理由で、音楽は数学のサブセットであると主張することができます
だから私はノーと言わなければなりません、プログラミングは数学のサブセットではありません。プログラミング使用数学のサブセットですが、数学以外のスキル/才能も必要です[曲のように]
免責事項:私はITコンサルタントとして働いており、主にポータルとアーキテクチャ関連のものを開発しています。私は心理学の学位を持っています。私は大学で数学を勉強したことはありません。そして、私は私の仕事を成し遂げる。そして通常はよく。どうして?コードを書くために数学(「重い」数学のものなど)を知っている必要はないと思うので。分析的思考、問題解決スキル、および高度な抽象化が必要です。しかし、数学はあなたにそれを与えません。これは、同様のスキルを必要とするもう1つの分野です。私の心理学の研究は、ユーザビリティの問題やデータストレージを扱うときの私の日常業務にも当てはまります。言語学と記号論も役割を果たします。
しかし、ちょっと待ってください。まだ私を燃やさないでください。数学がコンピューターにまったく必要ないことを言っているわけではありません-明らかに、暗号化アルゴリズムやハードウェアなどを設計するときは、実際の数学のスキルが必要です-しかし、多くのプログラマーとして、中低レベルの言語( Cなど)またはそれ以上のレベルのもの(C#やJavaなど)、主に事前に構築されたフレームワークとAPIを使用する場合、フーリエ変換やハフマンツリーやメビウスストリップの背後にある数学的原理を理解する必要はありません...その上で、その上に価値を築き上げます。俺馬鹿じゃないよ。線形アルゴリズムと指数アルゴリズム、データ構造などの違いを知っています。クイックソートや気の利いた新しいビデオ圧縮技術を書き直すことに興味がありません。
まあ、それからasideから...!
数学は、プログラミングの多くの側面に使用されます。
私たちが行うすべての基礎は数学です。
幸いなことに、それを行うために数学自体が得意である必要はありません。車を運転したり飛行機を飛ばしたりするのに物理学を理解する必要がないように。
プログラミングと純粋な数学の違いは、状態の概念です。
http://en.wikipedia.org/wiki/Dynamic_logic_(modal_logic) をご覧ください。それは、時間とともに変化するものを数学的に分析する方法です。また、Hoareトリプルは、プログラムの入出力動作を形式化する方法です。プログラムの逐次構成と割り当ての仕組みを扱う公理をいくつか持つことにより、時間の経過とともに変化する状態を数学的に厳密に完全にうまく処理することができます。
知っている数学が不十分な場合は、分析したいものに対処するためにいくつかの新しい数学を「発明」してください。ニュートンとライプニッツは分析のためにそれをやった(別名微積分、私は思う)。計算とプログラミングのためにそれをしない理由はありません。
論理的な証明の形での数学はプログラミングに類似していると実際に主張することができます-
Curry-Howard対応 を確認してください。それはおそらく数学者が物事を見る方法のほうが多いですが、これはことわざの頭を打っているように思います。
数学+アート+ロジック
プログラミングが数学のサブセットであると聞いたことはありません。あなたが提供するリンクでさえ、プログラミングへの提案されたアプローチであり(それが数学のサブセットであると主張していない)、wikiページにも多くの意見の相違があります。
プログラミングには、(少なくともいくつかの)応用数学が必要です。数学を使用して、プログラムおよびプログラムのフラグメントを記述および分析することができます。プログラミングは数学と非常に密接な関係があり、それとそれからの概念を深く使用します。しかしサブセット?番号。
私は誰かがそれが何らかの明確な理由があるものであると実際に主張するのを見たいです。私は今まで持っていないと思います
数学を使用して何かについて推論できるからといって、それが実際に数学的なオブジェクトであることを意味するわけではありません。数学は、内燃機関、放射性崩壊、ジャグリングパターンについて推論するために使用されます。数学を使うことは数学をすることではありません。
あなたがリストしたトピックは理論的コンピュータサイエンスのトピックであり、それは純粋数学のブランチです。プログラミングは、理論的なコンピュータサイエンスを使用する応用科学です。プログラミング自体は数学の分岐ではありませんが、プログラミング言語が基づいているラムダ計算/計算理論/形式論理/集合論などがそうです。
また、私はダイクストラに完全に同意しません。それは自明であるか、ダイクストラが誤って引用されているか、文脈外で引用されています。純粋数学は非常に非常に難しい分野です。それは非常に抽象的であるので、応用数学のどの分野にも匹敵する難しさはありません。それは想像力の飛躍を必要とする一つの分野です。コンピュータサイエンスの最初の学位を取得し、理論的なCSとプログラミング、OS、コンパイラなどの応用分野に多くの焦点を当てました。私は電気工学の学位も取りました-間違いなく工学の最も難しい分野です-そして、マクスウェル方程式、制御理論、偏微分方程式などの応用数学の難しい領域に取り組みました。私は応用数学と純粋数学の研究も行ってきましたが、今日までずっと応用がはるかに簡単だと思います。純粋な数学者に関しては、彼らは全く異なる品種です。
現在、誰かがアプリケーションから解放された1〜2年の微積分を研究し、純粋な数学は簡単であると結論付ける傾向があります。彼らは何について話しているのか分からない。微積分学やアプリケーションから切り離されたトポロジーを研究しても、純粋な数学者が何をしているのかについての詳細はわかりません。これらの定理を実際に証明するタスクは非常に難しいので、区別を指摘するためにコンピュータサイエンティストに任せます。「P = NPの場合、世界は通常とは大きく異なる場所になります。 「創造的飛躍」に特別な価値はありません。問題を解決して、それが見つかれば解決策を認識することの間に基本的なギャップはありません。 .. "—スコット・アーロンソン(MIT理論計算機科学者)
私は言うでしょう...
特に理論レベルでは、それは部分的に数学です。効率的な検索/並べ替え/クラスタリング/割り当て/ fooifyingアルゴリズムを設計することを想像してみてください。これはすべての計算です...数論から統計までの全範囲を実行します。
それは部分的にエンジニアリングです。複雑なシステムが理想的なレベルのパフォーマンスと信頼性を達成することはめったになく、ソフトウェアも例外ではありません。ソフトウェア開発の多くは、信頼性の低いハードウェアと(エヘム)人に直面しても堅牢性を実現することです。
そしてそれは部分的にアートです。独創的で特異なソフトウェアデザインは、アセンブリ言語、マルチタスクオペレーティングシステム、グラフィカルユーザーインターフェイス、動的言語、Webなど、素晴らしい新しいアイデアを思い付くことがよくあります。
ちょうど私の2¢...
数学はプログラマーに一連のツールを提供し、プログラマが抽象的なレベルで実際の問題を解決するために使用するツールだと思います。
プログラミングはもともとは数学の準サブセットとして始まったかもしれませんが、時間の経過とともにフィールドの複雑さが増すことにより、プログラミングは情報処理と計算のための優れた抽象概念を作成する芸術と科学になりました。
プログラミングには、数学、工学、優れたデザインと実装のための美的感覚が含まれます。アルゴリズムは数学の拡張であり、システムエンジニアリングの側面は他の工学分野とある程度重複しています。ただし、数学やその他の工学分野には、複雑で柔軟でありながら理解可能な抽象化に対する同じレベルのニーズがありません。これらの抽象化を非常に多くの異なるレベルで使用および適応して、新しい進化する問題を解決できます。
最初に関数ライブラリを作成し、次にクラス/コンポーネントライブラリを作成し、近年ではデザインパターンとサービス指向アーキテクチャを作成したのは、有用で柔軟で動的な抽象化の必要性です。後者は設計に重点を置いていますが、プログラミングの問題とソリューションの間に高レベルの抽象的ブリッジを構築する必要性が高まっていることに対する反応です。
これらすべての理由により、プログラミングは数学のサブセットでもスーパーセットでもありません。それは単に、他の分野よりも根が深い数学を使用するさらに別の分野です。
数学は真実の最も純粋な形です。すべてが数学から継承されます。
アーメン。
上司から設計仕様書を渡されたいだけの場合、それはあまり数学ではありませんが、そのような作業はまったく面白くありません。抽象化のように、グラフ、時には理論的なものを数え、問題次第で微積分。個人的には、プログラミングに携わるほど、数学の側面を見るようになります。ただし、ほとんどの場合IMOでは、図書館から本を手に取り、必要なことの基本を調べることができますが、事前に数学的な理解が必要です。
背後にある数学を理解しないと、「良い」アルゴリズムを設計することはできません。グーグルで検索すると、今のところあなただけがかかります。
私たちが第4世代言語に移行するにつれ、プログラミングは以前ほど数学に関するものではなくなったと思います。アセンブリは、数学、C#に大きく関係していますが、それほど重要ではありません。考え?
プログラミングと純粋な数学の違いは、状態の概念です。プログラムは、ロジック(数学)を使用して状態間を遷移するステートマシンです。状態間の遷移に使用される実際のロジックは通常非常に単純です。そのため、数学の天才であることが必ずしもプログラマーとしてのすべてのことを助けるわけではありません。
私がプログラマーである理由の1つは、数学のようにしないでくださいだからです。私は数学自体には問題がなく、概念的には問題ありません。手動で計算するのは好きではありません。コンピュータに数学の問題を教えて計算を任せることができるとわかったとき、生涯の情熱とキャリアが生まれました。
私の母校によれば、質問に答えるために、数学==プログラミングは、私の数学の要件を満たすためにIntroをC++に取り入れることを許可したためです。
編集:私の学位は、当時、1学期の標準的な教養数学の要件しか持たなかった電気通信に関するものであることに言及する必要があります。
プログラミングは広すぎるテーマです。数学(ロジック)だけでなく、心理学、言語学などにも基づいた優れたソフトウェア。アルゴリズムは数学の一部ですが、アルゴリズム以外にもプログラミングに関連する多くのものがあります。
数学者として、数学はプログラミングと等しくないことは明らかですが、どちらの分野でも問題を解決するために使用されるプロセスは非常に似ています。
より高いレベルの数学の問題を解くには、分析的思考、問題を解決するための可能な方法のツールボックス、フィールドでの経験、および他の数学者が同意するように回答を構成するいくつかの正式な方法が必要です。問題を解決するための特に賢く、抽象的な、またはエレガントな方法を見つけた場合、仲間の数学者から賞賛を受けます。特に難しい数学の問題については、段階的に問題を解決し、推測と証明と呼ばれるものを使用して段階の議論を体系化することができます。
プログラミングには同じスキルのセットが含まれると思います。プログラミングでは、同じ原則のセットが問題の解決策の解決と提示に適用されます。プログラミングのジレンナに対する部分的な解決策がある場合、それを個人ライブラリーの一部として組み込み、後で別のより大きな問題の一部として使用します。これらのスキルは、数学で使用されるスキルと非常によく似ています。
数学とプログラミングの主な違いは、後者は数学よりもプログラミングの異なる分野間で多くの共通点を持っていることです。数学の2つの分野は、プレゼンテーションと、その分野を伝えるために使用されるものが非常に異なる場合があります。対照的に、プログラミング構造は、少なくとも私には、多くの異なる言語で非常によく似ています。
プログラミングと音楽を比較することも興味深いです。英国ではとにかく、関係する論理やパターンなどのために計算することになっている音楽の資格に基づいて申請者を受け入れる計算ベースの学部の大学のコースがあります。
数学は強力であり、プログラミングは強力であり、数学がプログラミングのサブセットである場合、プログラミングが数学のサブセットであると述べることも同様に真実です。
数学は言語を使用して記述され、多くの場合書き留められます。したがって、数学も書き込みのサブセットですか?
歴史的に数学はコンピュータプログラミングの前に登場しましたが、リストとプロセスはおそらく数学の前にありました。どちらも数学と同じように考えたり、プログラミングと同じように考えたりすることができます。
プログラミングは数学を使って表すことができるので、プログラミングは数学のサブセットであるという事実にはいくつかの根拠があります。ただし、コンピュータープログラムは、基本的に公理から無限で少しだけ定義されたものを含め、紙上で行われるときに数学が通常行うように、情報を象徴的に表す数学を実装することもできます。構成を超えた他の種類の関係。ダイアグラムの描画をサポートし、システムの拡張を可能にします。数学も同様にプログラミングのサブセットです。
数学は単語などの構造を表すことができますが、数学は数値に関する設計です。たとえば、文字列は数学的なものよりプログラム的なものです。