前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >To程序员:要写出好代码,你需要懂点儿“底层思维”

To程序员:要写出好代码,你需要懂点儿“底层思维”

作者头像
博文视点Broadview
发布于 2022-03-15 09:10:21
发布于 2022-03-15 09:10:21
84900
代码可运行
举报
运行总次数:0
代码可运行

👆点击“博文视点Broadview”,获取更多书讯

在阿里巴巴的晋升会议上,评委经常会问:“你的成功可以复制吗?”

我最初做评委时基本不会问这样的问题,因为我认为这样的问题很虚,工作完成就行了,不需要那么多道理。

然而随着时间的推移,我发现这的确是一个好问题。

因为它可以区分出你是碰巧把事情做对了,还是你具备了一直做对事情的能力,二者是有本质区别的。碰巧做对,说明你的能力可能还不足,换一种情景,你就不一定能应付。

因此,好的晋升制度不仅要考查成绩,更重要的是考查能力。对从事脑力劳动的技术人员来说,“能力”主要指的是“思维能力”。

例如,我们都知道编程的时候命名很重要,也很难,可为什么会这样呢?

如果要深挖其背后的原因,将是一个非常有趣的话题,甚至可以和哲学有关。

命名工作中暗含了抽象思维能力和语言哲学,语言本身是抽象的符号,比如当你说“花”的时候,指的并不是某一朵具体的玫瑰花、郁金香,而是花的抽象概念。一朵具体的花虽然看得见、摸得着,但总会有凋零消亡的时候,而“花”这个字作为精神实体将永不会消亡。所以,抽象的花和具体的花到底哪个才是本真呢?这是一个哲学问题。

抛开哲学争论,就“花”这个字而言,它是提取了所有花的共性的抽象符号。命名之所以难,是因为你要经历一个提取共性、归纳要义,并赋予恰当名称的抽象思维过程。

因此,要想真正做好命名,除了要掌握一些命名技法,还需要更深层次的修炼——提升抽象思维能力

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

对于抽象的概念也是如此,我们都知道,抽象思维是工程师最重要的思维能力。因为软件设计是纯思维的创造活动,软件技术本质上就是一门抽象的艺术。程序员每天都要动用抽象思维,对问题域进行分析、归纳、综合、判断、推理等。

但到底什么是抽象思维?什么是抽象的层次性?如何运用抽象思维解决软件中的问题?如何提升抽象思维能力?对于这些问题,并不是每个人都能说的清楚。

抽象思维

简而言之,“抽”就是抽离,“象”就是具象。从字面上理解抽象,抽象的过程就是从“具象”事物中归纳共同特征,“抽取”得到一般化的概念的过程。英文的抽象——abstract,来自拉丁文abstractio,它的原意是排除、抽出。

为了更直观地理解抽象,让我们先来看一幅毕加索的画。图的左边是一头水牛,是具象的;右边是毕加索的画,是抽象的。

抽象牛只有几根线条,不过这几根线条是做了高度抽象之后的线条,过滤了水牛的绝大部分细节,只保留了牛最本质的特征,比如牛角、牛头、牛鞭、牛尾巴等。这种对细节的舍弃使得“抽象牛”具有更好的泛化(Generalization)能力。可以说,抽象概念更接近问题的本质。也就是说,所有的牛都逃不过这几根线条。

抽象的特点

回到毕加索的抽象画,如果映射到面向对象编程,抽象牛就是抽象类(Abstract Class),代表了所有牛的抽象。抽象牛可以被泛化成更多的牛,比如水牛、奶牛、牦牛等。每一种牛都代表了一类(Class)牛,对于每一类牛,我们可以通过实例化,得到一个具体的牛实例(Instance)。

从这个简单的案例中,我们可以总结出抽象的3个特点。

第一,抽象是忽略细节的。抽象类是最抽象的,忽略的细节也最多,就像抽象牛,只是几根线条而已。在代码中,这种抽象既可以是抽象类,也可以是接口(Interface)。

第二,抽象代表了共同性质。类代表了一组实例的共同性质,抽象类代表了一组类的共同性质。对于上面的案例来说,共同性质就是抽象牛的那几根线条。

第三,抽象具有层次性。抽象层次越高,其内涵越小、外延越大,也就是说它的含义越小、泛化能力越强。比如,牛就要比水牛的抽象层次更高,因为它可以表达所有的牛,水牛只是牛的一个种类。

抽象的层次性

对于程序员来说,对抽象层次的权衡是对我们设计能力的考验,要根据业务的需要,选择合理的抽象层次,既不能太高,也不能太低。

例如,现在要写一个关于水果的程序,我们需要对水果进行抽象,因为水果里面有红色的苹果,我们当然可以建一个RedApple的类,但是这个抽象层次有点低,只能用来表达“红色的苹果”。假如来一个绿色的苹果,你还得新建一个GreenApple类。

为了提升抽象层次,我们可以把RedApple类改成Apple类,让颜色变成Apple的属性,这样红色和绿色的苹果就都能用Apple表达了。再继续往上抽象,我们还可以得到水果类、植物类等。

可以看出,抽象层次越高,内涵越小,外延越大,泛化能力越强。然而,其代价就是业务语义表达能力越弱。

我经常开玩笑说:“为了通用性,把所有的类都设置为Object,把所有的参数都设置为Map的系统,是最通用的。”因为Object和Map的内涵最小,其泛化能力最强,可以适配所有的扩展。从原理上来说,这种抽象也是对的,万物皆对象嘛!但我们为什么不这么做呢?就是因为越抽象,越空洞,虽然通用,但也“无用”。

强制类型转换是抽象层次有问题

思考一下,我们在写代码的过程中,什么时候会用到强制类型转换呢?当然是LSP不能被满足的时候,也就是说子类的方法超出了父类的类型定义范围,为了使用子类的方法,只能使用类型强制转换将类型转成子类类型。

举个例子,在苹果(Apple)类上,有一个isSweet()方法用于判断水果甜不甜;在西瓜(Watermelon)类上,有一个isJuicy()用于判断水分是否充足的;同时,它们都共同继承一个水果(Fruit)类。

此时,我们需要挑选出甜的水果和有水分的西瓜,会编写如下一段程序:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class FruitPicker {

    public List<Fruit> pickGood(List<Fruit> fruits){        return fruits.stream().filter(e -> check(e)).                collect(Collectors.toList());    }        private boolean check(Fruit e) {        if(e instanceof Apple){            if(((Apple) e).isSweet()){                return true;            }        }        if(e instanceof Watermelon){            if(((Watermelon) e).isJuicy()){                return true;            }        }        return false;    }}

对于代码中的强制类型转换,仔细分析一下,可以发现,根本原因在于isSweet()和isJuicy()的抽象层次不够。站在更高的抽象层次,也就是Fruit的视角看,我们挑选的就是可口的水果,只是具体到苹果时,我们看甜度;具体到西瓜时,我们看水分而已。

解决方法是对isSweet( )和isJuicy( )进行抽象层次提升,我们可以在Fruit上创建一个isTasty( )的抽象方法。

注意:tasty这个词本身就要比sweet和juicy要抽象。

因此,我们在做抽象提升的时候,一定是伴随着语言的变化的。

通过提升抽象层次,我们消除了instanceof判断和强制类型转换,让代码重新满足了里氏替换原则,利用面向对象的多态,也使代码重新变得优雅可扩展了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class FruitPicker {

    public List<Fruit> pickGood(List<Fruit> fruits){        return fruits.stream().filter(e -> check(e)).                collect(Collectors.toList());    }            private boolean check(Fruit e) {        return e.isTasty(); //不再需要instanceof和强制类型转换    }}

所以,每当我们在程序中准备使用instanceof做类型判断,或者用cast做强制类型转换的时候,都有可能是一次做提升抽象层次的机会。

本文节选自《程序员的底层思维》一书,想要了解更多相关内容,欢迎阅读本书!

《程序员的底层思维》

张建飞 著

  • 这是一本超越具体编程技法的技术书:职场晋升不仅需要技术能力,更重要的是思维能力。本书带你学会用底层思维解决复杂技术问题,突破职场“天花板”。
  • 这也是一本培养思维能力的通用技能书:打破认知局限,培养通用的思维能力。本书帮你跳出思维定势,轻松解决生活及工作中遇到的问题。

本书涵盖程序员应知应会的16种思维能力,共18章,分为三部分。

第一部分主要介绍抽象思维、逻辑思维、结构化思维、批判性思维、维度思维、分类思维、分治思维、简单思维,以及成长型思维等解决日常问题的基础思维能力。

第二部分结合软件行业的特点,主要介绍解耦思维、契约思维、模型思维、工具化思维、量化思维、数据思维,以及产品思维等专业思维能力。

第三部分主要是对上述思维能力的综合运用实践。

粉丝专享六折优惠,扫码即购!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 如果喜欢本文欢迎 在看丨留言丨分享至朋友圈 三连
 热文推荐  
书单 | 云端架构怎么设计才好?这几本书告诉你!
程序员最讨厌的四件事,它能解决!
豆瓣9.6分,Scala编程圣经第5版重磅来袭!
量子时代已来,与时代接轨,从这本书开始!


▼点击阅读原文,了解本书详情~
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 博文视点Broadview 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
当程序员具备了抽象思维
为了更好的方便你理解抽象,让我们先来看一幅毕加索的画,如下图所示,图的左边是一头水牛,是具象的;右边是毕加索画,是抽象的。怎么样,是不是感觉自己一下子理解了抽象画的含义。
Java宝典
2021/03/16
6850
程序员如何培养底层思维?
👆点击“博文视点Broadview”,获取更多书讯 在阿里巴巴的晋升会议上,评委经常会问:“你的成功可以复制吗?”我最初做评委时基本不会问这样的问题,因为我认为这样的问题很虚,工作完成就行了,不需要那么多道理。 然而随着时间的推移,我发现这的确是一个好问题。因为它可以区分出你是碰巧把事情做对了,还是你具备了一直做对事情的能力,二者是有本质区别的。碰巧做对,说明你的能力可能还不足,换一种情景,你就不一定能应付。因此,好的晋升制度不仅要考查成绩,更重要的是考查能力。对从事脑力劳动的技术人员来说,“能力”主要
博文视点Broadview
2022/04/25
5150
程序员如何培养底层思维?
Java程序员必备基础:泛型解析
Java 泛型(generics)是 JDK 5 中引入的一个新特性,其本质是参数化类型,解决不确定具体对象类型的问题。其所操作的数据类型被指定为一个参数(type parameter)这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
捡田螺的小男孩
2020/04/15
6720
Java程序员必备基础:泛型解析
最好的工程师枕边读物DDD的启蒙书《代码精进之路:从码农到工匠》
读后感:是一本很不错的技术书籍,并没有拘泥于技术细节,而是从微知著的讲实现复杂业务系统的落地细节与模型设计,作者具有很高的技术素养,从简入深的讲解从一个变量的命名,到复杂系统的领域建模的思考过程,对代码精益求精的态度值得每一个技术人员学习。适用于至少1年开发经验的开发人员。
燃192
2023/02/28
9690
最好的工程师枕边读物DDD的启蒙书《代码精进之路:从码农到工匠》
程序员职场晋升:与阿里前P9的一次近距离互动
👆点击“博文视点Broadview”,获取更多书讯 程序员职场晋升,想必是很多技术同学想要了解的内容:晋升遵循怎样的路径?怎样才能顺利晋升?晋升时要注意哪些坑,又有哪些技巧?…… 博文视点“解惑杂优铺”栏目邀请到畅销书《互联网大厂晋升指南:从P5到P9的升级攻略》作者李运华老师来进行了一场“从程序员职场晋升直播课,与阿里前P9的一次近距离互动”的主题直播访谈,希望可以解答小伙伴们在晋升道路上的一些疑问。 李运华老师,阿里前资深技术专家(P9),有16年的软件设计开发经验,曾就职于华为、UCWEB、阿里巴巴
博文视点Broadview
2023/04/04
9380
程序员职场晋升:与阿里前P9的一次近距离互动
从程序员到百万高管:寒冬之下的技术人修炼路径
👆点击“博文视点Broadview”,获取更多书讯 寒冬之下,大部分公司采取裁员、冻结招聘等措施,而据媒体报道,推特新老板埃隆·马斯克给员工发了一封邮件,他们被告知必须在美东时间周四晚上之前做出选择,要么继续长时间高强度工作,要么接受相当于 3 个月工资的遣散费。 如今,寻到工作机会不易,工作同样需要努力,大家都不容易!很多小伙伴可能对自己未来的道路都会有些迷茫,如何在当前环境下保持自身价值,并能够有所突破得到更好的发展呢? 为此,博文视点“解惑杂优铺”栏目邀请到畅销书《技术管理之巅》《技术人修炼之道》作
博文视点Broadview
2023/04/04
5950
从程序员到百万高管:寒冬之下的技术人修炼路径
Java——Java面向对象
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。
说故事的五公子
2020/04/13
2.3K0
程序员的十楼层,看看自己在第几层
自西方文艺复兴以来,中国在自然科学方面落后西方很多,软件领域也不例外。当然现在中国的许多程序员们对此可能有许多不同的意见,有些人认为中国的程序员水平远落后于西方,有些则认为中国的程序员个人能力并不比西方的程序员差,只是整个软件产业落后而已。 那么,到底中国的程序员水平比西方程序员水平差,还是中国有许多优秀的程序员达到或超过了西方程序员同等水平呢?要解决这个问题,必须先知道程序员有多少种技术层级,每个层级需要什么样的技术水平,然后再比较中国和西方在各个技术层级的人数,就可以知道到底有没有差距,差距有多大。 当然,对于如何划分程序员的技术层级,不同公司或不同人会有不同的划分标准,下面的划分仅代表个人的观点,如有不当之处,还请砸板砖予以纠正。
阳光岛主
2019/02/19
1K0
程序员的十楼层,看看自己在第几层
万字详文阐释程序员修炼之道
作者:cheaterlin,腾讯 PCG 后台开发工程师 综述 我写过一篇《Code Review 我都 CR 些什么》,讲解了 Code Review 对团队有什么价值,我认为 CR 最重要的原则有哪些。最近我在团队工作中还发现了: 原则不清晰。对于代码架构的原则,编码的追求,我的骨干员工对它的认识也不是很全面。当前还是在 review 过程中我对他们口口相传,总有遗漏。 从知道到会做需要时间。我需要反复跟他们补充 review 他们漏掉的点,他们才能完成吸收、内化,在后续的 review 过程中,能自己
博文视点Broadview
2023/05/19
2980
万字详文阐释程序员修炼之道
程序员为什么要学深度学习?
转自:infoq( ID:infoqchina) 导读 深度学习本身是一个非常庞大的知识体系。本文更多想从程序员的视角出发,让大家观察一下深度学习对程序员意味着什么,以及我们如何利用这样一个高速发展的学科,来帮助程序员提升软件开发的能力。 前言 1973年,美国上映了一部热门的科幻电影《West World》,三年之后又有一个续集叫做《Future World》。这部电影在80年代初被引进到中国叫《未来世界》。那部电影对我来讲简直可以说得上是震撼。影片中出现了很多机器人,表情丰富的面部下面都是集成
小莹莹
2018/04/24
9460
程序员为什么要学深度学习?
BATJTMD,大厂招聘,都招什么样Java程序员?
最近总看到类似这样的问题,也有一些工作3年左右的小伙伴问小傅哥,该怎么进大厂。其实你说 Java 学多少可以找到工作,主要看你想在哪个城市找、找什么样的公司、找什么样的待遇。因你的要求高低不同,你遇到的面试要求也会随之改变。
小傅哥
2020/11/19
3.8K0
BATJTMD,大厂招聘,都招什么样Java程序员?
程序员的英语学习指南
对程序员来说,“渣英语”可是限制自己更上一层楼的重要阻碍。不仅阅读最新英文研究与教程困难,去国际顶会与别人开口交流也成了问题。
量子位
2019/04/24
1.4K0
程序员的英语学习指南
程序员Java面试的陷阱
程序员Java面试的陷阱2010年01月21日 星期四 22:27   找工作要面试,有面试就有对付面试的办法。以下一些题目来自我和我朋友痛苦的面试经历,提这些问题的公司包括IBM, E*Trade, Siebel,Motorola, SUN,以及其它大小公司。
葆宁
2019/04/19
7450
腾讯程序员:从做管理转回写代码,我所理解的工程师文化
如何实践工程师文化带领出一群靠谱的程序员,并在不确定性的条件下争取成功,是过去几年我在持续思考的事情。团队的工程师文化能不能提升成功的确定性,一定要有吗,它来自哪里,又能带来什么?本文尝试解答这些问题,并期望通过更系统和全面的解剖,可以减少有极致追求的程序员们的纠结和内耗。
腾讯云开发者
2025/04/09
6970
腾讯程序员:从做管理转回写代码,我所理解的工程师文化
FastAI 之书(面向程序员的 FastAI)(一)
在很短的时间内,深度学习已经成为一种广泛应用的技术,解决和自动化计算机视觉、机器人技术、医疗保健、物理学、生物学等领域的问题。深度学习的一大乐趣在于其相对简单性。强大的深度学习软件已经构建起来,使得快速入门变得快速简单。在几周内,你就可以理解基础知识并熟悉技术。
ApacheCN_飞龙
2024/02/17
6500
FastAI 之书(面向程序员的 FastAI)(一)
AIGC 生成代码正流行,对程序员是好还是坏?
AIGC 最大的价值将表现为重塑生产力、重塑开发者工作流程。现在,AIGC 生成的代码是否可以同于生产?AIGC 会给开发领域带来什么变化?程序员该拒绝还是适应辅助编程工具? 6 月 16 日,WasmEdge 创始人和核心开发者、 Second State 联合创始人 Michael Yuan 博士,品览联合创始人 &CTO、极客时间《AI 大模型应用开发实战营》讲师彭靖田,亚马逊云科技大中华区首席架构师邓明轩做客《极客有约》,一起聊了聊 AIGC 与程序员的那些事儿。本文根据直播内容整理,大家可以点击查看完整视频(https://www.infoq.cn/video/D8fRLD8POS4Nq0PGHVrH)。
深度学习与Python
2023/08/09
4590
AIGC 生成代码正流行,对程序员是好还是坏?
FastAI 之书(面向程序员的 FastAI)(二)
正如我们在第一章和第二章中讨论的,有时机器学习模型可能出错。它们可能有错误。它们可能被呈现出以前没有见过的数据,并以我们意料之外的方式行事。或者它们可能完全按设计工作,但被用于我们非常希望它们永远不要被用于的事情。
ApacheCN_飞龙
2024/02/17
5420
FastAI 之书(面向程序员的 FastAI)(二)
JavaScript专家开课啦。
Hi好久不见的大家,雷小达想死你们了! 今天带来三个JavaScript的内容,让大家一把过足瘾。在西安办公室有一个JavaScript方面的专家,最近他的努力方向转移到了Lisp上。且听,JavaScript专家——邱俊涛一一道来。 I code it Code and Life RSS 文章 文章归档 出版物 关于 团队里的两类程序员 JAN 14TH, 2018 程序员的分类 最近几年,我在多个不同类型的项目上,以不同的角色工作过:有时候会为项目前期做一些预研、然后为后续的交付估算工作量;有时
ThoughtWorks
2018/04/18
1.8K0
JavaScript专家开课啦。
手把手:四色猜想、七桥问题…程序员眼里的图论,了解下?(附大量代码和手绘)
大数据文摘作品 编译:张礼俊、王一丁、xixi、修竹、Apricock、惊蛰、Chloe、龙牧雪 长文预警!本文作者Vardan Grigoryan是一名后端程序员,但他认为图论(应用数学的一个分支)的思维应该成为程序员必备。 本文从七桥问题引入,将会讲到图论在Airbnb房屋查询、推特推送更新时间、Netflix和亚马逊影片/商品个性化推荐、Uber寻找最短路线中的应用,附有大量手把手代码和手绘插图,值得收藏。 图论的傻瓜式教程 图论是计算机科学中最重要、最有趣,同时也是最容易被误解的领域之一。理解并使用
大数据文摘
2018/05/23
2.2K0
【译】为 嵌入式 C 程序员编写的 Rust 指南
这是来自 Google OpenTitan 团队,给嵌入式 C 程序员专门打造的一份 Rust 指南。
张汉东
2021/10/13
5.3K0
推荐阅读
相关推荐
当程序员具备了抽象思维
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验