数学专业出身的程序员,分享数学对编程的重要性

棋牌游戏开发 10个月前 127浏览 0评论

【CSDN编者按】作者在大学期间受到《程序员》杂志的启发,从数学专业开始投身计算机编程。毕业后进入软件开发行业,9年来曾在大公司写代码,也在创业公司带过团队,一直从事“下一代”软件技术的研发。对于网上热议的“数学对程序员到底有多重要”话题,他也有自己的看法。

作者 | 范飞龙 编辑| 侯淼淼

出品 | CSDN(ID:CSDNnews)

数学对于程序员来说有多重要?

我学的是数学专业,大四的时候偶然接触到了《程序员》杂志,给了我很大的启发。从杂志和之后编程学习中看的很多技术书籍中,我逐渐发现编程是一件极具创造力的事情,程序员甚至可以用技术改变世界。从此,我就被编程深深吸引了。可以说《程序员》杂志是我编程路上的启蒙导师。后来我到学校的计算机专业“上课”,当时一个计算机图形学老师的课很有意思,除了教授编程技术,还普及了很多一流IT公司的技术,很早就和我们讨论选人、眼光等问题,对我影响很大。于是大四和研究生期间,我一边做数学研究,一边做了很多软件项目。因为数学和编程在一定程度上是互通的,所以在如何写好程序上,我并没有遇到太多的困难,但软件开发有它自己的内在规律,需要付出很多的努力。 在实践和向大师学习中,我逐渐领悟了软件开发的规律和本质。

网上曾有关于“数学不好的程序员能走多远”的讨论,很多网友参与了讨论,有人说数学不好的程序员永远成不了架构师,也有人说程序员可能一辈子都用不到数学。其实,不管哪种观点,最终的结论都是很片面的。

数学或者算法重要与否,其实取决于你从事的是什么类型的项目。比如区块链和密码学就息息相关,密码学背后是抽象代数和数论的知识,不懂数学就无法很好地理解它;人工智能中的深度学习与微积分中的多变量链式导数法则、曲线曲面拟合、函数逼近等数学理论息息相关;游戏开发要求程序员除了掌握计算几何相关的知识外,还需要掌握一些物理知识;数据冗余存储相关的编解码算法,本质上可能都是矩阵计算,需要线性代数的知识。通过这些例子,我们可以看出,普通理工科至少要修读高等数学/线性代数/概率论与统计的课程,是非常重要的。但是如果你是做前端开发,需要把控复杂的框架和组件以及模块化;UX设计需要设计语言; 后端数据库的增删改查需要理解数据之间的关系,并能设计出一套API,这些都和具体的数学知识没有直接联系。另外实际编程中还有大量的工程问题需要解决,需要解决问题的能力和对工程的理解。所以数学对程序员是否重要,取决于你做的事情是否和数学有直接联系。另一方面,在分析问题的过程中,能否善于利用集合和坐标的方法对问题进行基本划分,也是是否有数学思维的体现。

很多人说新手和高手的差距主要体现在数学上,其实准确的说体现在逻辑能力和抽象能力上。在日常开发工作中,最简单的逻辑就是能不能把程序的逻辑表达清楚,比如能不能把一个函数写清楚、一个类写清楚、一个模块写清楚、一个服务写清楚,甚至一份文档写清楚。要训练逻辑思维,可以多看一些对程序员写好程序有帮助的书籍,比如《程序员修炼之道——从小工到专家》,可以帮助程序员提升工程素养和品味;《构造方法(第3版)》系统深入的介绍了软件工程的原理,了解了从个人开发、结对编程到团队协作的不同层次,如何做出创新产品等;《图解密码学(第3版)》可以培养程序员深入算法和数学细节的能力。作为一个程序员,除了了解密码学的基本原理,能否完整地读完这样的书,并清楚理解其中的细节,也是一项有效的锻炼。 从日常的程序开始,在实践中不断尝试运用这些方法来改善软件开发的流程,是一个循序渐进的过程,但只要坚持,就一定会看到成果。

除了上面提到的书籍,在校期间订阅《程序员》杂志也给了我很大的帮助。总的来说,这里的文章其实分为两类,一类是非常具体的文章,可以教你如何写出好的程序,另一类是专家和 CTO 分享的观点,给人对编程的理解和启迪。即便是编程,很多人在校期间和工作后做的事情也是完全不一样的。通过这些文章,你可以知道国内大公司都用什么技术框架和流程。很多大学毕业生并没有太多的项目经验,多读一些相关的专业文章和技术杂志,可以最大程度的为你提供经验,尤其是当某种技术是你现在正在做的,你可以有很好的对比。

大公司VS创业公司,如何选择?

博士毕业后,我曾在大型公司和创业公司工作过。对于大多数程序员来说,无论去什么样的公司,重要的是找到合适的人与你一起做你想做的事情。

大公司的好处是体系完整,进公司之后只需要专注于手头的重点工作,解决问题就行,遇到困难也不用担心。大公司通常人才济济,你可以从中学到很多实战经验,成熟的项目机制也能让你体验到专业软件开发的各种流程。但大公司的坏处也很明显,大公司流程比较多,如果不能有意识地去尝试新技术,学习新的框架和工具,就​​可能局限在局部的某个细节上,也就是我们常说的“螺丝钉”状态,看不到软件开发要解决的整体问题是什么。进入大公司的同学最好经常回顾反思自己的工作,经常写技术文档和总结。每隔一段时间,想想自己和刚进公司时相比,做出了哪些贡献,在哪些方面有所成长,继续保持对技术的敏感度,激励自己不断进步。 这里特别强调坚持写好技术文档(博客)。让我印象最深的是,在第一份工作中,我基于一个无法运行的遗留项目,完全重写了可以对接线上系统的网络协议实现,同时提供了非常详细的网络协议文档。之后,我非常注重为每个项目写技术文档,我写是为了更好理解。当你养成一个习惯,它就会像你的肌肉记忆一样自然,久而久之,我们对软件的理解就会大不相同。好的代码和好的文档,对于软件开发来说都很重要。在开始的时候,使用一些模板来帮助自己写好文档是一种有效的练习方式。关于这方面,我之前看过一篇关于Git最佳实践的文章,它的标题就是一种有效的方法:Commit Much, Perfect Later, Publish Once。

创业公司的优势之一就是进公司之后可以参与到软件开发的全过程,快速成长为一个通才。创业公司的软件开发流程比较简单,有时候这也是一个优势。在大公司,你可能有很多试错的机会,但在创业公司游戏软件开发,你必须在有限的时间、有限的资金、有限的人员下,尽可能高效地完成项目的迭代开发。当你自认为掌握了很多软件开发经验和规律的时候,在这种明确限制的场景下开发软件,并有效达成自己的目标,就是一个很好的考验过程。除了软件开发本身,程序员还需要和不同的人打交道,比如你是项目中的甲方还是乙方,需求的频繁变化和不确定性,对软件开发的质量和软件团队的成熟度都会有极大的考验。这些都是软件开发中很重要的一环。在创业公司,你还需要考虑如何从第0个用户开始,逐步获得大量的用户。创业公司在经济上通常要承担比较大的风险。 虽然也有机会获得巨额收益,实现财富自由,但大多数情况下风险大于机会,一件事情需要很多条件才能完成,其实就是一个多个条件的概率问题。

所以如果你是刚毕业的大学生,还没有积累足够的风险承受能力,我还是建议选择大公司,比较稳妥的积累项目经验,在视野上有所成长。但如果你有冒险精神,那么遇到的问题就尽量自己去解决,增加成功的概率。还是那句话:选择和视野。

如何成为一名优秀的程序员

从事软件开发,很重要的一点就是要有良好的学习能力。我也一直在不断学习“旧技术”和新技术。学习一门技术的时候,我们都是从搭建块开始的。这些块是怎么造出来的,可以暂时忽略。用块做了一个应用之后,我们获得了成功的经验。接着,我们开始做第二个应用,依然使用这些块,但是你开始了解这些块的不同特性,并逐渐获得了实践经验。继续下去,你会拆开一个块,看看这个块本身是怎么构造的。第一个要拆开的块可能很简单,但是这个拆开的块是一个重要的切入点。拆开第一个块之后,你就会拆开第二个块,你会发现第二个块和第一个块之间有很多共同的部分,你可能还不知道这些部分是怎么构造的,没关系。于是你继续拆开第三个、第四个块……随着你拆开的块越来越多,你终于知道了这些块的构造原理。 此时,当你在构建应用程序时,如果没有合适的构建块,你会直接用零件制作一个新的构建块。这个构建好的构建块解决了你的问题,并提供了创建成功应用程序的关键组件。此时,你已经完成了学习这套构建块的真正入门。原则上,你可以继续从事这个领域并提供创造性的工作,因为这套构建块在你面前已经是可编程的了。这是我一直以来学习新领域的方式。

另一个有效的方式是针对同一主题进行研究。在研究一个方向时,在一段时间内不断收集相关资料,对同一主题进行频繁的学习、实践和总结。当你专注于一个方向时,你会自动过滤掉技术站点、技术社区中不相关的信息,在一个方向、一条线的学习专区持续学习,参与讨论游戏软件开发,密集吸收知识并实践,不断点亮该领域技能树的节点。其实学习一个新领域和做科研有很多相似之处。

很多人说 35 岁是程序员的转折点,原因之一是软件开发是一个需要年轻的职业。其实这也是一种片面的观点。软件开发有它自己的内在规律,有时候直接在本地堆砌人力确实可以快速取得短期的成果。但是如果我们立志做一流的软件,那么能够深刻理解软件开发的规律,拥有强大的架构和工程能力,能够将技术、经验和洞察结合起来,在不断迭代的软件团队中创造价值,同时实现持续的成长,那么 35 岁可能确实是一个转折点,而且是一个好的转折点。

总的来说,软件开发有它自己的内在规律,不断理解它的内在规律,在实践中迭代,向着做一流软件的目标而奋斗,是我选择的方向。

《新程序员》精彩内容一览

《新程序员》立足行业前沿,深度探索技术未来,通过音视频、图文专栏等丰富的多媒体形式,全方位解读技术与产业,为中国开发者打开新时代的技术之门。

《新程序员001:开发者的黄金十年》内容包括:

现在,会员季卡售价89元,限时优惠58元,包括:

分享:

支付宝

微信