白驹过隙,这篇文章距今已有一年以上的历史。技术发展日新月异,文中的观点或代码很可能过时或失效,请自行甄别:)

学习之前,想下你编程来做什么

要知道编程就是开发点儿东西,当你对这个终极目标有了感觉后你会对这条道路有更加清晰的认识。如果你的目标是“学习编程”却没有一个你想写的程序并如何让你的生活更加美好的话,你会发现这将是一个令人受挫的经历。

我羞于承认我学习电脑科学的动机是证明我是一个聪明人并藉此得到一份高智商的工作。我想到《数学理论》(这本书在我易受影响的年纪深深打击了我)和电脑程序正好符合我的要求。虽然它没有支撑我很久,但我找到了让科技与我喜欢的音乐、艺术建立联系的方法。

所以,你想学编程来干什么呢?上网?游戏?iPhone应用?发家致富的法宝?互动艺术?还是完成你老板或同桌繁琐的任务让你有更多的时间来浏览水獭照片?或者你仅仅想让自己更有职场优势,给你的简历画上更靓丽的一笔,亦或仅仅为了完成你的编程作业?所有的这些都是一个有价值的目标。确保你知道哪个目标是你的,并且相应的学习。

它一点都不神秘

编程和其他技能一样没有任何区别。就如学习一门语言,需要掌握相应的词汇和语法;如同数学,通过解决不同类型的问题来工作;和其他的技艺和艺术创作一样,需要技术和工具以及人们反反复复的最好练习,擅长处理纷繁复杂的任务最后任你所用、修改,抛弃。

有个家伙(非常聪明的一个家伙!他的其它文章我也很赞同并且经常引用)假设在那些编程高手和那些缺乏专业能力却又想要取得成功的人们之间有一条明显的界限。在他看来,这条线就是指针和递归(对好奇者到处都有入门书籍)。

我在学校期间学习了指针和递归,当我掌握了它们后,我被深深地震撼,这种知识上的快乐让我第一次想学习电脑科学。但是课堂之外的练习,那些我不得不通过熟悉其中一个概念来把事情做好的次数变得相对地小了。当我在帮助其他人学习的时候,无数次看到人们完成有趣和有回报的项目,却不需要知道任何一门知识。

怀疑或者猜测你自己聪明与否没有如何意义。诚然,你的任务越晦涩难懂,为此你就得需要掌握更多的技能。但是这在其他任何行业都是显而易见的。除非你准备让你的代码充满你的生活,你不必为了完成你需要的事情而强迫自己变成理解递归的天才。

第一次绝不会运行

或者第二次甚至第三次它都不会运行。

当你开始学习编程的时候,你很快会有这样的经历:你按照你的思路写了代码,你检查了一遍又一遍,但是。。。它仍然不能运行。对于哪里开始出错,该如何解决你是一筹莫展。出错信息(如果你足够幸运的话)大概也会让你骂一句:艹。这个时候你或许准备放弃,因为你认为你永远都不可能能征服它。我也有过这样的感觉,那是在我第一次写C++程序的时候,因为我自身的原因,在运行时只出现一句话“段错误(segmentation fault)”。

这种事情对所有的程序员来说都是司空见惯的,它与你是否聪明、是否懂科技,以及适合当程序员没有丝毫关系。当你是一个新手的时候你遇到这种情况,当你成为一个有经验的程序员后仍然会遇到。而最大的区别是你如何对待它。

我发现在新手和有经验的程序员之间最大的区别就是信仰:相信它是因为一个明显的逻辑错误、相信程序能够修复、相信总有一个方法能够达到目标。从“不能运行”到“能运行”的路可能不是很明显,但是只要有耐心你总能发现。

总有些人会告诉你在做错误的事情

大括号应该在下一行。大括号应该在同一行。使用tab键来缩排。但是tab键是魔鬼。你应该使用存储过程,但事实上你不应该使用他们。你应该常常注释你的代码。但是好的代码不需要注释。

同一个问题总是有不同的解决途径,没有一个标准答案。许多程序员擅长用他们的最佳办法,但那并不意味着就是唯一的办法。在与别人接触时被告知我是错的,而我试图理解它们是否正确是我职场早期最有压力的一个方面。

另一方面,如果你是那种喜欢古老却没有意义的争论的人(语法呆子,我正看着你呢),你该回到正确的道路上来。

一些人总会告诉你你不是真正的程序员

HTML不是真正的代码。如果你没有用vi,你显然不是真正的程序员。真正的程序员都懂C。真正的程序员不做窗口。一些人永远都学不会它。你不应该学习编程。你并不是一个电脑程序员(事实上我是)。

编程的含义众说纷纭,纵观历史也大有不同。并且,有趣的是,软件开发包和框架的出现让一个新手甚至是受过训练的开发者的工作可以更快更容易地工作,他们被冠为“伪程序员”。(见“回归真正的程序员”)

在这样的背景下如果每个人都可以自称“程序员”的话,那么这个小标题就变得没有意义了。但是在我看来这种观点是破坏性的。

使用工具能让你更轻松的做你想做的工作。如果那意味着你的游戏是用模版或者是游戏制作者而非胡乱写成的,没事。如果你是靠HTML或者是Excel宏入门的话,也行。用你觉得你能够坚持下去的方式去工作。

当你用起来顺心应手的时候,你自然会发现这些工具的局限性而非其有用性并且寻找更有用的一个替代品。但是很多时候,很少有人会看你的代码甚至所用的工具——他们关心的是你做的是什么。

担心“极客头衔”会慢慢杀死你

如上,当我在学生时代的时候,我也十分担忧这个问题。我通过我的穿着,演讲,阅读选择甚至我的软件自定义选项来证明我不是一个“真正的技术宅“(不应被纳入“科学界”)。这十分浪费时间,而后来当我决定将这些抛至脑外后我变得多样化了。

你需要牢牢记住:你在编程上面的天赋与你陷入“极客亚文化“没有丝毫关系。如果你内心深知你绝非如此的话效果会更上一层楼。你一味地把精力花在证明你不是极客上面反而会弄巧成拙。如果在你看来你是一个十足的极客的话,记住那只是你评价别人的标准。事实可能并非如你所想。

坚持比技术更重要

如今不缺那些“正确”和“最佳”的编程方法和途径。你可以从书本、互动练习或者是通过调试别人写好的程序来获取知识。当然,也有许多门计算机语言供你作为入门语言来学习,每一种都是值得提倡的。

对于“自学编程”课程和培训的一个共同抱怨就是入门教程能让我们轻松入门,但是对于进阶而言却难度陡增。你知道如何在一页上面打印数行文本,但对于一个“真正”实用的程序却无从着手。你或许正沿着一条令你迷惑的方向前进并且归咎于那些学习材料。

当你正处于这种状态的时候,那些教程和在线资源对于来说就没有多大用处了,因为它们都假设你已是一个有经验的程序员。这些困难进一步加剧了你“不知道你要做什么”的情况。甚至本质上,下一步学习什么也让你迷惑不解。

无论你学习哪种“学习编程”课程你都会在这里碰壁,而唯一的解决之道就是坚持。也就是说你需要不断尝试新的事物,学习更多的东西,一步一步的弄明白如何编写你的程序。如果你在一开始就对你为何要学习编程有一个明确的认识,那你更容易找到成功之法。

如果你不断地砌砖,尽管耗时较长,但终会成墙。而这些我上面提及的信念也在此派上用场。如果你坚信时间和坚持能够让你参悟编程那点事儿的话,那么最终你顶如你所料。