The Nature of Code(譯) — 前言(內含教學大綱)
來自專欄設計譯店
關於我(譯者):
一名熱愛英語的准設計師,希望能夠大量閱讀外文設計書籍與文獻,並分享給熱愛設計的大家。若哪裡翻譯的不好也希望大夥們能提出意見,我一定會改進的!
《The Nature of Code》的作者是從NYU的ITP(Interactive Telecommunications Program)畢業,和RCA的IDE(Innovation Design Engineering)相似,未能往這個方向走我倍感遺憾,因此作為興趣希望多閱讀相關書籍補充知識。
「世界以一種複雜而又絢麗的方式圍繞著我們運轉。幼年的我們通過感知與互動了解周圍的環境,期待周圍的物質世界與自己的感知記憶一致。比如說我們扔一塊石頭,它會因重力墜落,如果一陣風吹來,較輕的物體將被風吹得更遠。本課程注重的是理解、模擬、把基於運動的物質世界融入到我們所創建的數字世界中。我們的願望是利用用戶的感知記憶創造直觀的、豐富的、更令人滿意的體驗。」
—— 2003年春天,James Tu對多體動態(Dynamic Bodies)課程的描述
前言
P.1 這本書寫得是什麼?
在ITP(http://itp.nyu.edu),我教授一門名為「計算媒體入門」的課程。在該課程中,學生學習編程的基礎知識(變數、條件、循環、對象、數組)以及製作與交互項目相關的應用程序(圖像、像素、計算機視覺、網路、數據、3D)。這個課程大體上遵循的資料是我的入門書籍——Learning Processing。The Nature of Code這本書從許多方面來講是一種跟進。一旦你學過了基礎知識以及了解了一系列應用程序,接下來你會做的可能是深入研究一個特定的領域。比如說,你可能專註於計算機視覺(讀一本類似於Greg Borenstein的Making Things see)。從最基本意義上來說,這本書可能是大多數人下一本要讀的。這本書準確地選擇了Learning Processing遺留下的問題,展示了更高級的編程技術,並且將重點放在演算法和模擬上。
這本書的目標很簡單,我們想要了解自然發生在物理世界裡的事物,接著判斷出如何寫代碼模擬出這些發生的事物。
所以這本書究竟講的是什麼呢?這是本關於科學的書籍嗎?答案肯定是否。我們確實可能會研究物理或生物相關的主題,但是並不需要以相當高的學術嚴謹性去調查。相反,我們將掃掠科學概念,抓住構建特定軟體示例的服務中所需要的部分。
這是一本藝術或設計的書籍么?我也會給否定答案,畢竟我們將重點放在演算法和它們附加的編程技術上。確實結果將都會以視覺效果(動畫草圖處理)呈現。但是它們更多的以演算法和編程技術本身的演示而存在,畫出的只是簡單的形狀和灰度。然而我所希望的是,設計師和藝術家們能夠將這裡所有的材料轉換到自己的練習中,創造出新的、吸引人的作品。
最後,如果這本書有什麼意義的話,就是一本很好的老式編程書。儘管科學主題可以作為一個章節來講(牛頓物理學、細胞生長、進化)或其結果能夠激發藝術家某個項目的靈感,內容本身總會歸結於代碼的實現,並且特別注重於面向對象的程序設計。
P.2 關於Processing的話
在這本書中,我運用Processing語言是有一定原因的。第一,它的語言和環境最讓我舒適,我也喜歡在個人工作中使用它。第二,它是免費、開源、非常適合初學者的。這裡是Processing編程人員的社區,活躍又充滿著活力。對許多人來說,這是他們學到的第一種編程語言,因此我希望能廣泛接觸到讀者,並通過使用Processing,以友好的方式展現這些概念。
總之,沒有什麼東西把我們在書中所做的內容嚴格地與Processing相關聯。本書可以使用ActionScript,JavaScript,Java(無Processing)或任何其他開源「創意編碼」環境,如openFrameworks,Cinder或新發布的pocode編寫。我希望完成這本書後,我將發布能在其他環境運行的示例版本。如果有人對協助移植示例感興趣,請隨時與我聯繫(daniel@shiffman.net)。
這本書中所有的例子都已經使用Processing2.0b6測試,但大多數情況應該可以用老版本Processing運行。我會隨時更新最新版本,最近的代碼在GitHub上一定能找到(shiffman/The-Nature-of-Code-Examples)
P.3 你需要知道些什麼?
理解本書內容的前提可以表述為:「一個學期的Processing編程教學(包括熟悉面向對象的編程)」。也就是說,你沒有理由不能讀這本使用不同語言或開發環境去學習編程的書。 關鍵是你要有編程經驗。
如果你從來沒寫過代碼,將會很困難,因為這本書假設了讀者已具備所有的基礎知識。我建議你撿起一本Processing入門書籍,其中有一些在Processing網站上列出來了(Processing.org learning/books/)。
如果你是一名經驗豐富的程序員,但是從來沒有使用Processing工作過,可以下載Processing(Download Processing.org)來獲取它,通過示例移植代碼,並閱讀入門界面(Tutorials Processing.org gettingstarted/)。
我還應指出,面向對象編程的經驗至關重要,我們在書中將回顧一些基礎知識,但我建議去閱讀些關於對象的Processing教程。
P.4 你用什麼來閱讀這本書呢?
你用Kindle?紙質版?在電腦上看PDF格式的?平板上展現的HTML5動態版本?你是否躺在椅子上,通過一系列電極,管子和墨盒將內容直接吸收到自己大腦中?
現在你在看的這本書,是從MagicBook項目(http://www.magicbookproject.com)結晶而成的。MagicBook是ITP開發的自發布開源框架。這裡的想法是,你只需要把一本書寫成一個簡單的文本文件即可。 一旦你寫完了你的內容,你就可以按下一個魔法按鈕,然後以各種格式(PDF,HTML5,印刷版,Kindle等)發布你的書。一切都是用CSS設計的。從第一版開始,唯一的版本將只有數字PDF、列印出來的硬拷貝、HTML5(其中包括使用Processing.js的動態示例版本)等。希望在這個過程結束後的下一年,這本書能提供添加其他格式。如果有人願意協助我們做此事,請與我聯繫(daniel@shiffman.net)。
P.5 這本書的「故事」
如果你瀏覽了本書的目錄,你會發現一共有十個章節,每一章節都包含不同的話題。從某種意義上說,這本書就是對十個概念和相關示例的調查。儘管如此,在整理材料的時候,我總是想像一些線形敘述。在你閱讀章節之前,我想引導你閱讀這個故事,覺得重要的是讓你先了解整個過程。
第一部分 靜物
躺在草坪上的足球,一腳踢向空中,重力使它墜落,一陣疾風吹過讓它在空中停留了一會兒,直到它落下並從彈跳的球員頭上彈開。足球是無生命的,它無權選擇如何在這個世界移動。相反,它是一個無生命的物體,等待著受環境力量的推動和拉動。
我們如何運用Processing模擬出一個足球的運動?如果你曾做過球飛躍過窗口的編程,你可能會寫出以下這行代碼。
x=x+1
你在x的位置畫了一些形狀。隨著每一幀動畫,你增加x的值,重新繪製形狀,瞧!——運動的幻覺!可能你還需要一兩步,包括y的位置以及沿x,y軸的速度變數。
x = x + xspeed;
y = y + yspeed;這個故事的第一部分將帶領我們更進一步。我們將採用這些變數xspeed和yspeed,學習如何組合它們形成一個向量(第一章),運動的基石。我們不會從中獲得任何新功能,但是它將會為書中餘下的內容打下堅實的基礎。
一旦我們知道一些關於向量的知識,我們很快就會意識到力就是向量(第二章)。踢足球時,你就在運用一股力。力能使物體發生什麼變化?根據Isaac Newton,力等於質量乘以加速度。力能使物體加速度。模擬力量將允許我們創造出具有動態運動的系統,其中對象根據各項規則移動。
現在你施加的力也可能讓這個足球旋轉。如果一個物體因其加速度移動,它也可以因其角加速度旋轉(第三章)。了解角度和三角學的基礎知識將協助我們模擬旋轉的物體,並掌握擺動運動的原理,如擺鐘的擺動或彈簧的彈跳。
一旦我們為個體靜物解決了運動和力的基本問題,我們將學習如何製作成千上萬個這樣的物體,並在稱為粒子系統的單個系統中管理它們。粒子系統將使我們能夠看到面向對象編程的一些高級功能,即繼承和多態性。
從第一章到第四章,所有示例都將從「scratch」開始編寫,意味著驅動物體運動的算術代碼將直接寫入Processing。我們當然不是第一個考慮在動畫中模擬物理的想法的程序員,所以接下來,我們將研究如何使用物理庫(第5章)來模擬更高級和複雜的行為。 我們將會看看Box2D(http://www.box2d.org)和toxiclibs的Verlet物理包(http://toxiclibs.org/)。
第二節:它是活的!
模擬生命是什麼意思?這不容易回答,但我們可以開始建造一個可感知周圍環境的物體。我們來思考一下,一塊木塊從桌子上掉下來會隨著力運動,就像海豚在水中游泳一樣。但是有關鍵的不同。木塊不能自己決定跳過桌子。海豚可以決定跳出水面,它能有夢想和渴望,感受到飢餓與恐懼,這些感覺引導它們的運動。通過研究自治代理建模背後的技術(第6章),我們將為我們創建的無生命物體注入生命,讓它們根據對環境的理解來決定自身行動。
通過結合自治代理的概念與我們在第四章節學習的模擬系統,我們將看見模型表現出複雜屬性的團隊行為。一個複雜的系統會典型的被定義為一個「不僅僅是各部分之和」的系統。儘管系統的各個元素可能非常簡單易懂,但系統的整體行為可能會非常複雜、智能並且難以預測。這將導致我們得遠離純粹思考建模運動,進入一個基於規則為系統的領域。我們可以用元胞自動機來建模嗎?我們可以用分形生成什麼類型的模式?是自然幾何嗎?
第三節 人工智慧
我們讓事物運動,接著給予它們希望、夢想還有恐懼,遵從規則地生存下去。本書的最後一步是讓我們的創造更加智能化。 我們是否可以將生物的進化過程應用於計算系統(第9章)得以進化我們的物體? 我們若從人類的大腦中獲取靈感,是否可以編製一個人工神經網路(第10章),使它們從錯誤中學習,並適應自身的環境?
P.6 這本書就像一個教學大綱
儘管這本書的內容確實像被高度壓縮又緊張的一學期,我還是將它設計成了一個適合14周的課程。儘管如此,值得一提的是我發現本書的很多章節更適合擴展到多個星期完成。比如說,我課程的教學大綱的大致如下:
第一周 入門和向量(第一章)
第二周 力(第二章)
第三周 振幅(第三章)
第四周 粒子系統(第四章)
第五周 物理庫 第一部分(第五章)
第六周 物理庫 第二部分&轉向(第五章-第六章)
第七周 目前關於運動的中期項目
第八周 複雜系統:集群和一維元胞自動機(第六章-第七章)
第九周 複雜系統:二維元胞自動機和分形(第七章-第八章)
第十周 遺傳演算法 (第九章)
第十一周 神經網路(第十章)
第十二周-第十三周 終期項目工作坊
第十四周 最終項目展示
P.7 生態系統項目
儘管我想讓你捲曲在一張舒適的椅子上讀著編程的書,學習編程,但你不得不做些編程。你可能發現當書一章章過的時候,記住項目的一兩個想法對開發一系列練習有幫助。事實上,當在ITP教授自然語言課程的時候,我常發現學生享受建立單一的項目,就這樣一周又過了一周,跨越了一個學期的課程。
在每個章節的最後,你將看到一些針對各個項目的練習,這些練習建立在項目彼此之間,一次一個話題。考慮一下如下的情況。你被一個科技博物館叫去開發一個新展覽的軟體——數字生態系統,一個有著動態的程序化生物們的世界,它們活在投影屏幕上,當觀眾走進博物館時供他們欣賞。我的意思不是說這是一個特別有新意、創造力的概念。相反,我們將運用這個例舉項目的理念作為這本書內容的字面表達,演示如何將這些元素組合在一個軟體項目中。我鼓勵你去找到自己的思路,它有著更吸引人、更有創造力的想法。
P.8 網上我在哪裡能找到代碼,提交反饋?
所有與本書相關的的都可以在自然的語言官網(http://www.natureofcode.com) 找到。本書的原始版本和所有的插圖都在GitHub(http://github.com/shiffman/The-Nature-of-Code)上。請留下反饋意見,用「GitHub問題」提交更正。所有示例(和練習)的源代碼也可在GitHub上獲取(http://github.com/shiffman/The-Nature-of-Code-Examples)。章節本身包含與文本一致的代碼片段。不過我要提一下,在很多情況下,我縮短或者簡化了代碼片段是為了具體說明一點。在所有情況下,帶有註解的完整代碼可以通過GitHub查找到。
如果你對代碼本身有問題,我建議你將它們發布到Processing論壇(http://forum.processing.org)上。
推薦閱讀:
※《2018年刑偵科推理試題》Python版求解?(? ???ω??? ?)?
※有什麼你覺的很好的 idea,卻一直沒時間來實現?
※走少有人走的路:編程真TM難學
※MakeBlock mBot小車 項目活動 教學設計目錄
※新手配置webmagic爬蟲開發環境