内容介绍:
布鲁克斯在他的论文《没有银弹:软件工程中的根本和次要任务》中指出,所有软件开发活动包括根本任务和次要任务:前者指打造构成抽象软件实体的复杂概念结构;后者指使用编程语言表达这些抽象实体,并在空间和时间限制内将它们映射成机器语言。基于我(指讲师)自己的实践与认知,我称前者为软件设计,后者为编码,用公式表示是“软件开发 = k*软件设计 + 编码”,其中k是一个远大于1的常数,以示软件设计在软件开发活动中的主导地位。
不过,软件设计是相当抽象的活动,背后涉及大量的思考和对业务、专业知识的掌握,还需要通过实践才能领悟。现实工作中,无论工程师是否意识到软件设计活动的存在,他所写的代码都是经过软件设计后的产物,只不过是好的软件设计还是差的软件设计的问题。糟糕的软件设计包含但不限于这些表现:
l概念不清晰,无法基于生活常识去塑造概念,帮助他人基于生活常识快速地理解自己的软件设计;
l概念不连续、缺乏一致性,导致不同模块之间的概念得做适配或转换,这样的“胶水”代码让人觉得很难维护,结果整个软件的代码毫无优雅可言,工程师在这样的“脏乱差”的环境中,很难建立起对软件设计质量的重视,并掌握有助于构建职业安全竞争壁垒的软件设计能力;
l概念之间的关系因为呈现面条状而让人难以理解,很容易因为解决一个问题而引发另一个问题,甚至出现补来补去质量水平也不见得提高的现象;
l以上问题导致最终设计出的软件无论是API还是人机交互都难用,将软件设计层面的混乱传递给了客户或用户。
即便工程师有良好的软件设计意识,但后面还有更重要的、来自非专业技术方面的挑战,那就是如何确保软件设计是符合客户的需要,以及在整个开发活动中如何确保软件设计与需求的连续性,前者涉及个人的业务技能——做对客户有价值的事,后者涉及个体的知识管理技能——掌握相应的工具、通过文档实现知识的传承与交换。忽视这些技能所带来的问题包含但不限于:
l开发工作不能很好地满足客户需求,出现返工而带来研发低效的问题;
l不能很好地表达软件设计,除了导致与客户难以就软件设计进行交流外,内部也很难就软件设计进行交流(比如,评审、阅读);
本工作坊旨在帮助学员和企业解决以上问题或挑战。让学员从意识、工具和方法等维度掌握软件设计,通过以工作中碰到的实际问题的解决,实现以练促学,帮助学员走完学习的“最后一公里”,即完成所学知识的转化。
学习目标:
本工作坊将帮助学员:
l理解什么是业务技能,为何对于工程师来说,确保软件设计质量需要有良好的业务技能。
l理解领域驱动设计(DDD)能很好地改善软件的设计质量,并实现与客户的高效交流。
l学习UML建模语言的语法,练习通过UML工具来表达软件设计。
l对软件设计有更为深刻的认识,并掌握一定的设计原则与方法。
l掌握高质量的软件设计文档应当包含哪些关键内容,如何写出一份不错的软件设计文档。
l建立起知识管理的意识,对知识管理的价值和意义有很好的理解。
学习对象:
l软件开发工程师。
学习条件:
l学员得自带笔记本电脑并提前安装好Visual Paradigm或Visio UML,以及Xmind工具。
l学员将采用分组的方式组织学习,并需要通过在线文档协作编辑的方式完成课堂上的软件设计任务。
l因为存在分组,所以对场地有一定的要求,需要能布置大约7人一组的学习环境。
l每组需要有纸或白板做话题讨论,如果环境受限,可以采用线上文档来解决。
l会场需要能访问互联网,以便学员搜索学习资料。
讲师介绍:
l职业经历跨越电力、通信、互联网、芯片行业。
l有电气、硬件和软件开发经验及十年技术管理经验。
l曾任摩托罗拉全球系统架构师:
o负责4G方面的软件架构工作。
l前阿里巴巴高级技术专家:
oUC浏览器电脑版技术团队主管;
o作为技术一号位负责新技术在阿里集团内部落地。
l曾担任拟上市公司的高管:
o负责包含售前、售后、生产和产品研发多个部门。
l对软件行业的核心竞争力——软件设计能力和工程能力——有深刻的认识。
l浙江大学工商管理硕士。
l两本书的作者:
o《专业嵌入式软件开发:全面走向高质高效编程》(2012)长销书
o《全面效能:从个人发展到团队进化的方法论与实践》(2024年8~9月上市)
l线上课程作者:
o极客时间App:《工程师个人发展指南》
培训大纲:
环节、目的与内容
|
|
环节一:Check-in
(破冰)
|
目的:
|
工作坊因为需要大家一起合作,通过这个环节调整学员的情绪,达到活跃气氛的目的。这个环节也讲师与学员相互了解和拉近距离的过程。
内容:
1. 讲师介绍自己并做开场,讲清楚培训的目的和需要学员的帮助。
|
|
2. 每位学员介绍自已。
|
|
3. 通过有意打散进入会场坐在一起的人完成分组,避免熟悉的人分到同一个组。
|
|
环节二:小组讨论
|
目的:
|
针对培训主题,收集大家在工作中的困难和能想到的解决方案。这个环节的目的,是为了让学员有更多的参与和对培训内容的认可,避免变成只是听讲师讲,因为没有参与感而不认可讲师所倡导的那些改变。
|
|
内容:
|
|
1. 各小组讨论四个问题:
o 培训或学习的本质是什么?
o 当前工作中存在哪些与本次培训相关的挑战?
o 如何解决这些挑战?
|
|
2. 各小组选一名学员上台分享。
3. 讲师总结。
|
|
环节三:讲师分享
|
目的:
|
帮助学员建立本次培训主题在工作中应建立起来的意识,以及传授后续环节需要用到的UML知识。
内容:
|
|
1. 工程师除了应掌握专业技能,还得掌握哪些技能?围绕这个问题,主要是要引出业务技能和知识管理这两大技能,因为这两大技能是本次培训非常重要的内容,关系到软件设计和设计文档的撰写质量。
2. 什么是软件设计?通过这个问题,同时引出大家对培养软件设计能力的重视,因为这是个人在职场中的核心竞争力。
3. 什么是软件架构?这是软件设计工作不可回避的问题,如果没有建立起软件架构的认识,在设计时就不会注意从不同的视角去表达,结果就会做不好软件设计工作。
4. UML的学习方法和语法介绍(用例图、活动图和顺序图)。
5. 什么是领域驱动设计(Domain-Driven Development,DDD)。
|
|
|
|
环节四:小组作业
(需求建模)
|
目的:
|
基于所介绍的UML用例图和DDD,通过小组作业进行巩固学习的同时,调整大家的学习状态。
|
|
内容:
|
|
1. 基于“xxx”这一产品需求,采用UML完成需求的分析、捕获和表达。
|
|
2. 各小组选一名学员上台分享。
3. 讲师和学员点评。
|
|
环节五:讲师分享
|
目的:
|
传授接下来的后续环节需要用到的UML知识,以便软件设计工作的深化。
内容:
|
|
1. UML中的类图、部署图等的语法介绍。
|
|
环节六:小组作业
(软件设计)
|
目的:
基于所学到的UML知识,通过小组作业进行巩固学习的同时,调整大家的学习状态。
|
内容:
|
|
1. 基于“xxx”这一产品需求,采用UML完成软件设计的表达。
2. 这次作业需要小组在讲师没有指导软件设计文档如何编写的情形下,完成软件设计文档的编写。
3. 各小组选一名学员上台分享自己小组的软件设计文档。
4. 讲师和学员点评。
|
|
环节七:讲师分享
|
目的:
介绍软件设计文档模板帮助学员掌握好的软件设计文档的关键要素。
|
内容:
|
|
1. 讲解软件设计文档模板。
|
|
|
|
环节八:小组作业
(软件设计)
|
目的:
|
基于软件设计文档模板,重新完成之前的软件设计工作。
|
|
内容:
|
|
1. 各小组基于新的软件设计文档模板对设计进行重做。
2. 完成模块的API接口设计。
|
|
3. 各小组选一名学员上台分享。
4. 讲师和学员点评。
|
|
环节九:讲师分享
|
目的:
|
就本次培训进行总结和延伸。
内容:
|
|
1. 软件设计的一些原则和好方法。
2. 工作中注意使用脑图帮助更好表达。
|
|
环节十:考试
|
目的:
强化本次培训的学习效果。
|
内容:
|
|
1. 基于本次的培训内容,设计总和20个的单选和多选题,通过考试检验学习效果。
2. 讲师带领大家过一下考试答案。
|
|

