我希望当初我学习编程的时候别人能告诉我的事情

本文是翻译,版权归原作者所有


在编程教学中的体会

了解如何编程通常和盖房子类似,当你有终极目标时,过程就清晰很多了。如果目标是“学习编程”而不清楚用哪种语言、它能怎样改观生活,你很可能发现编程是让人沮丧的苦工。

我学习计算机科学的一部分动力是想证明我聪明,我想做聪明人的工作。承认这一点有些不好意思。我也喜欢思考数学和理论,而程序是完美的结合。这并不能使我坚持多长时间,直到我找到了把技术和我真正喜爱的、像音乐和文学之类的东西结合起来的方法。

你编程要做什么?网站?游戏?iPhone APP?踏入致富的大门?交互艺术?【1】想给老板留下好印象或者把单调工作自动化以换取更多的时间去看水獭的照片?或许你仅仅想更为称职,给简历加分或者完善你的教育规划。所有这些都是可追求的目标。确信知道你的目标是哪一个,然后相应地去达到。

没有神秘感

编程也是一门技能。像语言学习,语法和词汇是必需的;数学需要解决特定类型问题处理的过程;和技能和艺术创作一样,人们早就积累了针对不同任务的技巧、工具和最佳实践,你可以自由地使用、修改或抛弃。

有个家伙(他非常聪明!我认同并享受他的其他作品)说,在天才程序员和智商不够的其他人中间,有一条能否在该领域成功的、非常明显的分界线。分界线包括指针和递归。(好奇的话,请参考这里这里

我在学校接触了指针和递归,当我理解它们的时候,我的大脑觉得非常激动——智力上的快乐促使我想在计算机科学出人头地。教室之外的编程,我不得不熟悉它们概念的次数相对少了。当我一次又一次地帮别人学习的时候,我看到人们能够完成有意思的、或有报酬的项目,而对这两个概念并不了解。

我不是恐吓或质疑你是否足够聪明。当然任务越复杂难懂,越需要更高的精通层次才能完成。这绝对适用于其他领域。如果你没有计划让代码改变生活,你也不必为了解决问题而成为深入理解递归的高手。

第一次运行失败,第二次或第三次同样失败

刚学编程的时候,你很快就会遇到这个特定的经历:你认为你搞好了你认为应该搞好的东西,然后检查了一遍又一遍,它仍然不好使。你没有尝试修复它的头绪,错误信息(你足够幸运才能有的)像在说“fuck you”。这时候你可能想放弃,认为自己永远解决不了,但是你不能就此罢手。我就有这个体会,我第一次写C++时,运行了程序,却仅仅返回“segmentation fault”的话。

但是,各种技术水平的人都会遇到这种情况,绝对和你的智商,技术储备或是否适合写代码没有关系。无论菜鸟还是有经验的老手,都会遇到。不同之处在于你是如何应对的。

我发现菜鸟和老手之间最大的不同是信心:坚信这是逻辑和可找到原因的错误的信心,问题是可以解决的信心,一定有解决方法的信心。正常运行和失败的道路可能不太明显,但是你有信心通常就可以搞定。

有人总是说你弄错了

大括号应该在下一行》《花括号应该在同一行》《使用tab缩进》《邪恶的tab》,你应该《使用存储过程》,但是实际上《你不应该使用它们》。你应该《总是给代码加注释》,但是《好的代码不需要注释》。

一个问题几乎总是有很多不同的方法,没有唯一的“正解”。很多程序员倾向于他们首选的方法,但并不意味着它是最正确的。周围人告诉我我错了,试着搞明白他们是不是对的,是我早起职业生涯压力的一部分。

如果你和其他人在一个团队编程,一定有人对你做的事情指指点点,有时候就算他们绝对正确,事实上,弄清楚你是不是错的也是值得的。但是,有时候他们错得一塌糊涂,或者重新发起了一个古老的且毫无意义的、围绕最好遵循一种风格的争吵,那么无视之。

另一方面,如果你喜欢古老且毫无意义的争吵(语法呆子,我正看着你哟),你可能也算来对了地方。

有人总是对你说,你不是真正的程序员

HTML不是真正的编程》《如果你不用vi,你就不是认真的》《真正的程序员是精通C的》《真正的程序员不需要windows》《有些人永远掌握不了》《你不应该学习编程》《你不应该是一个计算机程序员(除了我)》。

“编程”对于很多不同的人是不同的事情,从古至今都不同。有意思的是,方便新手或老手快速、简单编程的工具、包和框架被看成了“不是真正程序员”的刷子。(看看:《真正程序员的回归》)

所有这些看法有个担心,《如果有人自称为程序员》,《这个头衔将变得毫无意义》。但是我认为这是不好的。

使用工具是为了更容易地build你想build的代码。如果这意味着你的游戏是在Stencyl或GameMaker下、而不是乱写的,这很棒。如果你首次接触的代码是HTML或Excel宏,这很好。坚持下去。

当你熟悉之后,你自然会发现工具的局限而不是好处,再寻找更强大的工具。但是多数情况,很少有人看你的代码或问你用什么工具——你这样做就是好的。

担心“黑客精神”慢慢杀死你

特别是在学校的时候,我担心能否通过我的穿衣打扮,我的演讲,阅读材料的选择,甚至软件个性化选择来认出我自己“不是一名真正的极客”(因此不值得包含在技术社区)。这非常耗费精力,在我决定不管这一切之后我产生了很大的影响。

你需要内化这些东西:你的编程能力和适合各种极客亚文化没有关系。如果你深刻理解你永远不适合的时候,这种能力会加倍。为了证明自己所花费的精力应该用在做事情上。如果你的眼睛流露出你的无可争辩的极客精神,那么当你评估其他人的级别时请保留在想法里。它可能不是你想得那样。

坚持比方法重要

如何正确或最好地学习编程的文章有很多,潜在的方法也不少。你可以《从一本书》或《完成互动练习》或《debug其他人的代码》来学习概念。当然有许多语言可做为刚开始学习的语言,每一种都可以。

“教你自己编程”和培训班最多的抱怨是,你在最初进展顺利,然后很快达到“事情变难了”的陡坡。你知道如何在页面打印一些行文本、但不知道从哪里开始一个真正、有用的项目。你或许习惯仅仅跟着指导而不要真正的理解,然后归咎于学习材料。

当你到达这个阶段时,大多数可获得的教程和在线资源用途就不大了,因为他们假定你已经是一个资深、经验丰富的程序员了。“你不知道哪些东西是不知道的”进一步加大了难度,甚至试图搞清楚下一步学什么本身就是个难题。

你已经撞到墙了,不管你如何“学习编程”,度过它的唯一办法就是坚持。这意味着继续尝试新东西,学习更多的知识,一点一点地搞清楚如何建立你的工程。如果你当初非常清楚你为什么要学习编程,很可能就接近最后的成功了。

如果你坚持把砖头摞起来,或许时间长些,但最终你会有一堵墙。这就是我刚才提到的坚持。如果你相信有了时间和信心就能搞定整个编程的事情,那么你将来也一定会成功。

译者注:

【1】交互艺术:http://en.wikipedia.org/wiki/Interactive_art

原文地址:https://medium.com/learning-to-code/565fc9dcb329

译文:我希望当初我学习编程的时候别人能告诉我的事情 》| 腊八粥