AI寫程式碼的“上下文陷阱”:為什麼AI總是寫錯?如何系統性解決?

一、如何充分使用模型能力
關鍵要點完整+精確+聚焦的上下文是充分使用模型能力的關鍵。在這個認知之下思考如何系統性的構建滿足這個條件的上下文?
  • 合理的任務分解:本質上是在有限上下文寬度和注意力的約束下,怎麼恰當的把握任務的複雜度邊界,讓模型能夠在一個聚焦的任務上作業。
  • 完整的背景資訊:在一個真實的專案中寫程式碼,需要理解系統架構和規範、瞭解業務需求、清楚關鍵程式碼實現路徑、知道如何修改程式碼滿足新的需求,完整了解這些背景資訊才能真正的寫程式碼,這對於人類和AI來說是一樣的。
  • 精確的指令描述:使用能夠讓AI更容易理解的方式,清晰無歧義的表達要完成的任務,如強調語法**、mermaid畫圖等。
  • 有效的驗證和反饋:資訊從我們表達出來->AI理解->生成程式碼,每一層都會有損失,而且往往我們自己也會遺漏一些細節,這一步的關鍵是自己要根據AI的產出驗證和思考,將錯漏的內容反饋AI自行反思、糾偏。
這4個關鍵點的應用中還涉及到尺度的把握(資訊的細緻程度),而這個尺度會隨著模型的能力提升而變化。如早期的模型需要非常詳盡的內容輸入,當模型能力提升後可以自主從程式碼中獲得足夠的背景知識。
二、AI協作程式設計的方法
2.1. 應用級記憶結構
關鍵要點像設計系統架構一樣設計上下文架構,暗合近期討論比較多的上下文工程(context engineering)的概念。在這個認知之下思考如何高效、準確的維護這個上下文工程?
  • 第一層-應用基礎記憶:是應用比較基礎的架構、技術棧、規範、通用工具等長期穩定記憶,是與AI互動的System Prompt,就像系統架構中的基礎元件。
  • 第二層-功能模組記憶:是對某個具體功能的完整描述,包括鏈路圖、程式碼入口、關鍵邏輯、依賴關係等相對穩定的功能記憶,是與AI互動關鍵背景知識,就像系統架構中由基礎元件+業務需求組成的具體功能。
  • 第三層-需求迭代記憶:是AI基於專案迭代中業務需求+功能模組背景知識+專案系統架構產出的技術方案,包括明確的業務需求、程式碼改造範圍、約束條件、邊界情況等,是作為提供給AI進行程式碼生成的最終輸入。

2.2. AI輔助記憶維護
記憶維護關鍵點向AI提供的輸入內容和產出驗收,本身也可以由AI來輔助生成和驗證,同時記憶的維護是漸進的,可跟隨實際專案逐步完善。
  • 應用基礎記憶構建:一般AI程式設計工具都有生成專案頂層記憶文件的功能,如Cursor的/Generate Cursor Rules、ClaudeCode的/init,在某個應用沒有任何記憶時,可以作為冷啟動的快速建立記憶的方法,生成初始記憶後,可以根據自己的要求讓AI輔助調整。
  • 功能模組記憶構建:由人類提供提供簡潔的功能描述和關鍵程式碼入口,讓AI自動根據程式碼入口作為線索去檢索,建立完整鏈路的記憶文件,再根據自己的要求讓AI輔助調整。
  • 需求迭代記憶構建:引用與需求相關的背景知識記憶,並且以Markdown格式描述本次需求內容,要求其生成技術方案,就產出了需求迭代記憶。需求開發完成後反向更新功能模組記憶。
  • 記憶文件的規範:建立一些基礎的記憶文件規範,如應用記憶保持整潔、功能模組記憶需要有鏈路圖、需求迭代記憶需要建立在指定目錄等。
  • 要求AI輔助檢查和反思:每一層的記憶文件生成後,都可以要求AI進行自我檢查和反思,是否有錯漏的地方。
  • 通用的記憶格式:統一以.md作為記憶格式,未來使用任何AI程式設計工具都可以無縫切換。(cursor的.mdc本質上也是.md)
總結:核心是系統性的分層分模組管理上下文,最大程度讓AI輔助維護上下文,每次變更的知識負擔就可以大幅度下降(輸入具體需求即可),配合漸進式的更新維護,使用AI程式設計工具的效率正迴圈就形成了。

2.2.1. 記憶示例

功能模組基於、需求迭代記憶的示例涉及到敏感業務程式碼,不再此處展示
專案結構和技術棧
---description: globs: alwaysApply: true---AE評測系統開發指南## 專案結構- [demo-start](mdc:demo-start): 專案啟動模組,**這個模組中沒有業務邏輯, 在我沒有明確指令是不要修改此模組中的程式碼**。- [demo-api](mdc:demo-api): HSFAPI介面定義模組**對於Demo系統的開發,只關心 [demo](mdc:demo-api/src/main/java/com/aliexpress/demo) package下的內容, 其他package內容忽略**- [demo/api](mdc:demo-api/src/main/java/com/aliexpress/demo/api): Demo系統的HSFAPI的interface均在這個package下定義, 命名字尾為Service- [demo/model](mdc:demo-api/src/main/java/com/aliexpress/demo/model): Demo系統的HSFAPI的model均儲存在這個package, 命名字尾為RequestDTO- [demo/common](mdc:demo-api/src/main/java/com/aliexpress/demo/common): Demo系統的HSFAPI的enum均儲存在這個package下, 命名字尾為Enum- [demo/base](mdc:demo-api/src/main/java/com/aliexpress/demo/base): Demo系統的HSFAPI的model的基類均儲存在這個package下- [demo-biz](mdc:demo-biz): 業務邏輯實現模組, **對於Demo系統的開發,只關心 [demo](mdc:demo-api/src/main/java/com/aliexpress/biz/demo) package下的內容, 其他package內容忽略**- [demo/api](mdc:demo-biz/src/main/java/com/aliexpress/biz/demo/api): Demo系統的HSFAPI的實現類均在這個package下定義, 命名字尾為ServiceImpl- [demo/api/converter](mdc:demo-biz/src/main/java/com/aliexpress/biz/demo/api/converter): Demo系統的HSFAPI的實現類使用的Converter類均儲存在這個package下, 命名字尾為Converter- [demo/api/validate](mdc:demo-biz/src/main/java/com/aliexpress/biz/demo/api/validate): Demo系統的HSFAPI的實現類使用的校驗類均儲存在這個package下, 命名字尾為Validate- [demo/common](mdc:demo-biz/src/main/java/com/aliexpress/biz/demo/common): Demo系統的內部的公共類均儲存在這個package下, 命名字尾為EnumConstant- [demo/config](mdc:demo-biz/src/main/java/com/aliexpress/biz/demo/config): Demo系統的內部的DiamondHSF配置類均儲存在這個package下, 命名字尾為ConfigConfiguration- [demo/consumer](mdc:demo-biz/src/main/java/com/aliexpress/biz/demo/consumer): Demo系統的MetaQConsumer類均儲存在這個package下, 命名字尾為Consumer(消費MetaQ)- [demo/consumer/listener](mdc:demo-biz/src/main/java/com/aliexpress/biz/demo/consumer/listener): Demo系統的Consumer的消費邏輯實現類均儲存在這個package下, 命名字尾為Listener(實現消費邏輯)- [demo/demouator](mdc:demo-biz/src/main/java/com/aliexpress/biz/demo/demouator): Demo系統的評估器實現類均儲存在這個package下, 命名字尾為demouator, **此處的程式碼相對比較穩定,在我沒有明確指令時不要自行修改**- [demo/executor](mdc:demo-biz/src/main/java/com/aliexpress/biz/demo/executor): Demo系統的通用業務邏輯實現類均儲存在這個package下, 命名字尾為Executor- [demo/invoker](mdc:demo-biz/src/main/java/com/aliexpress/biz/demo/invoker): Demo系統的呼叫AI應用的通用封裝類均儲存在這個package下**此處的程式碼相對比較穩定,在我沒有明確指令時不要自行修改**- [demo/task](mdc:demo-biz/src/main/java/com/aliexpress/biz/demo/task): Demo系統的任務提交和任務執行的的通用封裝類均儲存在這個package下**此處的程式碼相對比較穩定,在我沒有明確指令時不要自行修改**- [demo/util](mdc:demo-biz/src/main/java/com/aliexpress/biz/demo/util): Demo系統的工具類均儲存在這個package下**此處的程式碼相對比較穩定,在我沒有明確指令時不要自行修改**- [demo-core](mdc:demo-core): 核心功能模組, 包含基礎設施和通用元件, **對於Demo系統的開發, 任何時候都不需要關注這個模組中的內容**- [demo-job](mdc:demo-job): 定時任務模組, **對於Demo系統的開發, 任何時候都不需要關注這個模組中的內容**- [demo-workflow](mdc:demo-workflow): 工作流相關模組, **對於Demo系統的開發, 任何時候都不需要關注這個模組中的內容**- [demo-infrastructure](mdc:demo-infrastructure): 基礎設施模組, 包含資料訪問外部服務整合等, **對於Demo系統的開發, 主要關心其中操作資料庫的相關程式碼**- [dao/demo](mdc:demo-infrastructure/src/main/java/com/aliexpress/infrastructure/dao/demo): Demo系統的Mybatis-Plus的Mapper類均儲存在這個package下,字尾為Mapper- [model/demo](mdc:demo-infrastructure/src/main/java/com/aliexpress/infrastructure/model/demo): Demo系統的Mybatis-Plus的實體類均儲存在這個package下,其中PO字尾的是與資料庫表直接對映的實體類,其中/model資料夾下的類是和業務層互動的實體類- [model/convert](mdc:demo-infrastructure/src/main/java/com/aliexpress/infrastructure/model/convert): Demo系統的Mybatis-Plus的PO與Model之間的轉換類均儲存在這個package下,字尾為Converter- [repository](mdc:demo-infrastructure/src/main/java/com/aliexpress/infrastructure/repository): Demo系統的資料庫操作類均儲存在這個package下,介面字尾為Repository,實現類字尾為RepositoryImpl,核心的作用是呼叫Mapper與資料庫操作轉換PO與Model- [demo-provider](mdc:demo-provider): 服務提供者模組- [hsf/provider](mdc:demo-provider/src/main/java/com/aliexpress/provider/hsf/provider): 增加新的HSF服務Provider需要在 [HsfProviderConfig.java](mdc:demo-provider/src/main/java/com/aliexpress/provider/hsf/provider/HsfProviderConfig.java)類中增加配置- [demo-sdk](mdc:demo-sdk): Demo系統SDK工具模組,**此處的程式碼相對比較穩定,在我沒有明確指令時不要自行修改**## 主要技術棧-PandoraBoot: 基於SpringBoot的阿里內部框架-HSF: 阿里內部的RPC框架-Diamond: 阿里內部的配置中心-Tair: 阿里內部的快取服務-MetaQ: 阿里內部的訊息服務-MyBatis-Plus: 輕量級的ORM框架
DAO層程式碼規範
---description: 根據建立表的SQL生成操作資料庫層增刪改查程式碼時引用此檔案globs: alwaysApply: false---## 操作資料庫編碼規範#### 操作DB框架1. 開發框架:使用MyBatis-Plus進行編碼2. 呼叫邏輯:上層透過注入的方式呼叫Repository的實現,在Repository的實現的實現中呼叫Mapper,呼叫Mapper後返回的物件是PO,再透過Converter轉換成Model後返回為上層呼叫方3. 資料型別的選擇:時間欄位使用java.util.Date型別4. 使用MyBatis-Plus方法注意事項:注意不要呼叫deprecated的方法5Repository層的刪除方法:統一使用邏輯刪除,邏輯刪除欄位是is_deleted6Repository層需操作時需要附加對當前環境的處理:呼叫 [EnvUtil.java](mdc:task-infrastructure/src/main/java/com/aliexpress/qa/task/infrastructure/util/EnvUtil.java)的getEnv().getCode()方法7Repository層的的分頁方法:呼叫MyBatis-Plus的selectPage方法#### DAO層PO1DAO層PO的命名規範為${TableName}PO2DAO層PO的存放目錄[model](mdc:task-infrastructure/src/main/java/com/aliexpress/qa/task/infrastructure/model)#### DAO層Mapper1DAO層Mapper命名規範為${TableName}Mapper2DAO層Mapper的存放目錄[dao](mdc:task-infrastructure/src/main/java/com/aliexpress/qa/task/infrastructure/dao)#### Repository層1Repository層interface命名規範為${TableName}Repository2Repository層實現命名規範為${TableName}RepositoryImpl3Repository層Model命名規範為${TableName}Model4Repository層interface的存放目錄[repository](mdc:task-infrastructure/src/main/java/com/aliexpress/qa/task/infrastructure/repository)5Repository層實現的存放目錄[repositoryimpl](mdc:task-infrastructure/src/main/java/com/aliexpress/qa/task/infrastructure/repository/impl)6Repository層Model存放目錄[model](mdc:task-infrastructure/src/main/java/com/aliexpress/qa/task/infrastructure/model)#### Converter層1Converter層命名規範位${TableName}Converter2Converter層的存放目錄[convert](mdc:task-infrastructure/src/main/java/com/aliexpress/qa/task/infrastructure/model/convert)3Converter程式碼規範:使用欄位進行對映,禁止使用json序列化BeanUtils.copyProperties等方式## 參考程式碼1DAO層PO參考程式碼``` javaimport com.baomidou.mybatisplus.annotation.TableName;import lombok.AllArgsConstructor;import lombok.Builder;import lombok.Data;import lombok.NoArgsConstructor;${必要的引用}/** * @author chigong.zxn */@Data@Builder@TableName(value ="${tableName}")@AllArgsConstructor@NoArgsConstructorpublicclass ${TableName}PO {    ${註釋}    ${只可以使用包裝型別,禁止使用基礎型別}    ${columnName}}```2DAO層Mapper參考程式碼,注意:不需要增加增刪改查方法,MyBatis-Plus已經預設透過繼承BaseMapper提供``` javaimport com.aliexpress.qa.task.infrastructure.model.eval.${TableName}PO;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import org.apache.ibatis.annotations.Mapper;/** * @author chigong.zxn */@Mapperpublic interface ${TableName}Mapper extends BaseMapper<${TableName}PO> {}```3Repository層interface參考程式碼,注意:生成基礎的增刪改查方法``` javaimport com.aliexpress.qa.task.infrastructure.model.eval.${TableName}PO;import com.aliexpress.qa.task.infrastructure.model.eval.${TableName}Model;/** * @author chigong.zxn */@Mapperpublic interface ${TableName}Repository {    ${註釋}    ${增刪改查方法}}```4Repository層實現參考程式碼,注意:繼承Repository介面實現基礎增刪改查方法,呼叫Mapper生成基礎的增刪改查方法``` javaimport com.aliexpress.qa.task.infrastructure.model.eval.${TableName}PO;import com.aliexpress.qa.task.infrastructure.model.eval.${TableName}Model;/** * @author chigong.zxn */@Mapperpublic interface ${TableName}RepositoryImpl implements ${TableName}Repository {    ${註釋}    ${實現Repository增刪改查方法}}```5Repository層Model參考程式碼``` javaimport lombok.AllArgsConstructor;import lombok.Builder;import lombok.Data;import lombok.NoArgsConstructor;${必要的引用}/** * @author chigong.zxn */@Data@Builder@AllArgsConstructor@NoArgsConstructorpublicclass ${TableName}Model {    ${註釋}    ${只可以使用包裝型別,禁止使用基礎型別}    ${columnName}}```6Converter層參考程式碼,注意:生成2個靜態方法,PO轉ModelModel轉PO``` javaimport com.aliexpress.qa.task.infrastructure.model.eval.${TableName}PO;import com.aliexpress.qa.task.infrastructure.model.eval.${TableName}Model;/** * @author chigong.zxn */publicclass ${TableName}Converter {    ${註釋}    ${PO轉換為Model}    ${註釋}    ${Model轉換為PO}}```
API層程式碼規範
---description: 增加HSF介面時引用此檔案globs: alwaysApply: false---## API開發規範### 服務實現* 驗證器存放目錄:[validate](mdc:task-biz/src/main/java/com/aliexpress/qa/task/biz/eval/api/)* 實現要求:必須實現服務驗證器* 服務實現程式碼參考:``` javaimport com.alibaba.fastjson.JSON;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Service;@Servicepublicclass ${服務名}ServiceImpl implements ${服務名}Service {    privatestaticfinal Logger logger = LoggerFactory.getLogger(${服務名}ServiceImpl.class);@Autowiredprivate ${服務校驗器}Validate validate;// 如果需要呼叫其他bean也可以在此處引入// 如:// @Autowired// private EvalDatasetDetailRepository evalDatasetDetailRepository;@Overridepublic ${服務方法出參} ${服務方法名}(${服務方法請求體} request) {        logger.info("${服務名}Service.${服務方法名} request:{}", JSON.toJSONString(request));        ${服務方法出參} response = new ${服務方法出參}();try {            String validateMsg = validate.${服務方法校驗器}Validate(request);if (StringUtils.isNotBlank(validateMsg)) {return Response.fail(ErrorCode.PARAM_ERROR.name(), validateMsg);            }// 在此處實現業務邏輯            ${業務邏輯}        } catch (Exception e) {            logger.error("${服務名}Service.${服務方法名} error", e);            response = Response.fail(ErrorCode.SYSTEM_ERROR.name(), e.getMessage());        }        logger.info("${服務名}Service.${服務方法名} response:{}", response);return response;    }}```### 服務驗證器* 驗證器存放目錄:[validate](/task-biz/src/main/java/com/aliexpress/qa/task/biz/eval/api/validate/)* 驗證器程式碼參考:驗證失敗則返回失敗原因字串,驗證成功則返回空字串``` javaimport com.aliexpress.qa.task.biz.eval.util.ValidateUtil;import org.springframework.stereotype.Component;@Componentpublicclass ${服務名}Validate {// 如果需要呼叫其他bean也可以在此處引入// 如:// @Autowired// private EvalDatasetDetailRepository evalDatasetDetailRepository;public String ${服務方法名}Validate(${服務方法請求體} request) {// 請求體不能為空if (request == null) {return"請求引數不能為空";        }// 基礎校驗,使用ValidateUtil校驗net.sf.oval annotation        String validateMsg = ValidateUtil.validate(request);if (StringUtils.isNotBlank(validateMsg)) {return validateMsg;        }// 寫明校驗註釋        #{文件要求的其他校驗邏輯}// 返回空字串則校驗成功return StringUtils.EMPTY;    }}```### 分散式鎖使用* 服務實現程式碼參考:``` javaimport com.alibaba.fastjson.JSON;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Service;import com.aliexpress.qa.task.infrastructure.util.lock.DistributedLockUtil;@Servicepublicclass ${服務名}ServiceImpl implements ${服務名}Service {    privatestaticfinal Logger logger = LoggerFactory.getLogger(${服務名}ServiceImpl.class);@Autowiredprivate ${服務校驗器}Validate validate;@Autowiredprivate DistributedLockUtil distributedLockUtil;// 如果需要呼叫其他bean也可以在此處引入// 如:// @Autowired// private EvalDatasetDetailRepository evalDatasetDetailRepository;@Overridepublic ${服務方法出參} ${服務方法名}(${服務方法請求體} request) {        logger.info("${服務名}Service.${服務方法名} request:{}", JSON.toJSONString(request));        ${服務方法出參} response = new ${服務方法出參}();try {            String validateMsg = validate.${服務方法校驗器}Validate(request);if (StringUtils.isNotBlank(validateMsg)) {return Response.fail(ErrorCode.PARAM_ERROR.name(), validateMsg);            }// 根據業務邏輯要求構建lockKey            String lockKey = ...;// 分散式鎖,避免併發排程            DistributedLock lock = distributedLockUtil.getLock(lockKey);// 獲取分散式鎖try {                lock.tryLock(1000L);            } catch (GetLockErrorException lockException) {return Response.fail(ErrorCode.LOCK_ERROR.name(), ErrorCode.LOCK_ERROR.getMessage());            }try {// 在此處實現業務邏輯                ${業務邏輯}             } finally {                lock.unlock();            }        } catch (Exception e) {            logger.error("${服務名}Service.${服務方法名} error", e);            response = Response.fail(ErrorCode.SYSTEM_ERROR.name(), e.getMessage());        }        logger.info("${服務名}Service.${服務方法名} response:{}", response);return response;    }}```
單元測試規範
---description: globs: alwaysApply: false---# 單元測試指南## 測試框架- JUnit Jupiter 5.9.2- Mockito 4.11.0- JUnit Platform 1.9.2## 嚴格執行- 禁止改變被測試方法的任何行為- private方法測試: 使用反射的方式測試private方法, 禁止改變被測試方法的private```java  @BeforeEach  voidsetUp() throws NoSuchMethodException {      // 獲取私有方法      Method privateMethod = TargetClass.class.getDeclaredMethod("privateMethodName",           ParameterType1.class, ParameterType2.class);      privateMethod.setAccessible(true);  }  @Test  voidprivateMethodName_Should_ExpectedBehavior_When_StateUnderTest() throws Exception {      // given      // when      Object result = privateMethod.invoke(targetObject, arg1, arg2);      // then      // assertions  }  ```- 靜態方法Mock: 使用MockedStatic方式- staticfinal欄位處理: 避免直接測試或mock staticfinal欄位(如日誌記錄器),專注於測試核心業務邏輯和返回值- Mybatis-Plus初始化實體類元資料: mock Mybatis-Plus的```LambdaUpdateWrapper、LambdaQueryWrapper```時,在```@BeforeEach```中使用```TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""),${實體類名}PO.class);```初始化實體類元資料## 測試命名規範- 使用 `@Test` 註解標記測試方法- 測試方法名應該清晰表達測試目的,並且測試方法名必須包含被測試的方法名- 格式:`${被測試方法名}_Should_ExpectedBehavior_When_StateUnderTest`- 示例:`buildQuery_Should_ReturnQueryWithEntrustBizId_When_UserHasEntrustPermission`## 測試最佳實踐### Mock策略- 優先測試核心業務邏輯,避免過度依賴基礎設施元件的驗證- 對於不可變的靜態元件(如staticfinal欄位),採用行為驗證而非狀態驗證- 當無法直接mock某個元件時,考慮透過測試輸出結果來間接驗證行為- Mock物件使用: 只能對`mock()`建立的物件使用`when()`進行stub,禁止對真實物件(如透過builder模式建立的物件)使用`when()`### 測試重點- 專注於方法的返回值、異常丟擲、狀態變更等核心行為- 避免測試框架細節、日誌輸出等非核心功能- 保持測試的簡潔性和可維護性
模組功能文件規範
---description: globs: alwaysApply: false---## 生成記憶- 建立記憶資料夾:記憶檔案統一存放在 [.cursor/memory](mdc:.cursor/memory) ,如果我提供了指定了檔案目錄則按照我提供的資料夾存放,如果我沒提供則根據需要梳理的鏈路自動起名建立資料夾- 建立記憶檔案:如果我提供了名字,則按照我提供的名字建立,如果我沒有提供,則根據需要梳理的鏈路自動建立檔案,已`.md`格式的檔案維護記憶。- 記憶檔案內容要求:必須包含一個完整的鏈路圖,並且將必要的程式碼入口、核心的程式碼邏輯放在記憶文件中。
技術方案文件規範
---description: globs: alwaysApply: false---## 生成開發任務- 建立任務資料夾:當我要求你建立一個開發任務時,你需要根據`當前分支`的名稱在 [.cursor/task](mdc:.cursor/task) 檔案中查詢是否有對應任務的檔案,如果沒有則建立一個任務資料夾- 建立任務檔案:在以`當前分支`命名的資料夾中,建立當前任務的詳細描述檔案,使用`.md`的檔案格式生成文件內容,檔名根據我的要求自動生成一箇中文名## 文件內容規範- 文件結構:保持簡潔,專注技術方案。在沒有明確要求時不包含開發計劃、風險控制、上線計劃等管理內容- 測試要求:單元測試要求,覆蓋率達到80%以上- 儘量簡潔:在滿足要求的情況下儘量簡潔,如果有需要補充的內容,我會明確的向你表達## 程式碼設計規範- 列舉使用:新增字串型別欄位時優先考慮列舉定義,避免硬編碼- 歷史相容:新增欄位時考慮歷史資料相容性,提供預設值處理
2.3. 程式碼生成與測試
平衡效率和質量核心是控制單個任務不要過大,當下過大的任務質量和驗證過程都會失控。
  • 拆解子任務分步執行:和AI共同完成技術方案後,可以要求其將技術方案分成多個子任務,然後子任務分步執行、驗證、調整。
  • 讓AI按照技術方案寫測試程式碼:確保核心場景單元測試都能覆蓋到,避免我們成為AI的填坑奴隸。更進一步是讓AI生成整合測試、端到端測試(嘗試中)。
  • AI自Review程式碼:根據技術方案生成程式碼之後,可以要求AI根據技術方案檢查下當前的程式碼變更,是否有錯漏的。
對AI的約束模型為了獲得獎勵,有時候會用作弊的方式假裝滿足使用者的要求
  • 作弊問題:當AI反覆多次無法完成任務時,就會出現作弊現象,比如硬編碼繞開測試、模型自己直接給出結果等。可以在規則中明確禁止,禁止繞開需求直接生成結果,如無法完成時可以明確表示無法完成。
  • 超額輸出問題:無論是技術方案還是程式碼都存在超額輸出的問題,AI可能會輸出一些不著邊際的方案或程式碼,可以將這個問題儘量在技術方案階段限制住,在生成技術方案時要求儘量簡潔、專注技術方案,不必生成工期之類的內容,在生成程式碼時要求嚴格按照技術方案生成程式碼。
多工並行開發Cursor本身支援多工並行開發的能力
  • Cursor多子任務:將技術方案分成多個子任務後,可以在CursorIDE中同一個專案開啟多個子任務並行開發,每個子任務分別驗證。
  • Cursor Background Agent:非同步程式設計Agent,在雲端環境啟動虛擬環境執行開發任務,但是需要上傳程式碼到Cursor的雲端環境,在團隊版的Cursor中強制開啟因素模式,無法使用Background Agent。
開發過程持續更新記憶類似上文提到的,記憶是逐步完善的,不是一蹴而就的,需要在過程中持續完善記憶。
  • 記憶與程式碼不匹配:無論是哪一層的記憶,如果開發過程中發現有缺少或不恰當的,可以直接要求AI根據特定程式碼修正記憶文件。
  • 經驗總結回寫記憶:如果在開發過程中,發現有一些規範或場景在規則中沒考慮到的,可以完成一個子任務後,要求AI總結經驗,並且使用簡潔的方式回寫到對應記憶文件中。

2.3.1. 對AI的約束示例
AI作弊的CASE:在一個JSON轉HTML的任務中,cursor在多輪迴圈無法解決問題之後,直接生成了一個html的結果檔案給我,繞開了使用程式碼生成html的要求。

嚴格按照要求執行示例
- 禁止作弊:對於生產程式碼和測試程式碼的生成,需要完全遵循框架和需求的要求,**禁止透過硬編碼的方式直接生成結果或繞開測試等行為**- 嚴格按照要求寫程式碼:如果我提供了開發任務的.md文件,請嚴格按照文件要求生成程式碼,不要擅自發揮。- 保持簡潔:專注按照我的需求生成技術方案。在沒有明確要求時不包含開發計劃、風險控制、上線計劃等冗餘內容
2.4. 工程師的基礎能力
  • 對模型能力的動態認知清晰的認知當前AI的能力特徵和極限,並且隨著模型能力的提升,能夠快速的形成對新模型的新認知,改變自己的行為模式獲得更高的效率、質量。
  • 管理多個AI程式設計工具透過上下文工程、AI並行開發協作方法驅動多個AI程式設計工具,放大技術槓桿的效果。如Cursor多子任務、Cursor Background Agent、Claude Code多子Agent例項等並行開發手段。
  • 軟體架構設計能力AI已經能幫助我們很好的處理細節,但是在企業級複雜系統中,AI當下依然是個執行角色,我們需要作為軟體系統的主導者、控制者、設計者,讓系統在預期之內演進。(自己能夠處理細節的能力依然重要)
  • 業務理解與表達當AI已經能夠處理很多的技術細節時,深入的產品業務理解能力和清晰的表達能力,未來是新的程式設計技巧。
三、真實的使用案例
3.1. 初始記憶維護
使用示例
Cursor規則描述

Cursor自動生成
應用基礎記憶
輸入指令:/Generate Cursor Rules 

要求生成特定的規則

基於應用基礎記憶
結合程式碼入口生成
功能模組記憶文件

3.2. 技術方案生成
使用示例
基於功能
模組記憶
生成迭代
技術方案

3.3. 程式碼開發與測試
使用示例
執行開發任務

執行開發任務

複雜任務拆解
輸入指令
將這個方案拆分為多個子任務,並且細化到可供Cursor執行的程度。

任務過程中反思

同項目並行開發

Playwright 
MCP
端到端測試
基礎處於不可用狀態,執行了5~10分鐘,無法處理日期元件等複雜元件。

四、AI程式設計領域的最新趨勢
4.1. 程式設計工具對比
Cursor依然是當下實用性和價效比較高的程式設計工具,但Claude Code的高任務完成度和其形態的高可玩性正在快速蠶食Cursor的使用者市場。以Devin為代表的端到端非同步Agent由於其較低的任務完成度,已經逐漸失去了使用者的信任,處在黑暗中掙扎的階段。(此處僅對比當下有代表性的2款熱門工具)
近期Cursor的訂閱模式的改變(Pro不限量)也可以側面感受到來自ClaudeCode的競爭壓力,從能力層面上ClaudeCode目前更強一些,但是Cursor放開Pro訂閱的使用限制,是從成本和用量上拉開優勢進行錯位競爭,先留住使用者,再追趕能力。(個人理解)
4.2. ClaudeCode使用體驗
  • 特點:原生任務規劃能力+Claude4任務完成度比Cursor更高,但是費用也更高。

  • 費用:費用高主要體現在20$每個月的訂閱版本無法作為主力開發,其額度5小時重新整理一次,但是1個額度週期只夠開發1小時(真實使用),達到額度後要等下一個5小時週期。解決額度問題需要升級每月100$/200$的MAX版本,或者使用API訪問。不過API的費用更加高昂,使用claude 4 sonnet1個任務要花掉2$(opus5倍價格)。
  • 並行開發:Claude Code原生整合Agent功能,在任務分解後可以讓其自行啟動多個子Agent並行開發,由Claude Code統一管理。
  • 解決複雜問題:在一個真實需求中,需要將格式不固定的JSON轉成HTML,在Cursor使用了100次的額度、2-3個小時、嘗試了3個方案依然無法符合要求。Claude Code溝通了3-4次完成了可執行的MVP,10次左右達到預期效果。
  • 無監督執行時長:Claude Code跳過許可權提示後(–dangerously-skip-permissions),在無額度限制的情況下連續執行的時間遠超過Cursor,社群有連續執行數個小時的例子。(Cursor的連續工作最大限制是25個tools)
  • 無監督自主開發的Agent是否具備條件:強如Claude Code,雖然持續執行的時間更長,但是依然很難做到長期無監督的執行。核心的問題是前期輸入資訊的完備性和後期的程式碼驗收依然是個很大的挑戰,執行任務的複雜度越高、無監督時間越長,結果越容易失控。
使用示例
安裝和啟動
# 安裝(需要NPM)npm install -g @anthropic-ai/claude-code# 進入專案目錄cd ~/your-project# 啟動claude
啟動檢視
使用了claude-code-router介入openrouter api的介面,訂閱使用者稍有區別

執行模式

建立技術方案

拆解子任務

並行開發

達到限額

ClaudeCode
工具集

ClaudeCode
解決真實問題

通義千問3 + MCP:一切皆有可能
MCP 協議透過標準化互動方式解決 AI 大模型與外部資料來源、工具的整合難題;通義千問3 原生支援 MCP 協議,能更精準呼叫工具;阿里雲百鍊上線了業界首個全生命週期 MCP 服務,大幅降低 Agent 開發門檻,使用者只需 5 分鐘即可構建增強型智慧體。
點選閱讀原文檢視詳情。

相關文章