什么是“对用户友好”---转自王垠http://www.yinwang.org/blog-cn/2012/05/18/user-friendliness

STM32Cubemx+CanFestival:从零到一的CANopen移植实战 本文详细介绍了如何使用STM32CubeMX和CanFestival实现CANopen协议栈的移植,从开发环境搭建到核心配置步骤,再到调试与问题排查。通过实战经验分享,帮助开发者快速掌握STM32与CANopen的结合应用,提升嵌入式系统开发效率。 阅读详情

原文地址:http://www.yinwang.org/blog-cn/2012/05/18/user-friendliness

什么是“对用户友好”

当我提到一个工具“对用户不友好”(user-unfriendly)的时候,我总是被人“鄙视”。难道这就叫“以其人之道还治其人之身”?想当年有人对我抱怨 Linux 或者 TeX 对用户不友好的时候,我貌似也差不多的态度吧。现在当我指出 TeX 的各种缺点,提出新的解决方案的时候,往往会有美国同学眼角一抬,说:“菜鸟们抱怨工具不好用,那是因为他们不会用。LaTeX 是‘所想即所得’,所以不像 Word 之类的上手。”

殊不知他面前这个“菜鸟”,其实早已把 TeX 的配置搞得滚瓜烂熟,把 TeXbook 翻来覆去看了两遍,"double bend" 的习题都全部完成,可以用 TeX 的语言来写宏包。而他被叫做“菜鸟”,这是一个非常有趣的问题。所以现在抛开个人感情不谈,我们来探讨一下这种“鄙视”现象产生的原因,以及什么叫做“对用户友好”。

首先我们从心理的角度来分析一下为什么有人对这种“对用户不友好”的事实视而不见,而称抱怨的用户为“菜鸟”。这个似乎很明显,答案是“优越感”。如果每个人都会做一件事情,如何能体现出我的超群智力?所以我就是要专门选择那种最难用,最晦涩,最显得高深的东西,把它折腾会。这样我就可以被称为“高手”,就可以傲视群雄。我不得不承认,我以前也有类似的思想。从上本科以来我就一直在想,同样都会写程序,是什么让计算机系的学生与非计算机系的学生有所不同?经过多年之后的今天,我终于得到了答案(以后再告诉你)。可是在多年以前,我犯了跟很多人一样的错误:把“难度”与“智力”或者“专业程度”相等同。但是其实,一个人会用难用的工具,并不等于他智力超群或者更加专业。

可惜的是,我发现世界上有非常少的人明白这个道理。在大学里,公司里,彰显自己对难用的工具的掌握程度的人比比皆是。这不只是对于计算机系统,这也针对数学以及逻辑等抽象的学科。经常听人很自豪的说:“我准备用XX逻辑设计一个公理化的系统……”可是这些人其实只知道这个逻辑的皮毛,他们会用这个逻辑,却不知道它里面所有含混晦涩的规则都可以用更简单更直观的方法推导出来。

爱因斯坦说:“Any intelligent fool can make things bigger and more complex... It takes a touch of genius - and a lot of courage to move in the opposite direction.”我现在深深的体会到这句话的道理。想要简化一个东西,让它更“好用”,你确实需要很大的勇气。而且你必须故意的忽略这个东西的一些细节。但是由于你的身边都是不理解这个道理的人,他们会把你当成菜鸟或者白痴。即使你成功了,可能也很难说服他们去尝试这个简化后的东西。

那么现在我们来谈一下什么是“对用户友好”。如何定义“对用户友好”?如何精确的判断一个东西是否对用户友好?我觉得这是一个现在仍然非常模糊的概念,但是程序语言的设计思想,特别是其中的类型理论(type theory)可以比较好的解释它。我们可以把机器和人看作同一个系统:

  1. 这个系统有多个模块,包括机器模块和人类模块。
  2. 机器模块之间的界面使用通常的程序接口。
  3. 人机交互的界面就是机器模块和人类模块之间的接口。
  4. 每个界面必须提供一定的抽象,用于防止使用者得到它不该知道的细节。这个使用者可能是机器模块,也可能是人类模块。
  5. 抽象使得系统具有可扩展性。因为只要界面不变,模块改动之后,它的使用者完全不用修改。

在机器的各个模块间,抽象表现为函数或者方法的类型(type),程序的模块(module)定义,操作系统的系统调用(system call),等等。但是它们的本质都是一样的:他们告诉使用者“你能用我来干什么”。很多程序员都会注意到这些机器界面的抽象,让使用者尽量少的接触到实现细节。可是他们却往往忽视了人和机器之间的界面。也许他们没有忽视它,但是他们却用非常不一样的设计思想来考虑这个问题。他们没有真正把人当成这个系统的一部分,没有像对待其它机器模块一样,提供具有良好抽象的界面给人。他们貌似觉得人应该可以多做一些事情,所以把纷繁复杂的程序内部结构暴露给人(包括他们自己)。所以人对“我能用这个程序干什么”这个问题总是很糊涂。当程序被修改之后,还经常需要让人的操作发生改变,所以这个系统对于人的可扩展性就差。通常程序员都考虑到机器各界面之间的扩展性,却没有考虑到机器与人之间界面的可扩展性。

举个例子。很多 Unix 程序都有配置文件,它们也设置环境变量,它们还有命令行参数。这样每个用户都得知道配置文件的名字,位置和格式,环境变量的名字以及意义,命令行参数的意义。一个程序还好,如果有很多程序,每个程序都在不同的位置放置不同名字的配置文件,每个配置文件的格式都不一样,这些配置会把人给搞糊涂。经常出现程序说找不到配置文件,看手册吧,手册说配置文件的位置是某某环境变量 FOO 决定的。改了环境变量却发现没有解决问题。没办法,只好上论坛问,终于发现配置文件起作用当且仅当在同一个目录里没有一个叫 ".bar" 的文件。好不容易记住了这条规则,这个程序升级之后,又把规则给改了,所以这个用户又继续琢磨,继续上论坛,如此反复。也许这就叫做“折腾”?他何时才能干自己的事情?

TeX 系统的配置就更为麻烦。成千上万个小文件,很少有人理解 kpathsea 的结构和用法,折腾好久才会明白。但是其实它只是解决一个非常微不足道的问题。TeX 的语言也有很大问题,使得扩展起来非常困难。这个以后再讲。

一个良好的界面不应该是这样的。它给予用户的界面,应该只有一些简单的设定。用户应该用同样的方法来设置所有程序的所有参数,因为它们只不过是一个从变量到值的映射(map)。至于系统要在什么地方存储这些设定,如何找到它们,具体的格式,用户根本不应该知道。这跟高级语言的运行时系统(runtime system)的内存管理是一个道理。程序请求建立一个对象,系统收到指令后分配一块内存,进行初始化,然后把对象的引用(reference)返回给程序。程序并不知道对象存在于内存的哪个位置,而且不应该知道。程序不应该使用对象的地址来进行运算。

所以我们看到,“对用户不友好”的背后,其实是程序设计的不合理使得它们缺少抽象,而不是用户的问题。这种对用户不友好的现象在 Windows,Mac,iPhone, Android 里也普遍存在。比如几乎所有 iPhone 用户都被洗脑的一个错误是“iPhone 只需要一个按钮”。一个按钮其实是不够的。还有就是像 Photoshop, Illustrator, Flash 之类的软件的菜单界面,其实把用户需要的功能和设置给掩藏了起来,分类也经常出现不合理现象,让他们很难找到这些功能。

如何对用户更加友好,是一两句话说不清楚的事情。所以这里只粗略说一下我想到过的要点:

  1. 统一:随时注意,人是一个统一的系统的一部分,而不是什么古怪的神物。基本上可以把人想象成一个程序模块。

  2. 抽象:最大限度的掩盖程序内部的实现,尽量不让人知道他不必要知道的东西。不愿意暴露给其它程序模块的细节,也不要暴露给人。“机所不欲,勿施于人”。

  3. 充要:提供给人充分而必要(不多于)的机制来完成人想完成的任务。

  4. 正交:机制之间应该尽量减少冗余和重叠,保持正交(orthogonal)。

  5. 组合:机制之间应该可以组合(compose),尽量使得干同一件事情只有一种组合。

  6. 理性:并不是所有人想要的功能都是应该有的,他们经常欺骗自己,要搞清楚那些是他们真正需要的功能。

  7. 信道:人的输入输出包括5种感官,虽然通常电脑只与人通过视觉和听觉交互。

  8. 直觉:人是靠直觉和模型(model)思考的,给人的信息不管是符号还是图形,应该容易在人脑中建立起直观的模型,这样人才能高效的操作它们。

  9. 上下文:人脑的“高速缓存”的容量是很小的。试试你能同时想起7个人的名字吗?所以在任一特定时刻,应该只提供与当前被关注对象相关的操作,而不是提供所有情况下的所有操作供人选择。上下文菜单和依据上下文的键盘操作提示,貌似不错的主意。

GPFS扩展技术原理(十一)-FMDN广播与EID加解密 GFPS扩展技术原理(十一)FMDN广播及EID加解密 阅读详情

相关推荐

新手如何学习车载底层嵌入式软件开发(AutoSar)

汽车嵌入式开发

ACarSoft的博客 4222

【MyBatis】Spring集成原理(四):注入代理对象 MapperProxy

我们使用Mapper 的时候,只需要在加了Service 注解的类里面使用@Autowired注入Mapper接口就好了。 @Service public class EmployeeService { @Autowired EmployeeMapper employeeMapper; public List<Employee> getAll() { return employeeMapper.selectByMap(null);

A minor 3539

OptiSystem仿真:波分与时分复用混合光网络的设计与性能优化

本文详细介绍了如何利用OptiSystem软件设计与优化波分复用与时分复用混合光网络。通过构建四路波分乘以四路时分的系统模型,文章阐述了从信源生成、复用合并、光纤传输到信号解复用与性能评估的全流程,并重点探讨了对抗色散、优化器件参数及探索高级调制格式等核心性能优化策略,为应对未来海量数据需求提供了高效、可行的仿真解决方案。

pink的博客 1107

网站用户友好性10个细节

网站用户友好性10个细节

第三只眼的专栏 2311

哈密顿-雅可比不等式:连接最优控制与优化算法的自然物理原理

在控制理论与优化算法之间,存在一个深刻而实用的桥梁。最优控制理论旨在通过设计控制输入,使动态系统在时间维度上达到性能最优,其核心数学工具如庞特里亚金极大值原理和哈密顿-雅可比-贝尔曼方程,为解决连续时间系统的优化问题提供了优雅框架。然而,这些方法在高维非凸问题中面临求解难题。哈密顿-雅可比不等式作为一种松弛方法,通过构造李雅普诺夫函数并验证一个不等式条件,转而寻求性能有保障且易于实现的次优解,其本质是保证系统能量衰减和性能上界。这一原理与耗散性理论紧密相连,体现了自然物理系统(如阻尼振动)中能量耗散的普遍规

weixin_30582943的博客 314

Spring Boot 3.5.4 + LangChain4j实战:用Milvus搭建企业级RAG问答系统(附阿里百炼API配置)

本文详细介绍了如何利用Spring Boot 3.5.4、LangChain4j与Milvus构建企业级RAG问答系统。内容涵盖从架构设计、阿里百炼API安全配置、Milvus部署优化,到RAG检索、会话管理等核心实现,并提供了生产级API设计、监控集成及性能优化等实战经验,旨在帮助开发者打造高可用、可维护的Java AI应用。

weixin_29054399的博客 610

android18lazuli,Free 18 Japan for you on AliExpress.

Great news!!!You’re in the right place for free 18 japan. By now you already know that, whatever you are looking for, you’re sure to find it on AliExpress. We literally have thousands of great product...

weixin_39633493的博客 63万+

Mixer-First Receiver适用于宽带阵列应用的接收机技术1

Mixer-First Receiver适用于宽带阵列应用的接收机技术1技术的背景单元级数字化阵列传统链路到Mixer-First链路的逻辑考虑三种场景小结 技术的背景 在文章《吊打全球的顶级毫米波数字阵列项目-MIDAS》中提到了DARPA在MIDAS项目中在毫米波实现宽带单元级数字化阵列用到了一个关键的叫做N-Path filter的技术,而这个技术同样出现在了《让微波射频工程师颤抖的芯片-MATRICs》的MATRICs芯片中。 为什么DARPA的各个合作研究机构选择这种技术?这篇来自Universi

ICONO的博客 2167

高大上可视化界面(03):用户友好性有啥意义,如何实现。

Hi,我是10年UI经验的老司机→大千UI工场,本期分享可视化大屏用户友好性的相关话题,并配备如果精美作品图,希望大家喜欢,如有设计定制需求可单独私聊我。

2401_82616673的博客 2001

YOLO26剪枝 lamp剪枝测试精度仅掉0.7个点,速度提高11.8fps!

针对没有如何去选择剪枝的内容LAMP是层自适应幅度调整剪枝,无需任何参数,通过算法内部自己计算每个层的重要程度进行剪枝。基于权重重要程度和该层权重大小关系,权重越大表明该层越重要的思想进行优化。这个跟我前面说的非结构化全局剪枝是一个解法(MP),也就是lamp是在我前面那个非结构化剪枝的基础上进行优化的。但是这个逐层进行非结构剪枝目前还没有一个清晰的概念,确定每个层要剪枝多少。LAMP得分是一个平方权重大小,由层中所有“幸存权重”的总和归一化。

m0_64661770的博客 675

【自适应滤波】自适应UKF,基于新息自适应调节Q和R,场景为雷达跟踪与滤波、MATLAB实现

本文提出了一种基于新息协方差匹配的自适应UKF(CM-AUKF)算法,用于解决噪声统计未知或时变场景下的目标跟踪问题。通过实时调整过程噪声协方差Q和观测噪声协方差R,CM-AUKF显著提升了跟踪精度和稳定性。仿真结果表明,相比传统UKF,CM-AUKF在位置和速度估计误差上分别降低了约50%和30%,且无需人工调参。该算法适用于无人机导航、雷达跟踪等动态环境,MATLAB代码可直接运行复现结果。自适应曲线显示算法能有效收敛到真实噪声参数,验证了其自适应能力。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 330

Oracle Hint

Hint 是Oracle 提供的一种SQL语法,它允许用户在SQL语句中插入相关的语法,从而影响SQL的执行方式。 因为Hint的特殊作用,所以对于开发人员不应该在代码中使用它,Hint 更像是Oracle提供给DBA用来分析问题的工具 。在SQL代码中使用Hint,可能导致非常严重的后果,因为数据库的数据是变化的,在某一时刻使用这个执行计划是最优的,在另一个时刻,却可能很差,这也...

hutianci的专栏 1242

如何实现在Go语言中替换程序自身

总结起来,我们可以通过将新的程序二进制文件写入磁盘,并在运行时启动这个新的程序来实现在Go语言中替换程序自身。在Go语言中,有时候我们需要在程序运行时替换程序自身,例如更新程序版本或者进行热重启。本文将介绍一种正确的方式来实现在Go语言中替换程序自身的方法,并提供相应的源代码示例。此外,替换程序自身可能会导致正在运行的程序产生意外行为或终止,请谨慎使用,并确保在合适的时机进行替换操作。实现替换程序自身的关键是将新的程序二进制文件写入到磁盘,并在运行时启动这个新的程序。函数启动新的可执行文件,并在后台运行。

HoUnix的博客 289

oracle hint用法

常见的 从网上copy的1. /*+ALL_ROWS*/  表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化.  例如:  SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO=SCOTT;   2. /*+FIRST_ROWS*/  表明对语句块选择基于开销的优化方法,并获得最佳响

skyspark的专栏 1057

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

2022年SQL经典面试题总结(带解析)

一、选择题(1)基础题1、要求删除商品表中价格大于3000的商品,下列SQL语句正确的是()A、DELETE FROM 商品 WHERE 价格>3000B、DELETE * FROM 商品 WHERE 价格>3000C、DELETE FROM 商品D、UPDATE 商品 SET * =NULL WHERE 价格>3000正确答案: A答案解析:这道题考察的是delete语法DELETE FROM table_nameWHERE some_column=some_value;2、在book表中,将工具书类型(

hahazz233的博客 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Django笔记

1、创建指令创建项目 django-admin startproject MyDjango manage.py命令行工具 __init__.py初始化文件 settings.py项目的配置文件 urls.py项目的URL设置,网站的地址信息 wsgi.py是python应用与web服务器之间的接口,用于Django项目在服务器上的部署和上线,一般不需要修改 2、创建项目应用,相当于网站的功能,每个APP代表网站的一个或多个网页,使用python manage.py startapp xxx创建 m

qq_45655136的博客 3万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android18 sex,《Android面试宝典》学习笔记(第六章:数据库)

如何将table1的内容复制到table2上?createtabletable2asselect*fromtable1;创建视图的SQL语句?create view if not exists view1 as select * from table1;abs(X)的返回值有几种情况?X为正值和0:返回X;X为负值:返回-X;X为NULL,返回NULL;不是数值:返回0;超出范围:溢...

weixin_39949894的博客 3690

用户友好性检测

我们一般通过三个指标来检验一个网站是否对于用户友好,这三个指标分别是:链接的可用性、访问速度体验和查找信息的便捷度。   一、链接的可用性   试想,一个访问者来到你的网站,点击一个超级链接,却发现浏览器只返回一个错误404 页面。如果网页中不可用链接数过多,应该可以想像会是什么结果。一个网站如何能让访问者取得信任?最基本的一个原则就是确保网站的每个链接都可用。不要让访问者扫兴而归,是

huangjuntao_1的博客 4118

MySQL基础-2 查询语句详解

DQL:Data QueryLanguage 数据查询语言标准语法: 数据库执行DQL语言不会对数据库中的数据发生任何改变,而是让数据库发送查询结果到客户端 查询返回的结果其实是一张虚拟表 1 基础查询 查询所有字段的数据:(table_name指的是表名,字段就是我们所说的列) select * from table_name; 查询指定字段的数据:(不同字段之间用,隔开) select 字段1,字段2…from table_name; 2 条件查询 主要结合where的使用 between…and: 介

hmh4640219的博客 3768

什么是“对用户友好”

当我提到一个工具“对用户不友好”(user-unfriendly)的时候,我总是被人“鄙视”。难道这就叫“以其人之道还治其人之身”?想当年有人对我抱怨 Linux 或者 TeX 对用户不友好的时候,我貌似也差不多的态度吧。现在当我指出 TeX 的各种缺点,提出新的解决方案的时候,往往会有美国同学眼角一抬,说:“菜鸟们抱怨工具不好用,那是因为他们不会用。LaTeX 是‘所想即所得’,所以不像 Wor...

wearlee的博客 3054

python基础(二十二):面向对象编程

文章目录一、对象二、类与对象三、面向对象编程四、属性访问1、类属性和对象属性2、属性查找顺序与绑定方法(1)类的数据属性(2)类中定义的函数一般都至少有一个参数,且一般叫self(3)类使用类中函数的传参问题(4)类的函数属性与对象的绑定问题 一、对象 ”面向对象“的核心是“对象”二字,而对象的精髓在于“整合“,什么意思? # 所有的程序都是由”数据”与“功能“组成,因而编写程序的本质就是定义出一系列的数据,然后定义出一系列的功能来对数据进行操作。在学习”对象“之前,程序中的数据与功能是分离开的,如下 #

一点一滴铺就人生 2942

http://v.163.com/movie/2011/7/I/5/M77U097C8_M77U0ICI5.html

http://v.163.com/movie/2011/7/I/5/M77U097C8_M77U0ICI5.html

a19576的专栏 7408

xxxx

package com.systemAgent.actionScript { public class FileUpload { public function FileUpload(taskID:String,mac:String,filePath:String,file_fileSize:Number,hasUploadSize:Number,taskName:String,taskStat

我仅仅是一个Coder 115万+

什么是“对用户友好” (2012-05-18 07:29:17)

转载▼   分类: 操作系统 当我提到一个工具“对用户不友好”(user-unfriendly)的时候,我总是被人“鄙视”。难道这就叫“以其人之道还治其人之身”?想当年有人对我抱怨 Linux 或者 TeX 对用户不友好的时候,我貌似也差不多的态度吧。现在当我指出 TeX 的各种缺点,提出新的解决方案的时候,往往会有美国同学眼角一抬

hnhbdss的专栏 1689

JAVAday18

1.继承: 为什么要学习继承: 1.继承面向对象的三大特性之一,继承可以帮助我们减少代码量 提高程序的延展性; java中如何实现继承? extends关键字; java只支持 单继承(一个类只可以有一个父类) 但是可以多重继承, 一个子类继承了一个父类, 那么久拥有了 父类的所有的公共资源, 但是私有属性 ,获取不到, 必须提供 公共的属性的访问器, 继承中构造器可以被继承吗?不可以,但是必须被子类调用, 默认调用的是 super...

大能人的博客 1182

numpy 处理txt的简单样例

1、需要处理的txt文件64.77.40.66 http://blog.billy.com/2013/08/websites-sell-stuff/ http://blog.billy.com 23.91.70.19 http://collegetranscriptsnow.com/act-vs-sat http://collegetranscriptsnow.com 162.249.125.17...

Fabio的博客 29万+
上一篇: 与MVC框架解耦的OGNL:前世今生及其基本用法
下一篇: 开源深度学习库BigDL在阿里云E-MapReduce上的实践
github_zwl
博客等级 码龄11年 300粉丝 171原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值