最开始:为研究和克服软件危机而生;
官方定义:讲系统化、规范的、可度量的方法用于软件的开发、运行和维护的过程。
抓住定义的本质:用工程化方法去规范软件开发,让项目可以按时完成,成本可控、质量有保障。
一看定义就会觉得很枯燥,记得刚毕业的时候看过讲软件工程的书,开篇就是能看睡着的历史和严肃的定义。以后还是会有很多书会有这样的开场白,因为看历史是必要的,所以现在会转换心态和角度来看待这样的开场白。理解了作者想通过这样的开场白来表达什么,就理智很多啦~
想起来在读李智慧老师的《从0开始学大数据》专栏的时候,有一段话印象深刻
不管是学习某门技术,还是讨论某个事情,最好的方式一定不是一头扎到具体的细节里,而是应该从时空的角度先了解它的来龙去脉,以及它为什么会演进成为现在的状态。当你深刻理解了这些前因后果之后,再去看现状,就会明朗很多,也能更直接地看到现状背后的本质。
我也超喜欢李智慧老师!!!
开发软件本质上就像是盖房子一样,是从无到有的创造过程。
工程化的方式,就是你分步骤(过程),采用科学的方法,借助工具来做产品。
于是,参考建筑工程,软件开发过程也被分成了几个阶段:需求定义与分析、设计、实现、测试、交付和维护。
呐呐~其实历史啥的我是一点不太感兴趣的,所以读到的重点就是,软件工程的过程划分是参考建筑工程的,所以嘛,对于需求分析就叫需求分析,我是一点意见没得的
一句话总结:软件工程 = 工具 + 方法 + 过程
刚开始看的时候我也只是象征性记了一下这个图和这几个字眼的。
经典教材里给的图,回过头来看真的是很经典的啦~软件工程是应对软件危机诞生的学科,目标就是为了要聚焦于治疗,构建和维护高质量的软件。软件工程的核心就是,围绕软件开发过程,产生的方法学和工具。方法学包含两个部分:过程和方法。
专栏刚出的时候给朋友、同事、领导安利过,也曾在闲暇的时候,在公司内网上搭建了禅道、confluence这些来“方便”大家高效协作。大部分都是不了了之的,更多的时候收获鄙疑(可能不是很合适的词,但是感受是这样的啦~)。回复都是感觉这是”假把式“:
…哇,很棒啊,但是这是领导该做的事情啦…
…项目紧急的时候为啥要花时间在这个上面…
…excel就很好丫…
…学习成本太高…
…领导能力不行…(话题马上就会偏,捂脸)
嗯,我从没质疑过,刚工作的时候被不知所云随便去网上抄一下的概要设计文档折磨的时候,领导就拍肩说:文档的目的是让你把重点说清楚。人生的一道闪光啊!所以工作中更多是感受到工程化方法带来的好处(感谢DZQ)。宝玉老师在这里说到的“掌握工程思维,把每一件事都当作一个工程项目来推进。”给了我更多的向别人安利好用的工具,好的工程方法的理由。
有目的、有计划、有步骤地解决问题的方法就是工程方法。
工程方法通常分成6个阶段:
改变,最有效的方式是改变思想,这往往也是最难的部分。
我们在日常处理事务时,天然地会选择自己感兴趣的、擅长的部分,而容易无视整体和其他部分。更重要的不是是否使用工程方法,而是要站在整体而非局部去看问题。把事当成工程,使用工程方法,有两点显而易见的好处:
工程思维:本质上是一种思考问题的方法,在解决日常遇到的问题时,尝试从一个项目的角度去看待问题,尝试用工程方法去解决问题,站在一个整体而不是局部的角度去看问题。
宝玉老师在知乎上分享的文,看完触动好大,这样教出来的小朋友肯定很优秀。
记录两个孩子在MineCraft里还原公寓的经历。
就是“软件工程=工具 + 方法 + 过程”的那个过程。
过程是解决软件工程中的混乱,将软件开发过程中的沟通、计划、建模、构建和部署等活动有效地组织起来,两大主流软件过程指导框架:瀑布模型和敏捷开发。
边改边写(Code And Fix)模型无法满足复杂软件项目的原因:
基于此,借鉴建筑工程提出了瀑布开发模型。
瀑布模型将项目划分成六个主要阶段:
这么一看,瀑布模型真的超级清晰的。
软件生命周期SLC:软件生命周期是软件的产生知道报废或停止使用的生命周期,瀑布模型这样通过把整个软件生命周期划分为若干阶段来管理软件开发过程的方法,叫做软件生命周期模型。
瀑布模型的出现,解决了几个重要的问题:
优点:
对着阶段来搞,是会非常清晰的。
缺点:
俺已经从项目加班中感受到了缺点,尤其是最后心急火燎快交付的时候发现需求变了,WHAT!!!
瀑布模型提供了一个基本模板,但是在不同的实际场景下,完全套用并不适用。在瀑布模型的基础上,衍生了几个代表性的模型。
场景:解决客户需求不明确和需求多变的问题。
定义:先迅速构建一个可运行的软件原型,然后收集用户反馈,再反复修改确认,是开发出的软件能真正反映用户需求。
优点:
缺点:质量没有保障
快速原型模型主要是为快速确定用户需求,不一定是最后交付的,所以实际软件项目中对原型的处理有两种策略:
目前有很多原型工具可以很方便地确认需求,并不需要开发。
场景:适用于需求比较清楚,能模块化的软件系统,并且能按模块分批次交付。
定义:将待开发的软件系统模块化,在每个小模块的开发中,应用小瀑布模型。
场景:按照时间来拆分项目,看单位时间内完成的功能。
定义:每一个迭代结束时,要完成一个可以运行交付的版本。
迭代模型最大的难点在于,规划每次迭代的内容和要达到的目标。
说句看上去可能没啥用的:根据项目特点,考虑项目风险。
本来如何选择就是要在实践中权衡,看看真的是没啥用的啦~
给了一些参考,和我自己内心给的答案不太一样,主要是我没考虑项目风险,啦啦啦
因为瀑布模型太重型,周期长,响应慢,所以大佬们总结了一套新的价值观和原则:敏捷。
敏捷开打不是具体方法、框架或过程,是一套价值观和原则。
想解决的问题:用一种轻量的、敏捷的方法来改善瀑布模型中的问题。
软件工程中必不可少的四个阶段,敏捷开发的做法:
敏捷开发和迭代模型的区别:
敏捷开发适用条件:
介绍一些大厂在用的敏捷方法。
适用看板来跟踪任务状态。
主要是解决两个问题:
阮一峰老师的两篇文章写的超级好:
Git工作流程
持续集成是什么
在流程上对上线部署进行控制:
站立会议主要是为了高效沟通反馈,一般控制在半小时内。站立会议的一般流程:
人员:4个程序员(至少一个资深,有架构能力),1个产品经理,1个测试,1个项目经理。
分工:
每周一个sprint:
其中迭代规划会议中,需要对大家一起评估Ticket,可参考的流程如下:
了解了软件工程的核心,掌握了工程思维,实践中对软件项目的管理需要建立理性的认知,必要时进行合理取舍。
软件项目中有一个平衡关系:
软件工程的目标是要构建和维护高质量的软件。质量高于一切,需要妥协的时候,应该在时间、成本、范围三者之间寻求平衡。
瀑布模型的范围是固定的,时间和成本是变量。出现不能如期完成进度时,通常选择加人或加班。
敏捷开发中,时间和成本两条边时固定的,范围是变量。所以在每个sprint开始之前的迭代规划会议十分重要。
但看理论的部分其实感觉会很枯燥,但是通过实例的分析,发现掌握了矛盾的本质,就理解了现象的因。
男票说看完时间、成本和范围的这部分后,直到怎么扯皮?哈哈哈哈,超可爱~