编程需要多少数学?

会数数就行了。

扫码关注《Java学研大本营》,加入读者群,分享更多精彩

每当我想学习算法时,在那里使用的数学似乎是一个障碍。

我承认我的数学不是那么好,但也不是那么差,但是这种“还不错”的知识水平还不足以在与四大面试官的算法水平和时间方面竞争涉及的空间复杂性以及排序和搜索技术的比较。

编程与数学

我需要学习所有这些,并且在那次搜索中,我遇到了几篇关于编程所需的数学的文章。谈到编程,最著名的数学支持者是 Steve Yegge。这是我在编程所需的数学中找到的内容:

  1. Steve Summit 关于数学的笔记(出色的 C-FAQ 的作者) (http://www.eskimo.com/~scs/cclass/mathintro/top.html)

  2. Steve Yegge,他写了两篇文章Math Everyday(https://sites.google.com/site/steveyegge2/math-every-day)和Math for Programmers (http://steve-yegge.blogspot.in/2006/03/math-for-programmers.html)

  3. Eric S. Raymond 谈到成为一名黑客需要多少数学知识(http://www.catb.org/~esr/faqs/hacker-howto.html#mathematics)

  4. 保罗·格雷厄姆谈数学(http://www.paulgraham.com/college.html)

  5. Evan Miller 的文章作为对上述3 位作者的回复(http://www.evanmiller.org/mathematical-hacker.html)

  6. Steven Noble 写了一篇文章作为对 Evan Miller计算斐波那契数的示例的回复(http://blog.noblemail.ca/2013/01/on-calculating-fibonacci-numbers-in-c.html)

编程不是数学

如果您没有阅读以上所有内容,那么您可能会错过我的博客文章的意图。根据 Steve Summit、Eric Raymond 和 Paul Graham 的说法,您无需过多关注数学即可成为出色的程序员、黑客(维基百科定义和 Eric Raymond 关于黑客定义的文章)。史蒂文·诺布尔说你应该学一点数学,埃文·米勒似乎有点同意他们所有人的观点。我自己开始编程只是出于对它的热爱。

自 2009 年以来,我主要使用 C 进行专业编程,有时使用 C++,几乎总是在 Linux 上,有时在 UNIX 上。我对编程的热情使我用许多不同的语言读写代码,在那里我必须学习不同的思维方式。编写代码很容易,按照特定语言建模的范式思路进行思考是一项艰巨、艰巨且非常耗时的任务。我所经历的是:计算机编程不是数学。让我再说一遍,计算机编程不是数学,也永远不会。你想学习计算机编程,然后学习计算机编程。不要翻阅数学书籍,阅读特定新闻组(comp.lang.c,comp.lang.lisp )上的任何内容例如)。使用像 Pan 这样的新闻阅读器:

http://pan.rebelbase.com/

阅读来自 GNU 的所有软件,并将 Linux 发行版专门用于日常任务(我更喜欢二进制 blob 最少的发行版)。如果您因为想学习计算机编程而学习大量数学,那么您会感到困惑并朝着错误的方向前进,并且您不会学到很多编程知识。

作为计算机程序员,我们编写程序,但为什么呢?我们编写程序来解决这个世界的问题。这就是计算机程序员所做的,他们解决问题。

现在数学家做什么?他试图理解自然,并使用数学作为一种语言来做到这一点。数学帮助解决了这个世界的许多问题。看看量子物理学这个物理学的一个分支,它确实改变了我们几千年来对原子的假设,它在很大程度上依赖于数学。数学无处不在,从化学工业到我们使用统计学的社会问题。参加你日常生活的任何部分,你会发现它对我的数学有多么深刻的影响。数学已被用作最突出的工具,不仅可以理解自然,还可以解决这个世界的问题。这是有原因的,所有这些属性都是数学固有的。

我不擅长数学,所以我试图用我的直觉、常识、流程图和更多其他类型的图表来解决我作为程序员每天面临的问题。这种情况持续了几年,我想出了一些规则和想法,我正在根据这些规则和想法建立一个模型来解决问题。建立这个模型有一个目标:非常清楚和非常简短地说明问题是什么,解决方案也是如此。我正在创建一个模型,您将输入一个问题作为输入,它会使用英语、流程图和我创建的许多其他类型的图表生成一个解决方案作为输出。这个模型有一定的假设、规则和条件,这些又是非常清楚的。清晰和简单是议程的重中之重。它是一种用于解决问题的通用抽象机制。现在几个月前,Don't Kill Math这实际上是为了回应Bret Victor的Kill Math 而写的。

这两篇文章对我打击很大。首先,布雷特试图做我几年前一直在尝试的事情,尽管他在制作某些东西方面比我更成功。我永远无法想出任何人都可以使用的可靠模型,而 Bret 已经做到了。我快乐吗,是的,因为我找到了我想要的东西,我准备追随布雷特的脚步,但我从来没有这样做过。为什么?

我永远无法想出一个实体模型是有原因的。总觉得少了点什么。不管我做了什么,做了多少工作,我总是觉得缺少一些非常基础和基本的东西。每当我研究薛定谔方程、麦克斯韦方程、牛顿定律、开普勒定律、不确定性原理或舒尔巴经时,我一直觉得所有这些方程都是完整的,但我的模型却没有。这两篇文章 Kill Math 和 Dont' Kill Math 让我意识到什么是完整性。这就是不要杀死数学中提到的数学的属性。Evan 在本文中提出的问题以及他以非常简单和基本的细节解释的方式,结束了我对模型的搜索。数学是解决问题和理解现象的一种简洁明了的方法。这些残酷的特征是数学所固有的,就像灵魂是每个人所固有的一样。使用数学,您可以用比不使用它更短、更好的方式解决问题。

我为什么讨厌数学?

这让我想到了一个非常基本的问题:我为什么讨厌数学?这是在学校和大学教给我数学的方式。我被教死记硬背,而不是真正的数学。这是学校的错,是我们教育系统的错,不是学生的错。回到我们是否需要数学来成为一个伟大的程序员这个主要问题,这就是世界一开始是如何解决它的问题的:

然后是数学,这是大多数数学家所做的:

这几乎是所有计算机程序员/软件工程师/开发人员所做的:

Evan Miller 说你可以在不使用大量数学的情况下成为一流的黑客,我认为他是对的,这与所有其他作者的观点一致。他强调的一点是数学在解决这个世界问题中的作用,即数学在解决现实世界问题方面非常有效。作为程序员,我们解决问题,但是如果我们使用数学解决问题,然后将编程解决方案应用于解决方案的数学模型,那么我们可以有一些惊人的方法来提供更好的解决方案,这将使我们作为程序员的生活更轻松(有点像副作用):

总结:

  • 你不需要数学就可以成为一流的程序员,因为我们不直接使用很多数学。如果你想成为程序员,那就学习编程。计算机编程与数学有很大不同,作为一名计算机程序员,您必须更多地关注如何编写更好的程序,如何在特定范式中思考(例如函数式、面向对象、通用、过程式、逻辑、声明式等),找到更好的创建软件的方法,你需要了解设计模式,更不用说学习和使用几年的 C 语言会为你的思维增加新的维度。无论如何,所有这些都与数学无关。你需要先学习这些,你需要几年的时间才能掌握它们,然后你可以根据需要学习数学。阅读使用 Emacs Lisp 进行编程的介绍作者 Roberrt J. Chassell 了解如何解决创建可定制、自记录、可扩展的实时显示文本编辑器的问题。阅读GNU Make Manual并找出它为什么需要M4和Autoconf。

  • 数学是了解这个世界的本质和解决问题的最广泛使用的工具。我们可以通过学习数学方法来学习更多解决问题的方法。我自己已经开始研究概率,因为就像史蒂夫耶格所说,一旦你理解了数学,你就可以看看这个问题,看看它是概率问题、微积分问题还是统计问题等等。数学与问题的性质有关,而不是性质对于软件,软件有自己的解决问题的方法和工具,请记住这一点。

推荐书单

1.《项目驱动零起点学Java》

购买链接:https://item.jd.com/13607758.html

《项目驱动零起点学Java》贯穿6个完整项目,经过作者多年教学经验提炼而得,项目从小到大、从短到长,可以让读者在练习项目的过程中,快速掌握一系列知识点。

作者是国内知名Java教学者和传播者,一路披荆斩棘,兢兢业业20余年。积累了丰富的“培”“训”经验,也产出了很多优质的教学理论。

Java语言经过数十年的发展,体系逐渐变得庞大而复杂,本书芟繁就简,提炼出了最为重要的知识点,可以让读者轻松上手。本书配套有专栏课程,课程中提供了扩展内容。

《项目驱动零起点学Java》共分 13 章,围绕 6 个项目和 258 个代码示例,分别介绍了走进Java 的世界、变量与数据类型、运算符、流程控制、方法、数组、面向对象、异常、常用类、集合、I/O流、多线程、网络编程相关内容。《项目驱动零起点学Java》总结了马士兵老师从事Java培训十余年来经受了市场检验的教研成果,通过6 个项目以及每章的示例和习题,可以帮助读者快速掌握Java 编程的语法以及算法实现。扫描每章提供的二维码可观看相应章节内容的视频讲解。

2.《Java编程讲义》

购买链接:https://item.jd.com/13495830.html

《Java编程讲义》根据目前Java开发领域的实际需求,从初学者角度出发,详细讲解了Java技术的基础知识。

全书共15章,包括Java开发入门,Java语言基础,Java控制结构,数组,面向对象编程,继承和多态,抽象类、接口和内部类,异常处理,Java常用类库,集合与泛型,Lambda表达式,输入-输出流,多线程,JDBC数据库技术,网络编程等内容。内容全面覆盖.1ava开发必备的基础知识点,结合生活化案例展开讲解,程序代码给出了详细的注释,能够使初学者轻松领会Java技术精髓,快速掌握Java开发技能。

《Java编程讲义》适合作为高等院校相关专业的教材及教学参考书,也适合作为Java开发入门者的自学用书,还可供开发人员查阅、参考。

3.《HTML5+CSS3+JavaScript从入门到精通》

购买链接:https://item.jd.com/12659883.html

《HTML5+CSS3+JavaScript从入门到精通(微视频精编版 套装共2本)/软件开发微视频讲堂》内容浅显易懂,实例丰富,详细介绍了HTML5+CSS3+JavaScript开发需要掌握的各类实战知识。

全书分为两册:核心技术分册和强化训练分册。核心技术分册共17章,包括HTML,基础、文本、图像和超链接、CSS3概述、CSS3高级应用、表格与标签、列表、表单、多媒体、HTML5新特性、JavaScript基础、绘制图形、文件与拖放、JavaScnpt对象编程、响应式网页设计、响应式组件、课程设计——游戏公园等内容。通过学习,读者可快速开发一些中小型应用程序。强化训练分册共15章,通过大量源于实际生活的趣味案例,强化上机实践,拓展和提升软件开发中对实际问题的分析与解决能力。

精彩回顾

想要代码干净又整洁?这里有十大原则

通过自学成为开发者的 9 种方法

怎么做一个有产品意识的软件工程师?

扫码关注《Java学研大本营》,加入读者群,分享更多精彩

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值