Perl大使:Curtis 'Ovid' Poe

本月的采访对象是Curtis ‘Ovid’ Poe,他是Perl社区中最受尊敬和知名的人物之一。
Curtis已经编写软件几十年了。他通过自己的全球开发和咨询公司,专注于通过全球开发和咨询公司构建数据库驱动的网站:All Around The World。他是Tau Station的主要开发者,这是一款设定在充满活力的未来宇宙中的基于文本的多人在线浏览器游戏(MMOBG)。
他是《Perl入门》和《Perl技巧》的作者。你可以在https://ovid.github.io/了解更多关于他的信息。
他在2009年加入了Perl基金会的董事会。
如果你希望我采访你,或者你知道你想让我采访的人,请告诉我。请用同一组问题,并发送你的答案给我!
你是如何开始使用Perl的?
我大约20年前开始使用Perl,当时我正在进行大型机编程。我试图修复一个COBOL程序的问题,该程序将NT系统中的CSV文件转换为COBOL偏好的固定宽度格式。COBOL有很多缺点,与文本打交道是其中之一。代码有150行长,但这是因为作者不了解COBOL的unstring函数是如何工作的。我将它缩减到80行COBOL。出于好奇,我尝试用Perl做,并将其缩减到10行代码。我在Perl中接触到的每一件事都更短、更容易阅读,所以我跳槽了。
你认为Perl 7怎么样?你认为Perl正在恢复的道路上吗?
我100%支持这个项目,是的,这是Perl恢复的道路。我看到了广泛的对于这一变革的支持,这令人鼓舞,而且随着媒体的关注,TIOBE甚至将Perl从第19位提升到第14位,尽管我怀疑在媒体关注度下降后,它将会再次下降。
然而,有一个目标和一个计划之间的区别。人们对于目标有广泛的共识,但对于计划则没有那么多的共识。只要人们能利用这一点找到最好的路径,那就很好。如果它演变成争吵,那就没那么好了。幸运的是,Sawyer一直擅长传达积极的信息。
只要我们设法保护目前使用Perl的企业(这意味着说服Linux发行版我们不会破坏它们),有一个计划来更好地支持活跃和新开发人员是极好的。版本号的变化是关键的第一步。
是什么启发了你开始“Cor”项目?你打算何时发布它?
首先,对于那些不了解Cor的人来说,你可以在https://github.com/Ovid/Cor/wiki上了解它。简而言之,Cor是一个计划为Perl核心添加现代面向对象(OO)功能。但口号是“‘足够好’还不够好。”我们必须停止满足于我们能拥有的,而要开始梦想我们想要的。以一个简单的例子来说,这是Cor中的简单LRU缓存实现
class Cache::LRU {
use Hash::Ordered;
has $max_size :new(optional) :reader :isa(PositiveInt) = 20;
has $created :reader = time;
has $cache :handles(get) :builder;
method _build_cache () { Hash::Ordered->new }
method set ( $key, $value ) {
if ( $cache->exists($key) ) {
$cache->delete($key);
}
elsif ( $cache->keys > $max_size ) {
$cache->shift;
}
$cache->set( $key, $value ); # new values in front
}
}
至于我的动机,像许多开发者一样,我一直在等待Stevan Little完成他的工作,以获得更好的Perl核心面向对象系统。但他主要是一个人工作,并且已经很长时间了,这是很难做到的。所以当我决定我要某些东西时,我能够看看他的工作,并意识到它是坚实的。但我需要更好的语法。
我尝试改进了一些来自Moo/se的语法,但老实说,Moo/se存在一些严重的限制。其中一些是设计决策,可以很容易地纠正,但有些是由于Perl语言本身的限制。一旦我得到了Sawyer的支持,我意识到我不仅需要窃取语法,我还可以发明语法,尽管我非常谨慎。让Cor仍然保持Perl的风格很重要,但在合适的地方添加一点语法糖就能产生巨大的差异。到目前为止,看起来很有希望。
Sawyer说他希望在7.2或7.4中,v1可以在功能保护下提供。到了Perl 8,功能保护将被移除。
您的公司“全球通用”是如何帮助人们使用Perl的?
咨询行业一团糟。任何人都可以自称顾问,然后瞬间就成了顾问。这意味着对于大多数咨询公司来说,质量非常不稳定。因此,大多数聘请顾问的公司都在进行一场巨大的赌博。但银行、保险公司和其他“企业”公司更喜欢与高端咨询公司合作。据我所知,他们的代码更有可能按照你的要求执行,但这仅限于你负担得起的情况。
因此,我们决定尝试不同的方法。如果我们做两件事,我们就能以更合理的价格为客户提供他们想要的可靠性。首先,我们只雇佣那些能够通过我们的技术测试和结构化面试的少数高级开发人员。其次,我们限制我们接受的项目数量,以便我们可以为每位客户投入认真的关注。任何一天,我都会把我们的团队质量与顶级咨询公司进行比较。但我们的成本将远低于他们,而且我们交付的速度也会更快。
举一个具体的例子,我们有一个客户,他们有两个星期的时间将性能提高一个数量级。他们之前曾与我们合作,所以转向我们。以下是那个项目的案例研究。这是一篇有趣的阅读材料,让你对顶级开发者真正的工作方式有了很多了解。
我还应该指出,尽管我们在Perl方面有很深的专长,但我们也在许多其他语言和技术方面做过工作,例如Golang、C++、Lua、Node、Angular等等。
“塔站”进展如何?Perl在构建游戏过程中发挥了多大作用?
对于那些不熟悉它的人来说,塔站是一个免费玩的故事MMORPG,后端完全用Perl编写。这是一个美丽的科幻宇宙(与任何你之前玩过的都不同),包含了距离地球20光年以内的所有恒星。我们有大约五十万行代码,我们仍在公开测试中。我们目前正在“最后冲刺”,以构建我们认为需要的东西,所以我们预计将在今年年底推出。Perl的巨大灵活性使得构建我们需要的许多功能变得非常容易。例如,我们有一个用于构建许多行为的声明性系统。以下是如何为太空船加油的示例
Steps(
Area( $character => is_in => 'docks' ),
Ship( $ship => is_owned_by => $character ),
Ship( $ship => is_docked_on => $character->station ),
Character( $character => not_onboard_ship => $ship ),
Ship( $ship => 'needs_refueling' ),
Money( $character => pay => $ship->get_refuel_price ),
Ship( $ship => 'refuel' ),
Character(
$character => set_cooldown => {
cooldown_type => 'ship_refuel',
period => $ship->get_refuel_time,
},
),
)
人们有时会对这个是Perl代码的事实感到惊讶,因为它的可读性很强,但他们会对在早期绑定语言(如Java)中编写这部分代码会更具挑战性的事实感到更加惊讶。
通过创建标准组件,如这些,为游戏创建新行为的开发者通常不需要担心数据库事务、异常或向角色的消息。相反,他们可以快速按正确的顺序组装这些“步骤”,从而产生新的游戏玩法。如果我们有时间,我们很乐意将上述框架作为开源发布,但这需要时间,我们首先需要让客户满意。
你一直在使用哪些Perl模块?它们如何使你的生活变得更简单?
Test::Class::Moose 是我经常使用的模块。大多数 Perl 开发者学习如何测试模块,而不是应用程序。使用 Test::Class::Moose,构建和管理大型测试套件变得更容易,而且当它编写得正确时,许多测试套件的运行速度可以快一个数量级。
我还编写了一个用于个人代码的模块,名为 Less::Boilerplate
。它不在 CPAN 上,因为它过于精细地针对我的个人需求,但它自然地启用了 strict、warnings、签名、autodie 和其他功能,而无需手动输入一切。我很高兴在代码顶部使用 use Less::Boilerplate
的双重含义。然而,这也是 Sawyer 指出的 Perl 的问题之一。新 Perl 开发者不知道经验丰富的 Perl 开发者在代码顶部使用的奇怪咒语,以使 Perl 变得合理。这伤害了这门语言,因为他们得到的“即装即用”体验很差。
你过度使用 Perl 的哪个特性?
过去,我会在代码中像魔法般撒上标点符号变量。对我来说,像 local $" = ', '
这样的事情很自然。但我不这么做了,因为说实话,它不可读。我做了很多客户工作,所以我会尽力确保我的代码(尽可能多)易于阅读和维护。我甚至重写了一些代码,使其“简单化”,因为我想要确保它易于维护。
你希望更多地使用 Perl 的哪个特性?
鉴于客户会打电话给我帮助他们构建新的系统或修复现有的系统,我基本上可以挑选我想使用的特性,所以在这方面我很幸运。因此,如果我认为它有用,我就没有什么不使用的。然而,我希望更多地使用的特性是尚不存在的特性:更多标准化的内省工具,类似于 MOP。在符号表中胡乱折腾我需要的东西,或者引入外部库来找出我的代码在文件系统中的位置,这是令人沮丧的。我经常编写一些无需加载即可“神奇地”工作的代码(类似于插件)。但没有标准化的、跨平台的工具来查找代码、动态加载代码、自动在包和文件名之间转换,我发现我经常为不同的客户重写相同的代码,基于他们的操作系统、文件系统布局等。
你希望改变 Perl 的哪个方面?
变量的行为。那里面有几点,但主要是,我希望 Perl 有像 Raku 一样的不可变符号,以及数组哈希除非请求,否则不会扁平化。但我知道我得不到这个,所以我们假装我没有问:)
(嗯,工作线程可能也很有趣)
标签
穆罕默德·萨吉德·安瓦尔
穆罕默德是 2022 年白骆驼奖获得者,也是 CPAN 贡献者。他喜欢提交拉取请求和在 Perl 大会上发言。他运营 The Weekly Challenge。他还是 Perl Weekly newsletter 的共同编辑。更多关于他的信息,请访问他的 网站。
浏览他们的文章
反馈
这篇文章有什么问题吗?请通过在 GitHub 上打开问题或拉取请求来帮助我们。
- More commenting... maybe?
github.polettix.it - Perl Weekly Challenge 121: Invert Bit
blogs.perl.org - Web nostalgia: MojoX::Mechanize
github.polettix.it - On the eve of CPAN Testers
blogs.perl.org - PWC121 - The Travelling Salesman
github.polettix.it - PWC121 - Invert Bit
github.polettix.it - Floyd-Warshall algorithm implementations
github.polettix.it - Perl Weekly Challenge 120: Swap Odd/Even Bits and Clock Angle
blogs.perl.org - How I Uploaded a CPAN Module
blogs.perl.org - App::Easer released on CPAN
github.polettix.it