十六种思维能力,值得你收藏反复阅读

认知水平4个层次:不知道自己不知道,知道自己不知道,知道自己知道,不知道自己知道。

无意识会导致很多时候盲目做事,为了做事而做事,技能并没有得到提升。

没有好的思维模型,再多的知识积累也是低水平的重复。成人学习的目的不是获取更多的信息量,而是学习更好的思维模型。

一个人如果永远躺在自己的认知盲区,那么既得不到锻炼,更无法提高。只有意识到这些思维能力的存在,才有可能去学习、练习和提升。多阅读,扩展视野,让”不知道自己不知道“逐渐变成”知道自己不知道“,才能继续深入学习。

君子求诸己,既然没有现成的书,那就只能靠自己一点一点去摸索。摸索的过程虽然需要付出大量的时间和精力,但也充满乐趣,这是学习、成长和认知突破的乐趣。

好的思维能力是可以被复制和迁移的,它应该是普适的,而不应该有行业的界限。

第一部分 基础思维能力

抽象思维

抽象思维是软件工程师最重要的思维能力。软件设计是纯思维的创造活动,软件技术本质是一门抽象的艺术。

软件工程师每天都要动用抽象思维,首先对问题域进行分析、归纳、综合、判断、推理,然后抽象出各种概念,挖掘概念和概念之间的关系,再对问题域进行建模,最后通过编程语言实现业务功能。我们大部分时间并不是在写代码,而是在梳理需求、厘清概念。

”至于什么是时间,在没人问我时,我非常清楚;可一旦要向别人解释,我就有点糊涂了“《西方哲学史》

抽象概念更接近问题的本质。

我们的思考、对概念的表达都离不开”理念“,离不开语言。

当你在程序中创建牛(Cow)这个类(Class)的时候,他代表了对一类的的抽象。而每一个实例代表了一头头具象的牛。

命名的好坏很大程度上反映了我们对一个概念的思考是否清晰、抽象是否合理,反映在代码上就是代码的可读性、可理解性是否良好,以及设计是否到位。

语言是明细概念的基础,也是抽象思维的基础,在构建一个系统时,值得花更多时间去斟酌和推敲语言。明晰关键概念是设计中的重要工作。虽然不合理的命名和不合理的抽象也能实现业务功能,但代价就是维护系统时的极高的认知负荷。

抽象是软件设计的核心,特别是面向对象设计中,如果没有好的抽象概念,就不可能设计出和编写出好的面向对象程序。

面向对象技术:面向对象分析、面向对象设计、面向对象编程。

抽象设计的衡量标准

1.耦合性:低耦合

2.内聚性:高内聚

3.充分性:记录足够多的特征

4.完整性:某个抽象全部有意义特征

抽象缺失,相关的数据和行为分散在其他抽象概念中,将导致两个问题

1.暴露太多的细实现细节,从而违反封装原则。

2.数据和行为分散在代码的多个地方,导致代码重复、类之间的耦合度变高、代码难以维护和理解等问题。

提取重复代码只是重构工作的第一步。对重复代码进行概念抽象,寻找有意义的命名才是工作的重点。

抽象建议:

1.对于明显具备共性的模块,尽早抽象。

2.对于共性不确定的模块,事后抽象。

抽象的特点:忽略细节、代表了共同性质、具有层次性。

对于抽象层次的权衡是系统设计的关键所在。

越是复杂的问题越需要分层抽象,分层是分而治之,抽象是对问题域的合理划分和概念语义的表达。

面向对象设计原则:SOLID

抽象层次一致性原则:抽象层次要保持一致,一致性可以减少混乱,并减低理解成本。

结构化思维中,结构的每一层要属于同一个逻辑范畴、同一个抽象层次。

锻炼抽象思维能力:多阅读、勤总结、命名训练、领域建模训练。

逻辑思维

在思考问题时,要做到逻辑完整;表达观点时,做到逻辑清晰。

逻辑就是关系,逻辑是指思维的规律和规则。

逻辑学是研究用于区分正确推理与不正确推理的方法和原理的学问。《逻辑学导论》

无逻辑就是没有建立起事物的正确关系,有逻辑就是建立事物之间的正确关系。

逻辑思维3方面要素:概念、判断、推理。

逻辑思维的核心是明确的定义概念,正确地使用判断,合理地进行推理。

逻辑思维的要义在于正确运用概念、判断、推理的思维形式。

概念要明确且清晰,任何领域都应该有一份核心领域词汇表,方便团队在这些核心概念的表达和命名上达成共识。

罗伯特卡茨模型:技术技能、人际关系技能、概念技能。

概念技能是对复杂情况进行抽象和概念化的技能。

判断是概念的展开,没有判断,就不能揭示和说明概念。判断也是推理的前提,是正确运用各种推理的必要条件。

演绎推理:从一般到特殊的过程。大前提、小前提、结论。

归纳推理:从特殊到一般的过程。

建模是一个归纳工作,通过抽象问题域里具有共同特性的类来建立模型。为了验证模型的有效性,使用演绎的方法去推理不同的业务场景。

溯因推理:大胆假设,小心求证。

逻辑链:5why思考法、5so思考法。

凡是多问几个为什么,做到知其然,知其所以然。

逻辑谬误:偷换概念、错误假设、循环论证、以偏概全、滑坡谬误。

结构化思维

金字塔原理是思考、表达和解决问题的逻辑。–芭芭拉·明托

结构化思维以逻辑思维为基础,是一种从无序到有序、从混乱到清晰的思维能力,可以帮助我们以一定的逻辑顺序从繁杂的信息中整理出清晰的结构,从而使写作和表达更清晰和易于理解。

结构:各要素的组织形式。

架构:要素+结构

大脑处理信息特点:不能处理过多信息、擅长处理有规律信息。

满足金字塔原理的代码,其可读性和可理解性会显著提升。

金子塔结构:纵向关系满足结论先行、以上统下;横向关系满足归类分组、逻辑递进。

纵向逻辑关系:演绎逻辑、归纳逻辑。

横向逻辑关系:时间顺序、空间顺序、程度顺序。

MECE原则:各部分之间相互独立、所有部分完全穷尽。

构建金字塔结构

1.自上而下构建金字塔结构,问题分解

2.自下而上构建金字塔结构,概括总结

5W2H:why、who、when、where、what、how、how much。

2W1H:是什么、为什么、怎么做(一个问题最核心的3个要素)

示例:如何写好技术文章

1.为什么要写文章 1)写文章是费曼学习法;2)写文章可以增加影响力

2.什么是要文章 1)有价值 2)结构清晰

3.如何写好文章 1)选择好内容 2)搭建清晰结构 3)刻意练习 4)迭代优化

写出优雅代码也许不在于运用多么高深的技法,而在于是否能静下心来把结构梳理清晰。

自上而下的结构化分解可以帮助我们更加清晰地整理业务逻辑、表达业务过程,这种分解非常有必要,但它过于面向过程,导致代码的复用、扩展和语义表达能力偏弱。因此还需要自下而上的抽象建模,提升代码的复用性、扩展性、业务语义表达能力。

营销策略4P模型:产品策略、价格策略、渠道策略、促销策略

思考组织战略7S模型:经营策略、组织结构、运营系统、经营风格、职员、组织技能、共享价值观

分析竞争力SWOT模型:优势、劣势、机会、威胁

指定目标的SMART模型:确定性、可度量性、可实现性、相关性、时效性

批判性思维

未经审视的人生不值得过–苏格拉底

当一个架构师设计一个系统的时候,如果选择重用,那么同时也选择了耦合。重用不管是通过组合还是继承实现,都会引入耦合。然而,如果你不想耦合,可以采用重复代替重用。《软件架构》

架构:要素结构+关系+指导原则。

架构能力实际是一套分析问题、解决问题的方法论。它需要你具备洞察问题本质要素、厘清要素之间关系,以及制定相关策略的能力。

架构能力是核心竞争力,只要持续学习,持续成长,长期积累,架构能力是可以习得的。

面对烂系统时,你仍然会寸步难行,因为你大部分的精力不是在开发需求,而是在应对混乱。–Robert C.Martin

永远不要试图用战术上的勤奋,去掩盖战略上的懒惰。一定要勤于思考,善于思考。

元认知:思考自己的思考。通过反省发现自己思维中的不足,进行自我批判,提升思维质量。

不要把自信建立在贬低他人的基础上,什么时候你能发自内心地欣赏你不喜欢的人,你就成长了。

寸有所长,尺有所短。严以待己,宽以待人。己所不欲,勿施于人。

维度思维

这个世界不是只有是非黑白,还有很多灰色地带。

矩阵分析:思考的维度越多,对问题的理解就会越全面。

如果一个人一生只能收到点状努力的即时收益,从来没有享受过一次线性周期的成果回报,这就叫穷人勤奋的一生。

消除if else:多态扩展(重用)、代码分离(重复)

Excel:天然的矩阵分析工具。

矩阵分析过程:发现问题的关键要素、构建矩阵、呈现矩阵

桥接模式:将抽象与实现分离,使它们可以独立变化。桥接模式使用了组合关系代替继承关系,从而降低了抽象和实现这两个可变维度的耦合度。

需求管理矩阵图

分类思维

设计就是分类。

分类和抽象是基础的思维能力。

分类:将拥有共性的事物放在一起,共性体现在对象的属性上。

分类方法:经典分类、概念聚集分类。

经典分类:所有具有某一个或某一组共同属性的实体构成了一个分类,而这个属性对于定义这个分类是必要且充分的。

概念聚集分类:概念描述、根据描述分类。

分治思维

要把大象装进冰箱,分几步,打开冰箱,把大象放进去,关闭冰箱。

分治的价值在于,不应该是这在同一时间把整个问题一起解决,而应该试着以某种方式去组织问题,以便能够在一个时刻只专注于一个特定的部分。

网络分层模型也是分治思维的一种体现。

管道模式也是一种分治思维。

责任链模式

CAP理论:一个分布式系统中,一致性、可用性、分区容错性这三个要素最多同时实现两个,而对于分布式来说,分区容错性,必须满足,则一致性和可用性,只能满足一个,剩下的一个不能百分百满足。

数据拆分:竖切、横切

分治算法:分、治、并

解决问题的黄金三步:定义问题、分解问题、解决问题并合并

分并治应用:分治算法、流式计算、分布式数据库

简单思维

一旦做到了简洁,你将无所不能。

unix哲学:KISS原则

缩减你所能缩减的,在不失内在价值感的前提下把其他所有都尽可能隐藏起来。

给用户太多选择,有时还不如不给选择,因为用户通常也不知道自己要什么。

奥卡姆剃刀:如无必要,勿增实体。

状态机

成长型思维

只有一条路不能拒绝,那就是成长的路。

决定你成长的第一步不是你是否努力,而是你是否相信努力。

成功往往是一时的,而成长才是一辈子的。

相信发展,相信改变,容易形成正反馈,以微弱优势势能。

痛苦很大程度上不是来自于外界,而是来自于自我评判(放下对自我评判,接纳自己)。

不同的人在面对竞争、失败、挫折的时候,会有不同的想法和做法,这个反应就是你的思维模式。卡罗尔教授把这种思维模式分为两种,成长型思维和固定型思维。

拥有成长型思维的人认为成功是学习的结果,努力是通往成功的关键。在成长型思维模式的世界中,个人能力是可以改变的,你需要提高自己,去学习新的知识,从失败中吸取经验教训,提高自己的能力。

成功个体的标志,在于他们热爱学习,喜欢挑战,重视努力,并在面对苦难时,坚韧不拔。

大脑的可塑性,知道大脑是可塑的,就有了改变人生的机会。

培养成长型思维:正确评价自己,不要过分相信天分,相信努力。

不要总是等到什么准备好了才开始行动。什么时候开始都不晚,现在的你是由过去的你塑造,而未来的你是由现在的你决定的。

所谓擅长,只是因为你做多了,掌握了规律和技巧,从而熟练了而已。

明确努力的意义、改变归因习惯。

充分相信自己,抛开他人的眼光和自己脆弱的自尊心,给自己时间,用学习和努力代替无畏的焦虑和内耗。

摆脱过渡思考:最好的状态就是全神贯注地做你当前正在做的事情,不论是学习、工作、思考,还是娱乐。

我们的大脑在什么也不干的情况下,也是在运转的。这时,大脑的运转模式叫做默认模式网络。默认模式网络过分活跃是导致精神内耗的主要原因。可以通过提升专注力和行动力来抑制默认模式网络,正念和瑜伽是提升专注力很好的方式。

可以练习3F原则:专注,反馈,纠正(补充一个重复)

对于一件事,如果你想不到特别有力的不去做的原因,那么就优先选择去做。

拒绝模糊:问题永远都不会得到解决,会一直残留在你的记忆里,随着默认模式网络的激活而占用你的认知资源。只有去行动了,你才能把未知变成已知,把不确定变成确定,让它们在大脑中得到安放和处置,不再干扰你的思考。(把问题清晰的写下来,也能减少大脑的负担)

持续精进:每次比上次进步一点点。

只有在一个领域持续地学习、思考、实践,才有可能成为这个领域的专家。

保持好奇心:成长需要好奇心的牵引,要学会苦中作乐。

学习的动力不应该仅仅来自于外界的压力,更应该来自于内在,来自于内心对学习的渴望和好奇。

守住平常心:平和的心态是持续成长的基础,内心平和的人可以更加专注于学习和工作上;内心挣扎的人,需要支配更多的精力去应付内耗,那么投入在学习和工作上的精力自然就减少了。

追求内心平和简单技巧:正念呼吸,每天花一些时间,把思绪都集中到呼吸上,抛开杂念,只专注于呼吸,让眉头舒展开,让僵硬的肩膀放松下来。另一种锻炼方式是先停下手头在做的一切事情,先深呼吸一到两次,然后按顺序问自己:我现在看到了什么?听到了什么?嗅到了什么?手和脚触碰到了什么?感觉是怎么样的?也可以闭上眼睛,依靠自己的感官走上几步,在这个过程中专注于感受,感官传来的信息。

平和的强大之处在于,真正平和的人了解自己所有的主观感受都只是一瞬间的波动。虽然疼痛,但不再感到悲惨;虽然愉悦,但不再干扰到心灵的平静。《人类简史:从动物到上帝》

慢即是快:慢是将自己内心与头脑中的焦虑与浮躁放下来,活在当下,认真、耐心、从容地对待每一刻。

没有人能随随便便成功,失败并不可怕,可怕的是失去信心和斗志。努力不一定会成功,但不努力肯定不会成功,不相信努力肯定也不会成功。

第二部分 专业思维能力

解耦思维

高内聚,低耦合,通过降低模块之间的耦合性来提升模块的独立性、扩展性和重用性。

耦合:事物之间联系的紧密程度。联系越紧密,耦合性越高。

解耦:较少事物之间联系的紧密程度。

解耦的方式:依赖倒置、中间层映射

中间层:计算机中的任何问题,都可以通过加一层来解决。

DNS:解开了域名和服务器IP之间的耦合。

CNAME:解开了域名和CDN提供商之间的耦合。

应用架构之道,就是要实现业务逻辑和技术细节的解耦。

面向接口编程:依赖于抽象。

契约思维

人是生而自由的,但却无往不在枷锁中。–卢梭

规范的价值:在于它能保证代码的一致性,而一致性在很大程度上可以降低认知成本和复杂度。

命名规范、异常处理规范、架构规范

API设计遵循3个标准:可理解性、封装性、可扩展性。

扩展的实现方式:基于接口的扩展、基于配置数据的扩展。

模型思维

建模的艺术就是去除是在中与问题无关的部分。

在软件工程中,有两个高阶工作,一个是架构,另一个是建模。

模型就是对现实的简化抽象。

如果一件事物随着另外一件事物的改变而改变,那么此事物就是另一件事物的模型。

模型分类:物理模型、数学模型、概念模型、思维模型

熟练地使用抽象思维,分类思维去做领域建模;运用结构化思维做技术规划;运用逻辑思维和批判性思维分析问题;熟知奥卡姆剃刀原则,能用工具化思维,产品化思维,分治思维高效地分析问题,解决问题;能用数据思维、量化思维给业务助力;在面对困难和挑战时,你信心十足,因为你相信学习和成长的力量。

统一建模语言:UML

UML拥有一种定义良好、富有表现力的表示法,对于软件开发过程非常重要。推荐书籍Grady Booch《面向对象分析与设计》和Larman的《UML和模式应用》。

类:类名、属性、操作

类的关联关系:双向关联、限定关联、单向关联、自关联、聚合关系、组合关系

类的依赖关系、类的泛化关系、类与接口的实现关系。

领域模型:对领域内的概念类或现实世界中对象的可视化表示。

软件开发就是从问题空间到解决方案空间的映射转化,领域模型是连接问题和解决方案的桥梁。

上下文映射:不同领域之间进行概念转化、信息传递的动作。

上下文映射两种解决方案:共享内核、防腐层。

面对系统架构,总要在重复和复用之间做折中和权衡。

领域模型关注的是领域知识,是业务领域的核心试题,体现了问题域中的关键概念,以及概念之间的关系。

领域模型建模的关键在于模型是否显性化、清晰地表达业务语义,其次才是扩展性。

数据模型关注的是数据存储,所有的业务都离不开数据,以及对数据的CRUD。数据模型建模的决策因素主要是扩展性、性能等非功能属性,无需过多地考虑业务语义的表征能力。

架构整洁之道:领域模型是核心,数据模型是技术细节。

数据模型负责数据存储,其要义是扩展性、灵活性、性能;领域模型负责业务逻辑的实现,其要义是业务语义显性化的表达,以及充分利用面向对象的特性增强代码的业务表征能力。

工具化思维

懒人的逻辑中也有其合理的一面,勤劳奋斗的逻辑中也必定有其荒唐的一面。

通过工具提效,从而节省大量的工作时间,而不是靠蛮力一遍一遍地重复手动劳动。

要学会偷懒,能让计算机去做的事情,就尽量不要手动去做。

自动化运维就是通过工具化不断提升研发效率的成果。

带着工具化思维去看待问题,你会发现工作中有很多提效的工作可以挖掘。

对象关系映射ORM:一对一、一对多、多对多

量化思维

没有量化,就无法优化。

量化的步骤:定义指标、将指标数字化、优化指标

定义问题永远是解决问题的首要任务。

AARRR增长漏斗模型:拉新、促活、留存、付费、推荐

指标数据化:数据采集、数据传输、数据建模/存储、数据统计/分析/挖掘、数据可视化/反馈

人的天性更喜欢获得,而不是失去。

度量的设计目标是能够引导出正确的行为。

平均缺陷修复时间来衡量代码质量。

SMART原则:明确性、可衡量性、可行性、关联性、时限性

量化后的目标可以指引方向,起到引导作用。

数据思维

一切业务数据化,一切数据业务化。

大数据解决方案:数据仓库、ETL、元数据、分布式数据存储、流式计算

产品思维

产品就是用来解决某个问题的东西。

产品三要素:用户、需求、场景

用户是产品要服务的对象;需求是产品要解决的核心问题是什么。场景是用户何时何地需要使用产品。

从用户需求角度产品分类:工具、内容、社交、交易、平台、游戏。

产品架构三个层次:

1.用户感知层:在何种场景下通过何种方式触达用户。

2.功能模块层:通过哪些功能模块实现产品的核心功能,以及哪些为外部平台功能有信息交互。

3.数据层:产品的数据从哪里来,产品的数据沉淀到何处去。

一个好的产品架构具备特点:清晰的模块功能边界。功能经过抽象,做到标准化,互相独立。上下游产品功能边界清晰,架构分层明确合理。

产品化述求的核心要点是将一种技术能力或一种服务能力与个体分开,形成不依托于个体存在的能力,这样才能体现可复制和可移植的特点。

第三部分 思维能力的综合应用

人是能够习惯于任何环境的生物,之前你认为自己难以克服的困难,慢慢都适应了。《活出生命的意义》

思维能力的沉淀正是在解决各种问题的阶段形成的。

熟悉新事务的过程与打游戏点亮地图、获得新技能建立心理表征的过程是一样的。

所谓的高手,就是那些能快速理解业务,抓住事物本质、点亮地图的人;而没有经验的新手往往是一通乱抓,找不到重点。

对于一个企业来说,其核心要素无外乎是人、业务、技术和文化。

问题的本质在于结构,问题的核心是如何对复杂业务进行结构化分解,在复杂的业务逻辑都可以利用结构化思维对其进行有层次、有逻辑的分解。

看起来很困难的事,刻意练习多了,也就不困难了。

复杂业务的应对之道是结合自上而下的结构化分解+自下而上的抽象建模,同时要在过程中随时调整、重构结构和模型,将可复用的能力下沉,从而提升系统的可维护性。

软件的首要技术使命:管理复杂度。

复杂度来自哪里:随心所欲、面向过程、分层不合理、扩展性差。
原文链接:程序员底层的思维

写的不好,就当是整理下思绪吧。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

我的学习方法论只能依附9年义务教育培养的系统学习了,小时候学习时间压榨的厉害全是被迫学习所以很厌烦导致无法自主学习,很抗拒,现在读书都是进不到脑子里,需要一个契机让人爱上学习吧

1个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!