最近收到一封朋友(不是软件工程师,但是在一家有名的硅谷科技公司工作)的邮件,问我能否给她提供任何好的“基础编程教程”供她学习。
作为一个自学成才(绝大多数都这样)的工程师,同样的问题我已经碰到好几次了。 “learning to code” 的概念在校外获得了广泛的认同,甚至连奥巴马也推荐它。类似 Codecademy 和 Khan Academy 的工具还有在线教程像 Stanford’s CS106A 会帮助你踏实得走好每一步。
令开发者们喜闻乐见的是人们已经将视角转向了科技和软件以及思考“我应不应该在大学里学习计算机科学”。我们已经将 “learn to code” 比作颂歌一般,当朋友和亲人或是同事向我们咨询关于新的软件应用,或者向学生建议开发相关的重要技能时,我们会重复这一点。
但是简单的推荐 “learn to code” 让我感觉有点偏离它的初衷, 因为它没有说明编程和编写软件实际都和“建造实际的东西“有关。
词语 “learn to code” 微妙得暗示 “coding” 或者 “programming” 本身就是一个有价值的结果,但实际上并不都是,我们也不应该把这种印象带给那些刚刚开始从事软件开发的人。学习如何用 python 实现求3和4之和或者学习用 javascript 写一个 if 语句的想法让人感觉荒谬。
我意思也不是说学习基础不重要,不是必须的。创建一个有用的软件某种程度上是一个复杂的过程,而做菜却不是。 “Learn to cook” 你只需遵循烹饪书中某个基础的教程,还有一些简单的诀窍就能在做菜方面提升一大步。
其实许多行业遇到的问题恰恰相反。 开发一种新药需要花费数年来研究、训练和实践。这也是为什么我们未曾见过哪个总统鼓励每个人花费1小时来 “learning chemistry” 。软件开发拥有一种魔法,能让人很容易上手,即便如此,其依然存在大量有趣和复杂的问题等待着解决方案的出现。
对此我们不必忌讳。作为 “learn to code” 的替代,我们应该鼓励新人去 “learn to build” 。代码仅仅是一个构建事物的工具。由于软件是个人能构建的最强大的事物之一,这说明越来越多的人应该学会构建它。 Learning to code 是学会构建软件的第一步,但是学习不能止步于此。
学习构建的问题在于它不能在课堂上被真正的传授。你可以传授技能,但构建不是技能。它是一种心态。将周围的软件看成可操控的,并找到操控它的方法。这种心态只能来自于亲身实践的经验。
所以我建议我的朋友多多亲身实践,具体如下所述:
从基础开始。 选择一个基础编程教程。熟悉变量和数据类型以及控制结构和函数。加深对编程语法的理解会帮助你发现更深层的问题,这会在你遇到坑的时候起到至关重要的作用(坑可能会很多哦)。
找一个项目。 与此同时,在工作或者在学校寻找一些已经设计好的软件系统或者是你经常使用软件,但是你认为它在某些简单的地方处理的不够好。它可以小到像一个让人感觉不爽的错误提示消息,你老是看到它以至于你想去掉它。尝试去解决一个已知系统中的一些小问题。
解决一些小问题。 不要花费超过两周的时间在基础编程概念上,除非你真的乐意(即便乐意,最好放到一个月之后)。一旦你熟悉了基础编程,可以去做一些接近商业的编程: 试着去解决你遇到过的小问题。学习曲线在这里很容易就搁浅,而且很容易让人感觉沮丧,和你认识的懂软件的朋友聊一聊将会有很大帮助。
不要辍步。 一旦你解决了一个问题,或者之前在电脑上无法运行的软件在你的尝试下运行起来了,你会感觉到一种胜利的召唤。 和困扰决斗,拍拍自己的大腿,然后继续战斗。Bite off a bigger chunk. 如果对现在的项目感觉厌倦了,那么找一个新项目。和人们分享你在做在学的事情,获得下一步做什么的想法。
发明一些东西。 最终你会拥有足够的经验从零开始构建项目。这是一个令人惊奇的高度,你绝对会从中受益如果你有足够的时间和对它的渴望。不过即便没有达到这个条件,你依然会提升辨识问题的技能,找到解决的方法然后搞定它。希望你能帮助下个只身一人并且想要 learn to build 的家伙。
我也提醒她可能会面对的问题:
软件的作者不希望让你获得它的源代码副本。想方设法得找到破解的办法。通常在学校或者工作中改进一个内部工具活系统会比改善一个外部事件导致的政治问题要容易的多。开源项目看起来是一个好地方,因为代码很容易获取,但是请小心它们严格的保护并且入门比想象的要难的多。
起先你不知道如何进行一项小的改变。因为通常任何有用的系统都很复杂。不要担心,这太正常了。 从整个项目文件中搜索关键接口的名称开始。一旦你找到了,修改它来证明你有能力操作电脑,使它按你的意图行事。
你可能会变得沮丧。当然,大多数的事物是十分复杂的。向懂这个系统工作原理的人请教来弄明白你纠结的地方。确保你得到了一个解释,而不仅仅是一个解决方案。只要你尝试做出一些积极的改变,大多数的人会很乐意帮你来解决问题。并且如果你能表明自己做了许多的努力来尽可能的理解问题,那么应该很容易就会有人来帮你。当然也有例外,不过那些人都是傻逼,过着勉强糊口的日子,不要理他们。
假设我的朋友遵循了上面的步骤并且 learns to build ,接下来是我下一步要告诉她的:
你做了一次又一次。你学会了迭代。你明白不存在已完成的事物,一切的事物都是可以被改进的。你学会了在资源有限的情况下决定哪件事物更值得被改进。和周围的伙伴分享构建的知识,这样你们可以一起参与构建。
myBlog:http://wtser.com
from: http://benton.io/tech/2014/03/28/learn-to-build.html
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。