程序员保持领先于生成式AI的技巧
- 坚持基础和最佳实践
- 找到适合您需求的工具
- 清晰而准确的对话是关键
- 要保持批判并了解风险
- comments
人工智能,尤其是由大型语言模型(LLM)驱动的生成式人工智能,可能会颠覆许多程序员的生计。但一些专家认为,AI不会立即取代人类程序员。
“你会担心那些使用AI取代你的人,”坦尼什克·马修·亚伯拉罕(Tanishq Mathew Abraham)说道,他是加州大学戴维斯分校生物医学工程博士候选人,也是医学人工智能研究中心MedARC的首席执行官。
那么,软件开发者在即将到来的以LLM为中心的编码时代中如何使自己更有用、更有关联性?以下是一些在生成式人工智能世界中能够存活并取得成功的编码师的技巧和技术。
坚持基础和最佳实践
虽然众多基于AI的编码助手可以帮助完成代码和生成代码,编程的基本原理仍然存在:具备阅读和理解自己和他人的代码的能力,并了解所编写代码如何适应更大系统。
哈佛大学约翰·A·保尔森工程与应用科学学院人机交互和编程语言交叉学科的博士生普里扬·维斯林格姆(Priyan Vaithilingam)表示:“我相信人工智能可以大大提高软件开发人员的生产力,但软件工程远不仅仅是生成代码,还包括从引出用户需求到调试、测试等更多内容。”
其中最重要的编程技能之一仍然是人类程序员的领域:问题解决。分析问题并找到优雅的解决方案仍然是备受推崇的编码专长。
“这其中存在着创造性的一面,而解决问题的那些技能比实际的编程语言或工具更为重要,”Python软件基金会成员、Explosion的联合创始人兼首席执行官Ines Montani说道。Explosion是一家专注于AI和自然语言处理的开发者工具的软件公司。“不要陷入与人工智能做比较的陷阱,它只是一个大型模型的统计输出。开发者所做的工作与模型的输出有所不同——作为开发者,除了随意编写代码之外,还有更多工作。”
此外,良好的软件工程实践比以往任何时候都更有价值。这些实践包括规划系统设计和软件架构,这为基于人工智能的工具提供了良好的上下文,以更有效地预测下一步所需的代码。
“人类编程者仍然是那个必须找出代码结构、正确的抽象组织和不同接口要求的人,”MIT计算机科学与人工智能实验室副主任兼首席运营官Armando Solar-Lezama说道。他还领导该实验室的计算机辅助编程小组。“所有这些都是软件工程实践的核心,而且不会很快消失。”
找到适合您需求的工具
寻找合适的基于人工智能的工具非常重要。每个工具都有自己的交互方式,并且可以以不同的方式将每个工具融入到您的开发工作流程中——无论是自动化创建单元测试、生成测试数据还是编写文档。
例如,GitHub Copilot和其他人工智能编程助手可以增强编程,提供编码建议。另一方面,ChatGPT和Google的Bard更像是会话式的人工智能程序员,可用于回答有关API(应用程序编程接口)的问题或生成代码片段。
关键在于实验。玩弄这个AI工具,熟悉它的工作原理,考虑其输出的质量,但要对其他工具保持开放的心态。"AI是一个快速发展的领域。你不想只停留在一个工具上然后在余生中使用它,所以你需要迅速适应新的工具,"Abraham说。
同时考虑适当的使用案例。生成式AI工具可以快速学习新的编程语言或框架,也可以更快地启动小型项目并创建原型。
清晰而准确的对话是关键
在使用AI编码助手时,详细说明您的需求,并将其视为一个迭代的过程。Abraham建议编写一段解释您想要的代码的注释,以便助手可以生成符合您要求的相关建议。
对于会话式的AI程序员,您需要知道最佳的提示方式。这就是提示工程的用武之地。
Abraham建议采用思维链提示法。这种方法是将问题分解为多个步骤,分别解决每个步骤以解决整个问题。“让模型在给定的时间内处理过多的任务可能会导致灾难。你希望它能够处理可管理的信息块并生成可管理的代码块,”他说。
例如,不要要求一个AI程序员从头开始编写整个程序,而是考虑程序试图实现的不同任务。进一步细分这些任务,并要求模型为每个任务编写特定的函数。您可能需要与模型推理实现任务所需的步骤,进行交互式对话。
"将其视为一个了解某个主题知识很多但经验不太丰富的聪明实习生,"Abraham说。
提示工程的准确性和清晰性非常重要。“您需要非常清楚地告诉模型您想要什么,对您要求它做的事情非常精确,并确保您进行跟进,”Abraham说。
了解人工智能和机器学习的基本概念,以及如何工作和它们的优缺点也很有价值。您不需要深入研究,但了解一些基本知识可以为您提供重要的结果背景。
为了帮助您入门,Abraham推荐OpenAI Cookbook,其中包含有关提示库和工具的章节,提示指南和视频课程。Vaithilingam建议阅读Illustrated Transformer,以了解有关模型和机器学习基础知识的更多信息。
要保持批判并了解风险
软件工程师应对大型语言模型的输出保持批判性,因为它们往往会产生虚构的、不准确或错误的代码。"当盲目使用由AI生成的代码时,很容易陷入调试的死胡同中,而微妙的错误很难发现,“Vaithilingam说。
这就是为什么检查生成的代码至关重要,尽管这会增加一个额外的步骤,可能会对生产力造成更多伤害而非帮助。但是阿伯拉罕认为"与从头开始编写代码相比,验证代码更容易,在某些情况下,生成代码然后验证再整合到现有的代码库中是一种更快的方法”。
值得考虑的是将这些模型的输出放入透视中,提出以下问题:这个模型是基于哪些数据进行训练的?哪些数据被过滤掉了,没有包含在训练数据中?训练数据有多老,模型是在什么版本的编程语言、软件包或库上进行训练的?这些问题的答案可能会影响结果,并提供更多相关的背景信息。
开发人员还应当对将专有代码输入到这些模型中持谨慎态度。一些公司,比如Tabnine,提供其人工智能编码助手的企业版,同时确保了隐私,仍能学习组织的编码模式和风格。
版权是另一个需要考虑的因素,不过当您使用这些工具完成几行代码或生成常见或琐碎任务的代码时,相比生成大块代码,版权问题就不是那么令人担心了。
"Solar-Lezama说:"程序员们应该对他们试图做的事情有所了解,并弄清楚在他们的上下文中,在多大程度上是独特的。"如果模型产生了一段相对独创的代码,重要的是在将其放入生产代码库之前保持怀疑和怀疑。
更大的问题是安全性,因为这些模型可能会生成包含漏洞的代码。根据Vaithilingam的说法,软件开发的最佳实践,如代码审查和强大的测试流水线,可以帮助防范这种风险。
"Solar-Lezama说:"经验更丰富的软件工程师带来的一种意识是,代码中最常见的漏洞和代码容易受到攻击的最常见方法。"他们会对需要关注和引起警惕的事项形成一种直觉。展望未来,这些技术将成为软件工程组成部分中更为重要的部分。
为了在生成式AI的世界中生存,程序员们将需要将AI视为一种工具,并将其整合到他们的工作流程中,同时认识到这些工具的机会和局限,仍然依赖于他们的人类编码能力来取得成功。
comments
编程甚至是编程中的困难部分吗?说真的,要真正帮助我节省时间的话,我们需要的是一种AI能够与项目中涉及的所有客户/合作伙伴进行面试,确定所需功能的范围,将其概括为一组对每个人都有意义的合理域模型,确定何时/何地需要传递消息,根据要求的性质确定持久性技术等等…
这只是我为微型精品应用程序设计后端时经历的简要形式。99% 的编程是做决策。当你最终计划好一切,代码几乎可以自动生成,但要达到那个点,需要很多背景知识。我不确定 GPT4 是否很快就会取代我的工作,甚至仅仅是增强它。如果它们只能使 VS Code 中的自动补全变得好用些,我会更开心。
代码几乎可以自动生成
我的两分钱:我做了大约15年的工程师。最近我得了脑损伤,所以最近无法全情投入到编程工作中。这就是为什么我无法全职工作。
我大约3个月前开始使用ChatGPT。起初我对它持怀疑态度,所以我开始让它解决一些有趣和奇怪的逻辑/语义难题,以“证明”它无法解决任何真正的问题(认为我们人类仍然是必需的!)。然而,我很快发现了它的能力。它确实有很多事情做不到,但是如果给出足够精细和详细的提示,我对它的能力感到惊讶。我意识到,只要给出足够好的提示,并利用我15年的积累知识,我可以得到令人惊叹的结果。我现在正在进行一个小项目,它已经写了大约70%的代码。在此过程中,我不得不进行一些修正,但我发现我可以专注于内容和更大的“宏”域逻辑,而不用纠结于(尽管有趣)的过程式编码。
能够更多地关注我想要构建的“是什么”,而不是如何构建它,对我来说无比有力和自由。我的正常构建过程现在是这样的:
-
阐述问题及所需内容,具体明确
-
[可选] 提供你当前的工作代码,指定框架,大致文件结构
-
确认它理解并根据需要进行澄清/更正
-
[重要] 要求它问你问题以获取澄清信息
-
要求它概述如何解决问题
-
(对于大任务,期望全面介绍)
-
(对于小任务,期望或要求实际代码)
-
[重要] 就语言/模块/算法提出具体的请求
-
[重要] 要求它编写测试套件以证明其代码功能,并粘贴任何错误或断言失败。它会给出令人惊讶的建议。
它不能取代我的编码需求,但是天哪,它让编码变得更轻松了很多,我也在学到很多东西:)
非常有趣。我正在从过劳和其他健康问题中康复,发现它能偶尔在你所描述的方式下有所帮助。对我来说,它可以简化整个过程,降低实现任何特定任务的“强度”,尤其是在我不知道如何从头脑中解决问题时(使用哪些库/函数,如何调用它们等)。然后我可以很容易地纠正任何错误,而不必花费20分钟去搜索,阅读文档等来解决问题。
如果不介意的话,你能给出一些好的提示示例吗?你的过程看起来非常好/强大,能看到实际应用将非常酷。
另外,你是否经常使用gpt-4,还是有时可以用 3.5 ?
使用哪些库/函数,如何调用它们
是的,一样。它对可用的库有很好的了解。我倾向于向它请求一个npm模块来执行X的操作,它总是会给出几个选项,并列举出优缺点,给出/修改代码以使用它们。
你是否经常使用gpt-4,还是有时可以用 3.5 ?
啊,所以我总是使用GPT4。在我的看法中,它已经超越了其他一切。
如果不介意的话,你能给出一些好的提示示例吗?
例如,我会这样说:“展示给我一个精确的设置、编写和部署Next.js应用程序的方法,让用户能够……”。它在简单的独立应用程序中往往表现得非常出色,比如待办事项/选择颜色之类的应用程序,但是如果面对更高级的问题域,它能走得很远。例如,我刚输入了这个问题,并且它的输出给我留下了深刻的印象:“你能展示给我一个设置、编写和部署Next.js应用程序的方法,让用户通过文本输入框输入一组句子,并返回依据语义相似性进行聚类的句子集合(使用不同颜色的HSL光谱指示相似性)。”-试试看!它会给出完整的React组件、使用TensorFlow的端点,并显示如何根据权重调整HSL。我认为我只需要花大约20分钟的时间做出修改,就能让它正常工作并部署。
试试看!它会给出完整的React组件,
也许我期望更多,或者我使用的标准不同,但每次我尝试它时,它生成低质量的代码,有问题的代码,我宁愿自己写。有时候它会给出完全错误的答案。
只是不是我会提交或通过代码审查的代码。