当前位置: 首页 > news >正文

前端如何丢掉你的饭碗?

对于后端而言,我们常有“删库跑路”的说法,这说明后端的操作对于信息系统而言通常影响很大,可以轻易使信息系统宕机、崩溃,直接导致项目失败。所以,不要去逼后端程序员!

作为前端程序员,我们似乎自己也认为前端相比于后端,代码的安全风险更低。一种常见的看法是,前端随便整,掀不起大波浪!大不了是一些显示性问题!

我们可以这样开玩笑,但作为一名前端开发者,良好的安全意识仍然是必需的,事实上一些问题不仅仅作用于显示层面。更现实一些的层面是,你如何确保你的代码运行稳定,不会给公司、客户带来损失,进而丢掉自己的饭碗?

这不是危言耸听,如果意识缺乏,前端是有可能引发重大问题,丢掉自己的饭碗的。本文试图分析,前端究竟哪些操作可能存在重大风险,以便对各位有所启发。

第一章 代码兼容性考虑——意识不足可能丢掉你的饭碗

有人可能认为,代码兼容性问题,即便出现影响也不大,其理由是:

  • 并非开发者逻辑漏洞,而是客户端、平台、设备千差万别所致
  • 大部分的用户是完全正常的
  • 代码兼容性问题无法得到100%的保障

这么说,实际上是低估了代码兼容性的影响。我们不否认,许多兼容性对用户影响相对比较小,或者说影响的用户数量很少,又或者影响的是那些使用陈旧设备、客户端版本较低、相对不那么重要的客户。

但,代码兼容性是有可能导致你丢掉饭碗的,理由是

公司都是追求效益至上,一旦因为兼容性问题影响到几分之一以上的用户,这仍然算是极为严重的问题。比较典型的案例有,ios平台不支持某属性,安卓某版本以下的chrome不支持某属性、低于某版本的app不支持某jsbridge调用等,直接导致客户端白屏。因此给开发者的建议是 ,对于js、正则、css不熟悉的写法,一定需要查明兼容性,明确影响范围,尽量避开不熟悉的写法。譬如,正则断言、findLastIndex这都是笔者身边真实发生过引发内部复盘的重大代码性事件。当然,就影响而言,一般css兼容性导致的影响会小很多。

一旦到这种层级,内部复盘追责几乎是少不了的。影响到几分之一的用户,对于公司的客户收入可能是影响很大的。、

第二章 业务兼容性考虑——老用户直接崩溃的重大事件

业务兼容性,是一个极容易被程序员忽略的角度,尤其前端程序员。更准确的讲,这应该是产品经理、程序员共同考虑的问题。

如果产品经理在业务兼容性考虑上有所欠缺,那么程序员也应该做适当考虑和提醒,切忌不做思考的直接编码。

下面是一些典型的案例:

  • 业务层面要求修改分享链接:这时程序员应该高度敏感,这是可能导致存量用户崩溃的重大事件。这就是说,虽然软件系统的所有展示都已经替换成了新链接,但对于以前已经分享出去的老链接,用户仍然会使用,如果老链接直接不可用,就会导致大量崩溃。用户完全过渡到接受新链接,必然是需要一个过程,不可能是一蹴而就的。这个事件在笔者身边曾多次发生过。
  • 业务层面需要调整表单字段。这时,程序员应该意识到,对于老用户而言,他的一些字段已经存入数据库,而在表单调整时,他的数据可能会被读出,自动填入表单,但由于表单字段的调整,有可能直接导致显示层面、流程层面的直接问题,这也属于业务兼容性的重大事件。

这种业务兼容性事件,往往是影响到存量用户的使用流程,影响不可谓不大。

第三章 业务流程把控——评审不细致可能丢掉你的饭碗、

听起来似乎评审和丢饭碗没有直接的关系,这也就是个工作方式的问题,但实际上,在评审中,如果不够细致,可能导致技术上无法实现、项目延期,就有可能引发严重后果了。

就笔者亲身经历而言,在流程式交互设计时,产品经理容易想当然的将不同流程放至不同页面,又存在跨页面的大量判断和数据传递。这时,一名专业的程序员应该斩钉截铁的驳斥产品经理的不合理设计。笔者曾经两度迁就这种不合理的设计,导致项目存在延期风险、技术上过于复杂,虽然最终完成了,但仍让我心有余悸。、

所以,如果你不能从专业的角度,纠正产品经理的复杂设计,那么你可能最终在实现上出现困难,项目延期,最终导致内部复盘,责任会挂在你的身上。

第四章 区分环境意识——不良习惯可能会让你丢掉饭碗

在开发中为了效率或者方便测试,往往会写定一些配置,这些配置仅仅适用于开发、测试环境,一旦上线,则需要替换成真正的线上配置。

这就要求我们在上线之前,一定要做好记录,哪些是需要做替换的,并在上线前替换,一旦忘了替换,则会引发线上问题。

譬如,某购物软件给用户的推送消息变成了“测试”,则可以想象开发人员可能是忘了替换一些开发中写死的配置,这无疑会给用户带来不良影响。

第五章 权限配置——缺乏意识可能会直接导致上线失败

 对于公司的服务器而言,一般会配置权限,因此一些开发和测试环境能跑通的情况,到了正式环境机器上面,由于权限限制,就无法跑通了。

前端比较典型的有csp限制等,这些限制可能使得正式环境上面脚本无法运行,从而功能无法正常使用。

这要求开发者提早熟知公司服务器的权限限制,提早与运维部门确定,做好上线权限配置方案。

第六章 攻击防范——缺乏意识可能引发系统被入侵

  • 前端一般需要防范xss攻击,这要求代码中一定不能给恶意用户植入恶意代码的机会,如果缺乏这种意识,当公司遭遇攻击,就离开丢掉饭碗不远了。当然,远远不止xss攻击。
  • 另外,公司的安全系统可能要求不能直接使用第三方脚本,要使用则必须经过安全审查,如果不经安全审查直接调用第三方脚本,则可能是触发安全红线的行为,可能会让你丢掉饭碗。
  • 除此之外,公司可能有一些敏感信息不能暴露给用户,这时需要做屏蔽或者替换处理。譬如,敏感域名不能向外暴露。

作为程序员,一定需要时时有安全意识,尤其对于小型企业,安全上面可能不够完善,这时程序员切记不能墨守成规不去防范,安全上面需要反复深入研究。

第七章 卡死——死循环可能让你丢掉饭碗

前端虽然不直接操作用户数据库,但在程序中会存在大量定时器、循环、遍历的场景,这时,程序员如果不能充分掌控自己代码的边界,那么就很可能写出死循环这样的代码,而一旦出现这种情况,那么最轻也会内部复盘!

对策是,凡是循环、遍历、定时器都需要清晰掌控你的边界。

莫言前端足够安全,稍有不慎,仍然可能丢掉你的饭碗。

那么,你还知道前端哪些会引发职场生存危机的事件呢,欢迎留言讨论。

相关文章:

前端如何丢掉你的饭碗?

对于后端而言,我们常有“删库跑路”的说法,这说明后端的操作对于信息系统而言通常影响很大,可以轻易使信息系统宕机、崩溃,直接导致项目失败。所以,不要去逼后端程序员! 作为前端程序员,我们似…...

栈、队列、优先级队列的模拟实现

优先级队列的模拟实现栈stack的模拟实现push()pop()top()size()empty()swap()stack总代码队列queue的模拟实现push()pop()front()back()empty()size()swap()queue总代码优先级队列(堆)push()pop()top()empty()size()swap()priority_queue总代码deque的了解栈 在CSTL中栈并不属…...

JMM内存模型

JMM内存模型JMM内存模型定义三大特性原子性可见性有序性volatile语义JMM规则操作系统实现术语缓存一致性要求缓存一致性机制写传播事务串行化重排序as-if-serial 语义(像是有序的)happens-before 原则happens-before 原则的八大子原则内存屏障总结finalf…...

Linux- 系统随你玩之--玩出花活的命令浏览器-双生姐妹花

文章目录1、背景2、命令浏览器-双生姐妹花2.1、姐妹花简介2.2 、验名正身2.3、常用功能选项3、常用实操3.1、发送请求获取文件3.1.1、抓取页面内容到一个文件中3.1.2、多个文件下载3.1.3、下载ftp文件3.1.4、断点续传3.1.5、上传文件3.1.6、内容输出3.2 、利用curl测试接口3.3 …...

【深度学习】基于Hough变化的答题卡识别(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳座右铭&#…...

Linux - 进程控制(创建和终止)

1.进程创建fork函数初识 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。返回值:子进程返回0,父进程返回子进程id,出错返回-1getpid()获取子进程id&#xff0c…...

依赖注入~

依赖注入之setter注入: 依赖注入是IOC具体的一种实现方式, 这是针对资源获取的方式角度来说的,之前我们是被动接受,现在IOC具体的实现叫做依赖注入,从代码的角度来说,原来创建对象的时候需要new&#xff0…...

【嵌入式硬件芯片开发笔记】HART协议调制解调芯片AD5700配置流程

【嵌入式硬件芯片开发笔记】HART协议调制解调芯片AD5700配置流程 XTAL_EN接地,CLK_CFG的两个引脚由同一个GPIO控制 初始时HART_CLK_CFG输出低电平 由RTS引脚控制调制/解调。当RTS处于高电平时,为解调(输入);否则为调…...

Go语言异步下载视频

异步下载mp4视频列表 下面是一个简单的Go语言示例,用于异步下载视频。我们将使用goroutines来实现异步下载,并使用sync.WaitGroup来等待所有下载任务完成。此示例依赖于net/http包来执行HTTP请求。 package mainimport ("fmt""io"…...

前缀树(字典树/Trie) -----Java实现

目录 一.前缀树 1.什么是前缀树 2.前缀树的举例 二.前缀树的实现 1.前缀树的数据结构 1.插入字符串 2.查找字符串 3.查找前缀 三.词典中最长的单词 1.题目描述 2.问题分析 3.代码实现 一.前缀树 1.什么是前缀树 字典树(Trie树)是一种树形…...

​申请专利需要具备什么条件

​申请专利需要具备什么条件 在我国,如果创造出来了新的发明都可以申请专利权,一旦申请成功之后,自己的发明就受到了法律的保护,任何人不得以违法的手段进行侵犯。那么申请专利需要具备什么条件?今天律赢时代网就为大家…...

【C++】一篇带你搞懂C++“引用”

前言在C语言的学习中,并没有引用这个概念,但是在C中,加入了引用这个概念,说明引用也是很重要的,但是我们怎么理解引用呢?我是这么理解的,例如在水浒传中,108个英雄好汉都是自己的外号…...

蓝桥杯刷题冲刺 | 倒计时19天

作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 文章目录1.抓住那头牛2.排列序数1.抓住那头牛 题目 链接: 抓住那头牛 - C语言网 (dotcpp.com…...

Java每日一练(20230321)

目录 1. 出现次数最多的字符 🌟 2. 最后一个单词的长度 🌟 3. 两数之和 🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 出现次数最多的字符并…...

【三维几何学习】从零开始网格上的深度学习-3:Transformer篇(Pytorch)

本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052 从零开始网格上的深度学习-3:Transformer篇引言一、概述二、核心代码2.1 位置编码2.2 网络框架三、基于Transformer的网格分类3.1 分类结果3.2 全部代码引言 本文主要内容如下&#…...

一、基础算法3:二分 模板题+算法模板(数的范围,数的三次方根)

文章目录算法模板整数二分算法模板浮点数二分算法模板模板题数的范围原题链接题目题解数的三次方根原题链接题目题解算法模板 整数二分算法模板 bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid 1, r]时使用: int b…...

Spring 源码解析 - Bean创建过程 以及 解决循环依赖

一、Spring Bean创建过程以及循环依赖 上篇文章对 Spring Bean资源的加载注册过程进行了源码梳理和解析,我们可以得到结论,资源文件中的 bean 定义信息,被组装成了 BeanDefinition 存放进了 beanDefinitionMap 容器中,那 Bean 是…...

移除元素(双指针)

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的…...

76.qt qml-QianWindow开源炫酷界面框架(支持白色暗黑渐变自定义控件均以适配)

界面介绍界面支持: 透明 白色 黑色 渐变 单色 静态图 动态图侧边栏支持:抽屉、带折叠、多模式场景控件已集成: 暗黑风格 高亮风格、并附带个人自定义控件及开源demo白色场景如下所示:单色暗黑风格如下所示:用户自定义皮肤如下所示:皮肤预览如下所示:b站入口:https://www.bilibi…...

Python生日蛋糕

目录 前言 底盘 蛋糕 蜡烛 祝福 前言 Hello,小伙伴们晚上好吖!前两天博主满20岁啦(要开始奔三辽呜呜呜),这几天收到了不少小伙伴们的祝福,浪漫的小博主想送给大家一份不一样的生日蛋糕&#xff0c…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣&#xff08;LeetCode&#xff09; 思路 使用两个栈&#xff1a;一个存储重复次数&#xff0c;一个存储字符串 遍历输入字符串&#xff1a; 数字处理&#xff1a;遇到数字时&#xff0c;累积计算重复次数左括号处理&#xff1a;保存当前状态&a…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...