关于 App 开发的一些思考

Posted by liangfei on 2017-02-04

春节假期在家看了两本关于 Web 架构方面的书,虽然有很多地方没看懂,有的地方似懂非懂,但是俗话说,他山之石、可以攻玉,知识是相通的,试着总结一下对 APP 开发的一些启示。

关于工具

很多时候 Web 开发者通过 ssh 登录到远程服务器,只能利用 terminal 来进行排查日志、更改配置等操作,虽然 GUI 确实能起到事半功倍的效果,但是对于不习惯命令行的同学,面对黑屏上快速滚动的字符估计要懵逼了。

App 开发可能只依赖 GUI 就能搞定大部分工作,但是熟练的命令行操作也是必不可少的。

  1. 修改文件(hosts、bashrc 等)
  2. adb logcat 抓日志
  3. Gradle 的各种 task 操作
  4. git 各种操作

但是过度依赖命令行会走入另一个极端 - 排斥 IDE,其实不必执着与此,工具嘛,只要能提高工作效率,怎么用都可以,运用之妙、存乎于心,但是前提是要熟练,代码写累了,心情低落时可以学学工具。

工欲善其事、必先利其器,熟练掌握了 git 命令,就不会担心把代码弄丢了,当然,加班到深夜的时候,不要轻易执行 git reset --hard

关于日志

日志是 Web 开发中很重要的一块数据,很多错误排查和数据回滚都是从日志开始,而且系统的运行状况、用户操作路径也是从日志中获取,所以 Web 端对日志的重视程度要远远超过 App。

很多初创型公司的 App 会直接集成第三方数据平台(TakingData、umeng、GrowingIO 等),而且随着无痕埋点技术的发展,只要接入了 SDK,就可以很轻松地获取各种数据(Crash Report、DAU、PV、UV) ,除了一些业务埋点,好像忽视了日志的重要性。

App 开发无法像服务端那样动态打日志,所以我们要想办法弥补这个劣势,其实阿里开源的 AOP 框架 dexposed 其设计初衷是为了实现远程在线 Debug,只是恰好也满足了 hotpatch 的功能。

可以设想一个场景,有一个线上 crash,但是以现有的条件无法无法复现(可能没有设备,或者即使有设备 rom 版本也对不起来),比较理想的做法是在 crash 方法的前后打上日志,生成 patch,然后定投到发生 crash 的设备上,这样以来就可以很容易定位到错误位置,有点类似 TalkingData 的灵动事件,当然具体实现起来可没这么简单。

关于安全

App 开发貌似习惯了追着服务端的步伐走,特别是在业务量较大的情况下,双方约定好加密算法之后就分头行动,写完代码,联调 OK ,然后皆大欢喜,但这并不代表万事大吉,因为 App 端很可能把敏感数据(摘要认证的盐或者签名认证的私钥)写在了本地,导致恶意攻击者可以很容易拿到这个数据,进而发起 DDos 攻击,而 Web 开发可能根本不关心这个问题,因为用户拿不到他的代码,除非发生泄露。

再说到 HTTPS,有很多安全性要求不高的 App 可能只需要单向认证就够了,但是我们必须要知道 HTTPS 还有一个双向认证。

为了防止 DNS 劫持,App 会接入 Http DNS 或者 DNSPod,但是不要忘记 SNI 的问题,当前测试条件下可能会没问题,但是也要考虑到证书认证不通过的情况,这就要求 App 开发者要搞懂证书认证的原理。

虽然两个端开发人员的安全意识不一样,但是安全问题却是相通的,我们不能简单地以为联调 OK 就没事了,知其然更要知其所以然,不然很可能会被 AI 取代。

关于缓存

Web 端有很完善的负载均衡方案,包括扩容、限流,App 开发大部分情况下不需要考虑 qps、rt 等指标,即使做了本地缓存,也可能是从用户体验角度出发,不用每次进入页面都要去请求数据,而且缓存方案可能很粗暴(直接把 response 存储到一个 LruCache 中)。

我们更多地应该从 HTTP 协议角度来处理缓存,例如要求服务端返回 304、Response Header 带上 ETag 等等。

如果服务端无法满足要求,也应该尽量利用网络 SDK 的特性去实现缓存功能,而不是仅仅为了完成一个功能。

这就要求 App 开发者不仅要懂的 HTTP 协议,还要熟读网络 SDK 源码。

关于数据

个人觉得 Web 开发中数据处理是最有意思的,App 端的数据处理相比较服务端而言简直是太简单了。

根据不同的业务需求或者数据来源,服务端都有不同的处理方式,例如无穷无尽的流式数据,需要实时或者离线计算的数据,还需要组建数据仓库。

我们 App 端虽然不需要处理大数据,但是要从性能角度去规划存储方案,例如什么情况下应该用 SharedPreferences,什么样的数据应该存储在 SqlLite,Disk、Memory 应该怎么协调等等可以性能调优的地方。

最后

等我把现在没看懂的地方搞懂了再继续写吧。

参考资料

  • 《大型分布式网站架构设计与实践》
  • 《大型网站系统与Java中间件开发实践》

欢迎扫码关注 老梁写代码 微信公众号