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

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

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

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

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

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

学习架子鼓,组乐队。

16941562140645_.pic

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 的普及

16951562140652_.pic

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

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

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

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

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

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

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

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

16961562140658_.pic
S1ngS1ng 的博客: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。

16981562140669_.pic

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 点睡觉。