现代软件工程的《构建之法》

要想了解世界,就必须亲自来打造它。

—— 帕韦泽(Cesare Pavese)


国庆假日期间,我重读了邹欣老师的《构建之法》一书。我从事软件行业相关工作超过15年,每每在被问到给在校计算机专业大学生的学习建议时,我都会推荐这本在教育界引起广泛关注、旨在推动中国现代软件工程教育改革的教材。


我当年没有机会接受这么有体系且现代的软件工程教育,这一定意义上成为了走向软件领域更高殿堂的阻碍,虽然有一些吃亏上当后长的见识和东一下西一点偷学来的、经常会相互打架的草莽经验,但邹老师写的这本书面世后,我如获至宝,曾经写下170多页的读书笔记,并给当时我所带领的研发团队及周围的朋友们分享,所以在我看来,它不仅仅在学校教育中有巨大的现实意义,对于很多像我们这样的已经走上工作岗位甚至工作很多年的人,也有很好的参考价值。

640?wx_fmt=png

构建之法是什么


这本《构建之法》一版再版,可见其受欢迎程度之高。我有幸跟邹老师成为同事,但早在我加入微软之前,就因为看了他第一本书《移山之道》后主动写信讨教,承蒙不弃,后来也一直保持联系。


640?wx_fmt=jpeg



正如我在开头处引用的这句话 “要想了解世界,就必须亲自来打造它。”,我们所处的世界、我们自己(不管是物质层面还是精神层面),其实都是一点一点构建出来的。邹欣老师有超过20年、在世界顶级公司从事大型软件研发的经历,更是不可多得的既能传道授业、又深谙合作之道的人才,他通过三本书给我们构建了一个“如何构建开发复杂软件” 的知识结构。


软件开发能力 = 软件工程能力+程序构造能力


  1. 移山之道。我第一次看到这本书的感觉就是:“哇,技术图书居然还可以这样写啊!”。这本书用多个丰富生动的角色,给读者呈现了一个虚拟的软件公司及其日常发生的故事。这本书我个人觉得是构建之法的雏形,只是当时在工具应用这个方面着墨较多。

  2. 编程之美。这是邹老师和几位同事一起编写的微软技术面试心得,干货满满,有大量的算法案例。这一本书,强调的是程序员的个人建设中最为核心的能力:算法和编程能力。

  3. 构建之法。这本书则是真正成体系的软件工程教材,他利用业余时间在数所高校进行了长达6年的软件工程教学实践,总结出了在16周的时间内让同学们通过“做中学(learning by doing)”掌握实用的软件工程技术的教学计划,得到了高校师生的积极反馈。在此基础上对软件工程的各个知识点和技能要求进行了系统性整理,形成教材。本书共分17章,对照美国ACM/IEEE 2013年新出版的计算机科学教学指导(Computer Science Curricula 2013)中的软件工程部分,这本教材覆盖了其中大多数Core-Tier 1和Core –Tier 2的内容。可以说,全书对软件工程内容的覆盖不逊于任何一本现行的教材,同时讲述了业界最新实践方法。




构建之法是怎么构建出来的

构建之法 已经不仅仅是作为一本书,更是现代软件工程教育的一个有益实践。2007年在清华大学首次实践后,从2009年至今,经过北京航空航天大学、福州大学、集美大学等三十余所学校的不断迭代与改进,现已形成了一套成熟的软件工程课程教学体系,覆盖了软件工程和编程语言的教学。该教学体系有下面的特点:

  1. 练习量大, 内容多:除了大量的代码练习,还有大量的博客写作练习。

  2. 结构紧凑:个人项目/结对项目/团队项目紧密配合, 能在16 周讲完,针对8或12周的教学长度,也有对应的配置与组合。

  3. 理论和实践相结合:讲现代理论,同时结合体现理论的工具,例如:要求所有代码使用Git和Github进行管理

  4. 真实的团队开发:要求使用原型设计工具设计项目,使用团队开发工具管理任务分配,使用燃尽图进行进度管控、等等一应俱全…

  5. 面向实战:强调“做中学” , 团队项目公开发布,使用用户数量与用户的真实反馈作为评价项目重要的标准。

  6. 学生助教+企业助教模式,学生助教熟悉课程,能够协助老师,与学生充分互动;企业助教则经验丰富,视野开阔,能使用工业界中的鲜活实例解答学生在实践中的疑问。

  7. 鼓励探索:鼓励学生 “动手实践,自己摸索,提出问题,解决问并总结, 从实践中,从同伴中,从思辨中学习” 。


在2017年底的“第一届构建之法软件工程实践教学论坛”上面,邹老师分享了这十多年来的历程。


640?wx_fmt=png


我这里还想给大家分享一点我的观察。这本书以及它所倡导的软件工程教育改革目前所取得的一点点成功并不是偶然的,正如所有的大型、复杂软件的成功必有缘由一样。它至少拥有如下的成功要素


  1. 社会需求明显,改革适逢其时。任何的改革,都是讲究时机的,教育的改革尤其如此。当年是教育部和微软研究院合作的一个契机,邹老师作为特派的专家到清华开展软件工程的实践,由此找到了一个切入点,他通过不懈的努力,不仅得到了中国科学院院士及国务院学位委员会委员的支持和认可,更带动了一批同样有想法的老师和学生,得以持续把这个工作深化下去,星星之火渐成燎原之势。

  2. 核心架构师或主程的能力超强。如果拿开发软件来说,邹老师就是这整个工程的架构师或主程。虽然软件工程可以从一定意义上降低对“超级巨星”的依赖,确保大部分软件项目的水准在平均线以上,但毫无疑问,拥有一个能力超强的架构师或主程,则肯定会事半功倍,更何况邹老师的能力可不仅仅是软件工程呢。

  3. 项目团队强大,运营有方。我必须强调这一点,是因为我对于邹老师背后的策划、出版、运营团队也很熟悉。他们的口号是“服务能人中的忙人,忙人中的能人”,他们做了很多专业且细致的工作,让架构师设计的架构能真的得以实现。



构建之法所带来的成效


构建之法是一个为期16周的现代软件工程教程,要检验它的成效,就必须由学校老师和学生来发言。我找到一份材料,是北航计算机学院的罗杰老师在“第一届构建之法软件工程实践教学论坛” 上面所做的分享。


640?wx_fmt=png

罗老师分别从几个方面总结和展示了他们学院的课程改革成果。

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

软件工程教育是一种综合素质培养,罗老师还特别总结了对学生的升学、科研、实习和工作等方面的影响。

640?wx_fmt=png

640?wx_fmt=png


我对构建之法的展望与思考


如果按照工程的方法去构建软件项目,则其成功的机会将远远大于没有采用软件工程的项目。构建之法是关于现代软件工程的知识体系,这本书必将在相当长的时间内对中国的软件工程教育产生积极和深远影响。


另一方面来说,时代是在不断地发展,它也给我们提出了越来越多的新课题。我做如下的展望,同时也有一些思考,给邹老师及大家参考。


当今的世界是一个技术驱动和数据驱动的世界,而人工智能(AI)大行其道也是很自然的。软件一方面要体现出来越来越易于使用的体验(对最终用户,或者对前端开发者),一方面则体现出平台层面尤其是底层后台会越来越复杂。


软件服务模式的变化,随之而来,对于软件开发者来说的要求也会发生变化,总体来说,编写软件会越来越容易——至少看起来是这样——谁都可以马上写出一个“软件”来;同时,一个残酷的事实就是专业的程序员的门槛将越来越高。那么,这就提出了一个命题:对于这两类软件开发者,他们对于软件工程的需求是否有不一样?是否需要或者如果针对他们有不同的方案?


如果以后有 AI 参与编程,对软件工程是否有什么新的挑战?


不光是软件服务模式在发生变化,软件构建和交付模式也在发生一些变化。在《构建之法》中有对敏捷流程和MSF(Microsoft Solution Framework)的精彩阐述,而现在几乎所有的软件项目都在想办法DevOps了吧。不知道在新一版的构建之法中,是否会考虑这种变化?


640?wx_fmt=png


文末福利


感谢你认真读完这篇文章,欢迎大家提出反馈意见。 希章原文的福利请阅读:现代软件工程的《构建之法》

我的《Office 365 开发入门指南》的介绍,有机会请参考 《Office 365开发入门指南》上市说明和读者服务

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

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

相关文章

牛客练习赛 62

A.牛妹的游戏 Ramsey定理:人话解释任意六个人中要么至少三个人认识,要么至少三个不认识。 结论简要证明: 假设 666 个据点分别为 A,B,C,D,E,FA,B,C,D,E,FA,B,C,D,E,F那么在 A 连向其它据点的控制链中,必然至少有 333条链被同一方控制&#x…

【图论】【斜率优化】前往大都会(loj 2769)

正题 jzoj 7181 题目大意 给你由若干铁路组成的图(一个铁路上有若干点),问你从1到n在最短路径的前提下,乘坐的每一条铁路所花费时间的平方和的最大值 解题思路 先用dij跑出最短路图(即长度等于最短路的所有路径&…

AT4995-[AGC034E] Complete Compress【树形dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT4995 题目大意 nnn个点的一棵树,上面有一些棋子,每次可以选择两个棋子移动到他们之间的路径上相邻的点上,求最少多少步能移动到一个点上。 n∈[1,2000]n\in[1,2000]n∈[1,2000] 解题思路 …

【每日一题】8月10日题目精讲—排座椅

来源:牛客网: 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 51200K,其他语言102400K 64bit IO Format: %lld题目描述 上课的时候总有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的…

使用Consul做服务发现的若干姿势

从2016年起就开始接触Consul,使用的主要目的就是做服务发现,后来逐步应用于生产环境,并总结了少许使用经验。最开始使用Consul的人不多,为了方便交流创建了一个QQ群,这两年微服务越来越火,使用Consul的人也…

【费用流】【线性规划】志愿者招募(luogu 3980)

正题 luogu 3980 题目大意 有n个时刻,第i个时刻需要aia_iai​个志愿者,有m类志愿者,第j类可以从ljl_jlj​做到rjr_jrj​,代价为wjw_jwj​,数量无限,问你使所有时刻志愿者个数都足够的最小代价 解题思路 …

YbtOJ#643-机器决斗【贪心,李超树】

正题 题目链接:https://www.ybtoj.com.cn/problem/643 题目大意 nnn个机器人,第iii个攻击力为AiA_iAi​,防御为DiD_iDi​。 然后你每次可以对一个机器人造成AtkAtkAtk点伤害,之后所有机器人对你进行一次攻击。 开局可以删除两个机器人&…

【每日一题】8月11日题目精讲—矩阵消除游戏

来源:牛客网: 时间限制:C/C 1秒,其他语言2秒 空间限制:C/C 262144K,其他语言524288K 64bit IO Format: %lld题目描述 牛妹在玩一个名为矩阵消除的游戏,矩阵的大小是n行m列,第i行第…

牛客练习赛 61(待补F-点分治?)

A. 打怪 先求出每次打死一只怪需要掉多少血&#xff0c;然后就直接算出能够打死多少只。 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> using namespace std; int main() {IO…

asp.net core集成CAP(分布式事务总线)

一、前言感谢杨晓东大佬为社区贡献的CAP开源项目&#xff0c;传送门在此&#xff1a;.NET Core 事件总线,分布式事务解决方案&#xff1a;CAP 以及 如何在你的项目中集成 CAP【手把手视频教程】&#xff0c;之前也在工作中遇到分布式数据一致性的问题&#xff0c;也一直都是基于…

Ybt#452-序列合并【期望dp】

正题 题目链接:https://www.ybtoj.com.cn/contest/113/problem/2 题目大意 一个空序列&#xff0c;每次往末尾加入一个[1,m][1,m][1,m]中的随机一个数。如果末尾两个数相同都为xxx且(x<t)(x<t)(x<t)&#xff0c;那么将它们合并成x1x1x1。 如果序列长度为nnn且无法合…

【Trie】【费用流】管道监控(loj 3026)

正题 loj 3026 题目大意 给你一棵树&#xff0c;和若干匹配串&#xff0c;如果一个节点向下的某条链构成了匹配串i&#xff0c;则可以花费这w_i匹配这条链&#xff0c;问你匹配完所有点的最小代价 解题思路 这题可以理解为树上树上的线性规划 先对于每个匹配串倒着建trie&a…

【每日一题】8月12日题目精讲 Mr. Kitayuta, the Treasure Hunter

来源&#xff1a;牛客网&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 The Shuseki Islands are an archipelago of 30001 small islands in the Yutampo Se…

.Net Core中利用TPL(任务并行库)构建Pipeline处理Dataflow

在学习的过程中&#xff0c;看一些一线的技术文档很吃力&#xff0c;而且考虑到国内那些技术牛人英语都不差的&#xff0c;要向他们看齐&#xff0c;所以每天下班都在疯狂地背单词&#xff0c;博客有些日子没有更新了&#xff0c;见谅见谅 什么是TPL?Task Parallel Library (T…

AT3950-[AGC022E]Median Replace【贪心,dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT3950 题目大意 一个包含?,0,1?,0,1?,0,1的长度为奇数的序列&#xff0c;把???替换为0/10/10/1。每次可以选择三个数变成它们的中位数&#xff0c;求有多少种替换方案使得能够把序列最终变为一个111。 1≤∣S∣≤3105…

【excrt】屠龙勇士(luogu 4774)

正题 luogu 4774 题目大意 有n条龙&#xff0c;第i条血量为aia_iai​&#xff0c;回血量为bib_ibi​&#xff0c;杀死后掉落伤害为DiD_iDi​的刀&#xff0c;初始有若干刀 杀第i条龙要用现有伤害比aia_iai​小的刀中伤害最大的&#xff08;如果没有就用伤害最小的&#xff0…

牛客练习赛 60(待补E-长链剖分或者dsu)

A.大吉大利 位运算有独立性&#xff0c;按位计算对答案的贡献即可。 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<iostream> #include<algorithm> using namespace std; typedef long long ll; typedef uns…

.NET Core Agent

熟悉java的朋友肯定知道java agent&#xff0c;当我看到java agent时我很是羡慕&#xff0c;我当时就想.net是否也有类似的功能&#xff0c;于是就搜索各种资料&#xff0c;结果让人很失望。当时根据 https://github.com/OpenSkywalking/skywalking-netcore 找到这个 https://d…

【每日一题】8月14日题目精讲 [SCOI2010]游戏

来源&#xff1a;牛客网&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 lxhgww最近迷上了一款游戏&#xff0c;在游戏里&#xff0c;他拥有很多的装备&#x…

AT3957-[AGC023F]01 on Tree【贪心,堆】

正题 题目链接:https://www.luogu.com.cn/problem/AT3957 题目大意 nnn个节点的一棵树&#xff0c;每个节点有0/10/10/1。每次删除一个根节点&#xff0c;然后把该节点的值填入序列&#xff0c;求最终序列的最小逆序对数量。 n≤2105n\leq 2\times 10^5n≤2105 解题思路 考虑…