面向大众编程

即使了解编程的基础知识,也可以简化人类活动。除了明显的事情,例如抽象思维的发展或将任务划分为较小部分的能力之外,我还建议走得更远,并使用基本的发展方法。我以创建经典逻辑游戏,在视觉编程和传统编程之间进行类比的示例为例,展示了开发技能如何帮助解决应用问题。那些希望就该主题进行辩论或玩“牛与牛”并赢得奖品的人-猫叫声。



我叫Zhenya,我是ManyChat的后端开发人员。不久前,人力资源团队向我提出要求,以我们的产品为基础,实施儿童期许多人熟悉的“牛与牛”游戏。让我补充一点背景。ManyChat是一种用于自动实现企业与客户之间互动的工具,可让您通过Facebook以及最近的SMS和Email回答常见问题。“牛与牛”是一个逻辑游戏,在此过程中,必须进行几次尝试才能猜测出猜中的数字。许多人都可以从“辐射”游戏中了解到这一点,在该游戏中您需要破解计算机终端。有关规则的更多详细信息,请参见本文末尾。

可视化


在编写复杂任务的代码之前我们要做什么?我们用记号笔去黑板上或拿起铅笔和纸来画框图或UML图,因为可视化是人们展示和感知信息的最自然的方式。Flow Builder是我们系统的心脏,它基于各种对象,图形元素以及它们彼此交互的规则。我想说这是面向对象编程的逻辑延续。因此,我放弃了通常的工具,立即着手设计机器人与播放器之间的通信逻辑。

公牛和牛游戏的流程

这非常方便,因为UML图和Flow Builder几乎相同。在这一步,设计和编程已经结合在一起。对于几次迭代,我抛出了流程并指定了与用户和API交互的位置。获得的结果与我脑海中的原始表示有些不同-可视化提供了从不同角度看待任务的机会。这很好,因为对图的更改比对代码的更改更容易,更便宜。在我看来,这种方法的含义根植于谚语“七次,一刀切”。工程师应该特别熟悉并且可以理解。

责任分工


在ManyChat方面应实现什么,在代码方面应实现什么?起初,这个问题的答案对我而言似乎并不明显。我们平台上有两种交互工具:动态阻止和外部请求。它们几乎相同,除了前者执行对远程服务器的请求并移至下一条指令,而后者则允许您首先将响应数据与bot变量进行比较。在第一个版本中,我使用了动态块,并实现了将积分方法从API方法直接发送到Facebook。看来这种方法没有错。但是,如果您再往前看,并假设播放器想要使用SMS进行播放,则代码将必须找出特定播放器的通信通道。似乎没有必要。在下一个版本中,我将流程切换为使用外部请求,向用户变量添加了响应记录,并从代码中删除了对渠道的任何提及。现在,游戏代码可以在另一个应用程序中使用,并实现任何所需的交互界面:从控制台到移动应用程序。是根据MVC模式将视图从控制逻辑中分离出来,还是根据DDD方法突出显示有限的上下文-自行决定。这里的主要问题是,尽管缺乏需求,但在潜意识层面上,我发现了系统中潜在的瓶颈,将来可能会产生问题。是根据MVC模式将视图从控制逻辑中分离出来,还是根据DDD方法突出显示有限的上下文-自行决定。这里的主要问题是,尽管缺乏需求,但在潜意识层面上,我发现了系统中潜在的瓶颈,将来可能会产生问题。是根据MVC模式将视图与控制逻辑分开,还是根据DDD方法突出显示有限的上下文-自己决定。这里的主要问题是,尽管缺乏需求,但在潜意识层面上,我发现了系统中潜在的瓶颈,将来可能会产生问题。

变量命名


变量命名是两个主要的编程问题之一。除了变量之外,块命名也同样重要。许多用户对此并不重视,因为流程变成了一组复制1,复制2等,所以没有时间四处看看。这极大地增加了理解。一切都像是糟糕的课堂-不进去就不可能弄清楚他在做什么。我的同事更详细地说明了这种想法。如果您有兴趣,建议您阅读他的文章

史蒂夫·麦康奈尔(Steve McConnell)在他的《 Perfect Code》(完美代码)一书中写道,该名称应完整而准确地描述所表示的实体。我认为很难对此争论。例如,对于布尔变量,我更喜欢使用is前缀。在这种情况下,读者已经可以通过前两个字母了解他正在处理的内容。至于长度,最好不要超过20个字符(Gorla,Benander和Benander,1990)。变量的范围越小,其名称就越短。但是,由于ManyChat中的所有变量都具有全局作用域,因此值得使用命名空间。对于“公牛和母牛”,我使用了从“公牛和母牛”派生的两个不列颠哥伦比亚大写字母形式的开始部分。鉴于以上所述,我得到了变量名称BC Is Victory -我认为非常独特和全面。

干,吻


游戏运行正常,似乎可以使您充满成就感。但是我们知道下一步是自我检查和重构。通过更详细的分析,您可以了解停用词处理和胜利如何导致类似的障碍-玩家要求采取一些行动。同时,由于某种未知的原因,这种损失仍然过着自己的生活。将这些地方组合成一个地方似乎是避免重复的逻辑步骤,这反过来又可以提高行为的一致性,并易于维护。现在,如果需要更改,则需要在系统的唯一单元中进行更改,而无需进行其他更改,这表明成功应用了“不重复自己的原则


DRY流动

但是,不要停在那里。复杂的解决方案难以维护。当发生错误时,将其定位是不容易的,尤其是当您脱离上下文时。一个新人会花很多精力去弄清楚什么。并且您将必须熟悉每个节点,以免错过任何重要的事情。因此,值得使用保持简单,愚蠢并将所有可能的动作散布到单独位置的原则。分解后,我得到了5个相当容易理解的流程。令人高兴的是,这种重构满足了单一责任原理。每个流程都有一个责任,并且此责任已完全封装在其中。吸引力在于黑匣子,并且由于问题的性质,它可以更快地本地化。


符合KISS的流程

雅尼


在自动化的第一个版本中,在发送废弃游戏的提醒和获胜者接收礼物的指示方面取得了成就。第一个想法的实施由于Facebook方面的限制而变得复杂-最近,在24小时之内在窗口外发送消息的条件变得更加困难。事实证明,第二个代码对于实现该代码而言是微不足道的。这两个问题都得到解决,但是一次性运动的需求并不能证明需要付出多少努力。此外,冲刺任务紧随其后,因此决定不实施此功能。救援来了,您将不需要它目的是避免过多的功能。这是正常情况,条件会变坏,产品中会出现更多不必要的零件。删除相应的块有助于理解流程的目的,并再次提醒及时拒绝添加新功能的重要性,这不是直接需要的。

经验丰富的开发人员知道,从代码重构到更新文档以及使用用户反馈,任何功能都需要不断的支持。因此,应该始终以怀疑的态度考虑添加新功能,问这个问题,真的有必要吗?最终,在此阶段,您可以节省很多资源。

让我们玩


通过了自我检查和重构的阶段,没有不必要的功能,并且所有流程的含义对于理解都是透明的。这意味着游戏已经准备就绪,是时候竞争奖金了。根据比赛条款,在2020年5月22日之前获得最高分的前10名球员将获得ManyChat团队的奖励。

关于规则的一点。在我们的实现中,该游戏是为一个人设计的。该漫游器会使用非重复数字组成一个4位数字的序列。玩家尝试猜测数字。该机器人会根据所猜测的数量与位置的不一致(即母牛的数量)以及到该位置之前的猜测的数量(即公牛的数量)做出报告。结果,游戏场景可能如下所示:

猜到了数字1234.
参与者做出第一个假设:4321
得到答案:0头公牛和4头母牛。
参与者做出第二个假设:1678
并得到答案:1头公牛和0头母牛。

要尝试,请按照链接并按照提示进行操作。让我提醒您,游戏通过Facebook Messenger进行。我们提供2个难度级别:有限次数和无限次数的游戏。在一个困难的比赛中获胜将为您带来3点,在一个简单的比赛中将获得2分。无论水平如何,输掉都将获得1分。

该游戏是在标准技术堆栈上实现的:Nginx 1.17,PHP 7.4,PostgreSQL 12.1。如果愿意,可以将存储库克隆到服务器,在ManyChat页面上安装模板,并安排自己的锦标赛。

发现


“这个国家的每个人都需要学习如何在计算机上编程,因为它可以教您如何思考。”我认为,这一声明的意义早已超出了一个国家的范围。编程不是终端中的秘密字符,对于新手来说很难理解,并且程序员也不是当选的人。首先,它是一种思维方式和一套解决问题的技能。

关于文章的标题和原始口号,我想改写一下:“编程属于人民。它必须在广大工人群众的最深处扎根。这些群众必须理解这一点,并要受到他们的喜爱。”

我从没想过我会在一篇文章中引用史蒂夫·乔布斯和列宁。

我相信这里提出的想法不仅会浮现在我的脑海。有些人甚至会认为他们是队长。但是我自己知道,有时您需要多次听到相同的信息才能开始使用它。平庸的原则是简化事物,使它们看起来简单。每个程序员都知道,如果没有给予应有的注意,项目代码会迅速轻松地失控。但是有时您必须再次提醒自己。

一点都不亮。例如,本文没有讨论极端编程技术,例如结对编程,频繁的小发布和调度游戏。尽管灵活的方法与用于组织离线物理生产的系统有着共同的根源,但它们仍经常用于软件开发。尽管它们的潜力不仅限于该行业。

可能有些事情我从未想过。我们每个人都有自己的经验和愿景。因此,我敦促您在评论中分享您对此主题的想法。

All Articles