译者 | 李睿
审校 | 重楼
软件开发专家Igboanugo David Ugochukwu表示,当他带领的软件开发团队在去年开始使用人工智能编码助手时,他对其能力持怀疑态度。基于其长达15年的编程经验,他不相信大型语言模型能够对实际的开发工作提供有意义的帮助。在六个月后,他的看法发生了根本性转变,其开发团队的工作效率提高了大约40%,同时代码质量指标也有所提高。
但关键在于,这并不像“人工智能让编码变得更容易”那么简单。实际应用中的情况远比市场宣传所描绘的更微妙、更有趣,并且从实用角度来看,也更具价值。
实际应用情况
Ugochukwu分享了近日发生的一件事。他正在调试Node.js后端一个严重的内存泄漏。这在以往意味着要花费数小时梳理代码,添加控制台日志,可能还需要花费更多的时间。然而,他将相关代码和内存配置文件输入到人工智能助手中,并要求它分析模式。
在几分钟之内,人工智能助手就发现了一些他未曾留意的一处细节——在一个闭包中意外地保持了WebSocket连接。这是一个微不足道却难以察觉的错误。尽管人工智能并没有神奇地修复它,但它比传统的调试方法更快地指明了正确的方向。
真正有效的方法
根据其团队在过去一年使用人工智能助手的经验:
1.代码评审
复制
Python 1 def process_user_data(data): 2 if data['status'] == 'active': 3 user = User.objects.get(id=data['user_id']) 4 if user.subscription: 5 if user.subscription.status == 'valid': 6 return handle_active_user(user) 7 else: 8 return handle_inactive_subscription(user) 9 return handle_inactive_user()
人工智能助手发现了这一点,并提出了以下建议:
重构版本:
复制
Python 1 def process_user_data(data): 2 if data['status'] != 'active': 3 return handle_inactive_user() 4 5 user = User.objects.get(id=data['user_id']) 6 if not user.subscription: 7 return handle_inactive_user() 8 9 return (handle_active_user(user) 10 if user.subscription.status == 'valid' 11 else handle_inactive_subscription(user))
虽然它并不是革命性突破,但始终比人类审阅者更快地发现这些可读性问题。
2.测试生成
这是另一个意外的发现。以下是一个真实示例:
最初的功能:
复制
Python 1 def calculate_order_total(items, discount_code=None): 2 subtotal = sum(item.price * item.quantity for item in items) 3 if discount_code: 4 discount = get_discount_amount(discount_code, subtotal) 5 return subtotal - discount 6 return subtotal
人工智能生成了这些测试用例:
复制
Python 1 def test_calculate_order_total(): 2 items = [ 3 Item(price=10.0, quantity=2), 4 Item(price=15.0, quantity=1) 5 ] 6 assert calculate_order_total(items) == 35.0 7 8 def test_calculate_order_total_with_discount(): 9 items = [Item(price=100.0, quantity=1)] 10 assert calculate_order_total(items, 'SAVE20') == 80.0 11 12 def test_calculate_order_total_empty(): 13 assert calculate_order_total([]) == 0 14 15 def test_calculate_order_total_invalid_discount(): 16 items = [Item(price=10.0, quantity=1)] 17 assert calculate_order_total(items, 'INVALID') == 10.0
它捕捉到了开发人员一开始可能会忽略的边界案例。
不适用人工智能助手的情况
1.复杂的架构决策
Ugochukwu带领的开发团队最近需要重新设计身份验证系统,以处理多租户单点登录(SSO)。人工智能助手提供的建议从技术上来说是正确的,但忽略了关于不同客户端类型之间会话管理的关键现实因素。
2.场景复杂型调试
当一个bug涉及多个服务、复杂状态或竞争条件时,人工智能工具仍然会遇到困难。它们可以帮助分析单个组件,但往往忽略了整体情况。
对开发工作流程的实际影响
以下是开发工作流程的实际变化:
在人工智能整合之前
复制
Plain Text 1 1. Write code (2 hours) 2 2. Write tests (1 hour) 3 3. Debug issues (2 hours) 4 4. Code review (1 hour) 5 6 Total: ~6 hours per feature
在人工智能整合之后
复制
Plain Text 1 1. Write code with AI assistance (1 hour) 2 2. AI generates test cases, developer adjusts (30 mins) 3 3. Debug with AI analysis (1 hour) 4 4. AI-assisted code review (30 mins) 5 6 Total: ~3 hours per feature
但问题是,这之所以能奏效,是因为开发团队学会了如何有效地使用人工智能工具。虽然他们在第一个月的工作效率较低,但正在摸索正确的工作流程。
学到的最佳实践
1.面向开发人员的提示工程
而不是:
复制
Plain Text 1 "Write a function to process user data"
该开发团队采取的做法是:
复制
Plain Text 1 "Write a Python function that: 2 3 - Takes a user_id and data dictionary 4 - Validates required fields: name, email, age 5 - Handles missing fields with default values 6 - Raises ValidationError for invalid data 7 - Returns a processed user object 8 9 Use type hints and include error handling."
输出内容质量上的差异十分显著。
2.代码审查策略
现在采取的做法是:
- 第一轮:利用人工智能进行风格、潜在漏洞和明显问题的审查。
- 第二轮:人工审查业务逻辑和架构方面的问题。
- 最后一轮:再次利用人工智能检查安全漏洞。
3.文档生成
这改变了游戏规则。示例如下:
复制
Python 1 # Original function with minimal docs 2 3 def process_payment(amount, user_id, method): 4 5 # ... implementation ...
人工智能将其扩展为:
复制
Python 1 def process_payment( 2 amount: Decimal, 3 user_id: str, 4 method: PaymentMethod 5 ) -> PaymentResult: 6 """Process a payment transaction for a user. 7 8 Args: 9 amount: Transaction amount in user's local currency. 10 user_id: Unique identifier for the user. 11 method: Payment method object containing card/bank details. 12 13 Returns: 14 PaymentResult object containing transaction ID and status. 15 16 Raises: 17 InsufficientFundsError: If payment method has insufficient funds. 18 InvalidPaymentMethodError: If payment method is expired/invalid. 19 PaymentProcessingError: If payment gateway encounters an error. 20 21 Example: 22 >>> result = process_payment( 23 ... amount=Decimal('99.99'), 24 ... user_id='usr_123', 25 ... method=PaymentMethod(type='credit_card', token='tok_xyz') 26 ... ) 27 >>> print(result.transaction_id) 28 'tx_abc123' 29 """
安全注意事项
在安全方面,必须极其谨慎。以下是吸取的一些教训:
1.永远不要让人工智能生成安全关键代码
不要做的示例:
复制
Python 1 # DON'T: Let AI generate authentication logic 2 def verify_password(plain_text, hashed): 3 return hashlib.md5(plain_text.encode()).hexdigest() == hashed
2.始终检查生成的SQL
已经看到人工智能建议易受攻击的查询:
复制
SQL 1 -- DON'T: Raw string formatting 2 f"SELECT * FROM users WHERE id = '{user_id}'" 3 4 -- DO: Parameterized queries 5 "SELECT * FROM users WHERE id = %s", (user_id,)
展望未来
根据目前的趋势和开发人员的经验,以下是一些实际的变化趋势:
1.集成开发环境(IDE)整合正变得日益重要
最新的人工智能驱动的集成开发环境(IDE)不仅提供代码建议,还能理解整个代码库。例如,开发团队的IDE异步函数在不同服务中的调用方式,标记了异步函数中潜在的竞争条件。
2.专业模型正在涌现
现在有一些人工智能模型专门针对某些框架或语言进行训练。目前,获得的针对TypeScript的特定建议明显优于通用的代码生成。
3.测试正在转变
人工智能在生成人类可能错过的边缘案例和压力测试方面做得越来越好,自从采用人工智能工具以来,测试覆盖率有所提高。
结论
人工智能在短期内并不会取代开发人员。与其相反,人工智能可以提高软件开发效率,帮助他们更早地发现漏洞,并处理编程中繁琐且重复性的任务。关键在于理解其局限性,并将其作为高效的工具使用,而不是替代人类的判断。
在这个数字时代中茁壮成长的开发人员并不是那些能编写大量代码的人,而是那些擅长与人工智能工具协作,同时对自己所构建的内容及其背后的逻辑与目的有着深刻认识的人。
Ugochukwu在撰写本文的过程中,就巧妙地借助了人工智能的力量来辅助部分内容的创作。这正是关键所在。人工智能是一种工具,开发人员需要理解并且有效地利用它。
原文标题:Beyond ChatGPT: How Generative AI Is Transforming Software Development,作者:Igboanugo David Ugochukwu