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

終身學(xué)習(xí)的一代人

終身學(xué)習(xí)的一代人

被訪者簡介:Andy Matuschak,現(xiàn)就職于知名在線教育網(wǎng)站 Khan Academy 領(lǐng)導(dǎo)其移動(dòng)開發(fā)團(tuán)隊(duì)。在之前他擔(dān)任了 iOS 4.1 至 8 的 UIKit 的開發(fā)和維護(hù)工作。同時(shí) Andy 也是 Mac 知名框架 Sparkle 的創(chuàng)建者??梢哉f無論是 iOS 開發(fā)者還是 Mac 開發(fā)者,我們其實(shí)每天都在使用著 Andy 所開發(fā)的東西。

Andy,謝謝你抽空接受采訪。可以跟我們談?wù)勀闶侨绾伍_始編程的嗎?

我想應(yīng)該跟很多人一樣是從游戲開始的。小時(shí)候有段時(shí)間,家里是不允許我玩游戲機(jī)的,于是我就經(jīng)常去公共圖書館。在我九歲的時(shí)候,我發(fā)現(xiàn)那些我以為是教編程的書其實(shí)只是羅列了基本的源碼。還有一些講游戲設(shè)計(jì)的書整本都是源碼。于是當(dāng)我想玩游戲的時(shí)候就把這些源碼輸入計(jì)算機(jī),但又常常半路遇到語法錯(cuò)誤,而我當(dāng)時(shí)還不能理解這些錯(cuò)誤信息,也不知道如何解決。所以我不得不重來一遍,直到我終于可以玩這個(gè)游戲,如此反復(fù)之后我意識(shí)到我可以修改這個(gè)游戲,而從那以后就一發(fā)不可收拾了。我學(xué)了 C++ -- 那時(shí)我大概 10 歲 -- 因?yàn)槿藗兪怯盟鼘懹螒虻?,我試圖寫過一個(gè) MUD 游戲 -- 那是我第一個(gè)大項(xiàng)目,還進(jìn)行的不錯(cuò)...

你完成它了嗎?

單人模式下所有功能都可以很正常的運(yùn)行,但多玩家的模式?jīng)]有完成 -- 所以我想答案應(yīng)該是沒有吧。因?yàn)楹髞砦肄D(zhuǎn)移注意力到圖形方向去了,開始迷戀上 GL 和 3D 渲染之類的事情。

然后你就繼續(xù)做游戲?

我做了一陣游戲引擎之類的東西,看了所有 OpenGL 的教程,什么旋轉(zhuǎn)的方塊啊,顆粒引擎啊這些東西,然后我開始做真正的游戲。在那個(gè)時(shí)候,對一個(gè) 13 歲的我來說,那真是繁復(fù)的工作。我發(fā)現(xiàn)沒有足夠好的圖形工具來顯示游戲內(nèi)容。于是,我跟我的室友開始做一個(gè)像素編輯器。我們把它叫做 Pixen。那是我第一次接觸 Cocoa,還是開源的。當(dāng)我們發(fā)布 1.0 版本的時(shí)候,我當(dāng)時(shí)大概 14 歲吧,我們?nèi)ベ徫镏行睦锩嫣O果商店的 OS X Panther (還是 Jaguar?) 的發(fā)布會(huì)。那個(gè)時(shí)候他們就開始搞發(fā)布會(huì)了!我們想贈(zèng)送我們那個(gè)像素編輯器的 CD。

是不是有其他的什么可能你就不會(huì)成為一個(gè)程序員了?你當(dāng)時(shí)還對其他什么特別感興趣嗎?

我當(dāng)時(shí)的理想就是成為某種工程師。我當(dāng)時(shí)對電氣工程,或者甚至是高中的那些化學(xué)小實(shí)驗(yàn)的理工科挺著迷的,所以當(dāng)時(shí)是想成為這些工程師中的一種,而軟件工程是我當(dāng)時(shí)真正可以著手做的。當(dāng)時(shí)我把這稱為編程,而不是軟件工程,于是有些人告訴我:“不對不對,你應(yīng)該叫它計(jì)算機(jī)科學(xué)!”當(dāng)然,在當(dāng)時(shí),我并不明白在計(jì)算機(jī)科學(xué),軟件工程和編程當(dāng)中暗流洶涌的文化差異,我只覺得它們是很有用的清晰的術(shù)語。但其實(shí)我們常常把它們用錯(cuò)了。

好勒。那你現(xiàn)在基本上就是軟件工程師了?

我肯定不是計(jì)算機(jī)科學(xué)家,雖然我是學(xué)這個(gè)的。我覺得我差不多算是軟件工程師,一個(gè)深受計(jì)算機(jī)科學(xué)影響的軟件工程師。不過我最近會(huì)花大概一半時(shí)間做一些兒童教育方面的研究,讀論文和書籍,分析設(shè)想,我們希望能在這個(gè)方向略盡綿力。

離開 Apple 去 Khan Academy,幫助人們學(xué)習(xí)和教育,看起來是個(gè)不小的跨越。這是怎么發(fā)生的呢?是什么促動(dòng)你的?

這個(gè), 我想我可以從其他一些事來回答這個(gè)問題... 我之前去加州理工學(xué)習(xí)過一段時(shí)間,這所學(xué)院支持了大量自然科學(xué)的項(xiàng)目,諸如 NASA 和 DARPA,所以當(dāng)時(shí)的討論都集中在人性化影響上。當(dāng)時(shí)有一個(gè) NASA 的人過來對我們說:“好了,你們是最優(yōu)秀的,而你們即將在世界上最好的研究學(xué)院之一學(xué)習(xí),你們將擁有無數(shù)可能。這對你是無限機(jī)遇,而你們也應(yīng)當(dāng)把握這樣的機(jī)遇,將它們利用來做些真正有意義的事情?!?/p>

當(dāng)我來到更廣闊的軟件社區(qū)里時(shí),我是少數(shù)的幾個(gè)畢業(yè)之后沒有去做研究的人之一。剛畢業(yè)的時(shí)候我希望能做一些事情,但我對大多數(shù)商業(yè)軟件工程和軟件銷售的能產(chǎn)生的影響和追求的目標(biāo)感到失望,于是我冥思苦想到底可以在哪個(gè)領(lǐng)域發(fā)揮我的專長, 而最先踏出的第一步最終決定了我的方向。我深受物理學(xué)家 David Deutsch 的影響,通過他我確認(rèn)了我想要走的方向,那就是擴(kuò)展人類知識(shí)和能力范圍,繼而我就開始思考怎樣才可以做到。

如果人類能活得更久一些,那我們就能在知識(shí)能力上走得更遠(yuǎn),所以在生物技術(shù)和化學(xué)工程會(huì)有很多的機(jī)遇。如果人類有更好的工具進(jìn)行試驗(yàn),也能更進(jìn)一步,所以在工具制造,綜合工具,虛擬現(xiàn)實(shí),或者是接下去的人工智能領(lǐng)域也都有很多的機(jī)會(huì)。但基于我的背景和機(jī)遇,我最終決定在教育方面做一些貢獻(xiàn),我認(rèn)為這將會(huì)是更好的選擇。因?yàn)槿绻铱梢詣?chuàng)造終身學(xué)習(xí)的一代人,那么我們將有更多的人來解決這些問題。

那么你是想為后代打造一些幫助學(xué)習(xí)的工具以便于他們解決更艱難的問題?

是的,那是我的期望。學(xué)習(xí)的一大挑戰(zhàn)就是元學(xué)習(xí) (meta learning,即“學(xué)習(xí)如何學(xué)習(xí)”)。這是一種可以不必摧毀自信或摧毀學(xué)習(xí)態(tài)度的學(xué)習(xí)方式。如果我開發(fā)的這些工具不但可以讓畢業(yè)生得到相同成績,并且他們最終不但對數(shù)學(xué)有更好的認(rèn)知而且會(huì)更傾向于在之后的生活中學(xué)習(xí)數(shù)學(xué),那我就達(dá)到目標(biāo)了。

看起來很顯然你并不滿意我們已有的教育?你可以詳細(xì)談?wù)剢幔?/strong>

是的,它還不夠好,并且在很多方面都不夠好。最缺乏的是沒有讓學(xué)生得到剛才我說到的那些機(jī)遇和資源,我覺得那是最重要并且最首要需要改善的事情。所以這就是為什么現(xiàn)在的任務(wù)是給所有人提供免費(fèi)教育,而 Khan Academy 的使命是為大家提供世界一流的免費(fèi)教育。所以現(xiàn)在我們會(huì)先將重點(diǎn)集中在為大家提供免費(fèi)教育上面,接下來會(huì)是世界一流的免費(fèi)教育。但那是后續(xù)的事了,因?yàn)槲覍ΜF(xiàn)在所謂的世界一流還有些懷疑和考慮。

我有很多同學(xué)接受了最好的付費(fèi)教育,由諾貝爾獲獎(jiǎng)?wù)呤谡n。盡管如此,他們的學(xué)習(xí)態(tài)度卻很糟,認(rèn)為一畢業(yè)就算完。他們只想結(jié)束這一切然后去找份穩(wěn)定的工作,放空大腦,因?yàn)樗麄円呀?jīng)被系統(tǒng)和制度打倒,而好奇心跟智慧也已經(jīng)枯竭。

聽上去真讓人沮喪...

是啊。如果你問人們你覺得數(shù)學(xué)怎么樣,大多數(shù)人都會(huì)回答說:“哦,數(shù)學(xué)很無聊。”或者“我數(shù)學(xué)不好,我不太適合學(xué)數(shù)學(xué)?!薄H绻銌査麄儗茖W(xué)的態(tài)度,答案也類似。但如果問到文學(xué),或許他們會(huì)談?wù)撘恍┧麄冏x過的書籍里的有趣橋段,但那也只是他們學(xué)生時(shí)代讀過的罷了,現(xiàn)在已經(jīng)停止閱讀了。所以我最期望影響的是改變?nèi)藗冋J(rèn)為教育隨著大學(xué)畢業(yè)一并終止了這一認(rèn)知。而這其實(shí)并不是一個(gè)技術(shù)上的問題,所以我對給我自己貼上“軟件工程師”的標(biāo)簽有些顧慮。雖然我大部分的經(jīng)驗(yàn)與之相關(guān),但我的目標(biāo)是卻不是這個(gè)方向。

既然你現(xiàn)在在終身學(xué)習(xí)上面有這樣一個(gè)大計(jì)劃,那你對你十年后的愿景是怎樣的呢?你期望達(dá)到什么目標(biāo)?

眼下,學(xué)習(xí)的標(biāo)準(zhǔn)含義已經(jīng)被普遍認(rèn)可。不論是讀教課書,看一個(gè)視頻還是聽一個(gè)演講,你都是被動(dòng)的吸收知識(shí)。你只用坐在那接收,或許如果你比較有錢的話還可以在之后有個(gè)對話交流之類的。但當(dāng)你畢業(yè)之后,你必須自己去創(chuàng)造這樣的學(xué)習(xí)環(huán)境。我對所謂的構(gòu)建式學(xué)習(xí)環(huán)境 (constructivist learning environments) 很感興趣。這是一位幾十年前的學(xué)習(xí)研究者 Papert 創(chuàng)造的術(shù)語。在構(gòu)建式學(xué)習(xí)環(huán)境下,學(xué)生由被動(dòng)的從教科書里學(xué)習(xí)轉(zhuǎn)變成自主的創(chuàng)造知識(shí)。在這樣的模式下,會(huì)更像是創(chuàng)造了一種環(huán)境,讓你在這樣的氛圍中積極主動(dòng)的理解事物繼而掌握它們。

Papert 的研究里有一個(gè)例子,他嘗試用 Logo 來教學(xué)生抽象及程序性思維,而不是編程本身。 他甚至有一個(gè)教室里掛了一個(gè) Logo 的海龜?shù)臉?biāo)志。那時(shí)候還有一種機(jī)械海龜,可以在真的紙上作畫。這個(gè)教室四周掛滿了畫,有些是源代碼生成的,有些不是。這些畫作會(huì)隨著一批批的學(xué)生換掉,因?yàn)楸热缬行W(xué)生會(huì)看到一朵花然后說:“哦,我喜歡那個(gè)圖,能給我嗎?”然后教師會(huì)說:“當(dāng)然可以,不過你必須輸入這些代碼,海龜會(huì)按代碼畫出這個(gè)圖。”接著學(xué)生會(huì)說:“好的?!比缓箝_始畫畫。之后他或許又看上其他畫作,但那些并沒有源代碼,于是他就得自己想辦法。

教室里這些沒有源碼畫作是被設(shè)計(jì)出來的,需要學(xué)生理解原理后制作出來。創(chuàng)造性環(huán)境就這樣塑造出來了。我正在研究這個(gè)很可能會(huì)被研究很多年的假說,首先是允許人們自助的構(gòu)建知識(shí),那么將很可能得到同樣的學(xué)習(xí)效果,當(dāng)然如果達(dá)到這一結(jié)果我會(huì)非常高興,不僅如此,他們還會(huì)在自我認(rèn)知,學(xué)習(xí)態(tài)度和學(xué)習(xí)興趣上都比其他同學(xué)高出不少。

除了用構(gòu)建式方式鼓勵(lì)人們更主動(dòng)的學(xué)習(xí)之外,另一個(gè)相比你在 Khan Academy 做的和更傳統(tǒng)的教育方式之間的主要區(qū)別是更自由地選擇想學(xué)習(xí)什么以及什么時(shí)候?qū)W習(xí)。那么你覺得這個(gè)改變有什么影響呢?

另外有一個(gè)兒童教育研究者 Piaget 對此有很多的研究成果。他認(rèn)為對青年一代的開發(fā)當(dāng)中最重要的事情之一是對自主性的訓(xùn)練。而這里的自主性比我們平時(shí)認(rèn)為的自主性還要更寬范一些。不是“我可以隨便的玩”這樣的自主性,而是“我正在對我生活中所有的的事情做決定”。這跟其他人來告訴你要怎么分配你的時(shí)間或訴諸權(quán)威是相抵觸的。比如說,常規(guī)性的回答 “Bobby 在玩游戲的時(shí)候作弊了” 這樣的問題,會(huì)是 “哦,我去找他談?wù)劇?。與之相反的,如果是自主性的回答將會(huì)是 “那么你是怎么跟 Bobby 說的?”。我認(rèn)為自主性的訓(xùn)練在各方面都是非常重要的。有些研究認(rèn)為這會(huì)在短期內(nèi)得到更好的效果,但我認(rèn)為從長期來說也會(huì)引導(dǎo)出更善于思考的人。

我對那種一整天的日程都被別人安排的情況很質(zhì)疑。我認(rèn)為如果一個(gè)導(dǎo)師以日復(fù)一日的調(diào)整學(xué)生的學(xué)習(xí)環(huán)境來達(dá)到修正學(xué)生學(xué)習(xí)進(jìn)程的方式會(huì)是更積極的。確切一點(diǎn),舉個(gè)例子,比方說與其一次性給學(xué)生全部人類知識(shí)的目錄,并且把每個(gè)知識(shí)點(diǎn)都按重要程度分類,我認(rèn)為更好的方式是把所有的知識(shí)都看成是書架上的書,然后按難易程度由低到高的擺放。

那么在 Apple 有沒有什么很讓你懷念的呢?

當(dāng)然,我懷念那兒的人,這太重要了。事實(shí)上這正是我對這個(gè)行業(yè)感到一些失望的地方。有這么多優(yōu)秀的人被局限在這些巨型公司里,他們只是偶爾被善加利用,但更經(jīng)常的情況下他們只是一臺(tái)機(jī)器的零件,但以他們的智慧其實(shí)可以做更大更影響深遠(yuǎn)的貢獻(xiàn)。我并不是說一定要來我這個(gè)項(xiàng)目,我是指更廣泛的情況。讓我覺得有點(diǎn)傷感的不僅僅情感上的想念,我更懷念的是諸如當(dāng)時(shí)在 NeXT 和那些非常有經(jīng)驗(yàn)的人進(jìn)行的非常有激發(fā)性的談話。我仍然希望他們可以發(fā)揮更大的影響力。

可以多分享一下在 Apple 的時(shí)光嗎?開發(fā)一個(gè)被如此多人使用的框架是個(gè)什么體驗(yàn)?而你又是怎么從做游戲一步步達(dá)到的?

填補(bǔ)這中間的鴻溝的一件事是當(dāng)我 16 歲的時(shí)候,我寫了一個(gè)叫 Sparkle 的框架。它讓我認(rèn)識(shí)到了到了一些框架開發(fā)的現(xiàn)實(shí),比如說你要修改大家正在用的 API,他們就會(huì)非常生氣。這是框架開發(fā)的基本現(xiàn)實(shí)之一,但老實(shí)說其實(shí)我在到 Apple 之前并不知道我當(dāng)時(shí)在干嘛。我完成了學(xué)業(yè),我有了更大的雄心,而 Apple 看起來是個(gè)非常好的學(xué)習(xí)地點(diǎn),事實(shí)上也是。其實(shí)現(xiàn)在也仍然是,所以我還是會(huì)跟那些跟我當(dāng)時(shí)抱一樣想法的人提出相同的建議。跟我共事的團(tuán)隊(duì)是開發(fā)了這個(gè)體系超過十年的人們,而我差不多是當(dāng)中墊底的。于是我被迫非??焖俚膶W(xué)習(xí)和理解許多設(shè)計(jì)這種規(guī)模框架所需的獨(dú)特的角度。尤其是考慮框架的二進(jìn)制兼容(binary compatibility)問題,而 Sparkle 并沒有考慮過。幸運(yùn)的是,我周圍的人都非??犊母冻鏊麄兊臅r(shí)間和精力幫助我進(jìn)步。在犯了很多很多錯(cuò)誤之后,我終于意識(shí)到我都干了些什么蠢事兒,而當(dāng)我?guī)啄旰箅x開,之后大概再也用不到那些技術(shù)。

開發(fā)這樣大型規(guī)模的框架里面最讓你吃驚的是什么

我認(rèn)為二進(jìn)制兼容是最讓我吃驚的事情。我當(dāng)時(shí)并不理解當(dāng)中的困難和復(fù)雜。想象一下這類的 bug 吧:在 iOS 8 里按鈕是白色背景,但在 iOS 7 里面卻是透明的。iOS 8 還沒有發(fā)布,所以這肯定是我們自己的問題。于是你開始一點(diǎn)點(diǎn)鉆研,發(fā)現(xiàn)可能在 iOS 7 里調(diào)用的一個(gè)方法是控制這個(gè)的,但這個(gè)方法在 iOS 8 里已經(jīng)不被調(diào)用了。然后很快的你為了知道怎么回事,去分解,追溯,結(jié)果發(fā)現(xiàn)這是一個(gè)第三方的代碼所為,而且你還沒有源代碼?;旧嫌幸话氲臅r(shí)間,有些人在做一些奇怪的令人發(fā)指的事以達(dá)到效果,而另一半時(shí)間我們用一些非常規(guī)的手段做了些改動(dòng),于是我們需要因此增加一些防御措施。

聽上去有好多事兒...

是啊,差不多就像偵探似的工作。

聽上去 Peter Steinberger 走的是另一個(gè)方向,反編譯 UIKit 來改 bug

是的,肯定是。每個(gè)版本都是很機(jī)密的,我們不可能問:“嗨,F(xiàn)acebook 的哥們兒,你們?yōu)槭裁匆@么做???”我們必須自己搞明白。在這一點(diǎn)上我非常的敬佩 Peter 跟他的團(tuán)隊(duì)的工作。我認(rèn)為那是非常好的事情,也很樂意看到更多這樣的事。我期待看到更多框架開發(fā)的團(tuán)隊(duì)。Facebook 做出了非常好的表率,GitHub 也是。

我從來沒想過 Apple 也需要反編譯其他人的二進(jìn)制來分析 bug

是啊,我現(xiàn)在作為一個(gè)第三方開發(fā)者,也不得不時(shí)不時(shí)的反編譯UIKit,因?yàn)槲蚁胫馈癠IKit,你在干嘛啊?”這樣的問題,而回答這個(gè)問題最簡單的方式就是逆向編譯。

去年有無數(shù)的新東西面世,有沒有哪個(gè)讓你激動(dòng)?你對 Swift 的出現(xiàn)興奮么?

是,我得說這些都挺讓人激動(dòng)的。如果說真正讓我激動(dòng)的事,卻并不是在消費(fèi)軟件工程行業(yè)。可以幫助我工作的那一類里面,最讓我激動(dòng)的是真正的交互式原型工具。比如你想要做一個(gè)以前從來不存在的交互,或者有這樣的概念但并沒有真正的工具的交互的時(shí)候。我們大多數(shù)仍然只是在 Photoshop 中去設(shè)計(jì)它。當(dāng)你在 Photoshop 上設(shè)計(jì)的時(shí)候,你只是在創(chuàng)造一個(gè)你在 Photoshop 中設(shè)計(jì)的一樣的東西。我記得在 Apple 的時(shí)候,我可以分辨出最初從 Photoshop 還是 After Effects 還是現(xiàn)場模型中得來的需求,這之間有非常大的區(qū)別?,F(xiàn)在有一些工具可以做這件事,雖然我覺得它們都乏善可陳,但我還是非常熱誠的關(guān)注著,希望能有所貢獻(xiàn)。

你是指像 Framer 這樣的工具嗎?

是的,F(xiàn)ramer 是一個(gè)不錯(cuò)的例子。我對剛剛被 Google 收購的 Form 這樣的產(chǎn)品很感興趣,當(dāng)然還有 Origami,也很有意思。我在 Apple 參與了一個(gè)原型工具的內(nèi)部項(xiàng)目,它在有些方面要做的好一些,而另一些方面欠缺一點(diǎn)。每種工具都有優(yōu)點(diǎn)缺點(diǎn),我們差不多維護(hù)了一個(gè)羅列著“這個(gè)工具可以用來干這個(gè),那個(gè)工具更適合做那個(gè)”的表單,我們不得不來回挑選。我認(rèn)為它們除了做那些非常類似于早已存在的工具做的事情之外并沒有在某個(gè)方面特別的擅長。

你是否覺得 storyboard 也在朝這方面走呢?

這個(gè)我并不這么認(rèn)為,但我想我必須進(jìn)一步解釋一下。交互有離散模式和連續(xù)模式。像鼠標(biāo)點(diǎn)擊就是離散模式的交互,而手勢就是連續(xù)模式的交互。類似的,你的應(yīng)用也有離散狀態(tài)和連續(xù)狀態(tài)。例如滾動(dòng)就是連續(xù)的而在導(dǎo)航棧中導(dǎo)航到其他層就是離散的。

Storyboard 只允許你控制那個(gè)四四方方的空間內(nèi)的離散區(qū)域。因此你可以點(diǎn)屏幕上一個(gè)部件,然后通過一個(gè)離散的轉(zhuǎn)場把你引導(dǎo)到另一個(gè)地方。這種交互是最常見的也最沒意思的,而且說實(shí)話我認(rèn)為這種交互占統(tǒng)治地位的原因是因?yàn)槲覀儧]有一個(gè)工具來讓我們思考其他模式的交互方式。

不過從 iOS 7 起,這種離散模式也的邊界也開始比較模糊了。比如可以點(diǎn)擊一個(gè)表單的單元格然后展出單元格下面的內(nèi)容。這是一些很簡單的例子,但卻很難用 storyborad 實(shí)現(xiàn)。

我們需要更多像 Bret Victor 這樣的人來解決這種問題。

譯者注:可以看看這個(gè)網(wǎng)站的炫酷交互,可以說是連續(xù)交互的楷模

是的,那也是為什么我希望沒有那么多人去做照片分享類 app 的原因。

你之前提到說消費(fèi)類軟件工程不是你感興趣的領(lǐng)域,那么這個(gè)領(lǐng)域之外你感興趣的是什么呢?

我閱讀了各種不同領(lǐng)域的論文,我仍然在思考這個(gè)問題。最近讓我注目的是兒童發(fā)展或者說教育,教學(xué)模式這些方面。我讀到的最讓我興奮的調(diào)查結(jié)果是有一個(gè)班的只有五歲的一年級學(xué)生,老師并沒有給他們常規(guī)的數(shù)學(xué)指導(dǎo),而是一個(gè)氛圍,由一系列慢慢調(diào)整的活動(dòng)組成,而這些活動(dòng)都是游戲。一年之后,他們進(jìn)行了評估,雖然這些學(xué)生并沒有學(xué)習(xí)正式的算術(shù)方法,但他們都能夠答對問題并且有非常獨(dú)特的認(rèn)知。這樣的事情讓我非常的激動(dòng)。

那么你在 Khan Academy 開始工作以來學(xué)到的最重要的事情是什么

隊(duì)伍不好帶啊...

為什么?

這是一種獨(dú)特的技能,而我之前并沒有經(jīng)驗(yàn)。在軟件行業(yè),我們總是讓一些有貢獻(xiàn)的工程師去做領(lǐng)導(dǎo)的角色,并期望他們脫穎而出。當(dāng)然,鑒于領(lǐng)導(dǎo)別人是一項(xiàng)特殊的技能,我們必須感激他們做的不錯(cuò),因?yàn)檫@需要學(xué)習(xí)大量的知識(shí)。

你之前提到過你在 Apple 有很好的導(dǎo)師,為什么他們?nèi)绱顺錾??而你又從他們那學(xué)到什么呢?

首先因?yàn)樗麄冋娴姆浅?犊幕〞r(shí)間來做我的導(dǎo)師。在 Apple 總是有很多的挑戰(zhàn),但 Apple 的文化有個(gè)問題是它并不看重導(dǎo)師的價(jià)值。因?yàn)?Apple 對此沒有特別的獎(jiǎng)勵(lì),而且教導(dǎo)和學(xué)習(xí)也沒有被納入企業(yè)文化構(gòu)建當(dāng)中來。

不管怎樣,我真的非常幸運(yùn)能有人花了很多時(shí)間來教我做事,并且當(dāng)我犯了嚴(yán)重錯(cuò)誤的時(shí)候能花時(shí)間主動(dòng)幫助我。那么是什么讓人印象深刻呢?大概是他們的經(jīng)驗(yàn)吧。這個(gè)行業(yè)現(xiàn)在非常有趣,因?yàn)槌涑饬诵庐厴I(yè)生,而正是這些新畢業(yè)生在 Twitter 上嘰嘰喳喳,在會(huì)議上演講。但這個(gè)行業(yè)已經(jīng)形成有一段時(shí)間了,肯定有很多有 15 或 20 年相關(guān)領(lǐng)域經(jīng)驗(yàn)的大神級軟件工程師,但他們并不經(jīng)常唧唧喳喳。你很難一直讀到他們的文章,因?yàn)樗麄兓径急谎┎卦诠纠?,這種情況下他們無法發(fā)聲也很低調(diào),但是他們肯定知道很多。

在 Khan Academy,你跟你的團(tuán)隊(duì)很快就適應(yīng)了 Swift。你可以跟我們分享一下你的經(jīng)驗(yàn)嗎?

我們大概有 20000 行 Swift 的代碼,那個(gè)項(xiàng)目有四位開發(fā)人員,都用 Swift 寫代碼。我們所遇到問題或者說我們稱之為問題的東西,其實(shí)是實(shí)用主意和理想主義的沖突。我相信語言本身的問題都是暫時(shí)的,并不能造成宏觀的影響,對于你可以在 6 個(gè)月時(shí)間做出來的 app 來說,這些問題都不重要。所以完全可以對我的抱怨不置可否,只要專業(yè)軟件開發(fā)的生態(tài)系統(tǒng)能長期健康發(fā)展,我認(rèn)為這門新語言將會(huì)是一個(gè)非常好的貢獻(xiàn),而頭幾個(gè)月的磕磕碰碰不值一提。

積極的一面來說,Swift 讓我們的代碼更清晰。這是我讀 Swift 接口的時(shí)候讓我最高興的事情。比如 Swift 的 block 代碼,我可以更清楚當(dāng)前發(fā)生以及接下來要發(fā)生的事情。我可以看到返回值并且可以從中理解更多。我可以用更準(zhǔn)確的方式來枚舉模型里的系統(tǒng)狀態(tài)。我們可以更準(zhǔn)確的以約束,限制,依賴的方式來使用值類型 (value types)。更廣的說,我很贊同這種把 UIKit 當(dāng)成一種庫而不是框架的模式。

如果說問題的話,沒有工具,工程師也不能去深究。事實(shí)上我其實(shí)覺得 Apple 的 Swift 開發(fā)團(tuán)隊(duì)是 Apple 里最優(yōu)秀的工程師團(tuán)隊(duì),但是工作還沒有完成?,F(xiàn)在還到處都是 bug,經(jīng)常崩潰,偶爾還會(huì)生成錯(cuò)誤代碼。更嚴(yán)重的是,它真的很慢。非常非常慢。不能增長式編譯是最大的問題。我們構(gòu)建的是一個(gè)有 UI 的應(yīng)用,所以我們得花上和考慮如何促進(jìn)學(xué)習(xí)差不多相同的時(shí)間來打磨應(yīng)用的用戶交互和動(dòng)畫 ,然而每次都要花接近兩分鐘才能看到效果實(shí)在是很傷 -- 并不僅僅是效率而是士氣。這讓所有人都很憤怒,基本上所有時(shí)間所有人都很憤怒。更糟的是,這讓我們變懶了。因?yàn)樘覀儾幌敫臇|西,所以如果用 Swift 實(shí)現(xiàn)的 UI 比 Objective-C 實(shí)現(xiàn)的 UI 更難看我一點(diǎn)都不會(huì)吃驚,因?yàn)樵谏厦娴牡偸亲屛覀儽罎ⅰ?/p>

但那只是暫時(shí)的,我對此并不擔(dān)憂。他們知道這些而且肯定會(huì)修正這個(gè)問題。只是你無法管理預(yù)期,不是出于惡意,我認(rèn)為 Apple 其實(shí)不明白而且之前并沒有做過這么大型的東西。

你認(rèn)為 Swift 會(huì)對 Apple 框架的 API 造成什么影響呢?你認(rèn)為短期內(nèi)會(huì)有什么變化嗎?

我沒有什么內(nèi)部消息,所以我只是猜測,但我認(rèn)為這會(huì)是長期的工程。至少當(dāng)我在那兒的時(shí)候,團(tuán)隊(duì)的主要工作是維護(hù)和提升現(xiàn)有的框架,然后支持諸如新屏幕尺寸或者新硬件之類的市場需求。這都會(huì)花很多的時(shí)間,所以對大型的決定會(huì)更謹(jǐn)慎,我認(rèn)為并不會(huì)很快。

我認(rèn)為如果我們快進(jìn)到十年之后,API 將會(huì)完全不一樣。我對此深信不疑,不然肯定會(huì)讓人非常的失望。但要是只是一年之后的話,我想大家一定會(huì)看到注釋得更好的頭文件...(不得不說,黑的漂亮?。?/p>

或者我們可以有像 Reactive Cocoa 那樣的人,把它封裝的更好看一點(diǎn)...

是啊,短期內(nèi)一定會(huì)這樣的。Facebook 的組件項(xiàng)目 (components project, 其實(shí)就是 React) 就做得很好,但那不是 Swift,是 C++,我認(rèn)為超級贊,這主意太棒了。React 是個(gè)不錯(cuò)的設(shè)計(jì)。我對我在 Apple 最大的怨言就在此,因?yàn)?Apple 的文化并不看重學(xué)習(xí),所以沒有人閱讀。我的意思是沒有人讀正經(jīng)的東西,沒有人讀期刊,也沒有人讀論文,沒有人知道現(xiàn)在外面正在發(fā)生的什么。人們不知道 React 之類的東西,這真讓人沮喪。

不管怎樣,我認(rèn)為那是非常不錯(cuò)的,而且毋庸置疑的是肯定會(huì)有人把 UIKit 或者其他框架當(dāng)做是庫來把它們封裝的更好。不過,除非 Apple 自己來做否則不會(huì)是一個(gè)更好的解決辦法,也會(huì)總是落后,總是不匹配一樣。

既然你離開了 Apple,你也開始做更多寫作和演講方面的事情。你有什么其他的計(jì)劃嗎?

基本上都一樣。我希望可以發(fā)布更多的開源的東西。我之前在這上面吃過虧。很有意思的是,當(dāng)你發(fā)布開源項(xiàng)的時(shí)候,人們還希望你去維護(hù)它。我想大家對軟件開源社區(qū)的期待還沒有被明確。有一些開源軟件有自己的社區(qū)也能被很好的維護(hù),而另外有一些開源軟件是以教育或興趣的目的被分享的,就不怎么被維護(hù)。我基本上只有精力做到后者,因?yàn)槔蠈?shí)說,軟件工程并不是我現(xiàn)在感興趣處理的問題。