抽象的不同层次

一个关于抽象的故事 抽象能力应该是程序员所需要具备的、再如何强调都不为过的、最重要的能力了。通过抽象,我们可以从纷纭错乱的、独立的、看似互不干涉的大量问题中解脱出来,找到一个方案,然后一举解决一类问题。 由于抽象是提取了众多具体事物的某种特征并进行了简化的结果,抽象的概念有时候反而会阻碍我们的思考(大概人的大脑更喜欢具体的事物吧)。这时候我们与需要具体的实例来帮助理解。也就是说,在思维活动中,不论是代码编写,还是方案设计时需要不断的从实例中提取概念并形成抽象,又需要不时的将抽象具体化成实例来验证理论。Bret Victor曾将这个过程比作抽象的梯子是非常有见地的 – 你需要不断的爬上爬下,从高处看一看概览,然后回到地上做一些实际而具体的动作。 另一个有趣的事实是,抽象可以有多个层次,当我们终于脱离了众多细节,建立起更高层的概念时,这些高级(high-level)的概念又变成了新的细节,而我们又可以基于这些细节作出新的抽象。就好比我们现在使用JavaScript或者Python来写程序的时候,基本上不需要考虑诸如寄存器的编码含义,机器指令长度等等细节,也无需关注内存的分配和释放等等细节,而只需关注业务功能即可。 这么说起来太过于抽象,我们来看一个具体的例子吧。 背景介绍 在这篇文章中,我希望通过对一个模拟项目的自动化测试(使用cypress)的重构来描述一些代码编写/重构时的模式。其中涉及到的重构方法比较常规,并没有高深的技巧,不过我觉得通过详细解析一个从可以工作的代码演进为较为整洁且便于理解/修改的测试用例,整个过程还是比较有趣的,希望你也可以有所收获。 所谓模拟项目,是对我从2019年1月到10月所经历的一个项目的模拟。纯粹从业务来说,该项目的业务规则/逻辑并不是十分复杂,不过技术细节上有很多值得反思的地方。我们的自动化测试也是经历了N个版本的迭代,最后我也成功将这篇文章中描述的模式应用到了该项目中,效果也是比较令人满意的。 这里的模拟应用Questionnaire是这样一个服务:通过类似调查问卷的方式来输入用户技能,角色,技术水平,项目偏好等等,根据后台的规则引擎来返回一些最适合用户的offer列表。后台的计算逻辑我们这里刻意将其淡化,这里只关注信息的采集部分。 应该注意的是,这里的调查问卷是动态的,比如如果对问题Q1选择了答案A,则下一个问题会变成Q303,如果选B的话则需要回答问题Q1024等。也就是说,问卷的路线有可能是多条的,而且每一条都是同等重要的(至少在测试里需要完整走通一遍)。 从界面上来看,我将整个问卷简化成了3步,实际场景里则可能是10+步,而且每一步中需要回答的问题长短不等,有些问题展现/隐藏还会依赖于前面某一步/某几步用户的答案等。用户只有完成了当前所在的步骤的所有必选项之后,才可以进入下一步(Next按钮才会可用)。 抽象101 - 函数 从功能测试编写的角度来看,将每个步骤视为一个独立的单元是一个合理的做法。每一个步骤需要做的事情也非常类似: 验证该步骤的标题是正确的 填写该步骤的所有必选项 点击下一步按钮 在写一个section的测试时,直观的通过cypress提供的API的结果大致为(假设这里的所有data-test标记我们已经在应用代码中打好了桩): it('Verify the basic information section', () => { cy.get('[data-test="step-title"]').contains('Basic information'); cy.get('[data-test="email-address"] input').type('juntao.qiu@gmail.com'); cy.get('[data-test="assignment"] input[value="assigned"]').check(); cy.get('button[data-test="next-button"]').click(); }); 第二个section的流程大同小异,都是先用selector找到页面元素,如果可以找到的话,通过cypress的API来模拟用户的实际操作: it('Verify the details section', () => { cy.get('[data-test="step-title"]').contains('More details'); cy.get('[data-test="ps-role"]').click(); cy.get('[data-value="dev"]').click(); cy.get('[data-test="developer"] input[value="frontend"]').check(); cy.get('[data-test="rating"] [for="rating-4"]').click(); cy.get('button[data-test="next-button"]').click(); }); 如果逐字对比的话,每行代码几乎都不一样,但是如果仔细看又会发现很多重复。消除这些重复显然可以让代码干净一些,可读性也可以得到提高。一个立即可以想到的重构方法是抽取函数,将验证标题和点击下一步抽取如下: const checkStepTitle = (title) => { cy.get("[data-test="step-title"]").contains(title); } const goToNextStep = () => { cy....

July 9, 2020 3 min

<del>程序员</del>英语学习指南

程序员英语学习指南 这篇文章从我个人的经验出发,总结了英语学习中一些比较重要的关键点。简单来说,就是尝试投入专门的时间,集中精力突破7,000到8,000的核心词汇,然后在这个基础上逐项提升英文的输入/输出能力(听、说、读、写)。一个省时省力的实践是:听和说可以一起练习,读和写往往也连在一起。如果可以在听的同时练习说,以及读的时候同时写,那么显然可以事半功倍,并促进形成比较积极的反馈,从而激励自己投入更多的时间和精力来提高英文能力。 在进入正题之前,我们需要看一些数据和事实,来帮助我们认清把英语学好是一件什么规模/规格的任务。 语言学习是困难的 语言的学习和很多生活中其他工作/任务有很大的不同,这些差异往往会导致学习者的挫败感。首先,学习外语的反馈周期往往很长,即使你每天坚持扩充词汇量、阅读文章、甚至与采用外语来写作,而从开始投入到看到成效往往需要较长时间。其次,自然语言中的规则往往不固定,比如英文中很多动词的过去式和过去分词都是不规则的,这些不规则使得学习者在熟记“公式”外,还需要记忆很多变体(比如单词seek的过去式和过去分词都是sought)。最后,语言通常总是和文化关联在一起,这也意味着它无处不在却又难以描述,而且这些关联又非常离散,难以集中突破。 虽然个体之间会有各式各样的差异,但是总的来说,这些客观的挑战对于每个外语学习者都是存在的。如果你咨询任何一个外语比较好的同事,大约会得到很多不同版本的经验或者秘笈。我这里想要分享的自然只是我自己的经验,未必系统,当然更不可能全面,但是我相信可能对你也有效。 简而言之,无论是在听、说、读、写四大元素的任何一个方面,要想取得比较大的进步,首先要做的是认真对待词汇量。丰富的词汇量是学习更近一步内容的基石,一方面,她可以帮助你更好的理解其他人的意图,捕捉到细微的感情差异。另一方面,她可以帮助更精确,更快速有效的将自己的思想传递给他人。 重中之重:词汇量 词汇量的重要性 开宗明义,永远不要“妄图”把英语说的和native一样好。这个目标既不切合实际,也完全没有必要。我估计不是每个人都同意这个观点,为了让你放弃这种想法,我们可以先看一下native speaker的平均词汇量: 就近50万的受访者的统计显示,50%的人在8岁时会有10,000的词汇量,而在15岁时这个数字会增长到20,000,而这个数字大约会在成年后到达30,000并基本保持一个平稳的状态。作为对比,我国的CET4级考试词汇量大约为4,000,基本相当于4岁的native,而雅思则需要近8,000的词汇量,约相当于7岁的native的平均水平。 不过好消息是,如果你愿意花一些时间来攻克7,000-8,000高频词汇的话,你就可以读懂大约80%-90%的普通材料(大部分新闻,公告,大部分技术书籍,一些简单的儿童读物等),而且你又可以通过这些材料进一步将自己的词汇量扩充到更高。 英语的另一个有趣的(可恨的)特点是可以通过非常简单的基础词汇+介词形成丰富的短语,如果可以把这些短语正确的应用,你甚至无需花费太多时间来学习更高级的词汇即可应对日常生活学习工作中的各种场景。把这一点用到极致的应该是词汇量相当于8岁儿童平均水平的懂王特朗普了,不过话又说回来了,这可能也是一项非凡的技能,比如可以和动词stand搭配形成短语并具备独立含义的结构就是十多个。 一个微小的例子 为了更好的说明上面的问题,这里有一个小例子。下面这段话是The Economist(经济学人)里的某篇最新文章中的两段。如果你的词汇量在8,000以下,可能读起来会比较吃力。如果有12,000,则读起来不会有太大障碍。而要像读中文那样顺畅的读懂大部分The Economist中的文章,则需要20,000以上的词汇量。 Many a regime has been toppled by a plague, but so far covid-19 is having the opposite effect. Most leaders have seen their approval ratings rise, even as the disease has killed at least 250,000 people. Morning Consult, a pollster, has found that a group of ten politicians have enjoyed an average gain of nine percentage points since the World Health Organisation declared a pandemic on March 11th....

May 13, 2020 3 min