关于系统架构的自问自答

最近,由于工作的原因,有了不少时间来思考系统架构。

这个话题我也不止一次思考,但每要整理时,总是感觉没有头绪,无从下手。因此,决定通过自问自答的方式,通过一点一滴,希望有所进展。

除此之外,在这里整理的另外一个目的,是为了将我的想法放在开放的环境中,希望能够得到大家的指正。


问:有没有更先进的架构

答:没有更先进的架构,只有更加合适的架构。

这个问题是我最近遇到的关于系统架构的问题。是我的一个同事,进入一个新项目后向我提出来的。

当我被问及这个问题时,我感觉一头雾水,当时我正在实践容器和Microservice,因此,我立即将容器和Microservice的架构抛给了他。经过更详细的了解以后,我得知他对这个项目也不甚了解,只是觉得代码有些乱,想改变一下局面,因此,就决定从系统架构的层面来解决问题。

事后好几天,我不时想起这个问题“有没有更先进的架构?”。它之所以让我放不下,是因为这里实际上讨论的是“有没有万能的系统架构,在讨论这种系统架构时,我们可以不考虑业务需求特性,团队特性,开发语言特性等”。是的,我们也可以将这个问题上升为哲学问题。

经过几天的思考,就我目前的水平来回答,答案是:没有更先进的架构,只有更加合适的架构。

如果我们发现代码有点乱,那可能不一定是架构的问题,可能是设计模式,编程风格的问题。说实话,在我的工作生涯中,我也不止一次看见一个良好架构的系统里面充斥着欠佳的代码。这也是我为什么在选择团队成员时,更看重设计模式方面的能力,而不是架构方面的知识。

那么,我们一般对系统架构的诉求是什么呢?我在网上搜了一下,可以归纳为以下几点:

  1. 可靠性
  2. 可伸缩性
  3. 可扩展性
  4. 可定制性
  5. 安全性
  6. 可维护性
  7. 敏捷性

而这些诉求的直接来源是业务需求。因此,离开业务需求来直接讨论系统架构,就有点空中楼阁的意思了。

而这几个诉求,也可以作为我们评判系统架构对于某种业务环境好坏的维度。因此,系统架构的好坏,优良不是绝对的,而是相对于业务需求等因素来确定的。


问:系统架构和各种代码库之间有关系吗?

答:有,并且关系密切。

系统架构的实现依赖于架构师对各种代码库的了解。例如,Java的Structs;Nodejs的Seneca,AngularJs,PM2;Python的Django, Flask; .Net Framework的WCF,WF等。

作为架构师,其职责之一就是建立架构的特性对应于各种代码库之间的关系。


问:架构师如何使自己成长

答:抓住问题,直到这个问题被完全解决。

之前读过一本关于胡适大师的书,里面提到了如何做学问。胡适大师的建议是只要能够彻底解决一两个问题,你就可以成为大师。

的确是这样,在我们的工作中,我们经常会遇到问题,然后在google上去搜索解决问题的方法,最后再用找到的方法来解决问题。然后我们的水平就停留在那里,就没有然后了。

这种方式对工作来说,是非常有效的,但对个人的成长来说,是无效的。

比如,我曾经遇到的一个例子。在linux环境下,我测试一个微服务,发现日志没有成功输出到指定文件。经过多次尝试之后,我发现问题在于我部署的时候,没有停掉承载微服务的docker container。因此,解决方案是,部署前,先停掉承载微服务的container,部署完成后,再启动那个container。

这个问题,如果从工作的角度来说,已经圆满解决。但是如果从知识的层面来说,根本就没有解决。

说到这里,我想补充一下职业(中的)成长,因为我觉得我在这里走了弯路。在工作中,我们会遇到很多问题,但如果对所有问题的解决仅限于工作层面,那么我们的成长将会很有限。充其量,知识的广度在增加,但是深度却变化缓慢。我也曾经因为这个(深度)原因而跳过槽,但是后来发现,即便是跳槽之后,这个问题还是没有得到解决。

胡适大师曾经说过,大学生离开学校的时候,要准备一两个问题来防身。怎么来理解这句话?我的理解是,大学生进入社会,进入工作后,自己的时间将会被各种问题蚕食,最后觉得失去自我。因此,我们要找一两个问题随时放在自己脑子里,不间断的去思考这一两个问题,不断地从深度上去研究这两个问题。

这里,我们可以想象一下自己有一个时间分配的天平,左边是自己防身的问题,右边是工作,生活中的各种问题。左边的是为了自己的深造,右边的是为了生存,为了挣钱养家。


阅读更多

没有更多推荐了,返回首页