在你学习编程之前,请先思考“我想开发什么”
学会如何编程主要是为了实现某些功能,如果你对最终目标有着清晰地认识,那么前途会一片光明。假使你的目标只是“会编程”而非制作某种给自己带来便利的程序,你很有可能就会发现编码是一件极其令人沮丧的运动。
我稍微有点羞于承认我学习计算机科学的部分原因是证明自己是多么的聪明以及获得一份聪明人的工作。当然,我非常乐于思考数学和理论(这本书对我影响深远),所以编程契合了我的这一兴趣。然而仅仅这样不足以让我在编程道路上走得很远,直到我发现了我真正喜爱的领域(比如音乐和文学)和技术之间的纽带。
所以,你为什么想要编码?建网站?做游戏?做App?一个让你致富的机会?交互式艺术?你是否想打动你的老板或者自动执行一些繁琐的任务来让你有更多的时间去欣赏其他照片?也许你仅仅是希望能更好的就业、往简历里添加一些时髦的词句或者完成教育计划的要求。这些都是有价值的目标!请确定你自己的目标,并以此作为前进的动力。
这没什么神秘的
编码同样也是技巧。像学习语言,有语法和词汇要掌握;像数学,有完成特定类型的问题的流程;像各种工艺和艺术创作,有人们已经开发一段时间的技术和工具和最佳实践,你可以自由地使用或修改或放弃以适应特定的不同的任务。
这位仁兄 (非常聪明!他的另一作品我非常喜欢,经常有共鸣!) 提出,码农的真实想法和其他(在这一领域欠缺获得成功所需要的能力的)人有条明显的分界线。这条分界线是,据他所说,指针和递归(如果好奇,可以参阅相关入门书)。
我在学校里了解到指针和递归,等我掌握它们的时候,它令人愉悦地颠覆了我的大脑,这种智慧的快感让我想把学习计算机科学放在首位。但是,在课堂作业之外,我已经了然于心的概念助我把事情做好的次数已经越来越少。与此同时,当我帮助他人的时候,一次又一次发现人们无需了解任何东西就可以完成有趣而又有益的项目。
如果你足够睿智的话,怀疑或恐吓没有一点意义。当然,你的任务越复杂、越深奥,你更需要精通于它。但是这并非意味着与世隔绝。除非你打算用代码充满整个生活,否则你不必成为一个递归领域的天才才能做你想做的事情。
没有第一次就不会有下一次
当你第一次开始学习编程时,这种特殊的经历很快就会出现:你会觉得已经搭建了所以认为需要的环境,已经检查了无数次,但是仍然有问题。你不知该怎么样开始修补它,而且错误信息(如果你很幸运地看到了)还在嘲笑你。此时此刻,你极有可能会试图放弃,极有可能认为永远都无法弄清楚。当我在第一次尝试用c++写程序的时候出现了这种情绪。运行程序,但是只得到了“segmentation fault”的提示。
其实,这种经历对程序员(无论是菜鸟还是大神)来说是非常正常的,它无关你的智力、技术知识或者是否适合以编程作为终身职业。这种经历会在你初学编程时出现,同样也会在你作为经验丰富的专家时出现。唯一的不同仅仅是你如何去应对它。
我发现菜鸟和大神之间最大的不同是信仰:逻辑和可发现的原因会变糟;问题是可修复的;达成目标的方法依然存在。“不工作”到“工作”的通道可能不是显而易见的,但事在人为。
总有人告诉你“你做错了”
括号应该放在下一行。 括号应该放在同一行。 使用tabs来缩进。但是tabs是魔鬼。你应该使用存储过程, 但是实际上你不应该使用他们。你应该总是给你的代码添加注释, 但是好的代码不需要注释。
几乎每一个问题都有许多不同的解释,没有惟一的“正确答案”。许多程序员善于提倡他们中意的方法,但是这并不意味着它是惟一正确的方法。去迎合其他人的经历告诉我“我错了”,在我职业生涯的早期,试图找出他们是否正确是造成我紧张的一个原因。
如果你在团队里编程,几乎肯定会有人将你正在做的事情拿出来讨论,有时他们是绝对正确的,而且事实上,调查你是否出错总是一件有价值的事情。但是有时他们却是彻底地瞎搞,或者重新提出一个古老而又无意义的争论——遵循一个风格指南是最好的。
另一方面,如果你是那种享受古老而又无谓的争执的人(嘿,语法呆子,我正盯着你呢),那你来对了地方。
总有人告诉你“你不是真正的码农”
HTML并不是真的编程语言;如果你不使用vi,你不是职业的;真正的程序员懂C;真正的码农不使用Windows;有些人永远没能力学习它;你不应该学编程;你不是一个计算机程序员(但我是)。
“编码”对很多不同的人意味着很多不同的事情,它也看上去和过去相比相差甚远。而且很有趣的是,工具、包、框架让新手或是受过训练的开发者能够更快更简单的开发出会被归类为“不是真正的码农”的“码农”。(见: “Return of the Real Programmer”)
在这背后最令人担忧的是,如果任何人都可以称自己是程序员,那么这个头衔将一无是处。但是我认为这看守是毁坏主义者。
使用工具使得我们能够更容易开发出我们希望的程序。如果这意味着你的游戏是基于Stencyl或GameMaker,而不是从头构建,那很好。如果你第一次涉足编码是HTML或Excel宏,那也很好。请做那些你觉得能坚持的。
随着你获得更多的便利,你会很自然地开始寻找这些工具的限制而非它的帮助,并开始寻找更强大的代替品。但是绝大多数时间,很少有人会看你的代码或问你使用的是什么——你做的是什么才是最重要的。
担心“名扬在外的怪咖”是慢性自杀
在之前,尤其在学校里的时候,我习惯于担心很多关于我是否因为我的服装、外表、我阅读的领域选择、甚至我的软件定制选择而被认为是“非真正的极客”(从而无法进入技术社区)。这浪费了我很多的精力,随着我决定将其抛之脑后,我开始变得更加实在。
你需要这个内在感受:你善于编程的能力和你是否能融入技术族群无关。如果你在内心深处认为你永远无法融入,那么你花费在证明自己而非做事实上的精力会加倍。如果在你眼里你是一个不争的有名的极客,当你评估其他人的名气时请埋于心底。这可能并非你所想的那样。
坚持比方法更重要
关于“正确”的或“最好”的学习编程的方法的文章非常少,但是也有很多潜在的方法。你可以从书中、完成交互式练习或者调试别人的代码来学习。当然,还有很多种语言可供你选择首先去学习。
在“自学编程”项目研讨会上,最普遍的争论是:你会在初学者材料中感受到愉悦,但是很快随着难度的增加开始出现陡峭的曲线。你知道怎么样在一张纸上打印文字,却无处下手。你或许觉得只是在没有真正理解的情况下走错了方向,并怪罪于学习材料。
当你进入这个阶段,大多数教程和在线资源默认你是有经验的程序员,所以对你产生的帮助会微乎其微。由于“你不知道你不懂什么”,困难会随之进一步加剧,甚至试图规划出下一步学习什么本身就是一个难题。
你在“学习编程”中无论遇到什么问题都可能会遇到坎,而翻过这堵墙唯一的途径是持之以恒。这意味着你要始终尝试新事物、学习更多东西、找到完成你的项目的一点一滴。如果你对为什么学习编程有着清醒的认识,你最终将更有机会获得成功。
如果有问题不去解决,最终你会被堆成山的问题压垮(虽然需要很长一段时间)。这时我前面提到的信仰就派上用处了。如果你坚信只要肯用时间和耐心,到时候你肯定将能够完成整个项目。
英文原文发表于:Things I Wish Someone Had Told Me When I Was Learning How to Code
很久没写文章了,也很久没翻译外文了,组织语句能力直线下降啊,请凑合着看吧!其实应该也不至于那么不堪的。