深入业务成为更好的软件架构师——信息化建设图鉴一二例

640?wx_fmt=png

软件开发实际上跟英语比较类似,都是一项工具,服务于各行各业。从程序员的个人修养上来讲,一是要研习好软件开发这门技艺,二是要深入到所服务的行业。说到底,软件的终极目标是模拟业务,在此期间常常会有一个认知层面的小误会,即软件开发人员在入行之初所学习的都是与计算机、编程语言相关的知识,于是就形成“只需要把代码写完”事情就算完成的观念,显然这远远不及对软件架构师所要求的业务主导意识。

最近在看王概凯(Kevin)的《聊聊架构》,其中特别强调软件架构师应深入到业务中,并以业务的问题是否解决作为工作优良的判断标准,比较受启发,接下来我也根据过往工作经历说说自己的感知和体会。

软件所模拟的业务行为,其核心也在于数据,它们共同表达的都是行为背后的状态和结果,先看看下图:

640?wx_fmt=png

在明确了业务主体后,业务目标自然就可以得到聚焦,有了清晰的业务目标,就值得花精力来探知业务的生命周期,接下来就可以像外科手术医生一样细致地实行架构拆分。

由此可见,软件架构师在实行架构拆分行为时,基本上都把业务从头到尾捋了一遍,否则势必陷入设计不足或过度设计的漩涡。

软件架构师需要走出时间困境

好的架构拆分是基于对业务的正确认识,但业务这个东西往往总令人心生畏惧。

640?wx_fmt=png

在众多的传统企业中,信息技术部肩负起了全集团、全公司的以业务为导向的信息化重担。依靠所有成员去解构业务是不现实的,这时候软件架构师或者项目负责人就需要迎难而上,积极参与到需求分析中。可以肯定的是,只有直面业务的人,才能真正体会到按时、按需解决业务问题所面临的时间压力,这种压力的源头恰是职业人的天性,因为人们总倾向于认为自己从事一个行业然后精通该行业就可以,殊不知,软件行业其本质就是服务业,那么作为软件架构师,则必须超越对时间、对业务的恐惧,认识到需要解决问题的主体是业务人员而非自己,即需要解决的问题是“非软件行业”的问题,自己是在协助业务人员解决问题,从这个层面来讲,工作是否完成其实是由业务人员决定的,而不是软件架构师自己。

倘若选择避重就轻,尽管在短时间内部署上线了,但问题并未真正得到解决,业务部门的催促又会加重后续任务的时间压力。况且,仅仅以做好自己的编程工作为主要目标,并试图用自己的软件知识去理解另一个行业,又很容易陷入沟通困境。

在 2016 年,才加入申通快递不久就接到客服部关于开发备案系统的诉求,这个系统是涉及到全国网点,在备案请求提交后会由上级机构审核。我在接到这个任务的时候,首先按常规把会议记要过了几遍,然后对其中的审核功能做了重点铺开想像。我的脑补过程是这样的,首先它涉及到多机构递交审核,那么这期间有没有可能出现并行会审的情形?当流程出现退回时又该如何处理?要不干脆上一套流程框架吧,但发现 .NET 平台下开源的框架并不多,那就考虑 Java 平台的 Activiti 吧,可转而发现更换平台的成本又太高,而且照这样做下去,在预定的时间内恐怕很难交付。况且这个审核功能还只是所有问题之一,困惑之余,觉得还是要主动跟业务代表(客服部)做二次沟通。

640?wx_fmt=jpeg

通过主动出击,了解到审核的节点只有三步左右,只需采用最常见的串行单审即可,并不需要太多的复杂步骤。得到这样的答复后可谓喜出望外,回来的路上就想好了基于状态模式的实施方案,这样减去了引入各种工作流框架的麻烦,重要的是对时间压力和对交付 deadline 的焦虑减轻了许多。

640?wx_fmt=png

虽然这个例子可能相比较于很多大型系统来说有点偏小,或者说是带有运气成份,但至少可以说明积极地与需求方沟通,能在很大程度上减小实现与需求的误差,以及自身对业务和时间的恐惧。

这里包含了一个隐形的要求,即软件架构师需要把对编程上的职业成就感,适当的转移到解决业务工作中,把完成业务工作作为自己的最大利益。如此,随着对业务的熟悉,那么对时间的恐惧便会慢慢消失。

软件架构师应树立生命周期的意识

人的生命周期无非是出生、成长、衰老直至死亡,而软件亦同,根据核心生命周期和非核心生命周期之分,通常可以把非核心的部分分工出去,让新进人员来承接,锻炼并促成其快速地融入大团队的协作。不妨思考一个问题,软件开发生命周期和软件运行生命周期哪一个更偏向于核心生命周期呢?通常企业开发一款软件的目的就是拿来使用的,其效益的持续提升依靠的正是软件的稳定运行,所以我觉得软件运行生命周期或者说运维才是核心。

640?wx_fmt=png

可以稍微再提一提关于对非核心生命周期的分工问题,这是软件架构师需要日常考虑的问题。分工即拆分,而架构的拆分从本质上来讲也是一种利益的重新分配,毕竟每个人处理问题的承受力总是有限的,这就需要把一些非核心的业务分拆出去,无形中也是让自己走出时间困境的有效办法。然而在甄别一项业务是否为核心业务的时候就需要特别仔细,倘若对相关人的利益分析不透彻,便极易导致架构无法落地。

640?wx_fmt=png

理解到了业务的主体及其生命周期后,就可以安心的做架构方面的拆分,从而形成不同的软件生命周期,从大的方面通常包括有开发和运行周期。

  • 软件开发生命周期

开发的生命周期其实就是代码的累积过程,它以项目启动为始,然后和业务人员学习业务并形成需求文档,进而编码、测试以达到正确模拟现实业务的效果,最终得以部署上线,这时开发生命周期就终止了。最值得注重的其实是在开发之前就需要为软件的运行来考虑一系列的资源,比如机器、子域名申请以及监控等等,所以软件架构师在统筹方面需要更多的前瞻。

640?wx_fmt=png

2017 年下半年,我参与到了申通快递的自动分拣项目中,这又是一个涉及全国各地的系统,而且是专为各大型转运中心所使用,为提升数据分发和故障排查等方面的效率,我们寻思着先从消息队列和监控两方面来改进。全新启用的开源消息队列 RabbitMQ 很好的帮我们桥连起各个子系统,它自身所带的监控页面,也帮我们在日常运维上省了不少心。趁此机会,又梳理了自动分拣项目所涉及的全部服务器,以期望并入统一的监控体系中,这时我想起了孙宇聪在高可用架构里提到的《SRE: Google运维解密》,大致解决办法还是在每台机器上运行一个代理程序,那我姑且就叫“埋点”吧,通过这样简单又很有效的方式对各子系统的运行状况做了监控,初步就以发短信的形式通知到组内人员,这样第一时间便能知晓线上运行状况。

640?wx_fmt=png

其实,软件开发的过程可谓是八仙过海,各显神通。每一位软件架构师或者项目负责人能依据不同企业环境将软件构建出来就是最大的成功,究竟是采用传统的瀑布式(Waterfall),或是新兴的敏捷(Agile)迭代,甚至是两相结合都无可厚非,我最想强调的是对外沟通,即上面提到的对获取各项资源的前瞻性。毕竟“外行人”并不知道开发中的细节,不清楚我们一天到晚坐在那儿究竟在干什么,所以我们要对外保持 Open 状态并显现出沟通的意愿。

  • 软件运行生命周期

软件运行生命周期才是一个软件真正的开始,一个有价值的软件从它启动的那一刻开始就已经为企业带来了效益,所以运行生命周期,即运维才是真正的核心竞争力。

640?wx_fmt=png

运维的业务目标很简单,即保证软件稳定地被用户访问,那么风险控制工作便是重中之重。

首先是隔离措施。软件的开发生命周期通常是日常办公环境,而软件运行周期则是服务于用户的,因此要区分出办公环境(或测试环境)和生产环境。以我目前熟悉的快递行业,上规模的企业基本都有自建机房和运维团队,其电源、网络、空调、排风都是一体化的独立管控。

其次是控制变更。这里面还划分有被动变更和主动变更,被动变更包括机器主板或硬盘的损坏,以及用户访问量的突增等等,这时候作为软件架构师就需要警醒一下,必要时提醒运维人员针对上线的子系统做好负载均衡,小型应用通常保持两台机器,面向全国全网的应用就需要考虑四台以上机器了。主动变更多半情况下指的是频繁的发布更新,为了最大程度的降低影响面,要确保在指定地点、指点时间进行变更,并让所有的运维人员知情。从安全和便利角度考量往往还会用到运维堡垒机,如果要求更为严苛,还可以从帐号、公钥等方面进一步来加强。

在软件运行这样一个最为核心的生命周期中,发布更新的质量直接影响到企业信息部门的运维表现,结合孙宇聪的诸多建议我也列举一些值得注意的要点:

  • 线下测试(Offline Test)。重点检查线下测试环境是否完善,除此之外还需要产品人员和开发人员的督促。除了一般的代码逻辑测试,尽量再兼顾到压力测试。

  • 灰度发布(Gray Released)。指的是根据业务特点、数据特点来选择一批有极强代表性的线上服务器实例进行发布,其发布的比例可以考虑按 1%、10%,最后 100% 这一指数型方式来增长。这样有利于把新上线功能可能的不良影响降到最低,当然也可以作为小范围收集用户的反馈意见以待完善产品功能。灰度发布可以视作是上线前的最后一道安全防护机制。

  • 回滚机制(Rollback)。一般来说用上一个版本的相关程序集进行覆盖即可,但有时还会出现数据格式的兼容性问题。比如数据库表字段的类型此前发生了变化,那这时候还需要有配套的回滚 SQL 脚本。另一种情形是新的变更内容把数据删掉了,回滚后数据也回不来了,这种情况是没有补救措施的,建议的做法是将程序代码分成两块逻辑,先发布第一段逻辑并记录好日志,等发现没有问题后再将删除的代码作为第二次发布。

在实际工作中,开发生命周期和运行生命周期往往是并行存在的。在软件部署上线后,总会不断地进行修改,比如出现了 Bug,或者是要增加新的需求,这时软件的开发、测试以及部署流程就需要再迭代一遍。无论新需求的开发多么重要,都要摆正软件运行生命周期的核心位置。

不管是软件架构师还是软件开发人员,通常都很专注于技术,以致于不太重视各种技术背后的业务,使得技术与应用总是无法较好的相融。计算机相关的技术,围绕的核心点始终是如何让用户能够更好的使用软件,这背后千丝万缕的业务关系无不是源于现实生活,所以认真工作之余还可以多读一些人文历史,并走进生活以获取灵感。

原文地址:https://www.cnblogs.com/ramantic/p/9022828.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317664.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

恭贺微软技术俱乐部苏州站正式成立

今天去苏州微软中国,参加了微软技术俱乐部苏州站的成立大会。大会的历程悉数经历,这会儿仍在为各位大佬、社区领袖的奉献精神所感动。在通过我们公司同事分享的链接报名时就了解到,大会上有苏震巍老师和蒋金楠老师的分享,便笃定了…

[HNOI2013]消毒 (匈牙利最大匹配)

Description 最近在生物实验室工作的小T遇到了大麻烦。 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为abc,a、b、c 均为正整数。为了实验的方便,它被划分为abc个单位立方体区域,每个单位立方体尺寸为111。用(i,…

.NET Core微服务之路:基于Ocelot的API网关实现--http/https协议篇

前言 最近一直在忙公司和私下的兼职,白天十个小时,晚上四个小时,感觉每天都是打了鸡血似的,精神满满的,连自己那已经学打酱油的娃都很少关心,也有很长一段时间没有更新博客了,特别抱歉&#…

[NOI2009] 变换序列 (匈牙利最大匹配)

description … solution 我竟然一眼题!! 变换后的TTT数组是[0,n)[0,n)[0,n)的排列,变换规则也有,距离DDD也知道 很明显可以求出iii的可能变换对象 这不就是个最大匹配?? 无解就是匹配数量达不到nnn罢了…

使用 WeihanLi.Npoi 操作 CSV

Intro最近发现 csv 文件在很多情况下都在使用,而且经过大致了解,csv 格式简单,相比 excel 文件要小很多,读取也很是方便,而且也很通用,微软的 ml.net 的示例项目 用来训练模型的数据也是使用的 csv 来保存的…

种类问题

几乎所有种类问题都可以转化成两种模型之一 1.直接维护ans数组 2.统计二维数点问题 前置知识 二维静态数点 以y为第一元素,x为第二元素,原点优先级大于查询点,对所有点(原点查询点),然后求 for(int i1;…

「LibreOJ Round #11」Misaka Network 与测试 (网络流跑二分图匹配)

description 研究者们想要测试 Misaka Network,于是他们把 Misaka Network 中的所有妹妹们召集到了一起。 现在妹妹们排成了 N行 M 列,有的位置没有人。现在研究者们给每一个个体的超能力进行了评定,一共有三个能力等级:Level 1 …

YbtOJ-相似子串【SA,RMQ,二分】

正题 题目大意 给出一个长度为nnn的字符串,两个串相似当且仅当可以通过每种字符置换使得它们相同。 qqq次询问这个字符串所有子串中和这个串中sl,rs_{l,r}sl,r​子串有多少个相似的。 1≤n≤105,1≤q≤51051\leq n\leq 10^5,1\leq q\leq 5\times 10^51≤n≤105,1≤…

程序员修仙之路--把用户访问记录优化到极致

点击上方蓝色字体,关注我们菜菜呀,前几天做的用户空间,用户反映有时候比较慢呀CEO,CTO,CFO于一身的CXO是吗?菜菜我把你拉进用户反馈群,你解决一下呀CEO,CTO,CFO于一身的CXO(完了,以后没清净时候…

[国家集训队]航班安排 (最大费用最大流)

description 神犇航空有K架飞机,为了简化问题,我们认为每架飞机都是相同的。神犇航空的世界中有N个机场,以0…N-1编号,其中0号为基地机场,每天0时刻起飞机才可以从该机场起飞,并不晚于T时刻回到该机场。一…

新数据革命:开源图形化数据引擎Hawk5发布

Hawk是一款开源图形化的爬虫和数据清洗工具,GitHub Star超过2k,前几代版本介绍如下:Hawk3: 终于等到你: 图形化开源爬虫Hawk 3发布!Hawk2: 120项优化: 超级爬虫Hawk 2.0重磅发布!Hawk1: 如何从互联网采集海量数据?租房…

[TJOI2018]智力竞赛 (匈牙利)

description 题目描述 小豆报名参加智力竞赛,他带上了 n个好朋友作为亲友团一块来参加比赛。 比赛规则如下:一共有 m道题目,每个人都有 1 次答题机会,每次答题为选择一道题目回答,在回答正确后,可以从这个…

ASP.NET Core如何在ActionFilterAttribute里做依赖注入

点击蓝字关注我在ASP.NET Core里,我们可以使用构造函数注入很方便地对Controller,ViewComponent等部件做依赖注入。但是如何给过滤器ActionFilterAttribute也用上构造函数注入呢?问题我的博客系统里有个用来删除订阅文件缓存的ActionFilter&a…

[八省联考2018]劈配 (匈牙利)

description 一年一度的综艺节目《中国新代码》又开始了。Zayid 从小就梦想成为一名程序员,他觉得这是一个展示自己的舞台,于是他毫不犹豫地报名了。 轻车熟路的 Zayid 顺利地通过了海选,接下来的环节是导师盲选,这一阶段的规则…

助力苏州、星火相传,广苏两地微软技术俱乐部交流纪实

2019年1月19日时值二十四节气“大寒”前夕,江南水乡冬日的寒气盖不住苏州.NET开发者的热情,就在这一天苏州微软技术俱乐部成立了并举办了第一场大型的线下交流活动。星火相传2018年12月8日广州.NET微软技术俱乐部举办了恢复以来的第一场大型线下技术交流…

微软技术专家为您解读深度学习

随着阿尔法狗、无人驾驶、智能翻译的横空出世,“人工智能”这个已经存在60多年的词语,仿佛一夜之间重新成为热词。同时被科技圈和企业界广泛提及的还有“机器学习”“深度学习”“神经网络”…… 但如此喧嚣热烈的气氛之下,大部分人对这一领域…

「LibreOJ NOI Round #2」不等关系 (dp+NTT分治)

description 戳我看题目哦 solution 有一道非常相似的题目 一棵树&#xff0c;每条边限制两个端点的大小关系&#xff08;限制 a[u]>a[v]a[u]>a[v]a[u]>a[v] 或 a[u]<a[v]a[u]<a[v]a[u]<a[v]&#xff09; 求有多少种符合要求的排列aaa满足整棵树的限制。n…

PCB 机器学习(ML.NET)初体验实现PCB加投率预测

使用ML.NET建立PCB加投率模型对单一蚀刻工序进行加投率预测, 此实例为最简单预测&#xff0c;要想实现全流程加投率预测挑战难度还是挺大的&#xff0c;可以查看另一种关于大数据在PCB行业应用---加投率计算基本原理:PCB 加投率计算实现基本原理--K最近邻算法&#xff08;KNN&a…

潘淳的苏州.NET俱乐部成立有感!附我的录音

引言&#xff1a;今天是1月21日&#xff0c;我&#xff08;潘淳&#xff09;的生日&#xff0c;两天前刚刚过了他&#xff08;苏俱&#xff09;的生日&#xff0c;微软技术俱乐部&#xff08;苏州&#xff09;在苏州微软正式成立。作为大会活动的策划者和活动发起者之一&#x…

十年 IT 老兵带你通过案例学架构,附C#代码

技术大会上的分享大多高大上&#xff0c;亿级流量、超大型研发团队&#xff0c;虽然值得借鉴&#xff0c;但由于应用场景与研发资源的差异&#xff0c;一般企业并不容易落地。其实&#xff0c;中小型研发团队在IT行业还是占大多数&#xff0c;他们在技术架构方面的问题较多&…