来自:众成翻译,译者:有马

链接:https://www.zcfy.cc/article/never-use-the-word-user-in-your-code

当你意识到你在项目开始时做的轻量、简单的设想竟然完全错了时,你已经投入了六个月的时间在这个项目上。现在你需要解决这些问题,才能让这个系统继续运行下去,你发现你用在这个项目上的精力远远超出了你的预期,如果一开始就用正确的方式来做,就不会发生这样的事。

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

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

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

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

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

你没有使用者

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

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

机票预订系统没有“User”

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

  • 旅客可以使用预定记录码通过网站查看预定信息。

  • 购买者可以通过信用卡号后四位数在网站上修改预订信息。

  • 旅行社可以查看和修改他们的预订。

  • 航空公司的值机人员可以根据角色和航空公司来查看和修改预订信息,这需要旅客提供身份信息。

不再一一列举。一些与人类相关的基本概念是“旅客”,“代理”(网站也可是看作代理)和“购买者”。“User”这个概念根本没用,并且在许多请求中我根本不会使用这个单词,举个例子,我们的请求必须包括旅客和代理人的证件,而不是使用者的证件。

Unix 没有 “User”

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

如果我们把所有都当作“User”的话,我们将会有:

  • 使用终端或者图形界面登录的人

  • 像邮件或者web服务器这种系统服务也会以“User”的身份运行,例如nginx可以以httpd用户运行。

  • 在服务器上经常会有多人共享一个管理员账号用来SSH登录(例如,亚马逊的Ubuntu虚拟机默认SSH账号就是‘ubuntu’)

  • root 身份,和上面其他身份都不同。

上面四个是几乎不同的概念,但是在POSIX上他们都是 “User”。 一会儿我们就会看到,把这些概念都称为“User”会导致很多安全问题。

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

SaaS 服务提供商没有 “User”

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

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

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

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

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

“User” 是一个安全问题

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

  • 一个人。

  • 他们在软件中的代表性。

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

因为浏览器是以系统用户的身份运行的,它被认为与人类身份的你相同,实际上你们是不同的。 你作为“User”,不想上传文件。但是系统的账号也是“User”,能够上传文件,如果浏览器运行在你的账号之下,他所有的行为会被当作是你的意图,也就是说是你让它这么做的,实际上不是。

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

前期设计的价值

花更少的功夫处理相同的问题是成为高产程序员的关键。使用模糊不清的概念比如“User”来组织你的软件,将会花费大量时间和精力来解决未来发生的问题。一上来就开始编码看起来是高产的,事实恰好相反。

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

永远不要在代码中使用“User”这个单词相关推荐

  1. 永远不要在代码中使用「User」这个单词!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://tinyurl.com/yxq64zhz 你没 ...

  2. 永远不要在代码中使用「User」这个单词

    点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 来源:21CTO社区 当你意识到你在项目开始时做的轻量.简单的设想竟然完全错了时,你已经用了六个月的时 ...

  3. 真的,我发誓,永远都不会在代码中使用“User”这个单词! - Js中文网

    当你意识到你在项目开始时做的轻量.简单的设想竟然完全错了时,你已经用了六个月的时间投入到这个项目上.现在你需要解决这些问题,才能让这个系统继续运行下去,你发现你用在这个项目上的精力远远超出了你的预期, ...

  4. 为什么不建议在代码中使用 User 这个单词?

    作者 | 洛逸 来源 | http://21cto.com/article/2093 当你意识到你在项目开始时做的轻量.简单的设想竟然完全错了时,你已经用了六个月的时间投入到这个项目上.现在你需要解决 ...

  5. 永远不要在 MySQL 中使用“utf8”

    点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 来源:http://t.cn/EIhnOJT 最近我遇到了一个 bug,我试着通过 Rails 在以& ...

  6. 懒人python操作,代码中永远只需要导入一个库

    Pyforest是一个开源的Python库,可以自动导入代码中使用到的Python库. [阅读全文] 实话说,作为一个程序员还是得不停的学习呀.昨天晚上睡觉之前就在论坛上面溜达了一会儿,发现了有个叫p ...

  7. 苹果开源代码中惊现“wechat”,老外注释的吐槽亮了!

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 每个科技大厂的开源项目,几乎都是各领域开发者最重要的研究学习 ...

  8. 代码中应用设计模式,看这一篇就够了

    作者:宁愿呢 cnblogs.com/liyus/p/10508681.html 为什么要使用设计模式 因为我们的项目的需求是永远在变的,为了应对这种变化,使得我们的代码能够轻易的实现解耦和拓展.如果 ...

  9. 如何在 JS 代码中消灭 for 循环

    Edit: 在我入职上一家公司的第一天,看到代码库里面一堆的 for 循环,内心有些崩溃,于是做了一次技术分享,展示怎样在代码中避免 for 循环.这篇文章是那次分享的总结.至于为什么我提倡避免 fo ...

  10. jsb调用java_在JS代码中使用反射调用java代码注意事项(附webview使用方法)(转)...

    本文是推荐使用过jsb.reflection的开发者进行阅读.关于jsb.reflection的说明请参照: 我们在代码编写过程中,通常会需要在js脚本中调用到java代码或者Objective-C的 ...

最新文章

  1. 封装、继承和构造函数
  2. 双任务时间片运行原理
  3. 开源的13个Spring Boot 优秀学习项目!超53K星,一网打尽!
  4. 微信小程序上传图片到html,微信小程序-上传图片
  5. js传中文参数 java取_js中文转码传输java后台 适用于用url传递中文参数
  6. python中 numpy转list list 转numpy
  7. nginx配置多个二级子域名
  8. 文件字符输入流 FileReader java
  9. MySQL 储存过程-原理、语法、函数详细说明
  10. python 日期处理_python 处理时间和日期
  11. freenas 蜗牛星际_从“白群晖”到“蜗牛星际”,到底哪种NAS方案适合我?
  12. 52周存钱挑战2.0
  13. 推荐使用的热电阻Pt100测温电路
  14. 在MAME里如何设置组合键
  15. argparse模块中的参数action、dest使用
  16. 一个矩形微带贴片天线的调试
  17. 极客时间课程笔记:业务安全
  18. 特种部队小组2+蒲公英联机平台联机教程
  19. Python数据类型——数值型详解
  20. 石头扫地机器人卡顿_80后手残党动手修理石头扫地机器人激光头卡死故障

热门文章

  1. CentOS 6.5安装Tomcat-9.0.0.M19
  2. Streams AQ: qmn coordinator waiting for slave to start等待事件
  3. android listview多视图嵌套多视图
  4. bq24075 锂电池 充电电路分析
  5. SSL Pining Mode 设置iOS SSL 连接安全
  6. Shared File System Master Slave 全配置以及测试
  7. hdu 1864 最大报销额 模型为简单的01背包
  8. 不购买2021新款MacBook Pro的理由
  9. Cinema 4D R25 for mac三维动画设计
  10. 如何在Mac视频中添加表情符号