我是 2016 年在 freeCodeCamp 社区认识柳星,对他的印象一直特别好。不过我们直到 2018 年才第一次语音通话,聊了 160 分钟 12 秒,从那以后我就知道为啥社区里很多小伙伴都会亲切地叫他星星或者星星姐,因为他真的特~别热情,特~别能聊,他的声音也很好听(京片子,你懂的)。星星目前居住在旧金山,就职于 Apple,是一位很酷的开发者。

Q1: 可以讲讲你的童年生活吗?

我是在湖南出生的。因为父母工作原因,1 岁的时候去了北京。一直住在西城区,直到上大学才离开北京。小时候的我比较喜欢汽车,也买过很多汽车模型。我对电视剧、动画片之类的没什么兴趣,甚至连《西游记》、《包青天》、《灌篮高手》这类经典的都没看过,感觉还是挺遗憾的,然而现在也不可能再去补番了😂。4 岁开始学钢琴,这也为之后学习架子鼓和组乐队打下了一定的基础。

运动方面,小学喜欢踢足球,初中开始打篮球。第一次接触台球应该是 10 岁左右,至今依然是我最喜欢、也是最擅长的球类运动。

父母对我的管理也相对严格,所以家里从来不会买任何游戏机。但我从小就接触到了打字机、第一代的黑白打印机、彩色打印机。5 岁的时候,我接触到了 Windows 3.2 和 Windows 95。尽管那时候对编程还没有什么概念,但这些经历帮助我接触并初步了解了计算机。比如,通过一些练习,我开始学着固定指法,进而学习盲打。再比如,如果没有接触过打字机,我可能到现在也不会明白键盘上为什么会有 Shift 和 CapsLock,以及它们为什么会占用键盘上的黄金位置。

Q2: 你在大学阶段做过的最酷的事情是什么?

学习架子鼓,组乐队。

Q3: 你在大学时读的专业是材料化学,为什么转行成为一名开发者?在转行过程中你遇到过哪些困难,是怎么克服的?

我的本科专业是材料化学,研究生专业是材料科学。研究生毕业之后,去了一家做飞机发动机的公司做质检。至于转行的原因,首先,工资相对低是一方面;其次,工厂的工作环境、以及看不到未来发展也是很重要的原因;再者,材料领域的发展已经趋于稳定,虽然不算是夕阳行业(比如机械),但至少不像 IT 领域发展的那么快。

经验 1:发展快也有不好的一面。如果我当时没做好长期学习的心理准备,或者只是想过简单的生活,有一份稳定的工作,工资够用就好,那不如维持之前的样子】

自学过程中,遇到的困难肯定是不少的。一开始很迷茫,不知道该从什么学起,听人推荐,就先接触了 Java,但我的感受是,当时写出来的东西都无法为我提供一种视觉上的直观反馈。直到一两周之后接触了前端,才觉得这个是我想做的。但精力有限,不可能什么都学,所以就放弃 Java,开始学习 HTML、CSS 和 JavaScript,我也很庆幸当初做了这样的选择。

经验 2:兴趣是最好的老师。对于没兴趣的 topic,逼着自己学就会很辛苦】

然后我用 10 天快速看完了《HTML & CSS》以及《JavaScript 语言精粹》。同时,在网上找到了 Codecademy,花了几天刷完他们当时的所有教程,这才接触到了 jQuery 和 angular.js。

经验 3:不满足于现状,更不要限制自己的学习资源和学习平台。互联网那么大,多发掘一些,这样你不仅会比其他人学得更多,还会学得更好】

在当时的 job market 上,jQuery 热度已经逐渐退去,那时候的三大框架是 Backbone.js、Ember.js 和 angular.js。当时,React 还处于初级阶段,只有 Facebook 以及那些特别 aggressive 的公司才会采用;Vue.js 甚至都还没进入 market。所以,我就开始主攻 angular.js。

经验 4:过时的工具自然有过时的原因,有时候光听别人说是不够的,自己用过才能体会到,甚至能悟出一些只属于自己的东西。虽说长期看来,学什么都不会是错的,但如果我们在学习的过程中多了解一下市场,看看现在的公司都需要什么技术栈,就可以少走些弯路】

之后的一个月都是在学习 angular.js,学习的平台也不局限在 Codecademy。还发现了像是 http://egghead.io、Lynda 和 Udemy 等教学平台,同时,我发现其实 Youtube 上的很多免费视频也是非常好的学习资源。如果有人好奇我是如何在短时间内看完大量视频的,秘诀就是 1.5 或 2 倍速,这个习惯一直保持到现在。

经验 5:只要是自己听得懂的人类语言,加速播放丝毫不会影响你理解内容。如果加速听不懂,多半说明普通速度播放的时候也听不懂。唯一区别在于,听加速的内容需要更高的专注度。这对我来说不是问题,相信对大多数决心转行的朋友也不会是问题】

这期间,我还看完了《Pro AngularJS》和《ng-book》两本书(尽管有些部分是跳过或快速看完的),这两本书中会提供一些个人项目的建议和指导。同时,我也发现了一些高质量的技术博客。我在学习做这些项目的时候接触到 MEAN stack,就开始学习相关的内容。

经验 6:多写项目远比多看书重要。看书可以认为是系统的学习,但书本上的知识与实际应用之间是存在差距的。写项目就是在解决实际问题,更是对书本知识的很好补充】

做项目过程中,遇到问题很正常(其实我觉得遇不到问题、一切顺风顺水才很奇怪)。我的解决方案很简单,同时也很有效:看文档和 Google 搜索。一开始不熟悉,由于关键词不准确,经常找不到需要的内容。但不得不说,Google 的搜索建议和匹配机制还是很不错的,我可以看到可能相关的问题,同时了解到别人是如何提问以及如何解决的。

经验 7:学会自己解决遇到的问题,编程无非就是一个解决问题的过程。如果自己解决不了,学会如何提问真的很重要】

到了后半段,时常会遇到瓶颈,特别是有些内容理解不了。这时,我选择有针对性地补一些相关的基础知识。

经验 8:学习过程中遇到瓶颈,多半是因为基础不牢】

然后就开始投简历,找工作。一个月的时间面了差不多 10 家,最后入职了 Rackspace。

经验 9:面试是一个查缺补漏的过程,不用害怕面试失败,要及时总结。但要注意,有些公司,特别是大厂会有 frozen time,意思是不会允许一个未通过面试的人短期(可能是几个月,可能是半年或一年)之内再来面试。所以如果目标是大厂,最好先面一些小公司练练手】

Q4: 你认同 Stack Overflow 联合创始人 Jeff Atwood 说的“任何可以用 JavaScript 来写的应用,最终都将用 JavaScript 来写” 吗?

这个问题我觉得应该分三方面来看:
- 什么 application 可以用 JavaScript 来写

- JavaScript 是否在特定领域具有不可替代性

- 其他技术的发展是否会推动 JavaScript 的普及

语言层面,JavaScript 不太可能发展成为一个底层语言,所以它的使用场景一定是受限的。

显然,JavaScript 在浏览器这个环境是不可替代的。但在服务端,我认为它是可替代的。

浏览器技术的发展不可谓不快,云技术的发展同理。类似的,还有网速的提升,IoT 的普及,这些都会对 JavaScript 的发展起到推动作用。

所以我对上面的 statement 持中立态度。但相比之下,我更相信:

“Any application that can run on cloud, will eventually run on cloud”。

Q5: 你在 freeCodeCamp 社区中是一名非常活跃的贡献者,特别是花了很多时间维护中文社区,可以分享一下你参与到这个项目的过程吗?你希望接下来在这个项目中再做些什么事情?

我最初遇到 freeCodeCamp 英文版是在入职第一份工作之后,大概是 2016 年初。当时我的感觉是,如果可以做出中文版,应该可以帮助到更多人,所以我就去搜索了一下,发现已经有中文版了,而且代码就在 GitHub 上。

然后我就开始给 freeCodeCamp 中文版提交代码,主要是改正翻译的错误,还有修复一些简单的 bug。在这个过程中,我结识了很多小伙伴,也从他们身上学到了很多知识。

星星的博客:https://singsing.io/blog/

同时,我开始写 freeCodeCamp 算法题详解,并发布在自己的博客和知乎上。

之后,我参与了新版课程从翻译到上线的全过程,主要负责的是前端部分的代码,以及翻译的审核与校对。

最近一段时间,我在给英文版课程提供新的 project 挑战题目,预计会贡献两道题。接下来,我计划做 project 挑战的视频详解,希望能帮助大家填补基础知识与实际应用之间的鸿沟。

Q6: 为什么 freeCodeCamp 社区小伙伴叫你星星姐?因为你是传说中的女装大佬吗?

不是。。😂 最早是在一个群里,因为我喜欢、而且经常发 emoji 表情(就像前面这个),所以很多群(zhi)友(nan)就认为我是女的。然后这个叫法就一直流传到现在。

Q7: 可以分享一下你在 Apple 的面试经历吗?在 Apple 工作是一种什么样的体验?

限于保密协议,我没法分享具体的面试题目。这边大部分面试的流程都是算法 + System Design + Behavior,一般需要一整天。面试内容的话,很少会专门考察某一个框架的细节,但不排除会聊到某个框架的使用经历、解决了什么问题、以及如何看待这个框架。

工作体验的话,入职不久,整体上我感觉和之前在的公司(Rackspace 和 VMware)差不多。工作时间方面,啥时候干完啥时候走就行,不打卡,也不要求工作时间。毕竟装作很忙,实际没事做是很浪费资源的。每周肯定是工作五天,有一天或两天可以在家工作。我们组的工作时间基本上是早上 10 点到晚上 4 或 5 点。比如说,事情没做完但要去接孩子放学,那早走一些再回家继续做也是没问题的,很多公司其实都是这样,就是 flexible work hour。套用现在流行的说法,就是 WLB(work-life balance)。但在一些细节方面(比如吃喝,这个我其实很关注),Apple 就会稍差一点。然而,Apple 的员工卡、内部系统是目前我呆过的公司里最好看的,这可能进一步印证了 Apple 的强项其实是设计?

Q8: 你平时有些什么爱好?

除写代码之外,
- 打台球,之前几年经常会去参加 local tournament 或者 league,最近两年参加得少了。

- 偶尔出去拍拍东西,记录生活。玩儿单反和无人机,最近开始尝试拍视频。

- 很偶尔打游戏。

- 关注且喜欢买电子产品。

- 喜欢看重金属的 live show。

Q9: 你在 2019 年有些什么计划?

- 之前在重构博客,后来因为面试耽误了,现在只想尽快写完。

- 做视频,freeCodeCamp project 相关的视频。

- 写博客,主题是用 JavaScript 刷 LeetCode,这也算是对之前准备算法面试的一个总结了。

- 买房!

Q10: 你一般是怎么安排每天的生活和工作的?

结合我之前在 VMware 的时间安排,基本是这样:

- 如果没有特别的安排,早上 8 点半或者 9 点起床,洗个澡出门,一般 9 点之后路上就没那么堵了。

- 开车通勤,路上一般会听播客节目,技术类的为主。一直在追的有 Syntax.fm、JS Party、MacCast、Tools Day、freeCodeCamp 英文播客以及 Codepen Radio。非技术类的,个人比较推荐一天世界、科技聚变和科技富能量,这几个是我认为比较有深度的播客。

- 一般 10 点之前到公司,吃一点早餐,喝杯咖啡,吃点水果,看看邮件,准备一下 stand-up meeting 的内容。

- 10 点半 stand-up meeting,会议结束后继续喝咖啡,处理一些要紧的事情,或者做一下 code review,有时还需要和同事讨论些问题。如果没有特别的事情,就写写代码。

- 11 点半或者 12 点吃饭,一般是和组里的同事一起吃,有时候是和其他组的中国朋友一起。

- 吃完饭我会选择在周围走走,一般 1 点之前回到座位上。

- 午饭之后就不再喝咖啡了,我会泡上一杯茶(最近很迷凤凰单枞),戴上耳机,开始干活。

- 我会选择每工作 40 分钟左右就休息 10 分钟,在周围走走,或者看看手机,刷刷 twitter 或者 instagram 之类的。

- 3 点左右,开发任务一般都可以完成了,就 deploy 了测试一下。如果要开会,那我会争取在开会之前把代码测试完。

- 4 点左右,趁着路上还没那么堵车,抓紧时间回家。如果真的有要紧的任务没做完,那就会晚点回家。

- 5 点之前到家,做上米饭,解冻肉,和老婆一起去健身房(现在已经基本改成一个人去,另一个人做饭,轮换制)。

- 6 点之前回家做饭,顺利的话,7 点半、8 点就吃完并收拾好了。

- 之后的半个小时或一小时一般会处理一些未完成的工作,或者看看有没有重要的邮件和 Slack 留言,因为其他组员有在欧洲的。如果需要,会跟他们更新一下我这边的进度。

- 8 点半之后就是自己的时间了。逛逛 GitHub、处理一些问题(如果需要),翻翻 dev.to、看看订阅的 RSS(强烈推荐这些:JavaScript Weekly、Node Weekly、Front End Weekly、Web Tools Weekly、Angular Weekly、React Status、Medium Daily Digest 和 Product Hunt Daily)。

- 然后就会写写代码,自己的项目或者在做的开源项目。偶尔也会和老婆一起玩儿玩儿 Switch,比如前一阵刚通关 Overcooked,全三星。

- 12 点或者 1 点睡觉。