思想篇:
八、抽象
按照维基百科上的解释,抽象是指为了某种目的,对一个概念或一种现象包含的信息进行过滤,移除不相关的信息,只保留与某种最终目的相关的信息。
从另一个角度看,抽象就是简化事物,抓住事物本质的过程。抽象帮助我们将现实世界的对象抽象成类,完成从现实世界的概念到计算机世界的模型的映射。
面向对象的思想主要包括3个方面:面向对象的分析(Object Oriented Analysis,OOA)、面向对象的设计(Object Oriented Design,OOD),以及我们经常提到的面向对象的编程(Object Oriented Programming,OOP)。
简单来说,抽象的过程就是合并同类项、归并分类和寻找共性的过程。也就是将有内在逻辑关系的事物放在一起,然后给这个分类进行命名,这个名字就代表了这组分类的抽象。
在开发工作中,很多时候就需要通过抽象层次的提升来提高代码的可读性和通用性。
为什么阅读书籍比看电视更好呢?因为图像比文字更加具象,阅读的过程可以锻炼我们的抽象能力、想象能力,而看画面时你的大脑会被铺满,较少需要抽象和想象。
做总结最好的方式就是写文章,小到博文,大到一本书,都是锻炼自己抽象思维和结构化思维的机会。记录也是很好的总结习惯。以读书笔记来说,最好不要原文摘录书中的内容,而是要用自己的话总结归纳,这样不仅可以加深理解,还可以提升自己的抽象思维能力。
对于技术人员来说,还有一个非常好的提升抽象能力的手段——领域建模。当我们对问题域进行分析、整理和抽象时,或对领域进行划分和建模时,实际上都是在锻炼我们的抽象能力。
九、分治
“分”就是递归地将原问题分解成小问题;“治”则是在解决了各个小问题(各个击破)之后合并小问题的解,从而得到整个问题的解。
分治法解题的一般步骤如下。
(1)分解:将要解决的问题划分成若干规模较小的同类问题。
(2)求解:当子问题划分得足够小时,用较简单的方法解决。
(3)合并:按原问题的要求,将子问题的解逐层合并,构成原问题的解。关于函数分解,在此强调以下两点。
(1)函数长短是职责单一的充分不必要条件,也就是长函数往往意味着职责不单一,但是短函数也不一定就意味着职责单一。
(2)在使用组合函数模式时,要注意抽象层次一致性原则(Single Level ofAbstration Principle,SLAP),不同抽象层次的内容放在一起会给人凌乱、逻辑不协调的感觉。优雅的代码很少是一次成形的,大部分情况下要经过两次创造:第一遍实现功能,第二遍重构优化。
重构优化,即在第一遍实现功能的基础上,看一看是否可以做得更好:命名合理吗?职责单一吗?满足OCP吗?函数是否过长?抽象是否合理?
分层架构的目的是通过分离关注点来降低系统的复杂度,同时满足单一职责、高内聚、低耦合、提高可复用性和降低维护成本,也是一种典型的分治思想。
所谓竖切,就是按照领域将单体数据库拆分成多个数据库。比如,原来电商数据都是放在一个库中,我们可以按照领域拆分成商品库、会员库、交易库等。
横切是通过一种数据路由算法对数据进行分片,从而减少一个数据库中的数据量。比如,我们要将会员的交易数据切分成10个库,可以用userId对10进行取模。
十、技术人的素养
- 不教条
- 批判性思维
- 批判性思维(Critical Thinking)是一种谨慎运用推理去断定一个断言是否为真的能力。它要求我们保持思考的自主性和逻辑的严密性,不被动地全盘接受,也不刻意地带着偏见去驳斥一个观点。
- 尼尔·布朗写的被誉为批判性思维领域经典读物的《学会提问》,另一本是樊登读书会推荐的《思辨与立场:生活中无处不在的批判性思维工具》
- 成长型思维
- 越挫越勇,把每一次失败都当成学习的机会。
- 具有成长型思维的人相信自己可以通过学习来提升自我,相信学习和成长的力量,相信努力可以改变智力和能力。
- 我们需要具备成长型思维才能应对工作和生活中的压力,这样在遇到问题时,我们才不会轻言放弃,而是会积极主动地去学习,去寻找解决方案。
- 结构化思维
结构化思维的定义就是“逻辑+套路”。
所谓逻辑,是指结构之间必须是有逻辑关系的。
组织思想的逻辑只有4种。
(1)演绎顺序:比如“大前提、小前提、结论”的演绎推理方式就是演绎顺序的。
(2)时间(步骤)顺序:比如“第一、第二、第三”和“首先、再者、然后”等,大多数的时间顺序同时也是因果顺序。
(3)空间(结构)顺序:比如“前端、后端、数据”和“波士顿、纽约、华盛顿”等,化整为零(将整体分解为部分)等都是空间顺序。在做空间分解时,要注意满足“相互独立,完全穷尽”(Mutually Exclusive Collectively Exhaustive,MECE)原则。
(4)程度(重要性)顺序:比如“最重要、次重要、不重要”等。套路是指我们解决问题的方法论、路径和经验。
逻辑是一种能力,而套路是方法论、经验;逻辑属于道,而方法论属于术。二者都很重要,只有熟练地掌握二者,我们才能有更好的结构化思维。
最清晰和实用的结构化表达是“提出问题,定义问题,分析问题,解决问题,最后展望未来”。
5 工具化思维
- 偷懒也有高低之分,可以分为3个境界。
(1)最差的境界是“实在懒”,拖延不喜欢的任务。
(2)其次是“开明懒”,迅速做完不喜欢的任务,以摆脱之。
(3)最高的境界是“智慧懒”,编写某个工具来完成不喜欢的任务,以便再也不用做这样的事情了,从而一劳永逸。- “硬干”或“苦干”并没有带着光环,而是一种徒劳、低效、大可不必的努力,只会说明你做事情很急切,但并不是在完成工作。人们容易混淆行动与进展、混淆忙碌与多产的概念。
- 在有效的工作中,最重要的是思考,而人在思考时通常看上去不会很忙。如果和我共事的程序员总是忙个不停,我会认为他并非优秀的程序员,因为他没用最有价值的工具——自己的大脑。
- 每当你重复同样的工作3次以上,就应该停下来问问自己:我是不是可以通过自动化脚本、配置化,或者小工具来帮助自己提效?
6 好奇心
- 好奇心是学习的起点,是创新的原动力。我们每个人都应该像小孩子一样保持对知识的渴望,对世界的惊奇。
7 记笔记
- 首先,做笔记的人基本都是持续学习的人;其次,记录本身也有很多好处。
(1)知识内化:记笔记的过程是一个归纳整理、再理解、再吸收的过程,可以加深我们对知识的理解。
(2)形成知识体系:零散的知识很容易被遗忘,而形成知识体系之后,知识之间就能有更强的连接。
(3)方便回顾:笔记就像我们的硬盘,当缓存失效后,我们依然可以通过硬盘调回,保证知识不丢失。- (1)使用云笔记:云笔记要能在多端使用,要有目录的层次结构、标签和搜索功能。如果有些场合只能用笔做记录,也没关系,回来之后再整理到云笔记上。
(2)归类分组:要定期回顾笔记内容,尽量按照合理的方式对笔记进行重组,形成一个有逻辑关系的树形结构。这样既方便记忆检索,也可以逐渐形成自己的知识体系。对于归于A组或B组都没错的笔记,可以使用标签来辅助分类。
(3)不要复制粘贴:好的笔记最好是自己消化后的总结,而不是简单的照抄。如果有引用和参考,建议把链接也放在笔记下面,方便溯源。
(4)结构化表达:对于简短的内容要重点突出,粗体显示重点部分;对于篇幅较长的内容,最好有目录,这样可以更加结构化地呈现笔记内容。8 有目标
- “你要做一个什么样的人”并不是一个可有可无的次要问题,而是首先要回答的头等大问题。
- 先想清楚目标,然后努力实现。不管是人生大问题,还是阶段性要完成的事情,都需要目标清晰、有的放矢。
- 在这个信息爆炸的时代,如果只是碎片化地接收各个公众号推送的文章,学习效果几乎可以忽略不计。在学习之前,我们一定要问自己,这次学习的目标是什么?
9 选择的自由
- 自由是一种价值观,是一种为自己过去、现在及未来的行为负责的价值观。自由是一种责任,是一种敢于做出选择,并愿意为自己的选择承担后果的责任。
- 责任感(Responsible),从构词法来说是“能够回应(Response—able)”的意思,即选择回应的能力。
- 积极主动的人有选择的自由,而消极被动的人往往是被动地接受影响,忘记了自己的主观能动性,忘记了在刺激和回应之间还有选择的自由
- 但凡成大事者,都能够“处乱世而不惊,临虚空而不惧,喜迎阴晴圆缺,笑傲雨雪风霜”。正因为他们是自己思维的主人,而不是被思维所控制,他们知道不管身处什么样的境地,都有“选择的自由”。
10 平和的心态
- 首先,我们做事情的出发点必须是善的。其次,“有为的事”是指要认真做事,认真生活;“无为的心”代表一种平和的心态,一种活在当下的智慧。也就是做事要积极,但是心态要放平。
- 真正平和的人了解自己所有的主观感受都只是一瞬间的波动。虽然疼痛,但不再感到悲惨;虽然愉悦,但不再干扰心灵的平静。于是,心灵变得一片澄明、自在。心灵平静的力量十分强大,那些穷极一生疯狂追求愉悦心情的人完全难以想象。
11 精进
精进就是你每天必须进步一点点!
- 巴菲特说:“人生就像滚雪球,关键是要找到足够湿的雪,和足够长的坡。”
- 但凡能持续学习和精进的人,其结果都不会差。
十一、技术Leader的修养
技术氛围
- 代码好坏味道
- 技术分享
- CR周报
- 读书会
目标管理
- 一个好的Leader,应该是愿意花时间和下属一起讨论、制定目标的。在过程中,给予帮助和指导,及时对焦纠偏,确保目标的达成。
- 目标管理的常见手段有关键绩效指标(Key Performance Index,KPI)和目标与关键成果(Objectives Key Results,OKR)两种方法。相比较而言,一味地追求KPI,可能会导致短视;OKR更注重短期利益和长期战略之间的平衡。
- OKR主要有如下两个特点。
(1)OKR可以不和绩效挂钩,主要强调沟通和方向。
(2)OKR比KPI多了一个层级的概念,O(Objective)是要有野心的、有一定的模糊性,但是KR(Key Results)需要是可量化的,并且KR一定要为O服务,不能偏离O的方向。- SMART原则 : S代表Specific,表示指标要具体;M代表Measurable,表示指标要可衡量;A代表Attainable,表示指标是有可能达成的;R代表Relevant,表示KR和O要有一定的相关性;最后,T代表Time bound,表示指标必须具有明确的截止期限。
- OKR中的目标必须是有野心的。因为只有高远的目标,才能最大程度地激发人的潜能。
技术规划
- 技术规划更多的是从团队视角去看接下来要做的事情,而目标管理是要把规划要做的事情进行拆解,和个人目标对齐。
- 第一层问题解决是最直接的,主要看团队中现在有什么迫切、紧急的问题需要解决,有哪些坑要去填。
- 技术领域要做的是在这些常规领域中,根据业务情况和团队情况选择一些领域和命题(比如稳定、性能、效率等),并在这些命题和方向中根据优先级做判断。
- 让业务先赢是技术的首要使命。
- 作为技术团队,我们要对比团队内外技术的异同,最终圈定一个差异化区域。这块区域是团队的特色技术,是团队借外力之外要修内功的部分,是不依赖别人而主要靠自己突破的部分,是团队相比外面的差异化竞争力。
推理阶梯
- “推理阶梯”的发生会经历以下步骤。:
(1)收集数据
(2)选择性接收数据
(3)做出假设,得出结论,采取行动Leader和Manager的区别
- Manager是管理事务,是控制和权威;而Leader是领导人心,是引领和激发。
- 技术Leader是专业性非常强的工作。技术Leader区别于其他Leader之处是你不仅要“以德服人”,还要“以技服人”。
视人为人
- 俗话说“做事先做人”,我们唯有尊重自己,尊重他人,视人为人,视己为人,对团队倾注感情,和团队成员建立信任关系,才有可能做一个好Leader。
- 我们做事情的出发点必须要是正的、善的。在这个大前提下,我们可以积极地拓展自己的人脉关系和影响力。
- 视人为人不仅是和他人处好关系,也是一种原则和勇气。
- 对待上级——有胆量。对待平级——有肺腑。对待下级——有心肝。