对这一波互联网裁员的看法
怎么看待互联网裁员潮?最近一年,国内这些互联网公司都过得不太平。从今年年初开始,各个大厂都在裁员,从传出的消息,裁员比例从 10% 到 30% 不等,更惨的是一些不赚钱的边缘部门,面临直接裁撤整条业务线。去年年中,各个大厂人员扩张,我当时就预测到了今年会有这一波大裁员。 从 2020 年疫情之初,互联网行业是为数不多的,受疫情影响不大的行业,甚至有些业务还从疫情中受益,比如游戏、在线办公等。过去两年,许多大厂团队规模在迅速扩张。字节教育团队,豪言一年要招一万人。笔者所在的团 ...
Fastify 如何实现更快的 JSON 序列化
前言对于 web 框架而言,更快的 HTTP 请求响应速度意味着更优异的性能。而 HTTP 协议是一个文本协议,传输的格式都是字符串,而我们在代码中常常操作的是 JSON 格式的数据。因此,需要在返回响应数据前将 JSON 数据序列化为字符串。JavaScript 原生提供了 JSON.stringify 这个方法,来将 JSON 转成字符串。先来介绍这个方法。 缓慢的 JSON.stringify由于 JavaScript 是一个动态语言,它的类型是在运行时才能确定,因此 ...
Fastify 如何实现高性能路由
前言对于一个 Node.js web 框架来说,路由系统的设计是重中之重。所谓路由,干的事情就是根据 HTTP method 和 URL 路径匹配需要执行的处理函数,并在处理函数中提供有关请求和回应的上下文。借助原生的 HTTP 模块,我们可以写出这样的代码,来实现一个简易的路由功能: const http = require("http");const host = 'localhost';const port = 8000;const requestListener = ...
写给软件工程师的几条成长建议
前言最近一段时间,通过和不同的人对话,脑海中涌现出了一些想法。另一方面也意识到自己正处在职业生涯的某个节点上,回顾从业的这几年,有得有失,所以想借这篇文章聊一下工程师成长这个话题,旨在能给大家带来一点点思考。受自身经验所限,这些观点不一定对,希望朋友们可以辩证的去思考。因为自己的职业属性,这里讨论的仅限于软件工程师这个群体。当然如果下面这些经验之谈能帮助到更多其他领域的同学,那我也荣幸之至。下面是正文,会分享几个个人认为工程师成长之路上很重要的点。 基础很重要我之前作为一个求 ...
《亲密关系》读书笔记
亲密关系的过程分为以下几个阶段:绚丽、幻灭、内省和启示。 伴侣的目的:如同上述所说的,你的伴侣不是你的爱与幸福的来源。满足你的期待与使你开心不是他们的职责,但你的伴侣的确在你的生活中扮演了三个重要的角色,尤其在面对情感上的成熟与唤醒真实自我的时候。这时你的伴侣将会依所需而扮演这三种角色之一:一面镜子,让你看见引发你关注的不舒服感;一名老师,在你探寻真实自我的时候,激励与启发你;一名“玩伴”,开启并陪伴你一段生命的旅程。 月晕现象人们恋爱的真正原因,往往不是他们自己所想的那回事 ...
《人类简史》读书笔记
第十章|金钱的味道金钱是有史以来最普遍也最有效的互信系统。 金钱制度有两大原则: 万物可换。 万众相信。金钱信仰的重点是“别人相信”。 ...
聊一聊 Node.js 错误处理
错误分类软件程序中,我们可以将错误大致分为外部错误和内部错误两大类。 外部错误是正确编写的程序在运行时产生的错误。它并不是程序本身的 bug,更多是一些外部原因导致的问题,比如请求超时、服务器返回500、内存不足等。 而内部错误是程序里的 bug。比如传参类型错误、读取 undefined 的一个属性等。这类问题跟你选择的开发语言、开发者的编程经验、系统复杂度等因素息息相关,虽然无法避免,但可以通过修改代码来修复它。 对应到 Node.js 程序上,一般遇到以下四类错误: ...
【译】2019 年的 JavaScript 性能
建议阅读本文前先读完这篇文章:使用Script-Streaming提升页面加载性能 原文作者:Addy Osmani (@addyosmani[1]) 过去几年中,JavaScript 性能[2]的大幅改进很大程度上依赖于浏览器解析和编译 JavaScript 的速度。2019 年,处理 JavaScript 的主要性能损耗在于下载和 CPU 执行时间。 浏览器主线程忙于执行 JavaScript 时,用户交互会被延迟,因此脚本执行时间和网络上的瓶颈优化尤其重要。 可行的 ...
【译】图解Map、Reduce和Filter数组方法
原文地址:An Illustrated (and Musical) Guide to Map, Reduce, and Filter Array Methods 原文作者:Una Kravets 译文出自:掘金翻译计划 本文永久链接:https://github.com/xitu/gold-miner/blob/master/TODO1/an-illustrated-and-musical-guide-to-map-reduce-and-filter-array-met ...
常用 Git 操作总结
合并远程分支 git fetch origin branch git checkout [your-branch] git merge FETCH_HEAD,merge 前可以先git dff [your-branch] [remote-branch],查看本地分支和远程分支的区别 使用 rebase 合并分支 git rebase [origin-branch] 遇到冲突,解决完冲突后 git add git rebase –continue rebase 和 merg ...
深入浅出 Node.js Cluster
前言如果大家用 PM2 管理 Node.js 进程,会发现它支持一种 cluster mode。开启 cluster mode 后,支持给 Node.js 创建多个进程。 如果将 cluster mode 下的 instances 设置为 max 的话,它还会根据服务器的 CPU 核心数,来创建对应数量的 Node 进程。 PM2 其实利用的是 Node.js Cluster 模块来实现的,这个模块的出现就是为了解决 Node.js 实例单线程运行,无法利用多核 CPU 的优 ...
聊一聊浏览器缓存
缓存的概念什么是缓存 In computing, a cache is a hardware or software component that stores data so future requests for that data can be served faster. cache 是一个硬件或软件的组件,用来存储将来会请求到的数据,让数据获取更快。狭义上,cache 指介于 CPU 和内存之间存储介质。广义上,凡是位于速度相差较大的两种硬件之间,用于协调两者数据 ...
你不知道的 eval
前言eval() 是 JavaScript 中一个非常有用的函数,它可以一段代码字符串动态执行。然而各种编码规范和最佳实践都强烈抵制 eval,几乎将 eval 打入了死牢,大牛 Douglas Crockford 也在《JavaScript 语言精粹》一书中将 eval 视为 JavaScript 中糟粕。这篇文章将带大家重新认识这个函数,知道为什么不用它,以及为什么不得不用它。 eval 是什么在分析 eval 的利弊前,首先来认识一下它。在不清楚一项技术的情况下,就对它 ...
【译】无头 Chrome:服务端渲染 JS 页面的一个解决方案
TL;DR 无头 Chrome 是一个将动态 JS 页面转成静态 HTML 页面的即插即用的解决方案。将其运行于 web 服务器之上,你可以预渲染任何现代 JS 特性,从而提速内容加载,并且是可被搜索引擎索引的。 本篇文章介绍的技术,旨在教大家如何使用 Puppeteer 的 API,给一个 Express 服务器添加服务端渲染(SSR)能力。最棒的地方是,应用本身几乎不需要修改任何代码。无头 Chrome 做了所有的重活。三两行代码,SSR 页面带回家。 大餐之前先来点甜 ...
【译】使用 Script-Streaming 提升页面加载性能
script-streaming 是什么?加载 JavaScript 算是 web 性能最严重的瓶颈之一,尤其在低端 CPU 上情况更糟糕。加载 JavaScript 的性能损耗不仅包括从服务器上下载数据的网络时间,也包括文件解压、解析、编译,以及执行 JavaScript 的时间。为了更好的用户体验,web 页面大量的 JavaScript 代码数量持续地增长,页面加载变得越来越慢。浏览器社区一直在开发很多优化措施来提升 JavaScript 加载速度,比如将解析 Java ...
【译】ES2018 新特性:Promise.prototype.finally()
Jordan Harband 提出了 Promise.prototype.finally 这一章节的提案。 如何工作?.finally() 这样用: promise.then(result => {···}).catch(error => {···}).finally(() => {···}); finally 的回调总是会被执行。作为比较: then 的回调只有当 promise 为 ful ...
【译】ES2018 新特性:Rest/Spread 特性
Sebastian Markbåge 提出的 Rest/Spread Properties 提案包括两部分: 用于对象解构的 rest 操作符(…)。目前,这个操作符只能在数组解构和参数定义中使用 对象字面量中的 spread 操作符(…)。目前,这个操作符只能用于数组字面量和在函数方法中调用。 对象解构中的 rest 操作符(…)在对象解构模式下,rest 操作符会将解构源的除了已经在对象字面量中指明的属性之外的,所有可枚举自有属性拷贝到它的运算对象中。 co ...
TCP 性能优化浅析
前言TCP 作为一种最常用的传输层协议,它的作用是在不可靠的传输信道上,提供可靠地数据传输。在各层网络协议中,只要有一层协议是可靠的,那么整个网络传输就是安全可靠的。现实中,几乎所有的 HTTP 流量都是经过 TCP 传输。因此,我们要进行 web 性能优化,TCP 是其中的关键一环。要针对 TCP 进行性能优化,就得理解其工作原理。 三次握手众所周知,建立一次 TCP 连接需要进行三次握手。关于三次握手,一图胜千言。 三次握手给 TCP 带来了很大的延迟,不过这个握手过程 ...
JavaScript 设计模式汇总
单例模式单例模式算是最简单的一种设计模式,也是 JavaScript 中特别常见一种设计模式。比如创建一个对象var o = {},当对象 o 作为一个全局变量共享时,可以算作一种单例模式。单例模式的核心是确保只有一个实例,并提供全局访问。实际应用中,对话框等全局唯一的UI组件,会使用到单例模式。以 Dialog 组件为例,我通常会为一个 Dialog 类写一个 getInstance() 的静态方法。代码如下: var getInstance = function() &# ...
gulp 4.0 升级指南
gulp.task 移除了三参数语法,现在不能使用数组来指定一个任务的依赖。gulp 4.0 加入了 gulp.series 和 gulp.parallel 来实现任务的串行化和并行化。任务函数中,如果任务是同步的,需要使用 done 回调。这样做是为了让 gulp 知道你的任务何时完成。类似这样:gulp.task(‘a’, function(done){ // sync task… done()}) 如果任务是异步的,有多个方法可以标记任务完成 ...