程式設計師訪談(三):終身學習的一代人

objc中國發表於2015-01-26
在之前Andy Matuschak擔任了 iOS 4.1 至 8 的 UIKit 的開發和維護工作。同時 Andy 也是 Mac 知名框架 Sparkle 的建立者。可以說無論是 iOS 開發者還是 Mac 開發者,我們其實每天都在使用著 Andy 所開發的東西。

Andy Matuschak



Andy,謝謝你抽空接受採訪。可以跟我們談談你是如何開始程式設計的嗎?

我想應該跟很多人一樣是從遊戲開始的。小時候有段時間,家裡是不允許我玩遊戲機的,於是我就經常去公共圖書館。在我九歲的時候,我發現那些我以為是教程式設計的書其實只是羅列了基本的原始碼。還有一些講遊戲設計的書整本都是原始碼。於是當我想玩遊戲的時候就把這些原始碼輸入計算機,但又常常半路遇到語法錯誤,而我當時還不能理解這些錯誤資訊,也不知道如何解決。所以我不得不重來一遍,直到我終於可以玩這個遊戲,如此反覆之後我意識到我可以修改這個遊戲,而從那以後就一發不可收拾了。我學了 C++ — 那時我大概 10 歲 — 因為人們是用它寫遊戲的,我試圖寫過一個 MUD 遊戲 — 那是我第一個大專案,還進行的不錯…

你完成它了嗎?

單人模式下所有功能都可以很正常的執行,但多玩家的模式沒有完成 — 所以我想答案應該是沒有吧。因為後來我轉移注意力到圖形方向去了,開始迷戀上 GL 和 3D 渲染之類的事情。

然後你就繼續做遊戲?

我做了一陣遊戲引擎之類的東西,看了所有 OpenGL 的教程,什麼旋轉的方塊啊,顆粒引擎啊這些東西,然後我開始做真正的遊戲。在那個時候,對一個 13 歲的我來說,那真是繁複的工作。我發現沒有足夠好的圖形工具來顯示遊戲內容。於是,我跟我的室友開始做一個畫素編輯器。我們把它叫做 Pixen。那是我第一次接觸 Cocoa,還是開源的。當我們釋出 1.0 版本的時候,我當時大概 14 歲吧,我們去購物中心裡面蘋果商店的 OS X Panther (還是 Jaguar?) 的釋出會。那個時候他們就開始搞釋出會了!我們想贈送我們那個畫素編輯器的 CD。

是不是有其他的什麼可能你就不會成為一個程式設計師了?你當時還對其他什麼特別感興趣嗎?

我當時的理想就是成為某種工程師。我當時對電氣工程,或者甚至是高中的那些化學小實驗的理工科挺著迷的,所以當時是想成為這些工程師中的一種,而軟體工程是我當時真正可以著手做的。當時我把這稱為程式設計,而不是軟體工程,於是有些人告訴我:“不對不對,你應該叫它電腦科學!”當然,在當時,我並不明白在電腦科學,軟體工程和程式設計當中暗流洶湧的文化差異,我只覺得它們是很有用的清晰的術語。但其實我們常常把它們用錯了。

好勒。那你現在基本上就是軟體工程師了?

我肯定不是電腦科學家,雖然我是學這個的。我覺得我差不多算是軟體工程師,一個深受電腦科學影響的軟體工程師。不過我最近會花大概一半時間做一些兒童教育方面的研究,讀論文和書籍,分析設想,我們希望能在這個方向略盡綿力。

離開 Apple 去 Khan Academy,幫助人們學習和教育,看起來是個不小的跨越。這是怎麼發生的呢?是什麼促動你的?

這個, 我想我可以從其他一些事來回答這個問題… 我之前去加州理工學習過一段時間,這所學院支援了大量自然科學的專案,諸如 NASA 和 DARPA,所以當時的討論都集中在人性化影響上。當時有一個 NASA 的人過來對我們說:“好了,你們是最優秀的,而你們即將在世界上最好的研究學院之一學習,你們將擁有無數可能。這對你是無限機遇,而你們也應當把握這樣的機遇,將它們利用來做些真正有意義的事情。”

當我來到更廣闊的軟體社群裡時,我是少數的幾個畢業之後沒有去做研究的人之一。剛畢業的時候我希望能做一些事情,但我對大多數商業軟體工程和軟體銷售的能產生的影響和追求的目標感到失望,於是我冥思苦想到底可以在哪個領域發揮我的專長, 而最先踏出的第一步最終決定了我的方向。我深受物理學家 David Deutsch 的影響,通過他我確認了我想要走的方向,那就是擴充套件人類知識和能力範圍,繼而我就開始思考怎樣才可以做到。

如果人類能活得更久一些,那我們就能在知識能力上走得更遠,所以在生物技術和化學工程會有很多的機遇。如果人類有更好的工具進行試驗,也能更進一步,所以在工具製造,綜合工具,虛擬現實,或者是接下去的人工智慧領域也都有很多的機會。但基於我的背景和機遇,我最終決定在教育方面做一些貢獻,我認為這將會是更好的選擇。因為如果我可以創造終身學習的一代人,那麼我們將有更多的人來解決這些問題。

那麼你是想為後代打造一些幫助學習的工具以便於他們解決更艱難的問題?

是的,那是我的期望。學習的一大挑戰就是元學習 (meta learning,即“學習如何學習”)。這是一種可以不必摧毀自信或摧毀學習態度的學習方式。如果我開發的這些工具不但可以讓畢業生得到相同成績,並且他們最終不但對數學有更好的認知而且會更傾向於在之後的生活中學習數學,那我就達到目標了。

看起來很顯然你並不滿意我們已有的教育?你可以詳細談談嗎?

是的,它還不夠好,並且在很多方面都不夠好。最缺乏的是沒有讓學生得到剛才我說到的那些機遇和資源,我覺得那是最重要並且最首要需要改善的事情。所以這就是為什麼現在的任務是給所有人提供免費教育,而 Khan Academy 的使命是為大家提供世界一流的免費教育。所以現在我們會先將重點集中在為大家提供免費教育上面,接下來會是世界一流的免費教育。但那是後續的事了,因為我對現在所謂的世界一流還有些懷疑和考慮。

我有很多同學接受了最好的付費教育,由諾貝爾獲獎者授課。儘管如此,他們的學習態度卻很糟,認為一畢業就算完。他們只想結束這一切然後去找份穩定的工作,放空大腦,因為他們已經被系統和制度打倒,而好奇心跟智慧也已經枯竭。

聽上去真讓人沮喪…

是啊。如果你問人們你覺得數學怎麼樣,大多數人都會回答說:“哦,數學很無聊。”或者“我數學不好,我不太適合學數學。”。如果你問他們對科學的態度,答案也類似。但如果問到文學,或許他們會談論一些他們讀過的書籍裡的有趣橋段,但那也只是他們學生時代讀過的罷了,現在已經停止閱讀了。所以我最期望影響的是改變人們認為教育隨著大學畢業一併終止了這一認知。而這其實並不是一個技術上的問題,所以我對給我自己貼上“軟體工程師”的標籤有些顧慮。雖然我大部分的經驗與之相關,但我的目標是卻不是這個方向。

既然你現在在終身學習上面有這樣一個大計劃,那你對你十年後的願景是怎樣的呢?你期望達到什麼目標?

眼下,學習的標準含義已經被普遍認可。不論是讀教課書,看一個視訊還是聽一個演講,你都是被動的吸收知識。你只用坐在那接收,或許如果你比較有錢的話還可以在之後有個對話交流之類的。但當你畢業之後,你必須自己去創造這樣的學習環境。我對所謂的構建式學習環境 (constructivist learning environments) 很感興趣。這是一位幾十年前的學習研究者 Papert 創造的術語。在構建式學習環境下,學生由被動的從教科書裡學習轉變成自主的創造知識。在這樣的模式下,會更像是創造了一種環境,讓你在這樣的氛圍中積極主動的理解事物繼而掌握它們。

Papert 的研究裡有一個例子,他嘗試用 Logo 來教學生抽象及程式性思維,而不是程式設計本身。 他甚至有一個教室裡掛了一個 Logo 的海龜的標誌。那時候還有一種機械海龜,可以在真的紙上作畫。這個教室四周掛滿了畫,有些是原始碼生成的,有些不是。這些畫作會隨著一批批的學生換掉,因為比如有些學生會看到一朵花然後說:“哦,我喜歡那個圖,能給我嗎?”然後教師會說:“當然可以,不過你必須輸入這些程式碼,海龜會按程式碼畫出這個圖。”接著學生會說:“好的。”然後開始畫畫。之後他或許又看上其他畫作,但那些並沒有原始碼,於是他就得自己想辦法。

教室裡這些沒有原始碼畫作是被設計出來的,需要學生理解原理後製作出來。創造性環境就這樣塑造出來了。我正在研究這個很可能會被研究很多年的假說,首先是允許人們自助的構建知識,那麼將很可能得到同樣的學習效果,當然如果達到這一結果我會非常高興,不僅如此,他們還會在自我認知,學習態度和學習興趣上都比其他同學高出不少。

除了用構建式方式鼓勵人們更主動的學習之外,另一個相比你在 Khan Academy 做的和更傳統的教育方式之間的主要區別是更自由地選擇想學習什麼以及什麼時候學習。那麼你覺得這個改變有什麼影響呢?

另外有一個兒童教育研究者 Piaget 對此有很多的研究成果。他認為對青年一代的開發當中最重要的事情之一是對自主性的訓練。而這裡的自主性比我們平時認為的自主性還要更寬範一些。不是“我可以隨便的玩”這樣的自主性,而是“我正在對我生活中所有的的事情做決定”。這跟其他人來告訴你要怎麼分配你的時間或訴諸權威是相牴觸的。比如說,常規性的回答 “Bobby 在玩遊戲的時候作弊了” 這樣的問題,會是 “哦,我去找他談談”。與之相反的,如果是自主性的回答將會是 “那麼你是怎麼跟 Bobby 說的?”。我認為自主性的訓練在各方面都是非常重要的。有些研究認為這會在短期內得到更好的效果,但我認為從長期來說也會引匯出更善於思考的人。

我對那種一整天的日程都被別人安排的情況很質疑。我認為如果一個導師以日復一日的調整學生的學習環境來達到修正學生學習程式的方式會是更積極的。確切一點,舉個例子,比方說與其一次性給學生全部人類知識的目錄,並且把每個知識點都按重要程度分類,我認為更好的方式是把所有的知識都看成是書架上的書,然後按難易程度由低到高的擺放。

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

當然,我懷念那兒的人,這太重要了。事實上這正是我對這個行業感到一些失望的地方。有這麼多優秀的人被侷限在這些巨型公司裡,他們只是偶爾被善加利用,但更經常的情況下他們只是一臺機器的零件,但以他們的智慧其實可以做更大更影響深遠的貢獻。我並不是說一定要來我這個專案,我是指更廣泛的情況。讓我覺得有點傷感的不僅僅情感上的想念,我更懷念的是諸如當時在 NeXT 和那些非常有經驗的人進行的非常有激發性的談話。我仍然希望他們可以發揮更大的影響力。

可以多分享一下在 Apple 的時光嗎?開發一個被如此多人使用的框架是個什麼體驗?而你又是怎麼從做遊戲一步步達到的?

填補這中間的鴻溝的一件事是當我 16 歲的時候,我寫了一個叫 Sparkle 的框架。它讓我認識到了到了一些框架開發的現實,比如說你要修改大家正在用的 API,他們就會非常生氣。這是框架開發的基本現實之一,但老實說其實我在到 Apple 之前並不知道我當時在幹嘛。我完成了學業,我有了更大的雄心,而 Apple 看起來是個非常好的學習地點,事實上也是。其實現在也仍然是,所以我還是會跟那些跟我當時抱一樣想法的人提出相同的建議。跟我共事的團隊是開發了這個體系超過十年的人們,而我差不多是當中墊底的。於是我被迫非常快速的學習和理解許多設計這種規模框架所需的獨特的角度。尤其是考慮框架的二進位制相容(binary compatibility)問題,而 Sparkle 並沒有考慮過。幸運的是,我周圍的人都非常慷慨的付出他們的時間和精力幫助我進步。在犯了很多很多錯誤之後,我終於意識到我都幹了些什麼蠢事兒,而當我幾年後離開,之後大概再也用不到那些技術。

開發這樣大型規模的框架裡面最讓你吃驚的是什麼

我認為二進位制相容是最讓我吃驚的事情。我當時並不理解當中的困難和複雜。想象一下這類的 bug 吧:在 iOS 8 裡按鈕是白色背景,但在 iOS 7 裡面卻是透明的。iOS 8 還沒有釋出,所以這肯定是我們自己的問題。於是你開始一點點鑽研,發現可能在 iOS 7 裡呼叫的一個方法是控制這個的,但這個方法在 iOS 8 裡已經不被呼叫了。然後很快的你為了知道怎麼回事,去分解,追溯,結果發現這是一個第三方的程式碼所為,而且你還沒有原始碼。基本上有一半的時間,有些人在做一些奇怪的令人髮指的事以達到效果,而另一半時間我們用一些非常規的手段做了些改動,於是我們需要因此增加一些防禦措施。

聽上去有好多事兒…

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

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

是的,肯定是。每個版本都是很機密的,我們不可能問:“嗨,Facebook 的哥們兒,你們為什麼要這麼做啊?”我們必須自己搞明白。在這一點上我非常的敬佩 Peter 跟他的團隊的工作。我認為那是非常好的事情,也很樂意看到更多這樣的事。我期待看到更多框架開發的團隊。Facebook 做出了非常好的表率,GitHub 也是。

我從來沒想過 Apple 也需要反編譯其他人的二進位制來分析 bug

是啊,我現在作為一個第三方開發者,也不得不時不時的反編譯UIKit,因為我想知道“UIKit,你在幹嘛啊?”這樣的問題,而回答這個問題最簡單的方式就是逆向編譯。

去年有無數的新東西面世,有沒有哪個讓你激動?你對 Swift 的出現興奮麼?

是,我得說這些都挺讓人激動的。如果說真正讓我激動的事,卻並不是在消費軟體工程行業。可以幫助我工作的那一類裡面,最讓我激動的是真正的互動式原型工具。比如你想要做一個以前從來不存在的互動,或者有這樣的概念但並沒有真正的工具的互動的時候。我們大多數仍然只是在 Photoshop 中去設計它。當你在 Photoshop 上設計的時候,你只是在創造一個你在 Photoshop 中設計的一樣的東西。我記得在 Apple 的時候,我可以分辨出最初從 Photoshop 還是 After Effects 還是現場模型中得來的需求,這之間有非常大的區別。現在有一些工具可以做這件事,雖然我覺得它們都乏善可陳,但我還是非常熱誠的關注著,希望能有所貢獻。

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

是的,Framer 是一個不錯的例子。我對剛剛被 Google 收購的 Form 這樣的產品很感興趣,當然還有 Origami,也很有意思。我在 Apple 參與了一個原型工具的內部專案,它在有些方面要做的好一些,而另一些方面欠缺一點。每種工具都有優點缺點,我們差不多維護了一個羅列著“這個工具可以用來幹這個,那個工具更適合做那個”的表單,我們不得不來回挑選。我認為它們除了做那些非常類似於早已存在的工具做的事情之外並沒有在某個方面特別的擅長。

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

這個我並不這麼認為,但我想我必須進一步解釋一下。互動有離散模式和連續模式。像滑鼠點選就是離散模式的互動,而手勢就是連續模式的互動。類似的,你的應用也有離散狀態和連續狀態。例如滾動就是連續的而在導航棧中導航到其他層就是離散的。

Storyboard 只允許你控制那個四四方方的空間內的離散區域。因此你可以點螢幕上一個部件,然後通過一個離散的轉場把你引導到另一個地方。這種互動是最常見的也最沒意思的,而且說實話我認為這種互動佔統治地位的原因是因為我們沒有一個工具來讓我們思考其他模式的互動方式。

不過從 iOS 7 起,這種離散模式也的邊界也開始比較模糊了。比如可以點選一個表單的單元格然後展出單元格下面的內容。這是一些很簡單的例子,但卻很難用 storyborad 實現。

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

譯者注:可以看看這個網站的炫酷互動,可以說是連續互動的楷模


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

你之前提到說消費類軟體工程不是你感興趣的領域,那麼這個領域之外你感興趣的是什麼呢?

我閱讀了各種不同領域的論文,我仍然在思考這個問題。最近讓我注目的是兒童發展或者說教育,教學模式這些方面。我讀到的最讓我興奮的調查結果是有一個班的只有五歲的一年級學生,老師並沒有給他們常規的數學指導,而是一個氛圍,由一系列慢慢調整的活動組成,而這些活動都是遊戲。一年之後,他們進行了評估,雖然這些學生並沒有學習正式的算術方法,但他們都能夠答對問題並且有非常獨特的認知。這樣的事情讓我非常的激動。

那麼你在 Khan Academy 開始工作以來學到的最重要的事情是什麼

隊伍不好帶啊…

為什麼?

這是一種獨特的技能,而我之前並沒有經驗。在軟體行業,我們總是讓一些有貢獻的工程師去做領導的角色,並期望他們脫穎而出。當然,鑑於領導別人是一項特殊的技能,我們必須感激他們做的不錯,因為這需要學習大量的知識。

你之前提到過你在 Apple 有很好的導師,為什麼他們如此出色?而你又從他們那學到什麼呢?

首先因為他們真的非常慷慨的花時間來做我的導師。在 Apple 總是有很多的挑戰,但 Apple 的文化有個問題是它並不看重導師的價值。因為 Apple 對此沒有特別的獎勵,而且教導和學習也沒有被納入企業文化構建當中來。

不管怎樣,我真的非常幸運能有人花了很多時間來教我做事,並且當我犯了嚴重錯誤的時候能花時間主動幫助我。那麼是什麼讓人印象深刻呢?大概是他們的經驗吧。這個行業現在非常有趣,因為充斥了新畢業生,而正是這些新畢業生在 Twitter 上嘰嘰喳喳,在會議上演講。但這個行業已經形成有一段時間了,肯定有很多有 15 或 20 年相關領域經驗的大神級軟體工程師,但他們並不經常唧唧喳喳。你很難一直讀到他們的文章,因為他們基本都被雪藏在公司裡,這種情況下他們無法發聲也很低調,但是他們肯定知道很多。

在 Khan Academy,你跟你的團隊很快就適應了 Swift。你可以跟我們分享一下你的經驗嗎?

我們大概有 20000 行 Swift 的程式碼,那個專案有四位開發人員,都用 Swift 寫程式碼。我們所遇到問題或者說我們稱之為問題的東西,其實是實用主意和理想主義的衝突。我相信語言本身的問題都是暫時的,並不能造成巨集觀的影響,對於你可以在 6 個月時間做出來的 app 來說,這些問題都不重要。所以完全可以對我的抱怨不置可否,只要專業軟體開發的生態系統能長期健康發展,我認為這門新語言將會是一個非常好的貢獻,而頭幾個月的磕磕碰碰不值一提。

積極的一面來說,Swift 讓我們的程式碼更清晰。這是我讀 Swift 介面的時候讓我最高興的事情。比如 Swift 的 block 程式碼,我可以更清楚當前發生以及接下來要發生的事情。我可以看到返回值並且可以從中理解更多。我可以用更準確的方式來列舉模型裡的系統狀態。我們可以更準確的以約束,限制,依賴的方式來使用值型別 (value types)。更廣的說,我很贊同這種把 UIKit 當成一種庫而不是框架的模式。

如果說問題的話,沒有工具,工程師也不能去深究。事實上我其實覺得 Apple 的 Swift 開發團隊是 Apple 裡最優秀的工程師團隊,但是工作還沒有完成。現在還到處都是 bug,經常崩潰,偶爾還會生成錯誤程式碼。更嚴重的是,它真的很慢。非常非常慢。不能增長式編譯是最大的問題。我們構建的是一個有 UI 的應用,所以我們得花上和考慮如何促進學習差不多相同的時間來打磨應用的使用者互動和動畫 ,然而每次都要花接近兩分鐘才能看到效果實在是很傷 — 並不僅僅是效率而是士氣。這讓所有人都很憤怒,基本上所有時間所有人都很憤怒。更糟的是,這讓我們變懶了。因為太慢,我們不想改東西,所以如果用 Swift 實現的 UI 比 Objective-C 實現的 UI 更難看我一點都不會吃驚,因為在上面的迭代總是讓我們崩潰。

但那只是暫時的,我對此並不擔憂。他們知道這些而且肯定會修正這個問題。只是你無法管理預期,不是出於惡意,我認為 Apple 其實不明白而且之前並沒有做過這麼大型的東西。

你認為 Swift 會對 Apple 框架的 API 造成什麼影響呢?你認為短期內會有什麼變化嗎?

我沒有什麼內部訊息,所以我只是猜測,但我認為這會是長期的工程。至少當我在那兒的時候,團隊的主要工作是維護和提升現有的框架,然後支援諸如新螢幕尺寸或者新硬體之類的市場需求。這都會花很多的時間,所以對大型的決定會更謹慎,我認為並不會很快。

我認為如果我們快進到十年之後,API 將會完全不一樣。我對此深信不疑,不然肯定會讓人非常的失望。但要是隻是一年之後的話,我想大家一定會看到註釋得更好的標頭檔案…(不得不說,黑的漂亮!)

或者我們可以有像 Reactive Cocoa 那樣的人,把它封裝的更好看一點…

是啊,短期內一定會這樣的。Facebook 的元件專案 (components project, 其實就是 React) 就做得很好,但那不是 Swift,是 C++,我認為超級贊,這主意太棒了。React 是個不錯的設計。我對我在 Apple 最大的怨言就在此,因為 Apple 的文化並不看重學習,所以沒有人閱讀。我的意思是沒有人讀正經的東西,沒有人讀期刊,也沒有人讀論文,沒有人知道現在外面正在發生的什麼。人們不知道 React 之類的東西,這真讓人沮喪。

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

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

基本上都一樣。我希望可以釋出更多的開源的東西。我之前在這上面吃過虧。很有意思的是,當你釋出開源項的時候,人們還希望你去維護它。我想大家對軟體開源社群的期待還沒有被明確。有一些開源軟體有自己的社群也能被很好的維護,而另外有一些開源軟體是以教育或興趣的目的被分享的,就不怎麼被維護。我基本上只有精力做到後者,因為老實說,軟體工程並不是我現在感興趣處理的問題。
評論(1)

相關文章