你从IDE驱动的开发中真正得到了什么?

2022-02-20 16:22:27

我一直在使用GitHub Copilot,这是一个IDE扩展,它利用GitHub丰富的人们如何编写代码的知识来建议下一步可能要键入的内容。我通过Visual Studio代码运行它,但它也在JetBrains和Neovim中运行。

我不喜欢IDE,但我不介意其他人使用。只要你选择的工具不影响我的,你就有更多的权力。的确,在你的职业生涯中尝试几件事。我甚至试了一年emacs,现在我再也不用使用它了。但是,一年是一个公平的评估期。这就足够了,我必须致力于学习它,并克服最初过渡期的痛苦。

但这不是我不是粉丝的原因。再说一遍,我并不是真的反对他们,但我认为他们并不像你认为的那样帮助你。

不久前,一位朋友向我讲述了他和他的团队参加课程学习一门新语言的故事。团队中的大多数人都使用了IDE,并且大多数人都提出了相同的练习解决方案。他没有使用IDE,也没有方法名建议、代码完成等。他的解决方案完全不同,而且更小更快。

他是一个非常好的程序员,但这并不是为什么他的解决方案更好。由于他没有指导自己的建议,他阅读了这些文档,并通过简单的阅读,了解IDE没有建议的方法和其他功能。在他们使用的库中,有一些更好的方法在IDE中并不明显。这是有道理的:在编辑器的建议界面中,你能真正管理多大的复杂性?

数学中有一个叫做局部极小值的概念。在某些功能中,你可能处于任何方向的移动都会使你上坡的位置。这是一个来自Desmos的贝塞尔函数图。com,它有许多局部极小值和两个绝对极小值:

如果你在-17附近向上发送x,你会发现一个点,向左或向右都会让你上坡。如果你不想上坡,你会满足于停留在当地的最低水平附近。这通常是有道理的。在非数学意义上,你愿意花费多少努力来发现是否存在较低的最小值?翻过你左边的小山,你会发现一个最小值比你刚才所在的最小值要大。向右翻过小山,你会发现一个较低的最小值。但是,这个新的最小值是绝对最小值吗?重新启动流程。

这几乎发生在你能想象到的任何事情上,但是让我们考虑一下IDE。你开始使用IDE,它让一件特别的事情变得特别简单,而且它让事情变得如此简单,以至于你不再去寻找更简单的东西。你不能把所有的时间都花在思考是否有更好的做事方式上。在某个时刻,你必须完成工作,即使当你不考虑发现、机会或转换成本时,工作可能效率低下。

这就是IDE的诱惑。你得到了一些似乎有效的东西,你可以得到一些似乎有效的东西,然后把它们拼凑在一起。马克·杰森·多米努斯(Mark Jason Dominus)对Java有一个有趣的观点,他很喜欢这个观点:你不会产生任何真正出色的东西,但你可能也不会产生任何太糟糕的东西。

我喜欢用Java编程,也不必承担生产高质量产品的责任。不用担心我的工作是否做得很好,或者我可能正在写一些难以理解或维护的东西,这是一件令人愉快的事情。当然,代码冗长得可笑,但这不是我的错。这完全是我的事。

在这个世界上,IDE处理复杂性,这就是事情变得如此复杂的原因。IDE不在乎。它没有史密斯式的追求被爱和可爱的想法。IDE可以知道数据的类型,并为方法名选择合适的源,然后根据您键入的几个字符过滤这些源。

这就是GitHub副驾驶的用武之地。它可以在IDE中工作,但不会提出“愚蠢”的建议(是的,但方式不同)。它知道很多关于人们实际编写的代码,所以它不仅知道名字,而且知道整个结构。它不是暗示句子中的下一个单词,而是暗示下一段。

但所有这些都是基于它从所知道的所有代码中学到的。这是很多代码。但是,很多代码并不重要,因为鲟鱼定律告诉我们90%的代码是积垢。他说的是科幻小说,但几乎任何东西都是如此。

所有这些代码学习都是模仿90%积垢的坏习惯。我对这项技术印象深刻,但对学习环境印象不深。我用Mojo::UserAgent尝试了一个简单的Perl示例(请参阅我的书Mojo Web Client):

让我印象深刻的是,它暗示了一些接近我可能想要的结构的东西,但没有让我印象深刻的是,它选择了一些不起作用的东西。交易的成功方法在8.02(2018年10月)被弃用,在9.0(2021年2月)被删除。也就是说,它暗示的代码在三年半前是糟糕的,一年内都不起作用。垃圾进来,垃圾出去(这个短语有一段有趣的、意想不到的历史)。从这个意义上说,这些建议是“愚蠢的”。

副驾驶并不特别了解你要做什么。它是根据其他人的所作所为进行猜测。但是,你没有做别人做过的事情。你想写一个好程序。也许你是。

此外,副驾驶只知道你接下来可能想输入什么,这是人们习惯于从dumber IDE输入的内容。如果我开始键入一行使用我没有加载的模块,这会有什么建议?没有什么特别的事情发生,比如在我输入的内容上方建议一行,以加载模块:

实际上,正如我的朋友在他的编程课上所经历的那样,这些东西并不能使程序变得更好,也不能使我们成为更好的程序员。我们最终知道的比我们应该知道的少,得到的比我们应得的少。

作为程序员,我们的部分工作就是知道什么是可能的,我们能做什么。IDE由于其接口而与发现无关。它们是关于键入快捷方式的,它们可以向我们展示的内容有限,不打算在IDE之外查看文档的人不太可能浏览一个狭窄的下拉列表为他们提供的所有选项。

打字是一个完全不同的问题,我没有这个问题。我知道如何触摸打字(是的,我已经足够大了,高中时我上过一堂关于机械打字机的打字课)。例如,Perl有同义词的概念。你可以把foreach打印出来,但是for会做同样的事情。有些人喜欢为此进行优化。但是,作为一名经验丰富的打字员,我认为foreach不仅仅是一个打字机。就像我们把单词作为一个单位来读,而不是把它的部分读出来一样,我把单词作为一个单位来打字,而不是思考每个字符。

即使我打字打得不好,那也不是我程序员时间的重要部分。我主要是盯着一个屏幕,画出各种联系,考虑后果。IDE对此没有帮助。即使在我打字的时候,我也在花时间思考我所做的一切的后果。把这段时间拿走意味着我会创建不那么周到的代码。

作为后记,我听过一些关于离开谷歌或Facebook的人的故事,他们在下一个地方努力工作以提高生产力。这两家公司都有行星规模的系统和惊人的处理工具。下一个地方没有这些工具,突然间你必须知道如何在低得多的层次上做事情。如果你从未学习过这些水平,那么你实际上是在重新开始,而你以前的经验并不那么重要。他们的工具做自己的事情,而不是一般的事情,当然也不是别人的事情。