来谈谈,如何用程序员思维服务设计
我们在平时的产品实现过程中会经常与产品吵架,与开发撕逼。这是因为我们这些产品实现的参与者因为分工不同都有很强的边界感,这种边界感同样也体现在思维模式上。
产品经理看待问题是以产品思维来思考;设计师做设计时也是以设计思维来思考;程序员更多是以代码实现的程序员思维来思考。
不同的思考方式,难免会出现不同的理解,同时也会出现描述问题时完全不懂对方在说什么。
作为设计师,除了本职工作必须具备的设计思维外,更多的是要求我们需要有产品思维,将产品思维运用到日常的产品设计工作中,却很少见到设计师去了解或掌握开发思维。
当然从开发实现角度来做设计俨然不现实,但是否可以运用程序员思维来服务设计呢,个人觉得是可以的。将程序员的思维方式应用到产品的设计实现中,是能够提升产品体验和提高团队协作效率的。
一、什么是程序员思维
什么是程序员思维?没有标准答案。
马克思·韦伯在《新教伦理与资本主义精神》中提出过一个概念——工具理性。所谓“工具理性”,就是通过实践的途径确认工具(手段)的有用性,从而追求事物的最大功效,为人的某种功利的实现服务。
工具理性是通过精确计算功利的方法最有效达到目的的理性,是一种以工具崇拜和技术主义为生存目标的价值观,所以“工具理性”又叫“功效理性”或者说“效率理性”。
相似的,编程也是根据客户的需求,利用自己的专业技能将其编译成计算机语言,生产出一个软件产品,来帮助解决现实生活中的问题,从而实现产品的商业价值。因此,可以将程序员思维定义为是在理性思维的框架下,利用相应工具,来解决相应实际问题。
二、程序员一般都具备哪些思维
1. 底层思维能力:逻辑思维
处于不同阶段的程序员所具备的思维能力会有所不同。但作为以逻辑思维缜密自居的程序员们,逻辑思维算得上是他们最底层的一种思维能力。
其实任何人都应该具备一定的逻辑思维能力,这样在面对“杠精”的时候,能发现对方的逻辑谬误;在思考问题的时候,能尽量做到逻辑完整;在表达的时候,能尽量做到逻辑清晰。
那什么是逻辑,逻辑的起源经历了从自然哲学到形而上学的发展,我们也无需深究其发展过程。借用大师的总结,逻辑是指思维的规律和规则。或者更简单的理解,逻辑就是关系。
逻辑思维基本包含三个方面的要素:概念、判断和推理,逻辑思维的要义,就在于正确运用概念、判断、推理的思维形式。
概念是思维的基本单位;通过概念对事物是否具有某种属性进行肯定或否定的回答,这就是判断;由一个或几个判断推出另一判断的思维形式,就是推理。
实际上阅读一本书的逻辑也是包含这三个要素,如果你看过《如何阅读一本书》,里面提到的分析阅读,说的就是如何通过提炼一本书的关键字词(概念),关键句子(判断),以及关键论述(推理)来分析一本书的主旨。
2. 必备思维能力:抽象思维和结构化思维
程序员每天面对的工作并不只是简单的敲代码,而是需要对拿到的需求及问题进行分析、归纳、综合、判断、推理。从而抽象出各种概念,挖掘概念和概念之间的关系,对问题进行有序建模,然后通过编程语言实现业务功能。这里面就需要应用到抽象思维和结构化思维。
1)抽象思维
抽象是有层次性的,抽象层次越高,内涵越小,外延越大,扩展性越好;反之,抽象层次越低,内涵越大,外延越小,扩展性越差,但语义表达能力越强。
我们可以根据毕加索的画《公牛图》来理解一下抽象思维:
抽象的三个特点:
第一,抽象是忽略细节的。抽象类是最抽象的,忽略的细节也最多,就像抽象牛,只是几根线条而已。在代码中,这种抽象可以是Abstract Class,也可以是Interface。
第二,抽象代表了共同性质。类(Class)代表了一组实例(Instance)的共同性质,抽象类(Abstract Class)代表了一组类的共同性质。对于我们上面的案例来说,这些共同性质就是抽象牛的那几根线条。
第三,抽象具有层次性。抽象层次越高,内涵越小,外延越大,也就是说它的涵义越小,泛化能力越强。比如,牛就要比水牛更抽象,因为它可以表达所有的牛,水牛只是牛的一个种类(Class)。
2)结构化思维
结构化思维,是一种以逻辑(事物内在规律)为基础,从无序到有序,将搜集到的信息、数据、知识等素材按一定的逻辑进行分析、整理,呈现出有序的结构,继而化繁为简的思考过程。其目的是减少复杂度和认知成本。
举个简单的例子说明结构化思维,尝试用10秒钟记住下面20个数字:
估计大多数人都很难在限定时间内记住。
但换一种方式,同样让你10秒钟记住下面的这20个数字:
是不是so easy,甚至完全不用10秒,扫一眼就可以记住了。
事实上,这是两组相同的数字,只是排列方式不同,第一组是无序的,第二组是有序的(有结构),也更有规律。
我们之所以能够轻松记忆第二组数字,是因为其有结构、有规律,从而降低了复杂度和记忆负担。面对无序的20个数字,我们需要记住20个记忆项目,套用设计心理学中的7+—2法则【米勒定律】,人类短暂记忆无法容纳7个以上的记忆项目,因此我们很难记住这一组数字。
而正序排列的20个数字,我们实际上只要记忆两个项目:一个是有0到9的20个数字,另一个是他们是正序排列的。
说到结构化思维,其实运用最多的要属结构化思维的圣经——芭芭拉·明托的《金字塔原理》。至于为什么是金字塔结构,大家可以自行去了解。
三、程序员思维与设计思维的不同
设计思维,本质上是一种以人为本的问题解决方法。这里所说的设计是广义的设计,是以探索人的需求为出发点,创造出符合其需求的解决方案。与传统解决问题的方法不同的是,设计思维是面向过程的解决方案,而且是一个没有标准答案的探索过程。
面对问题我们需要深入理解问题,这是一个发散的思考,从多方面了解问题发生的原因,然后归纳出问题的关键点。解决问题时也需要探索各种解决问题的可能性,具有创造性的给出合理的解决方案,并从中收敛选择最佳解决方案。其实通过“双钻模型”就能很好的理解这一过程。
以人为本:认识到一切问题归根结底都是人的问题,从不同视角出发,对具体的人进行共情,而不是对抽象的事进行处理。
信息澄清:以人为中心重新组织和定义问题。在信息澄清通常可以用一句话来描述问题:谁?(用户User)有什么需要?(需求Need)我发现了什么?(洞察Insight),简称POV法。让大家对问题形成统一的认识,因为在讨论问题时,不同人理解与表达能力会有区别,造成的误会可以在过程中逐渐排除。
可视化:可以表现更多信息间的关系,更易被记忆和传递,让信息共享效率更高。
反复迭代:认识到设计过程中的不确定性与灵活性,反复迭代是一种非线性目标向线性流程妥协的变通做法。在实际应用上,我们需要不断的明确收获然后继续推进下去。
简单了解设计思维后,我们可以简单总结程序员思维与设计思维的不同之处:
① 程序员思维在解决问题时多为趋于严谨的线性推理,而设计思维则更趋向于创造性,多线并行的发散性思维解决方案。
② 某些共性问题的解决方案上,程序员需要提炼更抽象的特征从而能够做到结构更加清晰;而设计需要从不同视角考虑,对具体问题面向对象进行共情,从而提出不同符合用户心理的解决方案。
③ 最表象的不同点就在于,程序员完成需求代码化,优先考虑是否可以代码实现,过程中会有哪些限制条件;设计则更多考虑可用性和可视化,以一种更合理的状态传递相关的信息。设计师不只是基本需求的实现,同时要让用户有一种更优的体验,能够产生心理上的满足感和愉悦感。
其实程序员思维和设计思维还是有共通点的,比如结构化思维的应用上,设计师需要以某种逻辑关系形成结构清晰的界面呈现给用户,大大增强页面的可读性和可理解性。同样的满足金字塔原理的代码,其可读性和可理解性也会极大的被增强。
代码也是一种表达,很多人以为代码是写给机器执行的,实际上,代码是写给人读的,只是偶尔会被机器执行。
四、程序员思维如何应用到设计中?
1. 底层逻辑
底层逻辑的应用其实是贯穿整个产品生命周期的,不论是需求阶段还是界面设计阶段亦或是开发实现和产品测试,都是基于底层业务逻辑去实现产品的。
产品在交互设计上除了要符合业务逻辑,还需要符合开发实现逻辑。
比如页面在进行数据交互时,接口的调用是同步还是异步,这也将影响到界面的交互形式。在开始设计前,我们就需要弄明白数据交互接口的调用方式,什么是同步什么是异步?
这里我们先举个栗子。
比如在正常工作中,我们需要和业务沟通需求。
如果在会议室进行面对面沟通,当你抛出对需求的疑问后,需要业务当面给予你解答才算沟通结束。
这种就是同步。
如果在办公室用邮件的方式沟通,当你发出对需求的疑问后,不需要在邮箱界面等他回复,你可以关闭邮箱窗口去做其他的工作内容,不管多久,等他回复你邮件后,你都会即时收到邮箱消息提醒。
这种就是异步。
所以,和沟通一样,接口调用的方式分为同步调用和异步调用。
同步调用是最常见的接口调用形式,在同步调用模式下,接口的调用方在一定时间范围内一直等待,直到被调用方返回执行结果。比如页面的加载,你需要停留在此页面等待加载完成才能继续后面的步骤。
异步调用是接口调用方给被调用方发出指令,但不会愣在那等待结果,调用方会给被调用方提供一个回调接口,处理完成后,再调用回调接口返回结果。比如应用的更新升级下载,开始下载后我们可以将其置于后台下载,无需等待下载结果,同时可以去完成其他任务。
我们无需去考虑通信的底层协议是什么,只单纯的考虑场景,电话沟通和页面加载就是同步,邮件沟通和升级下载就是异步。
所以在实际交互设计过程中,我们需要找开发确认接口调用方式的底层逻辑,对于无需或者不能即时响应的工作考虑采用异步调用的交互设计方式。
2. 抽象思维
抽象思维看似与设计思维相冲突,一个是需要抽离高层次共性,考虑代码的可扩展性;一个是需要深入场景,精准的传递信息。实际上在设计中也有经常使用抽象思维,例如为了提高生产效率,我们会设计对应的组件库,提取常用的基础控件,普遍应用于各种产品。
我认为大多数情况下,我们是将抽象思维逆向使用的。
相同的组件,因为其功能是固定的,在大多数情况下都可以复用,但在一些特殊的场景,我们可以发散思维,设计出更多符合场景的组件样式,从而传达更具象的内容。
比如简单的加载,比较大众的设计样式就是转菊花,这种加载可以应用到任何加载场景,常见得会让用户感觉很low,没有任何辨识度。
在实际设计中,我们是可以结合产品特性或品牌形象将其实例化或者内涵化,例如,B站加载样式,融合了品牌LOGO,将品牌基因也融入到简单的加载设计之中,加强用户对于产品的印象及帮助品牌传播。
这种以抽象出来的类为出发点,逆向运用抽象思维,再结合自身的设计思维去发散,最后收敛得出一个有效的问题解决方案,也能很好的服务于我们的设计。
3. 结构化思维
人类很早以前就认识到,大脑会自动将发现的所有事物以某种秩序组织起来。基本上,大脑会认为同时发生的任何事物之间都存在某种联系,并且会将这些事物以某种逻辑模式组织起来。
比如,通过对下图的观察,你可以看到什么?
任何人,看到上面的8个方块,都会认为共有两组方块,每组4个。这是因为人类大脑天性所致,大脑会认为同时发生的任何事物之间都存在某种联系,并且会将事物按某种逻辑模式组织起来。这种“联系”指的是某种类似的共同点或所处的位置比较接近。
这种将事物组成逻辑单元无疑具有很大的作用。我们更容易记住那些具有逻辑关系的东西,而遗忘那些散点的东西。
其实以上的结构化思维方式也就是设计中的格式塔原理。
为了更好的理解结构化思维的应用,我们可以以做简历设计为例,简历制作其实就是把个人相关的信息整理成结构化信息的过程。
每个人的简历上大致会包含姓名、性别、民族、籍贯、出生年月、联系方式、电子邮箱、工作单位、工作时间、职位、工作职责、离职原因、毕业院校、学习时间、所学专业、获得证书等信息。
这么多信息,如果不加整理的一一罗列,会显得非常繁杂,可读性非常差。
我们可以将这些信息按一定的逻辑关系整理分组,读起来就会轻松很多。将信息进行结构化梳理后,会更清晰、更有条理。信息的传递效率也会大大提高。
最后,无论是产品思维、设计思维,还是程序员思维,不应该成为职业的边界限制,亦或是不同职位间争议的起点。我们可以相互学习与了解不同的思维方式,共同更好地服务于产品。
作者:WOWdesign,研究设计价值最大化,涉及用户体验、品牌体验、空间体验。
本文作者 @WOWdesign 。
版权声明
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!