购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.1 计算思维是什么

第1章提到技术架构师的工作重点不是一天比别人多写几行代码,而是能否设计出一个根基稳但又便于拓展的技术架构。成为一名技术架构师需要时间的沉淀,笔者认为在这段时间内最重要的是对计算思维(Computational Thinking)的锻炼。计算思维和计算机科学密切相关,那么它跟编程是一回事吗?不是,但有一定的关系。自计算机编程诞生以来,研究人员设计出的编程语言有100多种,例如Android使用的Java、iOS使用的Swift等。有一定经验的Android开发人员能迅速适应iOS开发,靠的就是计算思维。以写文章作为比喻,编程好比写汉字、写英文,懂得编程只是掌握了和计算机直接交流的语言,而计算思维则类似于构思文章的组织和内容,拥有计算思维才能写出正确的程序。计算思维包含了一系列抽象和具体的思想,在学术上有以下定义:

(1)计算思维涉及通过利用计算机科学的基本概念来解决问题、设计系统和理解人类行为。

(2)计算思维是抽象问题和制订可自动化解决方案的心理活动。

(3)教计算思维就是教如何像经济学家、物理学家、艺术家一样思考,并了解如何使用计算来解决他们的问题,创造和发现可以富有成效地探索的新问题。

(4)计算思维是将问题表述为一些输入到输出的转换,并寻找算法来执行转换。它能扩展到包括具有多个抽象层次的思考,并且使用数学来开发算法以及检查解决方案在不同大小问题上的扩展能力。

(5)计算思维是在制定问题时,以人类或者机器可以有效执行的方式,表达其解决方案时所涉及的思维过程。

(6)计算思维是从最坏的情况下通过冗余、损害遏制和纠错来进行预防、保护和恢复的思考。

(7)计算思维是使用启发式推理来发现解决方案。它是在存在不确定性的情况下进行计划、学习和安排。

综上所述,计算思维其实是一种解释、拆解和重构设计的思维方式,它能更好地指导设计师认识和理解哪些技术可用、产品是怎么运转起来的,并且帮助设计师设计一系列的解决方案完成工作。虽然计算思维来自计算机领域,但计算思维强调的重点是思维而不是计算,在日常生活中到处都会运用到计算思维,以下面的场景为例:当你早上上学时,会把一天中需要的东西放在背包里,这在计算机术语中称为预取和缓存;当你不小心丢了钱包,朋友会建议你原路返回寻找钱包,这被称为回溯;当电话在停电期间仍能工作,这被称为冗余的独立性……从以上案例可以看出计算思维可以被任何人使用。目前业界公认的计算思维包括4个方面:抽象、分解、模式识别和算法,它们在解决复杂问题时可以通过以下流程配合:

(1)应用抽象和分解过程将复杂问题分解为更小、更易于管理的部分。

(2)运用抽象过程和模式识别来理解、描述和表述问题。

(3)通过模式识别理解数据的相似性。

(4)构建算法思维以逐步解决问题。

2.1.1 抽象

在百度百科中,抽象定义为:从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质特征的过程。抽象是计算机科学和计算思维中最重要的能力,因为计算机科学家在使用计算机解决现实生活中存在的问题时,无法将现实世界中无穷无尽的信息都输入计算机,自己也无法完全理解所有的信息细节,这时他们只能通过归纳总结的方式将现实世界中不同分类的信息描述给计算机,这就是抽象的过程。

抽象可能是一个比较难以理解的概念,但最简单的抽象相信读者都懂,那就是定义,即命名。视觉语言、原子设计和设计系统等名词的本质是将界面按照不同的规则抽象为各种不同的元素,例如视觉语言由颜色、排版、间距和内容组成;在《原子设计》中作者Brad Frost把原子设计解构并命名为原子、分子、有机体、模板、页面,如图2-1所示。以下是Brad Frost对于以上名词的定义:

(1)原子是UI元素,无法进一步分解,充当界面的基本构建块。

(2)分子是形成相对简单的UI组件的原子集合。

(3)有机体是形成界面离散部分的相对复杂的组件。

(4)模板将组件放置在布局中并展示设计的底层内容结构。

(5)页面将真实内容应用于模板并阐明变体以展示最终UI并测试设计系统的弹性。

图2-1 原子设计对于元素的分解

抽象除了命名的作用,更重要的是让人在解决问题时,忽略与当前目标无关的内容,这样能更充分地关注相关内容。这句话怎么理解?意思是指抽象并不打算了解全部问题,而只选择其中的一部分,暂时不需要在意没选中的部分细节;或者抽象是一种在特定上下文中保留和表达想法的方法,同时忽略与该上下文无关的细节。

对开发人员来说,抽象是复杂事物的简化接口,良好的抽象能有效剥离或隐藏实现复杂事物时不需要了解的细节,这样开发人员调用和调试它们时无须深入了解底层机器和代码的细节也能完成相应的开发。同理,设计师也能剥离代码等细节,只需了解技术的相关原理和输入输出就能对技术架构有初步的认识,所以在各种设计规范中都会提及控件、组件和容器,例如按钮、输入框、开关等,这些命名都能为设计师和开发人员建立良好的沟通渠道。最后,设计师经常提及的方法论和模型也是一种抽象,它是基于各种实战经验总结出来的通用经验和流程。人机交互设计中最看重的是模型的输入和输出,这也是一种抽象。

2.1.2 分解

在2.1.1节提及的《原子设计》中,作者Brad Frost正是用了计算思维中的分解将原子设计解构并命名为原子、分子、有机体、模板、页面。设计师为什么要学习分解?因为当设计师面临的问题过于庞大或者复杂时,需要将它分而治之,这能有效帮助理解和解决问题。那么,怎么分解?分解是否无穷无尽?分解到哪个地步才算完成?答案是当一个问题能通过编程和算法来解决才算完成。这里的“编程和算法”不一定真的是指计算机编程和算法,例如《原子设计》的作者Brad Frost正是利用化学基础知识将UI元素等同于原子,将简单的UI组件等同于分子。因此,“编程和算法”是指用了什么规则或者模式来实现分解。

无论多强大的计算机应用,背后都是将原问题分解成若干个可以被解决的子问题,只是规模有可能不同。当一个大问题分解成多个小问题,再分解成具体的步骤以后,就可以利用C、Java等编程语言将这些步骤表示出来指导计算机完成任务。但是,当发现有些问题暂时无法解决或者性能出现严重问题时,说明我们忽略了某些问题,或者现有技术还不成熟,这时候应该通过容错设计或者寻找新的技术路径来解决,这一点在智能设计、智能座舱、AR/VR等新领域尤其重要,因为它们会直接影响设计的思路需要如何发生改变。

将一个复杂的问题和过程分解成一个个简单的部分,用到了泛化能力。泛化的目的是查看分解的部分并找到使解决方案更易于处理并更广泛地应用于类似问题的方法。从某种意义来说,泛化就是隐藏细节,所以它跟抽象是息息相关的。基于抽象和分解可以将各种事务进行不同的分类和组织,信息架构和设计系统就是很好的设计案例。不同产品有着不一样的信息架构是因为每个产品有着不一样的产品定义和用户需求,所以信息架构被定义出各式各样的树状结构。构建设计系统就像设计不同的积木,帮助设计师在抽象和具体之间快速转换,这样设计师观察界面时不仅能分辨出每一块积木,也能看到这些积木该如何组合在一起形成最终的体验。除了构建不同的界面,设计系统在维护和重构界面时也能变得更快和更容易,例如设计师需要将界面中某个红色元素改为蓝色时,程序员只需一行代码就能把界面所有相关的元素改为蓝色。

一个应用除了信息架构和设计系统,还有一堆交互流程需要被分解。以应用界面展示数据为例,图片、文字和视频并不是理所当然地存在于这个页面里,而是通过一系列步骤和代码才能展示在用户面前,而该过程可以粗颗粒度地分解为设备发出网络请求、服务器准备相关数据、网络传输数据和设备渲染相关界面四个步骤,而如何提高设备渲染界面速度又可分解成设备性能优化、多线程异步减少阻塞、界面布局加载等子问题,界面布局加载又涉及界面层级优化、控件类型选择等问题……通过不断地分析和分解问题和过程,设计师才能将“如何减少界面卡顿”这个黑盒子转换成自己能解决的白盒子,这时候才能更清楚地知道哪些自己可以做得更好,这部分内容会在第3章提及。

2.1.3 模式识别

模式识别是指对表征事物或现象的各种形式(数值、文字或逻辑关系)的信息进行处理和分析,以对事物或现象进行描述、辨认、分类和解释的过程。这看上去比较深奥,简单地说,模式识别就是找规律,找到相同点和不同点。医生看病是典型的模式识别:根据所有症状的组合以及病史发现模式,做出是什么病症的判断,越有经验的医生,模式识别能力越强,判断力越好。同理经济学家对经济规律、股市的预测也是最典型的模式识别案例。手写字体识别、语音识别,以及其他深度学习领域的应用都是基于大量数据的模式识别来实现,因此识别规律是人工智能最好的用武之地。

有句古语叫“治标不治本”,意思是只对显露在外面的病症应急处理,而不是从根本上加以治理,形容处理问题不彻底。当在设计和开发过程中遇到问题时,如果想根治,除了寻找当前解决方案外,还应该找到更好的方法去完善整个框架,避免出现类似问题,这时候模式识别是使整个框架强大和易于管理的第一步。平时分析问题并着手解决问题时,可能会注意到某些元素重复出现或彼此相似,这是模式识别方法的其中一种,基于它能帮助读者在实战过程中更好地解决问题。以下是模式识别过程中的常用做法:

(1)寻找重复出现的名词。这些可能是解决方案处理的对象。

(2)寻找重复出现的动词。这些可能是解决方案执行的操作。

(3)寻找具体的描述。这些可能会被不同情况下不同的占位符代替。例如,表示事物属性的形容词(“红色”“长”“平滑”)可以用属性名称(“颜色”“大小”“纹理”)代替。

(4)寻找实际数字,可以用变量代替。

模式识别有助于对解决方案进行建模,建模的好处是能让大家将当前方案重构为具有结构化的解决方案,因此模式识别与抽象、分解也有关系。以设计一个按钮为例,一个按钮的背景与宽高、图像和颜色渐变有关,文字内容与字体大小、字符长短以及字体选择有关,按钮还有阴影、层级高度(z-index)。以上这些仅仅是表现层面的内容,除此之外还有它的属性和点击事件,这些内容都是具有结构化的数据,它们组合在一起成为一个名为“按钮”的控件模型,要实现一个好的设计系统应该将整个控件模型全面覆盖。

学会对模型的理解和使用有助于大家忽略模型内在的处理逻辑。在计算机、心理学等领域大家会听到无数的模型术语,例如,“盒子模型”“神经网络模型”“多资源模型”等,它们描述的内容无非是以下几种情况:确定对象中输入和输出之间的关系、确定对象和其他对象之间的关系、确定对象在不同因素下的状态。所以,当遇到一些不懂的专业术语,应该立刻搜索相关词汇,识别它的原理、作用以及相关内容,这样即使不懂它究竟是什么,也可以把它当作一个黑盒子,变成一个新的组件或者拼图来使用。

2.1.4 算法

大部分人普遍认为算法是深奥的计算机技术,其实生活中处处都是算法。例如,如何找到去公司或学校的最短路径,如何管理自己的时间,这些都和算法息息相关。菜谱也可以类比成一种算法,因为菜谱列出了所需的配料、烹饪所需的一系列操作,以及期望的结果。如果食物由人来完成,人能基于自己的理解通过一个含糊的菜谱完成一道菜肴。但是如果食物由机器来完成,那么菜谱就不能有任何含糊的地方,例如煎牛排的时候我们通常会用手掌的颜色掌握牛排熟度,如图2-2所示,但算法不知道“手掌的颜色”是什么意思,是小孩的手掌还是老人的手掌?是黄皮肤的手掌还是黑皮肤的手掌?

图2-2 煎牛排的不同熟度

在计算机中同一个算法可以解决不同的问题,而一个问题也可以由不同的算法来解决,而且解法可以是重复的。解法的可重复性带来的规模效应是计算机强大的根本原因,例如抖音可以为数十亿用户推荐不同内容的视频,但背后的算法却是一致的,只是算法中涉及的参数因人而异。那么什么是算法?算法是一个仔细、精确、不模糊的菜谱的计算机科学版本,是确保计算出正确结果的一系列步骤,每一个步骤都由拥有完整定义的操作来表达。算法本身可以有多种表现形式,可以是自然语言、流程图、伪代码、编程语言等,只要它包含一系列具体的指令去解决一个问题或者完成一个任务都可以被定义为算法。学会计算思维中的“算法”,就可以从一个全新的角度看待日常的问题,了解日常应用是怎么工作的,例如为什么滴滴知道你要去哪里?为什么抖音能一直吸引你的眼球?甚至当你想提高自己淘宝店商品的排名时,如果去了解其分类和排序的规则,你的商品就有可能排到前面。

对算法来说,逻辑是非常重要的,只有逻辑严密无误,算法才能起到真正的作用。这时候分解能使算法变得清晰。例如计算机把物体从小到大做一个排序队列,它的办法如下:首先,拿一个新的物体;其次,从队列第一个开始比较,直到找到这个物体合适的位置;最后,把这个物体插入这个位置。这三步逻辑非常清晰,对任何数目的物体都会奏效。以下是算法中常见的做法:

递归:指的是代码在满足条件的情况下调用自己的方法,递归可以简化一个复杂问题的解决方案,在计算机中被大量使用。

循环:指的是在满足条件的情况下,重复执行同一段代码。例如,while语句。

迭代:指的是按照某种顺序逐个访问列表中的每一项。例如,for语句。

遍历:指的是按照一定的规则访问树形结构中的每个节点,而且每个节点都只访问一次。

如果读者不是开发人员,也应该了解一下算法对于开发编程的作用。优秀的算法除了能更快地解决问题,还要占用更少的计算资源。可以这么理解,无论是应用程序还是系统,内部都会集成各种算法。例如抖音的视频推荐、京东的货品推荐,系统的资源压缩、网络传输、语音识别、面部和图像识别、机器翻译,等等。只要使用到算法的地方,就有提升算法性能的可能。算法工程师感兴趣的是哪些问题可以计算,哪些不可以,以及如何在不占用更多内存的情况下计算得更快,或者是同样速度下使用更少的内存。全新的、更好的算法技术都有可能为用户体验带来新的突破。

另外,算法已经渗透到很多设计领域,并且通过视觉可视化的方式呈现,例如,专门用于实时交互式多媒体内容制作的TouchDesigner。TouchDesigner是一种基于节点的可视化编程语言,已被艺术家、程序员、创意编码员、软件设计师和表演者用于创作表演、装置和固定媒体作品。以图2-3为例,为了实现右下角的效果,即使在TouchDesigner将所有构建块(图中每一个小窗口)连接好,如果不清楚每一个构建块里面的参数是什么,还是无法知道整个设计的逻辑和算法,这就导致无法实现该效果。

图2-3 一个TouchDesigner的例子 Lqh3f3VT0YiZXLvIMt4zzH7WlsdR2qKRT1ODxKGfUgdsDJ68zKgvLkt0/53eS5us

点击中间区域
呼出菜单
上一章
目录
下一章
×