大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构!
人工智能对软件开发人员生活的影响将与个人电脑和互联网的影响相当,甚至超过个人电脑和互联网的影响。简而言之,人工智能将改变游戏规则。
对于许多程序员来说,这也是不祥之兆。Meta 首席执行官马克·扎克伯格在今年早些时候的一次采访中表示:“可能到 2025 年,Meta 以及其他致力于此的公司将拥有一种人工智能,它可以有效地成为公司中级工程师,可以编写代码。”
但是,振作起来!人类软件开发人员在当今的技术领域仍然发挥着关键作用——只不过他们不会再编写以前写过上千遍的代码了。人工智能在编码方面将大放异彩。
相反,程序员必须采用不同的软件开发方法,专注于分析和创造,而不是构建和编写代码。开发人员仍会编写代码,但这种活动必须超越声明变量、编写表达式和操纵逻辑。
使用 AI 来实现您连接的点
从最简单的层面来说,人工智能类似于一个巨大的词语联想框架。
人类意识无需用语言来描述某样事物,例如婴儿可以认出自己的父母。然而,人工智能必须先获得识别事物的词语。例如,要让人工智能了解猫,它必须根据“猫”这个词处理数百万张猫科动物的照片,_才能_获得这种理解。
人类能够以非语言的方式表达思想,这意味着我们可以想象一些不存在的东西,一旦想象出来,我们就会给它命名。这超出了人工智能目前的能力。换句话说,人工智能的意识范围被限制在预先存在的、有记录的知识中。人工智能本身无法将其知识扩展到训练数据之外;如果训练数据不足,那么人工智能基于该数据的行为也将不足。
例如,如果你向人工智能网站 Perplexity 询问“你如何构建一个应用程序来与 Airbnb 竞争?”,你可能会得到如下的答复,实际上我就是这样得到的:
要构建与 Airbnb 竞争的应用程序,请遵循以下关键步骤:
- 制定可靠的商业计划并确定您独特的价值主张。
- 组建一支精通 JavaScript、Ruby 和 Swift 等语言的技术熟练的开发团队。
- 设计一个直观且易于导航的用户友好界面。
- 为您的最小可行产品(MVP)实现基本功能:
- 用户配置文件和身份验证。
- 包含详细信息和照片的房产列表。
- 搜索和过滤功能。
- 预订和预约系统。
- 安全的支付处理。
- 主人和客人之间的消息系统。
- 评论和评级系统。
- 选择强大的技术堆栈:
- 前端:React 或 Vue.js。
- 后端:Ruby on Rails 或 Node.js。
- 数据库:MySQL 或 MongoDB。
- 云基础设施:AWS 或 Digital Ocean。
- 针对网络和移动平台(iOS 和 Android)进行开发。
- 集成地图、支付和通知等第三方服务。
- 实施安全措施来保护用户数据和交易。
- 进行彻底的测试以消除错误并确保流畅的用户体验。
- 启动您的 MVP 并收集用户反馈以进行迭代改进。
- 根据用户需求和市场趋势不断更新和添加新功能。
- 实施营销策略来吸引主人和客人到您的平台。
上述步骤并不复杂。任何在开发大型 Web 应用程序的团队中工作的开发人员都会报告与 AI 响应相同的结果。事实上,AI 响应可能是已发表的有关软件架构的文章和文档的综合。
尽管回复冗长,但缺乏细微差别。请注意,缺少一个关键步骤:_确定您的应用程序相对于 AirBnB 的竞争优势_。
Perplexity 提出的问题不是_如何构建 Web 应用程序_,而是_如何_ _构建可以与 Airbnb 竞争的_应用程序。这个微妙但重要的差异需要人类的想象力来回答,了解在给定应用程序上建立竞争优势的机会。这些“大局”问题需要想象力和人类经验才能准确回答。它们是必须连接起来才能使您的应用程序正常运行的点。
了解人工智能和人类智能之间的主要区别。
一旦回答了大局问题并知道了要连接的点,使用人工智能来实现每个点都是有意义的。人工智能非常擅长报告如何做以前做过的事情。这一切都是关于以正确的方式提出正确的问题,并学习如何创建好的提示。
学习创建好的提示
将提示视为针对 AI 模型的自然语言查询。与编写任何查询一样,细节和效率很重要。
考虑以下 SQL 语句:
SELECT * FROM customers;
经验丰富的数据库开发人员会告诉你,上面的 SQL 是不行的。它要求获取_客户_表所有行中的所有记录,这会对数据库造成很大的开销。应用程序需要所有这些数据的情况很少,如果有的话。相反,经验丰富的数据库开发人员会编写一个特定于所需数据的查询,例如:
SELECT first_name, last_name, company_name, date_added
FROM customers
WHERE date_added < '2020-01-01';
请注意,上面的查询仅要求特定数据 - first\_name、last\_name、company\_name 和 data\_added - 并将结果限制为包含 2020 年 1 月 1 日具有 data\_added 值的行。更新后的查询不仅更准确,而且在数据库的处理负担方面也更高效。
同样的原则也适用于创建提示;它们需要尽可能准确和高效。考虑提交给 Perplexity 的以下提示:
编写一个将两个数字相加的类。
结果如下所示。请注意,Perplexity 假设我想要用 Python 编写的代码,这是一个很大的假设。
class Adder:
def __init__(self, num1, num2):
self.num1 = num1
self.num2 = num2
def add(self):
return self.num1 + self.num2
# Example usage:
# adder = Adder(5, 3)
# result = adder.add()
# print(result) # Output: 8
现在,考虑一下第一个提示的更精致的版本:
在 TypeScript 中编写一个类,该类具有一个公共方法_add_,该方法接受两个数字并将它们相加。确保该类在运行时仅接受数字。将类命名为_Adder_。提供一个使用示例。
Perplexity 的结果如下所示:
class Adder {
public add(a: number, b: number): number {
if (typeof a !== 'number' || typeof b !== 'number') {
throw new Error('Both arguments must be numbers');
}
return a + b;
}
}
// Create an instance of the Adder class
const adder = new Adder();
// Example 1: Adding two numbers
try {
const result1 = adder.add(5, 3);
console.log('5 + 3 =', result1); // Output: 5 + 3 = 8
} catch (error) {
console.error(error.message);
}
// Example 2: Trying to add a number and a string (will throw an error)
try {
const result2 = adder.add(10, '5' as any);
console.log('This line will not be reached');
} catch (error) {
console.error(error.message); // Output: Both arguments must be numbers
}
如您所见,这两个响应的质量有很大差异。第一个示例中使用的提示很模糊,响应可能满足也可能不满足程序员的需求。第二个示例更加精确:它不仅定义了响应的编程语言,还定义了代码行为的约束。剩下的就是测试代码以确保它能正常工作。
这些提示可能是微不足道的例子,但它们说明了使用精确提示来检索有用结果的价值。事实上,精确的提示构造对于制作返回可靠结果的 AI 代理至关重要。请记住,提示是程序员与 AI 模型交互的方式。提示越详细,模型提供的响应就越准确和有用。
测试人工智能生成的非确定性代码很困难
期望任何事情或任何人从一开始就编写出完美的代码是危险的愚蠢行为。代码需要测试。对于人工智能生成的代码,我们必须考虑增加测试难度的另一个方面:_确定性行为_和_非确定性行为_。
确定性行为是指给定一组特定的输入时,始终返回相同结果的行为。例如,加法函数是确定性的。当输入是数字 2 和 3 时,结果将始终为 5。非确定性行为则相反:给定一组特定的输入,每次调用函数时结果都会有所不同。
可以使用典型的测试方法来测试 AI 生成的确定性代码。这包括使用自动化测试方法。但是,测试 AI 生成的非确定性代码变得困难,因为即使输入一致,结果也可能有所不同。
例如,考虑要求 AI 为一个函数生成代码,该函数根据以下语句提供结果:“返回美国游客最实惠的五个度假目的地” 。
从逻辑上讲,该函数的输入是destination\_count=5、currency\_type=USD和Tourist\_type='American'。但是,该函数的结果将取决于各种因素:函数调用时货币的瞬时转换值、根据游客类型(在本例中为美国人)对度假目的地的瞬时偏好以及特定度假地点的政治局势。你肯定不会在内战中推荐度假目的地。
鉴于这些依赖关系,每次调用该函数时结果可能会有所不同。实际上没有办法根据定量分析甚至预期返回值轻松测试函数结果的准确性。人们可以通过人工分析或使用模拟人工分析逻辑的人工智能驱动分析来测试该函数。无论哪种方式,测试都将耗时、难以实施且可能不准确。
可以肯定的是,使用人工智能生成确定性代码有其优势:编写速度快,测试简单。您甚至可以使用人工智能创建代码来测试确定性行为。另一方面,考虑到可能出现的结果的多样性,人工智能生成的非确定性代码更难测试。
人工智能在软件开发中的最佳应用
人工智能编码改变了软件创建和维护的格局。人工智能编写代码的速度确实比人类快,而且在大多数业务情况下,它编写的代码质量与人类编写的代码相当,甚至更好。
但人工智能并不是万能的,它只能做以前做过的事情,创新能力有限,而且人工智能生成的代码和业务流程缺乏细微差别。
人工智能用于系统设计又是另一回事。人类可以看到大局,看到所有需要连接的点,并据此设计系统。人工智能在这方面还有很长的路要走;到目前为止,它非常擅长编写实现这些点的代码。
人工智能发展非常迅速。随着越来越多的数据被使用,更强大的大型语言模型可以完成更复杂的任务,特别是在系统设计层面,人类的努力很有可能会专注于极具创造性的编程活动。
而且无论谁编写代码,都需要进行测试。人工智能测试复杂系统(尤其是那些具有大量非确定性行为的系统)的能力仍在不断提高。在人工智能成为真正会思考的机器之前,人类智能在软件开发生命周期中仍将必不可少——不是针对平凡的任务,而是针对那些需要非凡创造力和对计算机编程的敏锐理解(可能达到博士水平)的任务。
麻省理工学院最近的一项研究发现,使用人工智能后生产力提高最多的是新员工和入门级程序员(27% 比 39%),是使用人工智能后表现略好的高级开发人员(8% 比 13%)的两倍多。
换句话说,工作越简单,人工智能就越有用。
软件开发中的人工智能:谨慎的结论
人工智能为软件开发体验带来了许多好处,但也带来了巨大的风险。
随着人工智能承担了越来越多的软件开发日常任务,人类很可能会失去理解人工智能生成的代码在幕后真正在做什么的能力。这种危险对于初级开发人员来说尤其重要,他们为了获得工作保障,使用人工智能来应对紧迫的最后期限带来的无情压力。他们的代码可能有效,但代码在做什么以及_为什么_有效却超出了他们的理解范围。
这种情况反映了自动驾驶汽车的危险性。几代人之后,人类将不再需要知道如何驾驶才能从这项技术中受益。有些人会知道如何驾驶汽车,但这将是一项专业技能,类似于骑马。
随着编写代码的人越来越少,更重要的是,他们失去了了解代码实际工作原理的能力,我们将无法控制人工智能。没有软件开发人员(或任何其他人)希望这种情况发生。人工智能的目的是成为我们的助手,而不是我们的主人。我们需要小心。
软件开发人员会被人工智能取代吗?简而言之,不会——人类在软件开发生命周期中永远有一席之地。未来的挑战是,要想蓬勃发展,人类软件开发人员需要非常聪明、善于分析、经验丰富且极具创造力。开发人员需要想象尚未存在或以意想不到的方式实现的事物——因为如果以前做过,人工智能将能够再次做到,而且速度更快、成本更低。
原文地址:https://mp.weixin.qq.com/s/499XmSsrz5iUh3w2TpM6rw
本文由博客一文多发平台 OpenWrite 发布!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。