似乎传统的观点表明,好的程序员也擅长数学。或两者之间存在内在联系。我读过的许多编程书籍都提供了许多示例来解决数学问题,或者以某种方式与数学相关,就好像这些示例对大多数人来说是有意义的。
因此,我想提出的问题是:要成为一名优秀的程序员,您是否必须精通数学?
似乎传统的观点表明,好的程序员也擅长数学。或两者之间存在内在联系。我读过的许多编程书籍都提供了许多示例来解决数学问题,或者以某种方式与数学相关,就好像这些示例对大多数人来说是有意义的。
因此,我想提出的问题是:要成为一名优秀的程序员,您是否必须精通数学?
Answers:
我认为这取决于您要执行哪种编程。就作为商业世界中的程序员而言,我会说答案是否定的。您可以在不了解高级数学的情况下成为一名出色的程序员。当您最终不得不处理数学时,通常在业务需求中定义公式,因此仅需在代码中实现即可。
另一方面,如果您想成为低级程序员或创建3D图形引擎,则数学将发挥巨大作用。
我不赞成,是的,你需要数学思维。大多数人认为数学是在做算术或记住奥术公式。这就像在询问您是否需要完美的拼写或非凡的词汇才能成为一名优秀的作家。
写作是关于沟通,数学/编程是关于清晰逻辑思考的过程(以不会犯错误的方式;等式不平衡,或者程序不编译)。具体来说,这种逻辑思维体现在:
因此,我要说的是,您需要一种数学思维方式,能够构造和操纵程序正在执行的思维模型,而不是事实和定理的集合。诸如图形或数据库之类的某些字段也会具有您需要的某些事实,但是对我而言,这并不是“擅长数学”的本质。
编程有许多不同的领域,其中许多领域不需要特别高的数学知识水平。您将永远无法编写3D引擎,但是您一定能够开发业务和Web应用程序。让我们面对现实-在大多数计算机程序中,最常见的数学运算是将数字加1。
我会很高兴地承认我从来没有特别喜欢数学或擅长数学(我实际上毕业于英语文学专业!),并且已经作为专业开发人员工作了12年以上。我主要开发Web应用程序,很少需要那么多数学。更重要的是具有逻辑思维能力,能够将问题分解为多个部分并具有对所涉及的各种技术和框架的广泛理解的能力。
作为一个程序员,你更可能有实施的现有算法比设计一个完全新的一个。需要算出复利吗?您无需自己弄清楚,只需查找公式并应用即可。大多数问题已经解决,您只需要知道如何以选择的语言来实施解决方案即可。这并不是说擅长数学不是优势。只是这并不完全必要。
当我在80年代中期上学的家庭计算机不太普及时,我经常编写程序来解决数学作业。我常常无法做到,但是我可以应用任何需要的公式作为软件例程。您无需成为另一位毕达哥拉斯就可以算出直角三角形的最长边,您只需要能够使用a² + b² = h²
所选语言进行编码即可。
您不必精通数学。但是,您必须精通逻辑和解决问题的能力。但是,擅长逻辑和解决问题的人通常也擅长数学。我要说的是,这实际上取决于数学的类型。您可能对微积分(像我一样)感到可怕,而仍然是一个优秀的程序员(像我一样)。但是,如果您对离散数学和集合论感到困难,则可能会发现很多编程方面的工作很困难。
我认为重要的一点是,仔细研究为什么您不喜欢数学。
对学科学科的不喜欢通常是在学校发生的事情,可能是由于与老师发生某种形式的冲突,对自己的学科能力缺乏信心或同伴小组的压力。
编程!=数学。对我来说,它甚至不像数学那样“感觉”(尽管我在数学学习的最后阶段做得还不错,但我很喜欢数学)。您可能在数学中使用的许多技能是有用的,即使在编程中也是必需的,但是许多程序员在很大程度上会自学。在学校不喜欢数学对您的编程能力或编程乐趣几乎没有任何影响。
数学与程序设计紧密相关,因为数学实际上是人与计算机之间的通用语言。您不需要了解许多高级编程的数学知识,因为很多数学知识都是在幕后的,但是它有助于理解许多更高级的编程概念。如果您打算进行更多的底层编程(系统或设备编程),那么您将需要了解更多的数学知识。
“喜欢”和“胜任”是完全不同的东西-只要您有适当的计算能力,我就看不出您为什么必须喜欢数学的原因。
但是,这里要绝对清楚-程序设计在数学上有很强的基础,迟早几乎所有非平凡的开发都将涉及计算-您不能从中躲藏。
任何编程都涉及逻辑(数学的基础),大多数现代编程都可能涉及涉及集合论的事物(例如SQL)(即使它不是很明显),并且如果不这样做,则很可能是您陷入困境更加明确地基于数学的领域(例如游戏编程)(渲染-数学,AI->概率和随机性-数学...)等等。
上面的结果是,您必须对数字感到满意-当然,您必须明白为什么“世界上有10种类型的人,懂二进制的人和不懂二进制的人”很有趣。但是您可能会原谅“ 2 + 2 = 5 ...对于非常大的2值”。
老实说,我在学校是个可怕的数学学生。代数当时完全超出了我,我认为自己的D没什么比这更高的。
但是,几年后,在担任专业软件开发人员之后,我回到大学学习了代数课程。令我惊讶的是,这是我上过的最简单的一门课,而且我得到了A。
事实是,编程教会了我代数,因为实际上所有事物都只是代数表达。
所以不,您不需要启动它。它有帮助,但不是必需的。软件开发作为一种数学教学方法的美丽之处在于,编译器,调试器和执行程序是验证您答案是否正确的绝妙方法。在这方面,调试尤其是学习的一大福音,因为您可以单步执行代码并观察算法评估的每一步。
我已经看到这个话题来回争论。我曾与那些拥有数学学位的人合作过,他们认为他们可以编程,并且在一两年内可以改变职业。我有幸与之合作的最好的程序员之一,拥有生物化学博士学位,从未在学校上过正规的编程/ CS课,而是自学成才,并创办了一家成功的软件公司!
最终,对优秀的程序员有益的是一个能够理解逻辑,工作流,能够通过示例学习并愿意研究解决方案的人。另外,您必须学习您的应用程序所针对的业务。我讨厌程序员,他们不懂会计,却编写会计应用程序。他们总是做出错误的假设,并确实减慢了发展速度。
您会发现,无论您上哪所学校,一年内放学后的学习都比四年中学到的要多。学校教您如何学习基本技能-但是随着时间的流逝,现实世界中的经验将变得更加有价值。
经验是最好的老师,只要您将数学应用到软件开发中,只要您学习业务,就可以了。另外,请记住,就像之前的文章所述,除非您尝试使用3D图形引擎或GIS应用程序等图形坐标系,否则,您真正需要的就是通过高中学习的数学。
我曾经从事过会计和计费系统的工作,而不必为处理总帐或允许输入数据而弄清楚Log(x),SIN,COS等。老化期刊不是“高数学”,而是评估AP问题的关键。
仔细想想,我从来没有在他们的办公桌上遇到过一个会计科学计算器的会计师!
您必须学习数学或创建自己的数学。无论哪种方式,以某种形式或另一种方式擅长都是很重要的。
只要您可以使用价值观并理解它们的作用,原因以及您可以使它们发挥作用,那么传统的数学可能就不一定总是必要的。有时它甚至会妨碍您。
除了数字以外,还有其他可视化字节值的方法,但它们绝对是考虑最多的方法。例如,编写一个将所有值都考虑为颜色的程序是可行的。
如今的编程从能够将1和0表示为不同类型的数据中获得了很多价值。尽管实际上1和0根本不是数字,但是电波长发生了变化,但是数学并没有像物理学那样起作用,但是,...对于理解大量的东西非常重要。其他程序员说和编码。
仍然有可能成为一个没有数学的优秀程序员,无论多么困难。
我刚刚完成了离散数学的入门课程,发现由于编程,我几乎已经了解了谓词逻辑的所有知识。语法是新的,它基本上只是与布尔值一起使用。
简而言之:也许您不必显式地学习数学,但是仅仅通过成为一名程序员,您就可能在没有意识到的情况下学习了一些数学。也就是说,通过成为“优秀程序员”,您实际上也成为了数学家(在某种程度上)。
该柯里-霍华德同构说明我的意思:基本上,它指出数学证明和某些计算机程序是“同构”,也就是说,它们是写同样的事情不同的方式。当然,它实际上比这更复杂,但是我不是数学家,所以这是我能给出的最佳解释。希望它不会太远了。
总之,不仅CS和编程的许多领域都涉及大量数学,而且即使基本的编程思想(例如布尔值)也基本上是伪装的数学。
这是一个很难回答的问题,可能会引起很多争论。
这个问题之所以如此困难的原因之一是,它部分取决于您所从事的工作类型。大多数业务应用程序不涉及很多数学,因此您可以对代数和业务数学有深入的了解。但是,更高级的应用程序要求更高级的数学,您开始需要对微积分,线性代数等有扎实的理解。
但是,这只是方程式的一部分,因为您仍然需要一定程度的数学才能进行编程本身的练习。不用说,您需要熟悉逻辑才能编写基本程序和基本代数。尽管您需要了解离散数学的某些方面,才能使基本程序正常运行,但是才能确定什么是使好的算法用于给定问题的原因。
回到问题的核心。我个人认为您不需要成为一名数学家就可以成为一名优秀的程序员。但是,我确实认为您需要熟悉数学才能成为一名优秀的通才程序员。
当然是。
甚至运行工厂业务编程也需要一些数学技能。
工厂运行业务编程需要数据库技能。成为一名优秀的数据库程序员,需要了解数据库的工作方式,以及查询处理器在翻译查询时使用的算法。如果不了解限制和导数(或者甚至不了解行y = x与行y = x ^ 2两次相交的基本理解),则无法准确比较散列匹配内部联接查询计划与嵌套循环联接查询计划。
同样,一个好的程序员只要研究一点,就可以在任何领域工作:游戏,模拟,嵌入式开发,编译器,操作系统,Web东西,数据库等。能够做所有这些事情(或更多)准确地能够快速学习如何做所有这些事情)需要相当数量的数学背景。
我想说的是,我应该在某些时候具备以下经验:
我一直认为编程只是数学而已。
它看起来不像是高中代数。
数学知识对某些应用程序(例如游戏,人工智能,计算机图形等)很有用,但是数学可以教给您除公式或复杂方程式之外的内容。
学习数学就像学习新的编程语言一样。实际上,编程是应用数学的。当您学习一种新语言时,您会学到很多东西,这些都使您成为一名更好的程序员。数学并没有什么不同,但是,如果您真正掌握数学,即使您在工作中不使用高级数学,也将永远成为一名更好的程序员。
原因很简单:数学教您用另一只眼睛看世界。它教您无需编程即可使用不同的方法解决问题。这种新的思维方式无疑会引导您找到更好的工作方式。
编程是一门艺术。数学是一门艺术。如果将两者结合起来,您将成为更好的艺术家。
我要说的是,您绝对不需要擅长数学就可以成为一名优秀的程序员。
我作为程序员的第一份工作是为B-52和Cruise Missile任务计划进行3D图形处理。这是一个数学密集型的应用程序,但实际上我只需要访问数学上很好/很好的人即可。我不需要知道用于计算两点之间较大圆弧距离的公式。我确实需要知道如何转换公式,以便它可以在编程语言中使用。飞行模拟也一样。波音做了所有我们只需要应用的数学运算。
这段经历还帮助我了解了谁将成为一个好的程序员,而谁却不是。这项工作使飞行员和航海家担负起程序员的职责,并帮助程序员理解任务的需求。您通常可以在几周内告诉您哪些飞行员和航海家会擅长于此。数学专业的学生通常会立即着手编程。
所以我想说,擅长数学会使您更有可能擅长编程,但是我知道很多擅长数学的优秀程序员。
不喜欢数学的人有可能成为优秀的程序员吗?
不,不,不,是,不!
不,因为经常需要它。
(! (a | (! (b && c) || d) && (! e)))
为什么不起作用?
foo ('a', 'b', 19, g(h))
bar ('c', 'd', 44)
可以用更抽象的方式重写吗?
968毫秒是大于还是小于0.7秒?您需要多少MB,机器需要多少Ghz,一个字节就足够了-数学是日常工作的一部分。有时是明确而又高级的数学。
总是隐式降低数学。
数学是一个广阔的领域,从计算到矩阵,再到几何,逻辑,统计,类别理论,图论。因此,如果您认为自己在不使用数学的情况下进行编程-也许您错了。
如果您在Project Euler页面上查看问题,您会发现困惑,我不知道如何使用数学来解决它。(并不是说我不用数学就可以解决它们。)请注意,问题的大小通常是如此之大,您无法用蛮力解决它们。
但是-由于我无法解决其中的许多问题(目前大约是2/3),这是否意味着我不喜欢数学?
如果您不学习数学,那么您可能不知道在哪里可以找到日常生活的数学,包括编程。
即使您只是专门致力于在屏幕上移动GUI组件以使其看起来不错,您还是在以某种方式进行数学运算。