读软件设计的要素03概念的组合

1. 概念的组合

1.1. 概念不像程序那样,可以用较大的包含较小的

  • 1.1.1. 每个概念对用户来说都是平等的,软件或系统就是一组串联运行的概念组合

1.2. 概念是通过操作来同步组合的

  • 1.2.1. 同步并不增加新的概念操作,但会限制已有的操作,从而消除一些独立概念可能会出现的操作序列

1.3. 在自由组合中,概念彼此独立,仅受一些记录的约束,这些约束是为了确保概念对事物观点的一致性

1.4. 在合作组合中,概念共同工作,通过自动化提供新的功能

1.5. 在协同组合中,概念更加紧密地交织在一起,一些概念可以帮助另一些概念实现目的

1.6. 概念的组合为创造性设计提供了机会,即使其中的每个概念都是通用概念

  • 1.6.1. 协同组合常常是设计的精髓,简单组件的组合可以带来意想不到的力量

1.7. 同步是软件设计的重要组成部分

1.8. 全新的组合形式

  • 1.8.1. 在默认情况下,概念彼此是独立的

  • 1.8.1.1. 只要概念允许,可以采用任何顺序调用概念的操作

  • 1.8.2. 自动化并不能完成以前手动无法完成的事情,而只能自动完成那些不可避免的事情

2. 自由组合

2.1. 自由组合是最松散的组合形式,在这种组合中,概念被合并到一个软件中,但在大多数情况下每个概念依然独立运行

2.2. 标签概念

  • 2.2.1. 将标签与项目关联起来,并包含了一个查找(find)的操作,允许用户筛选带有给定标签的所有项目

  • 2.2.2. 在实践中,待办与标签概念可以提供更丰富的功能

2.3. 在自由组合中,概念在很大程度上是相互独立的,但仍然需要做一些记录,以排除一些无意义的操作

2.4. 同步并不会增加新的操作

  • 2.4.1. 同步只是清除了一些操作

  • 2.4.2. 同步的目的是确保从每个概念的角度来看都存在相同的一组事物,即标签概念不能引用待办概念中不存在的任务,也就是说这些概念是存在耦合的

2.5. 在自由组合中,软件通常由正交的概念组合而成,每个概念都有自己的功能,同步仅用于记录

3. 合作组合

3.1. 合作组合是更紧密的组合形式,能将多个概念连接在一起,提供两个概念本身都没有的新功能

3.2. 日志(Logging)

  • 3.2.1. 这是一个跟踪事件的概念,可以与其他概念合作组合使用

  • 3.2.2. 跟踪的目的可以是诊断故障,通过留存事件序列,在事故发生后分析导致故障的原因

  • 3.2.2.1. 可以是性能分析,检查服务的响应性能

  • 3.2.2.2. 可以是行为解析,收集服务中的用户数据及其行为模式

  • 3.2.2.3. 可以是入侵检测,根据请求模式,检测可能正在进行的攻击

  • 3.2.2.4. 可以是审计,例如记录医院中哪些员工访问了健康记录

3.3. 限制(Suppression)

  • 3.3.1. 访问限制的概念可以通过同步授权操作与被授权的行为,防止产生未经授权的用户操作

  • 3.3.1.1. 如果授权操作(由访问限制确定)没有发生,与之相关的操作也不会发生

  • 3.3.1.2. 在社交媒体软件中将朋友概念与帖子概念组合在一起,那么用户就只能阅读朋友的帖子

3.4. 分段(Staging)

  • 3.4.1. 可以将不同阶段的操作联系在一起

3.5. 通知(Notification)

  • 3.5.1. 大多数软件和服务都会向用户发送通知

  • 3.5.1.1. 日历发送日程提醒

  • 3.5.1.2. 论坛发送注册提醒

  • 3.5.1.3. 在线商店发送购买确认

  • 3.5.1.4. 快递公司发送物流状态更新

  • 3.5.1.5. 社交媒体软件发送更新提醒

3.6. 减轻(Mitigation)

  • 3.6.1. 有时自由组合给用户提供了太多的自由度,导致了一些不良行为,这时就可以通过合作组合来减少不良行为

  • 3.6.2. 许多社交媒体平台将帖子概念和投票概念组合,让用户对帖子进行评价

  • 3.6.2.1. 如果帖子概念允许编辑行为,则会产生一种困境,因为用户可以在收到很多评价后,再完全更改帖子内容,让人误以为这些评价是针对新内容的

  • 3.6.2.2. 一种常见的解决方法是为已编辑的帖子添加一个永久的标记

  • 3.6.2.3. 另一种方法是将帖子概念中的编辑操作与另一个撤销评价的操作同步

3.7. 推理(Inference)

  • 3.7.1. 有时用户并不直接执行某些操作,而是通过其他操作间接执行

  • 3.7.2. 大多数通信软件会区分已读和未读项目,并允许用户切换它们的状态

3.8. 连接分离的关注点(Bridging separated concerns)

  • 3.8.1. 采用自由组合的方式将关注点分离,通常会提高软件中概念的清晰度和可用性

  • 3.8.2. 蜂窝概念和WiFi概念允许用户独立管理蜂窝数据和本地网络的使用,以及管理使用这些数据和网络的软件

3.9. 在合作组合中,同步在提供自动化的概念间建立连接,从而产生一些单个概念不具备的新功能

4. 协同组合

4.1. 协同组合更精妙

  • 4.1.1. 在自动化间建立连接

  • 4.1.2. 通过更紧密的同步概念,一个概念的功能会增强另一个概念的功能

  • 4.1.3. 组合的整体价值超过了概念价值的总和

4.2. Gmail标签和废纸篓

4.3. Moira列表和组

4.4. 免费样品和购物车

4.5. Photoshop的通道、蒙版和选区

4.6. 废纸篓与文件夹的美妙协同

  • 4.6.1. 最初,废纸篓只是一个已删除文件的集合,如果你删除了一个文件夹,文件夹中的文件将零散地位于废纸篓中

  • 4.6.2. 现在的废纸篓设计可以理解为由废纸篓和文件夹这两个显著概念构成的巧妙组合

  • 4.6.3. 废纸篓概念的基本思路是,恢复已删除文件,或通过清空废纸篓永久删除它们

4.7. 难以完美的协同

  • 4.7.1. 完美实现不同概念的功能协同几乎是不可能的,因此大多数协同都需要付出一些代价

5. 同步

5.1. 在开始设计概念时,同步是整个软件设计的重要部分

  • 5.1.1. 同步太多会使用户失去控制权,一些概念的自由组合允许的场景可能不会出现

  • 5.1.2. 如果同步太少,一些本可以自动完成的工作却成为用户的负担,有时还会带来意外和不当行为,甚至是灾难性的后果

5.2. 同步过度

  • 5.2.1. 日历软件的最初设计却因为“删除邀请”而给用户带来了困扰

  • 5.2.1.1. 用户无法在不通知事件发起者的情况下拒绝事件,因为删除概念与拒绝概念是绑定的

  • 5.2.1.2. 如果你只是想清理日历的空间,这一设计可能会让你冒犯朋友

  • 5.2.1.3. 如果向你发送事件邀请的是垃圾邮件,情况会更糟

  • 5.2.1.4. 解决这个问题的唯一笨办法是再创建一个新日历,将事件移至其中,然后再将新日历中的事件全部删除

  • 5.2.2. Tumblr的不良设计

  • 5.2.3. Twitter的回复

  • 5.2.4. 不需要的谷歌同步

  • 5.2.5. 爱普生强横的打印机驱动程序

5.3. 同步不足

  • 5.3.1. 该小组是否可以出现在组目录(Group directory)中取决于另一个设置菜单

  • 5.3.1.1. 除非此小组的可见性设置为“网络上的任何人”(Anyone on the web),否则该小组不仅被排除在组目录之外,而且用户根本无法访问该组,甚至无法申请加入该小组

  • 5.3.1.2. 原因是,权限概念中确定谁可以申请加入的操作与组概念中设置可见性的操作缺乏同步

  • 5.3.2. Lightroom的导入功能

  • 5.3.3. Google Forms、Google Sheets和数据可视化

  • 5.3.4. Zoom的举手功能

  • 5.3.5. Therac-25放射治疗机