`
liudaoru
  • 浏览: 1578682 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

数学能力对于编程工作者有很大影响[z]

阅读更多
  可能有很多朋友在网上看过google公司早几年的招聘广告,它的第一题如下了:{first 10-digit prime found in consecutive digits e}.com,e中出现的连续的第一个10个数字组成的质数。据说当时这个试题在美国很多地铁的出站口都有大幅广告,只要正确解答了这道题,在浏览器的地址栏中输入这个答案,就可以进入下一轮的测试,整个测试过程如同一个数学迷宫,直到你成为google的一员。

  又如Intel某年的一道面试题目:巴拿赫病故于1945年8月31日。他的出生年份恰好是他在世时某年年龄的平方,问:他是哪年出生的?这道看似很简单的数学问题,你能不能能快地解答呢?

  下面则是一道世界第一大软件公司微软的招聘测试题:中间只隔一个数字的两个素数被称为素数对,比如5和7,17和19,证明素数对之间的数字总能被6整除(假设这两个素数都大于6),现在证明没有由三个素数组成的素数对。这样的试题还有很多很多,这些题目乍初看上去都是一些数学问题。但是世界上一些著名的公司都把它们用于招聘测试,可见它们对新员工数学基础的重视。数学试题与应用程序试题是许多大型软件公司面试中指向性最明显的一类试题,这些试题就是考察应聘者的数学能力与计算机能力。

  某咨询公司的一名高级顾问曾说:微软是一家电脑软件公司,当然要求其员工有一定的计算机和数学能力,面试中自然就会考察这类能力。微软的面试题目就考察了应聘人员对基础知识的掌握程度、对基础知识的应用能力,甚至暗含了对计算机基本原理的考察。所以,这样的面试题目的确很“毒辣”,足以筛选到合适的人。

  四川大学数学学院的曹广福教授曾说过:“一个大学生将来的作为与他的数学修养有很大的关系”。大学计算机专业学生都有感触,计算机专业课程中最难的几门课程莫过于离散数学、编译原理、数据结构,当然像组合数学、密码学、计算机图形学等课程也令许多人学起来相当吃力,很多自认为数据库学得很好的学生在范式、函数依赖、传递依赖等数学性比较强的概念面前感到力不从心,这些都是因为数学基础或者说数学知识的缺乏所造成的。

  数学是计算机的基础,这也是为什么考计算机专业研究生数学都采用最难试题(数学一)的原因,当然这也能促使一些新的交叉学科如数学与应用软件、信息与计算科学专业等飞速发展。许多天才程序员本身就是数学尖子,众所周知, BillGates的数学成绩一直都很棒,他甚至曾经期望当一名数学教授,他的母校——湖滨中学的数学系主任弗雷福?赖特曾这样谈起过他的学生:“他能用一种最简单的方法来解决某个代数或计算机问题,他可以用数学的方法来找到一条处理问题的捷径,我教了这么多年的书,没见过像他这样天分的数学奇才。他甚至可以和我工作过多年的那些优秀数学家媲美。当然,比尔也各方面表现得都很优秀,不仅仅是数学,他的知识面非常广泛,数学仅是他众多特长之一。”。影响一代中国程序人的金山软件股份有限公司董事长求伯君当年高考数学成绩满分进一步说明了问题。很多数学基础很好的人,一旦熟悉了某种计算机语言,他可以很快地理解一些算法的精髓,使之能够运用自如,并可能写出时间与空间复杂度都有明显改善的算法。

  程序设计当中解决的相当一部分问题都会涉及各种各样的科学计算,这需要程序员具有什么样的基础呢?实际问题转换为程序,要经过一个对问题抽象的过程,建立起完善的数学模型,只有这样,我们才能建立一个设计良好的程序。从中我们不难看出数学在程序设计领域的重要性。算法与计算理论是计算机程序设计领域的灵魂所在,是发挥程序设计者严谨,敏锐思维的有效工具,任何的程序设计语言都试图将之发挥得淋漓尽致。

  程序员需要一定的数学修养,不但是编程本身的需要,同时也是培养逻辑思维以及严谨的编程作风的需要。数学可以锻炼我们的思维能力,可以帮助我们解决现实中的问题。可以帮助我们更高的学习哲学。为什么经常有人对一些科学计算程序一筹莫展,他可以读懂每一行代码,但是却无法预测程序的预测结果,甚至对程序的结构与功能也一知半解,给他一个稍微复杂点的数学公式,他可能就不知道怎么把它变成计算机程序。很多程序员还停留在做做简单的MIS,设计一下MDI,写写简单的Class或用SQL语句实现查询等基础的编程工作上,对于一些需要用到数学知识的编程工作就避而远之,当然实现一个累加程序或者一个税率的换算程序还是很容易的,因为它们并不需要什么高深的数学知识。

  一名有过10多年开发经验的老程序员曾说过:“所有程序的本质就是逻辑。技术你已经较好地掌握了,但只有完成逻辑能力的提高,你才能成为一名职业程序员。打一个比方吧,你会XXXXX般武艺,刀枪棍棒都很精通,但就是力气不够,所以永远都上不了战场,这个力气对程序员而言就是逻辑能力(其本质是一个人的数学修养,注意,不是数学知识)。”

  程序员的数学修养不是一朝一夕就可以培养的。数学修养与数学知识不一样,修养需要一个长期的过程,而知识的学习可能只是一段短暂的时间。下面是一些我个人对于程序员怎么样提高与培养自己的数学修养的基本看法。

  首先,应该意识到数学修养的重要性。作为一个优秀的程序员,一定的数学修养是十分重要也是必要的。数学是自然科学的基础,计算机科学实际上是数学的一个分支。计算机理论其实是很多数学知识的融合,软件工程需要图论,密码学需要数论,软件测试需要组合数学,计算机程序的编制更需要很多的数学知识,如集合论、排队论、离散数学、统计学,当然还有微积分。计算机科学一个最大的特征是信息与知识更新速度很快,随着数学知识与计算机理论的进一步结合,数据挖掘、模式识别、神经网络等分支科学得到了迅速发展,控制论、模糊数学、耗散理论、分形科学都促进了计算机软件理论、信息管理技术的发展。严格的说,一个数学基础不扎实的程序不能算一个合格的程序员,很多介绍计算机算法的书籍本身也就是数学知识的应用与计算机实现手册。

  其次,自身数学知识的积累,培养自己的空间思维能力和逻辑判断能力。数学是一门分支众多的学科,我们无法在短暂的一生中学会所有的数学知识,像泛函理论、混沌理论以及一些非线性数学问题不是三五几天就可以掌握的。数学修养的培养并不在与数学知识的多少,但要求程序员有良好的数学学习能力,能够很快地把一些数学知识和自己正在解决的问题联系起来,很多理学大师虽然不是数学出身,但是他们对数学有很强的理解能力和敏锐的观察力,于是一系列新的学科诞生了,如计算化学、计算生物学、生物信息学、化学信息学、计算物理学,计算材料学等等。数学是自然学科的基础,计算机技术作为理论与实践的结合,更需要把数学的一些精髓融入其中。从计算机的诞生来看它就是在数学的基础上产生的,最简单的0、1进制就是一个古老的数学问题。程序设计作为一项创造性很强的职业,它需要程序员有一定的数学修养,也具有一定的数学知识的积累,可以更好地把一些数学原理与思想应用于实际的编程工作中去。学无止境,不断的学习是提高修养的必经之路。第三,多在实践中运用数学。有些高等学校开设了一门这样的课程——《数学建模》。我在大学时期也曾学过,这是一门内容很丰富的课程。它把很多相关的学科与数学都联系在一起,通过很多数学模型来解决实际的生产生活问题,很多问题的解决需要计算机程序来实现。我在大学和研究生阶段都参加过数学建模竞赛,获得了不少的经验,同时也进一步提高了自己的数学修养。实际上,现在的程序设计从某些角度来看就是一个数学建模的过程,模型的好坏关系到系统的成败,现在数学建模的思想已经用于计算机的许多相关学科中,不单只是计算机程序设计与算法分析。应该知道,数学是一门需要在实践中展示其魅力的科学,而计算机程序也是为帮助解决实际问题而编制的,因此,应该尽量使它们结合起来,在这个方面,计算机密码学是我认为运用数学知识最深最广泛的,每一个好的加密算法后面都有一个数学理论的支持,如椭圆曲线、背包问题、素数理论等。作为一名优秀的程序员,应该在实际工作中根据需要灵活运用数学知识,培养一定的数学建模能力,善于归纳总结,慢慢使自己的数学知识更加全面,数学修养得到进一步提高。

  第四,程序员培养制度与教学的改革。许多程序员培养体制存在很多缺陷,一开始就要求学员能够快速精通某种语言,以语言为中心,对算法的核心思想与相关的数学知识都一笔带过,讲得很少,这造成很多程序员成为背程序的机器,这样不利于程序员自身的快速成长,也不利于程序员解决新问题。我在长期的程序员培训与计算机教学工作采用了一些与传统方式不一致的方法,收到了一定的效果。很多初学程序的人往往写程序时有时候会有思维中断,或者对一些稍难的程序觉得无法下手,我采用了一些课前解决数学小问题的方法来激励大家的学习兴趣,这些小问题不单单是脑筋急转弯,其中不少是很有代表意义的数学思考题。通过数学问题来做编程的热身运动,让学员在数学试题中激发自己的思维能力,记得有位专家曾经说过,经常做做数学题目会使自己变聪明,很长时间不去接触数学问题会使自己思维迟钝。通过一些经典的数学问题来培养学员的思维的严谨性和跳跃性。很多人可能不以为然,其实有些看似简单的问题并不一定能够快速给出答案,大脑也在不断的运用中变更加灵活的。不信吗?大家有兴趣可以做做下面这道题目,看看能不能在1分钟之内想到答案,这只是一道小学数学课后习题。很多人认为自己的数学基础很好,但是据说这道题目90%以上的人不能在一个小时内给出正确答案。

  证明:AB+AC>DB+DC(D为三角形ABC的一个内点)。

  最后,多学多问,多看好书,看经典。我在这里向大家推荐两部可能大家已经很熟悉的经典的计算机算法教材,它们中间很多内容其实就是数学知识的介绍。第一部是《算法导论》,英文名称:Introduction to Algorithms,作者:Thomas H. Cormen,Charles E. Leiserson ,Ronald L. Rivest ,Clifford Stein。本书的主要作者来自麻省理工大学计算机,作者之一Ronald L.Rivest由于其在公开秘钥密码算法RSA上的贡献获得了图灵奖。这本书目前是算法的标准教材,美国许多名校的计算机系都使用它,国内有些院校也将本书作为算法课程的教材。另外许多专业人员也经常引用它。本书基本包含了所有的经典算法,程序全部由伪代码实现,这更增添了本书的通用性,使得利用各种程序设计语言进行程序开发的程序员都可以作为参考。语言方面通俗,很适合作为算法教材和自学算法之用。另一部是很多人都应该知道的Donald.E.Knuth所著《计算机程序设计艺术》,英文名称:The Art of Computer Programming。

  Donald.E.Knuth人生最辉煌的时刻在斯坦福大学计算机系渡过,美国计算机协会图灵奖的获得者,是本领域内当之无愧的泰斗。有戏言称搞计算机程序设计的不认识Knuth就等于搞物理的不知道爱因斯坦,搞数学的不知道欧拉,搞化学的不知道道尔顿。被简称为TAOCP的这本巨著内容博大精深,几乎涵盖了计算机程序设计算法与理论最重要的内容。现在发行的只有三卷,分别为基础运算法则,半数值算法,以及排序和搜索(在写本文之际,第四卷已经出来了,我也在第一时间抢购了一本)。本书结合大量数学知识,分析不同应用领域中的各种算法,研究算法的复杂性,即算法的时间、空间效率,探讨各种适用算法等,其理论和实践价值得到了全世界计算机工作者的公认。书中引入的许多术语、得到的许多结论都变成了计算机领域的标准术语和被广泛引用的结果。另外,作者对有关领域的科学发展史也有深入研究,因此本书介绍众多研究成果的同时,也对其历史渊源和发展过程做了很好的介绍,这种特色在全球科学著作中是不多见的。至于本书的价值我觉得BillGates先生的话足以说明问题:“如果你认为你是一名真正优秀的程序员读Knuth的《计算机程序设计艺术》,如果你能读懂整套书的话,请给我发一份你的简历”。作者数学方面的功底造就了本书严谨的风格,虽然本书不是用当今流行的程序设计语言描述的,但这丝毫不损伤它“程序设计史诗”的地位。道理很简单,它内涵的设计思想是永远不会过时的。除非英语实在有困难,否则建议读者选用英文版。
分享到:
评论

相关推荐

    scau 数学建模课件.7z

    8. **竞赛准备**:很多高校会组织数学建模竞赛,如美国大学生数学建模竞赛(MCM/ICM)。课件可能包含针对此类竞赛的策略指导,如时间管理、选题策略等。 通过"SCAU数学建模课件"的学习,学生不仅可以提升数学素养,还...

    数学建模MATLAB必备程序源代码.7z

    这个名为"数学建模MATLAB必备程序源代码.7z"的压缩包很可能是为帮助用户在MATLAB中进行数学建模工作而准备的一系列源代码示例。这些源代码可能涵盖了各种常见的数学模型,如线性规划、非线性优化、微分方程求解、...

    matlab数学建模手册

    本书的核心内容涵盖了高等数学、数值分析、函数作图、线性代数、概率统计和优化理论等领域,这些内容对于理工科学生及科技工作者的学习和研究有着重要意义。通过大量例题的引入,读者可以迅速掌握MATLAB的运算技巧。...

    2023美赛Z题记录.zip

    通过学习和分析2023美赛Z题记录,无论是参赛者还是对此感兴趣的读者,都能从中了解如何应用数学模型解决实际问题,提升自身的数学建模能力,并且可以借鉴他人的思路和方法,为未来的竞赛或研究提供参考。

    acm数学方法学习笔记

    这份“acm数学方法学习笔记”很可能是为了帮助参赛者或编程爱好者深入理解并掌握这些方法。以下是根据标题、描述和标签提炼出的一些核心知识点: 1. **基础数学知识**:在ACM中,基础数学概念如数论、组合数学、...

    数控线切割编程技术课件.pptx

    例如,在处理与轴重合的直线时可以简化编程,有时甚至可以省略坐标值和分隔符,以减少编程工作量。这些技巧的应用,不仅能够提高编程效率,还能确保最终加工的精确性。 深入学习和实践数控线切割编程技术,对于提升...

    2022年数控编程基础知识介绍(共21张PPT).pptx

    然而,手工编程的缺点也很明显,对于复杂的自由曲面或型腔零件,计算工作量大,容易出错,校对困难,甚至有些情况下无法完成。 自动编程,特别是图形交互式编程,通过计算机辅助设计(CAD)和计算机辅助制造(CAM)...

    数学建模资料

    学习数学建模不仅能够提升数学应用能力,还能培养逻辑思维、问题解决和团队协作的能力,对于理工科学生及科研工作者来说是非常有价值的一项技能。通过深入研究这个压缩包中的资料,相信你能在数学建模的道路上取得更...

    四川省眉山市东坡区多悦高级中学2020-2021学年高二下学期期中考试数学(文)试题 Word版含答案.docx

    程序框图是算法逻辑的可视化表达,通过对程序流程的分析,学生可以更加直观地理解算法的运行机制,这对于编程学习和逻辑思维训练都有很大的帮助。 概率计算题目要求计算特定区间内随机数平方和的概率。这不仅考察了...

    用Maple和MATLAB解题.7z

    这样的资源对于学生、教师或研究人员来说非常有价值,他们可以学习如何利用这些工具来提高工作效率,理解并解决复杂的数学问题。 文件列表中的“用Maple和MATLAB解题.pdf”很可能包含了具体案例、步骤说明和代码...

    易语言源码压缩文件夹.7z

    对于初学者,这个压缩包是一个很好的学习资源,可以从中学习到易语言的基础知识和编程实践。对于经验丰富的开发者,这些源码可以作为参考,借鉴其中的优秀设计和解决问题的方法。无论是为了学习还是工作,深入研究...

    易语言源码模块集.7z

    易语言的源码模块集对于学习者和开发者来说是一份宝贵的资源,它不仅可以帮助初学者快速掌握编程基础,也能为有经验的程序员提供现成的代码片段,节省开发时间。通过深入研究和实践这些模块,可以不断提升编程技能,...

    易语言源码多功能模块(1).7z

    "易语言源码多功能模块(1).7z"是一个压缩包文件,其中包含了一系列用易语言编写的源代码模块,这些模块可能包含了各种功能,用于扩展易语言程序的能力。 首先,我们要理解“源码”的概念。源码是程序员用编程语言...

    易语言源码控件自动缩放.7z

    易语言是一种专为中国人设计的编程语言,它以简体中文作为编程语句,降低了编程的门槛,使得更多非计算机专业的人也能...对于初学者,这是一个很好的学习实例,可以深入理解控件管理和屏幕适配的概念,提升编程技能。

    STM32F407ZGT6最小系统2.rar

    在这个"STM32F407ZGT6最小系统2.rar"压缩包中,我们很可能是找到了围绕这款微控制器构建的电路板设计资料。 1. **STM32F407ZGT6特性**: - ARM Cortex-M4内核,工作频率高达180MHz,具有浮点单元(FPU),支持快速...

    易语言字符解释器源码.7z

    易语言是一种专为初学者设计...这不仅有助于提升编程技能,对于想要构建自己的解释器或者虚拟机的人来说,也是一个很好的实践项目。在学习过程中,可以尝试修改源码,添加新的功能,以加深对字符解释器工作原理的理解。

    2012数学建模3D机房建模(黑龙江工程学院).pdf

    在提供的文档片段中,我们可以提取到一系列与数学建模、仿真软件以及编程语言相关的知识点。本文将结合文档内容对知识点进行详细说明。 ### 数学建模与仿真软件应用 1. **Phoenix/Fluent软件应用** 文档中提到了...

    计算机图形学 Z-Buffer隐面算法 孔令德 答案 代码

    在这个压缩包中,"案例39-Z-Buffer隐面算法"很可能包含了孔令德对于Z-Buffer算法的具体实现,包括相关的数学公式、算法步骤以及C++或OpenGL等编程语言的代码示例。 Z-Buffer算法的实现通常涉及以下步骤: 1. **...

    易语言进度百分比例程.7z

    易语言是一种专为中国人设计的编程...综上所述,"易语言进度百分比例程.7z" 提供的示例将涵盖多方面的编程概念,对于初学者来说,通过学习这个示例,可以更好地掌握易语言的事件处理、界面编程以及进度控制等核心技能。

Global site tag (gtag.js) - Google Analytics