老程序员教你如何提高开发效率、成为大神0——从业余到专业

从这篇博客开始,我将介绍如何通过一些方法和技巧提高开发效率。背景介绍:本人自1996年开始学习编程,经历过很多痛苦和挫折,在2007-2012年期间一直在做软件外包,也就是俗称的野战军,2013年才正式入职一家企业的软件开发岗位,2017年正式入职一家国产ERP市场占有率第一的上市公司做软件开发。我的人生已经经过了30年,生而为编程,在这条职业发展道路上用去了24年,甚是可惜。为了能够帮助更多的人,我这里总结和整理了提高开发效率的人生经验,供大家参考。

第零篇、从业余到专业

首先,只要我们是程序员,就要了解到我们当前所处的位置、外面的世界是如何的,我本人曾经有3年将VB作为解决一切问题的良药,直到有一天见到了B/S架构,才发现我原来是坐井望天了。那么专业的选手究竟应当是什么样的呢?用一句话来形容,就是“与计算机有关的一切都有能力去尝试,并且一定能得到想要的结果”。我们这里不去评判业余选手会是什么样,我们只来形容一下程序员专业选手应当具备的素质:

1、具有完备的理论

在2009年上大学之前,尽管我写了很多程序,但是我依然不知道这个程序为什么会这样写,又该如何优化,因为2000年有一场全民编程热潮,博彦科技的《编程高手》系列书籍随处可见,当时所谓的编程高手以掌握Windows API为荣,我也以为只要我记住了所有的API,我就可以做任何我想做的软件,如果不知道一个API如何去用,那么就到MSDN上查,复制过来修改一下参数就能跑,甚至曾经放出豪言:写程序无非就是复制粘贴加修改,现在回头看来是幼稚了。

所以我并非是鄙视非科班出身的程序员,只是以希望各位成长的态度来详细的说一下为什么需要具备完备的理论基础。我所带的团队中的一些短期培训班毕业的程序员尽管可以实现很多功能,但是在细节上花费的时间要远比计算机相关专业毕业生要多得多。当然也有不少人曾经在大学时期并不重视基础理论,以至于依然不了解程序运行的机制。

比如曾经做过一个能够同时对接微信、友空间、钉钉之类系统的接口,不熟悉理论的人短期之内是看不懂的:为什么要有RESTful接口?HTTP请求头又是什么、客户的服务器在内网怎么进行NAT映射、端口穿透?甚至于MD5签名的时候不了解如何根据Map的键对所要签名的变量进行排序。

那么一个程序员应当具备什么理论基础呢?四大基础理论必不可少:计算机组成原理、计算机网络、操作系统、数据结构与算法

计算机组成原理会告诉你计算机整体工作的机制和流程是什么。学会它,你就能对程序的优化给出专业意见。

计算机网络会告诉你广域网、局域网、路由、交换是怎样的。学会它,你就能看明白各种复杂的客户现场。

操作系统会告诉你一个程序是如何被运行、调度的。学会它,你就能看明白大多数软件问题的本质,解决难题。

数据结构与算法会告诉你如何建立结构化和算法思维去书写程序。学会它,你就能一眼看透复杂的接口文档、报文格式,并能第一时间猜测出来为什么它要这么设计,因此这也是四大基础理论中最为重要的。

除此以外,必要的数学知识也可以为你建立优秀的思维添砖加瓦:离散数学、高等数学、线性代数、概率论与数理统计,为什么要学数学呢,因为我们编程大多数时间都是在设计和编写函数,在不同的计算机语言里可能也叫作“方法”。编程中涉及到函数的调用、递归、结果的汇总、排序,对数据集合的升维、降维、切面、切块、旋转、钻取,都会或多或少的用到数学思维。如果熟悉了数学,就能透过现象看本质,比如:多层if嵌套可以用离散数学的命题理论、卡诺图来简化,人工智能是基于数字神经网络,而数字神经网络本质是概率网络;BI历史数据获取最优解实际上就是线性回归和线性规划问题;当别人还在研究分组求和时,你头脑中浮现一个Σ,分分钟就想透了这个问题如何做。因为高手在默默思考程序和架构时会用到数学,但是你并不知道他是如何想出来的,所以说数学思维往往是大神们秘而不宣的秘籍,而且即使是别人知道了,也很难短时间有所突破。

扫描二维码关注公众号,回复: 9455103 查看本文章

其他的理论基础大多都是在毕业之后学习的,有上面四个理论做基础,就会好学很多。比如面向对象编程、UML建模、ER图、GoF设计模式、多线程设计模式、DDD领域模型驱动、PMP项目管理、SOA架构……。因为理论基础是互相交织、且环环相扣的,所以我们要持续学习,不要害怕枯燥。

2、具有独立的思考

1)切忌人云亦云,诸如“PHP、.Net是世界上最好的语言”之类的讨论,本身就是伪命题。世界上没有万金油,手里握着锤子的人,看到哪里都是钉子。所以会单一语言的程序员往往会落入自身计算机语言的陷阱,随着语言的衰落,于是便成为了时代的牺牲品。

所以为了能够有清晰的思维,我们要学会独立思考。无论别人告诉你某某语言如何,只有亲自去试过,才知道它有哪些优点、有哪些缺点。比如DDD、SOA很香,但也仅限于企业级软件开发,互联网架构下,它就会出现缺乏灵活性、重度依赖模型的困境。所以任何理论、技术都有它的适用范围。

2)敢于推陈出新。因为有很多时候技术层面的决策者不能很快适应技术变化,又因为互联网这个行业本身是一个高速发展的行业,那么这时候就需要我们程序员不断的尝试使用新鲜的技术来面对以前没有想到的实现方式。比如一个团队里大家都认为当前的Java二次开发任务不能完成,因为原来的系统没有留口。那么为何不尝试一下试试Java反射?为何不尝试一下JavaAgent?

3)敢于反驳和实验验证自己的假设。只有玄学才会依靠一味的迷信,科学永远都是在批评与自我批评中实现进步的。

3、具备成熟的技术

如果我们本身虽然具备了理论基础,但是从来没有动手实现过功能,那么一定也不能称之为大神级别的人物。要知道这里所说的具备成熟的技术是相对的。无论从人生的经历、三观来看,世界上没有任何两个人的想法是完全一致的,特别是在技术领域很多时候大家都是求同存异,例如一个大数据方面的大神写Oracle触发器很慢也是很正常的,所以说无论大神还是小白,世界上任意两个人他们的技术领域永远都是既有交集也有补集,没有谁的技术会是谁的全集

可能这个时候有人就会反驳,比如教C#的老师一定在C#方面比学员强。这个我并不否认,但是我们要知道的一点是,教师其实并不知道这个学员有可能是大型MMORPG游戏的老玩家,仅从C#技术领域角度来说,此学员因为长期接触与该游戏有关的一切,深谙系统进程管理,甚至知道EXE程序签名、P2P下载器是如何管理Peers、MD5可以验证大程序包完整性、口令卡是怎么一回事、渲染引擎有DX和OpenGL……。所以说任何一个领域如果深度挖掘,两个人一定有交集。

所以因此何为成熟的技术?成熟的技术就是指别人讨论的时候能覆盖到你的知识领域,并且你参与讨论后还能说的很透彻

要练就成熟的技术就需要更加专注、花费大量的时间去打磨。我经过多年实际测算,如果心无旁骛的全天12小时以上在同一个技术领域上,3天就足够入门该技术领域、6天就足够在这个技术领域达到熟练。有些没有参与过项目的朋友可能不会相信,但一旦有过众多项目经验的人可以知道,此言非虚,工作的压力会使你比大学期末考试前的突击效率还要高。

那么要快速形成成熟的技术,就要使用成熟的套路,也就是学习方法和工作方法来实现。业余和专业的区别也在于此,同样是打乒乓球,业余选手只是随便玩玩而已,而专业选手在平时练习中仅仅一个动作就要反复练习上千遍。

所以说当你打开编程工具呆呆的坐在那里时,就已经输给了高手。因为高手在开始工作时一定会有起势,告诉大脑“我现在开始工作了,调动所有神经元,左边跟我一起画个龙,右边画一道彩虹”。这个起势每个人都不一样,比如我的习惯是先想好今天要做的模块,选择其中一个类作为目标,打开IDEA、新建类、命名、回车、main回车、下面先写上若干个注释代表这个类要实现哪些方法,此时10分钟应当已经过去了,然后再在每一行的注释下写上要实现的函数,此时15分钟已经过去了,OK,我已经进入了高效专注的工作状态。

那么咱们剖析这个起势,实际上工作起始时,先要从无需大脑高度集中注意力便可完成的工作开始,大多数人效率不高其实就是因为类没写、main方法没写,从一开始就没有进入状态。那么我们这个起势是从何而来的呢?实际上是从长期的敲代码过程中形成了反复训练、达到肌肉记忆。就和开车是一样的,最开始学车的人都很紧张,但随着时间的推移、教练的不断强化,开车已经变成了潜意识,所以我们才会常常看到老手司机可以一边聊着天一边开车,他们完全没有刻意而为。想想,谁吃饭还刻意控制筷子的角度?谁走路还刻意控制双腿的幅度?谁用九宫格输入法还刻意看一下拼音字母在哪里?这些可都是咱们每个都曾经刻意控制并反复练习过的,熟能生巧而已。

因此想要把技术练的成熟就先要从一个简短的小DEMO做起(50行以内),然后在完全理解它的基础上不断的去反复敲这个DEMO(每天至少3次,大概反复100多遍),当练熟了一个之后不断的去更换不同领域的DEMO。甚至于睡觉前都可以去想象一下自己手中握着键盘敲DEMO的指法,当你发现你在敲它的时候能想着架构、设计,甚至其他的事情,不再专注于指法和屏幕上的错误提示,你这个DEMO就可以作为具体工作的起势,因为它已经无需高级神经系统的主观控制,依然可以把工作做得很好

经过这种练习方法一年之后你会欣喜的发现,你可以毫不费脑的闭着眼睛写个JDBC查询、不经意间写出了递归、随随便便就能写个生产者消费者模式,因此完备的理论基础已经融会贯通到你的程序中,你于是有了更多的时间进行独立的思考,敲代码这件小事交给潜意识好了,你就尽管在敲代码的时候同时思考架构即可,达到这种程度你就具备了该领域成熟的技术,从而你就已经跻身专业选手的行列了。

当然专业程序员不代表IT领域的大神,若是要被他人称作神,一定避免不了需要与之匹配的思维模式,下一篇讲解专业程序员如何通过进化自己的思维模式,来获得技术领域的信众(群众基础)。

发布了6 篇原创文章 · 获赞 135 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/yry0304/article/details/104519806