翻出十年前自己写的 App,我有点恍惚
前几天收拾旧硬盘,翻出一个 2013 年前后写的 iOS 小工具。Swift 还没出,纯 Objective‑C,AutoreleasePool 手写,TableView 的 Cell 复用逻辑自己管,连网络层都是 NSURLConnection那套 delegate 地狱。当时觉得写得挺漂亮,现在看,满屏的 nonatomic retain和嵌套回调,像翻到大学时的日记。
本来只想跑起来怀个旧,顺手给这玩意儿加两个现在才有的功能:一个 iCloud 同步,一个小组件快捷操作。想着反正老代码,就当练手,把项目扔给 AI,看它怎么啃。
结果挺冲击的。
我印象里,光把那套老数据模型迁到 NSPersistentCloudKitContainer,再处理冲突合并,当年至少得耗一整天——写迁移映射、测离线覆盖、反复杀进程模拟断网。这次我干了什么?把 CoreData的 model 文件截图贴进去,用自然语言说了句“把 Note entity 接上 CloudKit,保留本地 fallback”,然后看着它把 NSManagedObjectContext的 merge policy、历史跟踪、初始化时序,一坨一坨吐出来。中间只手动改了一处:它默认在主线程 merge 远程事务,老 App 的 UI 会卡,我挪到后台 context,三行。
一个下午,两个功能,能跑,能同步,能上真机。 搁 2014 年,这是连着两个周末的活。
说不触动是假的。
最开始那几分钟其实是别扭。它生成 NSFetchedResultsController的 delegate 实现时,我下意识去逐行核对 fetch request 的 predicate 是不是把已删除对象过滤干净了——那个 paranoia(多疑)是当年被脏数据教出来的。盯着看了十几秒,逻辑是对的,甚至比当年我写的更稳,因为它没忘在 controllerDidChangeContent:里包 beginUpdates/endUpdates。那一瞬间的感觉很怪:不是“哇好强”,是“我以前靠疼学会的东西,它上来就会”。
然后才是那道老问题:那我现在算干嘛的?
但真坐下来改那个老工程,答案又没那么虚无。AI 把 80% 的搬砖吃掉了,可它搞不定的,恰好是这项目最脏的角落——
-
十年前我为了省一次序列化,把富文本存成了自定义 plist 结构,字段名全是缩写(
bd= body,ct= createdAt)。AI 不知道哪个缩写对应什么业务语义,只能照抄;是我记得bd里塞过一段 HTML 转义的黑历史,才告诉它迁移时得先 unescape。 -
老 App 有个隐藏行为:删除笔记不真删,标记
purgeFlag,七天后清。这个规则没有任何注释,只在-deleteNote:里一行obj.purgeFlag = @(YES)。AI 当然不会主动把它映射成 CloudKit 的软删除策略,是我自己想起来的。 -
小组件的 timeline 刷新,它给的方案在 iOS 17 以下会崩,因为用了
AppIntent的新 API。版本兼容这种事,模型靠训练数据猜,我靠当年被 App Store 拒审三次的记忆。
说白了,AI 读得了代码,读不了我写代码时的犹豫。那些没写进注释、没进 commit message、甚至没进脑内日志的“为什么当初没走另一条路”,才是这次改造里真正值钱的东西。
所以现在我的状态大概是这样:
不怀念一天手写三百行 UI 代码的日子,那确实累,也谈不上多光荣。但我会留一小块地方,偶尔关掉补全,去摸一摸老语言的棱角。不是为了证明什么,是怕哪天 AI 吐出一段看着很顺的并发代码时,我失去那种后背一紧的直觉——知道它可能在锁外读了状态,或者在 dispatch_async里悄悄多 retain 了一次。
十年前写那个 App,我靠编译器和真机 crash 教自己做事。现在编译器变成了会说话的版本。工具变了,但那个最老的活儿没变:你得知道什么时候该信它,什么时候该掀桌。
只是现在“掀桌”的理由,跟之前完全不一样了。
- 点赞
- 收藏
- 关注作者
评论(0)