当你意识到你在项目开始时做的轻量、简单的设想竟然完全错了的时候,你已经用了六个月的时间投入到这个项目上。

现在你需要解决这些问题,才能继续让这个系统运行下去,你发现你用在这个项目上的精力远远超出了你的预期,如果一开始就用正确的方式来做,就不会发生这样的事。

今天,我要告诉你的是一个经常犯的错误,一个会给你带来无穷无尽的问题的单词,那就是“users”。你一定是经常用错的!

这个单词有两个最基本的错误:

1、对你的需求来说 “User” 几乎从来都不是一个好的描述。

2、“User” 会导致一个基本的设计安全缺陷。

“user” 的概念是模糊不清的,使用更精准的术语几乎总是能起到更好的效果。

你没有使用者

最开始,没有任何一个软件系统真的有使用者存在。乍一看“user”是一个好的描述,但是你稍微一想就会意识到你的业务逻辑实际上比这要复杂的多。

我会使用三个例子,从一个极端的情况出发。

机票预订系统没有“users”

我曾经给机票预订系统写过访问控制逻辑,下面只是一小部分需求:

旅客可以使用预定记录码通过网站查看预定信息。
购买者可以通过信用卡号后四位数在网站上修改预订信息。
旅行社可以查看和修改他们的预订。
航空公司的值机人员可以根据角色和航空公司来查看和修改预订信息,这需要旅客提供身份信息。
不再一一列举。一些与人类相关的基本概念是“旅客”,“代理”(网站也可是看作代理)和“购买者”。

“user”这个概念根本没用,并且在许多请求中我根本不会使用这个单词,举个例子,我们的请求必须包括旅客和代理人的证件,而不是使用者的证件。

Unix 没有 “users”

我们看一个不太一样的例子。Unix (这些天被称为POSIX)有用户,他们可以登录并执行代码。这样看起来很不错吧?我们深入看一下。

如果我们把所有都当作“users”的话,我们将会有:使用终端或者图形界面登录的人

像邮件或者web服务器这种系统服务也会以“users”的身份运行,例如nginx可以以httpd用户运行。
在服务器上经常会有多人共享一个管理员账号用来SSH登录(例如,亚马逊的Ubuntu虚拟机默认SSH账号就是‘ubuntu’)
root 身份,和上面其他身份都不同。
上面四个是几乎不同的概念,但是在POSIX上他们都是 “users”. 一会儿我们就会看到,把这些概念都称为‘user’会导致很多安全问题。

在操作上,因为POSIX的用户模型边界存在,我们甚至不能找到一种方式说“只能让 Alice 和 Bob 通过这个账号登录”。

SaaS 服务提供商没有 “users”

Jeremy Green 最近就用户模型在SaaS中的应用在推特上发文,它第一次提醒了我写下这篇文章,他的基本观点是SaaS 服务几乎总是:

1、某个组织中的一个人支付服务费用。

2、一个或多个人共同使用这个服务。

如果你一开始就把这些人作为一个用户,你将会陷入一个痛苦的世界。你无法建立团队模型,你无法组建同时为多人支付的模型,然后你就会开始改造你的系统。现在你在SaaS案例中学到了一课,我们来看一看你的生活。

但是这只是众多例子中的一个:“users”的概念太模糊了。如果你开始怀疑“user”这个词,最终你可能发现最终你其实只需要两个概念:团队(用来组织关系和支付)和成员(实际使用服务的人)。

“Users” 是一个安全问题

“user” 这个单词不仅是业务逻辑的问题,它也导致了一系列安全问题。“user” 这个单词如此的模糊以至于从根本上将两个概念合并了:

一个人。
他们在软件中的代表性。
为了说明这个问题,假设你正在访问一个居心不良的网站,在它服务器上的图片导致了你的浏览器内存溢出。远程网站控制着你的浏览器,并且开始将你的文件上传到他的服务上。为什么它能这样做?

因为浏览器是以系统用户的身份运行的,它被认为与人类身份的你相同,实际上你们是不同的。

你作为’user’,不想上传文件。但是系统的账号也是‘user’,能够上传文件,如果浏览器运行在你的账号之下,他所有的行为会被当作是你的意图,也就是说是你让它这么做的,实际上不是。

这就是被称为Confused Deputy的问题。如果你使用“用户”这个词来描述两个根本不同的东西,那么这个问题就更有可能成为你设计的一部分。

前期设计的价值

花更少的功夫处理相同的问题是成为高产程序员的关键。使用模糊不清的概念比如“用户”来组织你的软件,将会话费大量时间和精力来解决未来发生的问题。

一上来就开始编码看起来是高产的,事实恰好相反。

下次你开始一个新的软件项目时,花几个小时预先确定你的术语和概念:你仍然不会完全正确,但你一定会做得更好。未来的你将感谢你所做的所有预防浪费的工作

写代码的注意了,User这个单词用不得相关推荐

  1. python在哪里写代码比较适合-AI辅助写代码,Python之父都爱不释手的工具

    我刚看到这个工具的时候,也是一脸懵x,AI?机器学习?辅助?如果能全自动写出代码得多好,不过真要是这样,在座各位的就业危机就彻底来了. 言归正传,这个工具是-- kite 这是一款IDE插件,使用机器 ...

  2. 里写注释 postman_没用过这些IDEA插件?怪不得写代码头疼

    小伙伴们,大家好. 今天准备和大家一起分享一下实际工作中常用的几款能提升幸福感和工作效率的IDEA插件吧,也欢迎小伙伴们在评论区安利出你们用过的觉得非常不错的插件,大家一起交流进步. 1.Backgr ...

  3. 别总写代码,这100多个相见恨晚的网站比涨工资都重要

    来自 | CSDN    作者 | 爪白白 编辑 | 深度学习这件小事    搞学习 CSDN:https://www.csdn.net/ TED(最优质的演讲):https://www.ted.co ...

  4. gsonformat插件_收藏非常有用的IDEA插件,没用过这些IDEA插件?怪不得写代码头疼

    小伙伴们,大家好. 今天准备和大家一起分享一下实际工作中常用的几款能提升幸福感和工作效率的IDEA插件吧,也欢迎小伙伴们在评论区安利出你们用过的觉得非常不错的插件,大家一起交流进步. 1.Backgr ...

  5. 通过听力写代码?盲人程序员就是这样做的

    一 Michael Forzano,Amazon 2018 年 3 月,Amazon 官网「工作在 Amazon」栏目有一篇文章,介绍了他们的一位盲人程序员 Michael Forzano. (视频来 ...

  6. 优秀 Java 程序员写代码的风格

    转载自 涨姿势 | 优秀 Java 程序员写代码的风格 今天突发奇想,对编码习惯和 编程风格 很感兴趣,于是乎,找了一下关于编程风格(Java篇)的资料,希望对爱好编码或者开始学习编码的同学有帮助! ...

  7. 我在 1969 年写代码

    [CSDN 编者按]1969年,人类第一次登月,计算机功不可没.那么50年前的程序员是则那样编程的呢?这位 72 岁的女程序员说:铅笔写代码,打印机打印. 来源 | ilikebigbits.com ...

  8. gsonformat插件_没用过这些IDEA插件?怪不得写代码头疼

    文章来源:https://mp.weixin.qq.com/s/ZHSOZ2y8aTyx42-sa7_D6A 作者:hansonwong99 来源平台:微信公众号 小伙伴们,大家好. 今天准备和大家一 ...

  9. 《纽约客》特写Jeff Dean与Sanjay:谷歌唯二11级工程师,同一台电脑上写代码

    作者:<纽约客> James Somers 翻译:新浪科技 堆堆.李明 量子位 经授权转载 | 公众号 QbitAI 最近,<纽约客>杂志写了一篇长文,描述谷歌唯二11级工程师 ...

  10. 我上了一节小学AI课,发现四年级的小朋友不仅懂AI,还学会了写代码运行

    郭一璞 发自 崂山 量子位 报道 | 公众号 QbitAI "用最快的速度,从文件夹中所有的照片里找到这个人" 接到这个任务后,周涵迅速的启动了代码编辑器,熟练地输入了几行Pyth ...

最新文章

  1. Facebook新AI模型实现直接从非英语语言翻译到另一种非英语语言
  2. 2018.09.24-2018.09.30
  3. 为什么手机上传图片这么慢 前端_为什么手机拿去维修,店家总说第二天来取?修手机真这么慢?...
  4. VS2008 连接 SAP 4.6C RFC 经验分享(折腾了两天)
  5. luci L大_“大众”果然没失望,空间大,颜值暴增
  6. ESP定律手工脱壳步骤
  7. 「题解」:[BZOJ4558]方
  8. POJ3275 Ranking the Cows【关系闭包】
  9. linux系统下如何查找文件(根据文件属性或者根据文件内容)
  10. Spring源码之bean的解析obtainFreshBeanFactory方法解读
  11. 软件体系结构期末考试总结
  12. Linux man中文手册的安装与使用
  13. 如何实现通过Leaflet加载dwg格式的CAD图
  14. 计算机操作系统(慕课版-汤小丹)习题
  15. 支付宝密钥及文件生成方式
  16. Java关于大批量数据处理
  17. vue 移动端头像裁剪_Vue 头像裁剪控件
  18. uni-app项目(首页)
  19. 每日一词20190307——参考椭球体(reference spheroid)
  20. Miracast投屏反控

热门文章

  1. android 中间凹背景_Android实现边缘凹凸的View
  2. ffmpeg编码越来越小_从ffmpeg源代码分析如何解决ffmpeg编码的延迟问题(5)
  3. python给excel排序_如何使用Python对Excel工作表排序
  4. 使用lambdaquery() 报空指针异常_Java 14 来势汹汹,这回让空指针无处遁形!!
  5. 查询各个年级的平均分_艰难困苦终生志,玉汝于成竟英才——高三年级期中考试总结暨优秀学生表彰会...
  6. 如何把hello.c 输出到txt_如何在程序开发中进行文件的相关操作呢?往这看
  7. 用MySQL写怎么删除字母_mysql如何替换掉字母
  8. linux mysql jdbc_linux下jdbc连Mysql异常 郁闷了一天!
  9. python中global的使用_PYTHON中使用GLOBAL引发的一系列问题
  10. Java线程更新ui_android使用多线程更新ui示例分享