关于这个问题,首先要知道什么是架构。在软件开发中,架构普遍指通过某种特定的平台,而达到完成整体软件功能的设计过程。架构是软件设计中非常重要的一个环节只要需求和架构确定之后,我们认为这个软件也就基本上可以定型了。
软件架构的主要目的是希望能重用以前的代码和设计,从而提高开发效率;在保持系统稳定的前提下,扩充功能和性能。

如何提高系统设计能力
一般而言,开发人员在从事开发3年后基本可以逐步做出初步设计,再做设计3年基本能够具备架构设计的能力。架构设计虽然高屋建瓴,从顶朝下对问题进行分解并最终解决,但是你会看到真正所有能力却是来源于你日常的编码和日常功能模块设计的大量实践积累。
当然大部分软件开发人员并一定能够在其中具备软件设计能力,这涉及到思维意识的转变问题。比如前面提到的架构要具备自动化和复用,在设计阶段要有分层、分解、抽象、聚合等思维能力。
比如一个边缘设备日志收集上报云端功能,别人告诉你采用MQ去接收日志上报到云端,你去编码实现,那么具备的是编码能力,但是你自己能够对问题进行分析和建模,参考比较各种方案后,得出采用Kafka去接收并上报日志到云端,效率最高,并最终实现,那么就是具备了设计能力。
因此在日常的编码工作中,需要刻意去培养这方面的软件设计能力。
在架构设计领域,需要站在更高的层次,你面对的是一个完整的业务系统的构建。这个业务系统包括了底层技术框架的搭建,开源组件的选择,开发框架和分层设计这些非功能性的设计内容,同时考虑如何对各种业务进行分而治之。
架构设计能力的培养,我觉得可以从如下几个方面进行:

1.务实技术基础
想要造高楼,基础必须要扎实,这里以Java为例,需要务实的基础有:Java基础、高并发、JVM优化、设计模式、数据库和索引。
现在有很多好的视频网站,能找到视频教程,比如哔哩哔哩,视频教程有个好处就是可以快进,回退,并且看起来比较轻松,我喜欢看书,书看的比较仔细推荐书籍有:《On Java》(新版Java编程思想)、《Java并发编程的艺术》、《深入理解Java虚拟机》、《高性能Mysql》、《HeadFirst设计模式》。。。。。。
一边看书,一边实战、一边记录写成博客系列教程,同时又能锻炼自己的文笔和口才,说不定还能收获一批粉丝,打造自己的个人IP,扩大自己的影响力,如果写的好的话,还能转成收费专栏,还能有一部分收入。
2.培养软件设计能力
设计能力往往就是从编码和编程思维开始的。
首先是将重复的东西自动化掉,其次是将相似的东西通过参数抽象变成可复用的方法或函数,在抽象后来实现自动化。其次就是自动化后你会发现如何更好应对变化,为了应对变化你做了更多的抽象或接口设计,在这个过程中逐步积累设计能力。这一个步骤你会发现你的就是某种设计模式来解决的问题。
其二就是编码积累到一定量后,你可以看软件架构设计的书籍,先形成设计的完整思路和方法论,也可以看设计模式类的书籍,对设计模式有一个完整的了解,能够将日常编码实践的内容和设计模式进行对比分析。这样再遇到类似的问题,你可以少走自己探索的弯路等。
但是以上也仅仅解决了设计能力的问题。
没有解决架构思维层面的问题,架构思维的核心是全局能力,是高度的抽象和建模能力,是既要清楚业务,又要懂得技术的相互衔接能力。
当然大部分架构设计人员更加热衷于开发框架,技术平台,开源组件选择等,而忽视了如何从一个业务需求的提出,你能够通过系统分析,得出整个业务系统应该如何划分模块,如何设计接口,如何设计整体数据模型和数据库来支撑业务,同时你也能够想清楚你需要遵循什么样的开发框架和模式以及分层架构来完成某一个功能模块的开发。