鍍金池/ 教程/ iOS/ 讓東西變得不那么糟
與四軸無(wú)人機(jī)的通訊
在沙盒中編寫(xiě)腳本
結(jié)構(gòu)體和值類(lèi)型
深入理解 CocoaPods
UICollectionView + UIKit 力學(xué)
NSString 與 Unicode
代碼簽名探析
測(cè)試
架構(gòu)
第二期-并發(fā)編程
Metal
自定義控件
iOS 中的行為
行為驅(qū)動(dòng)開(kāi)發(fā)
Collection View 動(dòng)畫(huà)
截圖測(cè)試
MVVM 介紹
使 Mac 應(yīng)用數(shù)據(jù)腳本化
一個(gè)完整的 Core Data 應(yīng)用
插件
字符串
為 iOS 建立 Travis CI
先進(jìn)的自動(dòng)布局工具箱
動(dòng)畫(huà)
為 iOS 7 重新設(shè)計(jì) App
XPC
從 NSURLConnection 到 NSURLSession
Core Data 網(wǎng)絡(luò)應(yīng)用實(shí)例
GPU 加速下的圖像處理
自定義 Core Data 遷移
子類(lèi)
與調(diào)試器共舞 - LLDB 的華爾茲
圖片格式
并發(fā)編程:API 及挑戰(zhàn)
IP,TCP 和 HTTP
動(dòng)畫(huà)解釋
響應(yīng)式 Android 應(yīng)用
初識(shí) TextKit
客戶(hù)端
View-Layer 協(xié)作
回到 Mac
Android
Core Image 介紹
自定義 Formatters
Scene Kit
調(diào)試
項(xiàng)目介紹
Swift 的強(qiáng)大之處
測(cè)試并發(fā)程序
Android 通知中心
調(diào)試:案例學(xué)習(xí)
從 UIKit 到 AppKit
iOS 7 : 隱藏技巧和變通之道
安全
底層并發(fā) API
消息傳遞機(jī)制
更輕量的 View Controllers
用 SQLite 和 FMDB 替代 Core Data
字符串解析
終身學(xué)習(xí)的一代人
視頻
Playground 快速原型制作
Omni 內(nèi)部
同步數(shù)據(jù)
設(shè)計(jì)優(yōu)雅的移動(dòng)游戲
繪制像素到屏幕上
相機(jī)與照片
音頻 API 一覽
交互式動(dòng)畫(huà)
常見(jiàn)的后臺(tái)實(shí)踐
糟糕的測(cè)試
避免濫用單例
數(shù)據(jù)模型和模型對(duì)象
Core Data
字符串本地化
View Controller 轉(zhuǎn)場(chǎng)
照片框架
響應(yīng)式視圖
Square Register 中的擴(kuò)張
DTrace
基礎(chǔ)集合類(lèi)
視頻工具箱和硬件加速
字符串渲染
讓東西變得不那么糟
游戲中的多點(diǎn)互聯(lián)
iCloud 和 Core Data
Views
虛擬音域 - 聲音設(shè)計(jì)的藝術(shù)
導(dǎo)航應(yīng)用
線(xiàn)程安全類(lèi)的設(shè)計(jì)
置換測(cè)試: Mock, Stub 和其他
Build 工具
KVC 和 KVO
Core Image 和視頻
Android Intents
在 iOS 上捕獲視頻
四軸無(wú)人機(jī)項(xiàng)目
Mach-O 可執(zhí)行文件
UI 測(cè)試
值對(duì)象
活動(dòng)追蹤
依賴(lài)注入
Swift
項(xiàng)目管理
整潔的 Table View 代碼
Swift 方法的多面性
為什么今天安全仍然重要
Core Data 概述
Foundation
Swift 的函數(shù)式 API
iOS 7 的多任務(wù)
自定義 Collection View 布局
測(cè)試 View Controllers
訪談
收據(jù)驗(yàn)證
數(shù)據(jù)同步
自定義 ViewController 容器轉(zhuǎn)場(chǎng)
游戲
調(diào)試核對(duì)清單
View Controller 容器
學(xué)無(wú)止境
XCTest 測(cè)試實(shí)戰(zhàn)
iOS 7
Layer 中自定義屬性的動(dòng)畫(huà)
第一期-更輕量的 View Controllers
精通 iCloud 文檔存儲(chǔ)
代碼審查的藝術(shù):Dropbox 的故事
GPU 加速下的圖像視覺(jué)
Artsy
照片擴(kuò)展
理解 Scroll Views
使用 VIPER 構(gòu)建 iOS 應(yīng)用
Android 中的 SQLite 數(shù)據(jù)庫(kù)支持
Fetch 請(qǐng)求
導(dǎo)入大數(shù)據(jù)集
iOS 開(kāi)發(fā)者的 Android 第一課
iOS 上的相機(jī)捕捉
語(yǔ)言標(biāo)簽
同步案例學(xué)習(xí)
依賴(lài)注入和注解,為什么 Java 比你想象的要好
編譯器
基于 OpenCV 的人臉識(shí)別
玩轉(zhuǎn)字符串
相機(jī)工作原理
Build 過(guò)程

讓東西變得不那么糟

讓東西不那么糟

被訪者簡(jiǎn)介:Loren Brichter 是 App Store 的明星加傳奇開(kāi)發(fā)者之一,曾經(jīng)開(kāi)發(fā)了 Letterpress?霸占?xì)W美排行榜首位很長(zhǎng)時(shí)間的游戲。其實(shí) Loren 之前曾經(jīng)在 Apple 任職,擔(dān)任 iOS 圖像方面的開(kāi)發(fā)工作。之后他從 Apple 離職創(chuàng)業(yè),最后成功被 Twitter 并購(gòu)。2012 年 Loren 離開(kāi) Twitter 再次創(chuàng)業(yè),也正是在這之后 Letterpress?橫空出世。

Loren,感謝你特地在假期中抽空參加我們的訪談。這幾天都在忙什么呢?

我整個(gè)假期一直都很忙,大部分時(shí)候都在處理家里的事務(wù)。現(xiàn)在我終于能回到真正的工作中了。

你當(dāng)前的工作是什么?

我現(xiàn)在還不能透露任何細(xì)節(jié),不過(guò)我已經(jīng)做了一陣子底層的實(shí)驗(yàn)了,一些事情已經(jīng)有了眉目。能回到以前的狀態(tài)非常棒,這能在沒(méi)有發(fā)布期限壓力的情況下反映出我現(xiàn)在到底在干什么。

在你走上編程之路之前,是否有其他職業(yè)也讓你產(chǎn)生了強(qiáng)烈的興趣?

我肯定會(huì)選建筑師、機(jī)械工程師、木匠或者攝影師。最近我正逐漸減少花在這些閃閃發(fā)亮的電子設(shè)備上的時(shí)間,這的確很難,因?yàn)樗鼈兒苋菀拙臀宋业囊暰€(xiàn)。

從木匠到攝影師 -- 這跨度真大!面對(duì)這么多的選擇,是什么讓你堅(jiān)持編程?

純粹是因?yàn)閼T性。我適合編程,希望能找到一個(gè)方式,用我的技能來(lái)做些對(duì)大家有益的事情。

你事業(yè)上做過(guò)哪些不起眼的決定?

我覺(jué)得那些對(duì)我很重要的決定反而在其他人眼里并不起眼,比如為了做一些瘋狂的嘗試,多次放棄穩(wěn)定高薪的工作。幸運(yùn)的是其中的有些事情結(jié)果還不錯(cuò)。如果我今天再去做,也許就達(dá)不到相同的結(jié)果。

除了慣性,還有什么其他吸引你的東西讓你堅(jiān)持編程嗎?

老實(shí)說(shuō),編程對(duì)我的吸引力越來(lái)越小了。或許這因?yàn)槲沂恰案啐g工程師”的緣故,我了解的越多,就越感到編程的可怕。我喜歡推倒一切重新開(kāi)始,但現(xiàn)在卻只能逆著浪潮游泳。因此有時(shí)我會(huì)嘗試剔除掉垃圾或者重新定位那些糟糕的技術(shù),來(lái)讓一切變得不那么糟糕時(shí)會(huì)讓我有點(diǎn)滿(mǎn)足感。

隨著編程興趣的下降,你將來(lái)可能涉足完全不同的行業(yè)嗎?

我將一直會(huì)做和編程有關(guān)的事情,不過(guò)這些事情里軟件也許只占一小部分,并不會(huì)成為主導(dǎo)。

既然你還不準(zhǔn)備跳船改行,那我們來(lái)談?wù)劸幊汤锬切┰愀獾牡胤桨伞?/strong>

跟能被修補(bǔ)的船不一樣,這更像是乘著一堆積攢下來(lái)的垃圾進(jìn)行越洋航行。當(dāng)然,總有些東西浮著來(lái)避免其他東西下沉。因此問(wèn)題換成“哪個(gè)部分是好的?”可能更加合適些。而你也只能將各個(gè)組件分離看待才能回答這個(gè)問(wèn)題。比如我就覺(jué)得 Rust 語(yǔ)言不錯(cuò)。但一旦供奉了馮諾依曼的理念,你就能爬下堆棧去質(zhì)疑一切,這也是不切實(shí)際的。

你認(rèn)為這一切都會(huì)朝什么方向發(fā)展?會(huì)變得更好嗎?

我認(rèn)為事情最終都會(huì)變得更好。然后再次變?cè)恪H缓笥钟腥伺軄?lái)感嘆說(shuō)“噢!真是太亂了!”接著他們就會(huì)做一些事情來(lái)讓情況變得好些。然后循環(huán)再次開(kāi)始。因此這就很容易產(chǎn)生抱怨:為什么我一直忙于我已經(jīng)做過(guò)的工作。

當(dāng)你試圖讓一切變得“不那么糟糕”時(shí),腦海里有過(guò)更大的目標(biāo),來(lái)指引你決定的方向嗎?你為什么要做這一切?

當(dāng)然有,但它是如此抽象,以至于人們會(huì)認(rèn)為我瘋了。因此對(duì)于目標(biāo),我只想說(shuō)“創(chuàng)造啟迪人類(lèi)的工具”。我指的“啟迪”是 Carl Sagan 認(rèn)為的那種我們即宇宙,并在試圖了解自己的啟迪。我們很早就達(dá)到了只用大腦所能思考的極限,因此我們需要通過(guò)增加心靈溝通的方式來(lái)提升它。但現(xiàn)在的工具都太復(fù)雜,光嘗試著去使用它們就得耗盡你所有的心力,因此你都沒(méi)有余力來(lái)做一些有趣的事情?;蛘哒f(shuō)至少它們對(duì)我來(lái)說(shuō)太復(fù)雜了。我沒(méi)有那么聰明。

就我個(gè)人而言,我厭煩瑣碎的應(yīng)用程序,而 App Store 并沒(méi)有讓一切變得更有趣。我認(rèn)為下一個(gè)發(fā)生在軟件業(yè)的大事件將跳出這個(gè)圈子。

說(shuō)到軟件業(yè)的下一個(gè)大事件,現(xiàn)在有什么真正有趣的發(fā)展嗎?

當(dāng)然有。有許多希望的曙光:Rust、Swift、TypeScript、asm.js、WebGL的廣泛支持 -- 狹義地來(lái)看這些都很有趣。

Swift 的哪些方面吸引了你?

它有現(xiàn)代的類(lèi)型系統(tǒng),這很棒。(當(dāng)然當(dāng)它完成后會(huì)更棒) 另外我認(rèn)為自定義操作符非常可愛(ài),我希望它們能在 Swift 中出現(xiàn)。

你已經(jīng)將 Swift 用在日常工作中了嗎?

我還沒(méi)有用它來(lái)實(shí)現(xiàn)任何東西:Swift 的各種工具還十分脆弱。而且在它開(kāi)源或者代碼能被克隆之前,除非它不再和蘋(píng)果綁定,我都不會(huì)真正使用它。你看,至少現(xiàn)在我在 Linux 上都能編譯 Objective-C。

你剛剛說(shuō)你在屏幕上花費(fèi)的時(shí)間越來(lái)越少了。我能想象為人父是主要原因。

當(dāng)然。我將要瘋狂地限制在屏幕上花費(fèi)的時(shí)間,這對(duì)于我之前的生活也許是個(gè)諷刺。我也不知道這是怎么發(fā)生的,但是我對(duì)移動(dòng)革命的理解加深了。以前我看到別人拿出 iPhone 時(shí)非常激動(dòng)。現(xiàn)在卻變成“嘿小子,別再盯著你的屏幕!”并且我發(fā)現(xiàn)應(yīng)用程序無(wú)處不在!各種應(yīng)用應(yīng)有盡有。我已經(jīng)成為一個(gè)老頑固。把你的應(yīng)用程序從我的地盤(pán)上拿開(kāi)!

我想我們中有很多人能從限制接觸屏幕的時(shí)間中受益 -- 你想借此機(jī)會(huì)做一個(gè)公開(kāi)的承諾嗎?

哈哈,不行。

好吧。能多透露一些你的工作嗎?你主要是在家工作對(duì)吧?

是的,每次我試圖不在家里工作的時(shí)候,都苦不堪言。我喜歡在家工作。

你是如何規(guī)劃你的一天 -- 你是按照固定的時(shí)間表工作還是靈活地處理事情?

少年,帶孩子這事兒打亂了我的工作日程。我保持了一貫的節(jié)奏,之前我毫不分心地工作到凌晨,然后入睡。而現(xiàn)在我必須在合適的時(shí)間入睡,這樣我小孩早上起床時(shí)我才會(huì)不像個(gè)僵尸。我感覺(jué)我已經(jīng)慢慢地適應(yīng)這種狀況,但是,實(shí)際比想象地更困難。

大部分情況下同一時(shí)間你是只專(zhuān)注于一個(gè)項(xiàng)目還是多個(gè)任務(wù)同時(shí)進(jìn)行?

我的工作日程是互相關(guān)聯(lián)的單線(xiàn)程序列,環(huán)境的切換需要巨大的成本,因此我盡量將時(shí)間片的跨度維持在一周。雖然我有許多項(xiàng)目需要同時(shí)進(jìn)行,并且通常它們彼此之間都存在某種方式的聯(lián)系,但我堅(jiān)持同一時(shí)間只關(guān)注一個(gè)項(xiàng)目。

我完全不能主動(dòng)地進(jìn)行多任務(wù),但是我認(rèn)為我大腦的工作原理有點(diǎn)像 libdispatch。潛意識(shí)可以并行地偷偷執(zhí)行許多東西。所以當(dāng)我清醒的思維切換到之前放到一邊的工作時(shí),經(jīng)常會(huì)有好幾個(gè)好主意等著我。

你的出名之處在于能一人完成偉大的應(yīng)用,并且能整合以往需要不同的人才能完成的任務(wù)。同在團(tuán)隊(duì)中工作相比,這種工作方式在哪方面吸引你呢?

我們用學(xué)科之間的界限來(lái)劃分工作領(lǐng)域,而你們用同樣的方式將程序劃分成了不同模塊、不同對(duì)象或者其他。但無(wú)論何時(shí)你將事物分成兩份,碎片之間難免會(huì)出現(xiàn)分歧,而且當(dāng)你想把各個(gè)碎片拼在一起來(lái)建造東西的時(shí)候,一切就會(huì)變得更難。我發(fā)現(xiàn)過(guò)了一段時(shí)間后,實(shí)際上你在“膠水”上所花的時(shí)間要比處理實(shí)際事物本身、處理不協(xié)調(diào)的阻力以及其他事情都多 (無(wú)論是在架構(gòu)、工程還是在人際交往的水平上,都存在這樣的問(wèn)題)。因此我的小計(jì)策是盡量用更全局的方式來(lái)構(gòu)建事物。這實(shí)際上沒(méi)有增加多少工作,因?yàn)槲抑恍枰冉⒋_定的部分,就像你知道的那樣,先做出一些事情,于是就有了粘合在一起所需要的最小組件。

但是很明顯,你一個(gè)人可以做出來(lái)的事情是有限的。有些項(xiàng)目就是需要更多人才能完成...

沒(méi)錯(cuò),不過(guò)我認(rèn)為個(gè)人的上限遠(yuǎn)比人們想象的要高。歷史上一些了不起的東西都是由個(gè)人完成的 -- 關(guān)鍵是要站在正確的肩膀上。可以肯定的是,我一個(gè)人所能探索的創(chuàng)意空間肯定比我在大規(guī)模團(tuán)隊(duì)工作時(shí)要小,雖然前者永遠(yuǎn)都小于后者,但是它們其實(shí)都是無(wú)限大的。對(duì)我個(gè)人而言,這個(gè)權(quán)衡是值得的。

你認(rèn)為通過(guò)良好的管理,團(tuán)隊(duì)能最小化你所說(shuō)的阻力嗎?

我不確定。我知道組織中壞的代碼架構(gòu)和個(gè)人水平之間沒(méi)有關(guān)系,就像工程師可以以整體的方式建立項(xiàng)目一樣,一個(gè)好的項(xiàng)目經(jīng)理只要了解每個(gè)人并且知道他們將要面對(duì)的問(wèn)題,也可以以整體的方式組織一個(gè)團(tuán)隊(duì)。我沒(méi)有這樣的能力,不過(guò)我并不認(rèn)為這影響某些神奇的例子的存在。如果過(guò)去幾年我真的收獲到了什么智慧,那就是我努力試圖了解 -- 那種真正的了解 -- 了自己在做什么。這很困難,但是長(zhǎng)遠(yuǎn)來(lái)看這會(huì)簡(jiǎn)單一些。

那么當(dāng)你以整體的方式來(lái)進(jìn)行一個(gè)項(xiàng)目時(shí),在制作原型和開(kāi)發(fā)實(shí)際產(chǎn)品之間還會(huì)有明顯的界限嗎?還是說(shuō)你已經(jīng)將兩件事合在一起做了?

它們被完全融合了,這意味著我通常都在代碼中完成我的原型,而不是使用其他原型工具,例如 Quartz Composer 或者 Form。很顯然,這些工具的下一個(gè)發(fā)展階段就是要拋掉原型工具的帽子,直接創(chuàng)造出最終產(chǎn)品。

原型階段與在最終產(chǎn)品的實(shí)現(xiàn)這兩者,時(shí)間上是怎樣分配的呢?

在我找到想要的東西 (或者時(shí)間耗盡) 之前,無(wú)論已經(jīng)完成了多少工作,我認(rèn)為我的產(chǎn)品 100% 是原型,然而在那之后,我就可以叫它最終產(chǎn)品了。雖然我還有退回去處理失敗方案的殘骸,整理一下工程,不過(guò)這也不會(huì)花太多時(shí)間。

我猜你的界面設(shè)計(jì)和開(kāi)發(fā)過(guò)程之間也有非常多的交錯(cuò)?

完全正確,既然界面設(shè)計(jì)和原型是一回事兒,那在開(kāi)發(fā)最終產(chǎn)品時(shí)就已經(jīng)完成了。再一次愉快地說(shuō),我完成了。

在這個(gè)過(guò)程中,你是腦海中現(xiàn)有確定的想法再開(kāi)發(fā)呢,還是跟著開(kāi)發(fā)時(shí)所產(chǎn)生靈感流來(lái)做產(chǎn)品?

最近產(chǎn)生了一個(gè)奇怪的組合。我已經(jīng)在腦海里確定了產(chǎn)品的目標(biāo) (否則這個(gè)項(xiàng)目將以長(zhǎng)草結(jié)束),但是那些已經(jīng)確定的東西在我編碼的過(guò)程中又會(huì)變得抽象起來(lái)。而我所做的越多,我就越能發(fā)現(xiàn)我所做的產(chǎn)品并沒(méi)有不同 -- 或者至少不應(yīng)該 -- 是不同的產(chǎn)品。這就像是把一個(gè)巨大構(gòu)想的每一個(gè)塊拆解下來(lái)推入一個(gè)垂直發(fā)射井。我思考的越多,就越覺(jué)得“應(yīng)用程序”是一種很糟糕的組織軟件的方式。

你在應(yīng)用開(kāi)發(fā)行業(yè)已經(jīng)很長(zhǎng)時(shí)間,并且取得了巨大的成就。那么這些年你是怎么堅(jiān)持學(xué)習(xí)的呢?

要記住,基本上沒(méi)有人能無(wú)所不知。因此在極度的混亂和可怕的敬畏之間,我的大腦處在一種很好的模糊狀態(tài),這使得它能很好的接受和吸收事物。我學(xué)習(xí)主要是通過(guò)紙質(zhì)書(shū)籍。

在你說(shuō)的紙質(zhì)書(shū)里,你最喜歡的是哪些?

有些就在我旁邊的架子上:《C 程序設(shè)計(jì)語(yǔ)言》(The C Programming Language),《Mindstorms》,《Turtle Geometry》,《安德的游戲》(Ender’s Game),《Schild’s Ladder》,《Advanced Global Illumination》,《The Theoretical Minimum》,《Collective Electrodynamics》,《New Kind of Science》。

你有什么建議要對(duì)軟件行業(yè)的新人說(shuō)嗎?

請(qǐng)記住,魔法并不存在。盡管看上去你的工作基于一堆無(wú)法理解的抽象事物,但它們終究還是由人制作的 (他們也許又倉(cāng)促還喝醉了呢)。掌握它們的工作原理,然后再找到如何才能最大限度地減少對(duì)它們的依賴(lài)。

回顧你所創(chuàng)建的所有東西,有那件是你特別自豪的?

沒(méi)有?,F(xiàn)在回想起來(lái),我覺(jué)得我做的一切都糟透了。

好吧,讓我們以一個(gè)更積極的話(huà)題來(lái)結(jié)尾吧:當(dāng)你想把工作從腦子里趕走時(shí)會(huì)怎么做?

陪我兒子玩耍。這是最好的方法。