当前位置: 首页 > 编程日记 > 正文

数学很差的人能当程序员吗?

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

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

出品 | CSDN(ID:CSDNnews)

数学对于程序员到底有多重要?

我是数学专业的,大四一个偶然的机会接触到了《程序员》杂志,给了我很大启发。从杂志以及后续学习编程中阅读的很多技术书籍中,我逐渐发现,编程是一件极其富有创造力的事情,程序员甚至能用技术改变世界,从那以后,我就被编程深深地吸引了,可以说《程序员》杂志是我编程路上的启蒙导师。后来我就跑到学校的计算机专业“蹭课”,当时一位计算机图形学老师的课特别有意思,除了教编程技术以外,还会给大家科普很多一流IT公司的技术,很早就跟我们讨论选择,视野这些话题,对我影响很大。所以在大四和研究生期间,我一边做数学方面的研究,一边又做了很多软件项目。因为数学和编程在某些程度上是互通的,所以我在如何写好的程序上并没有遇到太多的困难,但是软件开发有其内在的规律,需要付出的努力一点也不少,我在边实践边和高手学习的过程中逐渐理解到软件开发的规律和本质。

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

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

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

除了上面几本书,在上学期间订阅《程序员》杂志给我的帮助也很大。总的来说,这里面其实有两类文章,一类是很具体的、能教你写出好程序的文章,另一类就是专家、CTO的观点分享,带给人的是对编程的理解和启蒙。同样是编程,很多人在学校和工作后做的事情是截然不同的,通过这些文章就能知道国内大公司用的是什么技术框架和流程。很多刚毕业的大学生并没有太多的项目经验,多看一些相关专业文章和技术杂志能最大程度地为你提供经验加持,特别是某个技术是你当前在做的事情的时候,可以有好的对照。

大厂VS创业公司,怎么选?

博士毕业后我去过大厂,也去过创业公司。对于广大程序员来说,无论是去哪种属性的公司,重要的是找到合适的人和你一起做你愿意做的事情。

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

创业公司的优点之一是你入职后能参与到软件开发的全流程,快速成长为一个多面手,以及创业公司的软件开发流程相对比较简洁,有时候也是一个优势。在大公司你可能会有很多试错的机会,但是在创业公司,你必须要在限定时间、限定资金、限定人员的情况下尽可能高效地完成项目的迭代开发,当你以为掌握了很多软件开发的经验和规律,在这种明确受限情景下开发软件,有效达成目标就是一个很好的检验过程。除了软件开发本身以外,程序员还需要和不同的人去打交道,比如项目中你是甲方还是乙方,需求的频繁变更和不确定性会对软件开发的质量,软件团队的成熟有很大的考验,这些都是软件开发中重要的部分,在创业公司还需要考虑如何从第0个用户开始逐渐获得大批量的用户。在创业公司通常在经济上要承受比较大的风险,虽然它也有获得巨大收益实现财富自由的机会,但大部分情况下,风险大于机遇。做成一些事情需要多方面的条件,实际上也是多个条件的一个概率问题。

所以如果是刚毕业的大学生,在还没有积累足够多抗风险能力的情况下,我还是建议选择大公司,相对稳定地获得项目经验和视野上的成长。但是如果你富有冒险精神,那么就要尽量的解决遇到的问题,增加把事情做成功的概率。还是那个话题:选择与视野。

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

从事软件开发,一个很重要的地方就是要有好的学习能力。我也是一直保持着对“老技术”和新技术不断学习的状态。学习一门技术,一开始我们都是以搭积木的方式进行的,这些积木怎么做的可以先不管。用积木做出一个应用之后,我们就获得了一次成功的经验。接着,我们开始做第二个应用,还是用这些积木,但是你开始理解这些积木的不同特点,逐渐有了实际的经验。再继续,你会拆开一个积木,看看这个积木本身怎么构造的,第一个被拆开的积木可能很简单,但是这个被拆开的积木是一个重要的起点,一旦你拆开了第一个积木,你就会拆开第二个积木,你会发现第二个积木和第一个积木之间有很多公共的零件,你可能还不知道这些零件又是怎么构造的,没有关系。于是你继续拆开第三个,第四个积木……随着你拆开的积木越来越多,你终于知道这些积木的构造原理。这个时候,你在构造应用的时候,如果没有合适的积木,你会用零件直接制造一个新的积木,这个被制造出来的积木解决了你的问题,为创造成功的应用提供了关键的部件。到这里,你已经完成了学习这组积木的真正入门。原理上,你就可以在这个领域持续做下去,提供创造性的工作,因为这组积木在你面前已经可编程。这就是我一直以来学习新领域的一个方式。

另外一种比较有效的方式就是同主题学习,在学习一个方向的时候,一段时间内保持频繁地在一个主题上收集相关资料学习、实践和小结。当你聚焦在一个方向上时,你在技术站点和技术社区里,会自动过滤掉无关信息,持续地在一个方向、一条线上的学习区里学习,参与讨论,密集地汲取知识和实践,持续地点亮领域技能树的节点。实际上学习一个新领域跟做科研有很多相似之处。

许多人说35岁是一个程序员的转折点。这其中的一个理由是软件开发是“吃青春饭”的工作。事实上这也是片面的观点。软件开发有其内在规律,有时候确实在局部上直接堆人力可以快速获得短期效果,但是如果我们奔着做一流软件的目标去,那么能深入理解软件开发的规律,有很强的构架和工程能力,能结合技术、经验和洞见,在一个有着良好迭代的软件团队里创造价值的同时获得持续的成长,那么35岁确实可能是一个转折点,而且还是一个好的转折点。

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

《新程序员》内容亮点抢先看

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

《新程序员001:开发者黄金十年》内容涵盖:

  • 60位+ 技术大咖的经典观点与实践干货;

  • 34篇 精彩文章;

  • 13个 配文视频;

  • 1000位+ 技术人才共同学习成长;

  • 2张 开源核心技术全景工具收藏图。

点击图片查看完整版目录

现在,会员季卡原价89元限时特惠58元,内容包括:

《新程序员》纸质收藏本 1本;

《新程序员001:开发者黄金十年》电子书 1本;

还能获得免费参加《新程序员》主题沙龙的机会!

长按识别二维码即可订阅

无论你是编程爱好者还是职场萌新,无论你是资深程序员还是架构师、CTO,在《新程序员》里,你都会有所收获。

相关文章:

Nginx 学习笔记(六)引入线程池 性能提升9倍

原文地址:https://www.cnblogs.com/shitoufengkuang/p/4910333.html 一、前言 1、Nignx版本:1.7.11 以上 2、NGINX采用了异步、事件驱动的方法来处理连接。这种处理方式无需(像使用传统架构的服务器一样)为每个请求创建额外的专用…

Nginx源代码分析 - 日志处理

我看Nginx源代码的时候,感觉整个系统都在传递log指针。log在nginx里是比较关键的。日志和内存分配是最基础的两个起点代码,最好是在自己写的程序框架中早点完善并实现。以免未来要用大量的精力调整。1. 日志的源代码位置日志的源代码在src/code/ngx_log.…

strom.yaml配置

2019独角兽企业重金招聘Python工程师标准>>> 配置storm.yaml storm发行版在conf/storm.yaml包含了一些配置信息。你可以在这里看到默认配置。storm.yaml里面的配置比default.xml的优先级要高, 下面是要运行storm集群所必须的配置: 1. storm.zookeeper.se…

用 Python 快速制作海报级地图

作者:费弗里 来源:Python大数据分析 1 简介 基于Python中诸如matplotlib等功能丰富、自由度极高的绘图库,我们可以完成各种极富艺术感的可视化作品,关于这一点我在系列文章在模仿中精进数据可视化中已经带大家学习过很多案例了。 …

关于VS2012如何安装Windows Phone Toolkit

最近也是碰到很多问题,在编程的时候。这个问题是我遇到的比较棘手的一个,问了一堆人都说得很是模糊,最后还是琢磨出来了,深感欣慰。写下来以防以后忘记了怎么操作的,也期望能帮助到遇到同样问题的你。 首先让我先说了几…

论Oracle 11g数据库备份与恢复策略

11G中有个新特性,当表无数据时,不分配segment,以节省空间解决方案:1、insert一行,再roolback就会产生segment了该方法是在空表中插入一行数据,再删除,就会产生segment。则在数据库导出时可以导出…

使Apache实现gzip压缩

众所周知,在HTTP1.1中支持gzip压缩,这样可以缩小页面的容量从而加快页面的显示速度。可以使用常用HTTP抓包工具来检测一下你的站点是否开始了gzip压缩。 Apache默认的http.conf配置文件中没有开启gzip压缩,apache1.3.x可以用mod_gzip进行优化…

脸书 AI 识别误将黑人标记为「灵长类动物」

整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 最近,Facebook用户在观看一段以黑人为主角的视频时,会看到一个自动生成的提示,询问他们是否愿意“继续观看灵长类动物的视频”。 视频的内容其实是几个黑人和警察发…

Forefront for OCS2007之部署

1. 前提准备①OCS服务器②创建一个域账户,用于Forefront IM通告。帐户还将用于运行 ForefrontRTCProxy 服务用来截取来自 Office Communications Server SIP 通信进行扫描。此帐户必须满足以下要求:该帐户必须被为ForefrontRTCProxy服务授予 “ 运行为服…

Memcached在大型网站中应用

memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采…

iOS开发-照片选择

本来想做个注册登录的表单的,想想还是先做个简单的头像选择,一般情况下不管是内部管理系统还是面向公众的互联网公司,注册登录是免不了的,用户头像上传是免不了的,尤其是企业用户,上传了自己的图片才感觉自…

打造一流创新环境:协作、开放、可持续

作者 | 微软亚洲研究院院长 周礼栋 毋庸置疑,人类是群居物种。早在两千多年前,亚里士多德便在其著述《政治学》里揭示了人类群居共利协作的趋向:个体组成家庭,家庭组成村落,村落组成城池,城池组成国家和社会…

Ansible源码解析 Inventory组概念

group.py 作者 煮酒品茶 一个组的Class,包含对外方法以及属性如下。 组做为inventory的子节点,会有嵌套组,组变量,组内主机,子组,父组的一些概念 [ name, hosts, vars, child_groups, parent_groups, depth…

Hadoop简要介绍

本文大部分内容都是从官网Hadoop上来的。其中有一篇介绍HDFS的pdf文档,里面对Hadoop介绍的比较全面了。我的这一个系列的Hadoop学习笔记也是从这里一步一步进行下来的,同时又参考了网上的很多文章,对学习Hadoop中遇到的问题进行了归纳总结。 …

超 40W 奖金池等你来战!第二届“长沙银行杯”腾讯云启创新大赛火热来袭!...

HEY!你在等待一个机会提升自己的能力吗?现在机会来啦!第二届“长沙银行杯”腾讯云启创新大赛如约而至!现在,让更多人见证你的创新能力和新鲜想法第二届“长沙银行杯”腾讯云启创新大赛由长沙银行联合腾讯云、腾讯云启共…

(转)AppCan中调用系统浏览器打开网页

<!DOCTYPE html> <html> <head> <style>body{ background:#fff; font-size:30px;}</style> <meta charset"utf-8"> <script> function openUrl(url){if(uexWidgetOne.getPlatform()0){//IOS设备uexWidget.loadApp(url,,);…

Python optionParser模块的使用方法

Python 有两个内建的模块用于处理命令行参数&#xff1a; 一个是 getopt&#xff0c;《Deep in python》一书中也有提到&#xff0c;只能简单处理 命令行参数&#xff1b; 另一个是 optparse&#xff0c;它功能强大&#xff0c;而且易于使用&#xff0c;可以方便地生成标准的、…

squid命中率分析参数注释

默认squid配置文件里面已经加上acl all src 0.0.0.0/0.0.0.0acl manager proto cache_objecthttp_access allow all#cachemgr_passwd pass allhttp_access allow Manager all 3.0直接看这里基本的使用方法*取得squid运行状态信息&#xff1a; squidclient -p 80 mgr:info //注…

库克退休前的最后一战:不是苹果汽车而是……

整理 | 郑丽媛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 上个月库克迎来了他担任苹果 CEO 十周年的日子&#xff0c;我们也为此统计了一份成绩单&#xff1b;而下一个十年&#xff0c;库克可能不会再陪苹果完整走过了&#xff1a;今年 4 月库克在采访中表示…

VIM技巧:显示行号

在vi的命令模式下输入":set nu"&#xff0c;就有行号了&#xff0c;取消行号输入":set nonu"。 命令只对当前文档有效&#xff0c;如果想使vi打开文档时默认显示行号&#xff0c;可以修改vi的配置文件。 # vi ~/.vimrc 在这个文件中&#xff0c;添加 set n…

Python 自动化运维 pycurl

1.探测web服务质量&#xff08;HTTP状态码&#xff0c;请求延时&#xff0c;HTTP头信息&#xff0c;下载速度等&#xff09; web服务质量&#xff1a;1.服务可用性 2.服务响应速度 2.实例 12345678910111213141516171819202122232425262728293031323334353637383940414243impor…

Squid3反向代理安装与配置

一、编译安装 下载 #wget http://www.squid-cache.org/Versions/v3/3.0/squid-3.0.STABLE25.tar.gz //找到地址#tar zxvf squid-3.0.STABLE25.tar.gz //稳定版#cd squid-3.0.STABLE25 #./configure --prefix/usr/local/squid / //必须 //以下几步可选 --enable-arp-ac…

ServiceStack OrmLite 数据库查询 几个实用方法 (继承表格式化集合等)

执行SQL语句&#xff1a;int result db.SqlScalar<int>("SELECT OBJECT_ID(name)", new { name "SomeName" });继承表的实现 &#xff08;存储于同一个表中&#xff09;[Alias("Table")] public abstract class MyBaseClass {public…

Deepsort + Yolo 实现行人检测和轨迹追踪

作者 | 李秋键 出品 | AI科技大本营(ID:rgznai100) 引言 行人检测是近年来计算机视觉领域的研究热点&#xff0c;同时也是目标检测领域中的难点。其目的是识别和定位图像中存在的行人&#xff0c;在许多领域中都有广泛的应用。交通安全方面&#xff0c;无人驾驶汽车通过提前…

推荐15个国外使用 CSS3 制作的漂亮网站

今天分享的作品集网站有些特别&#xff0c;因为他们都是使用 CSS3 技术制作的。对于设计师来说&#xff0c;为了吸引注意力&#xff0c;作品集必须展示出你的能力&#xff0c;这有点像制作简历&#xff0c;要让人们看到你所擅长的&#xff0c;突出的部分&#xff0c;这是一次推…

7_2判断两个单链表是否相交,若相交,求出第一个交点

转载请注明出处&#xff1a;http://www.cnblogs.com/wuzetiandaren/p/4251372.html 声明&#xff1a;现大部分文章为寻找问题时在网上相互转载&#xff0c;此博是为自己做个记录记录&#xff0c;方便自己也方便有类似问题的朋友&#xff0c;本文的思想也许有所借鉴&#xff0c;…

对抗软件系统复杂性①:如无必要,勿增实体

作者 | 袁进辉 我们经常面临如何评价一个大型软件系统质量的问题。首要的评价指标肯定是功能&#xff0c;软件是否满足主要的需求(do right things)。如果有多条技术路径可以实现同样的功能&#xff0c;人们倾向于选择更简单的办法。奥卡姆剃刀准则“如无必要&#xff0c;勿增实…

修改squid的Header中的X-Cache为Powered-By-LinuxTone

今天分析别人网站的时候&#xff0c;注意到国内的chinacache服务商的CDN加速&#xff0c;把squid默认的X-Cache修改为Powered-By-ChinaCache&#xff0c;如下图&#xff1a;以前注意了但是没去研究过&#xff0c;今天刚好有点空挡自己就来研究看看。我的squid版本&#xff1a;s…

NginxApachePHP参数汇总

1、Nginx vim /etc/nginx/conf.d/www.cmdschool.org.conf 12345678910111213client_max_body_size 30m; //上传文件大小改30M upstream www.cmdschool.org { server 10.168.82.25:87; ip_hash; } server { listen 80; server_name www.cmdschool.org; location / { proxy_pass …

android Intent PendingIntent的区别

含义&#xff1a;intent英文意思是意图&#xff0c;pending表示即将发生或来临的事情。 PendingIntent这个类用于处理即将发生的事情。比如在通知Notification中用于跳转页面&#xff0c;但不是马上跳转。 Intent 是及时启动&#xff0c;intent 随所在的activity 消失而消失。…