分类 代码人生 下的文章

一、前言
很多程序员画架构图头疼,不知道画什么、怎么画!

分享、评审、述职、答辩,只要你在程序员这个行业,就几乎离不开要画图。

一提到画图很多人就想站会起来喊,”内卷“、”内卷啦“、”PPT工程师“,但程序代码本身就是一种数学逻辑的具体实现,如果没有一些图表配合文字的阐述,讲真很难让所有人都能在共同的共识下进行交流。

这不像是文科,”八表流云澄夜色,九霄华月动春城“ 上来就能联想到它是在描述啥。但是偏理科代码逻辑或架构设计,只能把抽象的内容用图表的形式展现出来,让大家在同一的共识下共同协同工作。

而我们画的架构图、流程图、结构图、功能图、逻辑图等,都需要好看、好懂、好用、好搞,因为:

好看是为了提升沟通效率,
好懂是为了提升交流共识,
好用是为了提升交付质量,
好搞是为了提升实施速度。
这就像君子在追求漂亮姑娘一样,好看就想主动撩一下、有品行和共同的三观很快让你开口说我懂你、接下来就是交付质量和实施速度了,那也是水到渠成的事。

好,别激动,接下来我们就开始专心研究研究架构图,都有哪些,该怎么画,有什么手法。

二、架构图有哪几种?
仅说技术架构图的话,通常我们☞指的是选型各项技术组件来支撑整个服务建设的系统架构。但用于不同人群范围和不同场景下会有其他分类,如图 26-1 架构图分类
请输入图片描述

业务架构:需求初期业务的结果和过程描述一般比较模糊,可能来自于某个老板、运营或用户的反馈。客户说海尔洗衣机洗土豆会堵,海尔立马设计专门的土豆洗衣机 业务方向往往是定方向和结果的叫战略,主要包括业务规划、业务模块和流程以及问题域的列表等。
应用架构:服务复用、跨组协同,简单、灵活、整合是应用架构必须考虑的点,就像你要上线一个聊天功能,那么聊天内容的输入法、文字识别、舆情监控以及视频服务、支付服务等,它们都是在应用架构分层下沉淀到平台的产物,在供各个方使用。
产品架构:业务提需求,产品定方案,相对于业务的粗放流程,产品架构会更加细腻以及考虑各个模块的分层和边界。
数据架构:数据的获取、数据的存放和数据的使用是数据架构要解决的三个问题,数据库存放、大数据汇总、数据分析等。
技术架构:是离程序员最近的架构设计,它不仅是系统搭建的架构图设计,还包括了结构、功能、流程、逻辑等内容。它的具体描述就是整个系统如何落地的具体实现方案。
三、Zachman框架是什么?
Zachman框架,由约翰 扎科曼(John Zachman )在1987年创立的全球第一个企业架构理论,其论文《信息系统架构框架》至今仍被业界认为是企业架构设计方面最权威的理论。
Zachman框架(Zachman framework)是一种逻辑结构,它可以对企业信息按照不同分类和不同角度进行表示。

Zachman框架,从横向六个角度看待企业,这个六个观点可以分为;什么内容、如何工作、什么地点、谁负责、为什么这么做(称为W5H)。

框架的列由一组工件组成,分为规划者、拥有者、设计者(架构师)、建造者、分包者、产品,或者有时表示为视点:范围上下文,业务概念,系统逻辑,技术,物理,组件组装和操作类。整体如图 26-2 TOGAF Zachman框架
请输入图片描述

表格横向六项 代表了用于描述信息系统的某一个方面,对于任何一个事物只要在这几个基本方面对其进行清洗的解释就足够可以描述清楚。

数据(What,即什么内容):什么是业务数据,信息或对象?
功能(How,即如何工作):业务如何运作,即什么是业务流程?
网络(Where,即何处):企业运营、部署在哪里?
人(Who,即何人负责):什么人?什么是业务部门及其等级制度?
时间(When,即什么时间):业务计划和工作流程是什么?什么时候执行?
原因(Why,即为什么做):为什么选择的解决方案?这是怎么产生的?
表格纵向六项 代表了在信息系统构造过程中所涉及到的人在描述信息系统时所采用的视角,包括:

范围/规划者(Planner):此视图描述了业务目的和策略,充当其他视图将被派生和管理的上下文。
业务模型/拥有者(Owner):这是对信息系统必须在其中运作的组织的描述。
系统模型/设计师(Designer):该视图概述了系统如何满足组织的信息需求。
技术模型/建造者(Builder):这是系统如何实施的表示,它使特定的解决方案和技术显而易见。
详细表述/分包者(Sub-Contractor):这些表示说明了某些系统元素的特定于实现的细节:在生产开始之前需要进一步说明的部分。
功能系统/产品(Functioning Enterprise):在1987年的论文(《A framework for information systems architecture》)中并没有这一行的内容,实际上此行的内容也并不在架构描述的范畴的之内,不过为了使得架构Zachman框架对于架构的表述更加完备,这一行最终还是被加了进去。
根据 TOGAF 的定义,企业是具有一系列共同目标组织的集合,而架构则是为了有效地实现这一系列目标。

在实现的过程中 定义了企业的结构和运作模式的概念蓝图(SearchCIO),以及构成企业的所有关键元素和其关系的综合描述(Zachman)。通过创建、沟通和优化用以描述企业未来状态和发展的关键原则和模型以将业务愿景和战略转化成有效的企业变更的过程(Gartner)。

可以这一部分内容会比较绕,但可以作为架构设计的知识扩展进行学习理解以及运用。

四、陪你画个架构图
简单来说,架构图就是为了达成交流共识的实现方案演示,并不一定非得拘泥于某种形式,只要你能画的清楚,讲的明白就最合适不过了。

  1. 架构选型图
    请输入图片描述

难度:⭐⭐⭐
作用:通常在新项目开发初期,都要做一些技术选型工作。在负载、网关、架构、治理、框架、服务、数据以及环境和支撑服务上,要选择适合当前开发的技术。

  1. 微服务架构
    请输入图片描述

难度:⭐⭐⭐⭐
作用:技术选型完毕后,接下来就是对于这些技术的运用。这个过程有点像搭积木一样,把每一个区域用适合此位置的积木填充进去。如果是团队初建或者是技术升级,那么这个过程还是比较复杂的,需要大量的验证。不过其实互联网的技术分层和使用已经相对稳定,搭建一个这样的微服务并不会耗费太长的时间。

  1. 技术架构图
    请输入图片描述

难度:⭐⭐⭐⭐
作用:技术架构图主要是对于研发层面做技术实现指导的,它可以把系统分层和实现结构划分清楚。另外一般也会把案例工程的结构拿出来一起讲解,这样可以让团队伙伴快速的进入开发。
五、总结
本章节向大家讲解了什么是架构图,架构图的分类和怎么画架构图,通过这样的内容可以让大家对架构图有一个全貌的认知。在以后自己画架构图了也可以非常明确的知道面对的什么用户群体,要画的内容是什么。
TOGAF有一套非常完善的企业架构理论,它描述了一种开发和管理企业体系结构生命周期的方法,并构成了TOGAF的核心。所涉及到的知识非常丰富,值得认真看一下。
好看,能把一件事做的好看非常重要,好看能让人提起兴趣、好看可以使沟通成本降低。也鼓励大家尽可能把经过自己手里的东西,做的好看一些。

原文链接:https://mp.weixin.qq.com/s/50574gVPP8dcvzVheXCgMw

去中心化是迁移快速响应,封装行业短平快。定性定量是串联调性体验度量,通过引爆点和平台化达到护城河。归因分析是在关键路径采用模型打法达成强化认知。结果导向资源倾斜作为形态为产品赋能,抽离透传作为玩法的评判标准。亮点是心智,优势是载体。拉通整个交付价值,支撑话术量化垂直领域。组合拳是点线面达到颗粒度标准。

自动生成地址:https://www.guangla.com/bee.php

如果mac 下编译出现如下类似错误:

/usr/local/Cellar/php/7.4.11/include/php/Zend/zend_operators.h:523:10: error:

  'asm goto' constructs are not supported yet
    __asm__ goto(
            ^

修改
/usr/local/Cellar/php/7.4.12/include/php/Zend/zend_operators.h
文件里的ZEND_USE_ASM_ARITHMETIC宏为0即可

给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。

注意: 你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入: [3,3,5,0,0,3,1,4]
输出: 6
解释: 在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。
  随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3 。
示例 2:

输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。  
  注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。  
  因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
示例 3:

输入: [7,6,4,3,1]
输出: 0
解释: 在这个情况下, 没有交易完成, 所以最大利润为 0。

解法

#include <stdlib.h>
#include <stdio.h>

int max_profit(int* list, int len);

#define MAX(a, b) ((a) > (b) ? (a) : (b))

int main()
{
    // int list[] = {1,2,3,4,5};
    // int list[] = {3,3,5,0,0,3,1,4};
    // int list[] = {7,6,4,3,1};
    // int list[] = {1,2,4,2,5,7,2,4,9,0};
    // int list[] = {8,3,6,2,8,8,8,4,2,0,7,2,9,4,9};
    // int list[] = {3,2,6,5,0,3};
    int list[] = {1,2,4,2,5,7,2,4,9,0};
    int len = sizeof(list) / sizeof(int);

    int ret = max_profit(list, len);

    printf("max %d\n", ret);

}

int max_profit(int* list, int len)
{
    if(len < 2) {
        return 0;
    }

    int dp0 = 0;
    int dp1 = 0 - list[0];
    int dp2 = 0;
    int dp3 = 0 - list[0];
    int dp4 = 0;

    for(int i=1; i<len; i++) {
        dp1 = MAX(dp1, dp0 - list[i]);
        dp2 = MAX(dp2, dp1 + list[i]);
        dp3 = MAX(dp3, dp2 - list[i]);
        dp4 = MAX(dp4, dp3 + list[i]);
    }

    return MAX(0, MAX(dp1, MAX(dp2, MAX(dp3, dp4))));
}