我的项目开发手记

The user wants me to write a personal experience note (手记) about using TraeCode based on the template and their completed project. This is a writing task, self-contained. I know the project from conversation history: RK3568 environment monitor terminal with LVGL GUI, camera, AI YOLOv8, TCP file transfer, sensors, etc.

I should write it in Chinese, first-person, following the four-part template. Based on project history: solved bugs like thread safety issues, self-file-transfer interception, recursive delete, model path hardcoding, TCP protocol work, etc. The person seems to be a student/learner doing embedded Linux development (RK3568), likely job-prep or course project.

Write naturally, not too long. No file creation requested — “写一篇手记” — probably just output text. They said “根据以上手记提示模板和我现在完成的项目,写一篇手记” — output in chat is fine.

我的手记:用 TraeCode 做完一个 RK3568 环境监测终端项目

我这次想解决什么

这次我做的项目是一个跑在 RK3568 嵌入式 Linux 开发板上的环境监测终端。它不是一个小 Demo,而是要同时干好几件事:V4L2 摄像头采集画面、YOLOv8 做本地 AI 推理、LVGL v9 画 GUI 界面、GY39 传感器读温湿度光照、PWM 蜂鸣器和 LED 流水灯做硬件交互,还有一套自定义协议的 TCP 通信,支持多客户端聊天和文件互传。

我想解决的问题很典型:这种多线程、多模块的 C 项目,一个人从零写到能跑,坑实在太多了。线程安全、资源泄漏、粘包处理、设备节点权限……每一个都能卡我半天。所以这次我决定全程拉着 TraeCode 一起写,看看 AI 结对编程在嵌入式这种“偏门”领域能不能顶得住。

我是谁,为什么这件事对我重要

我目前处于自学加项目实战的阶段,目标是把嵌入式 Linux 方向的工程能力补扎实——不是跑通一个点灯实验就完事,而是要能独立完成一个有网络、有界面、有硬件、有 AI 的完整系统。

之所以想在现在试试 TraeCode,是因为我发现自学最大的瓶颈不是“看不懂”,而是不知道自己写的代码哪里埋了雷。比如 localtime 非线程安全、system("rm -rf 'path'") 有命令注入风险这种事,书上很少讲,踩到了才知道疼。我需要一个能帮我审查代码、指出隐患的“同事”,而不是只会生成代码片段的工具。

我是怎么把 TraeCode 慢慢用顺的

一开始我也走过弯路:直接把需求整段扔给它,然后拿到一大坨代码往工程里贴,结果风格对不上、接口对不上,改起来比自己写还累。

后来我慢慢摸索出了几个让自己顺起来的用法:

1. 先让它读懂项目,再让它干活。 我会让它通读我的模块代码再回答问题,比如“服务端能不能处理多个文件传输任务并发?”它能顺着状态机和会话数组一层层分析给我看,把“不同客户端支持并发、同一客户端受状态机限制”这种结论讲得明明白白。这比我自己翻代码快多了。

2. 让它当“审计员”,而不是“码农”。 最让我惊喜的一次是我问它:yuyv_to_rgba8888 必须放进锁里执行吗?它没有直接改代码,而是先分析出“转换的是空闲缓冲,UI 线程读的是活跃缓冲”,然后给我对比了加锁和不加锁两版方案,还指出原来 active_idx 存在 data race。最后我按自己的偏好选择了拆出双锁分别保护的方案,它立刻配合实现。

3. 让它做“脏活累活”。 服务端断连保护、客户端给自己发文件的拦截、递归删除目录替代 nftw 依赖、把模型路径从半配置半硬编码统一成硬编码并顺手调整 UI 布局——这类活儿逻辑不难但琐碎,以前我最容易在这种地方犯懒留下隐患。现在我把场景描述清楚,它先分析会发生什么,确认了我理解正确再动手改,改完还会告诉我测试用例该怎么验证。

让我觉得“原来这样用会更顺”的转折点是:把“提问”换成“场景描述”。 与其说“帮我修 bug”,不如像复现实验一样把操作序列贴给它——比如“A 向 C 发请求,C 不回应,C 再向 A 发请求会发生什么”。它就能顺着代码把每一步状态变化推演出来,甚至纠正我自己的错误认知(有一轮它说数据包会“交错”,我反问“套接字不是独立的吗”,它想清楚之后大方承认自己说错了——这种能对上话的感觉,比单方面接受答案踏实得多)。

我最后做成了什么,想给后来的人留一句什么建议

最后我跑通了完整的项目:多线程摄像头采集 + 本地 AI 推理 + LVGL 界面 + 传感器监测 + 多客户端 TCP 聊天与文件互传,并且修掉了一批实打实的 bug——GY39 线程因返回值约定不一致永远启动失败、AI 线程忙等 100% CPU、UI 删除目录的命令注入、双缓冲帧的锁保护、发送方断连后的会话清理等等。

比代码更重要的是,我现在对多线程项目的常见雷区有了肌肉记忆:共享变量谁在读谁在写、锁的粒度怎么定、fd 和线程退出时怎么优雅回收、第三方协议文档和实现对不上该信谁。

如果推荐给下一个人,我的建议是一句话:别把 TraeCode 当生成代码的机器,把它当成一个需要你把场景讲清楚的资深同事。 你负责描述“我在做什么、期望什么现象、实际发生什么”,它负责推演、分析、指出你没看到的坑。你来判断方案,它来执行细节——这个分工一旦建立起来,你会发现自己不仅写得快了,而且比以前更懂自己写的代码。