致谢

致谢

“我们周围的世界以一种复杂而精彩的方式运作着。在生命的早期,我们通过感知和互动了解所处的环境。我们期望周围物理世界的行为方式和我们自身的感知记忆一致。比如,石头在重力的作用下坠落,风能把更轻的物体吹得更远。本课程的主要目的就是理解和模拟物理世界的运动元素,并在我们的数字模拟世界中加入这些元素。我们的目标是根据用户对物理世界的感知记忆创建直观、丰富且令人满意的体验。”

——James Tu,动态物体课程描述,2003年春,ITP

关于本书的故事

2003年,作为纽约大学Tisch学院ITP课程(交互通信计划)的毕业生,我学习了一门名为“动态物体”的课程,课程讲师是ITP的兼职教授、交互设计师James Tu。这门课的内容是一系列软件实验,目的是产生实时的“非真实”图像。课程期间,我们需要根据各种规则获取有生命物体的图像并填充颜色,而且让它们在屏幕上移动。课程涵盖了向量、力、振荡、粒子系统、递归、转向和弹簧这些知识,它们和我的工作密切相关。

我经常在项目中用到上述概念,却从来没有仔细研究过这些算法背后的科学原理,也没有用面向对象的方法规范地实现它们。就在那个学期,我还选修了“衍生艺术系统基础”(Foundations of Generative Art Systems),这门课的讲师是Philip Galanter,他的研究方向主要集中在衍生艺术的理论和实践上,涵盖混沌、细胞自动机、遗传算法、神经网络和分形等话题。Tu和Galanter的课程使我在模拟算法和技术上有了很大提高,为我之后的教学工作带来了很大帮助。同时,这两门课程也是本书的基础。

但本故事背后还隐藏着另一个谜题。

Galanter的课程几乎全是理论,而Tu的课程使用的是Macromedia Director和Lingo编程语言。在那个学期,我试着将很多算法用C++语言实现(那时候还没有openFrameworks和Cinder等创意编程环境,因此我在用笨拙的方式编写C++代码)。在学期末,我发现了Processing语言(http://www.processing.org)。Processing在那时候还只是alpha版本(版本0055)。由于我有一定的Java经验,因此一直在思考:能否用这门对艺术家友好的开源语言开发一套编程和模拟的教学示例?在ITP和Processing社区的帮助下,我完成了这件事。这8年来,我一直在用Processing进行算法和应用教学。

首先,我要感谢ITP的创立者Red Burns,在这10年里,他一直支持并鼓励着我;感谢ITP的主席Dan O'Sullivan,他一直是我的教学导师,也是第一个建议我开始Processing课程教学的人,促使我整理这些教学资料;感谢Pro Android Media的作者、杰出的开发者Shawn Van Every,他为我提供了很多帮助,也在ITP给我很多灵感。在编写本书的过程中,ITP的教员Clay Shirky、Danny Rozin、Katherine Dillon、Marianne Petit、Marina Zurkow和Tom Igoe给了我很多建议和反馈。其他ITP同僚也提供了很多帮助,他们是:Brian Kim、Edward Gordon、George Agudow、John Duane、 Marlon Evans、Matt Berger、Megan Demares、Midori Yasuda和Rob Ryan。

ITP课程教学中,还有举不胜举的学生提供了很多反馈。本书的很多材料都源自我的同名课程,这些课程我已经教了5年。在本书的编写及修订过程中,我拥有了一摞写满注释的打印草稿,也积累了许多来自学生的电子邮件,感谢他们的点评、纠正以及鼓励。

我还要感谢Processing社区中的程序员和艺术家。如果没有Processing的开发者Casey Reas和Ben Fry,我不会编写这本书。通过阅读Processing的源代码,我积累了许多知识。Processing语言的简洁用法,以及它的网站和IDE为编程提供了极大的便利,同时也为学生带来很多乐趣。除此之外,我还从许多Processing程序员那里得到数不胜数的建议与灵感,他们是:Andrés Colubri、Jer Thorp、Marius Watz、Karsten Schmidt、Robert Hodgin、Seb-Lee Delisle以及Ira Greenberg。Heather Dewey-Hagborg为本书的第10章(神经网络)提供了大量优秀反馈;Scott Murray在电子邮件中提供了一些关于内联SVG的实用建议;Golan Levin提供了很多文章来源(可用于阅读扩展)。

我还要感谢本书的编辑Shannon Fry,她为我的写作过程提供了细心周到的反馈,让我能把每一章完成得更出色。

特别值得一提的是Zannah Marsh,她不知疲倦地为本书提供了很多插图。尤其要感谢她的耐心工作,因为在本书的编写过程中,我经常改变插图需求。我也想感谢David Wilson,他为本书设计了布局和封面。特别感谢Steve Klise,他设计并开发了本书的网站,帮我制定了PDF版“随意支付”的付费模式。

我在前言中会提到,本书是由开源出版系统Magic Book生成的。Magic Book是由ITP的开发者、设计师和艺术家组成的团队经过一年多时间开发完成的。本书的各种格式(HTML、PDF等)都是由它生成的,而Magic Book的输入文件仅仅是一个简单的ASCII文档和CSS布局文件。Magic Book项目是由Rune Madsen发起的,他开发了初始的Ruby/Sinatra框架。如果没有Rune的贡献,直至2013年我一定还在为本书的最终成形苦苦挣扎。Steve Klise为Magic Book修复了很多错误,并使我能在代码块中加入注释内容。Miguel Bermudez、Evan Emolo和Luisa Pereira Hors也在其他方面做出许多贡献,他们研究了ASCIIDOC和CSS分页媒体的来龙去脉。ITP的研究人员Greg Borenstein在本书的Web出版和打印方面提供了大量建议和支持。Magic Book使用Prince引擎(princexml.com)从HTML文档中产生PDF文档,因此我要感谢PrinceXML的CEO Michael Day,他(以风驰电掣般的速度)回答了我的很多问题。

最后,我要感谢我的家人:我的妻子Aliki Caloyeras,她一直在支持我的写作,同时也在写自己的大部头图书;还有我的孩子Elias和Olympia,为了腾出更多时间陪伴他们,我有更多动力尽快完成本书。我还要感谢我的父亲Bernard Shiffman,他慷慨地教会了我很多数学知识,也提供了很多关于本书的反馈。除此之外,还要感谢我的母亲Doris Yaffe Shiffman和我的兄弟Jonathan Shiffman,他们经常会问“你的书进展如何”。

Kickstarter

还有一个组织使本书的出版变为可能:Kickstarter。

2008年,我完成了我的第一本书Learning Processing(Morgan Kaufmann/Elsevier出版)。我花费整整3年时间编写Learning Processing,却没有仔细思考选择哪一家出版社,只是想:“你们真的要出版我写的书?好,成交!”遗憾的是,这次出版经历并不算太好。整个过程中,出版社为我安排了5位编辑,我也没有收到太多的内容反馈。出版社以外包的形式完成排版工作,这导致本书有很多错误和不一致的地方。除此之外,我发现这本书的价格也不符合自己的期望。我希望这是一本价格平易近人的平装本Processing介绍性图书,但最后这本书的定价是50美元,接近“教科书”的价格。

我想特别指出,出版社的本意是好的。他们非常希望出版优秀的书籍,这对读者、出版社和作者来说都是一件好事。出版社也在努力地出好书,但是他们的预算很紧张,因此能投入的精力也比较少。除此之外,我觉得他们对Processing这种开源“创意”编程环境并不太熟悉,他们擅长编辑计算机科学领域的教科书。

因此,对于本书,我觉得非常有必要尝试自出版。既然我无法从出版社的编辑那里获得太多编辑支持,为什么不直接雇用一个编辑?既然出版社的定价不符合我的意愿,为什么不自己制定价格(对于PDF版本,还可以让读者定价)?剩下的还有市场问题——出版社有没有为你带来附加价值并增加更多读者?从某些角度上看,确实有。比如O'Reilly的“Make”系列,O'Reilly会专门为书籍等产品建立社区。对于Processing的编程学习,只需要一个简单的URL就能增加更多读者,那就是processing.org。

遗憾的是,很快我就发现有一种东西出版社能提供,而我却没法通过自出版途径得到。那就是截止时间。若独自做这件事,我可以挣扎两年,宣称自己在编写这本书,事实上却只懒懒散散地写出寥寥数页内容。在我的待办事项里,写书这件事永远被排在最后面。于是,我就找到了Kickstarter,Kickstarter中有许多对本书内容感兴趣的读者(他们还会为此付钱),于是我就有了截止日期的压力。现在你能读到这本书应该归功于这个网站。

最重要的是,自出版允许我以很灵活的方式发布内容和制定价格。在Elsevier的网站上,你可以用53.95美元购买Learning Processing电子书,在这53.95美元中,我能获得5%的分成,也就是2.70美元。如果用自出版的方式出版这本书,我可以制定更便宜的售价,比如10美元的价格,这能为读者节省80%的开支,同时也让自己得到3倍的收益。我甚至还可以让读者自己对PDF版定价。

由于我拥有本书的全部内容,因此还可以用其他数字方式出版这本书。本书的内容和全部源代码皆采用知识共享署名-非商业性使用的许可证,你可以在Github上获取全部内容。除此之外,你也可以在Github上提交问题及要求,进行纠误及评论。最后,由于本书使用了灵活的按需印刷服务,因此我可以时常发布新版本,让内容保持最新。(对本书的一次购买就包含终身的免费升级。)

因此,我要感谢Kickstarter公司(尤其是Fred Benenson,他说服我决定冒险,并指导我选择合适的许可证)和本书的全体支持者,在这里,我还要特别感谢下面这些热心的支持者:

  • Alexandre B.
  • Robert Hodgin
  • JooYoun Paek
  • Angela McNamee (Boyhan)
  • Bob Ippolito

所有支持者都对本书的出版做出了直接贡献。他们对初稿和定稿的捐款让我有更多动力完成写作,而且让我得以支付设计和编辑费用(包括在周六上午写作之时,雇人照看小孩)。

除了捐助资金,Kickstarter的用户还审读了本书的预发布章节,期间提供了无数反馈,指出了本书的错误和混乱部分。我要特别感谢Frederik Vanhoutte和Hans de Wolf,他们在牛顿物理学上有深厚的功底,为本书的第2章和第3章提出了很多建议。

目录