谈一谈工作中的前后端功能开发范围
在BS开发中,往往都是团队开发,分为前端和后端,往往经常会遇到此处功能是前端进行功能开发还是后端进行功能开发的讨论,本文以我自己的观点进行论述。
笔者的观点是:
-
功能实现的优先性:您强调,无论是前端还是后端开发,重要的是能够实现功能。这种实用主义的观点强调了结果的重要性,而不是过程中的具体实现细节。【不论黑猫白猫,能抓老鼠的就是好猫】
-
团队和技术栈的考虑:应该基于团队的技术能力和项目的特点来决定功能的实现方。这表明,技术选择不应仅仅基于技术本身,而应结合团队能力和项目需求。
-
前后端分工的考虑:
- 技术特点:如JavaScript在处理计算密集型任务和精确数值计算方面的局限性,这些因素应在分配前后端任务时考虑。
- 项目需求:并发性和需求的变动性是决定前后端分工的重要因素。例如,高并发应用可能需要将一些任务分配到前端以减轻后端负担。
- 技术生态:对技术生态的了解也是重要的,因为它可以帮助开发人员利用现有的工具和库来补充他们的解决方案。
-
团队成员的态度和能力:
- 一些团队成员可能会推脱责任,而优秀的开发人员应相信自己的技术栈可以完成各种任务。
- 同时,如果有合理的原因,某些任务可能确实不适合某一端来完成。
1.一般情况说明
笔者个人认为以下情况或多或少说明了一些人物的特点和立场问题
2.1.干不了
干不了,这个不属于我方的范围,应该给到另一端。
在这种情况下并且无法拿出一些实际和理论的说明
- 我80%认定此类人都在推脱
- 没有主观能动性,好的开发是相信自己的技术栈可以干任何的事情。
下结论:此类人80%是喜欢推脱的人,10%是大神、10%技术不扎实。
2.2. 不可以做,因为…
此类人,一般可以拿出一定的原因进行问题说明。有的原因是可取的有的原因是不可取的。
3. 前后端工作分工说明
3.1. 功能实现的优先性
在软件工程的实践中,功能的实现是首要任务。在这个阶段,最关键的是确保所需功能得以实现,而不必过于纠结于是否以最优雅或最理想的方式实现。这种实用主义的方法强调了可操作性和实际效果,为项目提供了明确的方向和目标。
3.2. 评估实现的优质和合理性
一旦功能实现的可行性得到确认,下一步是评估其实现方式的优质性和合理性。这涉及到多个方面的考量:
3.2.1. 技术特点的考量
- 前端限制:诸如JavaScript的单线程模型和执行速度限制等因素,对于某些类型的任务(如计算密集型任务)可能不是最佳选择。在这些情况下,考虑将这些任务分配给后端可能更为合适。
- JavaScript并不擅长计算密集型操作
-
单线程执行模型: JavaScript在浏览器中运行时通常是单线程的,这意味着它在执行长时间运行的复杂计算时可能会阻塞用户界面。虽然现代JavaScript引擎(如V8)进行了优化以提高性能,但它们仍然受限于单线程的限制。
-
执行速度: 相比于编译语言如C++或Java,JavaScript作为一种解释型语言,在执行速度上通常较慢。这是因为JavaScript代码在执行前需要先被解释或即时编译,而编译语言在运行前已经被编译为机器码。
-
优化限制: 虽然JavaScript引擎如V8进行了大量优化,但它们在优化计算密集型任务方面的能力仍然有限,特别是当与专门为此类任务设计的语言或环境相比。
-
内存管理: JavaScript的自动内存管理(垃圾回收)可能导致性能开销,尤其是在进行大规模或复杂的计算时。
- JavaScript无法进行银行数值计算
JavaScript中的所有数字都是以64位浮点数的形式存储的(遵循IEEE 754标准),这意味着在处理非常大或者需要非常高精度的数字时可能会遇到精度问题。这在金融计算中尤为重要,因为金融计算通常要求非常高的精确度。
- 后端的强项:后端通常处理更为复杂的逻辑,数据存储和安全问题。对于需要快速处理大量数据,或者需要保证数据安全和完整性的任务,后端是更合适的选择。
3.2.2. 项目需求的考量
- 并发性能:高并发应用要求后端具备强大的处理能力。前端可以通过承担一些非关键任务来减轻后端的负担。
在软件并发较高的项目中,可以将一些非必要的操作交到前端去实现,尽量减少后端的并发压力,比如读取Shapefile文件中的图形(往往这样的项目并发不高,只是举例,不必争论),就不要把文件上传到后端,后端再解析为WKT或者GeoJson等再返回给前端了,前端可以使用第三方包自己获取其中的矢量空间范围。
- 需求的动态性:如果一个项目的需求频繁变更,那么将某些功能实现为可配置和由后端数据驱动可能更为合适,以便快速适应这些变化。
对于此类便需要将需求中经常变化的内容开发为可配置,并由后端数据驱动。前端进行变化,如此就可以使需求的变化不会导致项目的重复部署。
3.2.3. 技术生态的考量
-
库和工具的支持:了解所使用的技术栈及其生态系统是至关重要的。某些任务可能由于缺乏适当的库或工具支持而更适合在特定端(前端或后端)实现。
-
社区和文档:一个强大且活跃的开发社区以及丰富的文档资源,可以为开发人员在特定技术选择上提供更多的支持和便利。
综上所述,前后端工作分工不仅仅是一种技术决策,更是一种战略考量,涉及到技术特点、项目需求和技术生态等多个方面。有效的分工可以提高开发效率,优化资源利用,并增强最终产品的性能和用户体验。
相关文章:
谈一谈工作中的前后端功能开发范围
在BS开发中,往往都是团队开发,分为前端和后端,往往经常会遇到此处功能是前端进行功能开发还是后端进行功能开发的讨论,本文以我自己的观点进行论述。 笔者的观点是: 功能实现的优先性:您强调,无…...

Kubernetes 学习总结(46)—— Pod 不停重启问题分析与解决
我们在做性能测试的时候,往往会发现我们的pod服务,频繁重启,通过kubectl get pods 命令,我们来逐步定位问题。 现象:running的pod,短时间内重启次数太多。 定位问题方法:查看pod日志 kubectl get event …...

Vulnhub靶机:Bellatrix
一、介绍 运行环境:Virtualbox 攻击机:kali(10.0.2.4) 靶机:Bellatrix(10.0.2.9) 目标:获取靶机root权限和flag 靶机下载地址:https://www.vulnhub.com/entry/hogwa…...

深入探讨 AutoGPT:彻底改变游戏的自主 AI
原文地址:Deep Dive into AutoGPT: The Autonomous AI Revolutionizing the Game 2023 年 4 月 24 日 AutoGPT 是一个功能强大的工具,它通过 API 使用 GPT-4 和 GPT-3.5,通过将项目分解为子任务并在自动循环中使用互联网和其他工具来创建完…...
Java Web之网页开发基础复习
tomcat之网页开发基础复习 **声明** :HTML标准规范 </!doctype> <html> : 根标签 <head>: 头部标签 内含<title><meta><link><style> <body>: 主体 <body></body> html标签 单标签: <标签名 \> 双标…...

华容道问题求解第一部分_详细设计(一)之棋子和游戏类_初始化部分
按:因为自控力和能力的原因,这个其实是在和代码同时进行的。 主要 类 说明 这一层是整个项目的基础,将对未来的算法的效率产生重要影响。为了和界面隔离,以及自身逻辑的清晰,下面的两个类是必须的,棋子类…...

【框架】Spring 框架重点解析
Spring 框架重点解析 1. Spring 框架中的单例 bean 是线程安全的吗? 不是线程安全的 Spring 框架中有一个 Scope 注解,默认的值是 singleton,即单例的;因为一般在 Spring 的 bean 对象都是无状态的(在生命周期中不被…...
js中的内存泄漏
理解 内存泄漏是计算机,中由于疏忽或者错误造成程序未能释放已经不在使用的内存,知道浏览器结束 垃圾回收机制 js具有自动的垃圾回收机制,垃圾收集器会定期(周期性)的找出那些不在继续使用的变量,然后释放内存 常见的内存泄漏 意外的全局变量 function foo(){bar 123123…...

营业执照年报申报
姿势:营业执照年报申报 借鉴文章:个体工商户年报申报流程(不要再花冤枉钱) 1、国家企业信用信息公示系统 地址:https://www.gsxt.gov.cn/index.html 2、登录(重庆的方式二简单)...

Springboot教程(五)——单元测试
idea中一般使用JUnit进行单元测试 基本使用 我们可以在idea的test文件夹下的XXXXApplicationTests内进行单元测试: 可以在Test标注的方法上写测试代码: SpringBootTest class C0101ApplicationTests {Testfun contextLoads() {println("Hello …...

【Kotlin】函数
1 常规函数 1.1 无参函数 fun main() {myFun() }fun myFun() {println("myFun") // 打印: myFun } 1.2 有参函数 1)常规调用 fun main() {myFun("myFun") // 打印: myFun }fun myFun(str: String) {println(str) } 2)形参指定默…...
Unity生命周期函数解析
本文由 简悦 SimpRead 转码, 原文地址 mp.weixin.qq.com Unity生命周期函数解析 Unity 生命周期函数是在游戏对象的不同阶段被调用的方法,通过这些函数,我们可以在不同的时刻执行特定的代码。在这篇文章中,我们将一步步解析 Unit…...
【Qt】QTextEdit/QPlainTextEdit 实现 Tab 键多行缩进与反缩进
【Qt】QTextEdit/QPlainTextEdit 实现 Tab 键多行缩进与反缩进 文章目录 I - 主要原理II - 代码实现2.1 - 自定义类2.2 - 实现 Tab 缩进2.3 - 实现反缩进 III - 参考链接 I - 主要原理 由于 QTextEdit 和 QPlainTextEdit ,都无法实现多行选中缩进与反缩进ÿ…...
C++缺陷与思考
数组隐式转换为指针 size_t func(int a[10]) {return sizeof(a); }int a[100]; func(a); // 指针大小 sizeof(a); // 数组大小函数的参数看似是一个数组形式,但事实上他已经退化为指针了,也就是等价于size_t func(int* a),而数组作为参数传…...

无公网ip环境使用DS file软件远程访问内网群晖NAS中储存的文件
文章目录 1. 群晖安装Cpolar2. 创建TCP公网地址3. 远程访问群晖文件4. 固定TCP公网地址5. 固定TCP地址连接 DS file 是一个由群晖公司开发的文件管理应用程序,主要用于浏览、访问和管理存储在群晖NAS(网络附加存储)中的文件。这个应用程序具有…...
软件工程基础
本博客地址:https://security.blog.csdn.net/article/details/136446772 一. 软件工程 1、软件危机。具体表现为:软件开发进度难以预测、软件开发成本难以控制、软件功能难以满足用户期望、软件质量无法保证、软件难以维护和软件缺少适当的文档资料。 …...
alzet供应商你值得拥有
在20世纪70年代,ALZE公司研发出来一款巧妙的药物输送装置——Alzet osmotic pump。这款产品如胶囊般精致小巧,它既有胶囊的外表,也具有胶囊的作用。在Alzet osmotic pump中藏有可以装配药物溶液的空间。此款胶囊泵如同一个小投递员࿰…...

x86中的TSS与任务切换
前言 今天在学习《深入理解Linux内核》的时候,发现出现了一个新的名词TSS(Task-State Segment),这还是我第一次了解到原来x86提供了硬件级别的任务切换功能,之前以为任务切换都是操作系统实现的来着,这里也…...

打造去中心化透明储蓄罐:Solidity智能合约的又一实践
一、案例背景 传统的储蓄罐通常是由个人或家庭使用,用于存放硬币或小额纸币。然而,这样的储蓄罐缺乏透明性,用户无法实时了解储蓄情况,也无法确保资金的安全性。 通过Solidity智能合约,我们可以构建一个去中心化…...
Java Mybatis数据库面试题
Java Mybatis数据库面试题 前言1、什么是 Mybatis?2、Mybaits 的优缺点:3、SQL 注入如何防止?4、MyBatis 框架适用场合:5、MyBatis 与 Hibernate 有哪些不同?6、#{}和${}的区别是什么?7、当表中的字段名和实…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...

Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...

数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...