这是一篇面向对创意编程领域(Creative Programming)、尤其是对文本式编程语言Processing 感兴趣的朋友或是初学者的文章。Processing 的初期学习曲线相对平缓,而这篇文章的内容主要聚焦于 – 自学入门的一些公开且免费的资源,除了“写代码”以外需要培养的能力,初学者倾向于陷入的误区。写这篇文章是由于2019年6月23日的一个事件以及当天我考虑后所作的决定。。。我本不是一个喜欢以及善于写文章的人。
虽然这篇文章面向初学者,但也希望在这个领域已有所摸爬滚打的朋友们可以不吝赐教。我微博的评论区一直是开放的,我也不认为删评拉黑有助于问题的讨论。只要不怀恶意并尊重事实,相左的意见我们可以沟通探讨,我遗漏忽视的地方也请朋友们补充指正。合理且确实有助于初学者的话,我会把内容加入到文章中并标注出更新的时间、补充指正者的姓名或网络ID,以及补充指正者的网站链接以示尊重和感谢。考虑到后续可能的编辑,目前(2019年6月28日)我计划会在自己的网站上更新文章的最新状态。若有希望转载此文的朋友,也请在转载文中附上文章的永久链接,便于读者获取最新的信息,谢谢。
Processing 对比OpenFrameworks,Cinder,OpenRNDR 等其他文本式创意编程工具而言历史较长(2001年发起),所以也因此它的社群相对庞大,文档完善,网络上可用于自学入门的免费资源也非常丰富,以下先列举一些公开且免费的教程资源以及相关资讯类网站。
Processing 自学资源:
Processing Text Tutorials (官网下的教程)
针对没有编程经验的初学者,我个人建议的学习顺序如下:
Getting Started -> Processing Overview -> Coordinate System and Shapes -> Curves -> Interactivity -> Array (到Array of Objects 暂停) -> Objects -> Array (从Array of Objects 继续) -> PVector -> Print -> Color -> Two-dimensional Arrays -> Image & Pixels -> Video
官网教程的其余内容可根据具体需要自学。
Processing Built-in Examples 打开Processing IDE,点击Files -> Examples(自带大量涉及各种主题的实例,代码中通常附带注解)
Third-party Libraries’ Built-in Examples 通常第三方库会自带一些实例帮助使用者理解可以用其实现哪些功能。安装完某个第三方库后,其附带的实例通常可以点击Files->Examples 并在Contributed Libraries 目录下找到。
Open Processing (Sinan Ascioglu 发起的以Processing 以及p5.js(16年改版后)使用者为主的开源社区)
The Coding Train (Daniel Shiffman 拍摄的Processing 视频教程频道,个人建议初学者可以从这个播放列表开始)
The Nature of Code (Daniel Shiffman 同上 撰写的Processing 教程在线版)
Fun Programming (Abe Pazos Solatie 撰写的Processing 教程)
Tim Rodenbröker’s Processing Tutorials (Tim Rodenbröker 19年开始撰写以及录制的Processing 教程(基本以选定某个专题为主))
*Coding Math (Keith Peters 关于编程涉及的基础数学知识的教学视频。此条目加星号,是由于Peters 使用的编程语言是JavaScript 而非Processing (Java),但涉及的数学知识其实是相通的)
Generative Design (Generative Gestaltung) 一书涉及的实例源代码。(补充于2019年11月15日)
Generative Art (作者:Matt Pearson) 一书涉及的实例源代码。(补充于2019年11月15日)
*Generative Artistry (Tim Holman 与Ruth John 发起的一个关于生成艺术的教程博客。此条目加星号,由于使用的编程语言是JavaScript)(补充于2019年11月15日)
其他相关资讯类网站:
Processing Exhibition (官网下使用到Processing 的部分项目集锦)
For Your Processing (Justin Lincoln 的Tumblr 站点,会分享一些使用到Processing 的创作/项目,相关资讯以及教程)
CreativeApplications.net (CAN) (综合的 艺术+科技 类项目资讯)
Create Digital Music (CDM) (综合的 音乐+科技 类项目资讯)
Visual Complexity (VC) (Manuel Lima 发起的一个项目聚合网站,以信息设计,数据可视化类型为主)
Data is Nature (Paul Prudence 的Weblog,以 算法+视觉形态 类项目为主)
We Make Money Not Art (WMMNA) (偏当代艺术语境下的 媒体艺术 类项目为主)
Wired (连线杂志带“艺术”标签的资讯)
除了学习编程技能本身之外,培养一些其他辅助能力会对各位朋友的自学,钻研,创作过程有很大的加持。
“写代码”以外的能力
英语
虽然可以更改Processing IDE 界面的语言,但其所有文本命令基于的语言依旧是英语,且其自带实例中的注解、上文中的自学资源、参考文档、核心JavaDoc 都为英语。即便是为数不多的书籍译本或是视频教程字幕,部分翻译上语义的偏差总是不可避免的。所以我衷心建议初学者朋友如果英语能力相对薄弱的话(尤其是学生)请认真努力学习英语,甚至可以把自学创意编程作为提升英语能力的契机。不要仅把英语视作一个考试指标(譬如大学四六级或是高考),而是把它作为一个学习其他相关领域前沿知识的必要工具。这是个务实的问题,与粉红不粉红无关。
上网
如果你在看这篇文章,你很有可能需要具备这个能力,你懂的。( ͡° ͜ʖ ͡°)
逻辑思维
在着手“写代码”以前需要先在大脑中把创意进行“量化”,或者说把想法拆解为若干并行的功能模块,再把每个模块拆解为一系列具体的步骤流程。虽然没有专业背景的初学者(尤其是艺术设计类学生)在这方面往往会略有欠缺,但完全可以通过一些方式进行训练。绘制流程图我个人认为且实践下来是一个相当有效的方法。毕竟“算法”一词原意指的就是清晰定义的用来达成某个结果的一系列步骤。在流程图设计中,无需编写任何代码却可以反映出不同结构类型,模块间的工作流方向,输入输出等等。想法->设计实现流程->发现逻辑漏洞->改进流程 整个过程的不断练习对初学者培养逻辑思维而言是非常有助益的。我个人认为这一能力的培养或许比学习怎么写代码更为关键。
*恒心
严格意义上来说这并不算一种能力,所以加了星号。。。这是一个专业跨度非常大的领域,且鲜有成熟的循序渐进的教学体系。如果各位朋友在入门(如我文章开头所说,初期学习曲线还是平缓的)之后觉得自己确实热爱,愿意投身这个领域或是以这个领域内的知识辅助/服务自己的本职,请做好投入大量时间和精力的准备,以及需要独立克服很多困难的觉悟。虽然这一点对于希望在任何专业领域有所建树的朋友都是适用的,但在这个领域尤为关键,需要不断走出自己的舒适圈,涉猎非自己专业的知识,遭遇各种壁垒和瓶颈。所以入门后愿意继续深入钻研的朋友请维持住自己的SAN值。
文章的第一部分已列举了不少自学资源,看到这里的初学者朋友们你们可能会思考自己需要啃掉多少教程才能算入门,但可能没有意识到自己或许已经陷入了一个误区。
易陷入的误区
仅阅读教程
初学者非常容易走入的误区,认为自己阅读的教程数量与自身技能是成正比例关系的。然而事实是:教程往往受限于自身篇幅,只能传授基本的命令语法以及若干典型的运用实例,但这并不意味着这些命令/结构的运用场合仅限于此。初学者朋友在学习完教程上的实例后,要举一反三,构想一些其他可以运用到所学知识的场景,自己写代码实现;亦可用曾经学到的知识深化教程中的实例,增加新的元素,提高复杂度后再进行实现。每阅读完教程的几个章节后可以考虑定一个个人小项目,综合运用前几章的所学做一个创作/实现一个功能。总之,编程是一个需要大量的自身实践经验作为支撑的技能,只摄入书面的知识与他人总结的经验是远远不够的。
笔记
这一点见仁见智。我个人在国内院校带一些工作坊的时候有注意到这个现象 – 当我在解释某个函数的具体用法、其参数指代意义的时候,一些学生的编辑器上是空白的,但他们会用笔在笔记本上记录我讲的内容。而事实上,如果学生可以用记笔记的时间直接在编辑器内输入这条命令,尝试不同的参数搭配,编译运行看到直观的效果变化,我个人觉得这种方式才是更为有效且有助他们真正理解,而不只是单纯的记忆。我和一些学生有聊过这个问题,他们其实知道他们做的笔记完全可以在文档上查阅,但他们认为记录到书面的方式比较契合他们习惯的学习方式。所以,虽然我个人不认为做笔记是高效的,但初学者朋友们找到最适合自己的方式就好。:)
抄代码 == 实现
另一个在院校工作坊教学过程中注意到的现象 – 学生在未完全理解程序整个逻辑的情况下直接抄写代码,而对某些代码区块的具体功能以及如此编写的原因却一知半解。学习一个实例的根本目的并不是完全跟着它做一个相同/类似的效果,也不是修改一些参数呈现看似不同的效果作为自己的“成果”,而是理解它的逻辑以及包含的知识点,再利用这些逻辑和知识点创造出你自己的东西。所以相对有效的学习方式是,理解实例整体的逻辑(有必要的话可以如上文中我建议的,归纳为流程图),然后在不参考实例代码的情况下,自行编写代码实现。
目前(2019年6月29日)想到的可能就是这么多,但如我在文章开头所说,我非常欢迎在这个领域有经验的朋友可以给我反馈,分享你们关于创意编程入门的一些见解。我自己有想到任何需要补充的内容也会抽空更新到文章内。
最后希望这篇文章有帮助到对创意编程领域感兴趣的朋友以及初学者,也希望未来当你们在领域内有所建树的时候也可以和“后浪”分享你们的真知灼见。维持一个新兴领域(虽然用编程做创作可以追溯到20世纪60年代的Bell Labs 甚至更早)的健康生态并推动它的发展壮大需要所有人持续的努力。
Pingback: 从零开始学习 Processing合辑 | Alan Hou的个人博客