今天在微信公众号有人说工作5年的工程师是否很迷茫?如何打破这种迷茫打破这种瓶颈?说要提升对架构的认知,达到巅峰去认识。
结合自己最近的阅读和思考,简单回答一下这个问题。
理论跟得上,技术永远不迷茫。我这里不谈具体的比特,代码。想简单聊聊架构的“道”与“术”,主要聊“道”。
我们要站在顶层设计的角度去看架构与技术。
为什么架构?架构的起源
从架构上来讲人类文明、社会组织从农耕时代开始就已经在不断地进行架构的拆分与重组,目的都是为了更高效地产生能量,让信息传递更畅通。这样人类、国家、公司、团体、小组织才会更高效,每个个或者小组织去做自己擅长的事情,高效配合共同推动产业进步、社会进步、文明进步,实现共同理想和目标,具体一点比如工业革命,再具体一点比如经济体系,再具体一点比如登月计划,再具体一点比如港珠澳大桥的建设,都需要各个架构下的组织团体高效配合,信息共享。具体到产品架构、技术架构亦是如此。当小个体小单元比如一个函数,一个类,一个软件,无法满足需求的时候,我们就需要更大的系统和软件去支撑我们高效的目标。那么这个时候同样需要架构拆分、架构设计分来设计我们的系统。逻辑上拆分为子系统功能模块,物理上拆分为相互配合各司其职的组件、集群。然后同时组件之间需要通信,于是各种通信手段被催生出来比如MQ,RPC。这些组件在具体业务场景和业务目标下进行有机组合,一起来完成目标。所以我们的软件是需要架构的,这就需要我们领域内的专家对应到计算机领域就是架构师对架构进行设计。达到基本要求(性能、可用性)为基准,简单成本低更优秀,同时能应对日新月异的需求变更(可扩展)就更好了。也是对我们架构设计的要求。一个优秀的架构设计方案就这么出来了。
技术的本质是什么?技术的起源
从技术上来说也就是从文明的起源开始,我们人类就观察个中自然现象并对其进行利用,如尖锐的石头可以用来当追捕猎物的武器。然后对各种自然现象进行组合、改进。比如后来木棒和石斧结合出现了长斧。从自然科学兴起至今,各个学科的技术发展无不如此,计算机亦是如此。从前往后看对已有的现象或者新发现的现象,加上已有技术的组合,有机结合成新的技术。从后往前推,旧的产业旧的技术中,替换掉老旧的不能满足需求的部门演化出新的技术,新的产业。比如互联网、大数据、人工智能对传统行业的改造。技术是推动科技进步、产业发展、经济发展、社会进步的动力。
对于软件工程师来说我们要研究技术的本质的理论,然后在计算机软件世界进行佐证和深化理解最好还产生新的见解反哺理论。了解人类文明、社会发展是如何被技术推动的。进而理解人类社会文明演化中对性能的追求(就像交通工具的发明和排序算法都是为了性能更快,节省出更多的时间,这也是人类社会产生分工的原因,为了更高效,一定意义上节省时间就是对生命的延长,有更多的时间去享受文明,让精神更加富足,更有幸福感)有了技术组合演化的本质发现或者说理论指导我们就能抽象出各行各业各种技术演进的机理。就能于宇宙中看到一粒沙,自然做到胸有成竹,哪怕是从来没有人做到的工程哪怕是之前没有过的目标,我们知道,那一定可以实现。比如说港珠澳大桥的修建,比如高铁的建设。我们知道,这再技术原理上是可以的,是可以通过已有技术的组合演化得到的新技术。
计算机、软件世界的知识抓手-性能
就像吴军老师将信息和能量作为科技史的知识脉络抓手,每个学科都需要一个抓手去串联古今,画清知识脉络。具体在计算机领域来说,性能就是我们计算机或者说软件世界的抓手。
拿计算机本身来说,从发明专用计算机到通用计算机经历了从手工输入 无操作系统的 计算机-->批处理 操作系统加持的计算机-->分时多任务(多进程)操作系统加持的计算机-->分时多任务(多进程多线程)操作系统加持的单CPU计算机 --> 分时多任务(多进程多线程)操作系统加持的 多核(CPU)并行计算的计算机。这其中的演化过程无非就是想提升计算机的吞吐量,单位时间内执行的任务更多,所以在这个过程中人们为了让计算机更高效演化出进程的概念后又提出进程要互相通信才能更合理更有机地设计编排任务。对性能的追求贯穿整个发展。
当单机已经不能满足系统目标时,自然想到要用多机处理。那么对多机也就是集群处理任务的设计编排衍生出了多种分布式技术包括存储、通信等等,利用现有计算、通信技术对相关问题的解决催生出了各种新的技术。当我们的系统变成分布式架构的时候、从小变大的时候就需要我们工程师架构师对其进行良好的满足各个属性目标的顶层设计,也就是前面所提到的架构。这些属性有高性能、高可用、可扩展性、安全、成本等。顺其自然随着属性要求的提高,业务需求的变化架构也是会演化的。
进一步表述性能抓手
算法和数据结构之所以那么重要是因为更好的算法意味着性能更好,也就是技术进步了。所以算法不光是我们实现目的的流程和方法,对算法的优化同样也是我们提升性能的方法,技术的演化。这就印证了技术的本质中的技术组合演化,具体到实际场景中对以前技术中部分组件进行更优的更替来形成了新的技术,以前老的算法不够快,用新的算法替换掉一部分整体就更快。扩展到分布式领域也一样,本质上分布式算法的优化,通信的优化都是更优地存储我们的数据,更快地计算出我们想要的结果,也就是性能的提升。
道,是我们前进的信心
通过前面理论的描述我们知道了技术的演进特性,组合演化的规律,自然有信心去做成一件技术,哪怕是现在没有的技术。知道了万事万物演进的法则之后,就是架构大厦中每一粒尘埃的修炼,也就是术的修炼。需要旁征博引,需要懂得细微方能有机调配,配合上下文,在具体场景中(脱离业务的架构设计都是耍流氓)推陈出新,演进技术。当然具体到我们软件中架构技术也能演进。这样我们才会出现新的发明。发明是有基因遗传的。当一代代遗传下去,量变引起质变的时候新的技术架构也就出现了。
人类在各个场景下对于性能的追求也就是不同的业务场景下更快地达到目的。构成技术的基本组件也是软件和硬件的结合体只是不同视角的表述。所以在我们在经过细致研究后发现物理装置与抽象流程是对技术本源的不同描述。 从硬件来说,硬件技术更像是发明中的一种装置,我们的新技术更像是发明中的实用新型,我们暂且叫装置型的技术。单纯从软件来说,就是是技术的另外一个角度,我们暂且叫流程型的技术。其实二者是统一的,只是技术的不同方面。各个领域的机械装置和流程方法大抵如此,一个像硬件一个像软件,但是最后的实施方案缺一不可,都是技术,是技术的两个视角。对应到我们计算机领域其实逻辑架构和物理部署是对架构的不同表述,有人用二维表格将其画在一起是对架构多方位的把握,这有利于我们队具体复杂度问题的处理。
研习现有术,理清他们在架构中的位置和作用
掌握了道,我们也就不再惧怕任何术,剩下的就是耐心研习好各种术,这样在做架构设计的时候才能得心应手,才能根据各个技术的特性去有机组合达成目标,进而发明出新的技术。具体一点比如说Redis的单线程的处理方法可能性能上不能满足需求了,那是否扣率memcache替换还是将这部分自研?但是前提是要知道redis和memecahce的本质是对内存的管理,这是我们的本质需求。要知道他们俩在性能、可用性之间的差别,以及可以优化的点、优化的代价,才能做出更优的决策。才能胸有成竹
此外,如果有条件,我们需要学习一门交叉学科,比如电子工程、金融学、或者说心理学。了解了技术本质之后,我们不仅需要在一门学科中得到佐证。需要在多个交叉学科让学科之间的理论知识和应用功能得到相互印证,从而升华对技术本质推动社会进步的理解。从宏观到微观,从人类文明到某一历史时期的社会到当下社会中的某一个领域,再到领域中某一个生产环节,再到该生产环节中的某一系统,再到该系统的某一个模块,再到模块中的某个组件,组件背后就是不可再分的“现象”。我们深入理解了这些本质之后有助于我们在当前自己所处的时空(时间和空间上下文)里做出正确的决定,指导自己的研究与工作。参透道,精研术,为实现理想而奋斗,如是。
持续学习,多阅读,多提问
在研究了各家所言之后我们发现关于技术推动社会发展推动文明进步这件事条条大路通罗马,所谓殊途同归大概是这个意思吧。所以我们要做的就是书读百遍、广泛涉猎。多问一些为什么并解决之。比如我们当前处在一个什么样的时空背景下?也就是我们的业务上下文,技术资源上下文?我们要解决的问题给我们的系统提出什么样的要求?如何达到要求?是否有备选方案?选什么技术?这个技术来源于哪里?是哪些技术的组合创新?是为了解决什么问题?那么解决这个问题和我们手中的问题是否一样?我们是否有更合适的方案?是否可以对现有技术进行改造创造发明?是否需要新的技术组合进来能更好地解决问题?是否能利用别的自然现象和组件组合达到我们的目的?对问题的回答也是对技术本质的探讨。一一回答之后架构也就出来了,对于一件未知的事情也就胸有成竹了。接下来就是落地实现了。
于是我们不会再迷茫了,只要自己要去干什么了。