mirror of
https://github.com/zhwei820/learn.lianglianglee.com.git
synced 2025-09-30 15:16:43 +08:00
389 lines
33 KiB
HTML
389 lines
33 KiB
HTML
<!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>其实组织架构和技术架构相似这个现象不是偶然的,这个现象背后有个定律叫康威定律 (Conway’s 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>(图片来源:Conway’s Law)</p>
|
||
<p>看完康威定律再回过头来看微服务,<strong>你会发现,微服务架构的设计,不仅仅是一个对服务拆分的架构设计,同时也是对组织架构拆分的设计。</strong></p>
|
||
<p>当你在做架构设计,在考虑你的微服务拆分粒度的时候,不妨先想一想:你团队的组织结构是什么样的?真的大到需要用微服务了吗?你能按照微服务的设计去重新设计和调整你的组织结构吗?</p>
|
||
<p>当你在设计系统架构的同时,把组织架构的设计也考虑进去,很多问题也就迎刃而解了。比如说你开发团队 30 个人,要使用微服务的架构,那么拆成 3~5 个微服务是比较合适的。因为每个小组 10 个人左右,每个小组维护 1~3 个微服务,是相对比较合适的配比。</p>
|
||
<p>然后你再看那些应用微服务失败的案例,比如说一个小开发团队,做出 100 多个微服务的架构,那团队维护这些服务的成本一定是相当高的,最终会难以维持。就像这篇文章:《<a href="https://mp.weixin.qq.com/s?__biz=MzIxMzEzMjM5NQ==&mid=2651032374&idx=1&sn=b9a44cc1fd143e8d958587ff05f1acf5&chksm=8c4c5e32bb3bd7246ad28bee556649dde1ffeaae086c8bdfc27c054b32042a89c456aed4cbe5&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>那时候的网络访问还有南北隔离的问题,也就是说你服务器放在南方电信,而用户是北方网通的,那么访问速度就特别慢,想要速度快就要用 CDN(Content 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>
|