原标题:那些我希望有人能在我学习编程的时候告诉我的事情
以及我从指导别人的过程中学会的东西
原文
翻译:lbx
在你开始学习编程之前,想想你的目标
懂得编程的过程就像是建造东西,当你对你的目标有明确的概念,这个过程会变得清晰的多。如果你的目标仅仅是“学会编程”,除此之外没有更明确的想法,不知道你以后会写什么样的程序,这些程序会如何让生活更美好,你多半会发现编程是一种令人沮丧的体验。
虽然有些耻于承认,不过当初我学习CS的一部分原因是想证明我很聪明,并希望得到一份聪明人才能做的工作。同时我觉得数学和理论很适用于编程。这些想法却没能支撑我的热情多久,直到我找到把编程技术和音乐、文学等这些我真正喜欢的东西联系起来的方式。
那么,你想要编出什么东西来呢?网站?游戏?手机应用?抑或是一个能使你发家致富的创业公司?想让你的老板对你印象深刻,或者把一件无聊机械的事情变得自动化起来,好让你有更多的时间来观赏水獭的照片?:) 当然,你也可能是为了能给你的简历加上一个当下流行的词语,使你更容易被聘用,或者仅仅是为了达到毕业的要求。这些都是有价值的目标。你要做的是确定一个你自己的目标,并为之进行相应的学习。
编程并不神秘
编程和其他技能相比并没有任何特别之处。编程技能就像其他语言技能一样,需要掌握语法和词汇;就像数学一样,需要通过一定的步骤来解决特定的问题;就像其他任何手艺和艺术创作一样,有着被前人创造的针对各种具体问题的方法,工具,以及经验。你可以自由地使用,修改,和摒弃它们。
有人指出,在真正具有编程思想的人和那些缺乏这方面天赋的人之间,有一道明显的分界线,那就是指针和递归。(指针 递归)
我在学校里学习了指针的和递归的相关知识。当我第一次真正理解了这些知识的时候,我的大脑兴奋得激荡不已。这种智力上的愉悦感让我第一次产生了主动学习计算机科学的念头。但是课堂之外的经验让我看到,很多时候做一件事情并不需要这两个概念。在我教别人的时候,我也一次次地看到人们在对这两个概念一无所知的情况下完成各种有趣的,有价值的东西。
完全没有必要去怀疑你是不是足够聪明。当然,你面对的任务越复杂,你需要的对技术的精通程度就越高。这是放之四海皆准的道理,不只是在编程领域里。除非想让代码成为你的整个生命,否则完全没有必要一定要成为一个理解递归的天才。
指望第一次尝试就成功是不现实的
甚至第二次,第三次也不会
当你开始编程的时候,你很快就会碰到这种情况:明明你已经按照你想要的方式弄好了一切,并且检查了一遍又一遍,程序还是始终没有达到既定的效果。你觉得根本就无从下手去改正代码,错误提示对你来说就是狗屎。这种情况下你可能会觉得无能为力,选择放弃。我第一次有这种感觉是在我尝试去写一个C++程序的时候,运行起来得到的只有“段错误”。
但是这种情况对任何级别的程序员来说都是相当正常的。并不能说明你有任何天赋、悟性、能力上的问题。这种情况不仅对于新手,对于专家也是不可避免的。差别在于应对的方法。
新手和专家的区别在于信念:相信发生的错误是逻辑性的、可被发现及修复的,相信一定能找到解决方法的信念。找到解决办法或许是一件很不容易的事情,不过只要你有足够的耐心,就一定能够做到。
总会有人说你是错的
大括号应该另起一行;大括号应该跟在上一行末尾;使用Tab键来缩进;使用Tab键是不好的 你应该注意给代码加上注释;好的代码不需要注释……
对于同一件事情,几乎总是有两种截然不同的说法。很多程序员善于鼓吹他们自己擅长的代码习惯,这并不意味着他们说的就是对的。和那些说试图指出我是错误的,证明他们是争取的的人交流是我早期职业生涯中压力最大的事情。
如果你在团队里和别人合作写代码,总会有人言之凿凿地指出你正在做的事情的错误之处。有时候与他们是对的,你应该检查一下你是不是真的错了。有时候他们只是在胡扯,或者不过是想引起一场被谈论烂的,没有意义的,关于要不要遵循某种“编程规范”的争吵。
从另一个角度讲,要是你是那种喜欢纠结于无意义的争执的人(语法怪人,说的就是你),这对你来说说不定是好事。
总会有人说你不是真正的程序员
写HTML根本算不上真正的code。你没有使用vi,所以你的态度不够端正。真正的程序员都懂得C。真正的程序员是不会使用Windows的。有些人永远都学不会编程。你不应该学习编程的。你算不上一个程序员(远远比不上我)。
“编程”对每个人的意义都不一样,而且它变化得很快。有趣的是,那些使得新手程序员,甚至是经过一定培训的任何人能够更好、更快地编程的工具、包、框架,是最容易和“不是真正的程序员”关联起来的。
尽管去使用那些能让你更容易地构建你想要的应用的工具。 If that means your game was made in Stencyl or GameMaker rather than written from scratch, that’s fine.
如果你第一次接触编程是通过HTML或者Excel的宏,那也没什么大不了的。专注于那些你认为你能坚持下去的东西就行。随着你不断深入,你回发现之前的工具的局限,转而去找其他更强大的替代品。不过一般情况下,几乎不会有人会看你的代码或者问你正在用什么工具、语言,真正重要的东西是你用它们做出了什么东西。
纠结于“极客的荣誉”是在慢性自杀
以前,特别是在学校的时候,我总是会担心我是不是在着装上,在表达上,在书籍的选择上,甚至是软件的设置上表现得不像一个真正的geek。担心这种事情是极为浪费时间的。在最终决定不再管这些事情之后,我变得有效率多了。
你需要把以下道理牢记于心:学习好编程的能力和融入geek文化的能力没有任何关系。当你知道你确实不能融入geek圈子的时候更是如此。用来证明自己是geek的时间应该用来做正事。如果你是一个无可置疑的,自信从眼睛里溢出来的geek,当你评判别人的geek等级的时候,更要牢记以上的话。那些东西可能并没有你想象中的意义。
坚持大于方法
我认为学习编程没有所谓的”正确的”或者”最好的”的捷径,有潜力的方法倒是有不少。你可以从课本上或者练习中或者调试他人的代码的过程中学习概念。你还需要从众多语言中选择一个作为你的起步语言。”学习编程”相关的项目或者学习班上常见的抱怨就是起步的时候很轻松,随着学习继续深入突然就会碰到非常陡峭的学习曲线。你懂得如何去输出一些文本信息,但是对于如何构建一个真正的,有用的项目束手无策。这时候你可能会开始觉得之前只是在盲目地跟着指导走,并没有真正的理解相关东西,然后开始抱怨你的指导材料。
当你处于这种状态的时候,大部分教程和网上的资源对你来说都没有用,因为它们默认你是一个有经验的程序员。这个时候的艰难之处在于未来和”你甚至不知道你不知道什么”的迷思混杂在一起,想要知道下一步应该做什么都困难至极。
无论你在上的是那种编程学习课程,你都会碰到这堵无形的墙,跨过去的唯一办法就是坚持。坚持尝试新的东西,接触更多的东西,一点一点地弄清楚要如何去完成你的项目。要是你一开始清楚地知道学习编程的目的,你会更容易成功找到出路。
只要你坚持不断地在砖头之上放上砖头,不管要花多少时间,你最终肯定能得到一堵完整的墙。我之前就提到了这个迟早会发挥作用的信念。只要你坚信于此,你迟早一定能了解关于编程的全部事实,一定能的。