一流程序员的成长之路

现在网上流传着35岁以后的程序员就没有公司要了,程序员变成了青春饭,这完全就是一种对程序员职业的表面理解。造成这种情况发生的原因就是一部分的天才程序员让编程变得越来越简单,让编程变得大众化了,这种编程的简单化就造就了大量的平庸的程序员,让做软件变得和搬砖一样,成了体力劳动,而不是创造性的脑力劳动。

 

做软件的创造性在哪里呢?平庸的程序员只会解决单个问题,而且解决的这个单个问题常常又堵了后面问题解决的路,从整体角度看就是打拳缺少章法。优秀程序员解决的一类问题,这一类问题包含了成千上万的单个问题,这就是为啥谷歌认为优秀程序员可以顶100个平庸程序员,下面,我列举一些天才级的作品。

 

谷歌工程师霍尔斯,发现普通机器会宕机,衔接不好,用户体验不好,所以带领学生实现热迁移和动态高可用方案,监控到流量转移的完全自动化。这种创新技术带来了巨大的商业价值,就是使用廉价的机器代替高稳定性的贵的服务器,并且可以提供同样的可靠服务,大大降低了互联网企业的运营成本。而且这种技术然后扩展到其他互联网公司,包括中国的BAT,这个技术和谷歌的MapReduce和BigTable奠定了互联网高速发展的基础。

 

大学毕业的时候,为了写网络安全方面的书籍(服务的公司是启明星辰,现在是中国网络安全的头牌企业),我研读了2本Richard Stevens的TCP/IP的书籍,研究了TCP/IP的代码,发现C语言居然也可以写出OO编程思想的软件,看来在大师手里,烧火棒也可以成为威力无比的武器。工作20多年以来,我看到太多的人用的是JAVA,OO编程的语言,编程方式却停留在过程编程方式,最多是OO调用,因为使用的框架是基于OO思想开发的。TCP/IP是当之无愧的互联网技术的基石,是真正的天才之作。

 

参加工作的初期,我还阅读了TOMCAT和Eclipse的源代码,这些天才的作品对我的职业生涯有着重要的影响,我自己开发的软件里面很多都借鉴了Eclipse的插件设计思路,让我在对设计模式的认识上彻底打通了全身的筋络。美国的很多大叔级甚至爷爷级别的程序员和他们的工匠精神是软件业的基石所在,这才是中国软件业和美国软件的根本差距。

 

不是每个程序员都能够成为天才程序员,但每个程序员都应该有一颗走向天才程序员的心,即使得不到太阳,你的努力也会得到一个月亮。要想成为一个优秀的程序员,必须具备以下几个特质:

 

强大的自学能力和对编程的热爱

软件行业是一个变化非常快的行业,各种框架层出不穷,这些东西是不能靠课堂学来的,自学是不断完善自我的唯一方式。我自己大学学的是材料科学专业,软件方面的东西全靠自学,大学去旁听数据库课程被老师赶了出来。跟着老师课堂学习可以帮的你一时,不能帮助你一世,自学能力的培养和建立才是根本。

 

看到一些”21天学人工智能拿高薪”的广告语,这些课程都是给韭菜预备的,大数据和人工智能这些技术真正掌握是需要很厚的功底的。大学同学之前在拉手网做CTO,让一个博士毕业生做O2O的推荐系统,结果推荐的餐厅常常是几十公里以外的,博士没有真正理解业务,导致脱离业务去做算法,人工智能也是一样的,不是背熟几个例题就学会的。还有很多框架教学,如SpringMVC的课程其实只是讲了表,没有深入机理。如果把一些框架彻底自学搞懂了,吃透了,其实很多框架都是类似的,天下武功本质是相通的。

工作早期做VC++编程,下功夫搞懂了Windows的API和MFC的结构,后来在学习JAVA的Swing的时候,发现了很多的类似的设计思路,到后来的Android和IOS的控件组织结构和绘制机制都是相通的,如果你懂得了这些机制,就很容易理解H5性能调优的文章,理解什么叫“过度绘制”。而且这些框架中很多都应用了大量的设计模式,对设计模式的学习也更加深刻和透彻了,这也叫举一反三吧,只有自学才能真正的把握精髓。

 

提升自学能力会让程序员拥有很强的独立辨别能力,软件设计领域没有”银弹”,每种框架或者解决方案都有适用的场景,我看到太多程序员死抱教条,而不知道去分析场景和平衡得与失。在软件设计上面执行教条主义,会让一个项目失败,在军事上执行教条主义,会导致全军覆没。马谡失街亭,就是片面强调居高临下的优势,而忘记了水源和对手张郃的能力,同样还有纸上谈兵的赵括。现在的设计模式和框架层出不穷,哪个叫得响就跟随哪个,完全是一种纸上谈兵的做法。任何框架和模式的采用都是需要去平衡利弊的,去分析自己真正能够获得什么好处,同时又失去什么,当好处明显大于坏处时,就应该采纳,而不是什么都不分析听网上言论就去采纳。现在非常流行”微服务”,真没有感觉有什么好的,虽然单个服务看似简单了,但只是发洪水的时候,把家里的水抽到了大街上,没有解决业务复杂度的根本问题,而且调用都变成了进程间的,导致性能的大幅下降。根本解决业务复杂度还是需要通过优秀的设计思路,通过吃透设计模式来解决。大家都知道磁盘访问速度是慢的,使用锁会降低并发能力,Kafka实现了高并发高吞吐能力,因为利用了磁盘顺序读取非常快的原理,而且通过环状队列规避了锁的使用,这就是设计的魔力。

 

我也看到很多人学习了设计模式,但走入过度设计的怪圈,这也是学艺不精的表现。设计需要考虑很多因素,要学会全局平衡,就和打仗兵法需要学会灵活分析和运用一样。怎么样平衡利弊,这是需要很深厚的思考能力和经验积累的,因为很多程序员没有产品和测试思维,导致使用设计模式的时候不知道目标是什么,这种没有目标的套用怎么可能会好。要实现灵活应用的能力,就必须学会自学。

 

不要指望找大牛当老师,大牛没有时间,要靠自己,请教问题,要带着思考和问题去交流,不要问百度可以轻易找到的问题,会让人感觉学习主动性太差,工作当中,没有人会愿意做Babysitting的。

 

现在很多互联网公司加班极其严重,大家都在BUG堆里滚来滚去,很多时候都是一种低水平的重复性劳动,而且是相互挖坑,又花大力气去排雷,很多人都没有学习新技术和加深理解基础知识的时间,也算是软件行业的恶性循环了。其实,软件开发不是拼人数和绝对时间的,拼的是团队单兵能力和协作能力,有兴趣请参看”敏捷开发怎么真正实现落地”和”为什么讲国内软件开发有90%以上浪费”。

 

要有啃硬骨头的精神

没有人天生会成为优秀的程序员,要成为优秀的将领,没有打过硬仗是不行的。当初,我开始阅读全英文的TCP/IP原理教程和源代码,太难了,还有阅读TOMCAT和Eclipse源代码也非常费劲,但坚持下来就是海阔天空。我遇到的太多程序员喜欢网上直接拷贝代码使用,一些框架,要求他们去深入研读一下,搞清楚里面的原理,便是这也难那也难。遇到问题走捷径,遇到大山绕着走,怎么可能有一览众山小的体验。

 

要有追求完美的精神,学会平衡

程序员应该具备产品思维和测试思维,应该学会为用户着想,而不要贪图自己编程方便,尽量把事情一次做到位,不用让测试和产品打一棒子走一步。很多前端程序员拿来完成的APP或者H5页面给我看,我会问他,你觉得这个好用吗?太多明显的问题,明显体现出程序员的浮躁的心里。其实很多时候,美观度上面没有要求程序员,毕竟是设计的事情,但操作的方便性上,程序员是必须要考虑到的,把按钮搞那么小,体验怎么能好。如果淘宝做成这样,你一定去骂淘宝程序员了,很多人就是骂着别人,自己做的时候却打自己的脸,在我看来这不是一种能力问题。后台程序员,你让他把性能测试一下,他会说现在数据量不多,你难道等洪水来了再修坝吗?这种态度都是会被我痛骂一顿的,不管公司的业务能不能发展到那么大的流量,如果你自己有时间,就应该高标准严格要求自己。热转移技术就是谷歌工程师追求完美的精神的体现,当然,追求完美也需要分场景和平衡投入产出比。如果后台还有很多其它更重要的任务要做,性能测试可以推后,但无安排的情况下,就应该去完成。

 

很多看似没有技术含量的工作,当你把标准提升了,就有技术含量和难度了。小小的电容电阻看似没有技术难度,但日本企业却占据着手机电容电阻60%以上的市场份额,中国企业需要去主动寻求合作。很多做业务代码的人感觉没有技术含量,其实是没有看到更高的标准,如果让你实现自动化测试,让你实现代码的扩展性,降低初次BUG率,把运行性能优化到最优,很多高标准一提出,就知道差距在哪里了。两个零件外形相同,一个用在普通汽车,一个用在飞机上面,能一样吗?里面的材质和加工精度都有很大的差异,软件的外在功能只是表面外形,稳定性,扩展性,易用性等很多指标才是根本的区别。写业务代码也可以成为大牛,但也要懂底层的东西,如果能够开发业务框架,大大提升生产效率,虽然是业务代码,也是大牛,事实上,业务层面的框架化更难,比基础层面难很多。

 

软件常常会对接很多第3方服务,遇到第3放服务出现问题,程序员就喜欢把责任推卸过去。这时候我就会问他,你研究了这些服务的异常情况了吗?你对异常情况准备了应对方案了吗?你自己是汽车厂家,零件出了问题,你能让顾客去找零件厂商吗?百度地图出了问题,你为啥不能APP里面集成多个地图,让它们实现自动切换呢?一个出了问题,难道全部都出问题吗?追求完美就是不要推卸责任,要去努力解决问题。

 

要学会思考,谦虚学习,讲求方法

做软件是非常讲求方式方法的,常常看到很多程序员喜欢使用断点跟踪方式找BUG,因为在他们看来这是一种最方便和有效的方式,说实话,我已经快20年没有使用这种方式来找BUG了。很多看似容易的路,走到最后就没有路了,看似难的路,却可能会有意外的收获。之前看一个记录片,记录中国的火箭军,大白天训练大家还都是按照瞎子的方式来训练,任何动作都不靠眼睛,靠感觉和口令,为啥?因为你不能指望战斗环境都是阳光明媚的白天。这种断点调试只适合开发环境,在开发环境能够解决的BUG都是容易的,生产环境下忽有忽无的BUG才是难解决的。如果一个飞机只能在晴天飞行,航空公司还能挣钱吗?优秀的软件必须是适应任何环境和条件的,解决非开发环境的问题,只能靠日志,没有第二钟办法。怎么样记录日志也不是一天学会的,日志信息太多,找问题似大海捞针,日志信息太少,也对问题摸不到头脑。其实,记录日志是个大学问,需要考虑级别,位置,信息表达和方式很多因素,而且好处多多。例如,现在多线程程序越来越多,多线程问题解决是必须靠日志的,日志让程序员对软件执行流程有更清晰的全局的理解,增强逻辑思维的严密性。而且,日志能力增强以后,很多问题解决是分分钟的事情,看了日志就知道问题原因了,根本不需要花整天的时间去调试程序。

 

编程是创造性的工作,是一门艺术,需要多思考,编程语言不是最重要的,思路比对语言掌握更加重要。掌握语言只是进入殿堂的前提条件,只是开始,成为一个伟大的作家不是因为你语言学习的多好,作品当中的内容才是本质。很多人喜欢说什么语言比其它的都好,更像是一种宗教论战,没有太大的实在意义,不同语言都会有各自的优缺点和适用场景。软件设计的本质是通过创新性思考,把复杂的东西简设计的简单化了,就像前面讲的Kafka的设计。要成为优秀的程序员,就需要学会反复推敲代码,尽量使用数据结构和设计模式去简化代码,,就和流传千古的唐诗绝句,字字经典,开发不能单纯用代码量来衡量能力。

 

我看到很多程序员都特别固执,坚毅和固执只差一步,在自己能力不足的时候多去思考一下大牛给你的建议。我曾经希望后台能够减少API的数量,500多个API导致前端很难理解,也让他们自己维护成本增加,并且给他们讲解了怎么样合并的思路,讲解了一上午还是没有讲通。固执让一个人不会理解新的思路,不能掌握新思路,又让他变成了井底之蛙,让他变得更加固执,完全是一个恶心循环。

 

工作当中要学会积极主动,在工作中巩固学习知识

前面讲了很多自学方面的东西,其实学习得到的只是知识,知识必须转换成能力才能真正创造价值。学习了但没有去应用,就很容易变成死知识,积极去发现工作当中的问题,积极去解决这些问题,才能真正的得到能力。工作当中不要只守着自己的一亩三分地,在完成本职工作的前提下,多去和其他技术团队交流,争取对项目有更全面的认识。例如,很多程序员不喜欢做技术支持,客服支持和查BUG的事情,觉得撸代码更加有成就感。创新的前提条件是什么呀?你要去发现问题,而发现问题的最好办法就是去一线面对这些问题,在知道问题的基础上,才会有思考,才会有解决的思路,才会知道去运用学到的知识。支付宝对接了很多不同银行,链路路由优选设计,虽然是业务层面代码,但应该为支付宝节约了不少网关费用。在公司的现有系统中发现问题,去找到更好的思路,为公司创造价值,这才是优秀程序员的表现。

 

其实学习基础概念知识,很多时候是枯燥无味的,例如对HTTP协议的学习。HTTP的基础知识其实对前后端开发都是非常重要的,让他们去看看,问他们那些协议HEADER的作用是啥,回答不上来,这根本不是学习。真正的理解是需要去找使用场景,在场景中去体验,最好的场景就是工作,在工作场景中去扩展框架的功能,或者做些调整在测试环境看看效果,去把OKHTTP读懂了,不要满足于简单的例子调用。

 

很多程序员表达能力很差,不喜欢在工作当中做交流,只知道闷闷的傻干。学会表达和主动交流是非常关键的,交流会帮助自己梳理思路,发现遗漏忽视的地方,让知识变得更加系统化和严谨。而且,做程序之前学会跟高手沟通思路,对方可以帮你发现很多潜在的BUG,提升你自己的工作效率,因为在交流中发现缺陷,这时候的成本是最低的。

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值