2022年8月19日
2016年的旧文,之前未发表,时隔6年后整理一下发出来。
如果从我写下第一行代码开始算的话,我写代码的历史大概已经超过20个年头了。这20多年里接触过各种各样的语言,也接触过各种各样的代码风格。当然也见证了很多代码风格引起的撕逼大战。
对于代码风格这种事情上的架,我一般不参与吵的,觉得是一件很无聊的事情。直到今天(2016年)打开微博看到几十条评论,有点蒙圈。
事情的起因是上周我在微博上发了一个条吐槽:
最近面试好多人连12345这五行代码的执行顺序都讲不清楚。就算不知道5我也忍了,好多人连1234这四行代码是什么顺序跑的都搞不清楚。现在前端门槛低到这样的程度了么?(为了把它们排到第12345行上,刻意调整了代码格式,请轻拍。)
附上了一段代码:
for(var i=0;
i<3;
i++){
setTimeout(function(){
console.log(i)
},0)
}
for(var i=0;
i<3;
i++){
setTimeout(function(){
console.log(i)
},0)
}
然后今天收到了一堆吐槽:
在微博上也零碎地做了一些回复,不过还是觉得没有把想说的话说完,于是有了这篇。
2021年3月13日
2020年的第一天是如何开始的已经完全没有任何印象了,现在来猜测一下,估计已经是快要开始进入回家过年的兴奋中了。然而这份兴奋还没来得及留下什么印象,就被突如其来的疫情冲散得无影无踪。
总而言之,一个复杂的新年开始来了。
1月23日,年二十九,武汉封城,随后湖北封省。就此开始没有走亲戚的过年,以及随后的居家办公。
于我而言,每天看着疫情数字和武汉的各种神奇操作,焦虑和揪心都少不了。但就个人而言,却并不觉得有很不幸。目睹了身边的亲戚,因为隔离不能重返工作岗位,一边心里无比焦急,一边还要顾及过年的氛围多少需要一些自我安慰。相比之下,我能不受影响地工作,公司继续保障每个月的收入,算幸运了。
这段日子不能说刻骨铭心,却也算得上印象深刻了。有吃有喝,还有点无所事事,能和家人在一起待这么久,也很好。
2020年9月19日
我们所处的世界充满了各种各样的不确定性。但有一件事是不存在不确定性的,即写代码。
多年以前,在我刚入行不久的时候,有一位前辈和我说过“出现问题的时候,先怀疑是自己的原因,因为机器是不会出错的,错的永远是人。”这句话我记了很久,也时不时就会翻出来回想一番,也会冒出很多更细的想法:那机器不也是人造的?机器的程序不也是人写的?就一定是自己的原因,不能是别人的原因吗?但反复想了很多年,还是觉得这句话相当有道理,即使是别人的原因,那错的也是人而不是机器。
这其实就是写代码时的确定性,我们写的代码会被怎么运行,是非常确定的。即便它要依赖更多的底层软硬件机制,但仍然是确定的,只是找出这个确定性的过程更加复杂而已。
如果你看不懂例子,跳过就好。
项目中需要上传下载文件,使用的是某云服务的存储服务。在下载的部分,为了方便,使用Node.js封装了一个下载方法,返回一个Stream
,而这个Stream
本质上是由http请求库request.js请求后返回的。最后由koa框架返回这个Stream
给浏览器。
请求下载 -> 下载方法 -> request.js请求云服务 -> 返回Stream
代码大致如下:
router.get('/api/download-file', async (ctx) => {
ctx.body = Download.getPrivateStream(ctx.query.fileId);
});
router.get('/api/download-file', async (ctx) => {
ctx.body = Download.getPrivateStream(ctx.query.fileId);
});
然而,同样的代码,在不同的项目下,表现却大不一样,A项目访问图片时是直接在浏览器中显示图片,B项目访问同样的图片却变成了下载。调试工具一查看,发现它们有不一样的HTTP Header返回:
Content-Type: image/png
Content-Type: application/octet-stream
2020年9月16日
七八月,又是一年新朋友从校园走入职场的季节,也是又一年职场困惑季的开始。
在996被全民声讨之后,“奋斗逼”又成为了被声讨的对象。然而很多人声音很大,却未看明白背后的关系。
去过台湾的话,会发现台湾的朋友很敬业,在自己的岗位上怡然自得,初看非常羡慕。回来细想,这种怡然自得背后却是“看不到希望”的另一种表达。人活世上,是需要希望的。于有的人而言,努力工作升职加薪便是希望,于另一些人而言,不再相信努力工作可以升职加薪,于是觉得职场不是一个有希望的地方。
《肖申克的救赎》是IMDB评分排名第一的电影,也是我最喜爱的电影之一。这部影片在我看来就是在讲希望。有希望就有可能,而一旦失去希望,即便你逃离了高墙大院,仍然会被自己困住。
生活有意思的地方就在于,你可以选择相信,也可以选择不相信。有选择便是这个时代最大的幸运。我看到很多年轻朋友心中仍然有梦想、眼里仍然有星光。
2020年3月31日
2020年3月18日
本文来自知乎问题:为什么要把前端搞的这么复杂,UI 组件不是很好用吗, 难道就是为了推广 nodejs 和 npm 吗?
这个题目中有无数槽点:
画个界面只要快就好了吗?JS类库能帮你解决渲染慢的问题?类库和组件能帮你解决所有的兼容问题?不需要高并发所以就不需要架构?
这里的每一条都值得展开来反驳,但鉴于题主的主要疑问不在这里,就不跑题。
这个问题的核心,抽取一下就是两个:
2020年2月24日
来自知乎的问题,原地址https://www.zhihu.com/question/270040312/answer/1034679430。
先说结论:微信是一个移动端通讯工具,再通俗一点,它就是一个手机软件。至于电脑版什么的,就是随手一做,如果威胁到手机版的地位,关掉都不会有人心疼的。
知乎确实迎来新一辈的朋友了,似乎已经没有多少人知道微信诞生的背景,也没有人在乎背后的逻辑了。微信在知乎上的口碑也从一开始的神作,变成了最被唾弃的软件。
先问几个问题:
2019年11月29日
2019年11月10日
Sequelize.js是一个用于Node.js的数据库ORM库,支持Postgres、MySQL/MariaDB、SQLite、SQL Server等引擎。
本文记录一些团队在使用Sequelize过程中积累的经验教训。
ORM即Object Relational Mapping,中文叫“对象关系映射”。简单地说就是可以将数据库的各种对象(表、字段)及关系映射为程序语言的对象和关系,从而使开发者不需要直接操作数据库,转而操作对象即可。
例如,将表user
映射为模型User
后,从数据库中查询id
为1
的用户就可以直接调用findOne()
方法:
const user = await User.findOne({
where: {
id: 1
}
});
const user = await User.findOne({
where: {
id: 1
}
});
这样做会带来几个明显的好处:
下文不区分“模型”和“Model”,均指Sequelize中与数据表对应的数据模型。
2019年3月28日
本文来自知乎问题为什么会允许babel这种解析工具的存在?
希望提问者真的没有在调侃……因为在我看来,这有点像“何不食肉糜”的提问了。
ES6又名ES2015,也就是在2015年定稿的,在定稿之前其实大家已经讨论了很久了。但是光讨论有什么用呢?没有任何一个环境是支持ES6运行的。所以就讨论讨论再讨论,然后大家一拍桌子,好,定稿?
事实上在ES2015之前,ES5可能就是这么定下来的,ES4可能也是这么废弃的。
这时候,就有个神奇的东西,叫6to5出现了,它的第一次提交出现在2012年9月。Initial import · babel/babel@aedcd4e 它的作用就是把ES6的代码编译成ES5的代码,它的神奇之处就在于,虽然一个能支持ES6的环境都没有,但是我们仍然可以使用ES6来编写代码。这是一种前所未有的模式,甚至在其它语言中都没有出现过这种模式。(希望不是孤陋寡闻,至少py3 -> py2是没有见到类似工具的。)
于是,我们可以在规范还没有定稿的时候就先用用看,用着觉得不爽了再回去修改规范。这样是不是比拍桌子要科学得多?事实上现在的ES规范制定过程就是这么干的,定了stage 0到stage 4等几个级别,而且规定了需要在多少个环境中先验证,验证完之后才可以定稿发布。基本上可以毫不客气地说,这个东东就是由6to5开创的新局面。
2019年2月3日
时间像一位长者,慢慢把生活的真相一层一层剥开给你看。
2018年像一溜烟,还没来昨及看清,就已然消失不见,留下我一个人,站在这里不断回想,它究竟是个什么样子。
“人在沮丧的时候特别喜欢思考人生。”这是我在4月份说的,大概也是在沮丧的情绪中不断反思而得出的结论。这种沮丧大部分要来自泥沙俱下的股市。“牛市的时候人人都觉得自己是股神”,这些话,也只有到山穷水尽的时候才能真正明白。好在,除此之外,倒也并没有什么真的大风大浪,一边跟着时间走,一边安慰自己,竟也就这样过来了。
2018年7月29日
本文来自知乎问题如何看待“代码没有写到10万行不要碰设计”这样的观点?
有些答主可能误解了题主说的“设计”的意思。这里不是指代码设计或者工程设计,指的是交互和视觉设计。
比较硬的关系是,你会接设计同学出的设计稿,如果一点不了解设计领域的知识,拿到稿件会手足无措。适当地了解设计理论、方法、软件使用以及设计稿的常用处理(蒙版、切图、切片、变换、拼接等),是前端必备的工作知识。
比较软的关系是,前端是离用户最近的工程师,需要对用户体验负责。很多时候设计稿输出来的是静态的,但是用户交互的是一个动态的页面,如何把这些交互做好,设计和前端基本上各有一半的能力和责任。