优秀开发工程师有哪些必备思惟

引言java

 咱们来看一下几类在程序员成长、发展的常见问题,若是你或多或少存在一些,那么恭喜你,这篇文章值得你仔细往下看了:linux

  • 你自认为付出了跟别人一样的努力,可是你的成长确实更慢一些,好比学得比别人慢,排查问题比别人慢,出方案总是有漏洞等等;程序员

  • 你以为你只是在疲于应付需求,本身作的事情彻底没有技术含量(不少人以为本身作的业务开发就是没有技术含量,但我认为每一个领域都有本身的技术含量,只是你有没有get到);web

  • 你发现老是在犯一样的错误,或者作的事情不断地在同一个水平循环;算法

  • 每次要晋升的时候,你发现根本讲不出来(不少人会认为是表达能力问题,可是我认为不是);sql

  • 当你换到一个新的领域,你发现本身的经验好像用不上数据库

  • 你一直很难搞懂老鸟说的“认知升级”究竟是什么概念?不一样级别的技术思惟能力到底有什么差异?为何晋升的是他,而不是我? 设计模式

在这篇文章里,我会告诉你们一些技术成长的误区,我先点出来:缓存

  • 只要把事情搞定了,成长是天然而然的事情——可能过段时间,你发现以前犯过的错误,后来一个都没有避免;性能优化

  • 我只要努力,996甚至007,我就可以成长得比别人快——可能你发现你干得最多,可是并无拿到最好的结果;

  • 我尽力了,仍是比别人慢,应该是我智商确实差一些——恭喜你,其实你们的智商并不会有太大差异;

  • 别人表现好,或者晋升了,只不过是比我表达能力更强而已——我能够负责任地告诉你,这并非仅仅是表达能力的问题。 

先抛一个很是重要的结论:“思考力”是程序员须要具有的一种相当重要的素质。掌握了思考力,你就掌握了在互联网领域,这种高度“智力密集型”行业成长的钥匙。上面这几个成长的问题和误区,跟没有掌握思考力有着很是重要的关系,并且我发现全部发展比较顺畅的同窗,他们的思考和学习能力是很是强悍的。

我我的在工做中,一直有意或者无心地锻炼本身和团队同窗的思考力,包括哪些是对咱们最重要的思考力,如何去训练思考力,有一些心得,但愿可以分享给你们。

 

1、关于思考力 

思考力是一门很深的学问,包括认知科学,心理学、教育学、逻辑学,若是要系统化学习,是须要看不少书的,我推荐如下几本:

1.《金字塔原理:思考、表达和解决问题的逻辑》-[美] 芭芭拉·明托,这本书系统阐述了思考、表达和解决问题的逻辑,也是麦肯锡的思惟能力基础,算是一本比较标准的思考力教材; 

2.《麦肯锡教个人思考武器》- [日] 安宅和人,做者根据本身在麦肯锡公司工做时积累的丰富经验以及脑神经学的专业背景,设计出一套极具逻辑性的问题解决思惟模式; 

3.《思惟的本质》-[美]约翰·杜威 ,这本书是美国著名教育家约翰·杜威的表明做,阐述了思惟训练的基础理论和实践;

 

本文并非探讨思考力的深层理论,而是分享咱们从平常的技术学习和项目过程当中沉淀下来的思考力,以及如何培养这些思考力,这些思考力几乎咱们天天均可以用到,只要你有必定体感,你必定会感同身受。 

 

2、有哪些对程序员最重要的思考力

A. 原理性思惟:找出知识背后的原理

有的人会说,为何要思考原理,而不是直接掌握知识就能够了?我只须要会用就好了啊。

咱们先来举一些技术方案设计的案例

  • 为何订单创单要先create,而后enable?

    这实际上是一种采用二阶段提交解决分布式事务的思路,只是从通常的事务框架延展到交易领域; 

  •  业务系统中为何要使用消息?

    由于消息使用的是观察者模式,观察者模式的好处是能够实现多个消费事务与触发事务的解耦;

  •  为何业务系统中会使用DTS来作补偿?

    这本质上是一种最终一致性BASE理论解决分布式事务的一种思路;

  •  为何更新数据的时候必定要在sql中加上版本比对或者状态比对?

    这本质上是一种借助DB实现的乐观锁机制。

 

进一步,你会发现再大到系统架构和顶层设计的案例

  •  好比阿里系的技术框架NBF、TMF、早期的webx,各种框架设计理念,逃不脱设计模式,好比开闭原则,模板方法、责任链、工厂模式、开闭原则;

  • 无论是底层中间件,错综复杂的业务系统,在设计的时候永远没法离开核心的业务建模,好比实体与实体关系的构建;在分析这类系统的设计思想时,你会发现最好的工具就是UML!

 

实际上除了软件领域的原理,还有商业设计的原理,好比案例:

  •  全部的售中退款前必需要先取消履约,全部的履约过程当中发生缺货都须要退款,为何?由于交易的基本原则是:“钱货平衡”,钱和货的变动必须是最终同步的(容许短时间的不平衡),你掌握了钱货平衡的基本原理,交易中的不少复杂的流程设计就很好理解了;

  •  在设计财务系统、库存系统时候,业务流程、业务逻辑可能很是复杂,致使你晕头转向,这时候“有借必有贷,借贷必相等”的财务平衡性原理就发挥做用了,你只要知道这个原理,很快就能看懂各种财务流程、库存流转流程,以及各种数据对帐逻辑;

  •  在个人领域“高可用线下收银系统”进行线下系统容灾的时候,有各类容灾方案的设计,会员容灾、商品容灾、交易容灾、支付容灾……不一样的容灾手段看起来让你眼花缭乱,可是他们有没有共同遵循的原则呢?有,这就是“让消费者最快速度完成交易,但保持最后追溯的能力”。你只要get到这个基本原理,设计各种容灾策略就会驾轻就熟了。

此外,咱们的工做流程、管理手段,一样也蕴含着深层的原理,很是有意思,你们能够抽空仔细推敲一下,好比: 

  1. 为何团队机制要透明?沟通要透明?

  2. 为何要有owner意识,都是在工做,owner意识会有什么不一样呢?

  3. 为何管理者不能管得太细,也不能放羊?到底哪些该管,哪些不应管? 

因此,掌握了知识背后的原理,带来的好处是: 

  • 软件系统的复杂度愈来愈高,咱们所面对的场景愈来愈多,掌握原理实际上能够大幅度下降咱们对于知识的记忆量,知识量是爆炸的,可是原理绝对是可控的! 

  • 原理性的东西比直接的知识有更强的复用度!记住最核心的原理,当你面对新的场景时,你会惊喜地发现,你的理解速度大大加快!这个点你们应该有体会,好比可能以前咱们都学习过dubbo等底层的RPC通讯框架的基本原理,可是你若是仅了解了他的基本用法,你会发现对你如今作业务系统没有什么帮助!可是,当你了解的是dubbo如何寻址,如何作容灾,如何作扩展,你再去作业务系统,发现设计原理是同样的,并无本质区别!这样你以前研究中间件的设计思想就能够快速用到业务系统上面。 

  • 另外探求原理的过程,自己颇有乐趣!这是一个很是有价值的思惟训练过程,不断对系统设计思想、业务设计思想、作事情的工做方式,追寻背后的原理,并找到他们之间的共性,在我看来很是有乐趣,一段时间训练之后,你会发现你看透本质的能力愈来愈强!

 

好,那么咱们程序员的工做中,究竟有哪些与原理性知识是须要咱们掌握的呢?按咱们团队的实战经验来看: 

  1. java,linux,数据结构和算法,数据库,网络通讯与分布式计算的原理,这几类是比较重要的基础知识,咱们在作方案设计、编码、问题排查中会运用得不少; 

  2. 设计模式,UML这个是对系统架构设计必要要掌握的知识,当你经历了不少大规模的软件系统设计,回到根本上,你会发现逃不出这一块的理论和工具; 

  3. 领域性的基本原则,好比咱们上面提到的“钱货平衡”,“财务平衡公式”,“线下收银让消费者最快速度走人”,这种逻辑须要你们get到这些领域性的设计原理,甚至本身去总结出这种原理; 

  4. 关于管理学,人际沟通,心理学的一些基本原理,你们能够按照本身的实际需求去看一下。

 

如何在工做中学习和运用这些原理,我以为有一个最佳实践: 

  1. 首先,对你可能用到的领域知识,创建一个基本的概念。看书,看文章,找行业资深的人去聊,均可以获得。注意,这里须要有一个基本的概念就能够,这样你在有可能touch到这些原理的时候,你会有意识,也不至于花不少时间; 

  2. 在实践中,有个意识是“多问一下为何”,并一直“刨根问底”,最终确定可以追查到背后的最终原理;这里面还要注意思考一下,为何在这个地方会运用这个原理,也就是找到“场景”和“原理”的关联关系,这样你的理解会更加深入; 

  3. 了解了原理之后,在实践中运用一下,这样你对这个原理的理解就会很是深入,而且你知道如何去运用这原理;

  4. 若是这是一个很是重要的原理,建议你们若有余力去结合经典的书籍系统化学习。

 

B. 结构化思惟:构建本身的知识树

 知识树要解决的问题,咱们看一些场景: 

  1. 为何我知道不少东西,可是当场景来的时候总是会记不起来使用;

  2. 完成一个方案你只能想到一些点状的手段,还有其余方案被漏掉了;

  3. 讲一件事情的时候逻辑很是混乱,先后没有逻辑性关联。 

可是颇有可能你的知识都是知道的,为何会出现这种悲剧? 

这个就跟大脑中的知识结构有关,这是知识学习中“索引”没有创建,也就是说,你的知识只有点,没有线!你们想想,把东西乱七八糟地丢在房间中,到用的时候没有查找的线索和路径,怎么找获得呢?

 

来看一下咱们工做场景的结构化的典型案例,你们体会一下: 

项目中测试MM提了一个bug,我总结出来的比较标准的问题定位步骤: 

  1. 确认刚才是否有过代码变动和部署,由于有比较高的几率是刚才变动的代码又搞坏了……

  2. 追踪链路日志看链路是否有异常;

  3. 经过RPC的控制台调用看接口输入输出是否符合预期;

  4. 追踪关键方法的入参和出参,看是否有问题;

  5. 定位到方法细节后,推理逻辑是否有问题;

  6. 若是没法经过推理,那就最后一招,回放异常流量debug,这样确定可以找到缘由。 

某个链路耗时比较长,须要进行性能优化,个人分析步骤是: 

1. 经过实际流量制造一个耗时较高的trace;

2. 进行trace分析,看清楚耗时最多的缘由,而后按优先级进行排序;

3. 针对对缘由找解决方案,可能的方案有: 

  1. 减小数据访问次数或者计算量,常见手段是增长cache:线程内的invokeCache;分布式缓存tair;页面缓存……

  2. 加强处理速度,好比多线程加速;

  3. 减小循环调用次数,好比请求合并后再分发;

  4. 减小数据处理范围,好比减小查询内容,异步加载分页;

  5. 逻辑简化,好比逻辑进行优化,或者非核心逻辑异步化等;

  6. …… 

4.改掉之后,回放一样的case,看性能消耗是否知足预期,不知足预期继续优化; 

如何熟悉一个新系统,个人步骤是: 

  1. 要一个测试帐号,把相关功能走一遍,这样能很是快地了解一个系统的功能;

  2. 看关键的核心表结构,这样能够快速了解系统的领域模型;

  3. 根据功能步骤找到系统对外的接口列表,了解系统的L0业务流程;

  4. 下载系统工程,熟悉整个工程结构和模块职责;

  5. 以一个最重要的流程为入手点,阅读代码,看清楚核心的执行逻辑,能够变看边画时序图;

  6. 制造一个debug场景,以debug方式走一遍流程,这样能够实际加深一下对系统的理解;

  7. 作一个小需求,掌握相关的流程和权限; 

下单这里来了一个新的需求,出一个技术方案的步骤: 

1. 看清楚以前的需求,把这个需求所在的场景和链路大体阅读一遍,搞懂;

2. 找到需求的变化点;

3. 分析变动的方案,涉及的内容可能会有:

      1. 数据结构会不会变,如何变;

      2. 交互协议会不会变,如何变,交互协议分为:端和组件要不要变;和下游接口要不要变;

      3. 执行逻辑会不会变,如何变,执行逻辑变动的细化考虑点:是否变动域服务;是否变动流程编排;是否变动主干逻辑;是否变动扩展点是否变动扩展点的内部逻辑,变动内部逻辑的时候,又能够进一步拆解:

    a.重构原有的方法,覆盖以前的逻辑,那就须要进行回归;

    b.经过逻辑路由到新的方法,这里须要增长路由逻辑;

    4. 稳定性方案;

    5. 发布方案;

 

能够看到,面对任何一个场景,无论多大多小,咱们所须要掌握的知识或者技能均可以构建成一个树结构,同类之间是顺序关系,上下之间是父子关系(或者粗细颗粒度)。 

当这个树在大脑中构建起来之后,你会发现你作什么事情都是有一个明确的分析和执行逻辑,不太可能产生遗漏和混乱! 

那么如何训练出本身的知识树呢?我给一些比较有效的实践方案: 

1. 必定要总结出本身的知识树,而不要盲从书本上的或者别人的,为何呢?一是由于人的思惟速度和习惯、技能有必定差别,不必定每一个人都是同样的;二是若是没有内化别人的知识成为本身的知识,这棵树不太可以很熟练地运用; 

2. 习惯性总结,作完任何一个事情,都习惯性地回顾一下,往本身的树上面挂新东西,这个是构建知识树的必备手段,这个总结不须要花不少时间,好比作完事情后花个几分钟回顾一下就能够,可是须要坚持; 

3. 推荐一个很常见的工具:xmind,把本身的树记录下来; 

4. 训练本身的思惟习惯和作事方式变得结构化,当你作事情的时候,习惯性用树的方式推动,强迫本身按照这个方式来。

 

C. 扩展性思惟:触类旁通,拓展思惟 

扩展性思惟的核心目标是提高咱们思惟的广度,也就是让咱们的知识树变得更加开阔; 

我在工做中总结出来的扩展性思惟的两个关键的扩展方向: 

(1)触类旁通:解决同类型的N个问题 

触类旁通的好处是:“咱们可否用一样的知识和手段去解决相似的相关联的几个相似问题”,先举一些案例: 

  • 当发现某个系统的jvm参数配置存在一个错误配置,不是仅仅修复这个系统的jvm配置,而是把负责的几个系统都检查一下是否须要统一修改; 

  • 系统中存在某个bug致使产生了脏数据,不是直接订正已发现的脏数据,而是根据特征拉取出全部的脏数据,进行一次性处理; 

这种思惟方式的特征是触类旁通,举一反三,至关于产生批处理的效果,能够大大提高解决问题的效率,避免重复处理。 

(2)寻求更多的可能性:拓展解决问题的不一样手段 

拓展思惟常见的手段是:是否可以换更多的理解方式,或者更多的解法,举一些案例: 

  • 产生故障的时候,快速止血除了回滚之外,还有哪些方案?若是故障处理经验丰富的人必定知道,除了回滚,其实还有系统降级,运营活动降级等多种方案; 

  • 除了写更加健壮的代码,还有哪些手段均可以提高系统的容错性?还有数据监控,单据闭环等多种手段; 

当解决问题的手段更多了,思惟就开阔了。

 

D. 抓重点思惟:提高效率,方便记忆和传递 

当咱们发现知识树构建起来之后,怎么样使得记忆和使用的效率变高?并且对外传递的时候更加容易让人理解?抓重点思惟要解决的场景是: 

  1. 若是每件事情都按照知识树方式作,效率可能不会特别高,有更快的办法么? 

  2. 在对外沟通表达的时候,要表达核心思想,不然别人会很难理解你的表达内容;好比你们再晋升答辩、项目汇报的时候必定会有体会。

 

解决这两类困惑,核心思路是要抓住重点和脉络。 

可是抓住重点和知识结构化之间并不矛盾,并且我认为是有前后次序的,必定要先创建知识结构化,而后才能从里面筛选出重点,不然知识的体系是不完整的。 

那么筛选重点的思路有哪些呢? 

(1)概括法 

采用概括法,把细节隐藏掉,呈现知识的脉络,这是一种很是好的思路;尤为是你们在准备晋升ppt时,ppt的每一页都须要概括一个核心观点,不是全是细节,这个很是重要!而且训练概括的能力,自己就是对知识理解深入程度的一种反映; 

(2)优先级法 

优先级策略每每应用于在多项任务之间找到最最关键或者收益最大的那个任务项,好比完成一个事情可能有若干个步骤,其中哪一个步骤是最有效的,大体能够作一个排序。在实施的时候,你能够按照优先级去落实。 

可是找到效果最好的那个任务项,在不一样场景下是不一样的,跟咱们的熟练程度和经验有关。就像老中医把脉,越有经验判断越准,这块没有什么捷径,只能不断练习本身找到哪些任务项在什么场景下更加剧要。

 

E. 反思性思惟:思考哪里能够作得更好

反思性思惟是提高知识质量和深度的一个关键能力。由于只有不断反思才能让下一次在上一次基础上升级,而不是重复循环。 

常见的反思案例: 

  • 有个问题我查了2个小时,师兄只花了10分钟,这是为何呢?是他的业务比我熟悉?思路比我清晰?仍是知道某个我不知道的工具?必定要找到关键的差别点,而后弥补掉这个差距; 

  • 一个项目项目作完了,从方案设计,研发过程,质量保障上面,哪些地方下次能够作得更好?找到不足,下次避免; 

对于咱们技术团队,哪些内容值得反思,咱们团队的经验是: 

  1. 这个项目商业价值OK吗?是否取得了预期的效果?

  2. 项目中个人能力有哪些问题,有哪些作得好的和很差的?

  3. 系统设计的优点和不足?

  4. 项目质量保障是否能够作得更好一些?

  5. 研发过程和项目管理是否有不足?

反思性思惟的实践,注意有两个点比较关键: 

  1. 反思性思惟最重要的意识:作事情的过程总有优化的空间,每次都要有进步;若是没有这种心态,那么很难持续地进行反思; 

  2. 反思是一种习惯和潜意识,能够在不经意之间常常进行,其实不须要很形式化地花不少时间,有时候作完一个事情,习惯性思考一下就能够。

 

3、锻炼思考力的有效实践 

1.意识觉醒 

意识觉醒是提高思考力最重要的一个点,我认为。只要造成了这种意识,就已经成功了一半。 

不少同窗思惟能力没有上去,是没有意识到思考力这个概念,只是机械地作事情,作事情,作事情……每次都在同一个思惟层次上面转悠,不可能有本质的提高。 

从初级工程师,高级工程师,技术专家,高级专家,资深专家……级别提高靠什么?多接了多少需求?多写了多少代码?这些因素会有,可是关键因素不是这些,而是思考力在不断提高,思惟方式在不断进化,进而致使业绩产出必变得更加优秀,产生的是事半功倍的效果。 

可以坚持看到这里的同窗,必定是可以知道思考力的重要性了。

 

2.保持信心 

如今知道思考力的重要性了,不少同窗可能认为本身是一个不够聪明的人。为何我努力了,仍是不行? 

给你们一个信心:有位大师说过:在相同的文明程度和种族背景下,每个正常人的潜意识与意识相加之和,在精神能量意义上基本上是相等的。 

我几乎接触到的很努力可是成长速度不快的同窗都是由于没有没有掌握正确的方法; 

只要掌握了正确的方法并坚持训练,思考力绝对能够提高。

 

3.空杯心态 

思考的过程实际上是对人的知识进行不断刷新和重构的过程,这里必定要保证空杯心态,对新的环境,新的理念,新的技术持开放态度,不然就是本身给本身制造阻力。

 

4.思考的时间从哪里来? 

常见的借口是“我连需求都作不完,哪来的时间思考”? 

训练思考力其实并不须要太完整的时间,个人口诀是:“1.利用碎片时间;2.抓住工做的过程”。 

  • 利用碎片时间,好比上下班路上的时间,吃饭的时候,能够把刚才或者今天的事情想想,想通了,而后按期汇总一下就能够; 

  • 抓住工做的过程,注意,每次每次出技术方案,优化代码,排查问题,处理故障,准备晋升……都是一次训练的机会,在作事情的过程当中就能够思考并快速实践。

 

5.思考力提高有没有什么判断标准? 

有的,通常来讲思考力有三个度:广度、深度、速度,这你本身就可以感受出来的: 

  • 广度:就是你本身的知识树可以长多大的范围,越广知识越渊博;好比从“如何写一个多线程程序”,提高到“如何作系统性能优化“,再到“如何作系统稳定性备战”,这就是一种广度的提高; 

  • 深度:就是你本身的知识树的叶子节点有多深,越深对知识了解越透彻;好比从“分布式事务问题解决思路”,到“利用最终一致性解决分布式事务”,再到“利用DTS解决分布式事务”,这就是一种深度的提高; 

  • 速度:就是创建和刷新知识树的速度了。好比原来你想清楚一个建模方案要一天,如今只须要半小时能够想清楚,那就是速度的提高了。

 

6.好的工具备推荐么? 

仍是推荐一个工具:Xmind,这个最土的工具最有效。能够下载手机版和PC版本,随时进行记录。

 

7.必定要相互分享 

思考虽然主要是靠本身,可是必定要相互分享。由于思考是智力活动,相互分享彻底可以取得1+1>2的效果; 

注意分享能够有不少形式,好比咱们团队最常常的是: 

  • 项目分享:重大项目是必定要分享的,包括架构设计经验,过程经验,质量提高经验,都须要分享出来; 

  • 周会分享:团队周会重点过进度?那太浪费啦,了解进度和风险看周报就能够了。周会是学习分享的好时机重点就是一些关键的方案,架构设计理念,好的工具,甚至工做无关的内容; 

  • 群内分享:当有我的踩坑之后,在群里面提醒一下你们,这是一个很及时的分享方案; 

  • 年度/季度分享:这时候适合找个风景优美喝茶的地方,你们讲一讲本身的成长和思考,很是有帮助; 

  • 小圈子:你们造成本身的小圈子,随时均可以相互倾诉一下本身的心得体会,其实这种效果也很好;

 

8.技术Leader在训练你们思考力中的职责 

在技术团队中,技术Leader的思考力意识、能力和实际行动,决定了一个团队的总体思考力水平和成长速度! 

一个团队要提升思考和学习的能力,首先得这个团队Leader的思考意识就要提上来,若是团队Leader没有思考意识,也没有把团队同窗的成长放在心上,那么整个团队的思考力和成长速度绝对快不起来。 

在提高团队总体思考力的实践中,技术Leader的职责: 

  • 先要把本身变成一个思考者,本身作表率,以身做则; 

  • 意识心态上先变过来,要把团队同窗的成长速度最为最重要的职责之一,没有这个意识都是空谈; 

  • 多创造思考的条件和氛围,必定要抓住任何机会(代码reivew、方案评审、周会均可以)鼓励你们去思考和分享; 

  • 控制团队节奏,给你们学习和思考留出必定的时间; 

  • 及时的引导和示范,有的同窗可能掌握会偏慢一些,这时候须要有耐心去引导同窗找到思考的感受; 

  • 没必要过多干预细节,发挥你们的群体智慧,而没必要作过多干预,更不能以我的的意志去强迫别人接受。

 

4、重要观点小结

好了,到这里能够给重要观点作个小结,时间紧的同窗们能够直接读这一段: 

  1. 思考力对程序员的成长相当重要,团队和我的都须要有意或者无心识地提高思考能力。 

  2. 对程序员最重要的思考力有:原理性思惟、结构化思惟、反思性思惟、扩展性思惟、抓重点思惟。 

    • 原理性思惟是根基,由于没有搞懂的状况下全部的知识建构都是空谈;

    • 结构化思惟帮助咱们创建了咱们的知识树;

    • 反思性思惟不断对知识进行重构,是实现认知升级的必备条件;

    • 扩展性思惟能够提高知识的广度和深度;

    • 抓重点思惟能够加快知识的使用效率和传递效率; 

     3. 在提高思考力的实践中: 

    • 思考力提高最关键的是意识的转变;

    • 要对思考力的提高充满信心;

    • 多在工做中去锻炼思考力,不须要花太多额外的休息时间;

    • 多相互分享;

    • 团队Leader要团队同窗的成长和把思考力提高做为最重要的内容,并拿出实际行动。

相关文章
相关标签/搜索