现代软件工程的《构建之法》
要想了解世界,就必须亲自来打造它。
—— 帕韦泽(Cesare Pavese)
国庆假日期间,我重读了邹欣老师的《构建之法》一书。我从事软件行业相关工作超过15年,每每在被问到给在校计算机专业大学生的学习建议时,我都会推荐这本在教育界引起广泛关注、旨在推动中国现代软件工程教育改革的教材。
我当年没有机会接受这么有体系且现代的软件工程教育,这一定意义上成为了走向软件领域更高殿堂的阻碍,虽然有一些吃亏上当后长的见识和东一下西一点偷学来的、经常会相互打架的草莽经验,但邹老师写的这本书面世后,我如获至宝,曾经写下170多页的读书笔记,并给当时我所带领的研发团队及周围的朋友们分享,所以在我看来,它不仅仅在学校教育中有巨大的现实意义,对于很多像我们这样的已经走上工作岗位甚至工作很多年的人,也有很好的参考价值。
构建之法是什么
这本《构建之法》一版再版,可见其受欢迎程度之高。我有幸跟邹老师成为同事,但早在我加入微软之前,就因为看了他第一本书《移山之道》后主动写信讨教,承蒙不弃,后来也一直保持联系。
正如我在开头处引用的这句话 “要想了解世界,就必须亲自来打造它。”,我们所处的世界、我们自己(不管是物质层面还是精神层面),其实都是一点一点构建出来的。邹欣老师有超过20年、在世界顶级公司从事大型软件研发的经历,更是不可多得的既能传道授业、又深谙合作之道的人才,他通过三本书给我们构建了一个“如何构建开发复杂软件” 的知识结构。
软件开发能力 = 软件工程能力+程序构造能力
移山之道。我第一次看到这本书的感觉就是:“哇,技术图书居然还可以这样写啊!”。这本书用多个丰富生动的角色,给读者呈现了一个虚拟的软件公司及其日常发生的故事。这本书我个人觉得是构建之法的雏形,只是当时在工具应用这个方面着墨较多。
编程之美。这是邹老师和几位同事一起编写的微软技术面试心得,干货满满,有大量的算法案例。这一本书,强调的是程序员的个人建设中最为核心的能力:算法和编程能力。
构建之法。这本书则是真正成体系的软件工程教材,他利用业余时间在数所高校进行了长达6年的软件工程教学实践,总结出了在16周的时间内让同学们通过“做中学(learning by doing)”掌握实用的软件工程技术的教学计划,得到了高校师生的积极反馈。在此基础上对软件工程的各个知识点和技能要求进行了系统性整理,形成教材。本书共分17章,对照美国ACM/IEEE 2013年新出版的计算机科学教学指导(Computer Science Curricula 2013)中的软件工程部分,这本教材覆盖了其中大多数Core-Tier 1和Core –Tier 2的内容。可以说,全书对软件工程内容的覆盖不逊于任何一本现行的教材,同时讲述了业界最新实践方法。
构建之法是怎么构建出来的
构建之法 已经不仅仅是作为一本书,更是现代软件工程教育的一个有益实践。2007年在清华大学首次实践后,从2009年至今,经过北京航空航天大学、福州大学、集美大学等三十余所学校的不断迭代与改进,现已形成了一套成熟的软件工程课程教学体系,覆盖了软件工程和编程语言的教学。该教学体系有下面的特点:
练习量大, 内容多:除了大量的代码练习,还有大量的博客写作练习。
结构紧凑:个人项目/结对项目/团队项目紧密配合, 能在16 周讲完,针对8或12周的教学长度,也有对应的配置与组合。
理论和实践相结合:讲现代理论,同时结合体现理论的工具,例如:要求所有代码使用Git和Github进行管理
真实的团队开发:要求使用原型设计工具设计项目,使用团队开发工具管理任务分配,使用燃尽图进行进度管控、等等一应俱全…
面向实战:强调“做中学” , 团队项目公开发布,使用用户数量与用户的真实反馈作为评价项目重要的标准。
学生助教+企业助教模式,学生助教熟悉课程,能够协助老师,与学生充分互动;企业助教则经验丰富,视野开阔,能使用工业界中的鲜活实例解答学生在实践中的疑问。
鼓励探索:鼓励学生 “动手实践,自己摸索,提出问题,解决问并总结, 从实践中,从同伴中,从思辨中学习” 。
在2017年底的“第一届构建之法软件工程实践教学论坛”上面,邹老师分享了这十多年来的历程。
我这里还想给大家分享一点我的观察。这本书以及它所倡导的软件工程教育改革目前所取得的一点点成功并不是偶然的,正如所有的大型、复杂软件的成功必有缘由一样。它至少拥有如下的成功要素
社会需求明显,改革适逢其时。任何的改革,都是讲究时机的,教育的改革尤其如此。当年是教育部和微软研究院合作的一个契机,邹老师作为特派的专家到清华开展软件工程的实践,由此找到了一个切入点,他通过不懈的努力,不仅得到了中国科学院院士及国务院学位委员会委员的支持和认可,更带动了一批同样有想法的老师和学生,得以持续把这个工作深化下去,星星之火渐成燎原之势。
核心架构师或主程的能力超强。如果拿开发软件来说,邹老师就是这整个工程的架构师或主程。虽然软件工程可以从一定意义上降低对“超级巨星”的依赖,确保大部分软件项目的水准在平均线以上,但毫无疑问,拥有一个能力超强的架构师或主程,则肯定会事半功倍,更何况邹老师的能力可不仅仅是软件工程呢。
项目团队强大,运营有方。我必须强调这一点,是因为我对于邹老师背后的策划、出版、运营团队也很熟悉。他们的口号是“服务能人中的忙人,忙人中的能人”,他们做了很多专业且细致的工作,让架构师设计的架构能真的得以实现。
构建之法所带来的成效
构建之法是一个为期16周的现代软件工程教程,要检验它的成效,就必须由学校老师和学生来发言。我找到一份材料,是北航计算机学院的罗杰老师在“第一届构建之法软件工程实践教学论坛” 上面所做的分享。
罗老师分别从几个方面总结和展示了他们学院的课程改革成果。
软件工程教育是一种综合素质培养,罗老师还特别总结了对学生的升学、科研、实习和工作等方面的影响。
我对构建之法的展望与思考
如果按照工程的方法去构建软件项目,则其成功的机会将远远大于没有采用软件工程的项目。构建之法是关于现代软件工程的知识体系,这本书必将在相当长的时间内对中国的软件工程教育产生积极和深远影响。
另一方面来说,时代是在不断地发展,它也给我们提出了越来越多的新课题。我做如下的展望,同时也有一些思考,给邹老师及大家参考。
当今的世界是一个技术驱动和数据驱动的世界,而人工智能(AI)大行其道也是很自然的。软件一方面要体现出来越来越易于使用的体验(对最终用户,或者对前端开发者),一方面则体现出平台层面尤其是底层后台会越来越复杂。
软件服务模式的变化,随之而来,对于软件开发者来说的要求也会发生变化,总体来说,编写软件会越来越容易——至少看起来是这样——谁都可以马上写出一个“软件”来;同时,一个残酷的事实就是专业的程序员的门槛将越来越高。那么,这就提出了一个命题:对于这两类软件开发者,他们对于软件工程的需求是否有不一样?是否需要或者如果针对他们有不同的方案?
如果以后有 AI 参与编程,对软件工程是否有什么新的挑战?
不光是软件服务模式在发生变化,软件构建和交付模式也在发生一些变化。在《构建之法》中有对敏捷流程和MSF(Microsoft Solution Framework)的精彩阐述,而现在几乎所有的软件项目都在想办法DevOps了吧。不知道在新一版的构建之法中,是否会考虑这种变化?
文末福利
感谢你认真读完这篇文章,欢迎大家提出反馈意见。 希章原文的福利请阅读:现代软件工程的《构建之法》
我的《Office 365 开发入门指南》的介绍,有机会请参考 《Office 365开发入门指南》上市说明和读者服务
现代软件工程的《构建之法》相关推荐
- 软件工程《构建之法》—概论
一.第一章计算机专业术语 1.1 软件=程序+软件工程 程序=数据结构+算法 软件=程序+软件工程 可以扩展为 软件企业=软件+商业模式 1968年提出了"软件工程"这个概念,软件 ...
- 《构建之法》课程总结及建议
时间飞逝,不知不觉间本学期的软件工程概论课程已经学习完了.本学期课程围绕<现代软件工程:构建之法>的学习思想展开.在这将近半学期的学习中,虽然我不能说我将<现代软件工程:构建之法&g ...
- 构建之法现代软件工程(第五次)
构建之法现代软件工程(第五次) 这周我阅读了<构建之法>第六第七章 敏捷开发的原则: (1)尽早并持续地交付有价值的软件以满足顾客的需求: (2)敏捷流程欢迎需求的变化,并利用这种变化来提 ...
- 快速通读《现代软件工程——构建之法》
在快速通读<现代软件工程--构建之法>后,我有如下问题: Q1:第一章通过形象的例子告诉我们什么是软件工程,介绍了软件工程的各个阶段,对软件工程的概念及它的特性做了较为生动而详细的介绍,那 ...
- 读《现代软件工程--构建之法》所思
1.软件的开发过程中,如果软件的诸多特点组合,会不会造成不可控制的局面产生,比如:复杂性.不可见性.不可预见性.易变性.非连续性等特点结合,程序会不会变得像病毒程序一样,再次具有隐蔽性.传染性.触发性 ...
- 软件工程-构建之法 团队
软件工程-构建之法 团队 团队名称:yousa_team 团队宣言:认真做事 团队博客:http://www.cnblogs.com/yousa-team/ 团队队长:王天宁 队长博客链接:http: ...
- 浅读《构建之法:现代软件工程》有感
读完邹欣老师的<构建之法>绪论之后,感觉对软件工程有了大概的了解,软件工程可以说是把系统的.有序的.可量化的方法应用到软件的开发.营运和维护管理上的过程,是一个复杂.需要长期经营的过程:软 ...
- 《构建之法》学习总结1——软件工程概论,团队组织及管理,开发流程
写在前面: 这是我作为一个软件工程专业学生的第一篇个人技术博客,虽然我接下来的人生中还会有无数像这样的博客,但这是一个开始,接下来我将会从一个软件工程专业的大学生向一个合格的程序元转变.说实话现在,这 ...
- 小强怎样练成——读《现代软件工程——构建之法》第三章有感
小强怎样练成 ----读<现代软件工程--构建之法>第三章有感 一.知道自己吃几碗干饭 先秦时期的"革命家"告诉我们"知人者智,自知者明",&quo ...
最新文章
- 关于《Android应用开发揭秘》中早期版本中联系人例子错误的解决办法
- UFS和eMMC闪存差异在哪?
- 大数据为智慧城市建设添砖加瓦
- UA MATH565C 随机微分方程V 无穷小生成算子
- Web应用界面设计规范
- HALCON示例程序bottle.hdev、bottlet.hdev瓶体字符OCR的训练和检测
- 初窥wordcloud之老司机带你定制词云图片
- es6 Object.getOwnPropertyDescriptors()
- iview表格嵌套Tooltip
- java对象的我可变属性,不可变对象的所有属性都必须是最终的吗?
- 海思Hi3518EV200 SDK源码分析笔记
- 无线AP密码破解方法
- 软件测试中的80/20原则
- 推荐一款鼠标手势的软件,开源且免费
- Broken Pipe
- python中r 4.2f%r,006 Python中的 字符串String
- Python获取指定月份的所有天数
- WordPress相关二次开发教程篇,简单易学
- MacOS没有管理员账号的解决方法
- anaconda下载python的库_Anaconda下载及安装及查看安装的Python库用法
热门文章
- 目标检测算法之Fast R-CNN算法详解
- 关于Activity的getReferrer():如何在Activity中获取调用者?
- python 3.* + Eclipse mar.2 +pydev 5.0 环境搭建
- 三种方式使得iOS应用能够在后台进行数据更新和下载
- linux 安全审计
- 关于虚拟机下linux共享Windows文件的解决方案
- 为什么 Dapper 的批量插入比我预期的要慢很多?
- 【Azure + Core】实现CI/CD(一)构建镜像并推送仓库
- Docker小白到实战之容器数据卷,整理的明明白白
- ASP.NET Core使用Middleware有条件地允许访问路由