| 扬声器 |
抄本 |
| 韦恩·莱文 |
欢迎参加我们的会议,讨论扩展 Hamcrest 对 JSL 应用程序的自动化测试以实现持续改进。 |
| |
我们在这里向你展示的,我们对你的承诺是,我们将向你展示如何建立一个高效的、具有成本效益的 |
| |
高质量保证、高可靠性和可支持性,基于 JMP 的关键任务集成分析系统。是的,说起来很多,但 |
| |
这就是我们在这种环境下所做的。我们对此非常满意。我们非常荣幸能够与大家分享。 |
| |
以下是我们接下来的议程。我稍后会做个自我介绍,以及关于Predictum的一些信息,因为你们可能对我们不太了解。 |
| |
我们的背景、JSL 开发的背景、基础设施以及与之相关的一些历史。 |
| |
接下来,我们将与大家分享我们实施的变革成果。之后,我们将进行演示,并讨论下一步的计划。最后,我们将开放讨论环节,解答大家的任何问题。 |
| |
我是 Wayne Levin,右边那位就是我。我是 Predictum 的总裁,我加入了 |
| |
我是 Vince Faller。Vince 是我们的首席软件工程师,他一直领导着这项非常重要的计划。所以,简单介绍一下我们。我们是 JMP 的合作伙伴。 |
| |
我们于 1992 年成立,到现在已经 29 年了。 |
| |
我们进行统计方法等方面的培训,使用 JMP,在这些领域提供咨询,我们花费大量时间构建和 |
| |
部署集成分析应用程序和系统,因此这项工作对我们非常重要。我们首先交付了 JMP 应用程序, |
| |
JMP 4.0 是在 2000 年推出的,是的,确实已经 20 多年了,我们一直在构建更大的系统。当然,从那时起,它就只是一些小型工具,但我记得,大约在 JMP 8 或 9 的时候,我们就开始构建更大的系统了。 |
| |
我们在这方面积累了相当多的经验,轻轻松松就超过10年了。简单介绍一下背景……直到2019年下半年左右,我们的开发环境都非常分散,零散。 |
| |
项目管理 |
| |
确实存在,但一切都被打乱了。我们用不同的应用程序来控制版本、管理时间,比如开发时间等等,以及一般的项目管理。 |
| |
开发商很容易花钱,我们会讨论这个问题, |
| |
他们大约一半的时间只是做一些例行的机械工作,比如加密和打包 JMP 插件。你知道,维护配置包,以及 |
| |
你知道,还要把代码库,或者我们通常说的 repo,分开存放加密和未加密的脚本。这……我们需要考虑的事情很多,其实都不是开发工作。真正的工作是…… |
| |
开发人员的才能……被浪费了。就像我说的,我们已经做了很长时间了,即使在2019年,也足足有10年了。所以,10多年的遗留框架,甚至可以追溯到JMP 5,你知道,它变得臃肿而缓慢。 |
| |
我们知道 JMP 多年来取得了长足的进步。我的意思是,在 JMP 9 中,我们引入了命名空间,而 JMP 14 引入了类,Hamcrest 正是在那时 |
| |
开始了。正是 Hamcrest 真正让我们得以开展这项重大计划。所以我们早在 2019 年 8 月就启动了这项重大计划。 |
| |
就在那时,我们获得了第一个 Gitlab 许可证,这就是我们新开发架构的开发,它开始成形,并且一直在不断改进。 |
| |
基本上每个月我们都在不断增加和增强我们的能力,以便在前进的过程中变得越来越有生产力。 |
| |
这种情况还在持续,所以我们实际上认为这是一种精益式的努力。它确实遵循了精益原则,并且加速了我们的发展。 |
| |
多亏了这个系统,我们实现了自动化测试,Vince 会给我们演示一下。我们这里有一个小模型,尽早测试,经常测试。 |
| |
这就是我们所做的。它支持代码复用,而且我们重新开发了 Predictum 系统框架。它现在是 2.0 版本。我们从之前的努力中学到了很多。所有那些,几乎所有的,都消失了,都被替换和扩展了。 |
| |
Vince 会跟我们详细介绍。我们的生产力轻而易举地提高了 50% 以上,而且我想说的是,开发人员们也开心多了,他们的挫败感也减轻了。 |
| |
他们更加专注于自己的工作,我的意思是开发人员应该做的真正工作,而不是那些繁琐的事情。 |
| |
我要说的是,仍有改进的空间,所以我们还没有完成,文斯会告诉我们更多相关信息。 |
| |
我们现在有了开发标准,所以我们有功能样式指南,而且可以说我们所有的开发都是基于功能的。 |
| |
每个功能至少需要一次 Hamcrest 测试,并且开发人员会互相分享代码审查 |
| |
确保我们遵守自己的标准。这也引发了如何提升这些标准、使其更加完善的问题。 |
| |
我们还会举办一些有趣的会议,鼓励开发人员破解代码, |
| |
对,所以它们被称为“破解代码挑战”,或者诸如此类。所以这已经成为我们运作方式的一部分,而且完全符合我们的开发环境。例如,它会导致进一步的测试,以及需要添加的更多 Hamcrest 测试。我们有一个相当小的项目。 |
| |
这是我们一年多前做的。我们即将进入一个新的阶段。一切都已经结束了…… |
| |
它内置了超过 100 个 Hamcrest 测试,并且在整个开发过程中反复运行。 |
| |
其他好处是,它允许我们分配和跟踪资源分配,比如哪些开发人员在做什么。每个人都知道其他人在做什么。 |
| |
持续集成、持续部署等) |
| |
代码冲突会被提前检测到,所以如果我们……我们确实有这种情况,因为我们有多个人在同一个项目上工作,所以,你知道,如果有人修改了某个函数,而它又会和其他人正在做的事情发生冲突,我们就能更快地发现。 |
| |
它还使我们能够提高跨团队的支持能力。我们不能让代码依赖于某个特定的开发人员;我们必须让任何开发人员或支持人员都能支持我们的代码。 |
| |
向前迈进。这也是我们的一个重要目标。它确实推动了整个质量保证领域的进步, |
| |
包括支持FDA关于质量保证(QA)的要求,比如验证、IQ OQ PQ。所以……我们正在实现自动化或半自动化 |
| |
这些任务也通过这个基础设施来完成。我们确实在内部和外部使用它,所以你可能知道,我们有 |
| |
有一些产品在那里,(???)科比腰带实验室,但新的垃圾邮件以及科比发送垃圾邮件(???)也在其他地方讨论 |
| |
在 2021 年的 JMP Discovery 欧洲会议上。你可能想去看看,但它们相当大 |
| |
代码库,它们都是开发出来的,换句话说,我们吃自己的狗粮,如果你知道这个表达,但我们也把它用在我们所有的客户身上 |
| |
开发,这对我们的客户来说很重要,因为我们正在构建他们将要依赖的应用程序。 |
| |
因此,我们需要......我们需要拥有可靠的基础设施,无论如何,这是其中很重要的一部分。 |
| |
我提到了 Predictum 系统框架。你可以在这里看到它的一些片段。它就在脚本索引里,你知道,我们看到了参数和 |
| |
示例等等。我们内置了所有这些功能,其中 95%(超过 95%)都与 Hamcrest 测试相关。当然,我们的目标是确保所有测试都与 Hamcrest 测试相关,而且我们正在努力实现这个目标。 |
| |
我们快到了。有……这些框架……这个框架实际上是我们基础设施的一部分。这是其中很重要的一个元素。另一个就是……Hamcrest…… |
| |
进行单元测试的能力。最后还有一张幻灯片,里面有一个社区链接,你可以在那里了解更多关于 Hamcrest 的信息。这是一个 |
| |
正如我几分钟前提到的,JMP 14 为我们带来了开发。Gitlab 在其中发挥了重要作用;它为我们提供了项目管理存储库、CI/CD 流程等。 |
| |
此外,我们为 JSL 开发了一个可视化的……Visual Studio Code 扩展,我们……你会看到它有五颗星,因为它在 |
| |
在 Visual Studio 上。我不知道我们怎么称呼它。Vince,也许你可以告诉我们,商店里有什么。它已经被下载了数百次,而且我们 |
| |
定期更新。所以你也可以去看看。我想我们在最后的资源幻灯片里也有一个链接。 |
| |
所以我现在要把这个任务交给文斯·法勒。文斯,我们首席软件工程师。正如我所说,文斯从2019年8月开始领导这个项目。这需要大量的努力, |
| |
艰苦的工作还在继续。我们公司所有人都非常感谢文斯和他的领导。所以,文斯,你为什么不接手呢?我要…… |
| |
我是... |
| 文斯·法勒 |
分享。 |
| |
所以 Wayne 多次提到了 Hamcrest。对于那些不知道 Hamcrest 是什么的人来说,它是由 |
| |
跳转。 |
| |
Justin Chilton 和 Evan McCorkle 负责这个项目。它只是一个单元测试库,可以让你以自动化的方式运行、测试并获得结果。 |
| |
它确实使我们能够做到这一点,这就是为什么它被称为扩展。 |
| |
我将展示一些东西 |
| |
用我的屏幕。我几乎只在我们自己开发的 VSCode 扩展上工作。这就是 VSCode。 |
| |
我们这样做是因为它具有许多内置功能或可扩展功能,我们不必编写,例如获取集成、获取实验室集成。 |
| |
在这里您可以看到这是一个 JSL 脚本,它可以很好地读取它。 |
| |
如果你想使用它,如果你……如果你熟悉 VSCode,它只是一个轻量级的文本编辑器。你只需输入 JMP |
| |
你会看到它。它是唯一的。 |
| |
但我们会继续做我们正在做的事情。 |
| |
所以。 |
| |
对于我们所做的任何代码更改, |
| |
有一个管道运行。 |
| |
我们只是演示一下它的功能。如果我把 README 文件改成这样,这就是 Discovery 的演示。 |
| |
2021年。 |
| |
我就直接提交了。如果你不知道,提交如下 |
| |
说我想要一个我们当前所在位置的快照,然后将其推送到 repo 并将其保存在服务器上。 |
| |
快乐的一天。 |
| |
提交信息。更多 readme 信息。 |
| |
我可以直接推送,因为 VSCode 太棒了。 |
| |
管道演示。 |
| |
现在我已经推送了。接下来会有一个流水线运行。我可以直接点击这里,它就会显示我的合并请求。现在 |
| |
管道开始运行。 |
| |
我可以检查管道的状态。 |
| |
它现在正在做的是检查是否包含所需的 Hamcrest 文件。我们有一些要求 |
| |
我们强制执行,以便它可以...... |
| |
我们可以确保我们 |
| |
做好我们的工作。 |
| |
然后就完成了。我要按“加密”。 |
| |
现在加密将获取整个包并对其进行加密。 |
| |
如果我们过去这里, |
| |
这只是一个虚拟机。它应该 |
| |
开始运行 |
| |
一秒钟。 |
| |
所以它只是检查所有的代码。 |
| |
写下所有加密的密码,浏览,点击所有这些操作。如果你曾经尝试过同时加密多个脚本, |
| |
您可能知道这很麻烦,所以我们将其自动化,这样我们就不必再这样做了,因为正如韦恩所说,这花费了我们很多时间来做这些事情。 |
| |
比如,如果我们每次要发布任何版本时都要检查 100 个脚本并对每个脚本进行加密,那就太糟糕了。 |
| |
因为我们必须有自己的 |
| |
代码已加密,因为,是的,抱歉,意见,好吧,我可以停止分享它了。 |
| |
啊。 |
| |
所以它将会运行。 |
| |
它应该很快就会完成。 |
| |
然后它会经过并进行分阶段,然后分阶段基本上会获取我们想要的所有信息来源,就像我们的文档一样,就像 |
| |
我们编写的任何其他内容,并将它们呈现为我们在插件中想要的形式,因为与 github、gitlab 的其他部分一样,我们的大多数文档都是用 markdown 编写的,然后我们将其呈现为任何形式。 |
| |
我不需要展示剩下的部分,但是是的。所以它正在过去。它会消失。 |
| |
我们将回到 VSCode。 |
| |
所以。 |
| |
如果我们要改变的话,那么这只是一个单一的功能。 |
| |
如果我进去,如果我要运行这个...... |
| |
JSL,运行当前选择。 |
| |
所以。 |
| |
你可以看到它返回了……它所做的就是打开 Big Class,运行拟合线,然后得到方程。它正在返回方程。 |
| |
而且你实际上也可以看到它跑到这里。 |
| |
但。 |
| |
因此这可以使用更多的文档。 |
| |
我们想,哦,我们实际上不想打开这个数据表。 |
| |
但让我们快速运行一下。 |
| |
并说, |
| |
不。这不是一个好的回报,它显然把等式全部变成了大写。 |
| |
所以如果我上演那件事。 |
| |
更好的文档。 |
| |
推。 |
| |
再次回到这里。 |
| |
所以,它又在推动。这是另一条管道。 |
| |
它只是按顺序运行一堆电源外壳脚本,具体取决于我们的设置方式。 |
| |
但你会注意到这个管道有更多的阶段。 |
| |
所以当我们 |
| |
为了帮助扩大规模,我们只测试 JSL |
| |
一开始是最低限度的,然后,当它通过时,我们允许进一步测试。 |
| |
而且我们只测试了是否有已更改的 JSL 文件。 |
| |
但我们可以度过这一关。 |
| |
它会运行,并告诉我们测试进行到什么阶段,以防测试卡住。你知道,如果一个模态对话框一直关闭不掉,JMP 显然不会继续执行任何操作。但你看,它确实做了不少事,太棒了。我完成了。 |
| |
令人兴奋。 |
| |
刷新一下。得到一个绿色的小勾号。 |
| |
好了,我们现在就可以运行所有东西了。它会检查、测试所有内容,然后加密,再测试加密后的内容,也就是我们要制作插件的实际内容,然后再次进行分阶段,打包,创建出我们真正要提供给客户的插件。 |
| |
我不会很快完成这件事,因为这需要一分钟。 |
| |
但 |
| |
假设我们走进这里,然后我们会想,哦, |
| |
好吧,我真的很想关闭这个数据表。我不知道我一开始为什么要注释掉它。我觉得它不应该打开,因为我不再使用它了,我们不……我们不想要那样。 |
| |
我们会说好的。 |
| |
关闭 dt。 |
| |
再次按下。现在,这一切都可以在我的电脑上用 Hamcrest 手动完成。 |
| |
但你知道,有时候开发人员会推送一些内容,而不是在电脑上运行 Hamcrest 的所有功能,而这……它的目的就是为了抓住这个问题。这迫使我们更好地完成工作。 |
| |
和 |
| |
是的。 |
| |
继续点击这个按钮。我本来可以直接打开它,但没问题。 |
| |
现在你会看到它再次运行管道。转到管道。 |
| |
我会一直重复这句话。我们只是在进行测试、加密,然后再测试 |
| |
因为有时加密会进入其自身的 |
| |
如果有人曾经加密过的话,那么这个世界就会充满问题。 |
| |
跑,跑,跑,跑,跑。 |
| |
然后,哦,我们投了一个球。你看呢? |
| |
我并不是想面无表情,但是你知道。 |
| |
所以如果我们把它标记为准备好了,说,是的,我们完成了,我们会看到, |
| |
哦,好吧,那次测试没有通过。 |
| |
现在 |
| |
我们可以下载 |
| |
为什么测试没有通过工件。 |
| |
这将打开一个 J 单元 |
| |
我将在这里取出这个文件。 |
| |
它还会在 getlab 中呈现它,这可能更容易,但现在我们只需这样做。 |
| |
最终,尽量减少一切。 |
| |
现在来吧。 |
| |
因此,我们可以看到 R 平方出现了一些问题并且失败了。 |
| |
里面 |
| |
蓝色的。 |
| |
所以我们可以来这里。 |
| |
说说看,为什么其中有什么东西会导致这个失败? |
| |
我们看到,哦,有人把我们的方程式称为 |
| |
然后他们就假设数据表就在那里了。因为我改动了一些东西,就破坏了别人的代码,好像这种事永远不会发生似的。 |
| |
所以我们遇到了这个问题。 |
| |
你去哪儿了?我们走吧。 |
| |
所以我们在这里所做的一切的主要目的就是能够发现我改变了一些东西并且破坏了别人的东西的事实。 |
| |
这样我就可以通过了。 |
| |
看看 boo 做了什么。 |
| |
好吧,也许我应该开设“大班”课程 |
| |
我。 |
| |
很酷。如果我保存了它, |
| |
我应该让它变得更好。 |
| |
自己开大课。 |
| |
我会表演这个。 |
| |
开大课,获得推力。 |
| |
再次强调, |
| |
旧管道。 |
| |
现在应该采取 |
| |
不...不太久。 |
| |
所以我们要进去。我们……我们只测试一个……到…… |
| |
JMP 版本,但你可以看到 |
| |
自动地,我们只测试一个。 |
| |
然后等待开发人员说“好了,我完成了,一切看起来都很好。继续”。我们这样做是出于资源方面的考虑, |
| |
因为这些都在虚拟机上运行,而虚拟机一直在自动运行,而且我们有多个开发人员都在使用这些系统。 |
| |
我们也... |
| |
你可以看到,这实际上是一个 docker 系统,我们正在将它们容器化。 |
| |
嗯,我们正在进行这些项目的容器化。它们已经可以运行了,但还没有完成所有版本。 |
| |
但我们运行的是 14.3,至少对于这个项目,我们运行的是 14.3、15、15.1, |
| |
这应该可行。 |
| |
让我们把事情恢复原状吧。 |
| |
因为你知道那是有效的。 |
| |
可能应该做一部经典之作......但很好。 |
| |
是的。 |
| |
我们要进行测试。 |
| |
我感觉我已经说了一遍又一遍了。我们要测试一切。 |
| |
我们实际上会让这个运行,以向您展示我们得到的最终结果。 |
| |
它应该只需要。 |
| |
有一点点。 |
| |
所以我们会测试一下,确保它运行正常,然后你就能查看日志了。我们从正在发生的事情、它的位置等信息中获得了有用的信息,比如它会告诉你哪个跑步者正在跑步。 |
| |
我现在只在 Windows 上运行。再说一次,这只是一个演示,但 |
| |
我们应该能够运行 |
| |
更多的。 |
| |
在运行时,我将再讨论一下 VSCode。 |
| |
在 VSCode 中,我们还有代码片段和其他东西,所以如果你想创建一个函数, |
| |
它将创建所有函数信息。我们使用自然文档 |
| |
再次,这是从 Hamcrest 团队偷来的, |
| |
作为我们的 |
| |
开发文档。 |
| |
所以它会把所有东西都放到自然文档格式里。所以,它的目的就是帮助我们完成工作,并迫使我们完成工作。 |
| |
稍微好一点,更有活力一点。 |
| 韦恩·莱文 |
为了文档? |
| 文斯·法勒 |
是的,这就是文档。 |
| 韦恩·莱文 |
我们在开发的同时,也在记录。 |
| 文斯·法勒 |
是的,绝对如此。 |
| |
你知道,它还有 for 循环、while 循环。 |
| |
对于与关联行类似的事情。 |
| |
我们……这……这完成了吗?应该完成了,是的。 |
| |
所以我们得到了绿色的勾号。现在它可以在所有系统上运行了。 |
| |
如果我们能回到这里,你就会看到它。 |
| |
打开 JMP。它会运行一些测试, |
| |
可能会开大课。 |
| |
然后关闭全部...全部关闭。 |
| 韦恩·莱文 |
我们这样做,主要是因为 |
| |
我们的许多客户都部署了不同版本的 JMP,他们想要一个特定的插件,但他们 |
| |
运行它时,你知道,他们只是在实际应用中拥有不同的版本。我们还会针对 JMP 的早期采用者版本进行测试,这对我们来说是一项服务,因为我们会报告错误。 |
| |
对客户来说,这也很有帮助,因为他们知道他们可以……他们可以升级到新版 JMP。他们知道我们为他们构建的应用程序已经过测试。 |
| |
这对我们来说只是例行公事。 |
| |
好的。 |
| 文斯·法勒 |
你完了。你完了。你完了。 |
| |
更改为... |
| |
我可以谈谈... |
| |
这只是运行,我们可以 |
| |
如果你愿意的话,这部电影很有魔力,梅格。 |
| |
只是为了让它运行得更快。 |
| |
基本上,我只是想进入准备阶段,但这需要一点时间。 |
| |
韦恩,关于此事你还有什么要说的吗? |
| |
凉爽的。 |
| |
我会把那个... |
| |
我可以说的是, |
| |
当我们在舞台上表演时, |
| |
我们的文档也保存在 mk docs 中。因此,它实际上会运行 mk doc 的版本,进行渲染,并将帮助信息放入帮助文件中,基本上就能为我们创建一个版本,这样我们就不用 |
| |
处理它。 |
| |
因为创建版本需要付出很多努力。 |
| |
正在加密。快完成了。 |
| |
可能应该只预先加载一个。 |
| |
现场演示,你要做什么。 |
| |
一些。 |
| |
跑步。 |
| |
哦,有一件事我肯定想做。 |
| |
所以,管道实际上做的最后一件事是检查我们是否真的花了时间,因为,你知道,如果 |
| |
我们实际上并没有记录我们花费的时间,我们也没有得到报酬,所以迫使我们这样做。 |
| |
太棒了,太开心了。 |
| 温斯瀑布 |
所以 |
| 文斯·法勒 |
如果没有这一点,这项工作就会失败。 |
| |
我可以展示一些工作。正在尝试。 |
| |
那是 Docker 版本。我们不想要那个。 |
| |
所以 |
| |
您可以看到这为我们带来了成功。 |
| |
没有失误。没有意外投掷。这些都是 Hamcrest 的功劳。 |
| |
来吧,再来一个。 |
| |
好的,开始准备。 |
| |
它所做的一件事就是创建存储库。 |
| |
每次都能创造出新鲜的事物。 |
| |
所以它试图保持一种无国籍状态 |
| |
好的,我们现在可以下载工件了。 |
| |
现在我们应该有这个管道演示。 |
| |
我真希望它能去那里。 |
| |
什么。 |
| |
Internet Explorer 为何处于运行状态?现在您将看到管道演示 |
| |
是 JMP 插件。 |
| |
如果我们解压缩它。 |
| |
如果您不知道,JMP 插件只是一个 zip 文件。 |
| |
如果我们现在来看, |
| |
你可以看到它里面有我们所有的脚本,包括 foo 和 bar。如果我们打开它们, |
| |
打开, |
| |
您可以看到这是一个加密文件。 |
| |
所以这基本上就是我们能给顾客提供的 |
| |
并且不需要做那么多机械工作。韦恩提到 |
| |
它减少了开发人员的沮丧,我个人认为这是一种轻描淡写的说法,因为在我们实施这个措施之前,一遍又一遍地做这件事是非常令人沮丧的,而这个措施帮助了很多。 |
| |
那。 |
| 韦恩·莱文 |
现在,关于加密,当你交付一个插件时 |
| |
供公司内部用户使用,出于安全原因等,你通常不希望任何人能够进入和 |
| |
处理代码。你知道,诸如此类的事情,我们可能会提供未加密的代码,这样客户端的代码就加密了,但为了交付给最终用户,你通常希望所有内容都加密,这样就无法被篡改。就是这样。 |
| 文斯·法勒 |
是的,我的演示到此结束。Wayne,如果你想把它带回去做总结的话。 |
| 韦恩·莱文 |
是的,太棒了。 |
| |
当然,非常感谢,文斯。整个系统有很多活动部件,所以,你知道,基本上,我们要确保, |
| |
你知道,代码是由多个用户开发的,彼此之间不会发生冲突。我们同时在构建文档。实际上,文档会随应用程序一起部署,我们不需要将其整合进去。这…… |
| |
我们设置了基础设施,以便它能够自动维护。我们可以同时全面更新它和代码。 |
| |
如果你愿意的话。正在进行的 Hamcrest 测试,每个编写的函数, |
| |
如果你愿意这么说的话,它们都是预期结果。所以它们会被比较,所以我们简单地发现,我猜那个方程式有点问题。R平方或其他什么都得出了不同的值, |
| |
所以它坏了,换句话说,就是说嘿,这里有些不对劲;我期待函数的输出是这样的 |
| |
用例。这是我们从客户那里得到的反馈之一,我们建立了一个用例池,并将其转化为 Hamcrest 测试,然后就可以开始使用了。这里还有一些其他的幻灯片 |
| |
你可以在下载幻灯片的时候看到。我会把它留给你,这里有一张流程图。 |
| |
我们正在实施的,以及一些关于开发人员代码审查活动的内容。如果你想反复讨论一下。Vince,你想在这里补充一些关于代码审查和批准如何进行的内容吗? |
| 文斯·法勒 |
是的,所以在合并请求中 |
| |
它会在代码的 diff 部分显示 JSL 代码。同样,一个大 |
| |
感谢 |
| |
还有那些做 Hamcrest 的人,因为他们还为 GitHub 和 GitLab 启动了一个词法分析器(?)以便能够读取 JSL,所以实际上这是在 getlab 内部。 |
| |
他们也能读懂 JSL。虽然它不能执行,但格式很好。它不是全白的,而且很漂亮。我们直接进去就可以了。 |
| |
就像这张截图里那样,点击一行,输入你想要的注释,它就变成了一个可审核的任务。所以我们尽量在 GitLab 内部完成尽可能多的工作。 |
| |
出于透明度的原因,以及 |
| |
一旦所有事情都完成了,你就可以说“是的,我的合并请求已经准备好了”。让我们把它放到 master 分支,也就是主分支上。 |
| 韦恩·莱文 |
太棒了。所以你真的……这很有帮助,你知道,我们真的在定义编码标准,如果你愿意的话,而且 |
| |
我不喜欢“强制执行”这个词,但它的作用就是这样。它减少了差异。如果你愿意的话,它可以让多个开发人员更容易理解 |
| |
其他人做了什么。当我们引入新的开发人员时,他们会逐渐理解标准,知道要寻找什么,知道该做什么。 |
| |
所以它...它使入职变得容易得多,而且它再次处理...这里的一切都与一切相关,所以你知道可支持性等等。 |
| |
这是我之前提到的幻灯片,只是为了提供一些资源,所以我们使用的是 GitLab。我想同样的原则也适用于任何 Git,比如 GitHub 或其他类似的平台。这是 Hamcrest 的社区链接。之前有一场演讲在 |
| |
那是2019年在图森,我们以前经常一起旅行聚会。那段时光非常有趣。这是视觉效果的市场链接……Visual Code Studio。 |
| |
Visual Studio 代码,你有什么。 |
| |
正如 Vince 所说,是的,我们经常使用这个编辑器,而不是仅仅因为内置的 JMP 编辑器功能集成就使用它。它…… |
| |
它只是一个大型应用程序开发环境的一部分。Vince 和我,我谨代表 Vince 和我自己,感谢大家对此的关注,并再次由衷感谢 JMP 团队。Justin Chilton 和他的公司, |
| |
我会向你喊话。如果不是Hamcrest,我们就不会在这里。 |
| |
缺失的部分,或者说是真正让我们能够将 JSL 开发推向成功的部分, |
| |
基本上,就是你在代码开发中,或者说在行业中普遍期望的标准。所以我们真的非常感激,而且我知道我们的…… |
| |
你知道,这会随着我们部署的每个应用程序而传播出去。现在,文斯和我很乐意回答任何问题…… |
| |
发送邮件至 info@predictum.com,我们会转发给您,之后会回复。目前,我们开放问答环节。 |