
我是17年6月买的这本书,当时在 HW 工作刚三个月。为了确定一下,我还专门去博客看我17年的年中总结,生活的苦楚又历历在目。我记得那时候开发很紧,从国内派人来湾区,导致我们美研也开始按国内的工作时间来。早上九点半到,二十分钟站会,每个人说昨天做了什么,今天打算做什么,开发联调进度,有没有阻碍。然后一干干到晚上十一点才下班回家。实在不知道是怎么熬过来的。我估摸是业务代码写的扛不住了,就想准备准备,一方面提升提升,再一方面年底拿了签证好跑路,所以就买了几本 JavaScript 的书。结果人算不如天算,事不如人意,书也没看完。
上周刚好休年假,心想也不能天天在家打游戏,还是得搞搞学习,所以这才抽出来这本书开始看。我是从后往前翻的,因为对最后一章并发比较感兴趣。花了三天一口气看完,相见恨晚,后悔要是能早点读读就好了。看的过程中记起很多经历过的面试题目,想起没回答上来的尴尬时刻,有点羞愧和惋惜。
接下来说说这本书。首先在2020年这个时间点,我觉得这本书不太适合初学者看,更适合有过一两年经验的朋友去学习。先不提那些已经过时的知识点,初学者因为没有见太多所谓的好的代码和坏的代码,很难深刻认识到书里提到的 Best Practice 存在的意义,没有比较就没有进步。对于有一些经验的朋友,书中的一些例子可能会让你想起某段自己写的笨比代码,然后去琢磨作者的良苦用心。
回到书的内容,因为这本书出版于12年,距离ES5正式发行才刚刚过去三年,前端领域还有大量项目是跑在非严格环境。所以作者花了不少篇幅来介绍一些特性在strict 和 non strict 环境的区别,以及一些对于现今开发者来说不再是问题的问题。比如逗号插入,现在已经有了比较完善的 Lint 工具来解决这类问题。还有类似 with,eval,caller,callee 等概念,随着 ES 的逐步规范和框架的引入,现在开发中基本不再触碰这类知识了。又如第五章中实现的 Dict,现在已经有成为标准的 Set, Map等对象可供直接调用了。
另一方面,阅读这边书可以帮助我们快速梳理一遍知识点。比如书中提到的prototype inheritance,IIFE,closure 保存私有变量,call apply 的使用场景,arguements 的使用,defineProperty 的使用等等,都是日常开发以及面试常问的问题。所以在面试之前,重点看下第三、四、五章,是个很不错的复习思路。我想起当年去 ebay 面试,第一面印度小姐姐出的第一题是写一个pub-sub,第二题就是自己实现一个Iterator,可以对一个数组调用 next 方法,直到最后没有了打印完成。现在看到书上的 Item 24 就是原题,实在可惜。
书的第六、七章 ,Library 和 API 设计,以及并发,我觉得非常值得阅读,里面提供的一些接口设计规范和代码示例,在日常工作中使用的还是比较多的。就在前不久,大家在讨论中间层如何设计权限接口的问题,这也是当下 BFF 中比较火热的一个话题吧。看完这一章,我有了些新的想法。比如说对于公共接口,应该做好 defensive programming (Item 59),对于特殊值,边界值,应该抛错让接入方知道。还有比如说提到 options object (Item 55),大家肯定不会陌生这样的代码:
// positional arguments
function getAuth(a,b,c,d,e) {
// do something
}
更可怕的是,随着业务的增长,形参的长度还在增加,以至于每次调用都心惊胆战,这是传到第几个参数了。上面这是一个极端情况,还有一种情况,就是提供的接口什么都不传,返回全部信息。甭管你要不要,一把全倒给你:
function getAuth() {
return {
city: [],
region: [],
role: [],
// more and more fields
}
}
这是另一个极端,图一时之省事。下次业务增长了,我们只需要往 payload 里无脑加数据就好了。一个接口服务公司,也不管别人需不需某个字段。
看过书以后,我想只需再多走一步就可以优化这个接口。当入参为空时,我们返回所有数据,满足当前简单的业务需求。当接入方多了以后,用户只传他们关心的字段,我们就返回子集。这样的接口粒度更小,便于拓展,可以真正的作为提供方去满足业务方的需求:
function getAuth() {
// return all
}
function getAuth({ city }) {
return {
city: []
}
}
function getAuth({ notInTheDoc }) {
// throw ArgumentsError
}
这是我看书过程中的一点粗浅的思考。关于接口安全和接口设计,我了解的不够系统和深入,也是今年希望补习的一个领域。
现在看来,作者不愧是 TC39 成员,书中提到的 Iterator,Promise 等概念均在后来的 JS 正式版本中标准化了,我甚至还有点期望能出第二版。此外,明显感到看英文的速度下降,没有原来顺溜。接下来还要多看英文材料,这项技能不能丢。
最后,昨天得知司徒正美猝然离世,大家聊起都唏嘘不已。这两年加班不少,收益无多,身体也不如从前。有些感慨,人生短短数十年,抓紧时间做些开心的事,读些无用的书,爱些可爱的人,足矣。
2020 年 4 月 1 日