Appearance
审计拾遗
背景:红石子(高优)和黄石子(中优)清完,桌上还剩三十颗低优绿石子——做了更好,不做也能跑。 过程:分四堆(类型与安全/架构与重构/UI 细节/功能扩展),挑了最显眼的十几颗修了,其余记入"以后再说"。
高风险三颗红石子,中优十五颗黄石子,都处理完了。
桌上还剩三十颗绿石子——低优先级,做了更好,不做也能跑。用户不会因为没做就骂娘,甚至不会注意到。
外交官把它们分了四堆——
第一堆:类型与安全
未使用的 import 清理:有些文件 import 了不再用的函数。删是简单,但要小心——有的 import 有副作用(CSS、自动注册插件),不能 ESLint 自动删,要人工确认。
any 类型收紧:历史遗留的 any,能收紧的收紧为 unknown 或具体类型。272 个 ESLint warning 里真正有风险的不多,全改收益不大,先改高风险。
常量提取:魔数如 if (x > 0.1) 里的 0.1——什么意思?为什么是 0.1 不是 0.2?提取成常量加注释,代码就好懂了。
第二堆:架构与重构
大文件拆分:settings.ts 和 model-detail.ts 都一千多行,找东西不方便,多人改也容易冲突。但拆文件是纯重构,用户感知不到,优先级低。
重复代码抽象:motion-popup 和 library 有相似的列表渲染,scene-menu 和 env-menu 有相似的滑块/开关模式。但需求不稳定时,过早抽象是万恶之源——宁可重复,不要设计错的 API。
事件中心:现在模块间通信各走各路(自定义事件/直接调用/全局变量),应统一事件中心。架构级改动,动静大风险高,等加新功能时顺便做。
第三堆:UI 细节
加载状态多样化:现在全是"加载中…",不同场景可以不一样——"扫描中…"、"加载预设…"、"重建布料…"。用户知道在等什么,心里有数。
空状态设计:模型库为空时,现在是一片空白或"暂无数据"。好的空状态应告诉用户——为什么空、该怎么办。
错误状态设计:加载失败现在是静默失败或控制台 log。好的错误状态应告诉用户——出了什么错、能不能重试、怎么解决。
菜单过渡动画:SlideMenu 进出硬切,可加 200ms 滑入滑出。有过渡用户觉得流畅,没过渡觉得突兀。
第四堆:功能扩展
道具系统滑块配置化:参数写死在代码里,应做成可配置——大小、旋转、位置。用的人不多,所以优先级低。
眨眼调试提示:程序化动作的眨眼很快看不出来,加了调试提示用户才知道有没有生效。
outfit 加载反馈:换装等待时 UI 无反馈,用户可能再点一下导致两套同时加载。加个 loading 状态就安心。
还有十六颗:快捷键自定义、多语言、主题色、导出截图、录制视频、模型收藏夹、最近打开、批量重命名、标签系统增强、搜索历史……全是低优,核心功能稳定了再慢慢加。
低优项的意义
"三十颗绿石子,全是'做了更好,不做也行'的事?"AI 问。
"差不多,"外交官说,"但你别小看它们。高风险决定能不能用——不能崩、不能丢数据。中优项决定顺不顺手——卡不卡、有没有 bug。低优项呢?低优项决定软件有没有灵魂。"
"细节、质感、人情味——单个拿出来都不起眼,放在一起,用户就会觉得'这个软件做得很用心'。"
后来呢
三十颗没全做。做了最显眼的十几颗:import 清理了几个、常量提取了几个、加载状态加了几个、空状态加了两个、过渡动画加了一个。
剩下的记在清单上,排在队尾。等哪天有空,或者用户提了,再翻出来做。
外交官把那堆绿石子收进一个小盒子里。 盒子上写着:「以后再说」。
"差不多了,"他说,"这一轮审计收尾吧。"
窗外的夕阳照进来,把石子染成金色。三颗红的,十五颗黄的,十几颗绿的——都是这一轮审计的收获。
审计结束了。但故事还没有。
附录:优先级判断速查表
| 优先级 | 用户痛感 | 典型例子 | 什么时候做 |
|---|---|---|---|
| 🔴 高 | 会骂娘 | 崩溃、数据丢失、安全漏洞 | 立刻做 |
| 🟡 中 | 会皱眉 | 卡顿、操作别扭、小 bug | 近期做 |
| 🟢 低 | 注意不到 | 代码质量、微优化、细节 | 有空就做 |
优先级不是绝对的。用户反馈多了,低优变中优,中优变高优。随时调整。
教训:低优项不是不重要,是还没到时候。核心功能不稳时去做细节优化是本末倒置;但核心功能稳了之后,这些小细节就是拉开差距的地方——从「能用」到「好用」,就看这些绿石子做了多少。