程序员的底层思维

最近读了《程序员底层思维》,共计17种底层思维,做以下总结:

印象最深的七种思维

抽象思维:多复盘(用自己的话说而非摘录);

逻辑思维:5Why法;

结构化思维:2W1H法;

简单思维:奥卡姆剃刀;

成长型思维:成功是学习和努力的结果。不念过去,不畏将来,专注当下,拒绝精神内耗;

解耦思维:依赖倒置,设计模式;

产品思维:用户、需求和场景。

基础思维能力

抽象思维

抽象的过程就是从"具象"事物中归纳共同特征,"抽取"得到一般化的概念的过程。提升手段:多阅读;多总结(用自己的话而非摘录);代码变量命名;领域训练。

抽象思维是程序员最重要的思维能力之一,抽象的过程就是通过归纳概括、分析综合来寻找共性、提炼相关概念的过程。

软件工程师每天都要动用抽象思维,首先对问题域进行分析、归纳、综合、判断、推理,然后抽象出各种概念,挖掘概念和概念之间的关系,再对问题域进行建模,最后通过编程语言实现业务功能。

抽象具有层次性,抽象层次越高,内涵越小,外延越大,扩展性越好;反之,抽象层次越低,内涵越大,外延越小,扩展性越差,但语义表达能力越强。

逻辑思维

逻辑就是关系。逻辑三要素:概念、判断和推理。概念是核心领域词汇表,要明确且清晰;判断是推论的基础,一般是客观的陈述句,判断一定有真假之分;推理是根据判断而来的,分为演绎推理(因为...因为...所以...),归纳推理(从特殊到一般)和溯因推理(排查定位问题,大胆假设,小心求证)。提升手段:5 Why法、5 So法。

逻辑思维基本包含 3 个方面的要素。(1)概念:概念是思维的基本单位。(2)判断(proposition,在逻辑学中也叫命题):通过概念对事物是否具有某种属性进行肯定或否定的回答,就是判断。(3)推理(argument,在逻辑学中也叫论证):由一个或几个判断推出另一判断的思维形式,就是推理。

判断是概念的展开,没有判断,就不能揭示和说明概念。同时,判断也是推理的前提,是正确运用各种推理的必要条件。所谓推理,就是研究语句、判断、命题之间相互关系的学问。建模是一个归纳工作,我们通过抽象问题域里具有共同特性的类来建立模型。为了验证模型的有效性,我们会使用演绎的方法去推演不同的业务场景,看看模型是否能满足业务的需要。

大多数情况下,我们的思维逻辑链都比较短,短就意味着肤浅,找不到问题的根本原因。延长思维逻辑链的方法之一是 5Why 思考法,它能够帮助我们找到问题的根本原因。5Why 思考法,是指对一个问题连续多次追问为什么,直到找出问题的根本原因。

丰田汽车公司前副社长大野耐一曾经举了一个通过 5Why 提问法找到问题根本原因的实例。有一次,大野耐一先生见到生产线上的机器总是停转,虽然修过多次但仍不见好转,便上前询问现场的工作人员。

问:"为什么机器停了?"(1Why)

答:"因为机器超载,保险丝烧断了。"

问:"为什么机器会超载?"(2Why)

答:"因为轴承的润滑不足。"

问:"为什么轴承会润滑不足?"(3Why)

答:"因为润滑泵吸不上来油。"

问:"为什么润滑泵吸不上来油?"(4Why)

答:"因为油泵轴磨损、松动了。"

问:"为什么油泵轴磨损了?"(5Why)

答:"因为没有安装过滤器,润滑油里混进了铁屑等杂质。"

结构化思维

结构是各组成部分之间的关系,结构化思维是:以逻辑(事物内在规律)为基础,从无序到有序搭建结构的思维过程。降低复杂度和认知成本。提升手段:2W1H法,5W2H法。

关系分为横向和纵向:

  • 纵向关系:先抛结论,抽象递进。纵向逻辑主要运用演绎和归纳。演绎:A同学靠谱,原因是ABC。归纳:苹果和橘子的上一层抽象是水果。

  • 横向关系:归纳抽象,同一范畴。在纵向逻辑关系上,主要运用的是演绎逻辑和归纳逻辑。分为三种:时间顺序(活动前,活动中,活动后);空间顺序(相互独立且完全穷举,二分法,三分法,四分法,衣服按照季节分为:春秋装,冬装,夏装);程度问题(该公司存在的最严重的三个问题)。

提升手段:

  • 2W1H:What(是什么)Why(为什么)和How(怎么做)。命题是如何写好文章:什么是好文章?为什么写好文章?怎么写好文章?

  • 5W2H:最近好多线上问题。5W2H(Why,Hom much,What,How,When,Who,Where)。目的:提升大家质量意识。目标:下半年不出现P1问题。Where:哪个会议室。When:什么时间。how:故障复盘,指定防止故障策略。

批判性思维

批判性思维不是否定、批评他人,而是:1.信息太多,需要有自己的判断力。2.选择太多,理性谨慎做出决策。提升方式:逻辑思维(5Why/5So)、被动&主动复盘、独立思考。

批判性思维并不是让你批评、否定或者抨击别人,而是教你如何提升分辨能力、判断力。

简而言之,批判性思维就是对思维过程的再思考。古希腊哲学家苏格拉底说,未经审视的人生不值得过。同样,未经批判性思维审视过的结论也是不值得相信的。雷军说过,永远不要试图用战术上的勤奋,去掩盖你战略上的懒惰。

维度思维

维度思维是自下而上的:点(散点思考,指哪想哪)线(一根筋)面(二维,一分为二)体(多维,各个方面)。提升方式:多读书、被动&主动复盘、全面信息并多角度思考、小组讨论和合作。

一个人的思维层级与其思考的维度是正相关的,这一点可以通过我们的日常语言得到佐证。当我们说这个人很"轴""一根筋"的时候,实际上是在说他只有一维的线性思维;高手的思考会更加"全面",因为涉及"面",所以至少是两个维度的思考;而真正的高手,其思考是成"体系化"的,"体"至少是三维的,也就是说他考虑到了"方方面面"。

多维度思考是思考的高级阶段,是体系化思考的必备,是解决复杂问题的一把利器。

分类思维

分类是将共性的事物放在一起,共性是对象的交集,交集可以是属性,也可以是行为。提升方式:逻辑思维。

当信息量过大时,归类分组能帮助我们理解和处理问题。分类是人类大脑的识别模式,是我们化繁为简的不二法宝。在我们处理问题,特别是复杂问题的时候,分类思维扮演了极其重要的角色。

分类的目的是找到问题域中的"核心抽象",基于这些"核心抽象",我们才能设计相应的领域模型和数据模型;基于这些模型,我们才能构建相应的系统。

没有完美的分类,任何分类都与进行分类的观察者的视角和目的有关。以自然灾害分类为例:地震、台风、洪水等。

分治思维

分支思维是分解+治理+合并。只专注特定部分。提升方式:熟悉常见分治算法(快排&归并)、刻意练习和实践。

分治的价值在于,我们不应该试着在同一时间把整个问题域都塞进自己的大脑,而应该试着以某种方式去组织问题,以便能够在一个时刻专注于一个特定的部分。

分治算法主要包含 3 个步骤:分、治、并。"分"是递归地将原问题分解成小问题;"治"是在解决了各个小问题之后(各个击破之后)合并小问题的解,从而得到整个问题的解;"并"是按原问题的要求,将子问题的解逐层合并,构成原问题的解。

软件中存在大量的分治思想,比如快速排序、递归思维等,无不体现了分治的强大。

简单思维

简单是 KISS原则,复杂容易,简单难。提升原则:奥卡姆剃刀、代码涉及(隐藏实现,暴露尽可能少且简单接口)。

简单是 KISS原则(Keep it simple and stupid)。把一件事情搞复杂是一件简单的事,但要把一件复杂的事变简单,这是一件复杂的事。具体到代码设计方面:隐藏实现,暴露尽可能少且简单的接口。

简单不是简陋。简单是一种洞察问题本质、化繁为简的能力,简陋是对问题不加思考地简单处理,二者有本质区别。简单需要我们付出很多的精力,对问题深入思考,进行熵减逆向做功。往往需要经历简单---复杂---简单的演化过程。

奥卡姆剃刀:同样解释某个现象的多个理论,人们一半会选择最简单的那个理论。并非一定正确,只是启发性原则。

成长型思维

成长性思维认为成功是学习和努力的结果。提升方式:不念过去,不畏将来,专注当下,拒绝精神内耗;正念呼吸和冥想。

想要培养自己的成长型思维,首先要学会正确评价自己,也就是要学会客观地看待自己的状况和水平,不要自视过高,也不要妄自菲薄。其次,不要过分相信天分。一个人一旦相信了天分,就等于相信了自己的水平是基本不变的,就会给自己设限,觉得我只能做这个,我不适合干那个,甚至会觉得努力是一件丢脸的事情,只有笨人才需要努力。

固定型思维:不管什么时候,他们的脑子总在转动,处理大量的信息,无法放空。这就导致他们特别容易产生一种现象------"想太多"。因为他们不得不把大量的脑力和精力都用在应对脑海中不自觉产生的这些想法上,因此每天的生活几乎都处于一种"满负荷运转"的状态下。即使每天没干什么,也特别容易感到疲惫不堪。 打个比方,正常人可能有80%的精力可以用在行动上,但"想太多"的人只有30%~40%的精力可以用于行动,而这部分精力还要与占据了50%~60%脑力的"胡思乱想"做斗争。心理学上把这种现象叫作过度思虑(Overthinking),它还有一个更常见的名字------精神内耗。

看过《刻意练习:如何从新手到大师》一书的人应该知道,很多所谓的天才,其实靠的并不是天分,而是努力!想要让自己获得成长和改变,就一定要学会用成长型思维去看待和处理问题,其关键在于不要自我设限。

正念呼吸和冥想能让自己拥有平和的心态:追求内心平和有一个简单技巧------正念呼吸,即每天花一些时间,把思绪都集中到呼吸上,抛开杂念,只专注呼吸,让眉头舒展开,让僵硬的肩膀放松下来......经常这样锻炼,可以让自己平静。

欲速则不达:越慢,越快。少了几分挣扎、内耗与恐慌,多了一些平静和从容,最终得到平静、成功与幸福。

专业思维能力

解耦思维

耦合是指两件事情的紧密程度。耦合无法消除,只能降低。解耦有两种主要方式:依赖倒置解耦和中间层映射解耦。解耦的本质是依赖接口编程。何为依赖倒置? 1.上层模块不应依赖底层模块,都应依赖抽象。 2.抽象不应依赖细节,细节应该依赖抽象。利用中间层进行解耦是一个不错的方式。

在软件领域,"耦合"是指两个事物之间联系的紧密程度。联系越紧密,耦合性越高;联系越少,耦合性越低。解耦就是要减少事物之间联系的紧密程度。

"计算机中的任何问题,都可以通过加一层来解决",中间层的价值也在于解耦。

"高内聚、低耦合"是软件设计追求的重要目标之一,组件、模块、层次设计都应该遵循"高内聚、低耦合"的设计原则。

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

契约思维

契约思维包括:命名规范、异常处理规范、架构规范。命名规范是指包含中英文的领域核心词汇表。提升方式:意识培训;代码扫描工具;CR及汇总、落实规范。

"人是生而自由的,但却无往不在枷锁之中",同样,"写代码是自由的,但无往不在规则之下"。这里的规则包括工程师必须要遵守的程序语言语法、编程规范,以及协议标准。

为了保证软件编程风格的一致性,减少随心所欲带来的复杂度,我们有必要使用契约思维制定一定程度上的编程规范,去约束团队的行为。规范的价值,就在于它能保证代码的一致性,而一致性在很大程度上可以降低认知成本和复杂度。

通过在团队中落实命名规范、异常处理规范、架构规范等,可以有效地帮助团队治理代码复杂度。

社会大规模分工协作离不开契约思维,编程在很大程度上是一种"制定契约"。

模型思维

模型就是对现实的简化抽象。提升方式:UML类图。

在软件工程中,有两个高阶工作,一个是架构,另一个是建模。如果把写代码比喻成"搬砖",那么架构和建模就是"设计图纸"了。相比于编码,建模的确是对设计经验和抽象能力要求更高的一种技能。

模型大致可以分为物理模型、数学模型、概念模型和思维模型等。物理模型:风洞实验的飞机模型;数学模型:y=ax+b;概念模型:UML类图;思维模型:抽象思维,分治思维等。

在这里主要聊了概念模型UML类图:

类的UML表示法:类由类名、属性和操作三部分组成。属性的修饰符:+-#;属性和操作的格式是"可见性 操作名称(参数名称:类型):返回值类型",比如"+getName():String"。

类的关联关系:双向关联、限定关联、单向关联、自关联、聚合关系、组合关系。聚合和组合的区别在于组合成员没法单独存在。

类的依赖关系:方法中参数;局部变量;调用静态方法。

类的泛化关系:继承关系

工具化思维

工具化一般会经历3-2-1三个步骤:3是指一件事手动重复3次;2是指现状和期望之间的差距;1是指一个搞自动化工具。

我们可以把"懒"分为 3 个境界。

  1. 最低境界是"实在懒",拖延症,不到万不得已,不去完成任务。

  2. 其次是"开明懒",迅速做完不喜欢的任务,以摆脱之。

  3. 最高境界是"智慧懒",使用工具完成不喜欢的任务,以便再也不用做无谓的重复工作,从而一劳永逸。

量化思维

量化思维是三步走:定义指标;将指标数字化;优化指标。

一个量化的过程大体上可以分为以下 3 步:

  1. 定义指标:仔细分析问题,找到那个可以用来量化问题的关键指标。

  2. 将指标数字化:围绕关键指标,明确需要哪些数据来实现指标的计算,通过数据收集、数据存储、数据展现去呈现指标,也就是数字化的过程。

  3. 优化指标:有了数据指标之后,要围绕指标数据迭代优化,达成业务目标。

量化工作本身是一件非常困难和极具挑战的事情,但量化思维要求我们不要轻易放弃关于量化的思考和尝试。没有量化的目标,就像是断了线的风筝,没有方向,缺少指引,飞到哪里是哪里,而量化后的目标可以为我们清楚地指引方向。

数据思维

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

用户在 App 上的每一次浏览、每一次点击、每一次搜索等业务行为,都会被沉淀为数据保存起来,这种保存业务过程数据的做法叫作业务数据化。这些数据会帮助 App 更好地认识用户,当用户下次打开 App 时,利用这些数据,App 就可以更精准地为用户进行智能推荐和广告精准投放,这种用数据赋能业务的方法叫作数据业务化。

产品思维

产品经理关注全局,工程师关注实现细节。工程师关注How(如何做),产品经理关注Why(为什么)。产品核心三要素:用户、需求和场景。用户是产品要服务的对象;需求是产品要解决的核心问题是什么(表象->观点目的->人性);场景是用户何时何地使用此产品。

工程思维和产品思维是不一样的。工程师追求技术至上,产品经理追求商业价值和用户体验;工程师关注细节,产品经理关注全局;工程师关注 How(如何做),产品经理关注 Why(为什么)。结合两种思维方式,可以让思考更全面和系统化。

作为技术人员,我们必须要具备一定的产品思维,这样才能辨别产品需求的真伪,把伪需求挡在外面,从而可以把时间放在真正有价值的项目上,少做一些无效的投入。对于团队的技术负责人来说,这种把关尤为重要。

了解产品思维,关键要理解产品的三个核心要素:用户、需求、场景。

  1. 用户是产品要服务的对象,即使用产品的人。

  2. 需求即产品要解决的核心问题是什么。需要注意的是,需求是分层次的,最浅一层是需求的表象;第二层是观点和背后的目的;最深一层是人性,每个需求挖到最后,都可以归结到人性层面。

  3. 场景即用户何时何地需要使用产品。

如何Landing新团队?

其核心要素无外乎是人、业务、技术和文化。

人:组织架构(关键同学)、人员分工、建立关系。产出:业务全景图。

业务:了解产品(体验产品)、了解流程(角色+流程)、走访客户。

技术:系统架构(产品架构、系统架构、应用架构、业务流程图)、领域模型(关键数据结构)、代码结构(边看逻辑边画时序图)。

文化:使命、愿景、价值观。

相关推荐
007php0077 小时前
某大厂MySQL面试之SQL注入触点发现与SQLMap测试
数据库·python·sql·mysql·面试·职场和发展·golang
JosieBook1 天前
【程序人生】有梦想就能了不起,就怕你没梦想
程序人生·职场和发展
data myth1 天前
力扣1210. 穿过迷宫的最少移动次数 详解
算法·leetcode·职场和发展
Greedy Alg1 天前
LeetCode 240. 搜索二维矩阵 II
算法·leetcode·职场和发展
墨染点香1 天前
LeetCode 刷题【68. 文本左右对齐】
算法·leetcode·职场和发展
GalaxyPokemon1 天前
LeetCode - 202. 快乐数
算法·leetcode·职场和发展
吃着火锅x唱着歌1 天前
LeetCode 522.最长特殊序列2
算法·leetcode·职场和发展
CoderYanger2 天前
MySQL数据库——3.2.1 表的增删查改-查询部分(全列+指定列+去重)
java·开发语言·数据库·mysql·面试·职场和发展
yh云想2 天前
《Java线程池面试全解析:从原理到实践的高频问题汇总》
jvm·面试·职场和发展
Miraitowa_cheems2 天前
LeetCode算法日记 - Day 34: 二进制求和、字符串相乘
java·算法·leetcode·链表·职场和发展