{T}

软件工程

软件工程重要性

开发无法从系统层面整体看事情,虽然解决了问题,但总有一种疲于奔命的感觉:

  • 开发时没有分析没有设计,上手就写,后期难维护,加班熬夜去填“坑”
  • 缺少理论指导,遇到新项目不能举一反三,工作很平庸
  • 遇到需求变更这种事,除了抱怨两句客户,只能闷头做,无力反抗
  • 做项目没计划性,想到哪做到哪,总是延期,比其他同事做的慢
  • 不知道如何与团队协作,职业发展遇到瓶颈,无法得到晋升

软件项目开发其实是一个工程,整个开发过程是可以有效组织起来的;对于开发过程的各个阶段,已经有很多解决问题的最佳实践,有很多方法来帮助高效完成任务;还可以借助工具来协助管理,提升开发效率。

开始停留在学习各种编程方法(术)上面,那软件工程让我们主动去思考这些“术”后面的“道”。这种对“道”的思考,从单一的程序思维上升到系统的工程思维去看日常的问题;形成了一套对于软件开发和项目管理的方法论。

在软件开发领域,有哪些知识十年前很重要,现在仍然重要,未来可能同样重要?这些知识不外乎: 数据结构、算法、面向对象思想、设计模式、软件工程。

只要从事软件开发相关领域,都绕不开“软件工程”,因为现代软件项目开发,多多少少都离不开软件工程知识的应用。

日常工作中不管是前端和后端,都是软件工程相关的知识:

  • 接到开发任务,如果想开发出客户想要的功能,要做需求分析
  • 接手复杂的、大的功能模块,要做设计把复杂的拆成简单的,才能让大家一起分工去开发
  • 完成一个功能模块,要保证质量,需要写一些测试代码,还要做一些功能测试
  • 还有日常用的工具,像源代码管理、Bug 跟踪

技术更新迭代速度确实很快,但是软件开发背后的逻辑却万变不离其宗。将软件工程中的知识点和国内外前沿的、典型的项目案例结合起来讲解。

另外,在实际软件项目开发中,离不开各种工具的使用,像源代码管理、持续集成、看板、监控报警等,帮助我们更好地协作、规范项目流程、上线维护。

会从 “道、术、器” 三个维度来讲解软件工程的知识:

  • “器”就是软件工程中的各种工具
  • “术”就是软件工程中的各种方法。例如如何做需求分析?如何对需求变更做变更管理?
  • “道”就是软件工程知识的核心思想、本质规律。例如为什么要有需求分析?需求变更产生的深层次原因是什么?项目中决策的依据是什么?

专栏模块设置

在专栏的模块设置上,将它分成了三大部分

基础理论

从宏观的角度建立起软件工程的知识结构,展现软件工程学的全景图,让你掌握从软件工程的基础概念到主流的软件过程方法论。开始思维上的转变,去尝试用工程化的思维模式,去分析和解决工作和生活中的问题

项目过程

按照软件生命周期,把知识点拆成: 规划、需求分析、设计、编码、测试、运行维护 这六个阶段,了解每个阶段要侧重做哪些事;分析每个阶段常见的问题,找到解决方法;了解各个阶段有哪些工具可以对项目有帮助,从而学会应用它们

案例分析

在这个模块中,我会带你一起去看看这些大公司是怎么应用软件工程的。之前你可能会有疑惑,认为软件工程学很虚,我们小公司用不着,或者不知道怎么在实际项目中应用软件工程。

其实软件工程的思想是润物细无声,包括微软、谷歌、华为、阿里巴巴这样的大公司早已经深得其精髓,把它用得炉火纯青了。

你的公司,你遇到的大部分项目问题,都可以回到软件工程的逻辑里来解决。我会给你分享我看到的经典的软件工程案例,让你能够通过综合案例,把前面的知识融会贯通,并逐步内化为自己的基础能力。

简单来说,我希望通过这些内容,你可以从知到行,打好基本功,掌握软件工程学中涉及的方法和工具,学会举一反三,在软件项目的开发和管理过程中,能运用自如;也希望软件工程的思维,可以让你脱离技术的拘泥,有更高的格局和视角去看待工作和生活中的问题。

软件工程学习攻略

软件工程是软件行业知识体系的内核。无论你想走技术路线,还是转向做管理,想要走的更快更稳,那就绕不开软件工程

架构全景图

在《软件工程——实践者的研究方法》经典软件工程教材中,高度概括了整个软件工程的核心知识

image-20240627231733766

软件工程目标就是为了要 聚焦于质量,构建和维护高质量的软件。

过程

构建高质量软件,则要解决软件过程中的混乱,将软件开发过程中的沟通、计划、建模、构建和部署等活动有效地组织起来。而软件过程,就是在软件项目的生命周期内,也就是软件从诞生到结束这期间,在开发与构建系统时要遵循的步骤。

在软件工程多年的发展中,逐步形成的两种主流的软件过程指导框架 瀑布模型 和 敏捷开发

方法

方法是指在整个过程中,如何构建系统的方法学。比如 如何分析用户需求、如何对产品进行测试验收、如何进行系统架构设计等。

工具的使用

需要工具来辅助方法的执行,提高效率。通过工具,可以把一些手动的工作自动化,比如自动化测试工具,自动构建部署工具;通过工具,可以帮助把一些流程规范起来,比如 Bug 跟踪、源代码管理;还可以通过工具,帮助提高编码效率,比如各种编辑器 IDE、各种高级语言

软件工程的核心知识点, 就是围绕软件开发过程,产生的方法学和工具。 简单的公式理解软件工程: 软件工程=工具+方法+过程。

根据这个公式,我将软件工程的知识结构做成了思维导图,方便你对知识点有更好地理解,高效学习。

image-20240627232159530

如何学习软件工程

我给了你软件工程学的公式,也对软件工程有了更为全面的了解,看起来软件工程学很简单,但这些内容一下子要吃透也不容易。学习软件工程的四重境界

第一重:用器

“器”就是工具,工具规则简单,上手就可以用,也很快就能看到效果。比如,原型设计工具可以帮助你确定需求,持续集成工具可以帮助你简化测试和部署的流程。对工具的学习是最为简单的,也是最基础的。

第二重:学术

“术”就是方法,学会方法,你就能应用方法去完成一个任务,例如用需求分析的方法,你去搞清楚用户想要什么,用Scrum去组织项目开发过程。

掌握了术,甚至是可以脱离器的,例如你没用原型设计工具,你用纸和笔,用白板,一样可以去沟通确认需求。

第三重:悟道

“道”就是本源,软件工程知识的核心思想和本质规律。就像敏捷开发,本身并不是一种方法,而是一套价值观和原则,领悟了这个道,就可以成为你在处理项目过程中各种问题决策的依据。道是可以产生术的,你掌握了敏捷开发的道,你就可以领悟出 Scrum、极限编程这样的术

第四重: 传道

当你能把复杂的知识通过浅显易懂的方式传授给别人,那就说明你对知识的领悟已经到了更高的境界。同时,教学也是最好的学习方式,通过传授别人知识,可以让你对知识本身有更深入的理解。

做中学和教中学

“做中学”,是一种自下而上的学习方法, 通过实践,从使用工具到学习方法,再从方法中提炼出道。

“教中学”,是一种自上而下的学习方法, 通过教学,去进一步深入领会别人总结出来的道,去模仿推导方法,去学习如何使用工具。

比如,你学习完一篇专栏文章后,把学到的知识进行输出,写成微博或博客分享出去;在公司内部讲给你的同事们听等。在教学分享的过程中,去进一步深化吸收知识内容,构建你的知识体系。

“做中学”和“教中学”, 这两种方法你可以配合起来使用。

参考书目

在学习软件工程的过程中,推荐相关书籍

  • 《构建之法》

作者邹欣是微软的研发总监,同时在多所高校进行了软件工程的教学实践,在此基础上对软件工程的各个知识点和技能要求进行了系统性整理,形成教材。也是对这些内容知识很好的补充。

  • 《人月神话》

这是软件工程历史上的经典著作,内容发人深省,40年来一直畅销不衰,里面的观点即使到现在也不过时。这本书即使你以前看过,隔一段时间再翻看一遍,可能都会有新的感悟

  • 《人件》

如果说《人月神话》关注“软件开发”本身,《人件》则关注软件开发中的“人”。作者指出知识型企业的核心是人,而不是技术

  • 《知行合一: 实现价值驱动的敏捷和精益开发》

作者丛斌有二十多年从事软件工程教学、咨询和研究的经验,所以书写的特别接地气,文章有很多真实案例,对敏捷开发和CMMI都有很深入描述

  • 《软件工程——实践者的研究方法》

这是大部分高校采用的软件工程标准教材,可以作为一个参考

  • 《持续交付》

讲述如何实现更快、更可靠、低成本的自动化软件交付,描述了如何通过增加反馈,并改进开发人员、测试人员、运维人员和项目经理之间的协作来达到这个目标

  • 《走出软件作坊》

这本书生动的描述了国内小型 IT 企业在发展过程中遇到的一系列项目管理问题,以及作者是如何去解决这些问题的