如何在两个月内快速教会女友编程
英文原文:How my sister n my girlfriend learned to code
就像我前面日志里提到的,伊娃和芳来旧金山跟我学编程。在这篇博客中,我会介绍我是怎么教她们的,我构建教她们的方式的理由,以及这种方法是怎么起作用的。按时间顺序去列明她们所学到、做到的那些事儿很简单,但是,这没什么帮助,而且你也容易错过重点。重要的是要了解详情,以及为什么它管用,所以我将从基本原则来开始。做好准备,文章比较长。
在你的整个编程历程中,以下原则要牢牢记住:
1)传播:
在伊娃和方开始之前,我为她们创建了个博客。我告诉她们,记录下她们的编程之旅和她们所学到的。在开始的时候是很难的,你可以问她们。我花了一个星期的唠叨,她们才写一次博客。但现在,如果不写写她们花了大把时间去做的那些项目,则像是错的了。
如果你在你的项目里用的是API(应用程序编程接口),发微博或者邮件给那公司,告诉他们你对他们的API的想法。当你在你的编程马拉松里获得了一个奖励,写条好微博@他们以示感谢,或者发篇日志。让这日志空前美好,然后推荐到黑客新闻栏目,就像它必将登上首页一样(尽管大多数是不会的)。
给你的编程之旅一个健康的传播过程的最大好处是,它让你对你的项目负责任,这也就引入了我的下一条原则。
2)完成:
芳和伊娃都知道,完成一个项目是很难的,但也是很重要的。我说得很清楚,除非她们写一篇日志,在twitter上@那API公司,或是在黑客新闻版上发这项目完成的消息,我们都不会启动一个新的项目。尽管第一个项目只是一个井字棋游戏,但这是她们做得最好的井字棋游戏。你从来都不想写一个蹩脚的程序,所以多么简单的或不相干都不重要。如果你要写一个项目,那它必须是你能写出的最好的程序。我已经见过太多的程序员在一些看不到黎明的非正式项目上费时耗力。如果你正在学习编程,你必须从一开始就学习,珍惜你的时间和精力,完成您的项目来证明它。
最后的20%需要80%的努力。开发人员可以一两天就能把“点子”变成具体可执行的。而要发布一个“完美”的产品,需要两倍的时间来完成每一种情况下的测试,解决每一种临界问题。把80%的精力都花你项目最后的20%,这将在许多许多访问中成就传奇。
3)思考:
如果你被卡住了,请不要直视你的代码。出去散散步,呼吸一下新鲜空气,并考虑一下吧。你被卡住了,是因为你的逻辑出了错,而解决的最佳办法就是在脑海或者纸上一步一步地理清楚。程序员获得高额的酬劳是因为他们在思考。问题解决是依靠你的思考,编写代码就是这么可恶的工作。优秀的项目经理通常有一个丰厚的程序背景,并且在思考和解决问题方面训练有素。
根据这种说法,如果你被卡住了20多分钟,而且你也无法突破,那就问别人吧。如果你20分钟都没有得到任何线索,那么接下来的一个小时你不会有更多进展。信托伊娃。她有一天浪费了5个小时,就因为一个愚蠢的错误,实打实的教训啊。散个步,去干点儿别的事儿。然后再回来搞它。能够脱离出自己的问题,转移注意力是一个技巧。
4)再思考:
现在你可能想通了,思考在一个程序员的生活里地位重要。请一定不要——特别是如果你正在学习如何写代码时——复制粘贴代码。如果你想学习如何怎么写代码,复制粘贴—— “你看,它成了!”——不会让你有任何突破的。相反,当你看到代码,你必须理解了它在做什么,再去尝试调试它。当你越来越能驾轻就熟理解别人的代码时,把它简化到恰好满足你的需要,然后再写出来。如果你从初学阶段就习惯这么做,在几个月里你就可以成为一个非凡的开发者。
5)谷歌:
学习如何自己解决问题。除非你被卡住了至少20分钟,不要询问编写代码的问题。程序员必须独立。他们是伟大的思想者和伟大的传播者。要成为其中一员,你必须有逻辑地思考,并找出问题发生的原因。很多年轻的开发人员所面临的一个问题是,他们很难写出他们真正需要的东西。我们很多人都经历过这个过程,你知道问题是什么,但是你不知道怎么去找到它。你必须从初学阶段就学会正确地开发程序,这是个技巧,它很好地回扣了第一点里说的传播。
现在,记住了这5个点,来看看伊娃和方学习的时间表:
第1-3天:通过Ruby学习编程的基础知识。
我选择了Ruby,因为用来上手编程它是最简便的。Ruby的语法限制很少(空格与制表符,类型声明等),因此伊娃和方能够专注于编程的思想过程,而不是去攻克语法规则。她们学会了if语句,循环,数据结构,并解决一些编程题目,如FizzBuzz(译者注:当满足一定的条件时打印Fizz或者Buzz或者FizzBuzz,是初级编程训练题目),替换字符串中的字符,转换一个数组,找出最大值。重要的是要了解类和对象。
*注意*我不教她们Ruby的特定语法。我告诉她们对参数要始终使用括号,而且每个函数结束时一定记得返回。这样一来,当她们学习其他语言时,上手更快。
第4天:HTML
HTML和CSS严格说都不算一种语言,所以没有必要花太多的时间在这上边。伊娃和芳花了一天时间在HTML上,并且玩了一些标签,还研究了表单、信息页,等。我确信,她们只用HTML标签。这将建立起用CSS的兴奋。在这里需要重点学习的是区分块HTML与内联HTML,区分标识与分类。
第5天:CSS
在玩了HTML后,“你怎么把这个放那儿,你怎样让这个丑陋的HTML页面更漂亮?”的问题来了。CSS是一个完美的答案。今天就开心地让你的网页更有型吧(所有的HTML页面都是前一天做的)。这里学习的重点是相对/绝对/固定定位,HTML元素流,绝对和固定定位如何控制元素,以及正常的浮动。
第6-7天:用jQuery来做JavaScript
jQuery需要一点点努力来习惯,因为有的程序涉及到jQuery的框架,这需要一点儿时间。花了几天时间,让她们的HTML页面有交互性。
第8-15天:第一个项目——井字棋游戏
在这一点上,芳和伊娃了解了HTML/ CSS/ Javascript,但还没有很好地适应之。这是启动她们第一个项目(井字棋游戏)的最佳时间。尽管她们在2天内完成了这个项目,优化它又花了好几天。最后的20%需要80%的努力,这是事实。作为初学者来说,重要的是学习来完成你的项目。
第16-20天:Sinatra
在那个像是从来不能完结的井字棋游戏之后,学新的东西对芳和伊娃来说不能更激动人心了。学习服务终端代码对于她们一直在做的事儿来说是全新的体验。我选择sinatra因为它是我所用过的最干净、简单的web框架语言了,而这种简洁性让解释web的运作变成小菜一碟。
第20-22天:Photoshop
Photoshop对于绝妙的设计非常重要。对那些从来没有用过它的人来说,它足够唬人(至少一度对我是的),但是借助Photoshop创立的网站,比起那些传统的前端框架网站要高一个档次的。而且事实上你只用知道混合选项就够了。任何一个相当成功的开发者都会需要Photoshop,所以学会用它很重要,并且要用它服务你所有的项目。
第20-27天:第二个项目—— “拖图片”
项目大量涉及JavaScript的运用。该项目涉及使用Ajax请求,Facebook的API,和Cookies。这是一项联结其所有web编程基础的大工程。这个项目涉及的范围大于第一个项目,我觉得这是向更复杂项目迈进的一大步。在此期间,他们通过GIT合作。这是一个开源项目!
第28-30天:RSpec
至此,芳和伊娃已经适应了构建Web应用程序。也是到这个关头,她们已经意识到代码多么容易打破,而一个改变又如何摧毁一切。现在,测试驱动开发适时引入。我们在RSpec上花了几天时间,伊娃和芳用写测试案例当每天早上的编程练习。我有没有提到她们每天早上都要解决一项技术问题?从第28天开始,她们不得不在她们开始写代码前也写些RSpec。
第30-35天:BackboneJS
着手与一个涉及较广泛的项目(比如“拖图片”),你可以学到很多东西,并且遇到一些你希望有更好解决办法的问题。只有这样,你才真正欣赏那些帮助过你的的框架的意义。我还没有找到很好的BackboneJS的教程,所有教程都一下子提供了太多的信息。我是这么教的:
首先,了解模型。创建一个模型,而且仅供一条数据库条目所用。学习如何修改它,将它保存。
其次,学习视图。为你之前一直在做的那个模型创建一个视图。添加事件侦听器,领会视图如何如此贴切地绑定模型,以及这一切又是如何彼此贴合。
第三,现在就可以说清楚集合的意义了。你不能手动键入每一个的模型,特别是如果你不知道有多少模型时。
我们从来没有学路由的课程。我还不觉得路由重要。
第35-40天:Android
如果你还没有完全注意到没有,我们已经在很短的时间里涵盖了很多的东西。好程序员需要时刻适应变化,所以我们的最后一个项目是学习Android。在编程中,你不能忽视移动终端,它太重要了。我教了她们Android编程。这不是很辛苦,Android编程和web编程是非常相似的。你有了视图的XML(可扩展标记语言),你就有了可以与网络控制器匹敌的Java代码。模型-视图-控制!通过使用Ruby和JavaScript,芳和伊娃开始寻找编程语言的相似之处,让她们与特定语言脱离关系。对她们来说,编程语言有不同的语法和相同的工作方式(并非事实,但我们会稍晚些区别,以避免混淆)。