与优秀的人在一起,自己也会优秀起来,点击加入

来源:DeepNoMind

一份好的设计文档需要提供清晰的问题描述、整体的概要设计、涵盖各个细节的详细设计等。

这篇有趣的英文小短文通过一个简单的小例子介绍了Google工程师是怎么写设计文档的。本文为中文翻译。原文链接如下:https://reurl.cc/ZrVD2A

写文档是我在谷歌学到的最重要的技能之一。在谷歌,文档被用来讨论问题、作为真实的信息源、组织知识。在我工作过的其他公司中,没有一家对如何使用文档进行协作有这样深刻的理解。

这篇文章就是关于我在谷歌如何写设计文档的一个例子,这是一个真实的项目,用于在新冠疫情期间控制健身房现场人数。即使在新冠疫情结束后不需要预约健身房了,也可以访问GitHub上的源代码[1]。为了让这篇文章更有趣,现在每个人都可以在谷歌文档[2]上进行评论,而且谷歌文档的格式也比Medium支持的要好。

问题描述

在新冠疫情期间,要求健身房控制现场会员总数,要求会员在去健身房之前先在网站上预订。预约需要提前两天,从午夜开始。例如,2021年04月01日的预订将在当地时间2021年03月30日00:00 AM开放。

这个健身房里的游泳池提供的位置非常有限。我尝试了好几次,都没能预定到早上6点的时间,后来工作人员告诉我,由于需求量很大,必须在午夜预订。但是熬夜到半夜会打乱我的生物钟,所以我没法接受。

而且我觉得雇人做这件事也很不好,因为在内心深处,我认为早睡是健康高效生活方式的核心习惯,用金钱剥夺别人的好习惯是不道德的。在被告知没有别的办法之后,我决定写一个程序来为我做预订。

我个人认为用机器人来做工作是对别人的不公平,所以我对这个决定一点儿也没感到自豪。相反,我认为健身房应该提高一些场地的价格。但这显然超出了设计文档的范围,而且是非常主观的想法。

需求

  • 自动提前两天在半夜预订健身房

  • 程序启动后不需要人工交互,应该具有容错性,能够进行合理的重试

  • 可以在Mac电脑上运行

  • 用户可以指定用户名、密码、预约的项目、日期和时间等

不在考虑范围内:

  • 只提前1或2天预订,或当天预订

  • 容忍操作系统或网络问题

  • 在预约服务器停止运行后还要能够工作

  • 在网站结构(HTML)改变后,还要能够工作

概要设计

浏览器自动化 vs 模拟请求

浏览器自动化是指通过程序来控制真实的浏览器,并在GUI上自动化操作。模拟请求是指让程序通过HTTP与服务器交互,这个程序就像是一个Web浏览器(而不是控制一个浏览器)。

考虑到下面几点,我认为浏览器自动化比模拟请求更好:

  • [优点] 浏览器自动化启动了一个真实的浏览器实例,所以我们知道程序运行时发生了什么,它使调试和开发更加容易。

  • [优点] 网站需要JavaScript加载控件,而这较难通过编程实现,可能需要控制一些渲染引擎。

  • [缺点] 浏览器自动化依赖于HTML结构,而模拟请求依赖于HTTP API,API相对稳定,不太可能改变。

显然利大于弊。

系统概述

Selenium[3]是一个提供浏览器自动化解决方案的软件库。我们的程序将用Python编写,并通过Python API控制Selenium,Selenium则通过它的Gecko驱动程序控制Firefox。

Caffeinate[4]是一个阻止操作系统进入睡眠状态的程序。如果系统休眠,程序将无法在半夜运行。

详细设计

用户输入

用户名、密码、日期等都是从命令行参数中输入的。

重试

程序将捕获所有异常(页面未加载等)并重试100次直到预订成功,成功的预订通过确认DOM元素进行识别。

浏览器选择

我们需要使用主流浏览器之一。我考虑并测试了Chrome、Firefox和Safari,Safari和Chrome都需要额外的步骤来使用相应的Selenium驱动程序,所以我选择了Firefox。它也需要一些来自操作系统设置的认证,但只需要在最初几次确认就可以了。

日志

程序自动执行浏览器操作,就像是由用户发起的一样。本质上,它将在循环中执行以下操作:

  1. 查找某个元素

  2. 对元素进行操作(输入文本、选择选项或单击)

  3. 等待预期结果,然后返回1

因此,每个日志记录将有两项内容:

  • 执行了什么

  • 在等待什么

这样的日志记录将使调试变得容易。

保持电脑持续运行

如果操作系统在程序启动到午夜之间进入休眠状态,则程序在午夜就无法运行了,Caffeinate可以防止这种情况发生。它是一个命令行工具,我们在Python中把它作为子进程启动:

subprocess.Popen([‘caffeinate’, ‘-d’, ‘-w’, ‘%d’ % os.getpid()])

定位控制

Selenium提供了一组方法[5]来访问特定的DOM元素,其中xpath的表达能力最强。因此,我们将使用find_element_by_xpath来定位DOM元素,如按钮、输入框等。

只要有可能,我们宁愿依赖DOM的内部文本来定位它们。相对于DOM结构和属性(类名等),内部文本的优势并不是说它不太可能更改,而是如果它们发生更改,更容易调试。当然,我们必须对DOM结构做一些假设,比如我们需要点击class='control'分区(div)下的class='logon'的第二个按钮。

等待页面加载

在发送每个HTTP请求后,程序需要等待加载页面(通常是2~5秒,是的,这个站点很慢)。这是由WebDriverWait API[6]完成的。例如,以下代码将等待120秒,直到 <button ng-reflect-router-link= ' /Appointments ' > 被加载并成为可被点击的按钮。

book_btn = WebDriverWait(driver, 120).until(EC.element_to_be_clickable((By.XPATH, “//button[@ng-reflect-router-link=’/Appointments’]”)))

如果按钮在120秒内加载失败,将引发异常。

更多的实现细节

选择正确的日期。假设我们想预定4月14日,我们无法在预订日历上选择文本为‘14’的单元格,因为3/14的单元格有类似的属性。当前月份的单元格必须包含有class cal-in-month。

调整月份。预订日历显示的是当月的当天,而不是我们打算预订的月份。如果两天后就是下个月,这就会有问题。因此,我们必须添加另一个步骤实现在这个边界情况下选择正确的月份。

操作流程

假设我想预订4月14日的游泳池,需要在4月11日的任意时间运行以下命令:

python book.py --username xxxxxx --password xxxxxx --day 14 --time ‘5:00 PM’ --sport small_pool

程序将每休眠1秒钟被唤醒检查一次时间,这个检查不会有任何明显的CPU消耗。Caffeinate将阻止操作系统进入睡眠状态,直到午夜时分。

在4月12日午夜,它将启动Firefox浏览器,并自动完成预订。之后,Caffeinate进程和主进程都将退出,操作系统将正常进入休眠状态。

4月12日的早上,我会看一下日志,看看预订是否成功。

一个有趣的事实

竞争确实非常激烈,通常在第1分钟预约就结束了。每个时段总共只有6个名额,毫无疑问,在早上6点预订是不可能的。

我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。另外,如果你最近想跳槽的话,年前我花了2周时间收集了一波大厂面经,节后准备跳槽的可以点击这里领取!

推荐阅读

  • 下载 145 部盗版视频,被法院判赔偿 70 万元!

  • Fastjson 2.0.3 发布:增强对1.x的兼容,支持JDK 14 record

  • Linux 中 10 个最危险的命令

··································

你好,我是程序猿DD,10年开发老司机、阿里云MVP、腾讯云TVP、出过书创过业、国企4年互联网6年。从普通开发到架构师、再到合伙人。一路过来,给我最深的感受就是一定要不断学习并关注前沿。只要你能坚持下来,多思考、少抱怨、勤动手,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你看好一个事情,一定是坚持了才能看到希望,而不是看到希望才去坚持。相信我,只要坚持下来,你一定比现在更好!如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯,帮你积累弯道超车的资本。

点击领取2022最新10000T学习资料

如何写出令人惊叹的设计文档?相关推荐

  1. 怎么写出一份令人惊叹的设计文档?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 一份好的设计文档 ...

  2. 如何才能写出好的软件设计文档?

    作为一名软件工程师,我花了很多时间在阅读和撰写设计文档上.在磨砺了数百篇文档之后,我发现,优秀的设计文档与项目的成功之间有着密切的联系. 这篇文章将介绍怎样才能写出一份优秀的设计文档. 为什么要写设计 ...

  3. 设计师喜欢收集各种各样的笔刷来喽,不必倾家倾产就能像创造出令人惊叹的设计。

    一组最好的Photoshop笔刷,让您不必倾家倾产就能像专业人士一样创造出令人惊叹的设计. 我们知道设计师喜欢收集各种各样的刷子. 对于创建各种类型的设计非常有用,包括从绘画到绘画,上色,纹理,肌理等 ...

  4. 如何写出好的产品帮助文档?

    大多数程序员都不喜欢写文档,有写文档时间,还不如重构一遍代码.早前我也这么认为,究其原因,一则自己不喜欢也不擅长写文档,代码是给机器读的,只要语法和逻辑没问题,计算机就会听命执行,而文档是写给人看的, ...

  5. 干货分享 | 如何写出清晰易懂的交互文档?

    ​交互设计说明文档,简称DRD.用来说明产品设计思路.设计方案.信息架构.原型线框.交互说明等内容,文档中的内容包括: 交互文档中的主要内容 1.用户权限:根据不同用户的权限对该需求进行检查,比如普通 ...

  6. 如何查看cplex的help文档_用摹客,写出更好的产品文档

    产品经理是一个自带标签的角色,产品文档则是和产品经理捆绑最紧密的标签之一.如何高效产出产品文档?这是每一个产品经理都必须修炼的技能.今天,我们就来专门谈谈这个话题:如何帮助产品经理撒大法师的高效撰写产 ...

  7. 如何写后端开发之接口设计文档

    一.接口的理解       当我们说到接口时,首先要分前端和后端,前端有Android.IOS.Js,后端定义返回值.参数.请求方式.协议等.    统A调用系统B,系统B调用系统C,像是把多个系统连 ...

  8. 写好一份软件开发设计文档

    如何写好一份软件开发设计文档 转载: 设计文档 - 也被称作技术规范和实现手册,描述了你如何去解决一个问题,是确保正确完成工作最有用的工具,其目的是迫使你对设计展开缜密的思考,并收集他人的反馈,进而完 ...

  9. 如何写出一份优秀的软件设计文档

    作为一名软件工程师,我花了很多时间阅读和编写设计文档.在完成了数百篇这些文档之后,我亲眼目睹了优秀设计文档与项目最终成功之间的强烈关联. 本文试图描述什么使设计文档变得更好. 本文分为4个部分: · ...

最新文章

  1. android 无法接收广播_别告诉我你不认识Android中广播接收者(二)
  2. 分享5个有趣的 JavaScript 代码片段
  3. SignalR Core尝鲜
  4. 仿微信的网络聊天室项目开发【完整源码讲解,Java一年工作经验面试题
  5. axios 同步_githubactions进行github仓库和gitee仓库同步
  6. 基于C++有限状态机的实现技术
  7. Shell(9)——sed(1)
  8. FloatingActionMenu 向上弹出菜单
  9. 固态硬盘简称是不是ssd_小白科普:没想到你是这样的固态硬盘
  10. Unity中的矩阵含义
  11. 【安全算法】一文带你简要了解常见常用的安全算法
  12. Matlab 元胞自动机(模拟传染病传播)
  13. NCBI:美国国立生物技术信息中心大型数据库
  14. 电子器件——钽电容的简介
  15. 数据挖掘(pandasxgboost)
  16. xsser工具使用教程
  17. WindowsApps目录占用大量空间
  18. 基于three.js的3D炫酷元素周期表
  19. python turtle绘制正五角星
  20. c++ 繁体中文与简体中文的转换

热门文章

  1. 苹果操作系统 leopard 10.5 (PC破解完全中文安装版,IBM X40安装成功)
  2. “远香烟·近健康”乡风文明之禁烟活动
  3. 不允许使用不完整的类型_孩子,我允许你不优秀,但我不允许你不努力!
  4. 通过XMind Update制作思维导图
  5. 小米5S_2015711_官方线刷包_救砖包_解账户锁
  6. 图的生成树与生成森林
  7. Android接入极光推送,接入华为,小米,OPPO,VIVO厂商通道
  8. 用Python搞定豆瓣上征婚交友的小姐姐们~
  9. C语言基本的语法规定
  10. win10计算机维护,Win10系统打开或关闭自动维护功能的方法