一份好的设计文档需要提供清晰的问题描述、整体的概要设计、涵盖各个细节的详细设计等。
这篇有趣的英文小短文通过一个简单的小例子介绍了Google工程师是怎么写设计文档的。本文为中文翻译。原文链接如下:
写文档是我在谷歌学到的最重要的技能之一。在谷歌,文档被用来讨论问题、作为真实的信息源、组织知识。在我工作过的其他公司中,没有一家对如何使用文档进行协作有这样深刻的理解。
这篇文章就是关于我在谷歌如何写设计文档的一个例子,这是一个真实的项目,用于在新冠疫情期间控制健身房现场人数。即使在新冠疫情结束后不需要预约健身房了,也可以访问GitHub上的源代码[1]。为了让这篇文章更有趣,现在每个人都可以在谷歌文档[2]上进行评论,而且谷歌文档的格式也比Medium支持的要好。
问题描述
在新冠疫情期间,要求健身房控制现场会员总数,要求会员在去健身房之前先在网站上预订。预约需要提前两天,从午夜开始。例如,2021年04月01日的预订将在当地时间2021年03月30日00:00 AM开放。
这个健身房里的游泳池提供的位置非常有限。我尝试了好几次,都没能预定到早上6点的时间,后来工作人员告诉我,由于需求量很大,必须在午夜预订。但是熬夜到半夜会打乱我的生物钟,所以我没法接受。
而且我觉得雇人做这件事也很不好,因为在内心深处,我认为早睡是健康高效生活方式的核心习惯,用金钱剥夺别人的好习惯是不道德的。在被告知没有别的办法之后,我决定写一个程序来为我做预订。
我个人认为用机器人来做工作是对别人的不公平谷歌翻译文档,所以我对这个决定一点儿也没感到自豪。相反,我认为健身房应该提高一些场地的价格。但这显然超出了设计文档的范围,而且是非常主观的想法。
需 求
不在考虑范围内:
概要设计
| 浏览器自动化 vs 模拟请求
浏览器自动化是指通过程序来控制真实的浏览器,并在GUI上自动化操作。模拟请求是指让程序通过HTTP与服务器交互,这个程序就像是一个Web浏览器(而不是控制一个浏览器)。
考虑到下面几点,我认为浏览器自动化比模拟请求更好:
显然利大于弊。
| 系统概述
Selenium[3]是一个提供浏览器自动化解决方案的软件库。我们的程序将用Python编写,并通过Python API控制Selenium,Selenium则通过它的Gecko驱动程序控制Firefox。
Caffeinate[4]是一个阻止操作系统进入睡眠状态的程序。如果系统休眠,程序将无法在半夜运行。
详细设计
| 用户输入
用户名、密码、日期等都是从命令行参数中输入的。
| 重试
程序将捕获所有异常(页面未加载等)并重试100次直到预订成功,成功的预订通过确认DOM元素进行识别。
| 浏览器选择
我们需要使用主流浏览器之一。我考虑并测试了Chrome、Firefox和Safari,Safari和Chrome都需要额外的步骤来使用相应的Selenium驱动程序,所以我选择了Firefox。它也需要一些来自操作系统设置的认证,但只需要在最初几次确认就可以了。
| 日志
程序自动执行浏览器操作,就像是由用户发起的一样。本质上,它将在循环中执行以下操作:
查找某个元素
对元素进行操作(输入文本、选择选项或单击)
等待预期结果,然后返回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秒,直到被加载并成为可被点击的按钮。
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点预订是不可能的。
相关链接:
#explicit-waits
———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击网站首页每天更新
站 长 微 信: aiwo51889在公司办公,一般用的是局域网,在这样的网络环境中,常常需要设置共享文件夹如何创建在线文档,以方便访问同事的电脑,那么这样的共享文件夹应该怎么设置?下面以win系统为例子说说设置电脑共享文件夹的步骤。
准备工具:两台电脑。
具体如何操作以防找不到可以先收藏哦!
具体操作
1.我们得先有两台电脑,一台作为共享一台作为访问共享
首先我们在共享的电脑上先创建一个文件夹
2.打开控制面板-管理工具-计算机管理-本地用户和组如何创建在线文档,我们双击用户进去之后空白出右击新建一个用户输入你要创建的用户名和密码
(务必勾选用户不能更改密码,和密码永不过期)
3.创建好之后我们打开控制面板-网络和共享中心-更改高级共享设置
进去之后把启用共享勾选点击保存更改
4.我们回到共享文件夹,选中刚才刚才创建的文件夹右击属性点击共享
进去之后我们找到创建的用户点击添加并根据你个人需求选择权限,读或者读写
5.完成之后我们先查看本机的IP地址,然后到想要访问共享的电脑上打开运行双斜杠+共享电脑的IP地址
确定之后输入刚才创建的用户名和密码即可访问
如果帮助到您,请给个小心心哦!
·end·
奕奇科技
助力企业搭建PC端及移动端线上营销产品
关注我GET电脑小技能
———END———
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击网站首页每天更新
站 长 微 信: aiwo51889声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。