从零做软件开发项目系列之一综论软件项目开发
1 引言
有一个三个泥瓦匠的故事。
三个泥瓦匠在砌墙,一个人走过来,问他们在干什么。
第一个泥瓦匠没好气地说,你没看见吗?我在辛苦地砌墙呢。
第二个回答,我们正在建一座高楼。
第三个则洋溢着喜悦说,我们正在创造美好生活。
10年过去了,第一个人仍然在做泥瓦匠,第二个人成为了一名工程师,而第三个人则成为建筑公司的老板。
这个故事告诉我们,在工作的时候,既要明确自己的职责,也要知道自己在整个项目中的作用,也就是既要低头拉车,也要抬头看路。

我们平时的工作,都是一项大的工作项目的组成部分,不同的行业,项目的形式有所不同。在IT行业,除了做网络和硬件设备的,大部分做的都是软件开发的项目。一个软件开发项目,从开始到结束都经历哪些过程,在这里,我结合自己的经验和实践来做一个描述,期望对做软件项目开发的朋友有些启发。一名软件开发人员,最好能够明确的知道自己所处的位置,在一个项目中的作用,以及这个项目处于一个什么样的阶段,这样开发人员对自己的职责和目标就能会更清晰,也有利于工作能动性的发挥。
首先说一下软件项目的分类,按照不同的分类规则,可以有不同的具体分类。比如从技术的角度进行分类,可以分为微信项目,APP项目,互联网项目,应用系统,数据库建设等等。从项目大小进行分类,有几百万至几千万的大项目,可能包括一些子项目,也有几十万的较一般规模的项目,也有几万或者几千的小项目。还有从项目的主体上分类,自己开发本公司的项目,为其他公司开发的项目,这时候就会分出甲方和乙方,乙方是项目的开发实施者,为甲方服务。项目类型的不同,对于项目开发过程可能存在或多或少的差异,但总体来说,项目开发的一般都会有项目的确定,项目的开发,项目的收尾等几个阶段。

2 项目的确定
项目的确定阶段,这里就是要说一说一个项目是怎么来的。可能是领导有一个想法,提出一个大概的目标或者思路,然后就会让下属或者相关的公司给出可行性的分析,给出一个项目方案,之后就是对这个方案进行审核,也可能会组织一些专家进行评审,方案如果审批通过,则继续进行下一步,一般是组织招标,如果项目比较小,或者比较特殊,比如只有某家公司能做,有排他性,这时候就不用招标。组织方给出招标书,委托招标公司或通过政府采购平台等进行招标,相关企业根据招标要求,写投标书进行应答,招标结束后,中标企业和组织方签订项目合同,从而确定了项目。当然也有一些项目,没有经过这么多过程,如果是自己公司开发软件系统,没有合同,直接进行开发阶段。也有客户出于对公司的信任,直接签订开发合同的。

这个阶段,可能涉及到的岗位,一般有公司领导,售前工程师,标书专员。该阶段售前工程师的作用很关键,对岗位的要求也比较高,要对行业有比较深刻的了解,能够把握潜在客户的需求,同时,对自己公司的产品或技术也要非常熟悉,能够把公司的产品或技术,与潜在客户的实际需求结合起来,提供解决方案。具有将潜在客户转化为实际客户的能力。很多时候,公司的领导充当了这个角色,在与潜在客户交往中,会及时掌握客户的需求,也会调整公司的产品或技术,以适应客户需求。如果公司规模足够大,产品比较成熟,或者市场大,也会招募大量的一般销售人员。
3 项目开发
项目确认,签订合同之后,就进入了软件开发阶段。这个阶段可以分为需求调研、系统设计、软件开发、软件测试、用户培训等过程。

需求调研,主要是向客户了解具体的需求,需要提前准备调研方案,有针对性地收集客户需求。主要收集客户的工作内容,涉及到的人员岗位职责,以及用到的各种表单、报表、规章制度等资料。
需求分析,该过程主要对需求调研结果进行分析,将用户的需求转换为软件需求,同时也需要对市场上类似或相关的软件进行竞品分析,综合考虑各种产品的优缺点,以及针对的客户群体,对自己的软件有一个合理的定位,并明确自己软件的功能范围。
系统设计,需求分析完成后,会形成需求规格说明书,明确软件系统的功能范围,根据需求规格说明书,进行系统设计,对软件功能、性能等进行规划设计。明确软件的主要模块,模块之间的关系,使用的主要技术,并逐步细化,可以明确设计接口,规定接口规则,进行数据库设计。形成系统设计说明书,具体还可分为概要设计和详细设计两个阶段的说明书。
系统开发,根据设计说明书,进行代码编写调试工作,由高级工程师或架构师搭建开发框架,分配任务,分模块进行开发。每个模块先由UI画出原型页面,并进行切图,由前端工程师进行页面开发,同时后端进行功能实现,前后端通过约定好的json数据进行调试,开发完成后进行联调。
软件测试,软件开发完成后,要经过单元测试、集成测试、系统测试、验收测试等测试环节,类型上分别进行功能性测试、性能测试、安全测试等,每种类型的测试都会提供测试报告,一般测试出的bug由开发人员进行修复,修复完成后进行回归测试,直到bug归零或可控。
在项目开发过程中,会有大量的人员参与,特别是技术开发人员,涉及到需求分析师、架构师、UI设计师、前端工程师、后端工程师、测试工程师等,还会有细分的算法工程师、不同语言的工程师等等。还会有项目经理、技术领导等。
4 项目收尾
软件开发完成后,需要让用户开始使用,也就进入了项目收尾阶段。这个阶段有用户培训,系统试运行,初步验收,评审结项,项目运维等过程。

试运行,软件在内部开发测试后,让真正的用户开始使用,也就是系统试运行,这个过程需要将系统部署到模拟的生产环境,让用户根据真是业务,在系统上面进行操作,使用中收集用户反馈,包括使用习惯,系统功能,故障情况等,根据具体情况,开发方对问题做出相应的解决,排除故障,完善系统。
用户培训,对用户进行培训,需要提前做好准备,一般都是根据用户角色分别进行培训,客户领导、管理人员、业务人员等不同角色,使用系统的功能和侧重点有所差异,要根据具体情况来准备培训内容,结合不同角色的实际工作,有针对性的进行培训。当然也需要用户配合,安排好培训时间,搭建好培训环境,这样才能获得较好的培训效果。
初步验收,软件开发测试完成,在试运行前后,也可能会有初步验收。开发方需要进行系统的自检,根据合同功能对照系统的实际功能,看是否完成了合同约定内容,确认后,一般和用户方、监理方一起进行功能检查,如果都没有问题,则通过,有问题的话,做下记录,进行相应的补充修改,完成初验。
评审结项,试运行以及整改结束,软件获得了用户的认可,则进行最终的验收,同时召开项目结项评审会,一般会邀请3-7名专家,开发方汇报展示项目完成情况,监理会对整个过程进行说明,用户方给出使用情况的汇报,最后专家给出结项意见,最后签字,则完成结项工作。
项目运维,项目结项评审完成后,就进入了维护阶段,如果后续软件使用比较频繁,由于对软件熟悉度还需要一个过程,刚开始使用中可能会有比较多的问题,一般开发方会派人驻场进行保障,主要帮助用户解决使用过程中的问题,保障过程中,会对保障情况做出记录,定期(比如一周或者一个月)提交一份运维报告,保证软件能够正常使用。
5 结语
本文介绍了软件项目从申请到开发实施到结项的整个过程,在这个过程中,根据项目或公司的大小,会有不同的职位参与,如果是小的公司,可能一人兼任了很多职位,很多过程也会简化或省略。一般大一些公司,人员多,职位会设置的比较全,流程也会多一些。通过介绍,大家能够根据自己的职位职责情况,明确在整个项目中的阶段和作用,希望通过介绍,大家对软件项目有一个大概的了解。
相关文章:
从零做软件开发项目系列之一综论软件项目开发
1 引言 有一个三个泥瓦匠的故事。 三个泥瓦匠在砌墙,一个人走过来,问他们在干什么。 第一个泥瓦匠没好气地说,你没看见吗?我在辛苦地砌墙呢。 第二个回答,我们正在建一座高楼。 第三个则洋溢着喜悦说&…...
msvcp110.dll是什么意思,msvcp110.dll丢失的解决方法
装好软件或游戏之后,一打开就跳出各种报错信息的情况小伙伴一定见过,其中缺少各种msvcp110.dll文件最常见。小伙伴们一定奇怪,用得好好的电脑,怎么会缺文件呢?为啥其他游戏/应用就没事呢?其实这些“丢失”的…...
【报错】git push --set-upstream origin XXXX重名
您在尝试将分支推送到远程仓库时遇到了错误。错误信息表明,由于已经存在名为 refs/heads/xingfan/demo 的文件夹,Git 无法创建分支 refs/heads/xingfan。 要解决此问题,您可以尝试重命名本地分支,然后将其推送到远程仓库。以下是…...
探索树算法:C语言实现二叉树与平衡树
探索树算法:C语言实现二叉树与平衡树 树是计算机科学中一个重要且广泛应用的数据结构,它在许多领域都有着重要作用。本篇博客将深入介绍两种常见的树算法:二叉树遍历和平衡二叉树(AVL树),并提供在C语言中的…...
Ubuntu 20.04(服务器版)安装 Anaconda
0、Anaconda介绍 Anaconda是一个开源的Python发行版本,包含了包括Python、Conda、科学计算库等180多个科学包及其依赖项。因此,安装了Anaconda就不用再单独安装CUDA、Python等。 CUDA,在进行深度学习的时候,需要用到GPU…...
IDEA项目实践——JavaWeb简介以及Servlet编程实战
系列文章目录 IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介 IDEWA项目实践——mybatis的一些基本原理以及案例 IDEA项目实践——动态SQL、关系映射、注解开发 IDEA项目实践——Spring框架简介,以及IOC注解 IDEA项目实践——Spring当…...
【Freertos基础入门】队列(queue)的使用
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、队列是什么?二、队列的操作二、示例代码总结 前言 本系列基于stm32系列单片机来使用freerots FreeRTOS是一个广泛使用的开源实时操作系统&…...
从零构建深度学习推理框架-8 卷积算子实现
其实这一次课还蛮好理解的: 首先将kernel展平: for (uint32_t g 0; g < groups; g) {std::vector<arma::fmat> kernel_matrix_arr(kernel_count_group);arma::fmat kernel_matrix_c(1, row_len * input_c_group);for (uint32_t k 0; k < k…...
【Spring Boot】JdbcTemplate数据连接模板 — JdbcTemplate入门
JdbcTemplate入门 本节从基础的部分开始介绍什么是JDBC、什么是JdbcTemplate,然后介绍Spring Boot项目如何使用JdbcTemplate操作数据库。 1.JdbcTemplate简介 1.1 什么是JDBC JDBC(Java Data Base Connectivity,Java数据库连接࿰…...
视频汇聚集中存储EasyCVR平台调用iframe地址视频无法播放,该如何解决?
安防监控视频汇聚平台EasyCVR基于云边端一体化架构,具有强大的数据接入、处理及分发能力,可提供视频监控直播、云端录像、视频云存储、视频集中存储、视频存储磁盘阵列、录像检索与回看、智能告警、平台级联、云台控制、语音对讲、AI算法中台智能分析无缝…...
从今天起,重新出发
2017年的时候,我还是一名在校大学生,当时为了准备实习面试写下了第一篇学习笔记。 2018年我开始工作,简单记录了使用 Airflow 的踩坑记录。 一直到今天我已经是一个工作了五年的社畜,但是很遗憾没有把工作中的成长记录下来。 当…...
Java多态详解(1)
多态 多态的概念 所谓多态,通俗地讲,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 比如: 这一时间爆火的“现代纪录片”中,麦克阿瑟总是对各种“名人”有不同的评价&…...
optee读取Arm系统寄存器的模板
先写一个通用的内联函数模板,然后再通过宏控来定义各种读写函数。 (core/arch/arm/include/arm64.h)/** Templates for register read/write functions based on mrs/msr*/#define DEFINE_REG_READ_FUNC_(reg, type, asmreg) \ sta...
VSCode 使用总结
快捷键 在 Visual Studio Code (VSCode) 中,有许多常用的快捷键可以提高编程效率。以下是一些常见的 VSCode 编程项目快捷键: 编辑器操作: 撤销:Ctrl Z重做:Ctrl Shift Z复制:Ctrl C剪切:C…...
GuLi商城-前端基础Vue-使用Vue脚手架进行模块化开发
自己亲自实践: mac安装webpack webpack 简介Webpack 是一个非常流行的前端构建工具,它可以将多个模块(包括CSS、JavaScript、图片等)打包成一个或多个静态资源文件(bundle),以便用于部署到生产…...
LeetCode450. 删除二叉搜索树中的节点
450. 删除二叉搜索树中的节点 文章目录 [450. 删除二叉搜索树中的节点](https://leetcode.cn/problems/delete-node-in-a-bst/)一、题目二、题解方法一:递归(一种麻烦的方法)方法二:优化后的递归 一、题目 给定一个二叉搜索树的根…...
Java动态调试技术原理及实践
文章目录 Java动态调试技术原理及实践引言故事场景一:开发调试动态调试技术简介Java Instrumentation简介动态调试技术实践案例分析场景二:线上问题排查动态调试技术实践案例分析总结Java动态调试技术原理及实践 引言 在日常的软件开发过程中,调试是一个非常重要的环节。当…...
Lua + Redis 实战代码
--[[luarocks install luasocket module socket not foundhttps://github.com/nrk/redis-lua最历害的是,用redis 去跑lua,分布式锁,限流,]]--local redis require("redis");local config{host"127.0.0.1&…...
类的访问限定符,实例化,对象存储方式,this指针
目录 类的定义 类的两种定义方式: 访问限定符 类的实例化 类对象的存储方式 this指针 C语言结构体中只能定义变量,在C中,结构体内不仅可以定义变量,也可以定义函数。比如: 之前在数据结构初阶中,用C语…...
《Linux从练气到飞升》No.15 Linux 环境变量
🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
