精华内容
下载资源
问答
  • void * f(void *x) { void *y; y = some_opt(x); return y; }
  • Quincy Larson曾经只是个穿西装坐办公室的家伙,有一天,他决定要学习编程。于是,他到处打听关于编程的事情。他从Ruby入手,接着很快学了Scala、Clojure和Go等多种其他的编程语言。他用过Emacs和Vim,甚至还学过...

    Quincy Larson曾经只是个穿西装坐办公室的家伙,有一天,他决定要学习编程。于是,他到处打听关于编程的事情。他从Ruby入手,接着很快学了Scala、Clojure和Go等多种其他的编程语言。他用过Emacs和Vim,甚至还学过Dvorak键盘布局。他不仅学会了Linux,涉足过Lisp,并且有超过半年的时间靠在命令行下编 Python 代码为生。

    Quincy就像龙卷风中的一片叶子,别人给他的建议让他在编程的世界中晕头转向,直到他学完了“能想到的每一个在线教程”。尽管在故事的最后,Quincy得到了一份软件开发的工作,但他说:

    …我认为,我碰到过的程序员们看似一帆风顺,实际上他们都饱尝过学习编程的痛苦,只是他们都压抑着没有说出来。

    唉,这些话是不是听着很耳熟?

    阶段一:手把手辅导的蜜月期(Hand-Holding Honeymoon)

    每个即将进入编程行业的人都满怀期待,这很正常。

    一方面,你在年轻的时候总听流言说编程如何如何难,但它们就像老奶奶讲的吓人故事,是用来唬孩子们去学习社会科学而已。

    而另一方面,“学习编程”运动已经取得了很多成就,它打破障碍并向人们展示编程其实也没那么可怕。 像 CodecademyTreehouse和 Code School 这样触手可得的工具,它们可以确保你(甚至任何人)不仅能学会编程,还能成为一名熟练的开发者。

    突然间,问题不再是对编程的恐惧,而是抱有过多希望,期望太高。

    而且最重要的是,这些入门工具足以像教小孩过马路那样,引导你学习那些令人头疼的变量和条件语句,以及初级编程语法。当你不断完成游戏般的挑战时,你的自信会随之大增。说不定你最后就学会了编程!学会编程并不难,基本上你已经是一名开发者了。

    手把手辅导的蜜月期(The Hand-Holding Honeymoon)

    现在问题来了,你正处于编程初期阶段,我喜欢称之为“手把手辅导的蜜月期”。尽管你可能感觉成功就在不远处,但其实你才刚踏出第一步。一切才刚刚开始……

    描绘未来之路

    在我们一头扎进第二阶段之前,先来仔细看看整个过程。

    在这篇文章中,我将介绍典型的编程之路上必须经过的四个阶段,以及如何平稳渡过每个阶段。你也会看到资源的丰富程度和知识范围(各个阶段必须掌握的)的广度这两个关键因素是如何在编程之路上起到决定性作用的。

    旅程艰辛就为了达到找工作的水平,这个艰苦的过程可以描绘成你的自信心随能力增长的变化曲线。

    学习编程之旅

    由于自信和幸福感紧密关联,而且只有在自信和能力相匹配时,才能正式地说你可以“上岗”了,因此,上图中的自信和竞争力是息息相关的。

    随后我们会观察剩下的三个阶段中存在的独特挑战,但每个阶段本质上都包含了上面的这种关系:

    1. 手把手辅导的蜜月期(The Hand Holding Honeymoon),这个阶段充满了乐趣,面对看似棘手的问题,那些高质量资源的鼎力相助让你轻松取胜。虽然你主要学的是基础语法,但完成的工作会让你很有成就感。
    2. 充满迷惑的下滑期(The Cliff of Confusion),在这个阶段你会痛苦地发现手把手辅导的阶段结束后,事情变得更困难了,实际上你没法独立做任何事。在你试图重新振作时,你面对的首要挑战不仅是要反复调试,而且你还不懂怎么问问题。
    3. 绝望的迷茫期(The Desert of Despair),这个阶段漫长而又孤独在这个沙漠(充满困惑迷茫就像身处沙漠)中几乎没有路,每个方向都看似正确,但你却总是在绕圈,你极度渴望找到办法逃出生天。警惕“狂燥中出现的海市蜃楼(Mirages of Mania)”,它们就像是沙漠的迷魂曲,将引诱你误入歧途。
    4. 煎熬的上升期(The Upswing of Awesome),这个阶段里你终于找到了一条路走出沙漠,并且总体清楚了如何创建应用程序。但你的代码仍然很封闭,到处都是漏洞,就像纸糊的房子一样摇摇欲坠。你的网站可以运行并且你已经掌握了几种有效的模式,这些都让你的信心大增,而且你的朋友们都在称赞你的网站很酷,但实际上你知道底层连自己都不忍直视。你根本不知道该如何写出“可发布”的成熟代码。该如何弥补这个差距,从而找到一份真正的工作呢?

    在过去这些年里,我已经面试过成百上千的开发者,他们都心怀抱负,并且不断给我说着相同的经历。我写这篇文章的目的,是希望你能够在学习的路上擦亮双眼,做一个详细的计划避开很多前人都曾掉入过的陷阱。

    让我们回到阶段二吧…

    阶段二:迷惑的下滑期(The Cliff of Confusion)

    你正处于阶段一,也就是“手把手辅导的蜜月期(Hand-Holding Honeymoon)”,你正在获取各种奖励徽章并完成编程挑战,同时你的自信和能力都在蹭蹭地上涨。情况也不是很糟糕…那大惊小怪些什么呢?因为你的自信已经失去理智地膨胀到了极点。。。。。。

    小心了!你即将踏出悬崖,多少英雄在此折腰沦为“编程太难”一族。这错误的一步发生在你第一次在键盘前坐下,打开文本编辑器并试图从零开始创建一个工程,但你却不用任何很赞的线上编辑器,也不用别人的代码框架或寻求有用的提示。

    简直扯淡。

    也许你能照着自学教程依葫芦画瓢,但是没有人可以一步登天,而且从某种意义上来说,你要徒手从一个空白的文本文件开始简直是异想天开。你才刚刚进入学习的第二个阶段,接下去你的自信将跌落谷底,这也是为什么我称之为“困惑的下滑期(Cliff of Confusion)”。

    困惑的下滑期(The Cliff of Confusion)

    你开始创建工程。你抓耳挠腮却只找到了一个勉强能用的方案,但总觉得哪里不对。为了你的星河战队(也就是你的大工程)能表现不错,你陷入了和bug的战争之中。似乎只有通过一键谷歌才能解决每一个问题,你那些过去能搞定问题的自信荡然无存。

    Buuuuuuuuuuuuuuuuuuuuug!!!

    不论是作为教育者,还是作为这个行业的从业者,在大家看来这个阶段都格外令人沮丧。任何人写的程序都可能有bug,但我们还是希望你能有所进步,因为最不可能的地方也能成就最伟大的成功。

    在阶段一结束时,学生们被迫进入了阶段二。他们必须飞跃这个阶段,但太多有潜力的人却不去掌握真正有用的技能,而是一味地停留在挫败的情绪中。

    可怕的是,你甚至还没有遇到过真正棘手的事情。阶段二的结束还早得很。当你解决掉足够多的bug结束了大部分的痛苦,并且已经完成了几个工程,尽管这标志着阶段二的结束,但总体来说你也仍然是刚上路而已啦。

    对那些真正准备从事这个行业的人来说,他们通常会在渡过阶段二以后决定是否全身心投入这个新生活。但太多的人放弃了。而不幸的是,你现在才刚到阶段三(“绝望的迷茫期”)的入口。

    起作用的两个关键因素

    那么前两个阶段的真正区别是什么呢?为何相比阶段一(手把手辅导的蜜月期)来说阶段二(困惑的下滑期)给人的感受会如此糟糕?如果你的经历很像我们前面描述的那样,只要理解了这两个问题,你就能释怀了。

    从根本上来说,每个阶段都有两股关键力量在起作用,那就是资源的密集程度知识面的广度。在探索它们对阶段三的影响之前,我们先来看看这两个因素到底是什么。

    因素一:资源密集度

    正如我前面所说,一开始你会感觉有遍地的资源在引导你上手编程。事实也确实如此!

    搜索“如何编程”,你会得到一大堆有用的工具、文章、视频以及自学教程。而且,老实说它们都很棒!从未有过如此多的方法指导人们学习编程。

    不幸的是,后期可供使用的资源太少了。每一个从初学者成长到当前状态的人都能体会这其中的差距之大,相比刚开始入手,当你试图完全依靠自己创建工程时,能利用的资源就少得多。

    进入阶段三后需要了解的知识猛然陡增,恶化了上面的问题,这也是为什么我把这个阶段称之为“绝望的迷茫期”。一旦你度过了这个阶段,并且开始了解你需要搜索的东西,你就会找到很多资源,还能使用一些技术工具,如专业博客和视频讲座。矛盾的部分仅仅在于明白该问什么问题。

    下图显示了各个阶段中的资源密集程度(线条越密集表示资源越多):

    各阶段的资源密集度

    因素二:知识面的广度

    现在我们来聊聊一个相关的话题——知识面的广度。它表示你在每个阶段中必须学习的新知识的总体广度。下图就显示了这个因素在每个阶段中的情况:

    各阶段所需知识的广度

    刚开始学编程时,你需要理解的东西很少。不论你的目标是什么,不论你用什么编程语言,也不论你之前是做什么的,每个人要做的都是搞清楚什么是for循环,如何创建条件语句,以及其他一些编程语法的基础结构。总体来看也没多少基础概念,因此阶段一所需要的知识面广度很窄。一旦你学完了基础部分,就需要去了解一些更复杂的东西,比如理解错误以及何时使用那些你已经会用的代码,此时你会发现需要学习的额外知识瞬间多了很多。这个时候情况变得不同了,因为一个明确的问题不一定有一个绝对正确的答案……事情开始变得棘手。

    当你进入第三个阶段后,所需的知识面广度就更宽了。你需要理解该使用哪些工具,该学习什么编程语言;学习相关的计算机科学基础,如何写模块化的代码;学习面向对象的编程,学习好的代码风格,以及学会寻求帮助(以上仅列举几个例子)。每一次在Google 或 Hacker News上进行搜索都让你大开眼界,找到的东西多得让你喘不过气,都是些你不知道但感觉自己应该了解的知识。

    你不知道自己不懂哪些东西。

    只有当你终于摸到了一些门道并结束这个“荒漠之旅”以后,所需的知识面广度才会再次缩小。那时,你已经选择了某种技术,并了解了它在这个行业的生态系统中所处的地位。你最终学会了那些你以前不懂的东西(可以说相当了解),也知道如何解决问题。随着你深入学习和事业逐渐起步,你将越来越专注于自己领域的技术。

    阶段三:绝望的困惑期(The Desert of Despair)

    理解了上面两个因素后,你会发现阶段二仅仅是个转折点。快速提升的知识面广度和急剧下降的资源密集度让你在这个阶段倍感痛,因此我称它为“绝望的沙漠”(身处这个阶段犹如在沙漠中一样,迷茫得团团转却找不到方向)。

    本质上来说,你知道这个沙漠肯定在某个地方有出口,但你就是不知道怎么找到它。

    绝望的沙漠

    这个沙漠之旅路途遥远,而且危机四伏。你会发现自己总是沉溺在虚无缥缈的东西里,许多诱人的资源看似包含了你要找的对策,实际上它们只是又一次地让你深陷在了无边无际的砂砾之中。

    或许你已经在Coursera 、Udacity 或 edX上注册了几门MOOC课程,又或许你找到了一个声称能一路指导你的自学教程。你自以为吸取了阶段一(手把手辅导的蜜月期)的经验教训,明白问题并不是那么好解决,但还是忍不住去寻找帮助。你注册的课程信誓旦旦地保证,一定能让你达到前所未有的高度,对此你还信以为真。无论别人怎么说,你都不可能只花一个星期或一个月的时间,也不可能就只上个学院课程就学会这些东西。因此,别再相信那些谎言!

    这个阶段要学的东西很多,远超出你可能预期的那些。尽管你能让许多app运行起来,但要成为一名真正的专业开发人员需要做的更多,在其中你很容易感到迷茫失落。你每一次进步都难以衡量,你如何知道自己该学什么?甚至这些东西是不是你该学的呢?

    就算你走对了方向,却仍然很难衡量你取得的进步。在你能做出外形和功能都符合自己期望的东西之前,你可能会感觉很迷茫。但是只要坚持不懈,并且保持正确的方向不跑偏,终有一天你能将那几个“货真价实”的处女作发布出去,你终于开始上道了。一路走来确实很艰难,但你开发的这个web东东其实也没有那么糟。。。。。。一切都在变好!

    阶段四:煎熬的上升期

    你已经成功穿越了荒漠,也越来越自信。你Google搜索的技能( Google-fu)越来越了得,也能理解那些细致入微的专业博客文章和视频讲座。或许你已经深入掌握了某一种编程语言或框架,并且有自信能创建并发布一个能运行的应用。

    这是“煎熬的上升期”:

    煎熬的上升期(Upswing of Awesome)

    表面看上去一切都OK,但你知道底下还差得远呢。

    虽然你能让那个应用程序运转起来,但底层都发生了什么?你的代码里充满补丁,最糟糕的是,你甚至不知道哪部分很糟糕,也不知道实际上哪部分将运行无误。你不时地取得成就,同时也犯了许多菜鸟级错误,更糟的是,你渐渐开始怀疑怎么还是搞不清自己在做什么。

    这是个两极化的阶段。一边觉得自己是个无所不能的开发者,另一边又觉得自己是个效率极低却深陷其中的狂热新手。走得越远,越是感觉惶恐不安,生怕哪天有人 “揭穿”你代码中的诡计。

    你觉得自己应该算是一名开发者了,但你现在写的代码和在“职业”工作环境下写出的代码相比,差距实在是太大了…

    尽管艰难,最终你一定会成功。那时的你心情澎湃,浑身充满力量,绝望的荒漠已经过去,而令你困惑迷茫的阶段二也成了遥远的回忆。终于,你是真的在走上坡路:你的学习速度更胜从前,也更理解如何学习编程。尽管历尽艰难,但你会经历足够多的最佳实践,把那些宝贵的知识凝结成产品级的技能集。这个可怕的上升期会比你预想的要长,也会让你感觉看不到头,因为你已经离终点如此之近……但你肯定会到达的。如果你在正确的道路(确定未来要做什么)上足够坚持,一定会有人愿意付薪水给你,让你继续学习。工作机会是你的了!

    总体来看

    现在你已经看到了前方的路,也知道了为何会一路艰辛。将前面描述的四个阶段和过程中对它们起作用的两个要素结合起来,就得到了下面这个图表:

    整个过程

    对这个过程的了解归了解,去经历又是另外一回事。你还是先迈出正确的第一步吧。

    如何通过每一个阶段

    整个旅程看似艰难,但坦白地说,学习编程的过程通常都是这么艰苦的。了解自己的目的很重要,尤其当你孤军奋战的时候。但你不会只能靠自己的,因为大部分问题都有捷径可走。学习编程没有人们说的那么简单,但也没有你在绝望时想的那么难。

    我会在这部分介绍一些重要的策略,你能利用它们保持一个正确的方向。

    你在各阶段取得的进步

    I:如何顺利通过手把手辅导的蜜月期(Hand-Holding Honeymoon)

    丰富的可用资源让阶段一充满了乐趣。这些资源能够在接下来的阶段中,很好的培养你的逻辑思维。现在是学习编程的大好时机,记住这两个建议,享受编程的乐趣吧!

    1.   从尝试多种不同的学习资源入手,找到最适合自己的学习方式和最让自己感兴趣的项目类型。最适合你的可能是Khan Academy的快速挑战、 Codecademy的在线练习,或者是Chris Pine的书《Learn to Program》和Code School里那些古怪的try Ruby 训练。刚开始你要思维开阔,不要理会那些告诉你应该学什么的建议。。。。。。在这个阶段学什么都是一样的。
    2.  选择一个,一旦发现它适合自己就要坚持下去。完整学习整个入门教程,你会从中学到写基础脚本和应用需要的所有基础知识。接着,就要准备好开始独立地创建工程。
    II:如何顺利通过困惑的下滑期(Cliff of Confusion)

    几乎每个人都要经历这个阶段,因为成为一名开发者的唯一途径就是不断去开发。你可以通过注册一些自学教程(或那些冒充是“完美课程”的自学教程)来模拟创建工程,但最终你还是要自己动手,这么做不过是拖延了时间。自学教程能很好地让你从更个性化的例程中得到启发,但是在某些情况下你必须脱离过多的辅助,独立解决问题。

    如何过渡到独立地创建工程,下面有三个建议:

    1. 和他人一起工作,哪怕同样是菜鸟。你会惊讶地发现,两双眼睛更容易调试出一个不可能的错误。
    2.  阅读他人的代码,熟悉好的模式。尽量理解为什么作者这么做。同样的道理,不读书是不会想成为一名小说家的,对吧?我将在下一篇文章里集中讨论这个问题,但现在,请仔细注意其他人对任何小问题或工程提出的解决方案。
    3. 从小事做起,不断尝试。对于将来,你应该想过做一些有趣的大工程,但你也必须适应调试的过程,搜索一些带有小型挑战的学习资源。经验是无可替代的。
    III:如何顺利通过绝望的困惑期(Desert of Despair)

    一旦适应了调试过程,最令你头疼的问题就是难以获取所需知识,以及学习所有这些知识必须付出的代价…简直就像处于令人绝望的沙漠里。这种情况下,你真正需要的是一条有效的前进路线。而Mirages of Mania代表那些吸引你的捷径、诱惑你冒险的新世界和速成计划,它们最终只会浪费你的时间。

    因此,要逃离这个沙漠的关键在于:

    1. 拥有一个强烈的目标想去实现,否则,什么有趣但没用的东西都学的话,最终不过瞎忙活一场。如果你在学习之外还有充裕的时间,请忽略这一条。。。。。。
    2. 找到一条有效的路径能直达你设定的目标,并且要验证其可行性。你必须深入思考“这个方法到底能不能帮我实现目标?”,而不是光看那些课程网站或书皮上打出的营销口号和看似真诚的笑脸。
    3. 专注,避免分心。因为你如果是个对学习编程很有兴趣的人,那你肯定也会对所有美妙的事情感兴趣。当编程遇到了困难,你需要进一步解决这个问题,而不是另起炉灶。

    如果能确定一条路并坚持走下去,你最终一定会进入到下一个阶段,而不是花费了数月或数年,最终只是徒劳。

    IV:如何顺利通过煎熬的上升期(Upswing of Awesome)

    这个阶段是最棘手的过渡阶段之一。尽管你能开发出应用程序,但你实际上想成为一名web开发人员。通过这个阶段并找到工作,你需要做三件事情:

    1. 为编程寻找最佳实践,并效仿。你需要理解一个普通方案和最佳方案之间的差别。自己一味闷头钻研,远远比不上别人在真实工作环境下写出的产品级代码,而最佳实践样例很好地体现了这其中的差距。
    2. 检验你的假设。因为你可能回避了一些自己知识体系中的漏洞,甚至你自己都不知道有这些漏洞的存在。你需要检查并修复这些漏洞。
    3.  正确对待那些并不吸引人的技能。尽管它们很少被强调,但是你要过渡到一个专业环境,它们还是相当重要的。这些技能包括测试、数据建模、架构和部署,我们很容易忽略它们,但它们都是优秀开发的基础。

    要做到上面这些并通过最后阶段,关键是要不断获得他人的反馈。完全自学或许富有成效,但难以写出易读、模块化以及可维护的代码,这就使自学者在职业环境中没那么有吸引力。你需要和和那些会怀疑你假设的人们一起工作,他们会提出尖锐的后续问题,并迫使你对自己的知识体系进行查缺补漏。

    那么……这条路能行吗?

    这些可能听起来让人崩溃,但我保证,在你之前已经有很多人坚持不懈地通过了这个旅程。理解前面的路,你就能有一个明确的计划,也会知道如何获取真正有用的帮助,这些都为你踏上这个旅程开了好头。

    很显然,这篇文章没有按我们想的那样,深入挖掘旅程中的每个阶段,也没有提供详细的建议告诉你该怎么做。即便如此,由于我们熟知这个旅程并且对此抱有极大的热情,因此,我们希望倾尽全力帮助大家。

    我们的核心课程是专为衔接整个过程而设计的,但如果你有兴趣自学这个课程,我们将在未来的博客文章中对此进行调整和深入探讨。

    在此我们进一步探讨了各种问题(从寻找导师,到如何缩小差距得到一份web开发的全职工作),如果你也想尝试一下,就在下面注册吧。因为,尽管前方的路充满挑战,但你不是一个人在战斗。

    祝你好运!

    特别感谢Peter DePaulo、Javier Noris、 Michael Alexander、 Andy Brown、 Saul Costa、 Phil Nachum和Quincy Larson分享你们的经历,以及帮助修正这些观点。

    展开全文
  • 为什么编程这么难?!

    万次阅读 2017-12-16 00:00:00
    大数据文摘作品作者: Erik Trautman编译:Shan LIU 、Niki、新知之路、笪洁琼、亭八对每一个决心学习编程的程序员来说,入坑之前,你也许只是一个“穿着正装在办公室里上班”的人。你的学习历程可能是这样:如同...

    大数据文摘作品

    作者: Erik Trautman

    编译:Shan LIU 、Niki、新知之路、笪洁琼、亭八


    对每一个决心学习编程的程序员来说,入坑之前,你也许只是一个“穿着正装在办公室里上班”的人。


    你的学习历程可能是这样:如同一片树叶,开始被各种建议拽着走,直到学完了每一个你能想象到的在线课程。


    最后,虽然你成功拿下了一份软件开发的工作,但也对程序员有了新的认知:“那些看似正常的程序员们其实都是些“反社会”的怪人,鬼才知道他们经历了什么样的精神创伤。”




    一份常见的编程学习过程:先从Ruby着手。很快,开始穿梭在Scala, Clojure和Go等其他语言中了。学习了Emacs,接着是Vim,甚至还了解了Dvorak键盘布局。接着又学习了Linux,甚至还涉猎了Lisp,以及用Python编过代码,后来一直在命令行驻足半年多。


    一起来看一下学习编程要经历哪几个阶段:


    阶段一: 手把手蜜月期


    我们从小就听说过编程如何难学的谣言,就像那些拿来吓唬小孩的无稽之谈,最后把孩子们逼去学了社会科学一样。而另一方面,“学会编程”运动的推广效果确实十分成功,因为它让人们相信,这一行并没有那么高的进入壁垒,而且学习编程毫无坏处。像Codecademy,Treehouse,以及Code School这类机构,以最温柔的方式告诉普通大众,一定会教会任何人学会编程,并让其成为一名资深的开发人员。


    所以,对于进入编程这行抱有过高期望的人,真的没有办法去责怪他们。 


    在很大程度上,这些介绍性的工具手牵手地引导我们穿越那些可怕的参数、条件语句、早期的编程语法阶段,确实给了我们很大的帮助。当我们征服了一个又一个游戏化的挑战,自信心也开始迅速膨胀。我们觉得最终一定可以做到,这并没有什么难的,我们以为自己已经成为一个开发者了。

    (图例纵轴为信心值,横轴为能力水平,虚线区间展示了蜜月期信心随能力增长而增长的曲线图)


    但问题是,我们这个时候的状态正处在“手牵手蜜月期”的阶段,我们以为很快就要走到终点了,但其实只是走了一部分,路才刚刚开始……


    规划前方的路


    在我们深入了解到第二阶段之前,一起来看一看宏观的局面。在这篇文章里,会介绍一段典型的编程学习之旅必经的四个阶段,以及应该如何应对。我们将了解资源的密度以及所需知识的广度这两大要素是如何定义这段旅程的。


    就业准备之路可以用下图曲线表示,它描绘了信心水平如何随着能力增长而变化。

    (图例“编程信心与能力”:纵轴为信心值,横轴为能力水平,虚线从左至右依次分割出手牵手蜜月期、混沌悬崖、绝望沙漠、令人兴奋的上升期四个阶段,第5条虚线标志着工作准备就绪)


    下面将会介绍在剩余的3个阶段会面临的独特挑战,这是每个阶段的核心内容:


    1. 手牵手蜜月期:这是一个充满喜悦的、非常容易取得成功的过程,借助精雕细琢的资源,你会解决那些看似很难,但在网络导师的强大支援下完全是可以攻破的问题。你会掌握基本的语法结构,对于取得的成就很开心。


    2. 混沌悬崖:这是一个痛苦的自我实现的过程,比蜜月期难过得多,你会觉得凭自己的力量似乎什么也做不了。你的首要挑战是不断地调试,同时你还不太知道该怎么问正确的问题,来找到一种可以积聚能量的办法。


    3.绝望沙漠:这是一段很长又很孤独的旅程。在广袤的沙漠里,没有一条清晰的道路,每一个方向似乎都是正确的。你总是绕圈圈,对于穿越沙漠所需的资源如饥似渴。请小心来自“海市蜃楼”的诱惑,它好比沙漠里的汽笛声,会让你误入歧途。


    4.令人兴奋的上升期:终于,你找到了一条穿越沙漠的路,对于如何构建应用软件有了自己的理解。但是你的代码仍然像是地窖仓库,脆弱得像纸牌屋。网站的良好运行给了你信心,你掌握了一些有用的模式,朋友们认为你的界面很酷,但你根本不敢直视界面底下糟糕的代码,最终你还是不知如何得到“可应用于生产环境”的代码。那么怎样才能填补这段距离一份真实工作所需能力的空档?


    在过去几年间,我们采访了成百上千名优秀的开发人员,反复听到了相似的故事。而发布这篇文章的目的,就是希望大家在设计学习路线的时候,既要眼观六路又要做足计划,以绕开前人踩过的坑。


    阶段二: 混沌悬崖


    当我们在第一阶段细数着自己获得了多少徽章与完成了多少挑战的时候,自信心和能力也在不断增长,这被叫做“过度不理智的尖峰”。在这个悬崖险境一面,很多高手都跌在了里面,从而跌落到“编程太难学”的阵营。想要跳跃这个险境,需和第一次坐在电脑前一样,打开文本编辑器,从0开始,在没有任何“浏览器内置编辑器”、搭建好的代码、或是暗示性的帮助下,尝试创建一个项目。


    不要再想着上几个特别的教程来拓展能力,没有任何一个人可以在不飞离对面的前提下触及天空,必须要要经历在一张空白文本文件上施展魔法的过程。

    (图例纵轴为信心值,横轴为能力水平,虚线标亮的第二个区间-即沿曲线顶点向右下滑-为第二阶段“混沌悬崖”)


    这个时候,我们的信心会跌落谷底。有时会为了达成一个几乎不起作用的解决方案日思夜想,仍然感觉缺失一些东西。如同在一场消灭BUG的战役里面,这些BUG与星舰战将相比都让后者显得十分和蔼可亲。我们开始感觉每次胜利都是因为在谷歌搜索时运气好而找到了答案,解决问题的信息开始一落千丈。


    Buuuuuuuuuuuuuuuuuuuuug!!!


    从教育者的角度,以及对于这一行的从业者来说,这是让人十分恼火的阶段。编程可能并不适合每个人,但我们希望你取得进步,因为有时看似最不可能的故事却成为了最伟大的成功事迹。当这个手牵手辅导期结束,学生们被推下悬崖被迫飞行,有太多高潜力者在还未学会挥舞翅膀的情况下,低空盘旋不一会,就撞向了挫折的岩石。


    最可怕的是,你还没有走到实质性内容上。混沌悬崖这个阶段对你来说还为时尚早。当你最终消灭了足够多Bug以结束“埃及的第八次瘟疫”才标志着第二阶段的尾声,这还只是刚刚开始。


    对于那些真正有志于投身该行业的人来说,跨越“混沌悬崖”通常是决定倾其所有地去开启新生活的关键点,然而有太多人没能坚持过来。即使坚持了下来,你又要踏入“绝望荒漠”的阶段。


    两个关键点


    所以究竟什么代表着某一阶段和下个阶段的不同呢?为什么第二阶段(混沌之崖)相对于第一阶段(手拉手蜜月期)这么烦人?理解这些会帮助你明白,如果你有上述的相似经历,那完全不是你的错。


    大体上,在每个阶段有两个关键因素:资源密度和知识体系。在我们了解阶段三之前,先来看看这两个关键因素究竟是什么。


    因素一:资源密度


    如之前所说,刚开始时,仿佛有千千万万的资源在等你去深入了解编程。而且事实正是如此,搜索一下“学习编程”,会找到很多有用的工具、文章、视频和教程。



    不幸的是,在之后阶段资源的饱和度很快开始降低。任何人从初学者到中级阶段都能感受到,可用资源在学习编程与独立应用阶段的差距非常大。


    当知识量累积到阶段三的时候,这个问题更加严重,这也是为什么我们称这种情况为“绝望的沙漠”。但一旦你克服了这个阶段并且开始明白你真正想问什么,那么你的资源又会很快充裕起来,你开始有效利用技术工具,例如编程的博客和屏播。所以,这一阶段的关键就是明白真正想要问什么。


    下图是资源密度在每个阶段的分布(更密的线代表更多的资源):

    因素二:知识体系


    现在我们来谈一个相关的话题:知识体系。这代表每个阶段新知识的宽度。它看起来是这样的:

    刚开始学习时,你需要理解的东西很少。不论什么目的、语言或背景,只需要明白一个“for”循环是什么、如何用条件逻辑框架以及编程语言的基本语法。而且基础知识终究没有那么多,所以知识体系在一开始并不复杂。但一旦掌握基础,需要学习的知识面就一下变宽了,因为你需要了解更复杂的问题,例如了解程序错误以及什么时候用哪些代码。这跟回答普通的问题截然不同,这个特殊的问题并没有一个正确的答案,事情开始复杂起来。


    当进展到第三阶段,知识面开始像气球一样膨胀。现在你开始知道需要什么工具、用什么编程语言、相关的计算机常识、如何写模块化的程序、面对对象编程、好的格式以及如何寻求帮助(这只是列举了一些)。每次去谷歌搜索或者骇客新闻,你就会发现更多你不知道但感觉要学习的知识。你产生了一个永远不知道还有什么不知道的念头。


    当终于找到牵引力并离开了这个“沙漠”之后,你需要的知识才会减少。到那时,你会看明白你所选择的技术和它所处的生态系统,你最终也会了解你不知道什么并去找到解决办法。在事业刚起步的过程中,你的关注点会更加集中。


    阶段三:绝望的沙漠


    理解这些因素后,我们会发现,“混沌之崖”其实只是一个转折点。来自于需要学习的知识面的急剧增加和资源密度的减少的痛苦,会让人进入这种被称之为“绝望的沙漠”的阶段。


    从本质上讲,我们知道这个沙漠肯定有尽头,但却不知道如何走出去。

    并且,这个沙漠长而充满了危险。你会发现自己陷入“狂热的海市蜃楼”,即很多资源看似找到了答案,但这个答案却将你带到一个迷失之地,充满了未知。


    这时候,也许你会从Coursera、Udacity或edX注册了一系列MOOC课程。又或者找到一个课程声明会从头到尾带领你学习。你开始坚信除了这个“手拉手蜜月”课程之外,其它的都不能带领你完成课程的学习。但是,一个人不可能在短短一周,一个月或者一门大学课程里去学会这么多东西。所以,不论别人怎么宣传,一定不要再掉入陷阱!


    一个人需要学习的知识会比我们想象的多得多。即使你能够开始运行一些app,在想要成为一个真正的行业专家这个远大的计划下面也会变得迷茫起来。因为我们不知道需要学习什么甚至是不是真正在学需要的东西?


    即使有了正确的方向,了解自己的学习进展也很难。我们可能会感觉到完全迷失了,但最终还会完成一些我们想要的或者预期的结果。但有了足够的积累和好的导向之后,我们会开始接触几个“真正”的项目,虽然直到目前依然困难重重,但这些网络开发的东西看起来并没有那么难。



    阶段四:令人兴奋的上升期


    我们成功地穿越了沙漠,自信心逐渐提升。又因为谷歌功力实在惊人,我们可以理解那些深入的编程博客和屏播了。并且有的人成为了某种语言或者框架的达人,并且开始有信心制作正常运行的程序。这就是令人兴奋的上升期:

    虽然我们表面看起来胸有成竹,但我们深知还有很多需要学习的内容。比如:你能让程序运行却不知它到底在如何工作;你的代码或许杂乱无章,最可怕的是你不知道哪里写的不好哪里还行;偶尔觉得自己是个编程天才,却并不明白到底程序是如何实现的,并且很快被愚蠢的错误和自我猜疑击退。


    这是一个感受差异两极化的阶段。你感觉有时候自己是一个无坚不摧的码农而有时候又觉得自己是一个蒙着眼在道路上摸索的新手。


    你觉得你应该早已是个合格的码农,但是你在写的代码和一个专业的工作环境相差甚远…


    但最终我们会做到的,因为有太多的动力让我们停不下来。绝望的沙漠被我们抛在了脑后,困惑之崖也早已成为了久远的记忆。我们开始提升的很快,也比以前更加明智,慢慢掌握了足够的联系去把知识结合起来应用到实际中去。


    到达令人兴奋的上升期总是会比预期花更长的时间,并且这种感觉是无止尽的。因为在这条正确的道路上坚持不懈下去,我们就离成功很近了。并且我们的努力使得别人相信我们,愿意付钱支持我们继续学习,工作也不再是问题。



    整体回顾这四个阶段的情况


    现在我们已经知道了步入编程行业的整个历程,并了解到为什么这么难。当把上述的四个阶段过程与各个因素都整合在一起后,得出了下面的图:

    图例说明(从左至右):信心、资源密度、知识领域、胜任力、手把手的蜜月期、混沌悬崖、绝望沙漠、快速成长期、专业水平


    “知道”和“会做”是两回事,我们终于迈出了正确的第一步。


    如何完成历炼


    坦率地说,整个过程看起来很艰辛,尤其是当我们独自前行时。但我们并不是一个人在战斗,实际上在很多时候是有捷径可循的。学习编程并不像人们想象的那么容易,但也不是绝望的深渊。


    在这一部分,介绍一些关键策略来引导大家沿着正确的方向行进。


    图例说明(从左到右):完成学代码的历练、信心、胜任力、构建、合作、设定目标、专注、获得反馈、专业水平


    要学会享受“手把手的蜜月期”。因为有大量的资源可以令你在手把手蜜月期中感到乐趣无穷,使我们建立今后必不可缺的逻辑性思维。所以尽量享受这个过程,并牢记以下两点:


    1. 尝试多种资源以确定最适合你的学习方式。开始阶段尽可能开放思路,不要在意你想具体学哪一种计算机语言,因为所有的语言在这一阶段都是一样的。


    2. 一旦选择一个适合自己的资源,坚持下去,完成他们的介绍性课程,你应该可以掌握到编写基本脚本和app的基础知识,并开始准备自建程序了。


    如何在“混沌悬崖”阶段坚持


    几乎所有码农都体验过“困惑悬崖”,因为这是成手的必经之路。你可以假装注册了几门课(或扮作“已经完成”了这些课程)期望完成了这个阶段,但那只是想法拖延,这个阶段无法避免。那些课程的确提供了更高频次互动的介绍性内容,但你必须要摆脱这些“安抚奶嘴”,在某些时刻面对真实的世界。


    以下三招可以让我们更好的过渡到自建程序阶段:


    1. 和其他人共事,即使是另一个新手。你将会惊诧到原来互相检查出被自己忽视的错误是那么简单。


    2. 多看看其他人编写的代码,多学习好的编码方式。尽量去理解作者为什么这么做。就像你若想成为作家,必须要多读书一样。我们将在即将发布的文章中重点介绍这一点,但是现在请关注他人为解决任意一个微小的问题或项目所编写的程序。


    3.从小事入手,不断的做下去。你的目标虽然要成为做大项目的高手,但目前却需要着眼于寻找、调试小型的项目。这种经历是不可代替的。


    如何在“绝望沙漠”阶段生存


    一旦你具备了调试程序的能力,最大的问题将是面对着大量需要掌握的知识却感到无从下手去将它们统统学完,即“绝望沙漠”。这种情况下,你需要的就是沿着既定的大路坚定地走下去。看似有趣的小路、令人好奇的“兔子洞”和号称快速提高技巧的把戏实际上都是浪费时间的海市蜃楼。


    所以尽快逃脱“绝望沙漠”的关键是:


    1. 为实现你的期许而抱有强烈执着的信念,否则你会陷入对所有好奇的事都插上一脚但却原地打转的怪圈,徒劳无功。但如果你有的是时间,好吧,请忽略这条……


    2. 确保你行进的方向明确的通往你的目标。这个目标可比那些营销口号、在线课程网站上的笑脸或书皮上“将帮助你实现……”的要深刻、严肃得多,需要你深思熟虑。


    3. 保持专注,避免分心。因为如果你是一个对编程感兴趣的人,那么你一定也对其它很酷的事感兴趣。当编程进入到攻坚阶段,你需要调整自己保持向前的动力而不是半途而废去寻找其它乐子。


    只有“咬定青山不放松”,你才可以进入下一个阶段,而不是花上数月甚至数年去追逐“镜中花、水中月”。


    如何在“快速成长期”中学得更多更好


    快速成长期是最棘手的过渡期之一。你虽然能够开发应用了,但你更想成为一名真正的网页开发工程师。想要度过这个阶段并达到入行工作的标准,你需要完成以下三件事:


    1.  做最棒的编程练习题。你需要理解解决方案和最佳解决方案之间的差距。这些好的练习题可以帮助你达到生产出符合专业级别的高质量代码的标准。


    2. 检查你的程序,因为你可能已经写了好多代码,而这些代码中藏着你甚至都不知道的漏洞。你需要诊断并修复它们。


    3. 解决那些很少被处理但是转换到专业环境时却是高度重要的一板一眼的技能。包括测试、数据建模、架构和配置,这些技能看似简单,但对于良好的开发工作来说是非常重要的基础。


    完成上述工作并顺利度过快速成长期的关键是获得反馈。那些完全依靠自学的学生或许富有成效,但却缺乏专业级别的那种清晰的、模块化的、易维护的代码写作能力。你需要和其它人一起质疑你的假设、提出尖锐的后续问题,并迫使你去解决这些漏洞。


    那么,你能做到吗?


    上述内容看起来相当繁重,但想想那些已经走过这些历程的前辈们。虽然本文没有详细解释每一个阶段,或者提供大家迫切需要的具体建议。但通过对本文介绍的各个阶段的理解,大家知道了如何安排合理的计划,从而获得合适的帮助,已经处于一个有利的位置了。


    前路漫漫,但你并不孤单。祝大家好运!


    原文地址:

    http://www.vikingcodeschool.com/posts/why-learning-to-code-is-so-damn-hard


    数学科学实训营第5期

    100人限额免费预习班


    Q:编程基础不好,能学会数据科学吗?

    A:能,《数据科学实训营》可以做到!


    海报的承诺我们负责兑现

    而你需要负责:

    · 充足的学习时间&决心

    · 最基本的相关知识


    如果是小白,那就来免费预习班做准备吧!

    往期学员会告诉你,他们是如何做到的!



    志愿者介绍

    回复志愿者”加入我们

    往期精彩文章

    点击图片阅读

    吴恩达成立新公司,签约富士康,专注制造业AI变革(附视频)

    展开全文
  • 编程难不难?

    千次阅读 2012-07-20 17:51:52
    编程难不难?编程和修房子一样可难可易易者,小朋友可以搭棚屋难者,秦皇花几十年,举国之力才修了个宫
    编程难不难?
    


    编程和修房子一样


    可难可易

    易者,小朋友可以搭棚屋
    难者,秦皇花几十年,举国之力才修了个宫
    展开全文
  • 为什么大学生认为JAVA编程难

    千次阅读 2018-05-22 17:46:44
    我发现,进入计算机专业就读的学生,最初至少有一大半对真实...我写了将近二十年的代码,虽然不靠编程吃饭,但也似乎勉强可算是个老程序员,我对编程的看法可总结两句:何以解忧,唯有编程!我经常在想一个问题:...

    我发现,进入计算机专业就读的学生,最初至少有一大半对真实的软件开发根本不了解,是“一张白纸”。

    不幸的是,学了四年之后,许多张“白纸”又变成了许多罐“浆糊”,带着对软件开发可能是畏惧,也可能是无所谓,但绝对不是喜欢的感触离开校园。

    编程真的那么没劲?那么难和枯燥?

    我写了将近二十年的代码,虽然不靠编程吃饭,但也似乎勉强可算是个老程序员,我对编程的看法可总结为两句:何以解忧,唯有编程!

    我经常在想一个问题:编程其实是很有趣很好玩很实用并很有成就感的一件事,为什么会有这么多的学生觉得编程很难?

    我认为这张图道出了问题的关键——学习过程中的“正向”兴趣循环是否成功地建立。

    强烈的兴趣与不断获得的成就感是整个学习过程的“引擎”,它为学生完成整个学习任务提供源源不断的强大动力。有无数的事实支持这个观点。

    而传统的教学观点认为,本科的主要教育目标之一是为学生在本专业领域未来的发展“打下扎实的理论与实践基础”,所以从一开始就要“严格要求”,“科学训练”。

    这个观点不能说错,但我认为,我们的计算机教育,尤其是针对初学者的教育,首要的任务是引发兴趣。没有兴趣,一切免谈。

    之所以很多大学生觉得编程难,其原因就是现有的计算机教学方式从一开始就给了这些学生“痛苦”的编程体验,并且在后期枯燥的专业课程学习中不断得到强化,最终使很多大学生对编程敬而远之或畏之如虎。

    展开全文
  • 为什么C++是最学的编程语言?

    万次阅读 多人点赞 2019-04-01 19:15:36
    很多已经做了几年的C++程序员已经很自信觉得这门编程语言算是熟悉阶段了,但是当重新对这门...在你因为很懂她,最后还不知道啥莫名其妙的生气。 c++最大的缺点是让你花费大量时间学习这门语言的语法上,而不是解...
  • 学习Java编程语言

    千次阅读 2018-03-19 21:04:15
    学习Java编程语言这是很多希望学习计算机软件开发的人比较纠结的问题。实际上,Java语言是非常易学的,Java语言机遇C语言,却又高于C语言。Java语言简单易学的特性使得大多数程序员很容易学习和使用Java。...
  • 为何编程如此之?Erlang 之父的感触

    千次阅读 热门讨论 2018-01-16 07:02:12
    编程为什么这么难? 多年前我曾一度认为编程很简单,然而随着岁月的流逝,我终于意识到编程并不是件容易的事。这是因为,我所认为的「究竟什么是编程」和「程序员到底是做什么的」,在感知上已经渐渐地发生
  • 从事嵌入式开发多年,有三种语言玩的比较多C/C++ java,从编程语言的难度来讲C++是最难得,而且也是最入门的编程语言,很多编程老手都是这个结论,为什么C++是最学的编程语言,虽然学但还是很多编程老手喜欢...
  • 自学编程到底有多?

    千次阅读 2021-01-22 15:33:51
    男怕入错行,女怕嫁错郎。...编程本来并不,但是你没有基础,缺乏计算机基础知识,那就非常困难,难于上青天。 作为自学党,不知道一开始要学些什么,学到什么程序,学到后能找到工作吗,工作后用到的..
  • 毕竟是没有什么技术的行业,在工厂做个经理或者主管一年也就十来万,而且压力很大。一直很后悔没有做IT这行,现在做个普通码农的待遇都比我多了,而且最近发现自己也很喜欢,在自学C#,毕竟大学学过C语言,很多知识...
  • 我是一个“貌似”很热爱编程的人,我想把这个编程作为我的职业。我现在学的专业是临床医学,我觉得这个很烂,没兴趣,很抵触。我唯一能走的可能就是软件。但是,我不知道我是不是真正的能在这个领域做出什么成就来,...
  • 什么软件编程是最的?

    千次阅读 2011-02-19 23:19:00
    本人在IT业已经呆了十年,过去认为IT业中最的是“需求分析”--因为,对于MIS系统应用来说,它的实现技术总体上讲不是很复杂--不管是EJB应用,或者轻量级的应用,复杂的只是需要的分析。 但是,当我开始写游戏时,...
  • 为什么要去学习函数式编程

    千次阅读 2020-12-31 14:58:53
    函数式编程比较复杂比较枯燥,但是为了了解react和...为什么要去学习函数式编程 函数式编程其实相对于计算机的历史而言是一个非常古老的概念,甚至早已第一台计算机的诞生。他的演算并非设计在计算机上执行,而是在20世
  • 自学编程需要注意什么

    千次阅读 多人点赞 2017-12-20 13:43:35
    前几天在知乎上看到这么一个问题,一位在读学生,自己非常想自学编程,但是很怕走一些弯路,于是提问「自学编程需要注意什么?」,我看了一圈回答,看起来都不是自学过来的,很多回答抓不到重点。我的读者都知道,我...
  • 为什么要学习编程?孩子学习编程有用吗? 很多家长认为:技能学习应该从娃娃抓起,而编程技能正是众多技能学习中最为重要的技能学习之一。之前在上海大学举行的一项教育机器人比赛中,近千名选手参赛,其中不乏学龄...
  • 为什么要学习多种编程语言

    万次阅读 2019-02-23 11:51:38
    如果一直看我博文的人应该了解,我掌握的编程语言就不少,系统编程的C/C++,Web开发的Java和JavaScript,脚本语言Python和Shell,最近非常喜爱的全能语言Golang,迫于Android开发使用的Kotlin,iOS开发的O...
  • 为什么成为优秀程序员这么难

    千次阅读 多人点赞 2012-01-07 09:09:41
    回头看看自己的这几年工作经历,时间不算长却也有了不少感悟。不是对环境、对别人的抱怨,...学这么多技术有什么用?会点工作和面试中能用到的框架不就行了。那种能让我,或者能面对着我说起某个技术问题两眼放光的知己
  • 为什么选择Python 知道了代码编程的优势,也许你还想问,编程语言那么多,应该如何选择呢?这里要介绍一种需要拿着游标卡尺学习的语言,他还被称为“最易学习的语言”,这就是Python。 Python 是一款服务器端解释型...
  • 世界上最的5种编程语言

    万次阅读 多人点赞 2020-10-14 22:27:48
    当我们谈论 c,c++ ,Java,Python的时候,有些语言不仅很,而且对于大多数软件开发者来说几乎是无法理解的。 这些语言被称为深奥的编程语言,英文称为esoteric programming language,简称esolang。 下面是五种最...
  • 网络编程什么

    万次阅读 多人点赞 2018-01-03 11:32:29
    对于初学者,或者没有接触过网络编程的程序员,会觉得网络编程涉及的知识很高深,很,其实这是一种误解,当你的语法熟悉以后,其实基本的网络编程现在已经被实现的异常简单了。  网络编程什么?  网络...
  • 自学编程难吗?如何学?

    万次阅读 多人点赞 2018-11-04 16:00:50
    推荐给那些喜欢编程的,迷失学习方向的伙伴! 自学编程2年来,加过n多群,泡过n多论坛,接触过心怀激情的编程新人,遇到过沉着冷静的技术大牛……编程,吸引了一批又一批的热血青年,或许是为了理想,或许是心中...
  • 作为 CSDN 的前排博主(18 万+关注,有点飘了哈),我接触了太多太多想学编程、想把编程学好的人,有从别的专业转过来的,有零基础自学的,有科班出身的。他们当中的一部分人,学着学着就放弃了,或者还在放弃的路上...
  • 01常收到一些在校非计算机软件学生的提问,编程难吗?我也想学编程?编程难吗?对于这个问题,我想大多数人都会认为难,我也不例外。但难在哪里?不同的人有不同的理解,因为编程本...
  • 史上最难编程的软件是什么

    千次阅读 2018-04-02 00:00:00
    它有 4500 万行代码,完成了硬件接口、操作文件系统、网络管理系统、监督内存访问等诸多功能……还有哪些软件是最编写的?欢迎留下你的答案。正文共:1138 字 预计阅读时间:3 分钟简评:Quora上的一个问题,摘取...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 569,618
精华内容 227,847
关键字:

编程为什么这么难