← 工程作品集 · 项目 06(持续运维)的真实案例
🗺️ 活了 7 个月的 GIS 工具
小林 · 16 岁 · 生态社团的真实需求
背景 · 真实使用场景
小林 16 岁,是学校生态研究社团的技术负责人。社团每个月会去野外调查(森林、湿地),需要标注发现的植物物种和位置。一开始用纸质记录加 Google Maps,特别低效。小林想:"我能不能做一个网页工具,可以在 iPad 上用,能标注坐标、拍照、记录物种?"
从上线到 7 个月后:真实的"持续运维"
- 第 1 个月(上线): 基础版本,可以标注点、存照片。6 位社员开始用。
- 第 2 个月: 用户反馈"离线能用吗?" 不能,因为需要网络上传。改成本地存储 + 离线同步。
- 第 3 个月: 发现了真实 bug:在 iPad 上用时,地图加载很慢。优化了 tile 加载策略。
- 第 4–7 个月: 持续改进:加数据导出(CSV)、加植物物种库查询、改 UI……
Changelog(实际的 12 项改动)
v1.5 (2026-05-02) - 导出为 KML + Users can now export field data as KML for ArcGIS - Removed broken PDF export ~ UI tweaks for mobile v1.4 (2026-04-10) - 物种库离线支持 + Added offline species database (500+ plants) + Search by name/family when offline v1.3 (2026-03-18) - 性能修复 ! CRITICAL: Fixed iPad map tile freezing + Optimized tile cache strategy + Reduced memory usage by 40% v1.2 (2026-02-25) - 离线同步 + Offline mode: save locally, sync when online + Detect network changes automatically v1.1 (2026-02-05) - 首个稳定版本 + Multiple photos per point + Species name autocomplete - Removed map rotation (confused users)
Sentry 错误追踪(实际数据)
【Sentry Dashboard 截图说明】 Error 1: "Cannot read property 'lat' of undefined" 发生次数:3 用户:小王(iPad 用户) 原因:地点标注时网络中断,坐标对象为 null 修复:加 null check Error 2: "IndexedDB quota exceeded" 发生次数:5 原因:用户一次上传 200+ 张照片,超过本地存储 修复:加压缩 + 自动清理 30 天前的数据 Error 3: "Geolocation permission denied" 发生次数:8 用户体验:用户忘记授予定位权限 修复:加更清楚的权限提示 【总结】 - 8 条记录的错误,全部已修复 - 平均 issue 生命周期:2 周(从报告到修复) - 0 条"未解决的严重错误"
真实发生的故事
一个野外 bug: 某次野外调查,在一个山坡上,小王同学的 iPad 网络断了,工具还在用(因为做了离线支持)。但标注了 30 个点后,回到有网络的地方,数据没有同步上来。小林当时就在现场,马上看日志,发现是"离线数据过多时,同步逻辑有 race condition"。当时修不了,用户的数据丢了。小林后来改进了同步机制,加了 transaction lock。
这个少年的思考
小林说:"写一个工具很容易,运维一个真实用户在用的系统很难。我现在每周都会看 Sentry dashboard,看有没有新错误。如果有用户报问题,我通常 24 小时内就出 hotfix。这才是真的'工程师'的感觉 —— 不是代码写完就完了,而是系统在线上活着,要去照顾它。"