愤怒机器
我想要澄清一些事情:我所描述的流程听起来非常线性化和直截了当。那是因为直到目前为止我都在描述行得通的程序,而没有描述那些行不通的项目。
编写一个有用的以及可以运行的网络应用程序有点像把一个拼图放在一起,而同时又带有一些额外的挑战:你不知道哪些拼块存在,你必须得自己创建一些拼块,而如果你犯了一个错误,这个拼图就会爆炸。
这是我的编程流程实际看起来的样子:我首先会产生一个关于部分程序将如何运作的想法。我编写一些代码,测试它,然后它毁掉了这个程序。我会尝试修正它。有时候我的修改可以解决程序的问题,有时候却不能,而且有时它甚至会毁掉更多的东西。如果我被严重卡住,我会在Stack Overflow或谷歌上搜索错误消息或程序库。
当你仍然在学习各项技能的时候,你的应用程序瘫痪的次数比运行的次数还要多。你应该也已经了解到了一些事情的价值,比如说版本控制,它可以让你的代码返回之前可以运行的版本。
还记得我之前提到过我不是非常清楚git的作用吗?是这样的:如果你正在编辑文档,然后一些程序瘫痪了,你可能无法发现哪些程序出了问题。返回之前可以正常运行的版本是天赐之物和一种解脱。如果不能返回,你就只剩下恐慌了。
在我编写侧边栏的添加功能的时候,我把这个应用程序弄坏了。我试图找出哪里出了问题,但是我无法弄明白。如果我还有头发的话,我早就把它们拔光了。
就在那些时候,你意识到了git branch和git merge:的价值:你可以创建程序的实验性版本,然后进行修正。如果你的代码行得通,你可以将它合并到原版当中。如果你把事情搞砸了,你可以删除你的实验性版本而又不会丢掉之前所有的工作。
编程是一件艰难的工作,而且有数以百万计的方式将它搞砸。计算机是无情的,并且不需要承受恶意命令的痛苦。同样地,我们非常容易忽略一些会产生意想不到的后果的小细节。我曾经有段时间被一个软件缺陷整惨了,它把大量的空白记录储存到数据库当中,而且显示在“列出所有项目”的页面当中。
每一次我看到那个网页都会发现更多的空白记录项出现在列表中,而我却无法弄明白它们是怎么来的。结果是“列出所有项目”的路径存在一个缺陷:我使用了一个不正确的命令来检索数据库中的记录。
每一次我弄坏一些东西,都会学到一些东西。那就是编程的其中一个潜在好处。在所有的反馈循环当中,计算机是最快的。如果你做错了某事,你立即就能够知道。如果你做对了,你立即就可以看到程序运行的结果。如果你能避免将计算机扔到房间另一边的冲动,那就把你的计算机放在房间,即时反馈能使编程非常容易上瘾。
在开始进行这个实验的时候,我根本无法编程,而现在我可以了。我需要做的就是花费一些必需的时间来击败一些代码,而无论何时被卡住,我都会推动或进行一点研究。
我从我的努力当中获得了什么呢?一大堆。我学到了什么是编程,它是什么样子的,以及为什么它是有用的。我学到了怎么使用Ruby从头开始创建真正可以运行的网络应用,然后推送它们到生产服务器。我学到了Sinatra、Heroku、Jekyll、DataMapper和Rake的基础知识,以及其他我可以用来创建有用的新应用程序的多用途工具。我学到了如何排除错误和找到缺陷,然后解决它们。