阿里云开发社区的电子书《阿里工程师的自我修养》总结
阿里云开发社区的电子书《阿里工程师的自我修养》总结
一、结构化思维
在日常工作中,我们时常会碰到这样的情况,有的人讲事情逻辑非常混乱,罗列了很多事项,却把握不到重点,无法把一件事情说清楚。这种思维混乱是典型的缺少结构化思维的表现。
具备结构化思维,才能将问题分析地更全面、更深刻。
简单来讲,结构化思维的定义就是:逻辑+套路。所谓逻辑,就是我们的结构之间必须有逻辑关系(演绎、因果、时间、程度)。所谓套路,就是我们解决问题的方法论,比如5W2H。
进行结构化思考总的来说有两个步骤。首先是建立中心,要定义清楚要解决的问题,明确目标。然后是结构化分解,分解的策略就是四种逻辑关系。
举例来说,如何打造极客文化。这个问题的中心很明确,接下来可以按照空间顺序进行分解。
确定完要做的事情,还可以按照时间顺序对如何落地进行分解。
二、原理性思维:找到知识背后的原理
在程序员的职业里,掌握原理,比掌握某项知识更为重要。
在软件开发中,系统的复杂性会越来越高,我们面对的场景也越来越多,掌握了知识背后的原理,可以大幅度降低我们对于知识的记忆量,知识量是爆炸的,但是原理绝对是可控的。
原理性的东西比直接的知识有更强的复用度。探求原理的过程本身也很有趣。
对于程序员来说,需要掌握的原理性知识有:java,linux,数据结构和算法,数据库,网络通信与分布式计算的原理,设计模式,领域性的原理,管理学,沟通学等等。
如何在工作中学习和运用这些原理,有一个最佳实践:
- 首先,对你可能用到的领域知识,建立一个基本的概念。看书,看文章,找行业资深的人去聊,都可以得到。
- 在实践中,有个意识是 "多问一下为什么",并一直"刨根问底" 。注意思考一下,为什么在这个地方会运用这个原理,也就是找到“场景”和“原理”的关联关系,这样你的理解会更加深刻。
- 了解了原理以后,在实践中运用一下,这样你对这个原理的理解就会非深刻,并且你知道如何去运用这原理;
- 如果这是一个非常重要的原理,建议如有余力去结合经典的书籍系统化学习。
三、扩展性思维:举一反三,拓展思维
扩展性思维的核心目标是提升我们思维的广度,也就是让我们的知识树变得更加开阔。
举一反三的好处是:我们能否用同样的知识和手段去解决类似的相关联的几个类似问题。触类旁通,相当于产生批量处理的效果,大大提升解决问题的效率。
比如,系统中存在某个bug导致产生了脏数据,不是直接订正已发现的脏数据,而是根据特征拉取出所有的脏数据,进行一次性处理。
拓展思维常见的手段是:遇到问题时,是否能够换更多的理解方式,或者更多的解法。
比如,除了写更加健壮的代码,还有哪些手段都可以提升系统的容错性?还有数据监控,单据闭环等多种手段;
当解决问题的手段多了,思维自然就开阔了。
四、反思性思维:思考哪里可以做得更好
反思性思维是提升知识质量和深度的一个关键能力。因为只有不断反思才能让下一次在上一次基础上升级,而不是重复循环。
比如,一个项目做完了,去思考从方案设计,研发过程,质量保障上面,哪些地方下次可以做得更好?找到不足,下次避免。
反思性思维的实践,有两个关键点:
- 反思性思维最重要的意识:做事情的过程总有优化的空间,每次都要有进步;如果没有这种心态,那么很难持续地进行反思。
- 反思是一种习惯和潜意识,可以在不经意之间经常进行,其实不需要很形式化地花很多时间,有时候做完一个事情,习惯性思考一下就可以。
五、习惯养成
如何改掉完手机的坏习惯,把更多的时间投入提升自我上?改变为什么这么难?
首先要了解习惯的产生机制。习惯并非凭空产生,它有前因后果,前因是前一件事情结束(触发条件),后果是前一件事情结束后的行为带来的一些额外奖励。
举例来说,晚上下班回家洗完澡这件事情结束后,肯定会开始下一件我们最习惯的事情,比如盯手机看剧或者刷八卦,当这件最习惯的事情结束后,大脑会产生精神上的及时享受,内容很丰富、很精彩,但是却消耗了我们大把时间。
了解习惯产生的机制后,改变习惯就变得很简单,每次在触发条件发生时,弹出一道选择题,选择做无效事情,还是学习?多次以这种方式不断强化自己做对选择题。久而久之,正确的行为被训练得多了,就成为顺其自然的习惯了。所以改变习惯,就是在触发条件发生时,让自己做对选择题,打破旧有习惯回路,建立新的习惯回路。
六、时间管理:三八理论
每个人每天有公平的 24 个小时,第 1 个八小时用于睡觉、第 2 个八小时用于工作、第 3 个八小时用于自由支配,但人与人的差距主要是由第 3 个八小时决定的,第 3 个八小时用于消费、交易还是投资有着非常大的人生差别。以下班空闲时间为例解释消费、交易、投资从而理解人生差异的不同:
下班空闲时间,用于消费,比如刷新闻,刷抖音,刷朋友圈,产生及时享受,没产生成长,钱还是那些钱,职位还是原来职位;
下班空闲时间,用于交易,接个外快,赚点辛苦钱,产生金钱,没产生成长,钱没多多少,职位却还是原来职位;
下班空闲时间,用于投资,以终为始,相信“慢慢来,成长最快”的认知,持续不断投入多维领域的学习,沉淀能力,获得成长,从成长中获得金钱,名誉的升级;
学习必须是每日的必修课,必须是日拱一卒,持之以恒,有不断的输入,也有不断的输出,持续地沉淀,在关键时刻输出解决问题能力,从而获得能力认可。
因此必须找到不被打扰的时间用于投资自己的成长,比较好的习惯坚持早睡早起,建议12点前睡觉,睡觉前抽40分钟学习。每天7点起床,这样就会产生1~1.5个小时的学习时间。
除了三八理论,程序员的时间管理还有两点实践思路:
- 利用碎片时间。比如上下班路上的时间,吃饭的时候,可以把刚才或者今天的事情想一想,想通了,然后定期汇总一下就可以;
- 抓住工作的过程。注意,每次每次出技术方案,优化代码,排查问题,处理故障,准备晋升……都是一次训练的机会,在做事情的过程中就可以思考并快速实践。
七、职业规划
职业规划非常难,难在它是未来的一个想象空间,这个想象空间能否实现,和当下做的事情,努力的程度分不开。
职业规划不是某个岗位,某个角色,而是工作能力的提升。针对自己岗位需要的能力,职场需要的能力,然后用专家思维,多维视角重点突破 3-4 项能力,抱着 120% 的努力拿到结果,甚至是超出期望的结果,事情成了,能力也就被认可了,所谓的角色、岗位只是顺其自然的结果。但是真能这样做的人少之又少,既然是少之又少,成为少之又少的人才是你的机会。
八、持续学习
很多人都说程序员薪资水平不错,可以媲美医生和律师。然而,医生、律师能够凭之前的case 积累非常多的经验,而且这些经验很大程度上可以被复用,程序员则不同,行业更新得太快,积累的经验很快就不适用了。
程序员的自我学习需要注意以下几点:
- 工具非常熟练,在排查问题和写代码上,如果你1个小时只能尝试一种方法,别人却能 够尝试 10 次,那么别人就是比你牛。天下武功唯快不破,你后续写demo、查问题、 工具的熟练程度都会决定你学习和尝试新事物的速度。
- 读书 & 看文档
- 技术新闻,技术大会
- 做项目,写Demo,看源码。项目中多尝试一下你学到的新知识,不能惯性使用你熟悉的技术,要知 道你熟悉的东西很快会被淘汰,被淘汰后再调整就来不及了。
九、技术团队
在业务技术团队,有一个不好的趋势就是团队越来越业务,越来越没有技术味道。每个人都在谈业务,技术大会上在谈业务,周会上在聊业务,周报里写的是业务项目……唯独少被谈及的是技术本身。此处并不是说业务不重要,而是说理解业务和把控业务需求是技术人员的 base,而不是全部。
这种技术味道的缺失对技术团队来说是非常可惜的,也不利于技术人员的成长和发展。因为很难想象一个没有技术追求的团队能开发出一个健壮的、可维护性好、可扩展性好的系统。相反,这种业务代码的堆砌,从短期看也许是“较快”实现了业务需求,但是从长远来看,这种烂系统的增加会极大的阻碍业务的发展,形成一个个的黑洞应用,而工程师被裹挟在业务需求和烂系统之间,疲于应对,心力交瘁。
可以从以下几点考虑破局:
- 应用质量。代码重复率,圈复杂度,分层合理度等。
- 设计重构。错误码规范等。
- 技术分享。项目分析,周会分享等。
- code review。
- 创新提效。自动化工具等。
- 代码质量。单元测试,线上bug数统计等。
十、一位技术TL的心得
- 制定开发规范引领团队走向统一标准化开发道路。
包括命名规范、统一IDE代码模板、Maven使用规范、代码Commit规范、统一API规范、异常处理规范、分支开发规范、统一日志规范等。
- 架构评审的价值在于集众人的力量大家一起来分析看看方案里是否有坑,方案上线后是否会遇到不可逾越的重大技术问题,提前尽可能把一些事情先考虑到提出质疑其实对项目的健康发展有很大的好处。
技术评审时的注意点:技术选型、高性能、高可用、可扩展性、可伸缩性、弹性处理、兼容性、安全性、可测性、可运维性、监控与报警。
建立良好的CodeReview规范与习惯,对于一个技术团队是一件非常重要核心的事情,没有 CodeReview 的团队没有未来。
CodeReview需要关注:确认代码功能、编码规范、潜在的bug、文档和注释、重复代码、复杂度、监控与报警。