ソフトウェア開発の学位を取得したばかりです。現在、基本的なJavaなど)から始めています(つまり、下から右に言うかもしれません)。これは問題ありません。「Hello World "Javaで。
数学はコーディングに関係があると聞いていますが、それはどうですか?数学とプログラミングがどのように連携しているか、または互いに依存している一般的な例はどれですか?
私の質問が漠然としていることをお詫び申し上げます。私がコードモンキーの学生として踏み込んでいる世界の種類についておおざっぱに理解し始めたばかりです...
まず、私は数学者です-専門家です(数学をすることで報酬を得ます)。私はプログラマーではありません。私はいくつかのプログラミングを行いますが、Cargo Cultの種類については非常に間違いなく( https://tex.stackexchange.com/q/451/86 への最初のコメントと私の応答を参照)、種類はありません通常、このサイトに移動します(実際に、TeXチャットルームでこの回答へのリンクを見た後、この回答を投稿するためにここに登録しました)。
私の答えの要約は次のとおりです:数学はプログラミングです。
私は最近、数学のコースを数学以外の学生のグループに教えるようになりました。彼らはプログラミングセクションでした。これは素晴らしいと思いました!ようやく、基本的な考えがすでにわかっているで、すでに数学を行うための基本的なツールキットを持っている人たちに数学を教えることができるようになりました。彼らの何人が実際にプログラムを書いていて、0と1の間のどこかで答えを得たとき、私は信じられないほどがっかりしました。
先に進む前に、いくつかのことを明確にしておく必要があります。プログラミングに直接関係し、アルゴリズムの評価や言語の分類などに関連する数学の領域があります。私はそれらについて話していません。すべての数学をコンピュータで評価できる形式的な言語に翻訳しようとするプログラムもあります。これは私が話していることにより少し近いですが、それに集中しても、私が言おうとしている主要な部分を見逃してしまいます。私がしている数学と私がしているプログラミングは、トピックによってほとんど完全に無関係です。それらの間の接続は異なるレベルにあります。
私が始めたいのは、主な質問のコメントです:
それが数学をしている場合、すべての人間の活動は数学の一種です。その場合、Wordの数学は、ある活動を別の活動と区別するために使用できないため、有用な意味を持ちません。
はい、それは数学です。しかし、「数学」はまだ有用な単語です。なぜなら、この歌が言うように、「それはあなたがすることではなく、それがあなたがそれを行う方法だからです」。私が何かに近づいているとき、私は数学をやっていると言います数学的な方法で。時々、それは「ハードコア」数学です:定義を定式化し、定理を証明します。時々、そうではありません。時々、それは私の子供たちが彼らのつづりの言葉を学ぶことができるように愚かな小さなプログラムを書いている。
これは私がプログラムするときに数学が私を助けるものです:
Abstractionこれはおそらくthe数学からの最も重要な移転可能なスキルです。これにより、不要なものをすべて取り除き、重要な特性に集中できるようになります。
Perspectiveoneすべての生徒が学ぶことしか選択できない場合、これは次のようになります:変化する能力問題に合うものの視点。線形代数ではこれを一般的に基底変換式で扱います(これは恐ろしい行列と恐ろしい複雑化につながります)が、それよりもはるかに適用可能です。本質的には、何かが1つの方法であなたに提示されたからといって、それがあなたがそれを扱う方法である必要はないという考えです。これは、物自体の見方をそれが提示された方法から切り離します。これは非常に実用的である可能性があります。それは、何かsefulまたはefficientを作成することに関するすべてです。ベクトルのリストがあり、それらをx座標のリストとy座標のリストとして格納する方が効率的である場合、そうであることです。
フォームと関数上記から先に進みます。物事がさまざまな方法で提示できる場合、特定の1つの表現がthe物であると言うのはもはや公平ではありません。その曲をもう一度誤って引用すると、「それは重要ではありませんあなたが何であるかそれは何をするかです。
私は続けることができますが、それらは思い浮かぶものです。
今、私がこれまでに書いたことに対して、おそらく多くの(否定的な)反応があります。 1つは「それは数学ではなく、それは単なる意味です」です。私は上記の私の見解を「すべての人間の活動は数学の形である」という感情に同意することに言及します(または悪い意味)。もう1つは、「それは問題で意図されている種類の数学ではない」です。これはほぼ間違いなく真実であり、ここでは「少なくとも10年間は数学に触れていない」と言った人に対して、私はもっと同情しています。彼または彼女は間違っています。もちろん、彼らはプログラムを書いたときはいつでも彼らは数学をしていましたので、彼らは10年間数学を行っています。彼らはそれを理解していませんでした。そして、ここで、すでにプログラマーだった学生に数学を教える(悲しいことに未実現)可能性に私が喜んだ理由について要点を述べます。
私は実際にプログラムで「実際の数学」を使用しています。最近、楽しい3Dシェイプエクスプローラーをコード化しました。これには、いくつかの数学を使用して、データに適用しなければならない投影やその他の変換を理解することが含まれていました。私は自分が実際に四元数をコーディングしているのを見つけて、少し面白かったです!しかし、もちろん、含まれていた数学は、私が働いているときに行う数学と比較して、取るに足らないものでした。それは「封筒の裏」のものでした。そのタイプの数学、そして私はあなたがそれを必要なときにそれを拾うという感情に同意します、そしてあなたがウィキペディアで見つけることができるよりももっと複雑なものが必要なら、あなたはあなたのためにそれを行う本物の数学者を見つけます。しかし、あなたがcan必要なときにそれを手に入れるためには、あなたはsomethingを学ぶ必要があります。それはあなたが実際に使用するものではないかもしれませんが、何かが人生の後半で実際に使用するものを拾い上げるのをより簡単にすることを学んだことを学びました。ですから、ここが私がコーダーに同意しないところです。あなたはこれから学ぶ必要がありますsome数学を使うつもりならany数学であり、あなたはそれを学ぶ必要がありますfrom数学的な側面(ところで、定理を証明することを意味するわけではありません)。
そして最後に、「数学はプログラミング」です。優れたプログラマーであることから、これらすべてのことを学ぶことができます。これらのことを学べば、ベクトル空間でベクトルについて話すとき、それがクラスVector
のインスタンスにすぎないことを理解できるので、数学がはるかに簡単になります。そのインスタンスに対してVector
が行うすべてのこと:加算、減算、スケーリングなど。 That'sプログラマーに数学を教えたいと思う理由。しかし、数学者として言えば、これらのfirstである "抽象化"は、数学は抽象化の追求であるため、プログラミングよりも数学で学ぶ方が簡単だと言えます。私たちが何らかの振る舞いを見たときはいつでも、私たちのトレーニングは常に「そのように振る舞うことについて、そのことについては何ですか?私が同様の別のことを取ったら、それは同じように振る舞うでしょうか?そのことのどのくらいそんなふるまいをやめるには、負けなければならないのですか?」 (これを極端に取ると、「ムカデの数学」につながります-用語を検索します)。しかし、(実際の)オブジェクト(それが何であれ)でこれを行うのではなく、すでに抽象化されているものでこれを行います。
これは十分に長く続いているので、古典的な数学者のジョークの1つで締めくくります。
数学者と物理学者の両方が、24次元空間を含むいくつかの新しいモデルに関するセミナーに参加しました。その後、彼らはそれについて話し合い、物理学者は「それは本当に大変でした。つまり、24次元空間をどのように視覚化するのですか?」と述べました。数学者はこう答えました:「ああ、それは簡単です。n次元空間を視覚化してから、n = 24に設定してください。」.
追加2012-03-2
この回答には、さまざまな見方を表すコメントがかなりありました。これらは、私の回答に組み込む(または対応する)ようにしようとすることを理解しているため、モデレーターによって削除されました。
ただし、できるかどうかはわかりません。それらのコメントとこのページの残りの部分を読むと、数学が実際には何であるかについて大きな誤解があるという結論に達することができます。さらに、私はそれを説明するのに十分な能力を感じません。幸いなことに、誰かがすでに Lockhart's Lament にリンクしているので、その説明は後回しにします。別の言い方をしたかもしれませんが(私は科学的環境で育ったので、数学の実験的な性質をより強調したでしょう)、私はそれを置くことができないと思いますbetter。
私はまだ何かを追加できると思います。数学isについての誤解だけでなく、「数学を行う」の意味についての誤解もあります。私は2つのほぼ矛盾したスタンスを見る:
数学は方程式と数式についてです。ウィキペディアが存在するので、これを研究する必要はありません(これは オイラーのディドロへの外見上の挑戦 のほぼ逆です)。
数学は定理と定義についてです。したがって、プログラムが何も証明しないので、それを研究する必要はありません(これは、...ここにお気に入りの誤りを挿入するのと同じくらい完全な誤りです)。
2つのスタンスは互いに矛盾しますが、最終的には同じ場所に行きます。プログラマーが数学を学んでも意味がありません-確かに数学者からではありません!結局のところ、-theyは何について知っているのですか?プログラマーが本当に知っておくべきことは、ウィキペディアで見つけたり、他の誰かに悪ふざけしたりすることができます。
上記では、私は自分をカーゴカルトプログラマーとして説明しました。私はあなたのほとんどが自分に個人的な笑いを抱いていて、「ああ、そうだ、私はあなたのプログラムがどのように見えるか知っているに違いない」と思ったに違いない。あなたはおそらく少し独善的で優れていると感じました(確かに悪い独善的で優れていると感じました)。
上記で説明したのは、Cargo Cult Mathematicsです。
数学の仕組みを理解するために少し数学を学ぶべきだと私が言ったとき、私が書いたコードを少し見たのと同じ理由でそれを言っています。 StackOverflowからのコードのカットアンドペーストをやめて、適切に行う方法について少しだけ学習した場合です。」.
ただし、最も重要なことは、数学者から学ぶ必要があるということです。なんでそうなの?これは類推です。私が最も得意とする言語はTeXです。 (それはすべて言う、本当に!)さて、TeXについてもう少し学びたいと思います。たまたまDon Knuthが町にいて、TeXに関するいくつかのチュートリアルを提供することを提案したとします。それともウィキペディアでそれについて読むことができます。あるいは、PerlとLarry Wall、またはC#(これが適切ですか?)とJon Skeetかもしれません。これらの人々は最高ではないかもしれません教師が、彼らは彼らが知っている量でそれを確実に補います!
そして、それが数学者です。私たちは実際の言語を書いて、それからあなたが使用するライブラリーを書く人々です。もちろん、あなたはhaveで定理を証明する方法を知る必要はありません-ライブラリを書くつもりはありません!しかし、あなたが私たちの考え方について少し知っている場合は、なぜ私たちがこのようにライブラリを作成したのかを理解するのに役立つかもしれません。
ウィキペディアで方程式を調べることとポアンカレ予想を証明することの中間点があります。これは、ロックハートの嘆きを参照するのと同じように、「アートについてはあまりよく知りませんが、好きなものを知っている」という中間点があります。モネであることと、「「ANY」キーはどこ?」ドンクヌースです。あなたがまだ大学にいるなら、あなたは自分の地域の専門家であり、そして何らかの理由でそれをあなたに説明することに時間を費やすことをいとわない人々から学ぶ素晴らしい機会があります。
もう少し拡張したかったもう1つの点は、プログラマーとして、もう少し数学を学ぶことを恐れるべきではない理由です。ディープコネクションではなく、実用性でもありません。それはあなたがコンピュータをプログラムするあなたの能力があなたが数学を学ぶのを直接助けることができるということです。少しだけ触れておきたい。
変数を理解する。 「Nを自然数にしよう...」のような単純な文に混乱する人がたくさんいます。または、「イプシロン> 0にしましょう」。数学には、変数のscopeを覚えておくことが重要な箇所があります。これらはすべてプログラミングでは当たり前のことです。数学的ステートメントをプログラムに変換する方法を学ぶと、何が何であるかを追跡するのがはるかに簡単になります。
証明の性質。これまでにテストを作成したことがある、または誰かが使用するプログラムを作成したことがある場合は、証明の核心を理解しています。これを行うときは、ユーザーが入力するwhateverを知っている必要があります。これに対処できます(ここに必須のxkcdリファレンスを挿入します)。それがすべての証拠です! whatever "user/universe"が投入するデモンストレーションは、ステートメントを保持します。実験家は「通常の状況で機能する場合、それは本当です」に頼りますが、プログラマーは、何が起こるかを見るためだけにAlt + G + Shift +ÅØÆを試す子供が常にいることを知っています。
ドライ。あなたにこれを壊して申し訳ありませんが、私たちはあなたではなくそれを発明しました。私たちは何千年もの間「自分自身を繰り返すことはありませんでした」。それが私が私の棚にユークリッドの要素のコピーを持っている理由ですそれはまだ役に立ちます。
そして、もっとあります。プログラミングについてもう少し知っていれば、「プログラマのための数学」という本を書いて、「プログラマが知っておくべき数学」ではなく、「誰もが知っているべきであるがプログラマのために最適化された」数学を教えることを目指しました。 。しかし、誰かが私と協力することを申し出ない限り、それを書くためのプログラミングについて十分に知ることはおそらくないでしょう。
そのままにしておきます。おそらくもっと考えれば、私が書いたものを変更するでしょう。うまくいけば、私はそれをよりよく説明したいと思います。数ヶ月のうちに、私はそれの一部に同意しないかもしれません。誰かがさらに議論したり、そうでなければコメントしたい場合は、おそらくここのコメントでそうしない方がいいでしょう。 あなたは私を見つける場所を知っています 。
それらはthatとは密接に関連していません。プログラミングの場合、数学について理解することが重要です。特に、アルゴリズムのパフォーマンスなどに関連する分岐ですが、単純な事実として、シングルトンが恐ろしく悪い考えであることを示す数学の分岐はありません。たとえば、または、コンポジションより継承を優先する場合、またはその柔軟性が本当に必要であるかどうか、自分自身を繰り返さないかどうか、および他の何十ものコアプログラミングの必要性。
数学mightプログラムが何をするかを表現することができますが、最も確実に、人間が読める、実行可能な最も適切な方法を伝えることはできません。
数学とプログラミングは2つの方法で関連しています。
1つは、数学を使用してコンピュータープログラムについて推論できることです。 「入力データが変化すると、プログラムの実行時間はどのように変化しますか?」、「プログラムは問題に対する答えを見つけることが保証されていますか?」、「プログラムは可能な限り効率的ですか?」などの質問に答えるのに役立ちます。 「、「プログラムをより速くするため、またはより少ないメモリを使用するために、どのように再配置する必要がありますか?」通常、このようなトピックについては、計算理論、アルゴリズムの設計、およびコンピューター言語の設計に関する上級課程で扱います。
数学とプログラムが関連する2番目の方法は、プログラミングを使用して数学の問題を解決することです。 「日常生活」の多くの問題は、実際には数学的問題として再計算され、コンピューターで(おそらくは)解決できるため、これは重要です。これらの種類のトピックは、ほとんどすべてのコースである程度表示されますが、特に離散数学および数学モデリングのコースで表示されます。
数学教育がコンピュータサイエンスにとって重要である2つの具体的な例は、
1) relational calculus が使用されるリレーショナルデータベース。
関係計算は、タプル関係計算とドメイン関係計算の2つの計算で構成されます。これらは、データベースの関係モデルの一部であり、データベースクエリを指定する宣言的な方法を提供します。これは、リレーショナルモデルの一部でもあるが、クエリを指定するためのより手続き的な方法を提供するリレーショナル代数とは対照的です。
リレーショナル代数は、いくつかのサンプルブックを提供する書店の電話番号と名前を取得するために、次の手順を提案する場合があります。
Join book stores and titles over the BookstoreID. Restrict the result of that join to tuples for the book Some Sample Book. Project the result of that restriction over StoreName and StorePhone.
関係計算は、記述的で宣言的な方法を定式化します。
Get StoreName and StorePhone for supplies such that there exists a title BK with the same BookstoreID value and with a BookTitle value of
いくつかのサンプルブック。
関係代数と関係微積分は基本的に論理的に同等です。すべての代数式について、微積分には同等の式があり、その逆も同様です。この結果は、コッドの定理として知られています。
これらの使用例については、udacityのクラスCS 373: PROGRAMMING A ROBOTIC CAR をご覧ください。
説明:このクラスは、AIの主要な専門家の1人によって教えられ、確率論的推論、コンピュータービジョン、機械学習、計画など、人工知能の基本的な方法をすべてロボット工学に焦点を合わせて教えます。広範なプログラミングの例と割り当ては、自動運転車の構築のコンテキストでこれらの方法を適用します。ビデオを介して、この分野の主要な研究所を訪れ、スタンフォード大学とGoogleで自動運転車を製造している科学者やエンジニアに会うチャンスがあります。
前提条件:インストラクターはプログラミングに関する確かな知識があることを前提としています。すべてのプログラミングはPythonで行われます。確率と線形代数の知識が役立ちます。
1週目:
パーティクルフィルターを使用した確率車の位置特定の基礎
第2週:
ガウシアンと連続確率カルマンフィルターによる他の車の追跡
第3週:
画像処理と機械学習センサーデータ内のオブジェクトの検索
第4週:
計画と検索A *検索で運転する場所を決定する動的プログラミングで最適なルートを見つける
第5週:
PIDによるステアリングと速度の制御
第6週:
すべてをまとめる自動運転車のプログラミング
第7週:
あなたの知識をテストする最終試験試験
科学的なアプリケーション開発、ゲームプログラミング、リアルタイムシステム、シミュレーションシステムなどのアプリケーションには、数学が実際に必要です。結局のところ、プログラミングは数学と科学を使用して問題を解決します。一方、ユーザー情報を取得してデータベースに登録するアプリケーションをプログラムするには、高度な数学は必要ありません。それにもかかわらず、すべてのプログラマーは、基本的な数論、代数、基本的なセット理論、および基本的な数値分析から利益を得るでしょう。
数学の実践者の側から見ると、数学のさまざまなトピック(および他の多くの科学分野)は、プログラミングから大きな利益を得ることができます。
何よりも、2つがとても似ているように見えるのは使用される思考プロセスの類似性だと思います。
たとえば、どちらも非常に論理的です。同じ一連の手順または同じ数式を実行すると、常に同じ結果が得られます。たとえば、_1+1
_は常に_2
_と等しく、_set a = 1
_はa
が常に1であることを意味します(別の値に設定するまで)
別の例は、空間的に考える必要があることです。数学では、頭の中に数字を入れて、自分のやっていることを視覚化しなければならないことがよくありました。非常に単純な例として、私は数学の問題を分解して、_13x13
_のようなものが_13x10 + 13x3
_になるようにします。これは、脳での作業がはるかに容易になるため、_13x10=130 + 13x3=39
_、それで_130+39 = 169
_。目に見えないものを視覚化したり、問題を小さな問題に分解したりするこの同じ機能は、多くの場合プログラミングに適用されます。
ですから、プログラミングに数学的な背景がなくても、数学は数値を使って計算を実行するように定義されていると思いますが、数学の問題を解くときに使用するものと同様の思考プロセスと理解が必要です。
今日まで、微積分の要素との三角法。そして、that数学を呼び出します。それは足のペアを「人間」と呼ぶようなものです。
微積分学はプログラミングとはほとんど関係がなく、物理学と工学により密接に関連しています。 ゲームエンジンには物理学、統計分析には計算が必要です。 (統計分析は、認めることが快適であるより多くの仕事を推進します)
私たちにとって微積分は、プログラミングを現実世界に関連付けることについての詳細です。 計算計算は、その関係がこれまでにどれほど悪いかを研究するブランチです。 (スポイラー:それはかなり悪くなりますが、無期限にチェックを続けることができます)
Trigonometryは、ボックス内のクレイジージャックであり、予想外のときに表示され、次に信号分析、オーディオ生成など、多くのものがそれに依存します。
Algebra 101およびLogic 101に進み、Pascalの歴史を研究します。ライプニッツ(そうそう、彼はほとんど計算を発明したが、それは途中で間違えた。ニュートンはそれがほとんど意味をなさないようになるまで議論した。それでもバイナリコーディングのことを思いついた)とバベッジ、そしてあなたの疑問の多くは衰えるだろう。 (ただし、数学の定義は永久に変更されます)
プログラミングは、多くの伝統的な学問分野にまたがっています。
数学、特にapplied mathematicsはプログラミングに重要です。なぜなら、私たちがコンピューターに求めていることの多くは膨大な数だからです。数値手法を理解し、計算を効率的かつ適切に適用する方法を理解することは、多くのプログラマが日常的に行っていることの1つです。
ここでは、いくつかのコンピューティング問題(特にインターネットドメイン)を解決する際に数学に遭遇した実際的なことを説明します。
あなたの質問の問題は、「数学」と「プログラミング」はどちらも非常に広くて深い主題であり、誰もが生涯で習得できるよりも多くのことを知っておく必要があるということです(誇張ではありません)。私は個人的に数学の修士号を取得しています。大学在学中は、他の仲間と比較して、学べば学ぶほど知識が減ったように見えました。何年もかけて私があまり知性を失ったように感じました私が修士論文を教授のグループに発表したとき、彼らのほとんどでさえ、私が研究したものにほとんど慣れていないようでした。
同様に、私は現在、データベース駆動型のWebアプリケーション開発者です。組み込みアセンブラー言語プログラミングをしている人と私を比較すると、私たちを2人の非常に才能のある専門家と考えるかもしれませんが、私たちが両方とも「プログラマー」であるとしても、専門知識は大きく異なります。
(新入生の計算を超えて)高等数学の研究を進めていくと、数学は、プログラミングの際に役立つ抽象的な推論のための規律を植え付けていることがわかります。あなたがプログラムするときに抽象的な懸念に対処するので、この規律は非常に重要だと思います。
もちろん、フレッシュマンプログラミングでは、ポインター演算について学習するでしょう。あなたはこの概念を説明する短いプログラムを書き、それがあなたのコンピュータがあなたの意志に従うようにドライブする方法のあなたの理解をします。ただし、抽象でポインター演算がどのように機能するかを学習しても、実際のプログラムでポインターを使用するのは得意ではありません。 10K行のコードの混乱に取り掛かり、ポインター演算にいくつかの変更を加えるときが来たら、非常に抽象的なレベルで推論し、変更がどのように影響するかについてのさまざまな懸念のバランスをとるための戦略的決定を行う必要がありますコード。
プログラマーは、コードの「読みやすさ」、コードのパフォーマンス、結果として得られるプログラムの使いやすさなど、さまざまな問題のバランスをとる必要があります。非常に抽象的な比較を行って、これらの懸念を相互にバランスさせる必要があります。これらの比較の多くは毎日行われます。私は時間管理についてさえ始めていません。あなたは自分の行動が予定通りにタスクを実行する能力に影響を与える可能性について抽象的に推論し、もう一度、あなたの仕事に影響を与える多くの決定を毎日行います。
最後に、古い方法論や慣行が使用されなくなっても継続できるように、新しいアイデアや概念を吸収できるように、哲学的規律を維持する必要があります。ここでも、やって来るアイデアを評価し、すでに知っているものと抽象的な比較を行うことができる必要があります。
要するに、私たちのほとんどが知っているように、プログラミングは、数学とはほとんど関係がありません。しかし、それを抽象的なレベルで見ると、それらには多くの共通点があります。
数学は(たとえば)三次方程式を表します。
アルゴリズムは、その3次方程式を解く方法を記述します。
マシンで実行できる方法でその(または任意の)アルゴリズムを構築するのはprogrammingです。
コンピュータサイエンスは、アルゴリズムの分析です。その理論的な時間/空間効率、誤差範囲などです。これは、数学の分岐と考えることができます。ただし、コンピュータサイエンスとプログラミングは実際には同じものではないことに注意してください。優れたプログラマーになりたい場合は、コンピューターサイエンスの基礎を持つことが重要です。これは、開発するアルゴリズムの設計と推論を改善するのに役立ちます。しかし、それは要件ではありません。
優れたプログラマーは、優れた数学者ではないかもしれません(実際、多くの場合、そうではありません)。逆もまた同様です。それらは個別の識別可能なスキルです。
私は、ポスターの数学的理解が不十分であることが本当の問題である長年にわたって、これらのタイプのフォーラムに関する多くの質問を見てきました。たとえば、代数に優れた基盤を持っている人なら誰でも、ゼロで除算できないことを理解しています。しかし、ポスターがそれを理解できず、その後、基本的に「ゼロで除算することはできません」というエラーメッセージが理解されないという質問をたくさん見ました。投稿者が基本的なロジックを理解していないことが明らかである多くの質問を見てきました。ブール代数の概念が明確に理解されていない質問が多すぎます。
数学の証明を書いたり、数学の教科書のように方程式を直接解いたりしていないからといって、その背後にある概念を理解する必要がないというわけではありません。ちなみに、私は長年の仕事の経験で、数学をしっかり理解している悪いプログラマーに出くわしたことはありません。
一部の分野では、ゲームプログラミング、統計プログラミング、財務プログラミング、一部の組み込みシステムなど、多くの数学を直接使用します。これらのインスタンスのいくつかでは、要件で必要な方程式が与えられますが、与えられない場合もあります。ただし、方程式が与えられた場合でも、それらの方程式をプログラミングコードに適切に変換するには、まず方程式を理解する必要があります。
基本的なCRUDアプリケーションでは、基本的な代数だけで問題を解決できますが、より興味深い問題と高度な作業のほとんどには、数学的な理解が含まれます。それでは、なぜ数学を深く学習しないことで、最初から自分を制限したいのでしょうか。
すぐに思い浮かぶ2つの例は次のとおりです。
functions-入力変数に変換を適用して出力変数を生成するという考え方は、数学に強く根ざしています。 asの周囲にある関数を別の関数に渡すという概念はさらにそうです。一般に、プログラミングに関連する抽象的な思考の概念は、数学に非常によく似ています。
bitMasks-問題を解決するためのこの一般的なプログラミングアプローチでは、少なくとも概念を理解するためにブール代数の基本的な理解が必要です。
プログラマーの観点から:数学はプログラミングのサブセットです。
プログラミングで適用される数学:
プログラミングでコレクション(配列、リスト、マップなど)を扱う場合、数学の抽象化の実際の実装を扱っています。
数学なしのプログラミング:
println("Hello World")
を実行する場合、画面上の位置、文字列の長さなどを計算するためにいくつかの数学が使用されるという事実は、ほとんど無関係です。
数学のためのプログラミングの使用:
プログラミング言語で数学と物理学を実装すると、コンピューター支援設計などが可能になります。
私は決して数学の専門家ではありません!私はHS Geometryでうまくやった、それは私にとってすべての論理でした。プログラミングとジオメトリは非常に似ていると思います。ブール論理は、私の心の中で幾何学的証明に非常によく結びついています。
次に、係数演算子を使用して、行内の列数を制御できることを知るなど、少しのことです。
私は、良い数学者である友人(または同僚/コンサルタント)を持つ優れたプログラマーであるという考えを強く支持します。
明らかに、両方のスキルセットを持つことが祝福されている場合は、それを実行してください!
プログラミングは通常、通常は数学モデルであるモデルに基づいています。
住宅ローン計算機を作成する例を見てみましょう。このためには、興味が何であるか、複利関係が何であるかなどを知る必要があります。基礎となる数学を理解していない場合は、他の誰かがその情報を提供する必要があります。通常、すべてを行うのはプログラマーの仕事です。必要に応じて、いつでもサポートを求めることができます。
プログラミングで広く使用されている数学には単純な概念があります。たとえば、式、方程式、変数などは、プログラミングで深く使用されています。数学でそれを取得しない場合、あなたは最高のプログラマーではないかもしれません。
強力な数学を持っているので、あなたの作業をモデル化するためのより多くのものを与えます。それは最終的にあなたをより良いプログラマーにします。たとえば、プロジェクトの1つで2次方程式を描画したい場合があります。これにより、数学が得意だからといって、より多くのことを学ぶことができます。または、円の領域を見つけるプログラムを作成して、より多くの経験を与えます。
私の短い教育の経歴の中で、学生が数学のバックグラウンドを持っていなければ、経済的な問題を抱えているときに彼らはほとんど失われていることがわかりました。彼らがモデルに夢中になると、言語自体を学ぶことがより困難になり、正直なところ非常にイライラします。
数学を行うこととプログラミングの99%は、共通点がほとんどありません。数学は優れたプログラマーである必要はありません。線形代数の微積分I、II、III要素など、数学の大学レベルのコースをいくつか受講しました。
私は10年以上ソフトウェアエンジニアとして働いており、基本的な数学以外のものを使用する必要はほとんどありません。数学が必要ないくつかの例外があります:グラフィックスやその他の領域など。しかし、プログラミングとソフトウェアエンジニアリングの99%は数学を必要としません。論理的思考、アルゴリズム、OOP、関数、問題の分解などが必要です。
1)プログラミングを学ぶと、専門用語(アルゴリズム)に出くわします。アルゴリズムを分析するには、多項式、対数、および指数関数の性質についての考えが必要です。
2)コンピュータサイエンスアプリケーションに基づいて、意味のあるソリューションを作成するには、離散数学と連続数学についてのアイデアが必要です。このようなコースを通過することで、これについてさらに理解することができます-
---> コンピュータサイエンスの数学
---> マトリックスのコーディング:コンピュータサイエンスアプリケーションによる線形代数 。
初心者にとって、python
/scheme
のような動的型付き言語はプログラミングに最適な最初の言語だと思います。 Java
/C++
のような静的型付き言語は、そもそも最適ではありません。 「MIT/UOC-Berkeley/Stanford」から公開されたOpencoursewareは、通常の大学のカリキュラムよりも優れたガイドを提供します。きっと!
正直なところ、あなたがどのようなプログラミングをしているのかによります。
何らかのロジックを備えた軽量のWebアプリを作成している場合は、多くの学位が必要とするより高度な数学クラスはおそらく必要ありません。あなたがより多くの計算を必要とするよりも、少しプロセッサが重いものを扱っている場合。何らかの科学分野で作業をしている場合は、計算参照を手元に置いておきたいと思うでしょう。
数学が必要になるもう1つの場所は、ゲームを書きたい場合です。 2番目に斜めに移動したい場合は、NEへのブロックに移動したときに加速するキャラクターになってしまわないように、慎重な計算を開始する必要があります。
とはいえ、必ずしも数学を学び、プログラミングを学ぶ必要はありません。プログラミングを学び、高度な数学を学ぶことは完全に有効です。私はCalcまたはTrigクラスに足を踏み入れる前にコーディングを開始し、うまくいきました。ペンと紙で行うよりも簡単なスクリプトで変数を変更することでトピックを詳しく調べることができるので、高度な数学を学び始めたとき、コーディングが本当に役立つことがわかりました。
コンピュータサイエンスの理論的基盤(これは単なるプログラミングではありません)は本質的に数学です。計算可能性の定義から、アルゴリズムの分析と表現、プログラミング言語の仕様まで、すべてが多種多様な数学に基づいています。関連する数学の種類については、 このWikipediaのページ を参照してください。
そのほとんどが、コードをスリングするだけかどうかを知るのに本当に必要なものではありません。応用数学に関しては、深刻な数値計算スキル(詳細な物理シミュレーション、信号分析、財務分析、予測など)を必要とする分野に入らない限り、おそらく基本的な代数以外のことは何も使用しないでしょう。日常的に。
簡単な答え。数学によって高速になります。もちろん、Google/se/wikipediaでコーディングの問題を取り除くことはできますが、十分な数学を実行して必要はありませんです。信じられないかもしれませんが、適切に訓練された人間の脳はグーグルよりも高速です。さらに、あなたが知っている数学が多ければ多いほど、google/se/wikiが与える結果をより早く理解できるようになり、人々があなたに言っていることを理解するためにドリルダウンする必要が少なくなります。プログラミングの問題を解決するプロセスでは、とにかく数学を学ぶことになりますが、数学に焦点を合わせると、はるかに効率的なプロセスになります。
あなたの質問は、ロックミュージシャンがなぜ正式な音楽トレーニングを必要とするのかと尋ねるようなものです。それなしで成功することは可能ですか?承知しました。一緒に行けば、それはあなたをもっと悪いものにするでしょうか?もちろんです。
やや複雑な答え-数学者とプログラマーが「解決策」という単語を使用する場合(つまり、問題はnot方程式-つまり「根」ではない)-それらはほとんど同じことを意味します。数学の問題を解くことを学ぶことは、プログラミングの問題を解くことを学ぶのに役立ちます。
ところで-誰にでも意図的な攻撃はありません-彼/彼女が良いプログラマであると言いますが、彼/彼女が数学が嫌いな人はビッグファット・ライアーです。何が起こったのかというと、彼らは悪いhsや大学のインストラクターによって正式な数学をやめてしまい、それ以来、彼らは「数学が得意ではない」と感じています。学習障害のない人(つまり、OO言語)を学べる人)は、2年生までのすべてが可能です。