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

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

第零篇、从业余到专业

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

一、具备完备的理论

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

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

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

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

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

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

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

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

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

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

二、具备独立的思考

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

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

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

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领域的大神,如果要被他人称做神,必定避免不了须要与之匹配的思惟模式,下一篇讲解专业程序员如何经过进化本身的思惟模式,来得到技术领域的信众(群众基础)。

相关文章:

老程序员教你如何提升开发效率、成为大神1——人文思惟进化与信众

老程序员教你如何提升开发效率、成为大神2——时间与团队管理

老程序员教你如何提升开发效率、成为大神3——受权的艺术