@hanting003
2016-05-16T11:29:44.000000Z
字数 3009
阅读 839
未分类
【编者的话】近期,一篇名为“I know how to program, but I don't know what to program”的文章在reddit网站上引起了热议。作者NanoDano将编程和作曲做了类比,总结出编程和作曲一样,需要在仿写别人作品过程中学习和总结,然后才能整合自己所学的知识,得到开发好程序的灵感。网友们对作者所提出的问题——“你有没有遇到过‘我不知道编什么的’情况呢?你是怎么处理的?你会给处于这种情况的人什么建议呢?”进行了热烈讨论。
我发现刚开始做开发的人都存在一个问题,他们把时间花费在学一两门编程语言的基础语法上,并且以练习编程题来寻求满足感,但却不知道如何运用所学的知识。我常常听到有人说“我知道如何编程,却不知道编什么”。回答这个问题的典型答案是“参加编程挑战赛”、“给开源项目做点贡献”、“编个游戏”。
参加编程挑战赛能很好地锻炼心理素质,但对如何创造一个新程序的帮助甚少。为开源项目做贡献只是一个步骤,你可以从中学习一个真正的项目是如何架构的,可以提高你对编程语言的理解,但是从中学习不到项目的完整生命周期。有些项目特别复杂,甚至会吓到初学者。开发游戏非常有趣,我是从QBASIC语言开始去开发游戏的。但是一去开发游戏,同样的困境又出现了——“我知道怎么开发游戏,却不知道开发什么游戏”。
作为一个在编程的同时还教学生学习音乐的人,我发现学音乐的学生也有类似的问题:“我认识所有的和弦,而且手感也很好,但是我不知道怎么去写一首歌”。对于音乐来说,我们的确有好答案,学习如何创作有一条路子可走。音乐家在一开始的时候并不是直接去写作品的,有些音乐家一辈子都在演奏别人的作品,在创作上没有什么进展。但是在编程的世界里,对待创作的态度却有所不同。
在开发社区中常见的态度是“不要重复造轮子”。如果你有一个成熟和稳定的大轮子可选,那么再造一个这样的轮子的确是不可取的。但是一般情况下,初学者不应当害怕重造轮子。在学习和练习之后,造一个轮子有何不可!这是学习过程中重要的一环,例如,写个你自己版本的ls、mv、wget或者cowsay。如果你想走游戏路线的话,那么可以仿写一下Pong, Tetris 或者 Space Invaders。不需要把所有的特色和功能都一一精确地仿写,但是你要有自己的目标,从零开始,一步一步去做。
在编程时也不要有那种等有了最好的想法再去开始写的心态。我在一些音乐家身上见到过这样的心态。他们在开始写第一首歌时就倾其所能,在这首歌上花费所有的精力,却看不见更远的事情。更远的事情就是,你会写很多首歌,而不是一首歌!你写的第一首歌可能写得并不好,你以后会扔掉它。这很正常!不要试图在你第一次尝试时就写出什么传奇的音乐巨作中最好听的那么十分钟的音乐。你需要学习创作音乐的步骤,积累经验,每周练习。同样,在编出好的程序前,你会编写出很多烂程序。克服它,摆脱它,从中吸取经验,然后你就可以在有了需求时随性创作了。
我们告诉大家从输出“Hello, world”开始编程之旅是有原因的。因为在大家的旅途中,完成它意味着掌握了一系列的基础知识。你知道了如何编译、如何运行、如何调用函数以及如何传递参数。仿写一个现有的程序是另外一个重要的步骤,和输出“Hello, world”一样重要,只是它属于另外一个阶段。当你完成它时,你就克服了很多挑战。你需要弄明白怎么开始、怎么规划、怎么组织、怎么处理bug,然后还会给它加上个人功能,到最后再打包发布,使之成为可用的一个程序。即便是你仿写了一个简单的程序,你也是在学习这些过程。
你可能会困惑怎样仿写现有的程序才能帮你获得新的灵感。其实,就像音乐一样,它也需要创造力。拿音乐来说,怎样演奏别人的歌曲才能帮助你去学习写自己的音乐呢?首先,你需要理解别人是怎样开始第一步的。你需要明白他们怎样去架构的,以及用了什么样的模式。在足够的分析后,你就可以看到更远的事情,也会有了足够的知识来利用。你可以把在不同地方所学习到的碎片知识组合在一起,使用一些你看到过的模式。你可能会对这些模式做一些调整,然后把它们组合起来,甚至打破这些模式。在编程世界中,我们有些常见的模式,比如MVC。对于写程序来说,这是一个比较稳定而且受欢迎的模式。在音乐方面,我们有常见的和弦,例如I-V-vi-IV。当然不是只有这一种,但它是一个需要你知道的好模式。
总之,这都是经验和创造性的结合。创造性是人们在编程过程中容易忽视的一方面,但也是至关重要的一方面。你有没有注意到许多程序员也是音乐家?虽然很多人认为音乐只是一个纯粹创造性的努力结果,但是它包含了很多技术分析、结构和模式。编程虽然是一个创造性努力居多的行为,但它却通常被视为一个严格的技术行为。你可以通过仿写程序来培养创造力。当你去仿写时,你会发现自己在调整这个程序,甚至会加上个人功能。这将激发你构建一个全新项目的灵感。创造力正在来的路上,但是需要你先翻唱一些歌曲。
长此以往,你会发现你几乎能够编写所有的功能。你可以自动完成任务,解决实际问题。你会发现你有一长串的事情要做,但是却没有时间。你能够快速地处理问题——“哦,这是一个Excel电子表格,里面有100张表,需要重新整理格式,并拆分为单独的文件,最后再转化为csv格式?马上来!”不要为了试图做成一个最好的东西而困扰,项目的灵感会在你学习的过程中出现的。
你有没有遇到过“我不知道编什么的”情况呢?你是怎么处理的?你会给处于这种情况的人什么建议呢?
“我想我就存在这样的问题,而且我因此对编程失去了兴趣。我已经学了一堆的编程语言,无数的教程,但是对我来说没有什么太大帮助。对我来说,问题不是“不能”,而是我在项目里很快就失去了兴趣。我没有什么好想法能让我想坐下来长时间地去敲代码……我觉得自己最滑稽又最可悲的一点是,我能和别人在讨论编程,讨论概念和最新的技术,但是被问到正在做什么项目做过什么的时候,我只能回答“额……这个嘛……”。我发誓,和我那些是专业开发人员的朋友们相比,我比他们大部分都要好。但是他们都做了很多项目,我却在这里浏览Reddit、HN,看愚蠢的教程,这些都跟实际的应用开发没有半毛钱关系。(网友:_ferz)
我不认为“我不知道编什么”的这个问题是文中所说的,我觉得问题在于没有什么值得编的。做个人项目的感觉非常低效。(网友:fruitbooploops)
我尝试过去向别人学习,但是发现对于我这个完美主义者实在是太难了;有时候有一些想法……但是我能看出来它会消耗我几个月的时间,所以我就没有了兴趣,然后什么也没做成。(网友:tluyben2)
我觉得这种情况不常见……我觉得大部分人所遇到的情况是“喂,我有一个做应用的灵感,你要能给我把它做出来的话,我就分给你10%的钱”。(网友:Wulfhetinn)
我曾经有一个想法,而且有足够的时间去编程实现,但是没有得到反馈。对了,也有那么一些反馈“你在做什么?你应该去找一个真正的工作,不是在这上面玩!”我忽略了这些,克服了放弃的想法。但是后来,这慢慢成了现实,我发现最重要的反馈是:有人用你做的东西吗?……我觉得我们应该问问自己,克服放弃的想法是不是应该的,或许有太多的精力也是一个问题!有时候你需要的不是去努力做,而是停下了想想往哪方面做更好。(网友:son-klein)