一个软件是如何开发出来的呢?
一、前言
如今,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 开始,后面紧跟一对…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
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实现分布式…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
