2024年最全优秀工程师必备的一项技能,你解锁了吗?_tmf nbf,2024年最新一名毕业三年的女程序媛面试头条经验

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 当你换到一个新的领域,你发现自己的经验好像用不上;
  • 你一直很难搞懂老鸟说的“认知升级”到底是什么概念?不同级别的技术思维能力到底有什么差别?为什么晋升的是他,而不是我?

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

  • 只要把事情搞定了,成长是自然而然的事情——可能过段时间,你发现之前犯过的错误,后来一个都没有避免;
  • 我只要努力,996甚至007,我就能够成长得比别人快——可能你发现你干得最多,但是并没有拿到最好的结果;
  • 我尽力了,还是比别人慢,应该是我智商确实差一些——恭喜你,其实大家的智商并不会有太大差别;
  • 别人表现好,或者晋升了,只不过是比我表达能力更强而已——我可以负责任地告诉你,这并不是仅仅是表达能力的问题。

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

我个人在工作中,一直有意或者无意地锻炼自己和团队同学的思考力,包括哪些是对我们最重要的思考力,如何去训练思考力,有一些心得,希望能够分享给大家。

关于思考力

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

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

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

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

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

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

原理性思维:找出知识背后的原理

有的人会说,为什么要思考原理,而不是直接掌握知识就可以了?我只需要会用就行了啊。

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

  • 为什么订单创单要先create,然后enable?

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

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

因为消息使用的是观察者模式,观察者模式的好处是可以实现多个消费事务与触发事务的解耦;

  • 为什么业务系统中会使用DTS来做补偿?

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

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

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

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

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

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

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

  • 所有的售中退款前必须要先取消履约,所有的履约过程中发生缺货都需要退款,为什么?因为交易的基本原则是:“钱货平衡”,钱和货的变更必须是最终同步的(允许短期的不平衡),你掌握了钱货平衡的基本原理,交易中的很多复杂的流程设计就很好理解了;
  • 在设计财务系统、库存系统时候,业务流程、业务逻辑可能非常复杂,导致你晕头转向,这时候“有借必有贷,借贷必相等”的财务平衡性原理就发挥作用了,你只要知道这个原理,很快就能看懂各类财务流程、库存流转流程,以及各类数据对账逻辑;
  • 在我的领域“高可用线下收银系统”进行线下系统容灾的时候,有各种容灾方案的设计,会员容灾、商品容灾、交易容灾、支付容灾……不同的容灾手段看起来让你眼花缭乱,但是他们有没有共同遵循的原则呢?有,这就是“让消费者最快速度完成交易,但保持最后追溯的能力”。你只要get到这个基本原理,设计各类容灾策略就会得心应手了。

此外,我们的工作流程、管理手段,同样也蕴含着深层的原理,非常有意思,大家可以抽空仔细推敲一下,比如:

  1. 为什么团队机制要透明?沟通要透明?
  2. 为什么要有owner意识,都是在工作,owner意识会有什么不同呢?
  3. 为什么管理者不能管得太细,也不能放羊?到底哪些该管,哪些不该管?

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

  • 软件系统的复杂度越来越高,我们所面对的场景越来越多,掌握原理实际上可以大幅度降低我们对于知识的记忆量,知识量是爆炸的,但是原理绝对是可控的!
  • 原理性的东西比直接的知识有更强的复用度!记住最核心的原理,当你面对新的场景时,你会惊喜地发现,你的理解速度大大加快!这个点大家应该有体会,比如可能之前我们都学习过dubbo等底层的RPC通信框架的基本原理,但是你如果仅了解了他的基本用法,你会发现对你现在做业务系统没有什么帮助!但是,当你了解的是dubbo如何寻址,如何做容灾,如何做扩展,你再去做业务系统,发现设计原理是一样的,并没有本质区别!这样你之前研究中间件的设计思想就可以快速用到业务系统上面。
  • 另外探求原理的过程,本身很有乐趣!这是一个非常有价值的思维训练过程,不断对系统设计思想、业务设计思想、做事情的工作方式,追寻背后的原理,并找到他们之间的共性,在我看来非常有乐趣,一段时间训练以后,你会发现你看透本质的能力越来越强!

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

  • java,linux,数据结构和算法,数据库,网络通信与分布式计算的原理,这几类是比较重要的基础知识,我们在做方案设计、编码、问题排查中会运用得很多;
  • 设计模式,UML这个是对系统架构设计必要要掌握的知识,当你经历了很多大规模的软件系统设计,回到根本上,你会发现逃不出这一块的理论和工具;
  • 领域性的基本原则,比如我们上面提到的“钱货平衡”,“财务平衡公式”,“线下收银让消费者最快速度走人”,这种逻辑需要大家get到这些领域性的设计原理,甚至自己去总结出这种原理;
  • 关于管理学,人际沟通,心理学的一些基本原理,大家可以按照自己的实际需求去看一下。

如何在工作中学习和运用这些原理,我觉得有一个最佳实践

  • 首先,对你可能用到的领域知识,建立一个基本的概念。看书,看文章,找行业资深的人去聊,都可以得到。注意,这里需要有一个基本的概念就可以,这样你在有可能touch到这些原理的时候,你会有意识,也不至于花很多时间;
  • 在实践中,有个意识是“多问一下为什么”,并一直“刨根问底”,最终肯定能够追查到背后的最终原理;这里面还要注意思考一下,为什么在这个地方会运用这个原理,也就是找到“场景”和“原理”的关联关系,这样你的理解会更加深刻;
  • 了解了原理以后,在实践中运用一下,这样你对这个原理的理解就会非常深刻,并且你知道如何去运用这原理;
  • 如果这是一个非常重要的原理,建议大家如有余力去结合经典的书籍系统化学习。

结构化思维:构建自己的知识树

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

  1. 为什么我知道很多东西,但是当场景来的时候老是会记不起来使用;
  2. 完成一个方案你只能想到一些点状的手段,还有其他方案被漏掉了;
  3. 讲一件事情的时候逻辑非常混乱,前后没有逻辑性关联。

但是很有可能你的知识都是知道的,为什么会出现这种悲剧?

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

来看一下我们工作场景的结构化的典型案例,大家体会一下:

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

  1. 确认刚才是否有过代码变更和部署,因为有比较高的概率是刚才变更的代码又搞坏了……
  2. 追踪链路日志看链路是否有异常;
  3. 通过RPC的控制台调用看接口输入输出是否符合预期;
  4. 追踪关键方法的入参和出参,看是否有问题;
  5. 定位到方法细节后,推理逻辑是否有问题;
  6. 如果无法通过推理,那就最后一招,回放异常流量debug,这样肯定能够找到原因。

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

  1. 通过实际流量制造一个耗时较高的trace;
  2. 进行trace分析,看清楚耗时最多的原因,然后按优先级进行排序;
  3. 针对对原因找解决方案,可能的方案有:
  • 减少数据访问次数或者计算量,常见手段是增加cache:线程内的invokeCache;分布式缓存tair;页面缓存……
  • 增强处理速度,比如多线程加速;
  • 减少循环调用次数,比如请求合并后再分发;
  • 减少数据处理范围,比如减少查询内容,异步加载分页;
  • 逻辑简化,比如逻辑进行优化,或者非核心逻辑异步化等;
    ……

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

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

  1. 要一个测试账号,把相关功能走一遍,这样能非常快地了解一个系统的功能;
  2. 看关键的核心表结构,这样可以快速了解系统的领域模型;
  3. 根据功能步骤找到系统对外的接口列表,了解系统的L0业务流程;
  4. 下载系统工程,熟悉整个工程结构和模块职责;
  5. 以一个最重要的流程为入手点,阅读代码,看清楚核心的执行逻辑,可以变看边画时序图;
  6. 制造一个debug场景,以debug方式走一遍流程,这样可以实际加深一下对系统的理解;
  7. 做一个小需求,掌握相关的流程和权限;

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

  1. 看清楚之前的需求,把这个需求所在的场景和链路大致阅读一遍,搞懂;
  2. 找到需求的变化点;
  3. 分析变更的方案,涉及的内容可能会有:

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

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

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

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

b.通过逻辑路由到新的方法,这里需要增加路由逻辑;

4. 稳定性方案;

5. 发布方案;

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

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

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

  1. 一定要总结出自己的知识树,而不要盲从书本上的或者别人的,为什么呢?一是因为人的思维速度和习惯、技能有一定差异,不一定每个人都是一样的;二是如果没有内化别人的知识成为自己的知识,这棵树不太能够很熟练地运用;
  2. 习惯性总结,做完任何一个事情,都习惯性地回顾一下,往自己的树上面挂新东西,这个是构建知识树的必备手段,这个总结不需要花很多时间,比如做完事情后花个几分钟回顾一下就可以,但是需要坚持;
  3. 推荐一个很常见的工具:xmind,把自己的树记录下来;
  4. 训练自己的思维习惯和做事方式变得结构化,当你做事情的时候,习惯性用树的方式推进,强迫自己按照这个方式来。

扩展性思维:举一反三,拓展思维

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

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

(1)举一反三:解决同类型的N个问题

举一反三的好处是:“我们能否用同样的知识和手段去解决类似的相关联的几个类似问题”,先举一些案例:

  • 当发现某个系统的jvm参数配置存在一个错误配置,不是仅仅修复这个系统的jvm配置,而是把负责的几个系统都检查一下是否需要统一修改;
  • 系统中存在某个bug导致产生了脏数据,不是直接订正已发现的脏数据,而是根据特征拉取出所有的脏数据,进行一次性处理;

这种思维方式的特征是举一反三,触类旁通,相当于产生批处理的效果,可以大大提升解决问题的效率,避免重复处理。

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

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

  • 产生故障的时候,快速止血除了回滚以外,还有哪些方案?如果故障处理经验丰富的人一定知道,除了回滚,其实还有系统降级,运营活动降级等多种方案;
  • 除了写更加健壮的代码,还有哪些手段都可以提升系统的容错性?还有数据监控,单据闭环等多种手段;

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

抓重点思维:提升效率,方便记忆和传递

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

  1. 如果每件事情都按照知识树方式做,效率可能不会特别高,有更快的办法么?
  2. 在对外沟通表达的时候,要表达核心思想,否则别人会很难理解你的表达内容;比如大家再晋升答辩、项目汇报的时候一定会有体会。

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

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

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

(1)归纳法

采用归纳法,把细节隐藏掉,呈现知识的脉络,这是一种非常好的思路;尤其是大家在准备晋升ppt时,ppt的每一页都需要归纳一个核心观点,不是全是细节,这个非常重要!并且训练归纳的能力,本身就是对知识理解深刻程度的一种反映;

(2)优先级法

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

[外链图片转存中…(img-CYgKG5vB-1715759387321)]
[外链图片转存中…(img-yljRDZbs-1715759387321)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值