2022年技术总结:日历系统与逆向工程

又到年底了。回顾2022年,技术上做了两件比较大的事:日历系统开了个头,逆向工程入了门。其他零散地学了些Rust和Go。

日历系统

这个项目从年中开始做,到现在半年多了,写了六七篇博客记录过程。目前的状态是:后端核心功能基本完成(事件CRUD、重复事件、时区处理),前端的月/周/日视图能用了,CalDAV协议的基本同步跑通了。

做这个项目最大的收获不是写了多少代码,而是理解了几个复杂领域的本质:

RFC协议不是天书。之前看到RFC文档就头大,觉得那是"标准委员会的人"才能看懂的东西。做了日历系统后发现,RFC 5545(iCalendar)、RFC 4791(CalDAV)这些协议写得其实很清楚,只是信息密度大,需要耐心逐段啃。读完之后对"什么是好的协议设计"有了直觉。

时区是真的复杂。之前以为时区就是加减偏移量,做完才知道DST、历史时区变更、浮动时间这些坑有多深。Java的java.time包设计得确实好,强制你区分Instant、LocalDateTime、ZonedDateTime,看似麻烦,实则避免了大量隐性bug。

CalDAV同步比想象中难。不是技术层面难,而是各个客户端的实现差异大。Apple Calendar、Google Calendar、Thunderbird在处理某些边界情况时行为不一致,调试过程很痛苦。

项目还远没完成,2023年要把权限系统、共享日历、提醒通知这些做完。

逆向工程

下半年开始学逆向,主要是出于好奇——想知道那些没有源码的程序内部是怎么工作的。

学了两个工具:IDA Pro和Ghidra。IDA是行业标准但要付费,Ghidra是NSA开源的免费替代品。两个都用了一段时间,对于我这个初学者来说Ghidra已经够用了,它的反编译器效果出乎意料地好。

做了几个练习:

  • 分析了几个CrackMe(逆向练习题),从简单的字符串比较到复杂的加密校验
  • 逆向了一个小型的客户端程序,搞清楚了它的网络协议
  • 尝试分析了一个游戏的存档格式,成功写了个修改器

感受是:逆向工程对理解底层系统有极大帮助。看过汇编之后,再回头看C/C++代码,对内存布局、函数调用约定、编译器优化这些东西的理解完全不一样了。

Rust和Go

这两门语言今年持续在学,但说实话进度不如预期。

Rust方面,把The Rust Programming Language看完了,做了些小项目(命令行工具、简单的HTTP服务器)。所有权系统和生命周期到现在也不能说完全掌握,经常跟编译器搏斗。但能感受到Rust的设计哲学是对的——如果你的代码能编译通过,大概率是正确的。

Go方面,用它写了几个工具脚本替代Python。Go的goroutine和channel确实好用,标准库也很全。写Go的体验就是"没什么惊喜但也不会出错",就是那个感觉——无聊但高效。

ChatGPT

11月底ChatGPT发布,我试了之后非常兴奋(专门写了一篇博客)。这东西对程序员的生产力提升是肉眼可见的,我已经在用它来写样板代码、学新概念、调试问题了。

2023年AI领域肯定会有大动作。GPT-4大概率会发布,其他公司也会跟进。作为开发者,我觉得应该尽早拥抱这个工具,而不是排斥它。

2023年计划

  • 日历系统完善:权限、共享、通知、移动端适配
  • 支付系统:一直想做的项目,打算用Spring Boot + 微服务架构
  • AI探索:深入了解大语言模型原理,学学prompt engineering,也许试试fine-tuning
  • 逆向工程进阶:学习动态分析(x64dbg/Frida),研究反混淆技术
  • Rust实战:用Rust写一个真正的项目而不是玩具

今年写博客的频率比去年高了不少,2023年继续保持。