如何构建一个健壮的软件?

每个人有不同的经验,我想归纳简单、直接的两点:

1)保证线程安全;

2)网络发生错误时自动重试;

这是从我的前老板那里学到的经验,下文称他为“Z”。

1

Z 是一个“明星程序员”,传说中的“十倍速程序员”。

二十多岁时开发的软件卖给大厂,财务自由,出国,买大 House;他在国外头部大厂工作的时候,据说用一个月时间改掉了厂里“一年都没解决的bug”。从经历上看,这是所有程序员的梦想之路。从工作能力上看,他对所有问题都能快速反应,对结果的好坏有预判,能迅速提供严密可靠的解决方案。

Z 是我见过的最聪明的人。

2

看似简单的措施,但却非常有用。经过这样处理之后,很大程度上改善了一个软件的可用性。

关于线程竞争问题,在2018年以前,市面上的 app 崩溃还很常见,IDE提供的自查能力还不那么充分。当时,我们对读写同一个内存值这种偶发情况,并没有足够清醒的认识。后来我们的措施是:

a)任务的发起和回调都在主线程发生;

b)给可能同时读写的值加递归锁。

这样就加固了程序的可靠性,把复杂多变的数据流转控制在加强防守的笼子里。

3

关于错误重试的问题,在应用初起时,或者网络发生变化,外部环境这样那样的不稳定时,难免有失败的请求发生。起初我们想,失败就失败呗,下拉一下就能拉到数据了。Z 说,不对,不要让用户去做这件事,要主动地自动去做。简单的结果是经过复杂的逻辑得到的,不是因为表现简单,我们的程序也简单处理。微信为什么这么稳?肯定在业务底层做了很多看不见基础工作,最后才得到稳定的输出。

经过自动重试处理之后,初次打开app拉不到数据的情况没有了,我们延时1秒和3秒依次做了两次重试(在前一次失败的情况下)。

4

总的来说,看起来没有使用什么特殊技术,无非是把内存管理好,重复请求,没有什么宏大抽象的思想。

有用的思想往往这样,靠表面观察并不容易发现,要么是聪明人的灵光一闪,要么是从无数次挫败和捶打之后的反省中滋生。

Z 的人生第一桶金是靠写一个下载软件赚到的,九零年代有个电脑的人应该都用过,所以为什么让我们“为用户重试”,这是软件“先驱者”的宝贵经验啊!

简单朴素,但却交付了稳定可靠、健壮耐操的结果。