learn.lianglianglee.com/专栏/软件工程之美/45 从软件工程的角度看微服务、云计算、人工智能这些新技术.md.html
2022-08-14 03:40:33 +08:00

389 lines
33 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<!-- saved from url=(0046)https://kaiiiz.github.io/hexo-theme-book-demo/ -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
<link rel="icon" href="/static/favicon.png">
<title>45 从软件工程的角度看微服务、云计算、人工智能这些新技术.md.html</title>
<!-- Spectre.css framework -->
<link rel="stylesheet" href="/static/index.css">
<!-- theme css & js -->
<meta name="generator" content="Hexo 4.2.0">
</head>
<body>
<div class="book-container">
<div class="book-sidebar">
<div class="book-brand">
<a href="/">
<img src="/static/favicon.png">
<span>技术文章摘抄</span>
</a>
</div>
<div class="book-menu uncollapsible">
<ul class="uncollapsible">
<li><a href="/" class="current-tab">首页</a></li>
</ul>
<ul class="uncollapsible">
<li><a href="../">上一级</a></li>
</ul>
<ul class="uncollapsible">
<li>
<a href="/专栏/软件工程之美/00 开篇词 你为什么应该学好软件工程?.md.html">00 开篇词 你为什么应该学好软件工程?</a>
</li>
<li>
<a href="/专栏/软件工程之美/01 到底应该怎样理解软件工程?.md.html">01 到底应该怎样理解软件工程?</a>
</li>
<li>
<a href="/专栏/软件工程之美/02 工程思维:把每件事都当作一个项目来推进.md.html">02 工程思维:把每件事都当作一个项目来推进</a>
</li>
<li>
<a href="/专栏/软件工程之美/03 瀑布模型:像工厂流水线一样把软件开发分层化.md.html">03 瀑布模型:像工厂流水线一样把软件开发分层化</a>
</li>
<li>
<a href="/专栏/软件工程之美/04 瀑布模型之外,还有哪些开发模型?.md.html">04 瀑布模型之外,还有哪些开发模型?</a>
</li>
<li>
<a href="/专栏/软件工程之美/05 敏捷开发到底是想解决什么问题?.md.html">05 敏捷开发到底是想解决什么问题?</a>
</li>
<li>
<a href="/专栏/软件工程之美/06 大厂都在用哪些敏捷方法?(上).md.html">06 大厂都在用哪些敏捷方法?(上)</a>
</li>
<li>
<a href="/专栏/软件工程之美/07 大厂都在用哪些敏捷方法?(下).md.html">07 大厂都在用哪些敏捷方法?(下)</a>
</li>
<li>
<a href="/专栏/软件工程之美/08 怎样平衡软件质量与时间成本范围的关系?.md.html">08 怎样平衡软件质量与时间成本范围的关系?</a>
</li>
<li>
<a href="/专栏/软件工程之美/09 为什么软件工程项目普遍不重视可行性分析?.md.html">09 为什么软件工程项目普遍不重视可行性分析?</a>
</li>
<li>
<a href="/专栏/软件工程之美/10 如果你想技术转管理,先来试试管好一个项目.md.html">10 如果你想技术转管理,先来试试管好一个项目</a>
</li>
<li>
<a href="/专栏/软件工程之美/11 项目计划:代码未动,计划先行.md.html">11 项目计划:代码未动,计划先行</a>
</li>
<li>
<a href="/专栏/软件工程之美/12 流程和规范:红绿灯不是约束,而是用来提高效率.md.html">12 流程和规范:红绿灯不是约束,而是用来提高效率</a>
</li>
<li>
<a href="/专栏/软件工程之美/13 白天开会,加班写代码的节奏怎么破?.md.html">13 白天开会,加班写代码的节奏怎么破?</a>
</li>
<li>
<a href="/专栏/软件工程之美/14 项目管理工具:一切管理问题,都应思考能否通过工具解决.md.html">14 项目管理工具:一切管理问题,都应思考能否通过工具解决</a>
</li>
<li>
<a href="/专栏/软件工程之美/15 风险管理不能盲目乐观凡事都应该有B计划.md.html">15 风险管理不能盲目乐观凡事都应该有B计划</a>
</li>
<li>
<a href="/专栏/软件工程之美/16 怎样才能写好项目文档?.md.html">16 怎样才能写好项目文档?</a>
</li>
<li>
<a href="/专栏/软件工程之美/17 需求分析到底要分析什么?怎么分析?.md.html">17 需求分析到底要分析什么?怎么分析?</a>
</li>
<li>
<a href="/专栏/软件工程之美/18 原型设计:如何用最小的代价完成产品特性?.md.html">18 原型设计:如何用最小的代价完成产品特性?</a>
</li>
<li>
<a href="/专栏/软件工程之美/19 作为程序员,你应该有产品意识.md.html">19 作为程序员,你应该有产品意识</a>
</li>
<li>
<a href="/专栏/软件工程之美/20 如何应对让人头疼的需求变更问题?.md.html">20 如何应对让人头疼的需求变更问题?</a>
</li>
<li>
<a href="/专栏/软件工程之美/21 架构设计:普通程序员也能实现复杂系统?.md.html">21 架构设计:普通程序员也能实现复杂系统?</a>
</li>
<li>
<a href="/专栏/软件工程之美/22 如何为项目做好技术选型?.md.html">22 如何为项目做好技术选型?</a>
</li>
<li>
<a href="/专栏/软件工程之美/23 架构师:不想当架构师的程序员不是好程序员.md.html">23 架构师:不想当架构师的程序员不是好程序员</a>
</li>
<li>
<a href="/专栏/软件工程之美/24 技术债务:是继续修修补补凑合着用,还是推翻重来?.md.html">24 技术债务:是继续修修补补凑合着用,还是推翻重来?</a>
</li>
<li>
<a href="/专栏/软件工程之美/25 有哪些方法可以提高开发效率?.md.html">25 有哪些方法可以提高开发效率?</a>
</li>
<li>
<a href="/专栏/软件工程之美/26 持续交付:如何做到随时发布新版本到生产环境?.md.html">26 持续交付:如何做到随时发布新版本到生产环境?</a>
</li>
<li>
<a href="/专栏/软件工程之美/27 软件工程师的核心竞争力是什么?(上).md.html">27 软件工程师的核心竞争力是什么?(上)</a>
</li>
<li>
<a href="/专栏/软件工程之美/28 软件工程师的核心竞争力是什么?(下).md.html">28 软件工程师的核心竞争力是什么?(下)</a>
</li>
<li>
<a href="/专栏/软件工程之美/29 自动化测试如何把Bug杀死在摇篮里.md.html">29 自动化测试如何把Bug杀死在摇篮里</a>
</li>
<li>
<a href="/专栏/软件工程之美/30 用好源代码管理工具,让你的协作更高效.md.html">30 用好源代码管理工具,让你的协作更高效</a>
</li>
<li>
<a href="/专栏/软件工程之美/31 软件测试要为产品质量负责吗?.md.html">31 软件测试要为产品质量负责吗?</a>
</li>
<li>
<a href="/专栏/软件工程之美/32 软件测试:什么样的公司需要专职测试?.md.html">32 软件测试:什么样的公司需要专职测试?</a>
</li>
<li>
<a href="/专栏/软件工程之美/33 测试工具为什么不应该通过QQ微信邮件报Bug.md.html">33 测试工具为什么不应该通过QQ微信邮件报Bug</a>
</li>
<li>
<a href="/专栏/软件工程之美/34 账号密码泄露成灾,应该怎样预防?.md.html">34 账号密码泄露成灾,应该怎样预防?</a>
</li>
<li>
<a href="/专栏/软件工程之美/35 版本发布:软件上线只是新的开始.md.html">35 版本发布:软件上线只是新的开始</a>
</li>
<li>
<a href="/专栏/软件工程之美/36 DevOps工程师到底要做什么事情.md.html">36 DevOps工程师到底要做什么事情</a>
</li>
<li>
<a href="/专栏/软件工程之美/37 遇到线上故障,你和高手的差距在哪里?.md.html">37 遇到线上故障,你和高手的差距在哪里?</a>
</li>
<li>
<a href="/专栏/软件工程之美/38 日志管理:如何借助工具快速发现和定位产品问题 .md.html">38 日志管理:如何借助工具快速发现和定位产品问题 </a>
</li>
<li>
<a href="/专栏/软件工程之美/39 项目总结:做好项目复盘,把经验变成能力.md.html">39 项目总结:做好项目复盘,把经验变成能力</a>
</li>
<li>
<a href="/专栏/软件工程之美/40 最佳实践:小团队如何应用软件工程?.md.html">40 最佳实践:小团队如何应用软件工程?</a>
</li>
<li>
<a href="/专栏/软件工程之美/41 为什么程序员的业余项目大多都死了?.md.html">41 为什么程序员的业余项目大多都死了?</a>
</li>
<li>
<a href="/专栏/软件工程之美/42 反面案例:盘点那些失败的软件项目.md.html">42 反面案例:盘点那些失败的软件项目</a>
</li>
<li>
<a href="/专栏/软件工程之美/43 以VS Code为例看大型开源项目是如何应用软件工程的.md.html">43 以VS Code为例看大型开源项目是如何应用软件工程的</a>
</li>
<li>
<a href="/专栏/软件工程之美/44 微软、谷歌、阿里巴巴等大厂是怎样应用软件工程的?.md.html">44 微软、谷歌、阿里巴巴等大厂是怎样应用软件工程的?</a>
</li>
<li>
<a class="current-tab" href="/专栏/软件工程之美/45 从软件工程的角度看微服务、云计算、人工智能这些新技术.md.html">45 从软件工程的角度看微服务、云计算、人工智能这些新技术</a>
</li>
<li>
<a href="/专栏/软件工程之美/一问一答第1期 30个软件开发常见问题解决策略.md.html">一问一答第1期 30个软件开发常见问题解决策略</a>
</li>
<li>
<a href="/专栏/软件工程之美/一问一答第2期 30个软件开发常见问题解决策略.md.html">一问一答第2期 30个软件开发常见问题解决策略</a>
</li>
<li>
<a href="/专栏/软件工程之美/一问一答第3期 18个软件开发常见问题解决策略.md.html">一问一答第3期 18个软件开发常见问题解决策略</a>
</li>
<li>
<a href="/专栏/软件工程之美/一问一答第4期 14个软件开发常见问题解决策略.md.html">一问一答第4期 14个软件开发常见问题解决策略</a>
</li>
<li>
<a href="/专栏/软件工程之美/一问一答第5期 22个软件开发常见问题解决策略.md.html">一问一答第5期 22个软件开发常见问题解决策略</a>
</li>
<li>
<a href="/专栏/软件工程之美/学习攻略 怎样学好软件工程?.md.html">学习攻略 怎样学好软件工程?</a>
</li>
<li>
<a href="/专栏/软件工程之美/特别放送 从软件工程的角度解读任正非的新年公开信.md.html">特别放送 从软件工程的角度解读任正非的新年公开信</a>
</li>
<li>
<a href="/专栏/软件工程之美/结束语 万事皆项目,软件工程无处不在.md.html">结束语 万事皆项目,软件工程无处不在</a>
</li>
</ul>
</div>
</div>
<div class="sidebar-toggle" onclick="sidebar_toggle()" onmouseover="add_inner()" onmouseleave="remove_inner()">
<div class="sidebar-toggle-inner"></div>
</div>
<script>
function add_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
inner.classList.add('show')
}
function remove_inner() {
let inner = document.querySelector('.sidebar-toggle-inner')
inner.classList.remove('show')
}
function sidebar_toggle() {
let sidebar_toggle = document.querySelector('.sidebar-toggle')
let sidebar = document.querySelector('.book-sidebar')
let content = document.querySelector('.off-canvas-content')
if (sidebar_toggle.classList.contains('extend')) { // show
sidebar_toggle.classList.remove('extend')
sidebar.classList.remove('hide')
content.classList.remove('extend')
} else { // hide
sidebar_toggle.classList.add('extend')
sidebar.classList.add('hide')
content.classList.add('extend')
}
}
function open_sidebar() {
let sidebar = document.querySelector('.book-sidebar')
let overlay = document.querySelector('.off-canvas-overlay')
sidebar.classList.add('show')
overlay.classList.add('show')
}
function hide_canvas() {
let sidebar = document.querySelector('.book-sidebar')
let overlay = document.querySelector('.off-canvas-overlay')
sidebar.classList.remove('show')
overlay.classList.remove('show')
}
</script>
<div class="off-canvas-content">
<div class="columns">
<div class="column col-12 col-lg-12">
<div class="book-navbar">
<!-- For Responsive Layout -->
<header class="navbar">
<section class="navbar-section">
<a onclick="open_sidebar()">
<i class="icon icon-menu"></i>
</a>
</section>
</header>
</div>
<div class="book-content" style="max-width: 960px; margin: 0 auto;
overflow-x: auto;
overflow-y: hidden;">
<div class="book-post">
<p id="tip" align="center"></p>
<div><h1>45 从软件工程的角度看微服务、云计算、人工智能这些新技术</h1>
<p>你好,我是宝玉。这些年来,新技术新概念层出不穷,比如说微服务、云计算、人工智能等。你有没有去学习和了解这些新技术呢?又是怎么去理解这些新技术的呢?</p>
<p>也许你会从技术的角度,去学习和理解这些新技术,去看如何把服务分拆,看如何应用虚拟化、容器技术,如何用人工智能切页面。</p>
<p>这些新技术可能会让你很兴奋,毕竟又有很多新知识可以学习和应用;但另一方面也可能会增加一些困惑,比如说:</p>
<ul>
<li>
<p>我该不该在项目中使用微服务?</p>
</li>
<li>
<p>在设计微服务架构的时候,服务拆分的粒度该多细?该拆成 10 个服务还是 100 个?</p>
</li>
<li>
<p>云计算对我的项目会带来什么影响?我应该怎么应用?</p>
</li>
<li>
<p>人工智能会代替我写程序吗?</p>
</li>
</ul>
<p>如果只是从技术角度思考这些问题难免会陷入技术之中反而不容易看清楚这些问题。在我们专栏一开始《02 工程思维:把每件事都当作一个项目来推进》这篇文章中,我就提到了工程思维的概念:</p>
<blockquote>
<p>工程思维,本质上是一种思考问题的方式,在解决日常遇到的问题时,尝试从一个项目的角度去看待问题、尝试用工程方法去解决问题、站在一个整体而不是局部的角度去看问题。</p>
</blockquote>
<p>在学习使用这些新技术的时候,你不妨从项目的整体,从软件工程的角度来理解这些技术,这能给你带来不同的视角。那么怎么从软件工程的角度去理解呢?</p>
<p>我想你应该对我们专栏上两篇文章有印象,我分别从团队、项目过程、工具这几个维度,分析了开源项目和优秀公司对软件工程的应用。类似的,你也可以跳出技术之外,从软件工程的角度来理解微服务、云计算、人工智能这些新技术和概念。</p>
<h2>软件工程中技术架构和组织架构的关系</h2>
<p>首先我们来看看微服务,你可能第一反应就是:它是一种架构技术。没错,从技术角度来看,微服务就是一种架构技术。经过对我们专栏的学习,我相信你对架构应该不会陌生,比如:前后端分离架构、微服务架构。</p>
<p>不知道你有没有观察过:通常系统架构和组织架构是相似的。比如说前后端分离的架构,那么在组织上一般也会分前端组和后端组;而微服务架构,则分组是和服务相关的,可能一个组就是负责一个微服务。</p>
<p>其实组织架构和技术架构相似这个现象不是偶然的,这个现象背后有个定律叫康威定律 (Conways Law)。康威Melvin Conway博士在 1967 年提交的一篇论文《<a href="http://www.melconway.com/Home/Conways_Law.html">How Do Committees Invent?</a>》中最有名的一句话是:</p>
<blockquote>
<p>Organizations which design systems are constrained to produce systems which are copies of the communication structures of these organizations. — Melvin Conway</p>
</blockquote>
<p>如果对这句话翻译一下,它的意思是:</p>
<blockquote>
<p>你设计的软件系统架构,会以某种方式反映出构建软件背后团队的组织架构,你在设计软件的系统架构时,同时也在设计你的组织架构,反之亦然。也可以简单理解为:组织架构的设计等同于系统架构的设计。</p>
</blockquote>
<p>如果你拿康威定律去验证你现在的团队组织架构,或者你熟悉的其他团队的组织结构,你会发现运行良好的项目,都很好地符合这条定律。那些大型复杂的单体软件系统,背后也对应着一个庞大的开发团队,那些应用微服务的项目,背后都是一个个的小组。</p>
<p><img src="assets/ed102dbcac40d0f8f002c222732feeb5.png" alt="img" /></p>
<p>图片来源Conways Law</p>
<p>看完康威定律再回过头来看微服务,<strong>你会发现,微服务架构的设计,不仅仅是一个对服务拆分的架构设计,同时也是对组织架构拆分的设计。</strong></p>
<p>当你在做架构设计,在考虑你的微服务拆分粒度的时候,不妨先想一想:你团队的组织结构是什么样的?真的大到需要用微服务了吗?你能按照微服务的设计去重新设计和调整你的组织结构吗?</p>
<p>当你在设计系统架构的同时,把组织架构的设计也考虑进去,很多问题也就迎刃而解了。比如说你开发团队 30 个人,要使用微服务的架构,那么拆成 35 个微服务是比较合适的。因为每个小组 10 个人左右,每个小组维护 13 个微服务,是相对比较合适的配比。</p>
<p>然后你再看那些应用微服务失败的案例,比如说一个小开发团队,做出 100 多个微服务的架构,那团队维护这些服务的成本一定是相当高的,最终会难以维持。就像这篇文章:《<a href="https://mp.weixin.qq.com/s?__biz=MzIxMzEzMjM5NQ==&amp;mid=2651032374&amp;idx=1&amp;sn=b9a44cc1fd143e8d958587ff05f1acf5&amp;chksm=8c4c5e32bb3bd7246ad28bee556649dde1ffeaae086c8bdfc27c054b32042a89c456aed4cbe5&amp;scene=27#wechat_redirect">再见微服务,从 100 多个问题儿童到一个超级明星</a>》,虽然文章里面没有提到团队的组织结构,但是可以想象,这 140 多个微服务背后一定没有 140 个小团队,哪怕每个团队只有 10 个微服务,对团队来说也是有极大维护成本的。</p>
<p>还有一些传统大型企业,团队构成是按工种划分成不同团队的,开发一个团队、测试一个团队、运维一个团队,那么推行微服务阻力会非常大,因为这样的组织结构和微服务的组织结构是不兼容的。</p>
<p>对于微服务的组织结构,需要按服务划分团队,团队成员有开发、测试和运维,一起组成一个小团队,围绕着服务不断迭代,这样效率是最高的。</p>
<p><img src="assets/c4198108e8c26a3b97b4718d3d413822.png" alt="img" /></p>
<p>(图片来源:<a href="https://mp.weixin.qq.com/s/CGZmR5aFYHyEDdp5keGa1A?">微服务写的最全的一篇文章</a></p>
<p>如果以后又出来什么新的概念和技术你不妨从软件工程的角度去看看它和组织结构的关系。比如说这些天网上开始流传一个新的概念叫微前端Micro Frontends在我看来这说明现在开发的重心在往前端倾斜前端团队越来越庞大需要分拆了。</p>
<p><img src="assets/8ddb3e1f4b3417dc99bf7ec9f3685350.png" alt="img" /></p>
<p>(图片来源:<a href="https://martinfowler.com/articles/micro-frontends.html">Micro Frontends</a>)</p>
<h2>新技术改变了软件工程中的分工协作</h2>
<p>我们再来看看像云计算和人工智能这类技术,也许你会觉得它们代表了很多激动人心的高端技术,比如虚拟化、自动化、智能化等等。但这些新技术不仅是技术上有突破,更是对软件工程的开发过程,对分工协作都产生了深远的影响。云计算通过标准化的服务简化了开发的难度,人工智能和自动化在逐步替代项目中的一些手工操作。</p>
<p>在我大学上软件工程课的时候,老师跟我们说:“在建筑工程,用一些标准的模块,比如各种建筑材料组合在一起,就可以完成复杂的结构。这种标准化的结构可以极大地降低建造成本。希望未来软件工程也能像建筑工程一样,用一些标准的模块和组件,也可以构建出复杂的软件。”然而在十多年前,这个目标还是挺遥远的。</p>
<p>十多年前我办过网站,自己写程序,程序写完后要自己去买服务器放到机房托管,每年要给机房交托管费,还要定期数据备份,给服务器杀毒,装防火墙防止 DDos 攻击这种事情。万一服务器宕机了,需要给机房打电话,会有人帮忙重启一下,如果不行就得自己去机房了。</p>
<p>那时候的网络访问还有南北隔离的问题,也就是说你服务器放在南方电信,而用户是北方网通的,那么访问速度就特别慢,想要速度快就要用 CDNContent Delivery Network即内容分发网络以保证访问速度。但当时 CDN 的价钱不是普通用户能承受得了的。</p>
<p>可以说我办个网站是操碎了心。这也是很多中小企业早些年自己开发运行软件系统的写照:需要兼顾开发、测试和线上运维,什么事情都需要自己做。</p>
<p>但是现在,如果我再要去办一个网站,我不会再自己去买服务器托管,而会选一家云计算服务商,将我的程序放在云服务商运行,出问题了就重新部署或者再新开一个虚拟服务器。数据库我也不会自己去安装维护,直接用云数据库,这样省去了数据备份的烦恼。</p>
<p>就算是程序开发,我也不会所有功能自己实现,比如文件存储我会直接用七牛云之类的云存储服务,还能使用 CDN 服务。网站内容的搜索我也会考虑阿里云的文档检索服务,如果有手机 App 消息推送,直接用云厂商的推送服务。</p>
<p>早些年像语音识别、图像识别、地图导航这些高精尖的技术,普通中小公司是没有机会去使用的,或者要付出昂贵的成本。而现在这些高端技术,都有服务提供。如果你有一个好的想法,不用担心技术会限制你的想象力,借助这些服务,你可以实现你的想法。</p>
<p>早些年的开发团队,服务端比前端人数要多,因为那时候界面简单,而后端需要实现很多数据库增删改查的逻辑。现在的趋势是,界面越来越复杂,而后端服务越来越强大,借助一些云服务甚至不需要去写程序,就能实现服务端 API 供前端调用。比如我曾开发过一个微信小程序后端用的LeanCloud的服务不需要写后端代码就有一个不错的后端 API 服务。</p>
<p>如果你从软件工程的角度去看云计算,它本质上是在将那些与业务无关的,而又很重要的基础设施、技术,作为一种标准服务提供,让你在软件开发时,只需要专注于业务所独有的部分,从而可以极大地减少开发工作,提升开发效率。</p>
<p>随着云计算的普及,软件工程的标准化、模块化也慢慢出现了一线曙光,希望未来构建软件系统,也能像盖房子一样,通过标准化降低开发成本和难度。</p>
<p>人工智能是另一个现在很火的技术Alpha Go 在围棋上战胜了人类,无人驾驶也有了突破。另外,人工智能在软件工程领域,也有了一些应用和尝试,比如说微软开源了一个人工智能的项目叫<a href="https://github.com/Microsoft/ailab/tree/master/Sketch2Code">Sketch2Code</a>,可以把 UI 设计草图转成 HTML 代码,也就是一部分开发工作未来也许可以被人工智能替代了。</p>
<p>阿里巴巴在尝试智能化运维:《<a href="https://dbaplus.cn/news-134-2072-1.html">阿里智能运维平台的演进:从自动化到无人化</a>》,也就是将人工智能应用在运维领域,从而让人工智能去替代人工的很多操作。在测试领域,虽然还没有见到有成功的用人工智能替代人工测试的案例,但是自动化测试替代了大量手工测试是一个可见的趋势。</p>
<p>现阶段,这些应用只是一个开始,但不会是结束,未来会有更多云服务、人工智能在软件工程领域的应用,会对软件开发的分工协作产生更多影响。</p>
<p>但云服务、人工智能再强大,也难以替代那些创造性的劳动,也就是那些你业务和项目所独有的东西,比如说你对业务的抽象和设计,测试用例的设计,对整个项目过程的组织。</p>
<h2>在软件工程中,技术是工具</h2>
<p>对于像微服务、云计算、人工智能这些新技术,如果站在技术角度看,技术人员永远有两种态度:拥抱新技术和抵触新技术。</p>
<p>但如果你站在软件工程的角度去看技术:**技术服务于架构设计,架构设计服务于业务,业务服务于商业。**也就是本质上来说,技术是为项目服务的工具。</p>
<p>做一个项目,首先是要去解决一个商业问题,比如说你要网上卖东西。然后基于这个商业问题,你要设计一个业务,比如做一个在线商城系统。当你确定了你的业务,你再去设计出适合这个业务的架构,比如设计一个三层架构。最后架构设计好了,你再去选择适合这个架构的技术,比如 PHP+MySQL。</p>
<p>但现实中常常不是这样的,开发人员学会了微服务的技术,就像有了一个锤子满世界找钉子,所以当你需要一个在线商城系统,他会给你按照微服务搭一个架构出来,也许你只要一个简单的 PHP+MySQL 系统就足够了。</p>
<p>或者说最开始你的架构就是简单的三层架构,能很好地满足当时的需求,然后业务不断壮大,于是服务越来越大,团队也越来越大,沟通成本非常高,非常有必要对团队进行分拆。那么这时候微服务就是适合你的架构,而你的技术负责人不懂微服务,也很抵触微服务,就不太可能推动这样的转变。</p>
<p>对于这些新技术,如果只是从技术角度去看,就会更多考虑这个技术喜不喜欢,酷不酷,难不难学,而不容易考虑到如何更好地去为架构服务。</p>
<p>但要是从软件工程的角度,就会把技术当作工具,去学习了解这些新技术,然后进一步思考:这个技术能解决什么问题?应用在项目中有什么样的优缺点?</p>
<p>当你不仅仅是从技术角度去看这些新技术,而是能同时站在软件工程角度看这些新技术时,就能真正的让技术去为架构服务,让架构去为业务服务,从而帮助业务产生好商业价值。</p>
<h2>总结</h2>
<p>不管是现在还是将来,你总是免不了要去面对新技术。从技术角度去看新技术,也许你会兴奋,也许你会抵触,但是如果你跳出技术角度之外,站在软件工程的角度去看新兴技术,你会有不一样的收获。</p>
<p>技术架构等同于组织架构,当你在设计系统架构,你同时也在设计你的组织架构,反之亦然。当你纠结微服务的拆分粒度,不妨看看你的组织架构是不是能和微服务架构匹配。</p>
<p>云计算、人工智能这些新兴技术也逐步改变了分工协作,云计算这样的基础服务,可以降低开发成本,让你可以专注于业务开发;人工智能和自动化技术的发展,也逐步替代了原有的像手工测试、手工运维的工作。但对于创造性的劳动,例如业务的设计和抽象,测试用例的设计和项目过程的组织,是不太可能会被替代的。</p>
<p>最后,技术是工具。技术服务于架构设计,架构设计服务于业务,业务服务于商业。对新技术,保持学习和了解,知道新技术能为你解决项目中什么问题,就像工具一样,选择合适的技术,让技术为架构服务。</p>
</div>
</div>
<div>
<div style="float: left">
<a href="/专栏/软件工程之美/44 微软、谷歌、阿里巴巴等大厂是怎样应用软件工程的?.md.html">上一页</a>
</div>
<div style="float: right">
<a href="/专栏/软件工程之美/一问一答第1期 30个软件开发常见问题解决策略.md.html">下一页</a>
</div>
</div>
</div>
</div>
</div>
</div>
<a class="off-canvas-overlay" onclick="hide_canvas()"></a>
</div>
<script defer src="https://static.cloudflareinsights.com/beacon.min.js/v652eace1692a40cfa3763df669d7439c1639079717194" integrity="sha512-Gi7xpJR8tSkrpF7aordPZQlW2DLtzUlZcumS8dMQjwDHEnw9I7ZLyiOj/6tZStRBGtGgN6ceN6cMH8z7etPGlw==" data-cf-beacon='{"rayId":"70997ca22df33cfa","version":"2021.12.0","r":1,"token":"1f5d475227ce4f0089a7cff1ab17c0f5","si":100}' crossorigin="anonymous"></script>
</body>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-NPSEEVD756"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-NPSEEVD756');
var path = window.location.pathname
var cookie = getCookie("lastPath");
console.log(path)
if (path.replace("/", "") === "") {
if (cookie.replace("/", "") !== "") {
console.log(cookie)
document.getElementById("tip").innerHTML = "<a href='" + cookie + "'>跳转到上次进度</a>"
}
} else {
setCookie("lastPath", path)
}
function setCookie(cname, cvalue) {
var d = new Date();
d.setTime(d.getTime() + (180 * 24 * 60 * 60 * 1000));
var expires = "expires=" + d.toGMTString();
document.cookie = cname + "=" + cvalue + "; " + expires + ";path = /";
}
function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i].trim();
if (c.indexOf(name) === 0) return c.substring(name.length, c.length);
}
return "";
}
</script>
</html>