一行正则引发的事故
2019年10月22日中午,偶然在 freeCodeCamp 翻译协作组微信群看到 Miya 转发的一篇 Quincy 文章:What the heck is going with freeCodeCamp’s servers?
文章中开篇就声明最近一段时间 freeCodeCamp 的服务器很不稳定,工程师花费三天时间才查明问题的症结就是下面的这行代码。
2019年10月22日中午,偶然在 freeCodeCamp 翻译协作组微信群看到 Miya 转发的一篇 Quincy 文章:What the heck is going with freeCodeCamp’s servers?
文章中开篇就声明最近一段时间 freeCodeCamp 的服务器很不稳定,工程师花费三天时间才查明问题的症结就是下面的这行代码。
故事最早发生在2014年6月,那段时间我正在跟随 nswbmw 的博客项目 Nblog 学习 Express 框架。
中间正好用到了 Mongodb 数据库,那也是我初次使用 Mongodb,给我的印象还是很不错的。
当我完成了这个简单博客后,我尝试发了十几条诗词,都是关于唐诗三百首的。
当时对数据库的了解非常有限,也不知道守护进程这些。
直到有一天我重启数据库发现之前的诗词数据都没了。
当时让我觉得非常奇怪,找来公司的技术大牛张春生帮忙,各种修复数据库的方式都试过了,依然没用。
在网上查找 Mongodb 丢失数据的问题,好家伙,不查不知道,一查吓一跳,这么多人都遇到过 Mongodb 丢数据的问题。
在看到很多人遇到和我同样的问题后,我心里告诉我自己,这问题和我没关系,是 Mongodb 本身的缺陷。
每当我接受一个任务,打开项目的源码,随便一个文件几千上万行的代码时,头都大了。
嘴里念到:a piece of shit,心中一万只草泥马在狂奔。
这种只管功能实现,不管代码复用、后期维护,是否简洁易读的做法让后来接手项目的人头疼不已,
相信你我都曾经有过这样头疼的时刻。
一个公司最初的几个程序员奠定了公司代码的品质。
如果他们也是心浮气躁,干完活就行,打短工的心态。
那我只能说这样的公司只能喧嚣一时,必然活不长。
这样的公司我们见过太多了,其兴也勃焉其亡也忽焉。
我比较欣赏有自己节奏的公司,好的公司不会被对手、市场影响自己的节奏。
对手越是疯狂、市场越是极度繁荣,好的公司越应该冷静下来。
2013年刮起在线教育风、2014年刮起O2O风,看看现在活着的还有几家。
那些指望迅速占领市场份额的公司都活不长,每个产品都有自己的生命周期。
如果你硬要拔苗助长,就只能迅速灭亡。
先来看看淘宝UED官方博客的一个题目:(http://ued.taobao.org/blog/2007/11/job_test_explanation/)
请给Array本地对象增加一个原型方法,
它的用途是删除数组条目中重复的条目(可能有多个),
返回值是一个包含被删除的重复条目的新数组。
变量的作用域无非就是两种:全局变量和局部变量。
长期以来我一直以为用var关键字声明的就是局部变量,直接声明的就是全局变量。
直到我在项目中发现在代码开头部分用var关键字声明的变量居然是全局变量,
我深刻记得当初这个发现给我自己带来的震惊,
长期地写业务代码真的并不能成比例地提高技术水平。
因为我发现很多人和当初的我一样,都搞不清这个变量作用域,
体现在代码中就是你经常看到全局变量,这是一种因为不深入原理,所以采用这种简单粗暴的解决方式。
因为搞不清变量作用域,为了自己开发方便,直接声明全局变量,丝毫不考虑这会给后期维护带来什么后果。
去看js权威指南后发现,var仅仅是个关键字而已,它本身没有任何意义,它并不能决定变量是全局还是局部。
决定变量是全局还是局部的是变量所处的作用域,
如果是在最外层或在块语句中,用var声明的就是全局变量,
而如果是在函数中,用var声明的就是局部变量。
es6引入了全新的关键字(let)来声明变量,我们不禁要问为什么?
难道仅仅是因为js只有函数作用域,没有块级作用域吗?
那我们继续追问,为什么要引入块级作用域?
如果你搞不清这个问题,你可以从自己熟悉的角度来提问:为什么要有函数作用域?
如果没有函数作用域,那js中就没有局部变量了,全部是全局变量,甭管是否用var声明。
也就是说函数作用域存在的目的就是为了减少全局变量的使用。
当你搞清楚了为什么要有函数作用域也就搞清楚了es6为何要引入块级作用域。
没错,它们俩的目的都是一样:创建局部变量环境,减少全局变量的使用。