尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

AI辅助编程边界:从异步并发到业务建模,编程远未解决

AI辅助编程边界:从异步并发到业务建模,编程远未解决 编程这件事这几年被讨论得越来越像“科幻议题”。随着 AI 编程助手、大模型写代码、低代码平台的出现经常能看到两种极端的声音一种说“程序员要失业了”另一种说“AI 根本写不了复杂业务”。但现实往往比这两种判断都更微妙。尤其当看到像 Lauren Tan 这样的开发者公开表示“编程远未完成”时我觉得有必要从技术实践角度把这件事拆开聊聊。本文不会去争辩“AI 会不会取代程序员”这种宏大问题而是从编程的本质、AI 辅助编程的边界、开发者需要继续掌握的核心能力等角度结合可运行的代码示例和工程实践经验分析为什么“编程已被解决”的说法不成立以及我们在日常开发中应该用怎样的姿态去面对 AI 工具。无论你是刚入门的学生、正在转型的测试还是已经有几年经验的后端开发这篇内容都可以帮你理清思路。1. 背景与核心概念编程到底“解决”了什么1.1 编程的完整定义不只是“写代码”很多人一听到“编程”首先想到的是敲击键盘、写出一行行代码。这个理解没有错但远远不够完整。编程Programming是一个从问题建模、算法设计、编码实现、测试验证、调试优化到部署维护的完整闭环。写代码只是其中一个环节而且是相对机械的环节。举个例子你让 AI 生成一段 Python 代码计算一个列表的平均值它可能几秒钟就给出正确结果。但如果让它设计一个高并发下的订单超时取消系统它需要先理解业务规则、数据一致性要求、消息队列选型、失败补偿策略、监控告警方案这些决策远不是“生成一段代码”能解决的。编程的“解决”指的是这个闭环的每个环节都能被自动化或简化。当前 AI 工具主要在“编码实现”这一步帮助较大而对于问题定义、架构设计、异常处理、非功能需求性能、安全、可用性的理解仍然高度依赖人类。1.2 为什么“编程已解决”的说法不成立Lauren Tan 这类表达本质上是为了提醒我们不要被表面的“AI 写代码”迷惑。我在实际项目里也看到过类似现象团队引入 AI 助手后简单工具脚本确实提效明显但一遇到核心业务模块或线上故障AI 往往给不出可靠方案甚至生成带有安全隐患的代码。一个很典型的例子是 SQL 注入。AI 模型可以根据常见模式生成看起来很标准的拼接 SQL但在某些场景下会漏掉参数化查询。如果你不了解安全知识直接放到生产环境后果很严重。编程的“未解决”体现在这些需要经验积累的细节点上。1.3 当前编程的真实状态人机协作而非自动取代从技术发展来看目前更准确的说法是“编程正在被增强”而不是“编程已被解决”。AI 工具擅长根据自然语言描述生成样板代码、自动补全常见语法、编写单元测试、解释代码片段。但这些都要建立在一个前提下人类能提出准确的问题并且有能力审查和修正 AI 的输出。换句话说编程的核心难点依然还在只是重心从“怎么写”逐步转向“怎么定义、怎么审查、怎么集成”。这也是为什么我一直建议开发者不要停止学习基础知识和底层原理。2. 环境准备与版本说明搭建一个可试验的 AI 辅助编程环境2.1 操作系统与开发环境本文示例以 Windows 11 / macOS 13 为主Linux 同样适用。Python 版本建议 3.9 或更高因为大多数 AI 编程插件和代码示例需要较新的语法支持。如果你用的是 Python 3.8也基本兼容但遇到类型注解或 f-string 的嵌套写法时可能会有差异。2.2 AI 编程工具选择现在的 AI 编程工具非常多常见的有 GitHub Copilot、Cursor、Codex、国内的通义灵码、文心快码等。这篇文章不偏向某个具体产品而是以“AI 辅助编程”这个通用能力来讨论。你只要安装一个支持代码补全或对话式编程的 IDE 插件即可。以 Cursor 为例它本质上是 VS Code 的一个分支内置了 AI 对话、代码生成、修改建议等能力。你可以在官网下载对应操作系统的安装包然后使用 GitHub 账号或邮箱注册登录。需要注意不同地区访问这些工具的方式存在差异请根据你的网络环境合理选择工具。版本方面不需要刻意追求最新IDE 和插件保持自动更新就好。重点在于我们用这些工具来验证一个核心观点AI 能生成代码但能否生成“正确且可靠”的代码仍然取决于人类的引导和审查。2.3 示例项目结构为了后面方便演示我们先创建一个普通 Python 项目目录结构如下ai_coding_demo/ ├── main.py ├── business.py ├── test_business.py └── requirements.txtmain.py用于入口逻辑business.py存放核心业务函数test_business.py是单元测试requirements.txt记录依赖。后面我们会在business.py中写一个带业务规则的函数然后让 AI 帮我们生成代码再人工审查优化。3. 核心原理拆解为什么编程的难点远没有被 AI 解决3.1 问题描述到代码的“语义鸿沟”AI 编程工具本质上是基于大规模代码和文本训练的语言模型。它学到的更多是“模式”和“统计规律”而不是真正的“理解”。当你用自然语言描述一个需求时AI 需要把这个描述映射到具体的代码结构。这里存在巨大的语义鸿沟。举个我常见到的例子。需求是“从一个列表中找出所有既是 2 的倍数又不是 3 的倍数的数”。这句话在数学上很清晰但代码实现时你会考虑很多细节输出顺序是否要保持原序列表为空怎么办数值很大时性能如何AI 可能会给出最简单的列表推导式# 文件路径ai_coding_demo/business.py def filter_numbers(numbers): return [n for n in numbers if n % 2 0 and n % 3 ! 0]这个代码本身没问题但它没有处理任何一个上面提到的边界条件。如果输入包含负数或非整数结果会怎样如果数据量上千万这个列表推导式就会占用大量内存。AI 不会主动考虑这些除非你在提示词里花大量篇幅描述约束。这就是“语义鸿沟”人类脑海中的完整业务上下文与 AI 看到的简化描述之间存在巨大的信息损耗。3.2 异步编程、并发与状态管理AI 的弱项在搜索热词里很多人关注“异步编程”“Java 并发编程”“Socket 编程”。这些主题恰恰是编程中真正的硬骨头。异步编程需要理解事件循环、回调、同步与异步的转换、线程安全、锁、条件变量、协程调度这些概念互相影响AI 很难从一段自然语言描述中生成正确且优雅的并发代码。我们来看一个简单的 Python 异步示例。假设你需要同时请求两个 HTTP 接口然后汇总结果。一个未经深思的 AI 生成代码可能是这样的# 文件路径ai_coding_demo/business.py import httpx import asyncio async def fetch_data(url): async with httpx.AsyncClient() as client: resp await client.get(url) return resp.json() async def main(): url1 https://api.example.com/data1 url2 https://api.example.com/data2 result1 await fetch_data(url1) result2 await fetch_data(url2) return [result1, result2]这段代码看起来不错但它的问题在于两个请求是“依次等待”的并没有真正并发。正确的做法应该是用asyncio.gather同时调度两个任务# 文件路径ai_coding_demo/business.py import httpx import asyncio async def fetch_data(url): async with httpx.AsyncClient() as client: resp await client.get(url) return resp.json() async def fetch_all(urls): async with httpx.AsyncClient() as client: tasks [client.get(url) for url in urls] responses await asyncio.gather(*tasks) return [r.json() for r in responses]这个改动并不复杂但需要你真正理解gather的语义。如果你不了解异步编程很可能把 AI 生成的“顺序执行”误认为“并发执行”这在生产环境会产生严重的性能问题。调度才是关键而这正是 AI 很难自动判断的。再比如 Java 并发中的synchronized、volatile、Lock、ConcurrentHashMap这些不是简单 API 调用而是涉及内存模型、可见性、原子性等底层理论。AI 模型可以背出这些类的用法但很难根据你的内存模型需求给出正确的并发策略。3.3 领域逻辑与业务规则的隐性知识编程中最“未解决”的部分其实是业务规则的建模。比如说订单状态机新建、待支付、已支付、已取消、已发货、已完成、已退款。每个状态之间哪些转换是合法的转换时是否需要触发其他动作并发下如何防止超卖这些业务规则通常散落在产品文档、历史代码、运维手册甚至老员工的脑子里AI 根本无从学起。我曾让 AI 帮助写一个订单状态转换的代码它生成了一套用if-else控制的逻辑看起来很清晰但完全没有考虑并发下单导致的库存超卖问题。这不是 AI 的错而是业务上下文缺失。AI 辅助编程可以帮你写出状态枚举和基础转换方法但“什么条件下允许转换”这个规则必须由人来定义和验证。3.4 调试与排错最考验人类经验的环节编程的另一个难点在调试。一个线上问题往往不是代码语法错误而是逻辑错误、性能瓶颈、并发竞态、内存泄漏、网络超时、配置错误等。AI 可以帮你分析异常堆栈但无法替代你的系统化推理能力。举个例子一个常见的 Python 报错是IndexError: list index out of range。很多人直接丢给 AIAI 可能会告诉你“索引越界了”然后给你一个通用解法。但真正要解决这个问题你需要检查数据来源、数组长度变化、循环边界条件甚至要回溯到上游接口的返回值。AI 给出的“修复”可能只是帮你写了一个防御性判断掩盖了真正的 bug。所以从这些核心难点来看编程远未解决。AI 更像是高级工具而不是替代者。4. 完整实战案例用 AI 辅助编写一个带业务规则的函数为了让大家更直观地理解 AI 编程的边界我们用一个完整的案例来演示。假设需要实现一个函数输入一个整数列表返回列表中“既是 2 的倍数又不是 3 的倍数”的所有数并且要求结果按原顺序排列同时如果列表为空返回空列表。4.1 需求分析与提示词设计我们先不急着让 AI 写代码而是自己先思考清楚需求。这个简单的需求里隐含了三个关键点过滤规则n % 2 0 and n % 3 ! 0。保持原顺序直接遍历即可不能排序。空列表处理返回空列表。当我们要用 AI 辅助时提示词需要把这些边界条件写清楚否则 AI 大概率只给一个核心表达式。这里的提示词就是给 AI 的“需求说明书”。我建议的写法是请用 Python 写一个函数 filter_numbers(numbers)参数为整数列表返回一个新列表新列表包含所有同时满足“是 2 的倍数但不是 3 的倍数”的元素顺序保持与输入一致。如果输入列表为空返回空列表。注意不要修改原列表。这个提示词比“找出既是2的倍数不是3的倍数”要准确得多。它告诉 AI 输入类型、输出要求、边界条件和副作用约束。4.2 让 AI 生成初始代码假设我们在 Cursor 中直接发送这个提示词AI 生成的代码可能类似# 文件路径ai_coding_demo/business.py def filter_numbers(numbers): result [] for n in numbers: if n % 2 0 and n % 3 ! 0: result.append(n) return result这段代码是正确且高效的时间复杂度 O(n)空间复杂度 O(k)其中 k 是结果长度。但 AI 不一定总是这么老实有时它会把参数命名为nums有时会写成列表推导式有时甚至会加入类型注解。你需要明确指定代码规范。4.3 人工审查与增强AI 生成的代码可以运行但距离“工程可用”还差几步。我们需要手工添加类型注解、文档字符串、异常处理和单元测试。这一步最能体现“编程远未解决”AI 只给了骨架血肉要靠人来补充。# 文件路径ai_coding_demo/business.py from typing import List, Union, Optional def filter_numbers(numbers: Optional[List[Union[int, float]]]) - List[int]: 从输入列表中筛选出既是 2 的倍数又不是 3 的倍数的整数。 Args: numbers: 输入列表元素应为整数或可整除的数值。 Returns: 新列表保留原始顺序。如果输入为空返回空列表。 Raises: TypeError: 如果输入不是列表或元素不是数值类型。 if numbers is None: return [] if not isinstance(numbers, list): raise TypeError(输入必须是列表) result [] for n in numbers: if isinstance(n, bool): # bool 是 int 的子类但通常不期望参与数值过滤 continue if not isinstance(n, (int, float)): raise TypeError(f列表元素必须是数值类型收到 {type(n)}) if n % 2 0 and n % 3 ! 0: result.append(int(n)) return result注意上面这个增强版本已经超过了原有需求但这恰恰是生产环境需要的。AI 不会替你考虑参数校验、类型安全、异常处理。这些代码需要你自己写。4.4 编写单元测试验证为了验证代码的正确性我们写一个简单的单元测试# 文件路径ai_coding_demo/test_business.py import sys import os sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), ..))) from business import filter_numbers def test_filter_numbers_basic(): assert filter_numbers([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) [2, 4, 8, 10] def test_filter_numbers_empty(): assert filter_numbers([]) [] def test_filter_numbers_no_match(): assert filter_numbers([3, 9, 15]) [] def test_filter_numbers_negative(): assert filter_numbers([-2, -3, -4, -6]) [-2, -4] def test_filter_numbers_none(): assert filter_numbers(None) [] def test_filter_numbers_invalid_type(): try: filter_numbers(abc) except TypeError: pass else: raise AssertionError(Expected TypeError)运行测试cd ai_coding_demo python -m pytest test_business.py -v预期输出将包含 5 个PASSED。这个测试用例不是 AI 会主动帮你生成的尤其是“bool 是 int 子类”这种边界需要经验积累。4.5 结果说明通过这个案例可以看到AI 能快速给出可运行的核心代码但完整的工程交付还需要人工补充大量细节。这正好印证了“编程远未解决”的观点AI 解决了“怎么写”的问题但“写什么、写多好、怎么验证”仍然要靠人类。5. 常见问题与排查思路AI 辅助编程中的高频陷阱问题现象常见原因解决思路AI 生成代码存在逻辑错误需求描述不完整语义歧义将需求拆解为明确的输入输出条件和边界规则AI 生成代码风格不符合项目规范缺少风格约束在提示词中指定语言、命名规范、代码结构要求并发代码实际是串行执行未理解异步并发模型熟悉 asyncio.gather、线程池等并发原语人工检查生成代码存在安全漏洞AI 不会自动考虑安全边界掌握 XSS、SQL 注入、SSRF 等常见漏洞知识定期安全审查AI 生成的测试用例覆盖不足测试设计依赖人类经验手动补充边界值、异常场景、性能测试用例依赖版本不兼容AI 基于历史数据生成代码在统一的依赖管理文件中锁定版本避免直接照搬代码可读性差未指定代码规范使用 linter 和 formatter 统一风格5.1 错误现象过滤规则漏掉边界很多新手的 AI 提示词是“找出是2的倍数不是3的倍数”结果 AI 生成了如下代码result [n for n in numbers if n % 2 0 and n % 3 ! 0]这个代码没有错误但如果numbers中包含非整数或numbers是None就会直接崩溃。解决办法是在提示词中明确“输入为整数列表且不为空”或者编写健壮的防御代码。5.2 错误现象异步任务实际是顺序执行前面提到的await fetch_data(url1); await fetch_data(url2)就是一个经典案例。你可以在代码里加两个时间戳验证import asyncio import time async def task(name, delay): print(f{name} start {time.time()}) await asyncio.sleep(delay) print(f{name} end {time.time()}) async def main(): await task(A, 2) await task(B, 1) asyncio.run(main())输出会显示 A 结束之后 B 才开始。如果你期望并发必须用gather。这个知识点 AI 不会主动提醒你。5.3 错误现象AI 生成的安全漏洞比如 AI 生成了一段拼接 SQLquery fSELECT * FROM users WHERE name {name}如果你直接使用就可能导致 SQL 注入。正确做法是使用参数化查询cursor.execute(SELECT * FROM users WHERE name %s, (name,))AI 有时会在比较复杂的场景下返回拼接 SQL因为它的训练样本中存在这类写法。你需要保持警惕并定期做代码安全扫描。6. 最佳实践与工程建议如何在 AI 时代继续“编程”6.1 把 AI 当成结对编程伙伴而不是自动写码机在实际项目中我更推荐“先设计再生成后审查”的流程。先用你自己的思维画出模块边界、数据流和接口定义然后用 AI 生成具体实现片段最后一定进行 Code Review 和单元测试。这个过程和人类程序员协作没有本质区别只是 AI 更加快速但也更需要你对代码质量负责。6.2 持续强化基础能力数据结构、算法、数据库、网络AI 能记住很多 API 用法但理解数据结构的时空复杂度、索引失效的底层原因、TCP 三次握手与连接池的关系这些需要体系化学习。你可以定期做 LeetCode 中等难度题目不是为了面试而是保持对算法和边界条件的敏感度。写代码本质上是思维训练AI 无法替代你建立思维模型。6.3 重视异常处理与防御性编程从上面的案例可以看到AI 生成的代码往往缺少异常处理。生产环境里网络超时、数据库连接断开、消息丢失、缓存穿透都是常态。优秀工程师会预判各种失败场景并在代码中做好兜底。比如读取文件时你不仅要处理文件不存在还要处理权限不足、解码失败、文件被占用等情况。把这些边界情况写在提示词里可以让 AI 生成更健壮的代码但根本的思维还是在你身上。6.4 明确提示词的编写规范提示词不是玄学它有结构可循。我常用的模板是角色 任务 约束 示例。角色你是一位资深 Python 后端工程师。任务实现一个下单接口的伪代码。约束使用类型注解、异常处理、日志记录禁止使用全局变量。示例给出一个最小输入和输出样例。这样生成的代码质量会显著提升。但也要意识到提示词本身也是一种编程你需要通过多次迭代来“调试”提示词和调试代码一样。6.5 保持代码审查和测试的独立性永远不要让 AI 对自己的代码进行唯一审查。人类审查者要关注 AI 可能忽略的整体架构、可扩展性、可维护性。同时建立持续集成流程让每次提交都自动运行单元测试、静态检查和依赖安全扫描。用工具链来弥补 AI 的盲区而不是指望 AI 单点不出错。6.6 信息安全与合规意识AI 编程工具可能会将你的代码片段作为上下文发送到云端处理。在涉及商业敏感、用户隐私、未公开的算法时一定要遵循公司的数据安全规范。这也提醒我们编程远未解决它不仅涉及技术还涉及法律、伦理和信任。7. 总结我们需要继续学习编程回到最初的问题“编程是否已解决”答案很明确远未完成。Lauren Tan 这样的提醒之所以有价值是因为它让我们警惕技术乐观主义带来的盲目。AI 让编程的门槛降低但并没有降低编程的复杂性只是把复杂性转移到了更高的层次如何定义问题、如何设计架构、如何保障质量、如何应对变化。对于初学者来说不要因为有了 AI 就跳过基础语法、算法和数据结构的学习。这些都是搭建思维框架的砖块。对于有经验的开发者来说拥抱 AI 工具是必然趋势但更要把精力投入到领域知识、架构决策、技术领导力和风险控制上。编程的未来不是“被解决”而是“被进化”。我们每个人都需要跟着进化而不是等着被替代。如果本文对你有帮助可以收藏备用。也欢迎在实践中多尝试不同的 AI 编程工具记录它们擅长和不擅长的边界这样你能更清楚地知道真正需要自己动手的地方在哪里。下次再听到“编程已经解决了”的说法时你可以从异步、并发、安全、业务建模这些角度给对方一个有力的回答。
返回列表