《程序员的底层思维》:解密软件背后的16种底层思维能力

本文是关于《程序员底层思想》的阅读笔记,读后有较大收成,分享给咱们。书中介绍了程序员应该具有的16中底层底层思想能力,只要意识到思想能力的存在,咱们才有或许去学习、操练和提升。

基础思想能力

笼统思想

笼统思想是程序员最重要的思想能力之一,笼统的进程便是经过概括概括、剖析综合来寻找共性、提炼相关概念的进程。

软件工程师每天都要动用笼统思想,首先对问题域进行剖析、概括、综合、判别、推理,然后笼统出各种概念,发掘概念和概念之间的联络,再对问题域进行建模,最终经过编程言语完成事务功用。

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

逻辑思想

逻辑思想根本包含3个方面的要素。(1)概念:概念是思想的根本单位。(2)判别(proposition,在逻辑学中也叫出题):经过概念对事物是否具有某种特点进行必定或否定的答复,便是判别。(3)推理(argument,在逻辑学中也叫证明):由一个或几个判别推出另一判别的思想方式,便是推理。

判别是概念的展开,没有判别,就不能提醒和说明概念。一起,判别也是推理的条件,是正确运用各种推理的必要条件。所谓推理,便是研究语句、判别、出题之间相互联络的学识。建模是一个概括作业,咱们经过笼统问题域里具有一起特性的类来树立模型。为了验证模型的有效性,咱们会运用演绎的办法去推演不同的事务场景,看看模型是否能满意事务的需求。

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

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

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

答:“由于机器超载,保险丝烧断了。”

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

答:“由于轴承的光滑不足。”

问:“为什么轴承会光滑不足?”(3Why)

答:“由于光滑泵吸不上来油。”

问:“为什么光滑泵吸不上来油?”(4Why)

答:“由于油泵轴磨损、松动了。”

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

答:“由于没有安装过滤器,光滑油里混进了铁屑等杂质。”

结构化思想

结构化思想是一种以逻辑(事物内涵规律)为基础,从无序到有序搭建结构的思想进程,其意图是下降杂乱度和认知本钱,由于大脑更喜爱概念少、有规律的信息。

结构是万物之本,小到分子,大到宇宙,只要了解其结构才干真实认识它。

批判性思想

批判性思想中的“批判”一词其实不太精确,甚至在中文里有点否定、批判和打击的负面意思。批判的英文是critical,这个词来自古希腊词kriticos,是分辩力、决断力或决议计划能力的意思。它着重的是理性和逻辑在思想中的重要性,意图是构成正确的定论,并做出明智的决议计划和判别。所以批判性思想并不是让你批判、否定或者打击别人,而是教你怎么提升分辩能力、判别力。

简而言之,批判性思想便是对思想进程的再考虑。古希腊哲学家苏格拉底说,未经审视的人生不值得过。相同,未经批判性思想审视过的定论也是不值得信任的。

维度思想

一个人的思想层级与其考虑的维度是正相关的,这一点可以经过咱们的日常言语得到佐证。当咱们说这个人很“轴”“一根筋”的时分,实际上是在说他只要一维的线性思想;高手的考虑会更加“全面”,由于触及“面”,所以至少是两个维度的考虑;而真实的高手,其考虑是成“体系化”的,“体”至少是三维的,也便是说他考虑到了“方方面面”。

多维度考虑是考虑的高级阶段,是体系化考虑的必备,是处理杂乱问题的一把利器。

分类思想

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

分类的意图是找到问题域中的“中心笼统”,根据这些“中心笼统”,咱们才干规划相应的范畴模型和数据模型;根据这些模型,咱们才干构建相应的系统。

没有完美的分类,任何分类都与进行分类的观察者的视角和意图有关。

分治思想

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

分治算法首要包含3个步骤:分、治、并。“分”是递归地将原问题分解成小问题;“治”是在处理了各个小问题之后(各个击破之后)兼并小问题的解,然后得到整个问题的解;“并”是按原问题的要求,将子问题的解逐层兼并,构成原问题的解。

软件中存在大量的分治思想,比如管道模式、分层架构、分布式架构等,无不表现了分治的强壮。

简略思想

把一件作业搞杂乱是一件简略的事,但要把一件杂乱的事变简略,这是一件杂乱的事。

简化实质上是一个熵减活动。全部的事物都在缓慢熵增,就像凯文凯利在《必定》一书中说到,世间万物都需求额外的能量和秩序来维持自身,无一例外。这便是闻名的热力学第二定律,即全部的事物都在缓慢地土崩瓦解。而熵减便是逆向做功,即经过更多的尽力让紊乱的系统从头归于秩序。

简略不是一个简略的方针,而是一个十分高的方针。全部的UNIX哲学浓缩为一条铁律便是KISS原则。

简略不是简陋。简略是一种洞察问题实质、化繁为简的能力,简陋是对问题不加考虑地简略处理,二者有实质区别。简略需求咱们付出许多的精力,对问题深化考虑,进行熵减逆向做功。往往需求阅历简略—杂乱—简略的演化进程。

成长型思想

想要培育自己的成长型思想,首先要学会正确点评自己,也便是要学会客观地看待自己的情况和水平,不要自视过高,也不要自暴自弃。其次,不要过分信任天资。一个人一旦信任了天资,就等于信任了自己的水平是根本不变的,就会给自己设限,觉得我只能做这个,我不适合干那个,甚至会觉得尽力是一件丢脸的作业,只要笨人才需求尽力。

看过《故意操练:怎么重新手到大师》一书的人应该知道,许多所谓的天才,其实靠的并不是天资,而是尽力!想要让自己获得成长和改变,就一定要学会用成长型思想去看待和处理问题,其要害在于不要自我设限。

专业思想能力

解耦思想

在软件范畴,“耦合”是指两个事物之间联络的严密程度。联络越严密,耦合性越高;联络越少,耦合性越低。解耦便是要削减事物之间联络的严密程度。

“计算机中的任何问题,都可以经过加一层来处理”,中间层的价值也在于解耦。

“高内聚、低耦合”是软件规划寻求的重要方针之一,组件、模块、层次规划都应该遵从“高内聚、低耦合”的规划原则。

应用架构之道,便是要完成事务逻辑和技术细节的解耦。

契约思想

“人是生而自在的,但却无往不在枷锁之中”,相同,“写代码是自在的,但无往不在规则之下”。这里的规则包含工程师必需求遵守的程序言语语法、编程标准,以及协议标准。

为了保证软件编程风格的一致性,削减为所欲为带来的杂乱度,咱们有必要运用契约思想拟定一定程度上的编程标准,去束缚团队的行为。标准的价值,就在于它能保证代码的一致性,而一致性在很大程度上可以下降认知本钱和杂乱度。

经过在团队中执行命名标准、异常处理标准、架构标准等,可以有效地帮助团队治理代码杂乱度。

社会大规模分工协作离不开契约思想,编程在很大程度上是一种“拟定契约”。

模型思想

在软件工程中,有两个高阶作业,一个是架构,另一个是建模。如果把写代码比方成“搬砖”,那么架构和建模便是“规划图纸”了。相比于编码,建模的确是对规划经验和笼统能力要求更高的一种技能。

简略来说,模型便是对实际的简化笼统。

范畴模型将实际国际笼统为了信息国际,把实际国际中的客观对象笼统为某一种信息结构,而这种信息结构并不依赖于详细的计算机系统。

范畴模型对软件开发至关重要。由于从实质上来说,软件开发便是从问题空间到处理方案空间的映射转化,而范畴模型是衔接问题和处理方案的桥梁。

范畴模型重视的是范畴知识,是事务范畴的中心实体,表现了问题域中的要害概念,以及概念之间的联络。范畴模型建模的要害在于模型能否显性化、明晰地表达事务语义,其次才是扩展性。

数据模型重视的是数据存储,全部的事务都离不开数据,以及对数据的CRUD。数据模型建模的决议计划要素首要是扩展性、性能等非功用特点,无须过多考虑事务语义的表征能力。

东西化思想

咱们可以把“懒”分为3个境地。(1)最低境地是“真实懒”,延迟症,不到万不得已,不去完成使命。(2)其次是“开通懒”,敏捷做完不喜爱的使命,以摆脱之。(3)最高境地是“才智懒”,运用东西完成不喜爱的使命,以便再也不用做无谓的重复作业,然后一了百了。

量化思想

No measurement,no improvement.(没有量化,就无法优化。)——“科学管理之父”温斯洛泰勒

一个量化的进程大体上可以分为以下3步。(1)界说方针:仔细剖析问题,找到那个可以用来量化问题的要害方针。(2)将方针数字化:环绕要害方针,清晰需求哪些数据来完成方针的计算,经过数据搜集、数据存储、数据展现去呈现方针,也便是数字化的进程。(3)优化方针:有了数据方针之后,要环绕方针数据迭代优化,达成事务方针。

量化作业自身是一件十分困难和极具应战的作业,但量化思想要求咱们不要轻易抛弃关于量化的考虑和测验。没有量化的方针,就像是断了线的风筝,没有方向,缺少指引,飞到哪里是哪里,而量化后的方针可以为咱们清楚地指引方向。

数据思想

全部事务数据化,全部数据事务化。

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

产品思想

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

作为技术人员,咱们必需求具有一定的产品思想,这样才干区分产品需求的真伪,把伪需求挡在外面,然后可以把时间放在真实有价值的项目上,少做一些无效的投入。对于团队的技术负责人来说,这种把关尤为重要。

了解产品思想,要害要了解产品的三个中心要素:用户、需求、场景。(1)用户是产品要服务的对象,即运用产品的人。(2)需求即产品要处理的中心问题是什么。需求注意的是,需求是分层次的,最浅一层是需求的表象;第二层是观点和背面的意图;最深一层是人性,每个需求挖到最终,都可以归结到人性层面。(3)场景即用户何时何地需求运用产品。

后记

希望读者可以把这些底层思想能力内化成自己的“不知道自己知道”。这些底层思想中蕴藏着处理问题的强壮力气,当它们与软件规划相遇时,会擦出耀眼的“火花”。

软件开发职业的匠心和传统职业的匠心不一样,不是重复做简略的作业,你就能把它做好。这就比如你即便做了10年的收银员,也只是一个收银员,无法成为财务总监。在软件开发职业,你需求不断地学习、不断地考虑、不断地积累、不断地测验、不断地失败、不断地立异,才有或许做得好。

优秀的工程师,心中都有一团火——一种对美的寻求和渴望。这需求咱们阅历无数个不眠之夜,承受很大的压力,受许多委屈,看许多的书,测验许多别人没有实践过的东西,要具有一颗“不妥协、不将就、不抛弃”的倔强的心。这样咱们才干做出一些与众不同的东西,才干活成自己所希望的样子。