【译】I know how to program, but I don't know what to program
湾区简评:这是很多初学编程的人,尤其是通过大学里的编程课学习写程序的人面临的问题。除了刷编程竞赛题、做课后编程题外,写程序能做什么?文章给的建议我赞同:先尝试去写自己也会用到的自动化的小工具。如果顺序反过来,已经知道要做什么了(比如做网站、做某个具体功能的app、做某个有实际用途的工具),再去学编程,会不会效果更好?
【译】我知道如何编程,但是我不知道拿来干什么
当我面对刚入门的开发者时总有一个重复的主题。他们已经把他们的时间投入到学习一门或者两门编程语言的基础上,并且他们轻松地完成一些编程练习,但是他们不知道怎么接受他们已经学习的东西。通常来说,就像“我知道如何编程,但是我不知道编写什么程序”。标志性的回答是“完成一些编程挑战”,“给开源项目贡献代码”或者是“做一款游戏”。
完成编程挑战有益于脑力练习,但是它们却在人们学习如何创建一个新程序上的帮助很少。给开源项目贡献代码是一个提高的方式。你可能会学习到一个真实项目是如何架构的,并且在编程语言方面提升你的技巧,但是不会学习到很多的关于一个项目整个生命环的内容。某些项目非常复杂,这可能会对新手来说是非常恐怖的事。编写一款游戏是另一个提高的方式。游戏是有趣的!我以前曾开始用 QBASIC 编写游戏。然而发生了同样的困境。“我想要做一个游戏,但是我不知道做什么游戏”。
教导音乐系学生跟编程一样,我已经意识到在音乐系学生中存在同样的模式。“我知道全部的和弦,并且我弹奏很熟练,但是我不知道怎么样写一首歌曲。”在音乐中,我们确实有一个很好的解答。在学习创作中有一个途径。音乐家通常不仅仅从一开始就写自己的音乐。有些音乐家永远不会向拼凑音乐和花掉一生时间演奏他人音乐的方向发展。在编程的世界,态度有一点不同。
在软件社区有一个规则是“不要重复发明轮子”。当一个成熟稳定的选择存在时,如果你重写一个库通常是不被赞成的。虽然这对于一般人来说是一个好的规则,但新手不应该害怕重复发明轮子。当为了学习或者练习完成时,发明轮子是可以的!它是学习中一个重要的部分。比如,编写你自己版本的 ls,mv,wget 或者 cowsay 命令。如果你想要走游戏路线那可以克隆 Pong,Tetris 或者 Space Invaders 游戏。它们不需要全部相同的特点或者精确复制,但是你可以带着你的目标和空白的计划开始编程,你要把游戏实现出来。
在你写程序之前不要有’必须有个最佳的 idea 才开始动手’这种念头。我见到过在音乐家中有相同的心态。在他们第一次尝试时就努力创造一个高水平,这花费他们全部的精力投入到一首乐曲中。长远的是你将会写出很多很多乐曲,不仅仅是这一首。你完成的第一支乐曲可能不好,你很可能抛弃它。这没什么。在你第一次尝试时,不要试着想要写出最好的章节。你需要学习谱曲的过程。在你写好程序之前你将会编写出糟糕的程序。迈过它,征服它,获取经验你就能开始在需求上自由创作发挥。
我们告诉人们用“Hello , world”做开端。因为这是他们行程的一个点,完成这个以为这征服了一个基础原理。你就理解了如何编译,如何运行,如何调用一个函数并且给它传递参数。编写一份已经存在软件的克隆版本是另外一个大的进步,跟 hello world 同等重要。当你完成它时,你已经克服了很多挑战。你已经发现哪里开始,如何计划,怎么组织,如何处理 bug ,给它一个人为的处理,并且打包最后它就成为一个可用的版本。即使你编写一个简单程序的克隆版本,你也能学习到全部过程。
你可能会好奇如何克隆已经存在的项目,它将帮助你产生一些新想法。比如像音乐,它需要创新。演奏他人的乐曲怎么做才能帮助你谱写自己的乐谱呢?你必须首先理解其他人。你必须去了解他们如何创作的,还有他们使用了什么模式。当你做完这些足够时间你就开始着眼以后,并且你已经有丰富的知识用来总结。你将从不同地方学习到的小部分音节组合在一起,并且重复一些你了解的模式。你可能改进,组合,或者完全打破你学习到的这些模式。就像他们所说的,你需要了解规则目的是用来突破他们。在编程过程中我们也有通用的模式比如 MVC 。这是一个稳定的被接受的编写软件的模式。在音乐中,我们也有通用的模式。比如 I-V-vi-IV。当然它不是唯一的一个,但它是已知很好的一个模式。
总而言之,这是经验和创新的一个组合。创新是一部分人们经常在编程过程中被忽略的但他非常重要。你曾留意过有多少程序员也同样是作曲家吗?乐曲包含很多技术上分析,架构,模式尽管很多人认为他是一个纯粹的创作行为。编程是经常被看成技术性的动作尽管它多数是创作性的行为。你可以在复制其他项目过程中培养创新性。伴随着你逐渐完成他们,你将会发现你有了自己新的想法去改进程序,抑或是一个新的带有些许个性的特点被添加进去。它将会为新项目启发思路。创新随时会出现,但是你需要先学习如何把它首先谱写成歌曲。
总有一天,你将会发现你将能够为所有事编程。你可以让任务自动化并且处理问题熟练。当你面对将会使你没有时间应对的诸多事情时,你处理起来也会没有问题的。你也将有能力随时解决问题。“哦,这有一个100个Sheet的表格需要被格式化,拆分成文件,转成一个 CSV 文件?马上就解决!”不要耽误时间去尝试做未来最好的事。编写一些你将会使用到的东西。其他项目的点子也会随之而来。
你们中有多少人已经处于你想象的“我不知道写什么程序?”这种的状态?你是怎么解决它的?如果处于这种状态你有什么建议?
湾区日报推荐
豆子简评:对自己有一些启发,现在转职专门做前端相关的工作时间不长,从 J2EE SQL … 到 HTML CSS Javascript NodeJS … 。虽然可以达到基本熟悉一门新的编程语言可以花费不长的时间这样一个状态,但是一直没有找到很好的办法在接触到一个新技术或框架时,短时间地拿着这些“新工具”去做事,其中原因很类似于“I Know how to program, but I don’t know what to program.”,先造一些自己能用得上的轮子吧,在自己的 Lab 页多更新。