为什么学习编程如此困难

2025-05-28

为什么学习编程如此困难

本文由Odin Project创始人 Erik Trautman 撰写

每个初学者绝对需要了解的未来旅程

昆西·拉尔森(Quincy Larson)原本只是个“办公室里的西装革履的家伙”,但他决定学习编程。于是他四处打听。他先学了一点 Ruby,然后又浏览了 Scala、Clojure 和 Go 等其他语言。他学习了 Emacs、Vim,甚至还学会了 Dvorak 键盘布局。他学习了 Linux,涉猎了 Lisp,并用 Python 编写了代码,并在命令行上度过了半年多的时间。

就像龙卷风中的一片树叶,昆西收到的建议让他先是被这边猛烈地推向一边,然后又被那边猛烈地推向另一边,直到他最终“参加了所有能想到的在线课程”。最终,尽管昆西最终找到了一份软件开发的工作,但他:

... 确信我遇到的那些看似正常的程序员实际上是反社会者,他们经历过学习编码的创伤,然后被压抑。

哎哟。这听起来熟悉吗?

第一阶段:携手蜜月

我们很难责怪任何人带着过高的期望进入编程行业。

一方面,你从小就听说过编程有多难的传闻,就像老太太的故事一样,目的是吓唬孩子们去学习社会科学。

另一方面,“学习编程”运动在打破壁垒、向人们展示编程其实无害方面做得非常出色。像 Codecademy 和 Treehouse 这样的工具以最温和的方式向你保证,你(不,任何人!)不仅可以学习编程,还可以成为一名成熟的开发人员。

突然间,问题不再是恐惧,而是过多的希望和过高的期望。

而且,在大多数情况下,这些入门工具都能很好地引导你,就像引导孩子走过人行横道,避开那些吓人的变量和条件语句,并顺利通过编程语法的初级阶段。随着你攻克一个又一个游戏化的挑战,你的信心也会随之增强。也许你最终能做到!这有多难?你基本上已经是一名开发人员了!

手拿着蜜月图

问题就在这里——你正处于我称之为“牵手蜜月”的阶段。虽然你可能觉得结局就在眼前,但你才走了一小段路。这仅仅是个开始……

规划未来之路

在深入研究第二阶段之前,让我们先来看一下整体情况。

在这篇文章中,我将带你了解典型的编程之旅的四个阶段,以及你需要在每个阶段做些什么才能顺利完成。你还将了解两个关键因素——资源密度和所需知识范围——是如何定义这一旅程的。

您可以通过以下方式来绘制就业准备之路:您的信心水平如何随着能力的提高而变化:

编码信心与能力图表

这是一种相关的关系,因为你的自信与你的幸福感高度相关,而且当你的自信和能力相匹配时,我所掌握的最佳代理就是你正式“准备好工作”的最佳状态。

我们稍后会研究剩余 3 个阶段所面临的独特挑战,但每个阶段本质上都涉及以下内容:

  1. 《手牵手蜜月》是一部充满欢乐的冒险之旅,它通过精心制作的资源,教你一些看似棘手但通过强化支持完全可以做到的事情。你将主要学习基础语法,但也会为自己的成就感到自豪。

  2. 困惑悬崖指的是痛苦地意识到,当指导结束,你感觉自己实际上无法独自完成任何事情时,事情会变得更加艰难。你面临的主要挑战是不断进行调试,以及在努力争取任何动力的过程中,不知道如何提出正确的问题。

  3. 绝望沙漠是一段漫长而孤独的旅程,穿越一片无路可走的土地。每个方向看似正确,但你却经常在原地打转,并且极度缺乏必要的资源来度过这段旅程。小心那些如同沙漠塞壬般出现的“狂热海市蜃楼”,它们会将你引入歧途。

  4. 巅峰期是指你终于在沙漠中找到一条出路,并逐渐理解了如何构建应用程序。但你的代码仍然像纸牌屋一样孤立、脆弱。你逐渐获得了信心,因为你的网站看起来运行良好,你掌握了一些实用的模式,你的朋友也觉得你的界面很酷,但你却不敢深入底层,最终也不知道该如何编写“可用于生产环境”的代码。你该如何弥补与真正工作的差距呢?

过去几年里,我采访了数百位有志于成为开发者的人,听到的都是同一个故事。我写这篇文章的目的是,希望大家在学习的过程中,能够保持清醒的头脑,并做好充足的计划,从而避免前辈们常犯的错误。

让我们回到第二阶段……

第二阶段:困惑的悬崖

所以,你正处于第一阶段——“手把手蜜月期”——一边完成徽章,一边完成编程挑战,你的信心和能力也在不断提升。这还不算太糟……有什么好大惊小怪的?你已经到达了“非理性繁荣的顶峰”……

小心!你即将跨越一道悬崖,它击垮了许多志向远大的学习者,让他们陷入“编程太难”的泥潭。你第一次坐在键盘前,打开文本编辑器,尝试从零开始构建一个项目,而没有任何花哨的浏览器内置编辑器、脚手架代码或有用的提示,正是你跨越这道悬崖的那一刻。

废话。

你可能可以通过学习教程来延长学习时间,但没有人能够不离开地面就飞上天空,而且,在某个时候,你将不得不从一个空白的文本文件开始创造奇迹。你刚刚进入学习的第二阶段,信心将在这一阶段跌落谷底——“困惑的悬崖”:

混乱悬崖图

于是你开始构建。你奋力拼搏,最终得到了一个勉强能用的解决方案,但总觉得少了点什么。你正在与各种 bug 作战,这些 bug 甚至让《星河战队》都显得平淡无奇。感觉每一次胜利都只是靠着谷歌搜索的运气,你对自己能搞定这一切的信心一落千丈。

作为一名教育工作者,以及我们行业的所有参与者,看到这种情况尤其令人沮丧。编程可能并不适合每个人,但我们希望你能取得进步,因为有时最不可能的故事也能成为最辉煌的成功。

当手把手的指导结束,学生们被推下悬崖,并被告知要飞翔时,太多原本很棒的人却跌入了沮丧的深渊,还没有学会如何展翅高飞。

可怕的是,你甚至还没开始真正重要的工作。第二阶段,也就是“混乱悬崖”,还处于早期阶段。等你最终解决了足够多的 bug,结束了埃及的第八次瘟疫,并且完成了几个项目——标志着第二阶段的结束——你才刚刚开始。

对于那些真正准备好以此为业的人来说,熬过“困惑悬崖”往往就是你决定全力投入新生活的时刻。但太多人被抛在后面。不幸的是,你即将进入“绝望沙漠”。

两个关键因素

那么,一个阶段和下一个阶段之间真正的区别是什么呢?为什么第二阶段(困惑的悬崖)比第一阶段(牵手蜜月期)更糟糕?理解这一点能帮助你意识到,如果你的旅程看起来像我们刚才描述的那样,那根本不是你的错。

基本上,每个阶段都有两大关键因素在起作用——资源密度和知识广度。在探讨它们如何定义第三阶段之前,我们先来了解一下这两个因素是什么。

因素一:资源密度

正如我上面所说,当你刚开始学习编程时,感觉就像有无数的资源在试图牵着你的手,把你拉进编程的世界。因为确实有!

搜索“学习编程”,你会看到一大堆实用的工具、文本、视频和教程。说实话,它们真的太棒了!现在学习编程的途径从未如此丰富。

不幸的是,到了后期,资源密度会迅速下降。任何从初学者晋升到中级水平的人都可以证明,刚开始的时候和刚开始寻求帮助自己构建东西时,可用的资源量有着巨大的差异,而你当时并没有太多的指导。

随着知识量迅速增加,进入第三阶段后,这个问题会愈发严重,这也是我们称之为“绝望的沙漠”的原因之一。一旦你度过了这一阶段,并开始熟悉自己需要搜索的内容,资源就会回归,你就能使用更多技术工具,例如行业博客和截屏视频。其中一部分就是弄清楚应该问哪些问题。

以下是每个阶段的资源密度(线密度越大表示资源越多):

资源密度图

因素二:知识范围

现在我们来谈谈一个相关的问题——知识范围。它代表了你在每个阶段需要学习的新主题的总广度。它看起来是这样的:

知识范围图

刚开始学习的时候,你需要理解的内容范围很窄。每个人,无论目标、语言或背景如何,都需要弄清楚什么for是循环、如何构建条件逻辑以及其他编程语法的基本结构。这些基本概念最终并没有那么多,所以这个阶段的知识范围非常狭窄。

一旦你脱离了基础,你会发现知识范围迅速扩大,因为你需要开始学习更难的东西,比如理解错误以及何时使用你熟悉的代码。这很不一样,因为对于一个明确的问题,没有“正确”的答案……事情变得模糊起来。

当你进入第三阶段时,知识面会更加广阔。现在你需要了解要使用哪些工具、要学习哪些语言、底层计算机科学基础知识、如何编写模块化代码、面向对象、良好的代码风格以及如何寻求帮助(仅举几例)。每次访问谷歌或 Hacker News,你都会陷入新的“兔子洞”,被更多你不知道但又觉得应该知道的东西淹没。

你不知道你不知道什么。

只有当你最终找到一些动力,走出沙漠时,视野才会再次开始缩小。到那时,你已经找到了自己选择的技术,以及它在生态系统中的位置。你最终(基本上)了解了自己不知道的东西,并能规划出一条路径。随着你不断前进,步入职业生涯的起步阶段,你会不断提升专注力。

第三阶段:绝望的沙漠

理解了这些因素,你就会明白,“困惑悬崖”其实只是一个转折点。知识范围的快速增长与资源密度的下降,这种恶性循环带来的痛苦,最终导致了我所说的“绝望沙漠”。

从本质上讲,这片沙漠就是你知道某处有尽头,但不知道如何到达那里:

绝望沙漠图表

沙漠绵长,危机四伏。沿途你会发现自己被“疯狂的幻影”所吸引——数十种诱人的资源,看似蕴藏着你苦苦追寻的答案,却又将你再次抛入一片荒芜沙海,延伸至地平线。

也许你会在Coursera、Udacity或edX上注册几门MOOC课程。又或者,你会找到一个声称能带你一路走来的教程。你以为自己已经学会了“手牵手蜜月”的道理——没有简单的答案——但寻求救赎的诱惑实在太大,你最终还是被这个教程的承诺所吸引,相信它能带你到达其他教程都无法到达的终点。

不管别人怎么说,你都不可能在一周、一个月或一节大学课内学会这些东西,所以不要相信!

要学的东西远比你预想的多得多。即使你能够运行一些应用程序,也很难不迷失在成为真正专业人士的宏伟蓝图中。很难衡量你的进步。你怎么知道你需要学什么,或者你是否在学习正确的东西?

即使你指明了正确的方向,也很难衡量你的进步。你可能会感到完全迷失,直到你终于能够构建出一个外观和功能都符合你预期的东西。但是,只要有足够的毅力和正确的方向,你最终会启动你的前几个“真正的”项目,你会意识到你终于开始有所成就了。

当然,到现在为止这一直很困难,但也许这个网络开发的东西毕竟不是那么糟糕......一切都会顺利的!

第四阶段:精彩崛起

你已经穿越了这片沙漠,你的信心也越来越强。你的 Google 能力非常出色,你终于能够理解那些详尽的行业博客文章和截屏视频了。也许你已经深入研究了某种特定的语言或框架,并且有信心能够构建并发布一个功能齐全的应用程序。

这就是“令人敬畏的上升趋势”:

令人敬畏的上升

从外表看,一切都很好,但你内心深处知道,你还没有到达那一步。

你能让那个应用程序运行起来,但幕后究竟发生了什么?你的代码就像胶带和绳子一样,最糟糕的是,你甚至不知道哪些部分很糟糕,哪些部分其实还不错。你偶尔闪现的才华会被菜鸟错误所抵消,更糟糕的是,你逐渐怀疑自己仍然对自己在做什么一无所知。

这是一个两极分化的阶段。你感觉自己一半是刀枪不入的开发者,另一半却像是一层薄薄的伪装,裹着一个疯狂的新手,陷得太深了。随着你的进步,一种挥之不去的不确定性感越发强烈,担心有人会“揭穿”你是个骗子。

您觉得自己应该已经是一名开发人员了,但是您编写的代码与“专业”工作环境之间的距离却感觉很遥远……

不过,最终你会成功的。动力十足,不容错过!绝望的沙漠已经过去,困惑的悬崖也已遥远。你终于真正地走上了上升之路。你学得比以往任何时候都更快、更聪明,最终,你将吸收足够多的最佳实践,让你的瑞士奶酪知识凝聚成一套生产级的技能。

精彩的上升期总是比你预期的要长,而且感觉没完没了,因为你离它太近了……但你终究会到达那里。如果你能以正确的方式坚持不懈(这肯定是未来文章的主题),你就能说服别人付钱让你继续学习。这份工作是你的。

一切看起来如何

现在你已经看到了前方的道路,以及它为何如此艰难。将我们刚才讨论的四个阶段与定义它们的因素结合起来,它看起来就像下图所示:

将所有图表放在一起

了解路是一回事,真正走上这条路又是另一回事。让我们带你迈出正确的一步。

如何活下来

这段旅程看起来很紧张,坦白说,通常情况下确实如此。重要的是你要明白自己将面临什么,尤其是在你孤军奋战的情况下。但你不必这么做。有很多方法可以绕过大多数这些问题。学习编程很少像人们想象的那么容易,但也很少像你深陷绝望时想象的那么困难。

在本节中,我将介绍您可以用来保持自己朝着正确方向前进的关键策略。

学习编程之旅的生存之路

度过牵手蜜月期

“手把手蜜月”课程中丰富的资源让学习过程充满乐趣。它们能够帮助你轻松掌握未来阶段所需的逻辑思维。现在是开始学习编程的好时机,所以尽情享受学习过程吧,并牢记以下两个建议:

  1. 首先尝试不同的资源,找到最适合你的学习方式,以及你最感兴趣的项目类型。比如可汗学院的快速挑战、Codecademy 的浏览器内练习,或者 Thinkful 的一对一指导。一开始要保持开放的心态,忽略任何关于你应该学习什么的内容……在这个阶段,所有代码都是一样的。

  2. 然后选择一种资源,找到适合自己的就坚持使用。坚持学习入门课程,直到课程结束,这应该能让你掌握编写基本脚本和应用程序所需的所有基础知识。然后,准备好开始独立开发吧。

走出困惑的悬崖

几乎每个人都会经历“困惑悬崖”,因为成为开发者的唯一途径就是去开发。你可以假装自己在开发,注册教程(或者那些伪装成“完整”课程的教程),但这只会拖延不可避免的事情。教程是帮助你摆脱那些高接触度的入门课程的好方法,但你需要在某个时候摆脱这种依赖,面对现实世界。

向自主建造过渡的三个技巧:

  1. 与他人合作,即使是另一个初学者。你会惊奇地发现,当两个人共享双眼时,调试一个不可能的错误变得多么容易。

  2. 阅读其他人的代码,熟悉好的模式。试着理解作者这样做的原因。你不会不读书就想成为小说家吧?我们会在下一篇文章中重点讨论这个问题,但现在,请留意其他人已经写过解决方案的小问题或项目。

  3. 从小处着手,持续构建。你应该为未来规划一些有趣的大项目,但你需要熟悉调试流程,并寻找一些小挑战所需的资源。经验真的无可替代。

绝望沙漠中的生存

一旦你熟练掌握了调试技巧,最大的问题就变成了一堆堆必备知识,以及你对如何学习这些知识的茫然不知所措……绝望的沙漠。在这种情况下,你真正需要的是一条坚实的前进之路。“疯狂的幻象”代表着所有有趣的岔路、兔子洞和快速提升技能的方案,最终只会浪费你的时间。

因此,走出绝望沙漠的关键是:

  1. 对你想要实现的目标要有一个明确的目标,否则你最终会徒劳地学习各种有趣但最终毫无成效的东西。如果你有空闲时间,请务必跳过这一步……

  2. 找到一条通往你设定目标的坚实道路,并确认它真的能帮你到达那里。这时,你需要比课程网站或书籍封面上的营销口号和笑脸更深入地思考:“这是否能帮助我实现我设定的目标?”

  3. 集中注意力,避免分心。如果你对学习编程感兴趣,你也会对学习各种其他精彩的东西产生兴趣。当编程变得困难时,你需要能够坚持下去,而不是仅仅尝试下一个看起来很酷的东西。

如果你能够找到一条路并坚持下去,你最终将进入下一个阶段,而不是花费数月或数年的时间在这片沙漠的流沙中追逐海市蜃楼。

在精彩的崛起中生存

“精彩上升期”是最棘手的转变之一。你可以开发应用程序,但你真正想做的是成为一名 Web 开发者。要度过这个阶段并找到工作,你需要做到以下三件事:

  1. 寻求并遵循编程的最佳实践。你需要理解解决方案和最佳解决方案之间的区别。最佳实践是独立开发和在实际工作环境中构建生产质量代码之间的主要区别。

  2. 检查一下你的假设,因为你的知识中可能存在一些你甚至都不知道的巨大漏洞。你需要诊断并修复这些漏洞。

  3. 掌握那些很少被提及但对于进入专业领域至关重要的技能。这包括测试、数据建模、架构和部署等,这些技能虽然很容易掌握,但对于良好的开发至关重要。

完成这些目标并推动“卓越上升期”的关键在于获得反馈。完全自学的学生可能很有成效,但很少能写出清晰、模块化且易于维护的代码,从而在专业环境中脱颖而出。你需要与其他人合作,他们会挑战你的假设,提出尖锐的后续问题,并迫使你弥补知识储备中的不足。

那么...可以做到吗?

这一切听起来可能让人不知所措,但我保证,在你之前,已经有很多人坚持下来,并成功走过了这段旅程。了解前方的道路,你就能更好地制定目标明确的计划,并获得合适的帮助。

显然,这篇文章篇幅有限,我们无法像我们希望的那样深入探讨旅程的每个阶段,也无法提供您应得的那种细致入微的操作建议。即便如此,我们对这段旅程非常熟悉,并且充满热情,因此我们想尽一切可能为您提供帮助。

特别感谢 Peter DePaulo、Javier Noris、Michael Alexander、Andy Brown、Saul Costa、Phil Nachum 和 Quincy Larson 分享经验并帮助调试这些想法。

本文由Odin Project创始人 Erik Trautman 撰写

文章来源:https://dev.to/theodinproject/why-learning-to-code-is-so-damn-hard-11nn
PREV
回到基础:我们应该使用 Rem、Em 还是 Pixel?
NEXT
快速 CSS:为您的下一个网站制作无限加载动画。加载动画视频教程,让我们开始吧!您可能觉得有用的文章