阿里妹导读:很多程序员在工作一段时间后会遇到迷茫期,虽有技术傍身,也难免会产生焦虑,反复思考怎样才能快速成长。关于如何提高自己的思考力,运用思考的力量推动能力提升,以此实现技术成长,阿里巴巴盒马产品技术部的岩动总结了一套思考方法,分享给每个正在成长的程序员。
引言
我们来看一下几类在程序员成长、发展的常见问题,如果你或多或少存在一些,那么恭喜你,这篇文章值得你仔细往下看了:
1你自认为付出了跟别人同样的努力,但是你的成长确实更慢一些,比如学得比别人慢,排查问题比别人慢,出方案老是有漏洞等等;
2你觉得你只是在疲于应付需求,自己做的事情完全没有技术含量(很多人觉得自己做的业务开发就是没有技术含量,但我认为每个领域都有自己的技术含量,只是你有没有get到);
3你发现总是在犯同样的错误,或者做的事情不断地在同一个水平循环;
4每次要晋升的时候,你发现根本讲不出来(很多人会认为是表达能力问题,但是我认为不是);
5当你换到一个新的领域,你发现自己的经验好像用不上;
6你一直很难搞懂老鸟说的“认知升级”到底是什么概念?不同级别的技术思维能力到底有什么差别?为什么晋升的是他,而不是我?
在这篇文章里,我会告诉大家一些技术成长的误区,我先点出来:
1只要把事情搞定了,成长是自然而然的事情——可能过段时间,你发现之前犯过的错误,后来一个都没有避免;
2我只要努力,996甚至007,我就能够成长得比别人快——可能你发现你干得最多,但是并没有拿到最好的结果;
3我尽力了,还是比别人慢,应该是我智商确实差一些——恭喜你,其实大家的智商并不会有太大差别;
4别人表现好,或者晋升了,只不过是比我表达能力更强而已——我可以负责任地告诉你,这并不是仅仅是表达能力的问题。
先抛一个非常重要的结论:“思考力”是程序员需要具备的一种至关重要的素质。掌握了思考力,你就掌握了在互联网领域,这种高度“智力密集型”行业成长的钥匙。上面这几个成长的问题和误区,跟没有掌握思考力有着非常重要的关系,而且我发现所有发展比较顺畅的同学,他们的思考和学习能力是非常强悍的。
我个人在工作中,一直有意或者无意地锻炼自己和团队同学的思考力,包括哪些是对我们最重要的思考力,如何去训练思考力,有一些心得,希望能够分享给大家。
关于思考力
思考力是一门很深的学问,包括认知科学,心理学、教育学、逻辑学,如果要系统化学习,是需要看很多书的,我推荐以下几本:
1《金字塔原理:思考、表达和解决问题的逻辑》-[美] 芭芭拉·明托,这本书系统阐述了思考、表达和解决问题的逻辑,也是麦肯锡的思维能力基础,算是一本比较标准的思考力教材;
2《麦肯锡教我的思考武器》- [日] 安宅和人,作者根据自己在麦肯锡公司工作时积累的丰富经验以及脑神经学的专业背景,设计出一套极具逻辑性的问题解决思维模式;
3《思维的本质》-[美]约翰·杜威 ,这本书是美国著名教育家约翰·杜威的代表作,阐述了思维训练的基础理论和实践;
本文并不是探讨思考力的深层理论,而是分享我们从日常的技术学习和项目过程中沉淀下来的思考力,以及如何培养这些思考力,这些思考力几乎我们每天都可以用到,只要你有一定体感,你一定会感同身受。
有哪些对程序员最重要的思考力
原理性思维:找出知识背后的原理
有的人会说,为什么要思考原理,而不是直接掌握知识就可以了?我只需要会用就行了啊。
我们先来举一些技术方案设计的案例:
1为什么订单创单要先create,然后enable?
这其实是一种采用二阶段提交解决分布式事务的思路,只是从一般的事务框架延展到交易领域;
2业务系统中为什么要使用消息?
因为消息使用的是观察者模式,观察者模式的好处是可以实现多个消费事务与触发事务的解耦;
3为什么业务系统中会使用DTS来做补偿?
这本质上是一种最终一致性BASE理论解决分布式事务的一种思路;
4为什么更新数据的时候一定要在sql中加上版本比对或者状态比对?
这本质上是一种借助DB实现的乐观锁机制。
进一步,你会发现再大到系统架构和顶层设计的案例:
1比如阿里系的技术框架NBF、TMF、早期的webx,各类框架设计理念,逃不脱设计模式,比如开闭原则,模板方法、责任链、工厂模式、开闭原则;
2不管是底层中间件,错综复杂的业务系统,在设计的时候永远无法离开核心的业务建模,比如实体与实体关系的构建;在分析这类系统的设计思想时,你会发现最好的工具就是UML!
实际上除了软件领域的原理,还有商业设计的原理,比如案例:
·所有的售中退款前必须要先取消履约,所有的履约过程中发生缺货都需要退款,为什么?因为交易的基本原则是:“钱货平衡”,钱和货的变更必须是最终同步的(允许短期的不平衡),你掌握了钱货平衡的基本原理,交易中的很多复杂的流程设计就很好理解了;
·在设计财务系统、库存系统时候,业务流程、业务逻辑可能非常复杂,导致你晕头转向,这时候“有借必有贷,借贷必相等”的财务平衡性原理就发挥作用了,你只要知道这个原理,很快就能看懂各类财务流程、库存流转流程,以及各类数据对账逻辑;
·在我的领域“高可用线下收银系统”进行线下系统容灾的时候,有各种容灾方案的设计,会员容灾、商品容灾、交易容灾、支付容灾……不同的容灾手段看起来让你眼花缭乱,但是他们有没有共同遵循的原则呢?有,这就是“让消费者最快速度完成交易,但保持最后追溯的能力”。你只要get到这个基本原理,设计各类容灾策略就会得心应手了。
此外,我们的工作流程、管理手段,同样也蕴含着深层的原理,非常有意思,大家可以抽空仔细推敲一下,比如:
1为什么团队机制要透明?沟通要透明?
2为什么要有owner意识,都是在工作,owner意识会有什么不同呢?
3为什么管理者不能管得太细,也不能放羊?到底哪些该管,哪些不该管?
所以,掌握了知识背后的原理,带来的好处是:
·软件系统的复杂度越来越高,我们所面对的场景越来越多,掌握原理实际上可以大幅度降低我们对于知识的记忆量,知识量是爆炸的,但是原理绝对是可控的!
·原理性的东西比直接的知识有更强的复用度!记住最核心的原理,当你面对新的场景时,你会惊喜地发现,你的理解速度大大加快!这个点大家应该有体会,比如可能之前我们都学习过dubbo等底层的RPC通信框架的基本原理,但是你如果仅了解了他的基本用法,你会发现对你现在做业务系统没有什么帮助!但是,当你了解的是dubbo如何寻址,如何做容灾,如何做扩展,你再去做业务系统,发现设计原理是一样的,并没有本质区别!这样你之前研究中间件的设计思想就可以快速用到业务系统上面。
·另外探求原理的过程,本身很有乐趣!这是一个非常有价值的思维训练过程,不断对系统设计思想、业务设计思想、做事情的工作方式,追寻背后的原理,并找到他们之间的共性,在我看来非常有乐趣,一段时间训练以后,你会发现你看透本质的能力越来越强!
好,那么我们程序员的工作中,究竟有哪些与原理性知识是需要我们掌握的呢?按我们团队的实战经验来看:
1 java,linux,数据结构和算法,数据库,网络通信与分布式计算的原理,这几类是比较重要的基础知识,我们在做方案设计、编码、问题排查中会运用得很多;
2设计模式,UML这个是对系统架构设计必要要掌握的知识,当你经历了很多大规模的软件系统设计,回到根本上,你会发现逃不出这一块的理论和工具;
3领域性的基本原则,比如我们上面提到的“钱货平衡”,“财务平衡公式”,“线下收银让消费者最快速度走人”,这种逻辑需要大家get到这些领域性的设计原理,甚至自己去总结出这种原理;
4关于管理学,人际沟通,心理学的一些基本原理,大家可以按照自己的实际需求去看一下。
如何在工作中学习和运用这些原理,我觉得有一个最佳实践:
1首先,对你可能用到的领域知识,建立一个基本的概念。看书,看文章,找行业资深的人去聊,都可以得到。注意,这里需要有一个基本的概念就可以,这样你在有可能touch到这些原理的时候,你会有意识,也不至于花很多时间;
2在实践中,有个意识是“多问一下为什么”,并一直“刨根问底”,最终肯定能够追查到背后的最终原理;这里面还要注意思考一下,为什么在这个地方会运用这个原理,也就是找到“场景”和“原理”的关联关系,这样你的理解会更加深刻;
3了解了原理以后,在实践中运用一下,这样你对这个原理的理解就会非常深刻,并且你知道如何去运用这原理;
4如果这是一个非常重要的原理,建议大家如有余力去结合经典的书籍系统化学习。