千门万户曈曈日,总把新桃换旧符。农历新年到了,才有新年的感觉。

总结下来:年纪加一,工作经验加一,存款减减减减。

今年开始可以把博客中About页面的iOS、Swift和Objective-C技能移除了,因为不同于17年和18年的时候,19年完整地写了一年的Go。

Orne Brocaar的代码吸收完毕,因为loraserver进入3.0阶段后核心功能没有太多变动,主要是代码重构以及公有云适配,继续合并的意义不大,19年初的时候就停止合并工作,转入iotsquare的应用层开发。今年主要做了一些组播、ADR调速的工作,还有网关Bridge程序,然后是部署相关优化,例如分区、多机器部署等,当然技术对接的工作也没有停过,一直都是部署NS、对接、优化、技术支持。最后是重构(厚积而薄发啊,三年了),彻底移除掉对Orne Brocaar的项目依赖,将优化过N次的loraserver和lora-app-server代码整合进iotsquare,节点数据到达服务器后,只需要在同一个进程里的goroutine中流动了,在同一个进程的堆栈上操作数据相比使用RPC方便了很多,合并后也有一些新的功能,例如节点上行探测、多频率计划支持、数据库简化等等等等,总之有越来越多的想法冒了出来,协议栈的性能也有了质的突破。

所以说,人手不够时候要专心做好单体应用的模块化、接口化,避免微服务,当业务和团队都达到一定规模后,也方便进行重构迭代。

除了业务外,今年也开始看标准库和runtime的代码,从最初完全看不懂进入逐步理解的状态了。标准库中的协议实现结合RFC文档是最容易理解的,因为也有其他语言的实现可以参考,而runtime是最难的,完全是Go风格的C语言,耦合严重、迭代迅速、缺少文档,简直不能再糟糕,好在MPG调度、基础数据类型实现等没有没有过大变化。标准库和runtime最大的意义就是作为参考了(就像参考答案),语言的风格、库的封装等,经过常年的累积,已经是最佳实践的体现。

最后是未来的规划,也是每年写总结时才会认真思考的东西。一年前的时候可能还会认为需要进一步提升系统负载、拓展协议栈功能,而完成重构后却发现协议层已经很难有太大的改变。

举第一个例子,一台配备8GB内存四核心八线程高主频阿里云ECS,可以轻松处理每日200万条数据,从后台的系统负载统计数据看,即使提升到每日800万条数据,依旧可以支撑住。Go程序对并发的优化使得单机性能可以充分发挥,在自己的双路E5台式机上尝试过压力测试时也可以跑满所有的核心,达到5767.42包/s的处理速度,单机配置完全足够应付中小型项目,剩下的任务就是不断提高稳定性,这需要对接更多的大型项目来优化。

举第二个例子,协议栈的高级功能不是所有客户都可以使用到,最常用的场景还是A类,其次C类,最后是B类,还有多播,难度依次递增,我们的任务首先是帮助客户熟悉LoRaWAN,应用LoRaWAN,最后客户的项目落地时,我们才能受益,整个周期非常漫长,许多实时性要求高的场景,需要投入大量精力才能完成,且定制化成本高。

举第三个例子,通信芯片在客户产品的元器件成本中,所占的比例很小。

总的来说,通用的低速应用场景下,整体技术门槛在降低,而定制化和高速应用场景的门槛,普通用户始终是迈不过的。技术红利正在消退,市场逐渐称王。

过去的一年,除了Go、Linux和后台技术外,更多是往LoRaWAN专家的方向成长,解决协议层和无线通信方面的问题,现在是时候开始改变一下思路,往应用层进发了。

Update:补上一张过去一年来的提交记录

gitlab