这几期和大家分享了我自己在开发时的一些经验,这次想说说如何写出更好的代码。

目标

我们写代码,都是为了完成某个功能,为某个系统服务。我个人在这方面的目标是:要做出10年都能稳定运行的系统。

如何做

如果想做到这一点,我觉得最重要的是要做到从整体去看待问题,具体来说:

  1. 系统运行都需要哪些环境,如服务器、数据库、机房、网络等。
  2. 系统在运行时,会遇到哪些问题。
  3. 如何更好地设计系统,层次清晰。
  4. 代码清晰易懂。

系统运行时会遇到的问题

我经常听到某些编程同学说:这是个运维方面的问题,不需要我们做。但我认为恰恰相反,通常就是这些所谓的运维方面的问题,会决定你的系统是否能够稳定运行10年。

正是前几天,我和一个公司高级别的技术同学沟通,他的一个观点我特别的认同:真正评价一个系统好坏的标准,性能高低不是最重要的,可运维性才是。

这里先来说说我觉得需要掌握的运维知识:

运营商和机房

国内的运营商,最重要的就是电信和联通,这些年移动有所增加,但也还比不上前面两个。

按照我之前的经验,一个用户服务,6 - 7成的用户走电信线路,3成联通线路,其余各种小运营商线路。

那么你的服务如果想要用户体验好,至少需要部署在电信和联通两个线路的机房。

有人说,我们有多线机房。也可以啊,但是为了你的服务可靠性考虑,你也需要至少两个吧,否则一个挂了服务就全挂了。

那么再说两个机房的选择,我认为在同城选择两个是最好的,当然这个城市也要可靠,比如北京、上海这种大城市就会可靠很多。

为什么呢?

是因为通常我们都会有存储的需求,就拿mysql举例:你为了保证性能和数据的一致性,通常会在访问量较高的电信机房配置主库,联通机房配置从库。而同城间的网络传输更加可靠,你的服务也会更加可靠。

所以,运营商和部署机房的选择,十分的重要。

机房间的异地多活问题

上面提到的mysql的那个例子,试想一下,如果电信机房挂了,我们把服务切到联通,但是联通的mysql是从库只读,那么服务有问题啊。

所以在你的系统设计中,异地多活这个问题我觉得是一定要考虑进去的。你的解决方案并不能仅仅只是可用,而是要好用才行。

服务器选型

我之前有过这样一个经历:服务扩容,我在新机器上部署后,发现性能不如老机器。

经过多方排查,最终定位发现新机器和老机器不是同一厂商生产的,最终推送公司测试发现新机器厂商的这批机器存在质量问题,所以后来有段时间我们申请机器时,会特意提出要求不使用这个厂商的机器。

新的服务平台的选型

最早我们的服务直接部署在物理机上,后来公司大推虚拟化,到现在也尝试部署在容器服务中。

我想说的是,你把服务部署在哪里,你还是要了解那个平台的相关知识的。就比如容器吧,我觉得并不是只会使用就行了,还要尽可能多的了解它的相关知识,明白可能存在的问题,这样才能有助于你做出更好地决策。

服务监控

我们的系统上线正式运行后,可能会出现各种各样的问题,如磁盘写满了;进程突然挂掉;内存缓慢泄漏;mysql等存储出现问题等。

这些问题出现并不可怕,你也无法做到全部避免,所以我们需要做好的,是服务的监控报警,有问题第一时间发现,快速解决。

记得我的一个leader告诉我,代码上线出现bug不可怕,但如果没有第一时间收到报警发现问题,才是最可怕的。这一点至关重要!

不断精进

除了上面说的,自己的不断精进也是十分重要的。

这需要自己不停学习新知识,不断反思做过的事情。我有时觉得,自己之所以选择编程这条道路,就是能很享受自身不断精进的所带来的满足感。

最后,我再分享下自己这些年在编码方面不断改善中一直在做的几点:

  1. 看好书
  2. 对做过的项目要总结、反思
  3. 自己觉得不好的地方坚决重构,没有时间只是借口

最后,再用一句话总结下:我要让我做出的系统能够稳定运行10年。