读书系列-程序员底层思维
一、前言
在微信读书上阅读了《程序员底层思维》,一本非全技术性书籍,对于技术类的书籍需要结合动手编程实践才能真正学会书中的技术要点,所以选择一本技术性不是特强的书籍在闲时阅读。本书从一个多年开发者的视角介绍思维能力的内容,作为程序员每天工作都会应用这些思维能力,但是并没有思考或者总结过这些内容。通过阅读书籍,结合开发经历做一个读书总结,在他人思考总结的基础上,理解各个思维能力,指导实际开发工作。
二、基础思维能力
基础思维是不涉及具体专业领域,在全部领域都会应用于的思维能力,在处理事情、解决问题中自热而然的应用了。包括简单思维、分类思维、批判性思维、结构化思维、抽象思维、分治思维、维度思维、成长性思维。通过对日常思维方式进行分类总结,定义上述的基础思维能力。在工作与生活中,对生活具备感性多点,对工作具备理性多点,所以从工作方面介绍思维能力,理解思维能力的应用。
1、抽象思维,抽象与之对应的是具体,在学习的过程中都愿意接受具体的、可查看、可触摸的事物,不愿意接受抽象、虚拟、不可见的事物。然而在开发设计中我们要追逐高内聚、低耦合的系统,就要求使用抽象思维,抽象的过程就是通过归纳概括、分析综合来寻找共性、提炼相关概念的过程。软件工程领域在对象设计中定义抽象类、抽象方法、基类、接口都是使用抽象思维来提炼现实世界的事物与关系;艺术创造领域在画家派系中分抽象派画家、写实派、印象派,不同风格代表不一样派系,抽象是运用各种抽象的元素和符号来表达自己的感受和对事物的理解;日常生活领域对具体一类大事物的描述,通过简单几句话、几个词来抽象表达出来,所以抽象思维是无处不在的。
案例:在某公司开发系统时接收一个需求,对不同的测算报表做相似的业务逻辑。在需求分析阶段,识别出存在相同的属性、关系、业务逻辑及差异点;在设计阶段通过面向对象编程提取公共定义抽象类,提取非对象本质的方法定义公共接口。在实现阶段具体类继承抽象类,实现继承的接口。从软件设计遵循了六大设计原则的依赖倒置原则,高层模块不应该依赖低层模块,二者都应该依赖其抽象或者抽象不应该依赖细节,细节应该依赖抽象。
2、结构化思维,所谓结构化思维,就是从无序到有序的一种思考过程,将收集到的信息、数据、知识、等素材按照一定的逻辑进行分析和整理,呈现出有序的结构,继续好化繁为简。有结构化的信息更易于大脑记忆和理解。对于复杂的问题、关系我们希望通过一定的方式方法梳理清楚,比如将各种积木按照颜色、大小、顺序搭建成金字塔的形状,这就是结构化思维。金字塔形状就是结构化的代表性,每一层意义、位置、关系都是经过结构化设计。使用自上而下、自下而上、上下结合来搭建结构。架构的核心也是结构,所谓架构,就是“要素+结构”
案例:在某公司开发系统时接收一个需求,对一个在线excel数据进行计算。分析这个需求包含多项操作包括读取表格数据、筛选数据、处理数据、回填数据、保持数据、展示数据,其整个过程就是一个结构化分析思考的过程。需求是一句话或者一个场景,里面涉及各种数据、业务逻辑、规则逻辑,第一眼杂乱没有头绪,无从下手,但是使用自上而下的方式,由目标开始到逐层分析就分析出一个解决问题层次图。比如在写业务代码逻辑时候,真个过程比较复杂,可以在代码中标记注释第一是、第二步是、第三步是...然后在每一步骤中填充代码,本质是构建结构,填充内容。所以结构化思维是整理思路、划分层次的过程。
3、逻辑思维,逻辑(logic)学是研究用于区分正确推理与不正确推理的方法和原理的学问,逻辑就是关系。逻辑思维包括三个要素概念是逻辑思维的基本单位;判断即命题对概要事物的与或非、肯定或者否定,就是判断;推理即论证由一个或者几个判断推出其他判断的思维形式。逻辑思维的要义在于正确运用概念、判断、推理的逻辑形式。逻辑推理方式包括演绎推理(因为,因为,所以,结论);归纳推理(从特殊到一般);溯因推理(大胆假设,小心求证)。逻辑谬误包括偷换概念、错误假设、循环论证、以偏概全、滑坡谬误等。可以通过5Why思考方法或者5So思考方法思考逻辑链。
案例:在某公司开发系统时,对一个负责业务逻辑,包含顺序、选择、循环的分支操作,各种与或非的判断,最后返回正确的结果。整个过程的代码编写、计算结果就是一个逻辑思维的过程,通过代码的形式呈现逻辑关系。
4、批判性思维,批判的思维并不是批判、否定或者抨击别人,而是教你如何提升分辨能力、判断力——未经审视的人生不值得过,同样,未经批判性思维审视过的结论也是不值得相信的。批判性思维在当前信息获取非常便捷、信息大爆炸时代、大数据、多媒体盛行、多选择、多元化下的尤其重要。如何评判、选择都会随着事物的变化、知识体系构建、认知层度高深、价值观的形成所影响,能确定保持理性的思考、多元化的包容,正能量的心态去评判——遵循自由、平等、博爱的观点看待人与事。在工作领域对新的技术、新的架构、新的设计保持批判的思维进行取舍。
案例:在某公司开发系统时,高级架构师引入了一个超前的框架,解决公司业务问题,在运行一段时间后,领导提问参与人员,对这个架构进行评价一下。A员工:这个架构很完善、很丰富、架构师设计很好,在技术领域属于超前水平。B员工:这个框架功能丰富,但是这个框架一部分内容还没有以前使用建单方式处理的效率高,并且学习成本高、不易于新手掌握等。从上述对话A员工完全站在技术的角度、欣赏技术的超高水平,没有考虑实际情况。B员工批判的思维分析这个框架对于当前业务的一个体验效果。所以在开发设计的时候要批评的思维,比如是否使用中台?、是否使用微服务或者单体更好?、是否引入中间件?、是否更新技术版本?、是否更换技术路线?都是需要批判性论证,不能因为技术的先进或者潮流盲目跟进导致无法控制。
5、维度思维,维度思维的关键是理解维度,维度是问题域独立参数或变量的数量。在问题域中经常涉及到多个维度交织的不同业务逻辑,如何快速清晰的理解问题,解决问题就要维度思维,借助工具如矩阵分析、波士顿矩阵、订单要素分析、RFM模型、相关系数矩阵、逻辑推理中的矩阵,立体图从X/Y/Z等多个象限设置维度,然后在交汇处获取结论的方式。在设计模式中桥接模型抽象与实现分离,可以独立变化,桥接模式使用组合关系代替继承关系,从而降低抽象和实现这两个可变维度的耦合,通过维度划分,使抽象组合,不仅减少类的数量,也给后续扩展预留空间。在组织管理中的人员分工矩阵、人才盘点矩阵、需求管理矩阵都是维度思维的应用。
案例:在某公司开发系统时,接收一个需求统计支路、部门、区域、建筑节点与能源(水、点、气)类型,按照概述、排名、汇总、差异的方式呈现。上述需求涉及到三个要素统计节点、统计类型、统计方式对应矩阵呈现多个视角。如果不按照维度划分,要完成三个要素的统计数据,容易遗漏,使用维度的方式,确定各个要素的维度数量、独立参数,然后在矩阵分析的方式进行组合,获取各个维度业务逻辑,清晰明了的呈现需求集。
6、分类思维,分类的本质是将共有的事物放在一起,共性主要体现在对象的属性上,所谓共性,本质就是对象之间的交集,属性是事物的性质与事物间的关系的统称。分类是本能,比如在生活领域中垃圾分类,定义不同物品的共性进行垃圾的分类处理;工作中按照不同的工种、工作性质划分部门与职位信息。在软件设计中的分类如对象分类,面向对象设计中对实物,角色,事件,交互,概念的候选类和对象的划分;构建分类对整个应用程序按包、组件、模块、应用、平台进行分类;领域分类是领域驱动设计思想对业务领域划分如电商业务的用户领域、订单领域、交易领域、商品领域等待划分。在管理中的组织架构分类管理,互联网产业的分类都是分类思维的体现。所以分类无处不在,分类是人的本能,设计就是分类的过程。
案例:在某公司开发系统时,对整个业务梳理过程,从实物层面->业务层面->业务建模->系统设计->功能模块设计->代码编写都是不断分类,整理合并的过程。按相同类型划分,归纳在一块,定义成一个整体,后续的变更调整都是在分类中进行,减少耦合的关系。
7、分治思维,分治即分解+治理,分治并也是分治一种即分解+治理+合并的过程,使用分治思维对问题进行分解,然后着力于各个分解的问题进行求解,然后合并最终结果集。在分治设计模式中分治的目的在于我们不应该在同一时间把整个问题域都塞进自己的大脑,而应该试着某种方式去组织问题,以便能够在某一时刻专注于一个特点的部分。①在设计模式如管道模式,类比水厂处理水的管道一样,通过构建处理请求的管道对水一层一层处理形成纯净水;责任链模式,通过构建一个处理请求的链表,在请求满足某一链表要求时被处理。②在系统架构中如分布式系统,通过XYZ轴的拆分,X轴的水平扩展(克隆扩展,复制多个服务与数据来扩展事务)、Y轴的领域拆分(负责系统拆分多个小系统微服务的方式)、Z轴的数据分片(通过拆分类似的东西扩展)如分层架构的设计都是分治思维的体现。③在算法中的分治算法、解决问题的黄金三步。④在分治并如数据处理的流式计算、分布式数据库。
8、简单思维,一旦做到了简洁,你将无所不能。使用极简主义对复杂的时间简化,在架构设计上满足当前需求,减少不必要的设计、中间件,高度复杂的系统带来容错低、运维难、变更难的问题;在产品设计上满足业务真实需求,减少无意义、复杂操作过程、减少用户选择项是关键项,复杂的操作过程带来理解困难、耗时操作、推广难度增加等问题。所以在需求阶段、设计阶段、开发阶段都要好好利用“奥卡姆剃刀”的原理。
9、成长型思维,成长型思维是在成长过程理解预期偏差、明白成长需要过程。要拥有持续成长决心,相信量变到质量的过程,从而摆脱精神内耗,不断精进的成长,减少消极的看待。
三、专业思维能力
专业思维是结合软件行业特点总结的思维模式如解耦思维、契约思维、模型思维、工具化思维、量化思维、产品思维、大数据思维。
1、解耦思维,在软件设计的一大目标就是实现高内聚,低耦合的系统。解耦必然是软件工程一项重要的技术思想,目前主要的解耦方式是通过依赖倒置解耦与中间层映射解耦,依赖倒置解耦如下图所示由相互交织一起的对象,通过引入第三方控制器来实现解耦的工作,在设计时要求设计人员面向接口编程一样是解耦的要求。中间层映射解耦是“计算机中的任何问题,都可以通过新增一层来解决”。在应用架构设计之道中“道”就是要实现业务逻辑和技术细节的解耦。
2、契约思维,指编程在很大程度上是指定契约,开发各个活动都要遵循契约。正如在软件设计中会在开始阶段就定义各种规范和标准,大家都遵守保证软件质量包括命名规范、异常处理规范、架构规范、Java规范、API设计标准、代码提交规范、开发规范、数据配置规范等都是契约的体现,契约思维保证系统的一致性,可维护性。
3、模型思维,建模的艺术就是去除实现中与问题无关的部分,模式是对现实世界的抽象和映射。通过建模过程由现实世界到具体模型,模型包括①数学模型,将现实世界的问题转换为数学问题(数学公式)的过程、②概念模型,将现实世界的客观对象抽象成为某一种信息结构如汽车的概念模型、③思维模型指对现实世界问题所应用思维方式,上述的基础思维能力和专业思维能力就是各种思维模型,任何帮助我们更好理解现实世界的理论框架,都可以称之思维模型。
在软件领域最有名,影响力最大的统一建模语言(UML),通过UML对系统建模,构建各种UML图,从不同侧面构建整个系统模型,从而指导开发人员构建系统、开发系统的模型。领域模型和数据模型,领域模型是对领域内的概念类或现实世界中对象可视化表示,比较重要设计思想如领域驱动设计正是基于领域模型来构建系统,领域模型将现实世界抽象为了信息世界,把现实世界中的客观对象抽象为某一种信息架构,而这种信息架构并不依赖于具体的计算机系统,领域模型不是对软件设计的描述,和技术无关。
4、工具化思维,不会偷懒的程序员,不是好的程序员。工具化是一种偷懒的智慧,工作中要有阶段性的停下来思考,不要战术上的勤奋掩盖战略上的懒惰。要善于利用工作帮助我们工作,比如好的IDE,Chatgpt、好的大模型来处理一下问题。
5、产品思维,产品就是解决某个问题的东西,产品无处不在,每个人都要具备一些产品思维。产品上支撑业务价值,对下要求业务功能和质量属性的视线,产品的核心要素包括用户、需求和场景。用户是产品服务的对象;需求即产品要解决的核心问题是什么;场景即用户何时何地需要使用产品。
6、数据思维,一切业务数据化,一切数据业务化。通过数据对业务进行赋能的方法叫做数据业务化。在企业中的大数据解决方案包括数据仓库、ETL、元数据、分布式数据存储、流式计算。数据库关注的是OLTP,数据仓库关注的是OLAP,数据仓库对数据的操作包括切片切块,上卷下钻等。
7、量化思维,没有量化,就无法优化。量化包括定义指标、数字化、优化指标。量化工作是及其困难,只能通过一些模型、计算规则来量化相关工作,达到量化的效果。
四、总结
通过对程序员底层思维的阅读,平时涉及的问题处理方式、算法、设计模式、架构、开发工作、团队管理都无不涉及上述的思维模型。每一个思维方式都代表其使用的场景,解决的问题,而且相互交织,可能多个思维模型解决一个问题。对思维模式的总结思考的目的是为了更好的使用这些思维方式,处理设计、开发的问题。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了