软件工程----开发大致流程

软件开发的流程

  • 需求分析
  • 概要设计
  • 项目计划
  • 详细设计
  • 编码测试
  • 项目测试
  • 项目部署
  • 后期运维
  • 软件开发注意事项

不同的软件项目,有不同的需求侧重点,开发流程也是不一样的。比如开发一个大型Web电商项目,这个往往需要采用前后端分离的方式,并行开发,以提高开发效率。
后端即服务器端,主要负责处理前端发来的数据请求,保证服务器的高并发性、高可用性等。
前端即客户端,负责用户界面设计,优化用户的交互体验等;
如果是做一个数据采集、数据分析的项目,那么开发的侧重点就应该在后台处理程序,对前端的要求就没有那么高。
那这里我们只讲解一下大致的软件开发流程,并适当地做一些案例分析。让大家对以后的工作流程有点了解。对一些不同的项目,只需重点关注那些差异化的部分即可。

需求分析

需求分析要做的:

  1. 确定用户的真实需求,项目具体功能需求、界面需求等。
    1.1 非互联网公司
    比如一个连锁餐饮公司需要开发一款线上点餐的APP,他们没有自己的软件开发团队,就需要找一些外包公司进行开发。那这个系统就需要有对应点餐用户和餐厅服务员的前端服务;还要有处理用户订单数据的服务端。
    在这个例子中,
    用户:餐饮连锁公司
    真实需求:
    前端服务,用餐的客户可以通过软件浏览实体分店提供的套餐,然后进行下订单,付款等一系列的操作;店里的服务员可以看到客户下的订单,然后进行烹制、出餐等操作。
    后端服务,存储、处理用户的订单数据等。
     
    1.2 互联网公司
    有的公司本身就是互联网公司,他们会做一些产品,作为自己公司的主流项目。比如阿里巴巴,他们开发有自己的支付宝、蚂蚁金融等产品。
    那这样的互联网公司往往都有一个岗位,产品经理
    产品经理职责:及时、准确地捕捉市场需求,去开拓优秀的并被大多用户所需求的产品,以便能够给公司带来新的盈利点,提高公司的市场竞争力。
    公司最终开发出来的产品能否在市场中占有一席之地,取决于用户会不会去使用它,也就是能够满足用户的真实需求。所以产品经理捕捉并确定市场用户的真实需求是相当重要的。

  2. 确定项目的整体难度,可行性分析、技术分析
    如果是一个较为简单的项目,就需要在较短的时间内完成,这样可以效益最大化;如果是一个大型项目,那就需要适当地规划时间久一点,否则可能产品不能按时交付,或者产品性能不是太好。所以根据项目的难以程度,合理的规划工期及资源配置是相当重要的。
     
    可行性分析,并不是所有的需求在技术上都可以实现,有句话叫做“理想很丰满,现实很骨感”。有些需求是当前技术实现不了的,比如要开发一款像人一样智能的语音交互系统,可以像人一样思考问题,可以理解人类的每一句话,那这个就是目前的技术达不到的。(智能语音助手例子)
    所以对用户的需求,需要做可行性分析,哪些是目前的技术可以实现的,哪些是暂时实现不了的。对于实现不了的需求考虑有没有折中的办法,或者可以引入一些其他的资源等。比如我们在做爬虫项目抓取数据的时候,需要爬取一个网站的数据,但是这个网站的反爬机制很严格,根本爬不进去,服务端就不返回数据。怎么办?我们可以使用selenium借助浏览器拿数据。那这个就是一个折中的办法,但是这种方法是以降低效率为代价的。
     
    技术分析,就是在技术可以实现的情况下,选择哪种技术可以更好的应用到开发中,提高开发效率和软件性能。比如有个项目需要短期完成,但后期系统的运行效率可以不严格要求,那么就可以选择使用python来开发,提高开发的效率。

  3. 需求分析文档,用户确认
    把最终的需求分析结果形成文档,让用户确认是否满足用户的真实需求。只有满足了用户的真实需求,才可以继续下一步的开发工作。

概要设计

需求分析是对外的,概要设计是对内的。在互联网公司还有一个岗位叫架构师,负责整个系统的设计,确定实现方向等。那这些人往往是部门的领导或者骨干人员。(薪资不菲)
在系统设计的时候需要布局整体组织结构,确定使用的什么样的框架等,比如需要开发一个web应用,使用Java SSM(Spring+SpringMVC+Mybatis)框架,还是使用python的Django框架,一般都需要架构师来决定。

概要设计用来指导开发人员后续的开发工作。

  1. 确定功能模块
    一个完整的系统都要进行功能模块的划分,这样才能够在团队中明确分工,提高开发效率。

  2. 各模块的可行性分析,搭建整体架构图
    这里的可行性分析与需求分析中的可行性分析不同,需求分析中的是某个需求能不能使用当前的技术实现;而这里的可行性分析是针对拆分的功能模块,使用指定的技术能否很好的实现。搭建出整体的架构图是必需的,一个好的架构可以满足后续的业务扩展,产品的更新迭代,延长一个产品的生命周期。对于一个不好的架构,那产品可能就存活1-2年就无法继续更新,那就要重新设计、重新开发,这样对于公司来说,投入的成本就太高了。

  3. 确定技术思路和使用的框架
    对于web应用,使用Java开发的话,一般使用SSM框架;
    使用Python开发就使用Django、Flask框架等。

  4. 形成概要文档,指导开发流程

项目计划

  1. 确定开发工作的先后顺序
    有些项目很大,需要一个团队或者几个团队配合完成,整个系统划分功能模块后,哪些可以先完成,哪些可以后完成,要有一个鲜明的计划。按照计划开发才能有条不紊。

  2. 确定时间节点。
    计划好每一个时间节点的完成度,规定到达一个时间节点必须完成指定的工作,必须保质保量完成规定的功能模块。在每个时间节点,检查团队的开发进度,保证项目的开发工作稳步推进。

3.人员分工
在每个团队内部确定好人员分工,细化工作要求。

  1. 形成甘特图等辅助内容
    软件工程----开发大致流程_第1张图片

详细设计

  1. 详细设计文档:项目的思路、逻辑
    人员流动,便于新人了解项目(单纯的看代码效率不高);
    便于项目的后期维护,逻辑流程一目了然。
    对于一些外包公司,他们特别重视详细设计,可以重用之前项目的相关的架构和代码,实现快速开发,减少时间和人力成本。如果每次都重新设计系统架构,重新编写代码,那就会投入很大的人力成本,相应的收益就会减少。

  2. 功能说明,技术点说明,数据结构说明
    在详细设计中,要对系统实现的功能、使用的技术、设计的数据结构等信息进行详细的说明,越详细越好,这样才能更好地帮助别人快速了解项目。

  3. 重点代码说明
    重点代码需要详细说明,便于后续的理解。一些逻辑功能比较复杂的代码,即使是开发者自己,经过一段时间后再来阅读,理解起来也是不太容易。为了后续便于维护和更新,对重点代码作详细说明相当必要。

编码测试

  1. 按照分工,编写代码,实现模块功能。
    其实编写代码也不是最耗费时间的地方,系统设计与项目计划,编码实现,系统测试这三部分时间基本是一样的。
  2. 技术攻关
    在编写代码过程中,处理一些难以实现的技术点是比较费时间的,也是可以提高自己开发水平的地方。比如不同模块之间的对接,不同开发语言的数据交互等。
  3. 代码的基本测试
    代码编写完成后,自己对自己负责的代码部分进行简单的多场景下的测试,检测代码的健壮性和执行效率。在简单测试之后没有太大问题的情况下,再提交。坚决不能将隐藏一堆Bug的代码提交给测试工程师,这样会影响自己的权威性,降低自己的可信度。

项目测试

在大型互联网公司,这部分一般是由测试工程师完成,通过黑盒测试、白盒测试等技术,设计不同的测试场景,从不同的角度分析软件的缺陷。测试工程师对于产品的改进优化,往往起着至关重要的作用。
但是也有些创业公司不太重视测试这部分工作,就让开发人员自己去测试。那这样的产品没有经过全方位的系统测试,潜在的Bug可能会更多。
测试工程师职责:

  1. 根据业务逻辑,尽可能全方位地测试项目,找出软件的缺陷
  2. 完成测试报告,将软件Bug提交给研发修改
  3. 完善项目细节

项目部署

  1. 将项目部署在指定的服务器,交付用户使用
    项目部署使用公网IP,大部分部署在linux操作系统
  2. 编写项目说明文档,辅助用户使用各项功能
    软件的使用说明及相关注意事项,比如可以运行在windows/linux系统,环境温度等。

后期运维

  1. 项目维护
    性能的监控、数据的备份等
  2. 迭代更新
    解决Bug,优化功能,扩展业务等

软件开发注意事项

  1. 按时完成项目与项目时间不足之间的矛盾
    需要根据预先制定的时间节点,按时完成规定内容,如果时间不足,不能按时完成就需要额外加班,赶赶进度。如果最终没有按时完成项目开发,导致产品不能准时交付客户,那么公司需要赔付客户违约金。软件开发加班与否,其实还是取决于工作量的完成度,如果在每个时间点检讨项目进度的时候,都能按时完成任务,那么也是可以不用加班的。相反完不成任务就要留下加班了,有时赶上项目发布的时候,甚至通宵达旦也是经常的事。

  2. 项目实施人员之间的冲突
    技术能力很强的人员之间意见冲突(不知听取谁的意见)
    技术能力强与技术能力弱的之间冲突(一快,一慢)
    这些冲突需要项目经理去协调。

  3. 抓大放小,不过于追求完美
    整体功能实现大部分,不在小的问题上花费过多的时间。在有限时间内,先把任务完成,一些小的问题可以放在技术攻关再解决。

  4. 开发工具的熟练使用
    pycharm/eclipse等
    git版本控制工具
    word文档的编写、ppt编写

你可能感兴趣的:(linux,软件开发流程)