“人生苦短,不如养狗 作者:闲宇(Brucebat.Sun) ”
一、前言
近来时不时会思考一个问题:在从准备成为一名软件工程师到实际成为一名软件工程师的学习和工作的过程中,好像很难找到能够较好引导人构建软件开发实践所需的知识体系的书或教程。或许软件工程相关专业的一些专业课会针对软件工程化原理做一定的介绍,但这些课程所教授的内容过于概念化、学术化,离工程实践仍存在一定距离,不足以让人学成之后能够很好地实施企业软件开发的每个步骤。而网络平台上的教程更多的是针对某种语言或者某类工具的讲解,并不是系统性地针对整个开发过程进行介绍。这就造成了我们在学习和工作中出现只见树木不见森林的情况,总感觉千头万绪,在无数的框架、中间件以及新技术中的学习中昏头转向。
为了减少类似学习方式的痛苦,闲宇想要借助《简说软件开发》这个系列给自己整理一下实践中软件开发过程所涉及到每个环节以及对应环节所需的技能方法,尝试构建体系化的软件开发知识。当然除了构建知识体系这个目的,还有一个重要的原因就是希望通过这个系列能够重新认识一下软件工程师这个职业,为未来前进的方向做一些内省和准备。
这里要说明两点:第一,由于闲宇编程使用的主语言是Java,所以在进行介绍时会基于Java语言的生态进行讲解,其他语言的同学可以跳过Java相关的内容;第二,由于闲宇也只是一个刚刚从业数年的小开发,马马虎虎可以算是达到了“初窥门径”与“登堂入室”之间的程度,对于软件开发过程的理解仍存在不少谬误和缺漏,所以对于本系列的定位只是将其作为知识体系构建的导引,而非对每个软件开发环节的实现细节进行详实说明,当然闲宇也会尝试对每一个环节进行深挖,尽力保证每个环节涉及的细节都能够提及。在这一过程中大家也可以提出自己的修改意见,闲宇希望能够与大家共同完成这一系列的创作。
“P.S. 这个系列的更新大概会以年论,请耐心等待~~后续闲宇也会尝试创作一些视频来配合讲解。 ”
本文主要是对该系列做一个开篇介绍,并对该系列后续要讲述的内容进行一个整体概述。
二、了解开发一款软件的目的
在正式开始了解软件开发过程之前,需要先弄清楚一个问题:我们为什么需要开发一款软件?其实对于大部分人来说,进入到企业之后所接触到的产品或者项目基本都是已经成型或是相对完善的,开发人员只需要按照产品经理提出的既定需求来完成对应的开发任务即可,基本不需要思考开发这款软件的实际意义是什么。这也导致了很多时候我们开发人员在进行技术方案设计时总是着眼于某个功能实现的技术细节,而没有站在整个软件产品的角度去思考根据我们提出的技术方案实现的功能是否切实满足了用户的需求、提升了用户的体验。
有的人可能会说,这不应该是产品经理思考的问题吗?诚然,这确实可以说是产品经理最主要的工作,但对于我们开发人员来说,想清楚这样一个问题同样重要。因为无论什么样的软件,其开发实现的工作最终还是需要由我们开发人员来完成。即使产品经理思考得再清楚明白,如果实际的开发人员对于这款软件产品没有足够深入的认识,那么其实现出的功能也一定是不满足用户实际需要的。一个不能满足用户需求、提升用户体验的软件,开发出来的又有什么意义呢?
那么,我们为什么需要开发一款软件呢?其实在上面的内容中我们已经提到了这个问题的答案,那就是为了满足用户的某种需求,更具体一点,就是为了解决特定用户在特定场景下的特定问题。世界上不存在能够解决一切问题的软件,所以我们在开发一款软件的时候必定是围绕上面提到的三个“特定”来构思实现的(听起来有点矛盾分析法的意思,哈哈哈~),这也解释了为什么之前一我再强调对于开发人员弄清楚一款软件开发的本质目的这件事是非常重要的。为了进一步说明其重要性,这里举两个小例子让大家感受一下。
第一个例子是开发一款学生上课点名系统。相信大家在上学时应该都遇到过老师点名的场景,对于这样一款软件其实需要实现的功能非常简单,就是导入本班学生的信息,然后能够随机抽取学生照片进行点名。如果在实现这样一款软件时我们采用了DDD、微服务、分布式缓存等等一系列高大上的技术方案,最终即使能够实现对应的需求,想必老师的电脑在安装或者运行这样一款软件的时候怕也是有点吃不消吧。
第二个例子是开发一个商城系统。一个标准的商城系统会包含诸如会员、商家、订单、支付等等一系列的功能模块,每个功能模块中又包含了各种复杂的逻辑,这样一个较为庞大复杂的软件系统,如果我们设计方案时只是使用单体服务、几张简单的数据库表来实现,不考虑分布式、高可用、高并发等问题,想必没过多久这个服务就要原地爆炸了。
以上就是我们在开始了解软件开发过程前的重要前提,下面我们就开始进入正题——软件开发过程。
三、软件开发过程
软件开发的过程实际上就是通过系统性的、规范化的、可定量的过程化方法来开发和维护软件,软件只是输出的一个结果,这个结果需要用户来体验和反馈,而开发过程则需要整个开发团队(产品经理、开发人员、测试人员、运维人员等等)去共同实施执行。要想比较顺利地实施一次软件开发过程就必须要熟悉和掌握上面提到这些过程化方法。由于这些过程化方法都是在软件开发过程的不同环节使用执行的,所以在学习这些方法时必须结合实际的开发环节来帮助理解。
对于一次软件开发过程的实施来说,主要分为三个阶段:需求分析阶段、设计开发阶段以及运维管理阶段。
需求分析阶段
:这一阶段主要做两件事情,一个是可行性分析,一个是软件定义。可行性分析
:这里的可行性分析实际上就是根据市场调研、技术实力、实现成本、最终收益等因素做一个综合评估分析,评估该软件是否可以实现、是否有必要实现。简单来说,可行性分析就是考量开发团队自我认知是否清晰,避免不能做也要硬做,最终耗时耗力也没有获得预期产出的情况。软件定义
:软件定义实际上就是针对软件使用场景、适用人群以及产品形态等方面进行概念上的确立和统一。简单来说,就是内部先明确到底要做什么、提供怎样的能力、提供给谁以及这款软件长什么样子。
设计开发阶段
:这一阶段主要分为两个方面,设计和开发。在笔者看来,这一阶段中设计环节的重要性是要高于开发环节的,毕竟我们是开发一款面向用户的软件产品,而非一次编码技巧的炫技比赛。设计
:在设计环节中,开发团队需要基于软件定义进行架构设计、功能设计(包含交互设计)以及方案评审(包含交互评审、技术方案评审、测试用例评审等)。开发
:在完成以上的设计和评审之后,才能进入到编码实现阶段。其实对于一个有一定经验的开发人员来说,编码阶段可以说是整个开发过程中最轻松的阶段。因为开发需要的技术栈、实现逻辑等内容已经在前面的“头脑风暴”阶段思考讨论过了。除了编码实现之外,这一阶段还需要对编码实现的功能进行质量检测(或者说测试)。需要注意这里说的测试分为两类,一类是由开发人员自行编写的单元测试,一类是由专门的测试人员执行的功能测试、集成测试等。只有通过了质量检测的软件才能进行分发部署。
运维管理阶段
:编码实现的完成并不意味着开发工作的结束,这只是意味着阶段性工作的完成,要真正让用户可以使用到开发的软件,还需要完成软件的构建、部署和日常的运维工作,也就是运维管理阶段。
以上就是一次软件开发过程需要经历的三个阶段,而在每个阶段当中都有许多工程管理方法和领域技术方法需要我们去学习和使用,这些具体的方法笔者会按照不同阶段的不同环节在后续的章节中进行逐一介绍,在本篇文章中就不做过多的说明了。