被訪者簡(jiǎn)介:Natasha Murashev 作為一個(gè)俄國(guó)妹子在美國(guó)學(xué)了三年心理學(xué)后成功混入 FBI 擔(dān)任行動(dòng)計(jì)劃專家,之后輾轉(zhuǎn) Google 等知名企業(yè)后,現(xiàn)在在 Captial One 從事 iOS 開(kāi)發(fā)。作為一個(gè) iOS 開(kāi)發(fā)的一年級(jí)生,Natasha 已經(jīng)取得了非常多的成就,并且維護(hù)了一個(gè) Swift 周報(bào)。
Natasha,感謝你抽出寶貴的時(shí)間!你能簡(jiǎn)單介紹一下最近你的工作和開(kāi)發(fā)者社區(qū)中做的事情嗎?
我是 Captial One(第一資本金融公司,是美國(guó)一家金融控股公司,專營(yíng)信用卡、房屋貸款、汽車貸款、銀行等金融產(chǎn)品,名列財(cái)星500大之一。) 的一名 iOS 工程師,我們正在財(cái)政領(lǐng)域做一些令人激動(dòng)的原生應(yīng)用 。工作之余,我一般會(huì)起的很早,寫寫博客,學(xué)習(xí)或者創(chuàng)造點(diǎn)什么,可以說(shuō)早上是我成長(zhǎng)的時(shí)間。
你為什么會(huì)進(jìn)入 iOS 開(kāi)發(fā)這個(gè)領(lǐng)域呢?
我一直渴望學(xué)習(xí),從我剛開(kāi)始開(kāi)發(fā)的時(shí)候就是如此。我在我的上一家公司主要是寫 Ruby on Rails,他們有段時(shí)間很難招到 iOS 開(kāi)發(fā)者,所以他們問(wèn)有沒(méi)有誰(shuí)想轉(zhuǎn) iOS 開(kāi)發(fā)的。那時(shí)我就開(kāi)始想這個(gè)事情了,于是我報(bào)名了 Mobile Makers Bootcamp。我被錄取后,就去找我的老板商量,他給我放了兩個(gè)月的假,這期間我去芝加哥參加了為期 8 周的全職培訓(xùn)課程。我非常喜歡這段經(jīng)歷,有老師教給我很多最佳實(shí)踐,和自己零零碎碎學(xué)習(xí)相比,我以非??斓募铀俣仍趯W(xué)習(xí)。當(dāng)我回來(lái)之后,我加入了 iOS team。
你能告訴我們一些有關(guān) Bootcamp 的事情嗎?你在那來(lái)學(xué)到了什么?
我們學(xué)習(xí)了很多 Objective-C,這是我剛開(kāi)始遇到的最大挑戰(zhàn),因?yàn)樗瓷先?shí)在太嚇人了。早上學(xué)習(xí)到的新知識(shí),會(huì)立刻在下午應(yīng)用上:我會(huì)和其他人一些寫一些小的 App 。我們每周都要完成一個(gè) App ,在 Bootcamp 的最后我們還需要在 App Store 上架一個(gè) App。
你是如何開(kāi)始編程的,為什么呢?
這要說(shuō)到我去舊金山玩的一個(gè)周末了,我立刻就愛(ài)上了那里的技術(shù)氛圍 -- 積極而又富有創(chuàng)造力的氛圍。我參加了很多線下聚會(huì),學(xué)到了很多關(guān)于創(chuàng)業(yè)公司的東西。再后來(lái)我搬到了這里,不到一年的時(shí)間我就和一些朋友開(kāi)始為一家創(chuàng)業(yè)公司工作。我那個(gè)時(shí)候還不太會(huì)寫代碼,但是我不喜歡幫不上忙的自己,所以那之后我很快就開(kāi)始學(xué)習(xí)編程了。
所以你是自學(xué)了 Rails 然后找到了一份 Rails 開(kāi)發(fā)者的工作?
是的。最初我是從斯坦福大學(xué)的一門用 Java 教學(xué)的課程入門的。它是一門在線課程,結(jié)束后我就開(kāi)始學(xué)習(xí) Rails 了。我能以 hack 的方式把東西串起來(lái)并工作。但是我知道這不是我想要的編程方式。那時(shí),Dev Bootcamp 剛出來(lái),我申請(qǐng)了,并在第二階段課程結(jié)束。對(duì)我來(lái)說(shuō)那是一個(gè)能以更聰明的方式來(lái)學(xué)習(xí)編程的機(jī)會(huì)。
順帶問(wèn)一句,你在大學(xué)是學(xué)什么專業(yè)的?
心理學(xué),它實(shí)際上是最有用的專業(yè)了。
人們對(duì)程序員有種很刻板的印象,認(rèn)為他們獨(dú)自找個(gè)地方宅起來(lái)編程就夠了 (原文說(shuō)的 basement,算黑嗎?)。但是現(xiàn)實(shí)生活中你需要和其他人一起工作。在團(tuán)隊(duì)中工作更多的是關(guān)于群體動(dòng)力學(xué)(一個(gè)心理學(xué)術(shù)語(yǔ),或稱團(tuán)體動(dòng)力學(xué)、集團(tuán)力學(xué),在共同工作時(shí)會(huì)出現(xiàn)的各種心理學(xué)和社會(huì)學(xué)現(xiàn)象、機(jī)制和過(guò)程的學(xué)科)和團(tuán)體迷失 (另一個(gè)心理學(xué)術(shù)語(yǔ),是一個(gè)心理學(xué)現(xiàn)象,指的是團(tuán)體在決策過(guò)程中,由于成員傾向讓自己的觀點(diǎn)與團(tuán)體一致,因而令整個(gè)團(tuán)體缺乏不同的思考角度,不能進(jìn)行客觀分析)。有時(shí)候加入一些不同意見(jiàn)是非常重要的,因?yàn)橄嗵幘昧?,大家?huì)變得只會(huì)認(rèn)同某些事情,而這些事情并不一定總是對(duì)的。還有很多是關(guān)于領(lǐng)導(dǎo)力的,比如關(guān)心他人,建立良好關(guān)系等;這些都是每天編程之外需要考慮的。
因?yàn)槟阌行睦韺W(xué)背景,你有什么對(duì)付編程中的起起伏伏的秘訣嗎?比如那些你完全不知道發(fā)生了什么的沮喪時(shí)刻?
這實(shí)際上是我開(kāi)始學(xué)習(xí)編程遇到的最大困難了,因?yàn)槲也皇煜に鼈?。在學(xué)校里,有個(gè)很簡(jiǎn)單的公式:刻苦學(xué)習(xí) = 考試好成績(jī)。甚至在我開(kāi)始編程前的其他工作中,也是類似線性的過(guò)程 -- 事情總會(huì)變得更好。
我剛開(kāi)始編程的時(shí)候,有時(shí)候會(huì)有這種情況:今天感覺(jué)自己已然站在世界的頂點(diǎn),無(wú)所不能,而第二天就感覺(jué)完全不能寫代碼。最重要的事情是一直在學(xué)習(xí)如何 Debug,每次只走一小步,并且懷疑你的全部假設(shè)。
除了這些,冥想 -- 即只專注于呼吸,或者簡(jiǎn)單的走開(kāi),或者休息一下,對(duì)我很有幫助。有時(shí)候直接去睡覺(jué)是更好的選擇。第二天你會(huì)發(fā)現(xiàn)問(wèn)題很容易就被解決了。對(duì)我來(lái)說(shuō),這部分已經(jīng)成為我在編程過(guò)程中最喜歡的挑戰(zhàn)了。
你對(duì)最近新出來(lái)的東西怎么看,比如 Swift,WatchKit 和 iOS 8?你對(duì)它們感到興奮嗎?
所有嗎?我喜歡學(xué)習(xí)。這是我作為程序員最喜歡的一點(diǎn)了。我在我做過(guò)的其他工作上并沒(méi)有體會(huì)到這一點(diǎn),但是編程的話,有更多起起伏伏和學(xué)習(xí)的機(jī)會(huì)。舉列來(lái)說(shuō),Swift 表面上看起來(lái)很簡(jiǎn)單。當(dāng)它公布的時(shí)候,所有的 Javascript 程序員都在說(shuō):“哈,我現(xiàn)在也是 iOS 開(kāi)發(fā)者了”。但是呢,我用了一段時(shí)間發(fā)現(xiàn),Swift 實(shí)際上比 Objective-C 更難。Objective-C 很簡(jiǎn)單,你只能做這么多事情。但是 Swift 是一個(gè)全新的世界格局,并沒(méi)有最佳實(shí)踐。有點(diǎn)像狂野的大西部,你的選擇太多了。
拿 WatchKit 來(lái)說(shuō),雖然現(xiàn)在還非常簡(jiǎn)單,但是它未來(lái)的前景非常好。我只是拿到了一個(gè) FitBit 設(shè)備,它無(wú)縫同步數(shù)據(jù)方式實(shí)在是不可思議的。我對(duì) Apple Watch 跟蹤并且無(wú)縫同步這些數(shù)據(jù)??感到很興奮。
如果我沒(méi)記錯(cuò)的話,你最開(kāi)始對(duì)它很失望,但是很快又激動(dòng)起來(lái)了,沒(méi)說(shuō)錯(cuò)吧?
是的,WatchKit 缺少了一些他們宣稱的一些特性。比如,沒(méi)有針對(duì) Digital Crown(Apple Watch 的旋鈕表冠)或者 Tactic feedback (壓力反饋,Apple Watch 可以通過(guò)不同力度的觸摸來(lái)表現(xiàn)不同的交互)的 API?,F(xiàn)在給出來(lái)的都是些很基礎(chǔ)的 API,比如在 Apple Watch 上展示一個(gè)地圖,iOS 系統(tǒng)會(huì)截一張地圖的圖片然后發(fā)送給 Apple Watch。后來(lái)我們舉辦了一個(gè)關(guān)于 WatchKit 的黑客馬拉松,就算是用這么簡(jiǎn)單的 API 大家也做出了很多很酷的東西。
當(dāng) Swift 出來(lái)的時(shí)候,你很快就在社區(qū)中變得很矚目,這是你“故意”的嗎?
事實(shí)上我已經(jīng)寫了好一整子博客了。當(dāng)我開(kāi)始編程的時(shí)候就開(kāi)始寫了。這是我鞏固知識(shí)的一種方式?,F(xiàn)在我學(xué)到了什么,我就會(huì)把它寫下來(lái),這已經(jīng)變成我的慣例了。所以 Swift 出來(lái)的時(shí)候,這是一種很自然的延伸。而且由于 Swift 太新了,有很多地方值得寫,你會(huì)因?yàn)檎也坏酱鸢付兊煤茏タ瘛?/p>
你在 Swift 社區(qū)獲得的知名度改變了你什么嗎?
我只是接著做我一直以來(lái)在做的事情。我的確開(kāi)了一個(gè)技術(shù)周報(bào),但這也是我學(xué)習(xí)方式的一部分。要說(shuō)新的內(nèi)容話,我開(kāi)始做一些演講了。演講很有趣,也能很好的鞏固我的知識(shí)。因?yàn)楫?dāng)你需要教別人的時(shí)候,你需要真正了解你要講的東西。在 WatchKit 黑客馬拉松上,我們賭了一回,因?yàn)樗陌l(fā)布日期并不確定。到最后,我不得不在 3 天的時(shí)間內(nèi)學(xué)會(huì) WatchKit 并且教學(xué)。不過(guò)我很喜歡這種壓力,因?yàn)樗鼜?qiáng)迫我去學(xué)習(xí);反過(guò)來(lái),與 3 天成為 WatchKit 專家相比,如果只是自學(xué)的話,我可能會(huì)花費(fèi)更長(zhǎng)的一段時(shí)間,而且也不一定能學(xué)的更好。
現(xiàn)在,每個(gè)人都在學(xué) Swift,或許在未來(lái)的幾年內(nèi)會(huì)有確定的一些模式。你認(rèn)為我們還會(huì)像這樣保持社區(qū)的開(kāi)放嗎?
我開(kāi)始有種感覺(jué),Swift 會(huì)給我們更多的選擇以好的方式來(lái)解決特定的問(wèn)題。在 Objective-C 里,大部分方法方式都很清楚,但是 Swift 允許一些不同的風(fēng)格。希望這能夠讓大家學(xué)習(xí)不同的東西并保持思想的開(kāi)放。
今年就要馬上結(jié)束了,你有什么新年目標(biāo)或者具體的計(jì)劃嗎?
是的,我的確有個(gè)清單。它很大一部分是要保持健康。Swift 是如此的令人興奮,我一直在敦促自己并學(xué)習(xí)。但是我也希望自己能快點(diǎn)回歸到正常的睡眠周期。因?yàn)槲野l(fā)現(xiàn)如果你睡眠充足,實(shí)際上你能完成更多的目標(biāo),盡管很多時(shí)候這并不符合直覺(jué)。另一件主要的事情是花更多的時(shí)間來(lái)學(xué)習(xí)。Swift 引領(lǐng)我進(jìn)入了一個(gè)我想學(xué)習(xí)的新世界。以我現(xiàn)在的編程經(jīng)驗(yàn)肯定會(huì)錯(cuò)過(guò)一些內(nèi)容,所以我會(huì)專注這方面內(nèi)容的學(xué)習(xí),然后靈活運(yùn)用它們,寫出更好的代碼。
你有什么長(zhǎng)期的目標(biāo)嗎?
我并不喜歡想太長(zhǎng)遠(yuǎn),因?yàn)槭虑樽兓炝?。這有點(diǎn)像代碼:你不得不推倒重寫。對(duì)我來(lái)說(shuō),更重要的是每天能保持好的狀態(tài)而不是有一個(gè)大大的目標(biāo)。每天醒來(lái)我會(huì)問(wèn)自己,我開(kāi)心嗎?我知道哪些事情能讓我高興:比如學(xué)習(xí),保持健康,還有旅行。這些是以保持自我為中心的的三件大事。我覺(jué)得通過(guò)學(xué)習(xí)更多我還能收獲更多,或許一年后,我會(huì)專注在真正創(chuàng)造和發(fā)布一些東西。
你會(huì)預(yù)見(jiàn)自己會(huì)做一些和編程完全不同的事情嗎?
大概不會(huì),我真的很享受編程。也許 10 年之內(nèi)還會(huì)一直享受吧,誰(shuí)知道呢?我不知道我是否還能找到一個(gè)領(lǐng)域能讓我學(xué)無(wú)止境。我也一直對(duì)學(xué)習(xí)硬件的一些東西感興趣,不過(guò)我認(rèn)為我會(huì)和軟件一起來(lái)學(xué)習(xí)。只要我不斷的學(xué)習(xí)新的知識(shí),不斷挑戰(zhàn)自己,我很樂(lè)意繼續(xù)現(xiàn)在做的事情,稍微偏離一點(diǎn)我的舒適區(qū)會(huì)讓我很開(kāi)心。
當(dāng)你學(xué)習(xí) iOS 或者 Rails 的時(shí)候,有沒(méi)有一些人或者說(shuō)導(dǎo)師確實(shí)啟發(fā)了你?
我從和那些比我經(jīng)驗(yàn)豐富的人結(jié)對(duì)編程之中學(xué)到了很多。結(jié)對(duì)編程真的能加速學(xué)習(xí)過(guò)程。當(dāng)我遇到問(wèn)題或者 bug 的時(shí)候,我會(huì)為找到一個(gè)解決方案而高興不已。但是更資深的程序員會(huì)從不同的視角來(lái)看待它 -- 不僅僅要能解決問(wèn)題,從長(zhǎng)遠(yuǎn)來(lái)看它應(yīng)該也是一個(gè)好的解決方案。對(duì)于 Swift,我從社區(qū)里學(xué)到了很多,它太新了,所以我正在嘗試讀更多的書以及向那些比我優(yōu)秀的人學(xué)習(xí)。
當(dāng)你結(jié)對(duì)編程的時(shí)候,你有學(xué)到什么大的教訓(xùn)嗎,抑或是更多的小細(xì)節(jié)?
我很注重細(xì)節(jié),所以我喜歡學(xué)到的小細(xì)節(jié)或者小技巧。比如,我的同事告訴我在 XCode 中可以打開(kāi) Clang analyzer 來(lái)獲得更好的編譯警告信息。如果他不告訴我,我也不會(huì)知道,甚至也不會(huì)去 Google 這類事情。當(dāng)你結(jié)對(duì)編程的時(shí)候,你會(huì)學(xué)習(xí)到那些人們已經(jīng)習(xí)以為?;蛘哒J(rèn)為理所應(yīng)當(dāng)?shù)男〖?xì)節(jié)。事實(shí)上,我最受歡迎的一些博客文章大部分都是關(guān)于這類小細(xì)節(jié)的,盡管我最開(kāi)始假定是:除了我可能大家已經(jīng)都知道了。
至于說(shuō)大的事情,我在 Capital One 的一個(gè)同事向我展示了如何在真實(shí)環(huán)境下應(yīng)用 MVVM 這個(gè)設(shè)計(jì)模式。我聽(tīng)過(guò)這個(gè)術(shù)語(yǔ),也聽(tīng)說(shuō) Facebook 也在討論它,但是我并不確定它是如何工作的,在他的指導(dǎo)下我過(guò)了一遍一個(gè)實(shí)際的實(shí)現(xiàn),這真是太贊了?,F(xiàn)在我在不同的 App 里一直在使用 MVVM 模式。
還有什么你想分享給大家的嗎?
哈,成為一名 iOS 開(kāi)發(fā)者很有趣。對(duì)于那些正在思考是否要轉(zhuǎn) iOS 開(kāi)發(fā)的人,我想說(shuō)的是:這很有挑戰(zhàn),同時(shí)也會(huì)是一段令人興奮的旅程。
譯者的一些私貨:
最早是通過(guò) Google 知道她的博客的,一篇講解很清楚的關(guān)于
UIEdgeInSet
的文章,后來(lái)就訂閱了她博客的 RSS,也在 twitter 上 fo 了她,再后來(lái)就是 Swift 和 WatchKit 的文章了~。