一个软件是如何开发出来的呢?
一、前言
如今,AI大爆发的时代,作为一名IT从业者,你是否也想尝试开发一套自己的系统,实现那些看似有可能实现的天马行空的想法,变成一个优秀甚至伟大的产品,甚至带来某个行业的革新,那作为一名非开发人员,你是不是一样也很想知道一个系统从想法到产品是如何一步步实现的呢,本文基于此进行探究,为有想法的人提供借鉴参考。

二、软件开放全流程

2.1)需求沟通:
开始搭建系统之前,首先需要明确系统的需求。那就要求我们首先应根据客户/自己公司提出的目标和功能,了解用户或客户的需求、系统的功能和特点等,收集并整理需求信息,形成需求文档,需求文档应该详细描述系统的各项功能、性能要求、用户界面设计等,为后续的系统设计提供基础;梳理出适合的开发模式,提供一份《产品功能需求逻辑图》,并给出需要的时间和费用。
产出物:产品功能需求逻辑图、预估时间,预估费用。
2.2)需求确认和合同
在确认功能需求、时间、费用三方面都没有问题之后,签署合同,细节与服务商进行沟通,客户付完首付款项目开发工作正式启动,周期给予客户进度反馈。
产出物:产品功能需求列表确认版,合同
2.3)设计阶段
系统设计阶段涉及多个方面,系统架构设计要确定系统的整体结构和各个组件之间的关系,确保系统的稳定性和可扩展性。数据库设计要合理规划数据库结构,确保数据的存储和访问效率。界面设计要关注用户体验,设计简洁、易用的界面。
1、原型设计
由产品经理设计原型图,采用Axure或者Figma设计工具设计,根据功能需求列表,绘制页面框架线稿图。
2、UI设计
原型图设计完成后,由设计师绘制UI界面,会给出高保真系统界面设计图。
3、数据库设计
项目技术经理设计根据功能需求列表设计数据库模型,设计表、关联关系等。其中,要重视索引的引入,什么时候建索引?建什么样的索引?
索引:编码前、统一建表时把索引设定好确认好,写代码时围绕着这些索引去写查询条件。但注意索引并不是越多越好,应坚持够用,越少越好
数据归档:数据量大的表,可以做归档
查询sql:查数据时,别用 select * ,请指定要查哪些字段;少用用 select count() ,浪费性能;慎用 limit,用主键判断再配合 limit 使用,尤其类似 limit 100000000,10 这样系统会直接卡死,性能非常差。查询时间范围时,尽量带上默认时间范围; 不要在循环里查数据库。这性能特别差;
善用事务:应考虑必要用事务,来保证数据一致性,尽量减少出现脏数据错误数据的情况。但事务设置不合理会容易死锁。
读写分离:访问量一多,必须考虑读写分离,一主多从。数据库的压力就会降下来。但一定要注意,更新数据后又查询时,如果时时性要求高,自己注意这是否会查主库,如果不会,请自己指定去主库查询。比如采集到商品数据后,丢入队列进行一些额外处理,队列里判断数据是否存在,如果不存在就返回false,这就会有问题。一般的ORM的底层有自动处理好,同一事务里,会自动连接主库。Thinkphp的框架还有个配置 read_master ,写入操作之后的读数据库,会自动去主库读取。这是个很好的功能。
分库分表:如果短时间之内会有大量数据,或者不能做数据归档。可以使用分表,甚至分库。
4、架构设计
项目技术经理对设计整体的系统分层架构,便于以后再次扩展功能。
产出物:原型设计文档、UI设计图、数据库设计文档
缓存:缓存key的长度,尽量减短;缓存的内容,尽量减短,并使用压缩;必须设置过期时间。否则内存会有爆的一天。不能过期不能随时清除的缓存,请在后端代码里自行维护。避免在同一时间大量key过期。你可以根据业务情况,随机过期时间。注意避免缓存穿透。数据库无值时,别一直查库。请先判断是否存在此key;注意热点KEY的问题。如何发现热点KEY,提供几个方案:代码访问时封装一个统一入口、用redis提供的命令。解决方案,提供几个方案:人工拆分、主从节点key、二级缓存。 不要在循环里查缓存。这性能也挺差。
频繁请求的接口,请使用websocket进行推送。 请不要使用前端ajax轮询,请用websocket推送
Nginx单节点的QPS能达到10万左右。
使用HTTP 2.0:可以大大提升性能。
2.4)开发阶段
该阶段需要根据前面的系统设计,选择合适的编程语言和开发框架,编写系统各个组件的代码。在编程实现过程中,要注重代码的可读性、可维护性和可扩展性。同时,要遵循编码规范,确保代码的质量和稳定性。目前主流的开发方式是,前后端分离开发模式,优点效率高,易扩展。
1、前端开发
前端开发工程师负责根据原型设计图及UI设计图开始编写前端代码,用代码实现设计图中的功能界面,交互,动效等等内容。
当一个页面信息元素比较多时,你可以先加载主要数据,后加载次要数据。复杂的交互,可以拆分成两步甚至多步。
2、后端开发
后端开发工程师负责根据原型设计图、UI设计图,数据库文档编写后端代码,用代码实现业务逻辑接口,如请求参数,请求方法,数据库持久化,数据返回等等内容。
复杂数据,能在代码里计算就在代码里计算。从数据库仅取出简单数据,然后用代码进行计算,别直接用sql语句去数据库里处理。
该用锁的地方要用锁。比如定时将任务丢入队列,如果队列里其中一个任务卡住了,这个时候会依然持续不断的丢入新的任务到队列里,这样会把队列撑爆。
3、前后端对接
前端和后端人员分别同时开发,互不影响,等到双方都写好功能以后,就可以进行联调了,根据后端开发编写的请求接口文档,前端开始进行代码功能对接,并在其中不断修改和优化接口代码。
产出物:系统API接口文档
2.5)测试阶段
测试是确保系统质量和稳定性的重要环节。测试包括单元测试、集成测试、系统测试等多个阶段。单元测试主要测试各个组件的功能和性能,集成测试测试各个组件之间的协作和交互,系统测试测试整个系统的功能和性能。在测试过程中,要及时发现并修复问题,确保系统的稳定性和可用性。测试工程师应按阶段设计《测试用例》,未测试通过的需要反馈给开发人员进行调整,开发人员修改代码提交测试,测试通过会在测试结果报告中打钩确认。
产出物:软件测试报告
保证每个接口在本地测试时的耗时在100ms以内。
及时性要求不高的任务,特别是耗时任务,请用队列; 减少http接口的数量。这样可以减少你的各种连接数;
2.6)软件上线
1、操作培训/指导
会给用户提供一份详尽的系统/产品操作文档,协助用户使用软件。
2、试运营
试运营中可能会存在一些问题,可以在正式上线前优化解决掉。另外在完成测试后,应该已经开始对系统进行优化。优化包括性能优化、用户体验优化等多个方面。性能优化主要关注系统的运行速度和资源消耗,通过优化算法和数据结构等方式提高系统性能。用户体验优化关注系统的易用性和美观性,通过改进界面设计、优化操作流程等方式提升用户体验。
3、正式上线
系统部署到正式环境,开始正常运行,进入日常维护阶段。
七、售后维护
为非功能性的需求提供一定的技术支持。
相关文章:
一个软件是如何开发出来的呢?
一、前言 如今,AI大爆发的时代,作为一名IT从业者,你是否也想尝试开发一套自己的系统,实现那些看似有可能实现的天马行空的想法,变成一个优秀甚至伟大的产品,甚至带来某个行业的革新,那作为一名…...
宝塔板面有哪些优势
哈喽呀,大家好呀,淼淼又来和大家见面啦,在当今数字化时代,随着云计算和互联网技术的飞速发展,服务器管理成为了许多企业和个人开发者不可或缺的一部分。然而,传统服务器管理方式的复杂性和技术门槛往往令初…...
Mybatis中BaseEntity作用
新建各种对象的时候,一般来说,有几个属性是所有对象共有的,比如说id,is_del,is_enable这些,然后设置一个基础对象,以后新建所有对象的时候都继承它,就省的每次都要写这些共有的属性了...
IDEA2023中使用run Dashboard面板?实现批量运行微服务
1、直接点击Add service--->Run Configuration Type---->Spring Boot 2、这样就出现了run Dashboard面板,可同时运行多个工程模块,shift选中所有启动类组命名(Group Configurations) 3、启动所有的项目...
分数受限,鱼和熊掌如何兼得?专业or学校,这样选最明智!
文章目录 引言一、专业解析二、名校效应分析三、好专业和好学校的权衡结论个人建议 引言 24年高考帷幕落下,一场新的思考与选择悄然来临。对于每一位高考考生,学校和专业都是开启大学新生活的两个前置必选项。但有时候“鱼与熊掌不可兼得”,…...
CentOS 8.5 - 配置ssh的免密登录
文章目录 生成ssh密钥公钥内容放入服务器 生成ssh密钥 在本地主机安装 ssh工具,并生成公钥、私钥。 # 命令行输入 ssh-keygen -r rsa# 会在当前用户的家目录下生成一个.ssh目录公钥内容放入服务器 将上一步生成的id_rsa.pub公钥的内容复制到远程服务器 # 编辑文…...
反转链表(java精简版)
反转一个单向链表。 public class ReversingLinkedList {static class Node {int val;Node next;public Node(int val) {this.val val;}public boolean hasNext() {return next ! null;}}public static void main(String[] args) {//构造Node head null;Node shift null;for…...
QPair使用详解
QPair使用详解 一、创建和初始化 QPair1.1 QPair默认构造1.2 使用值初始化1.3 QPair拷贝构造 二、访问 QPair 的值2.1 修改 QPair 的值2.2 比较 QPair2.3 使用 qMakePair 辅助函数2.4 使用 QPair 的场景 三、QPair自定结构体3.1 定义自定义结构体3.2 在 QPair 中使用自定义结构…...
C# 语言在AGI 赛道上能做什么
自从2022年11月OpenAI正式对外发布ChatGPT依赖,AGI 这条赛道上就挤满了重量级的选手,各大头部公司纷纷下场布局。原本就在机器学习、深度学习领域占据No.1的Python语言更是继续稳固了自己AI一哥的位置。凭借着Microsoft 和 OpenAI 长期以来一直是紧密相连…...
微信小程序-API 本地存储
一.本地存储-同步API 存储 : wx.setStorageSync 获取:wx.getStorageSync 删除:wx.removeStorageSync 清空:wx.clearStorageSync 代码: save(){//存储wx.setStorageSync(id, 1) wx.setStorageSync(obj, {name:"te…...
TensorFlow音频分类修复
原先传wav格式,后来发现前端生成的wav格式不完整 后端改mp3 其实是mp3和wav都可以接收 前端MP3和wav格式不正确,导致可以接收,但都无法计算时长 该文作废,可能导致音频分类不准确 修复TensorFlow放到生产后报错问题-CSDN博客 依赖 <dependency><groupId>or…...
C#学习系列之ListView垂直滚动
C#学习系列之ListView垂直滚动 前言垂直滚动总结 前言 当ListView中不断增加新内容,经常是纵向滚动。 垂直滚动 这个是关键:<VirtualizingStackPanel/> <ListView.ItemsPanel><ItemsPanelTemplate><VirtualizingStackPanel/>&…...
MySQL 常用函数总结
MySQL 提供了丰富的内置函数,用于在查询中进行各种计算、字符串处理、日期和时间操作等。这些函数可以帮助我们更有效地从数据库中检索和处理数据。下面将总结一些 MySQL 中常用的函数及其用法。 1. 数值函数 1.1 ROUND() ROUND() 函数用于对数值进行四舍五入操作…...
SpingBoot快速入门下
响应HttpServietResponse 介绍 将ResponseBody 加到Controller方法/类上 作用:将方法返回值直接响应,如果返回值是 实体对象/集合,将会自动转JSON格式响应 RestController Controller ResponseBody; 一般响应 统一响应 在实际开发中一般…...
什么是symbol?
在ES6(ECMAScript 2015)中,Symbol是一种新的基本数据类型,它的主要特点是独一无二且不可变。以下是关于ES6中Symbol的详细解释: 定义与特性: Symbol是ES6引入的一种基本数据类型,用于表示独一无…...
Tailwind CSS 响应式设计实战指南
title: Tailwind CSS 响应式设计实战指南 date: 2024/6/13 updated: 2024/6/13 author: cmdragon excerpt: 这篇文章介绍了如何运用Tailwind CSS框架创建响应式网页设计,涵盖博客、电商网站及企业官网的布局实例,包括头部导航、内容区域、侧边栏、页脚…...
如何把模糊的图片修复变清晰,怎么做?有那些方法?
模糊照片怎么修复清晰?有些照片可能会因为保存不当或其他原因而变得模糊,这些照片删掉又觉得可惜,那么如何让这些照片焕然一新呢?今天就给大家分享几种可以将这些珍贵的模糊照片修复为高清照片的方法。接下来,给大家演…...
思科路由器密码恢复方法
1.密码恢复原理 Cisco路由器保存了几种不同的配置参数,并存放在不同的内存模块中。 Cisco系列路由器的内存有:ROM,闪存(Flashmemory),RAM,不可变RAM和动态内存(DRAM)等5种。 一般情况…...
HTML某联招聘
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <!-- 一些其他说明: 不写form的话,表单内容也是可以正常显示的࿰…...
第一百一十六节 Java 面向对象设计 - Java 终止块
Java 面向对象设计 - Java 终止块 try 块也可以有零个或一个 finally 块。 finally 块总是与 try 块一起使用。 语法 使用 finally 块的语法是 finally {// Code for finally block }finally 块以关键字 finally 开始,后面紧跟一对…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散
前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说,在叠衣服的过程中,我会带着团队对比各种模型、方法、策略,毕竟针对各个场景始终寻找更优的解决方案,是我个人和我司「七月在线」的职责之一 且个人认为,…...
