首页 > 程序人生 > 程序员访谈(一):学无止境
2015
01-26

程序员访谈(一):学无止境

被访者简介:Natasha Murashev 作为一个俄国妹子在美国学了三年心理学后成功混入 FBI 担任行动计划专家,之后辗转 Google 等知名企业后,现在在 Captial One 从事 iOS 开发。作为一个 iOS 开发的一年级生,Natasha 已经取得了非常多的成就,并且维护了一个 Swift 周报。

Natasha,感谢你抽出宝贵的时间!你能简单介绍一下最近你的工作和开发者社区中做的事情吗?

我是 Captial One(第一资本金融公司,是美国一家金融控股公司,专营信用卡、房屋贷款、汽车贷款、银行等金融产品,名列财星500大之一。) 的一名 iOS 工程师,我们正在财政领域做一些令人激动的原生应用 。工作之余,我一般会起的很早,写写博客,学习或者创造点什么,可以说早上是我成长的时间。

你为什么会进入 iOS 开发这个领域呢?

我一直渴望学习,从我刚开始开发的时候就是如此。我在我的上一家公司主要是写 Ruby on Rails,他们有段时间很难招到 iOS 开发者,所以他们问有没有谁想转 iOS 开发的。那时我就开始想这个事情了,于是我报名了 Mobile Makers Bootcamp。我被录取后,就去找我的老板商量,他给我放了两个月的假,这期间我去芝加哥参加了为期 8 周的全职培训课程。我非常喜欢这段经历,有老师教给我很多最佳实践,和自己零零碎碎学习相比,我以非常快的加速度在学习。当我回来之后,我加入了 iOS team。

你能告诉我们一些有关 Bootcamp 的事情吗?你在那来学到了什么?

我们学习了很多 Objective-C,这是我刚开始遇到的最大挑战,因为它看上去实在太吓人了。早上学习到的新知识,会立刻在下午应用上:我会和其他人一些写一些小的 App 。我们每周都要完成一个 App ,在 Bootcamp 的最后我们还需要在 App Store 上架一个 App。

你是如何开始编程的,为什么呢?

这要说到我去旧金山玩的一个周末了,我立刻就爱上了那里的技术氛围 — 积极而又富有创造力的氛围。我参加了很多线下聚会,学到了很多关于创业公司的东西。再后来我搬到了这里,不到一年的时间我就和一些朋友开始为一家创业公司工作。我那个时候还不太会写代码,但是我不喜欢帮不上忙的自己,所以那之后我很快就开始学习编程了。

所以你是自学了 Rails 然后找到了一份 Rails 开发者的工作?

是的。最初我是从斯坦福大学的一门用 Java 教学的课程入门的。它是一门在线课程,结束后我就开始学习 Rails 了。我能以 hack 的方式把东西串起来并工作。但是我知道这不是我想要的编程方式。那时,Dev Bootcamp 刚出来,我申请了,并在第二阶段课程结束。对我来说那是一个能以更聪明的方式来学习编程的机会。

顺带问一句,你在大学是学什么专业的?

心理学,它实际上是最有用的专业了。

人们对程序员有种很刻板的印象,认为他们独自找个地方宅起来编程就够了 (原文说的 basement,算黑吗?)。但是现实生活中你需要和其他人一起工作。在团队中工作更多的是关于群体动力学(一个心理学术语,或称团体动力学、集团力学,在共同工作时会出现的各种心理学和社会学现象、机制和过程的学科)和团体迷失 (另一个心理学术语,是一个心理学现象,指的是团体在决策过程中,由于成员倾向让自己的观点与团体一致,因而令整个团体缺乏不同的思考角度,不能进行客观分析)。有时候加入一些不同意见是非常重要的,因为相处久了,大家会变得只会认同某些事情,而这些事情并不一定总是对的。还有很多是关于领导力的,比如关心他人,建立良好关系等;这些都是每天编程之外需要考虑的。

因为你有心理学背景,你有什么对付编程中的起起伏伏的秘诀吗?比如那些你完全不知道发生了什么的沮丧时刻?

这实际上是我开始学习编程遇到的最大困难了,因为我不熟悉它们。在学校里,有个很简单的公式:刻苦学习 = 考试好成绩。甚至在我开始编程前的其他工作中,也是类似线性的过程 — 事情总会变得更好。

我刚开始编程的时候,有时候会有这种情况:今天感觉自己已然站在世界的顶点,无所不能,而第二天就感觉完全不能写代码。最重要的事情是一直在学习如何 Debug,每次只走一小步,并且怀疑你的全部假设。

除了这些,冥想 — 即只专注于呼吸,或者简单的走开,或者休息一下,对我很有帮助。有时候直接去睡觉是更好的选择。第二天你会发现问题很容易就被解决了。对我来说,这部分已经成为我在编程过程中最喜欢的挑战了。

你对最近新出来的东西怎么看,比如 Swift,WatchKit 和 iOS 8?你对它们感到兴奋吗?

所有吗?我喜欢学习。这是我作为程序员最喜欢的一点了。我在我做过的其他工作上并没有体会到这一点,但是编程的话,有更多起起伏伏和学习的机会。举列来说,Swift 表面上看起来很简单。当它公布的时候,所有的 Javascript 程序员都在说:“哈,我现在也是 iOS 开发者了”。但是呢,我用了一段时间发现,Swift 实际上比 Objective-C 更难。Objective-C 很简单,你只能做这么多事情。但是 Swift 是一个全新的世界格局,并没有最佳实践。有点像狂野的大西部,你的选择太多了。

拿 WatchKit 来说,虽然现在还非常简单,但是它未来的前景非常好。我只是拿到了一个 FitBit 设备,它无缝同步数据方式实在是不可思议的。我对 Apple Watch 跟踪并且无缝同步这些数据感到很兴奋。

如果我没记错的话,你最开始对它很失望,但是很快又激动起来了,没说错吧?

是的,WatchKit 缺少了一些他们宣称的一些特性。比如,没有针对 Digital Crown(Apple Watch 的旋钮表冠)或者 Tactic feedback (压力反馈,Apple Watch 可以通过不同力度的触摸来表现不同的交互)的 API。现在给出来的都是些很基础的 API,比如在 Apple Watch 上展示一个地图,iOS 系统会截一张地图的图片然后发送给 Apple Watch。后来我们举办了一个关于 WatchKit 的黑客马拉松,就算是用这么简单的 API 大家也做出了很多很酷的东西。

当 Swift 出来的时候,你很快就在社区中变得很瞩目,这是你“故意”的吗?

事实上我已经写了好一整子博客了。当我开始编程的时候就开始写了。这是我巩固知识的一种方式。现在我学到了什么,我就会把它写下来,这已经变成我的惯例了。所以 Swift 出来的时候,这是一种很自然的延伸。而且由于 Swift 太新了,有很多地方值得写,你会因为找不到答案而变得很抓狂。

你在 Swift 社区获得的知名度改变了你什么吗?

我只是接着做我一直以来在做的事情。我的确开了一个技术周报,但这也是我学习方式的一部分。要说新的内容话,我开始做一些演讲了。演讲很有趣,也能很好的巩固我的知识。因为当你需要教别人的时候,你需要真正了解你要讲的东西。在 WatchKit 黑客马拉松上,我们赌了一回,因为它的发布日期并不确定。到最后,我不得不在 3 天的时间内学会 WatchKit 并且教学。不过我很喜欢这种压力,因为它强迫我去学习;反过来,与 3 天成为 WatchKit 专家相比,如果只是自学的话,我可能会花费更长的一段时间,而且也不一定能学的更好。

现在,每个人都在学 Swift,或许在未来的几年内会有确定的一些模式。你认为我们还会像这样保持社区的开放吗?

我开始有种感觉,Swift 会给我们更多的选择以好的方式来解决特定的问题。在 Objective-C 里,大部分方法方式都很清楚,但是 Swift 允许一些不同的风格。希望这能够让大家学习不同的东西并保持思想的开放。

今年就要马上结束了,你有什么新年目标或者具体的计划吗?

是的,我的确有个清单。它很大一部分是要保持健康。Swift 是如此的令人兴奋,我一直在敦促自己并学习。但是我也希望自己能快点回归到正常的睡眠周期。因为我发现如果你睡眠充足,实际上你能完成更多的目标,尽管很多时候这并不符合直觉。另一件主要的事情是花更多的时间来学习。Swift 引领我进入了一个我想学习的新世界。以我现在的编程经验肯定会错过一些内容,所以我会专注这方面内容的学习,然后灵活运用它们,写出更好的代码。

你有什么长期的目标吗?

我并不喜欢想太长远,因为事情变化太快了。这有点像代码:你不得不推倒重写。对我来说,更重要的是每天能保持好的状态而不是有一个大大的目标。每天醒来我会问自己,我开心吗?我知道哪些事情能让我高兴:比如学习,保持健康,还有旅行。这些是以保持自我为中心的的三件大事。我觉得通过学习更多我还能收获更多,或许一年后,我会专注在真正创造和发布一些东西。

你会预见自己会做一些和编程完全不同的事情吗?

大概不会,我真的很享受编程。也许 10 年之内还会一直享受吧,谁知道呢?我不知道我是否还能找到一个领域能让我学无止境。我也一直对学习硬件的一些东西感兴趣,不过我认为我会和软件一起来学习。只要我不断的学习新的知识,不断挑战自己,我很乐意继续现在做的事情,稍微偏离一点我的舒适区会让我很开心。

当你学习 iOS 或者 Rails 的时候,有没有一些人或者说导师确实启发了你?

我从和那些比我经验丰富的人结对编程之中学到了很多。结对编程真的能加速学习过程。当我遇到问题或者 bug 的时候,我会为找到一个解决方案而高兴不已。但是更资深的程序员会从不同的视角来看待它 — 不仅仅要能解决问题,从长远来看它应该也是一个好的解决方案。对于 Swift,我从社区里学到了很多,它太新了,所以我正在尝试读更多的书以及向那些比我优秀的人学习。

当你结对编程的时候,你有学到什么大的教训吗,抑或是更多的小细节?

我很注重细节,所以我喜欢学到的小细节或者小技巧。比如,我的同事告诉我在 XCode 中可以打开 Clang analyzer 来获得更好的编译警告信息。如果他不告诉我,我也不会知道,甚至也不会去 Google 这类事情。当你结对编程的时候,你会学习到那些人们已经习以为常或者认为理所应当的小细节。事实上,我最受欢迎的一些博客文章大部分都是关于这类小细节的,尽管我最开始假定是:除了我可能大家已经都知道了。

至于说大的事情,我在 Capital One 的一个同事向我展示了如何在真实环境下应用 MVVM 这个设计模式。我听过这个术语,也听说 Facebook 也在讨论它,但是我并不确定它是如何工作的,在他的指导下我过了一遍一个实际的实现,这真是太赞了。现在我在不同的 App 里一直在使用 MVVM 模式。

还有什么你想分享给大家的吗?

哈,成为一名 iOS 开发者很有趣。对于那些正在思考是否要转 iOS 开发的人,我想说的是:这很有挑战,同时也会是一段令人兴奋的旅程。

译者的一些私货:

最早是通过 Google 知道她的博客的,一篇讲解很清楚的关于 UIEdgeInSet 的文章,后来就订阅了她博客的 RSS,也在 twitter 上 fo 了她,再后来就是 Swift 和 WatchKit 的文章了~。

编程技巧