当你意识到你在项目开始时做的轻量、简单的设想竟然完全错了时,你已经投入了六个月的时间在这个项目上。现在你需要解决这些问题,才能让这个系统继续运行下去,你发现你用在这个项目上的精力远远超出了你的预期,如果一开始就用正确的方式来做,就不会发生这样的事。
今天,我要告诉你的是一个经常犯的错误,一个会带来无穷无尽的问题的单词,那就是 User。
User 这个单词有 2 个最基本的错误:
User 的概念是模糊不清的代码翻译器在线使用,使用更精准的术语几乎总是能起到更好的效果。
你没有使用者(User)
最开始,没有任何一个软件系统真的有使用者存在。乍一看 User 是一个好的描述,但是你稍微一想就会意识到你的业务逻辑实际上比这要复杂的多。
我会使用三个例子,从一个极端的情况出发。
1、机票预订系统没有 User
我曾经给机票预订系统写过访问控制逻辑,下面只是一小部分需求:
不再一一列举。一些与人类相关的基本概念是“旅客”,“代理”(网站也可是看作代理)和“购买者”。Use 这个概念根本没用,并且在许多请求中我根本不会使用这个单词,举个例子,我们的请求必须包括旅客和代理人的证件,而不是使用者的证件。
2、Unix 没有 User
我们看一个不太一样的例子。Unix (这些天被称为 POSIX)有用户,他们可以登录并执行代码。这样看起来很不错吧?我们深入看一下。
如果我们把所有都当作 User 的话,我们将会有:
上面四个是几乎不同的概念,但是在 POSIX 上他们都是 User。一会儿我们就会看到,把这些概念都称为 User 会导致很多安全问题。
在操作上,因为 POSIX 的用户模型边界存在,我们甚至不能找到一种方式说「只能让 Alice 和 Bob 通过这个账号登录」。
3、SaaS 服务提供商没有 User
Jeremy Green 最近就用户模型在 SaaS 中的应用在推特上发文,它第一次提醒了我写下这篇文章,他的基本观点是 SaaS 服务几乎总是:
如果你一开始就把这些人作为一个用户,你将会陷入一个痛苦的世界。你无法建立团队模型,你无法组建同时为多人支付的模型,然后你就会开始改造你的系统。现在你在 SaaS 案例中学到了一课,我们来看一看你的生活。
但是这只是众多例子中的一个:User 的概念太模糊了。如果你开始怀疑 User 这个词,最终你可能发现你其实只需要两个概念:团队(用来组织关系和支付)和成员(实际使用服务的人)。
User 是一个安全问题
User 这个单词不仅是业务逻辑的问题,它也导致了一系列安全问题。User 这个单词如此的模糊以至于从根本上将两个概念合并了:
为了说明这个问题,假设你正在访问一个居心不良的网站,在它服务器上的图片导致了你的浏览器内存溢出。远程网站控制着你的浏览器,并且开始将你的文件上传到他的服务上。为什么它能这样做?
因为浏览器是以系统用户的身份运行的,它被认为与人类身份的你相同,实际上你们是不同的。你作为 User,不想上传文件。但是系统的账号也是 User,能够上传文件,如果浏览器运行在你的账号之下代码翻译器在线使用,他所有的行为会被当作是你的意图,也就是说是你让它这么做的,实际上不是。
这就是被称为 Confused Deputy 的问题。如果你使用 User 这个词来描述两个根本不同的东西,那么这个问题就更有可能成为你设计的一部分。
前期设计的价值
花更少的功夫处理相同的问题是成为高产程序员的关键。使用模糊不清的概念比如 User 来组织你的软件,将会花费大量时间和精力来解决未来发生的问题。一上来就开始编码看起来是高产的,事实恰好相反。
下次你开始一个新的软件项目时,请预先花几个小时确定你的术语和概念:虽然这么做你仍然不会完全正确,但你会做得更好。未来的你将感谢你现在所做的所有预防浪费的工作。
往期热文(点击图片即可阅读)
关注「程序员的那些事」加星标,不错过圈内事
好文章,我在看❤️
———END———
限 时 特 惠:本站每日持续更新海量各大内部创业教程,一年会员只需128元,全站资源免费下载点击查看详情
站 长 微 信:jiumai99