编程从哪里从零开始学编程起到哪里学好

学编程为什么这么难?每个新手绝对要知道的那些事 - 文章 - 伯乐在线
& 学编程为什么这么难?每个新手绝对要知道的那些事
Quincy Larson曾经只是个穿西装坐办公室的家伙,有一天,他决定要学习编程。于是,他到处打听关于编程的事情。他从Ruby入手,接着很快学了Scala、Clojure和Go等多种其他的编程语言。他用过Emacs和Vim,甚至还学过Dvorak键盘布局。他不仅学会了Linux,涉足过Lisp,并且有超过半年的时间靠在命令行下编 Python 代码为生。
Quincy就像龙卷风中的一片叶子,别人给他的建议让他在编程的世界中晕头转向,直到他学完了“能想到的每一个在线教程”。尽管在故事的最后,Quincy,但他说:
…我认为,我碰到过的程序员们看似一帆风顺,实际上他们都饱尝过学习编程的痛苦,只是他们都压抑着没有说出来。
唉,这些话是不是听着很耳熟?
阶段一:手把手辅导的蜜月期(Hand-Holding Honeymoon)
每个即将进入编程行业的人都满怀期待,这很正常。
一方面,你在年轻的时候总听流言说编程如何如何难,但它们就像老奶奶讲的吓人故事,是用来唬孩子们去学习社会科学而已。
而另一方面,“学习编程”运动已经取得了很多成就,它打破障碍并向人们展示编程其实也没那么可怕。 像 、和
这样触手可得的工具,它们可以确保你(甚至任何人)不仅能学会编程,还能成为一名熟练的开发者。
突然间,问题不再是对编程的恐惧,而是抱有过多希望,期望太高。
而且最重要的是,这些入门工具足以像教小孩过马路那样,引导你学习那些令人头疼的变量和条件语句,以及初级编程语法。当你不断完成游戏般的挑战时,你的自信会随之大增。说不定你最后就学会了编程!学会编程并不难,基本上你已经是一名开发者了。
手把手辅导的蜜月期(The Hand-Holding Honeymoon)
现在问题来了,你正处于编程初期阶段,我喜欢称之为“手把手辅导的蜜月期”。尽管你可能感觉成功就在不远处,但其实你才刚踏出第一步。一切才刚刚开始……
描绘未来之路
在我们一头扎进第二阶段之前,先来仔细看看整个过程。
在这篇文章中,我将介绍典型的编程之路上必须经过的四个阶段,以及如何平稳渡过每个阶段。你也会看到资源的丰富程度和知识范围(各个阶段必须掌握的)的广度这两个关键因素是如何在编程之路上起到决定性作用的。
旅程艰辛就为了达到找工作的水平,这个艰苦的过程可以描绘成你的自信心随能力增长的变化曲线。
学习编程之旅
由于自信和幸福感紧密关联,而且只有在自信和能力相匹配时,才能正式地说你可以“上岗”了,因此,上图中的自信和竞争力是息息相关的。
随后我们会观察剩下的三个阶段中存在的独特挑战,但每个阶段本质上都包含了上面的这种关系:
手把手辅导的蜜月期(The Hand Holding Honeymoon),这个阶段充满了乐趣,面对看似棘手的问题,那些高质量资源的鼎力相助让你轻松取胜。虽然你主要学的是基础语法,但完成的工作会让你很有成就感。
充满迷惑的下滑期(The Cliff of Confusion),在这个阶段你会痛苦地发现,手把手辅导的阶段结束后,事情变得更困难了,实际上你没法独立做任何事。在你试图重新振作时,你面对的首要挑战不仅是要反复调试,而且你还不懂怎么问问题。
绝望的迷茫期(The Desert of Despair),这个阶段漫长而又孤独。在这个沙漠(充满困惑迷茫就像身处沙漠)中几乎没有路,每个方向都看似正确,但你却总是在绕圈,你极度渴望找到办法逃出生天。警惕“狂燥中出现的海市蜃楼(Mirages of Mania)”,它们就像是沙漠的迷魂曲,将引诱你误入歧途。
煎熬的上升期(The Upswing of Awesome),这个阶段里你终于找到了一条路走出沙漠,并且总体清楚了如何创建应用程序。但你的代码仍然很封闭,到处都是漏洞,就像纸糊的房子一样摇摇欲坠。你的网站可以运行并且你已经掌握了几种有效的模式,这些都让你的信心大增,而且你的朋友们都在称赞你的网站很酷,但实际上你知道底层连自己都不忍直视。你根本不知道该如何写出“可发布”的成熟代码。该如何弥补这个差距,从而找到一份真正的工作呢?
在过去这些年里,我已经面试过成百上千的开发者,他们都心怀抱负,并且不断给我说着相同的经历。我写这篇文章的目的,是希望你能够在学习的路上擦亮双眼,做一个详细的计划避开很多前人都曾掉入过的陷阱。
让我们回到阶段二吧…
阶段二:迷惑的下滑期(The Cliff of Confusion)
你正处于阶段一,也就是“手把手辅导的蜜月期(Hand-Holding Honeymoon)”,你正在获取各种奖励徽章并完成编程挑战,同时你的自信和能力都在蹭蹭地上涨。情况也不是很糟糕…那大惊小怪些什么呢?因为你的自信已经失去理智地膨胀到了极点。。。。。。
小心了!你即将踏出悬崖,多少英雄在此折腰沦为“编程太难”一族。这错误的一步发生在你第一次在键盘前坐下,打开文本编辑器并试图从零开始创建一个工程,但你却不用任何很赞的线上编辑器,也不用别人的代码框架或寻求有用的提示。
简直扯淡。
也许你能照着自学教程依葫芦画瓢,但是没有人可以一步登天,而且从某种意义上来说,你要徒手从一个空白的文本文件开始简直是异想天开。你才刚刚进入学习的第二个阶段,接下去你的自信将跌落谷底,这也是为什么我称之为“困惑的下滑期(Cliff of Confusion)”。
困惑的下滑期(The Cliff of Confusion)
你开始创建工程。你抓耳挠腮却只找到了一个勉强能用的方案,但总觉得哪里不对。为了你的(也就是你的大工程)能表现不错,你陷入了和bug的战争之中。似乎只有通过一键谷歌才能解决每一个问题,你那些过去能搞定问题的自信荡然无存。
Buuuuuuuuuuuuuuuuuuuuug!!!
不论是作为教育者,还是作为这个行业的从业者,在大家看来这个阶段都格外令人沮丧。任何人写的程序都可能有bug,但我们还是希望你能有所进步,因为最不可能的地方也能成就最伟大的成功。
在阶段一结束时,学生们被迫进入了阶段二。他们必须飞跃这个阶段,但太多有潜力的人却不去掌握真正有用的技能,而是一味地停留在挫败的情绪中。
可怕的是,你甚至还没有遇到过真正棘手的事情。阶段二的结束还早得很。当你解决掉足够多的bug结束了大部分的痛苦,并且已经完成了几个工程,尽管这标志着阶段二的结束,但总体来说你也仍然是刚上路而已啦。
对那些真正准备从事这个行业的人来说,他们通常会在渡过阶段二以后决定是否全身心投入这个新生活。但太多的人放弃了。而不幸的是,你现在才刚到阶段三(“绝望的迷茫期”)的入口。
起作用的两个关键因素
那么前两个阶段的真正区别是什么呢?为何相比阶段一(手把手辅导的蜜月期)来说阶段二(困惑的下滑期)给人的感受会如此糟糕?如果你的经历很像我们前面描述的那样,只要理解了这两个问题,你就能释怀了。
从根本上来说,每个阶段都有两股关键力量在起作用,那就是资源的密集程度和知识面的广度。在探索它们对阶段三的影响之前,我们先来看看这两个因素到底是什么。
因素一:资源密集度
正如我前面所说,一开始你会感觉有遍地的资源在引导你上手编程。事实也确实如此!
搜索“”,你会得到一大堆有用的工具、文章、视频以及自学教程。而且,老实说它们都很棒!从未有过如此多的方法指导人们学习编程。
不幸的是,后期可供使用的资源太少了。每一个从初学者成长到当前状态的人都能体会这其中的差距之大,相比刚开始入手,当你试图完全依靠自己创建工程时,能利用的资源就少得多。
进入阶段三后需要了解的知识猛然陡增,恶化了上面的问题,这也是为什么我把这个阶段称之为“绝望的迷茫期”。一旦你度过了这个阶段,并且开始了解你需要搜索的东西,你就会找到很多资源,还能使用一些技术工具,如专业博客和视频讲座。矛盾的部分仅仅在于明白该问什么问题。
下图显示了各个阶段中的资源密集程度(线条越密集表示资源越多):
各阶段的资源密集度
因素二:知识面的广度
现在我们来聊聊一个相关的话题——知识面的广度。它表示你在每个阶段中必须学习的新知识的总体广度。下图就显示了这个因素在每个阶段中的情况:
各阶段所需知识的广度
刚开始学编程时,你需要理解的东西很少。不论你的目标是什么,不论你用什么编程语言,也不论你之前是做什么的,每个人要做的都是搞清楚什么是for循环,如何创建条件语句,以及其他一些编程语法的基础结构。总体来看也没多少基础概念,因此阶段一所需要的知识面广度很窄。一旦你学完了基础部分,就需要去了解一些更复杂的东西,比如理解错误以及何时使用那些你已经会用的代码,此时你会发现需要学习的额外知识瞬间多了很多。这个时候情况变得不同了,因为一个明确的问题不一定有一个绝对正确的答案……事情开始变得棘手。
当你进入第三个阶段后,所需的知识面广度就更宽了。你需要理解该使用哪些工具,该学习什么编程语言;学习相关的计算机科学基础,如何写模块化的代码;学习面向对象的编程,学习好的代码风格,以及学会寻求帮助(以上仅列举几个例子)。每一次在 或 上进行搜索都让你大开眼界,找到的东西多得让你喘不过气,都是些你不知道但感觉自己应该了解的知识。
你不知道自己不懂哪些东西。
只有当你终于摸到了一些门道并结束这个“荒漠之旅”以后,所需的知识面广度才会再次缩小。那时,你已经选择了某种技术,并了解了它在这个行业的生态系统中所处的地位。你最终学会了那些你以前不懂的东西(可以说相当了解),也知道如何解决问题。随着你深入学习和事业逐渐起步,你将越来越专注于自己领域的技术。
阶段三:绝望的困惑期(The Desert of Despair)
理解了上面两个因素后,你会发现阶段二仅仅是个转折点。快速提升的知识面广度和急剧下降的资源密集度让你在这个阶段倍感痛,因此我称它为“绝望的沙漠”(身处这个阶段犹如在沙漠中一样,迷茫得团团转却找不到方向)。
本质上来说,你知道这个沙漠肯定在某个地方有出口,但你就是不知道怎么找到它。
绝望的沙漠
这个沙漠之旅路途遥远,而且危机四伏。你会发现自己总是沉溺在虚无缥缈的东西里,许多诱人的资源看似包含了你要找的对策,实际上它们只是又一次地让你深陷在了无边无际的砂砾之中。
或许你已经在 、 或 上注册了几门课程,又或许你找到了一个声称能一路指导你的自学教程。你自以为吸取了阶段一(手把手辅导的蜜月期)的经验教训,明白问题并不是那么好解决,但还是忍不住去寻找帮助。你注册的课程信誓旦旦地保证,一定能让你达到前所未有的高度,对此你还信以为真。无论别人怎么说,你都不可能只花一个星期或一个月的时间,也不可能就只上个学院课程就学会这些东西。因此,别再相信那些谎言!
这个阶段要学的东西很多,远超出你可能预期的那些。尽管你能让许多app运行起来,但要成为一名真正的专业开发人员需要做的更多,在其中你很容易感到迷茫失落。你每一次进步都难以衡量,你如何知道自己该学什么?甚至这些东西是不是你该学的呢?
就算你走对了方向,却仍然很难衡量你取得的进步。在你能做出外形和功能都符合自己期望的东西之前,你可能会感觉很迷茫。但是只要坚持不懈,并且保持正确的方向不跑偏,终有一天你能将那几个“货真价实”的处女作发布出去,你终于开始上道了。一路走来确实很艰难,但你开发的这个web东东其实也没有那么糟。。。。。。一切都在变好!
阶段四:煎熬的上升期
你已经成功穿越了荒漠,也越来越自信。你Google搜索的技能( )越来越了得,也能理解那些细致入微的专业博客文章和视频讲座。或许你已经深入掌握了某一种编程语言或框架,并且有自信能创建并发布一个能运行的应用。
这是“煎熬的上升期”:
煎熬的上升期(Upswing of Awesome)
表面看上去一切都OK,但你知道底下还差得远呢。
虽然你能让那个应用程序运转起来,但底层都发生了什么?你的代码里充满补丁,最糟糕的是,你甚至不知道哪部分很糟糕,也不知道实际上哪部分将运行无误。你不时地取得成就,同时也犯了许多菜鸟级错误,更糟的是,你渐渐开始怀疑怎么还是搞不清自己在做什么。
这是个两极化的阶段。一边觉得自己是个无所不能的开发者,另一边又觉得自己是个效率极低却深陷其中的狂热新手。走得越远,越是感觉惶恐不安,生怕哪天有人 “揭穿”你代码中的诡计。
你觉得自己应该算是一名开发者了,但你现在写的代码和在“职业”工作环境下写出的代码相比,差距实在是太大了…
尽管艰难,最终你一定会成功。那时的你心情澎湃,浑身充满力量,绝望的荒漠已经过去,而令你困惑迷茫的阶段二也成了遥远的回忆。终于,你是真的在走上坡路:你的学习速度更胜从前,也更理解如何学习编程。尽管历尽艰难,但你会经历足够多的最佳实践,把那些宝贵的知识凝结成产品级的技能集。这个可怕的上升期会比你预想的要长,也会让你感觉看不到头,因为你已经离终点如此之近……但你肯定会到达的。如果你在正确的道路(确定未来要做什么)上足够坚持,一定会有人愿意付薪水给你,让你继续学习。工作机会是你的了!
现在你已经看到了前方的路,也知道了为何会一路艰辛。将前面描述的四个阶段和过程中对它们起作用的两个要素结合起来,就得到了下面这个图表:
对这个过程的了解归了解,去经历又是另外一回事。你还是先迈出正确的第一步吧。
如何通过每一个阶段
整个旅程看似艰难,但坦白地说,学习编程的过程通常都是这么艰苦的。了解自己的目的很重要,尤其当你孤军奋战的时候。但你不会只能靠自己的,因为大部分问题都有捷径可走。学习编程没有人们说的那么简单,但也没有你在绝望时想的那么难。
我会在这部分介绍一些重要的策略,你能利用它们保持一个正确的方向。
你在各阶段取得的进步
I:如何顺利通过手把手辅导的蜜月期(Hand-Holding Honeymoon)
丰富的可用资源让阶段一充满了乐趣。这些资源能够在接下来的阶段中,很好的培养你的逻辑思维。现在是学习编程的大好时机,记住这两个建议,享受编程的乐趣吧!
从尝试多种不同的学习资源入手,找到最适合自己的学习方式和最让自己感兴趣的项目类型。最适合你的可能是的快速挑战、 的在线练习,或者是Chris Pine的书《》和Code School里那些古怪的 训练。刚开始你要思维开阔,不要理会那些告诉你应该学什么的建议。。。。。。在这个阶段学什么都是一样的。
选择一个,一旦发现它适合自己就要坚持下去。完整学习整个入门教程,你会从中学到写基础脚本和应用需要的所有基础知识。接着,就要准备好开始独立地创建工程。
II:如何顺利通过困惑的下滑期(Cliff of Confusion)
几乎每个人都要经历这个阶段,因为成为一名开发者的唯一途径就是不断去开发。你可以通过注册一些自学教程(或那些冒充是“完美课程”的自学教程)来模拟创建工程,但最终你还是要自己动手,这么做不过是拖延了时间。自学教程能很好地让你从更个性化的例程中得到启发,但是在某些情况下你必须脱离过多的辅助,独立解决问题。
如何过渡到独立地创建工程,下面有三个建议:
和他人一起工作,哪怕同样是菜鸟。你会惊讶地发现,两双眼睛更容易调试出一个不可能的错误。
阅读他人的代码,熟悉好的模式。尽量理解为什么作者这么做。同样的道理,不读书是不会想成为一名小说家的,对吧?我将在下一篇文章里集中讨论这个问题,但现在,请仔细注意其他人对任何小问题或工程提出的解决方案。
从小事做起,不断尝试。对于将来,你应该想过做一些有趣的大工程,但你也必须适应调试的过程,搜索一些带有小型挑战的学习资源。经验是无可替代的。
III:如何顺利通过绝望的困惑期(Desert of Despair)
一旦适应了调试过程,最令你头疼的问题就是难以获取所需知识,以及学习所有这些知识必须付出的代价…简直就像处于令人绝望的沙漠里。这种情况下,你真正需要的是一条有效的前进路线。而Mirages of Mania代表那些吸引你的捷径、诱惑你冒险的新世界和速成计划,它们最终只会浪费你的时间。
因此,要逃离这个沙漠的关键在于:
拥有一个强烈的目标想去实现,否则,什么有趣但没用的东西都学的话,最终不过瞎忙活一场。如果你在学习之外还有充裕的时间,请忽略这一条。。。。。。
找到一条有效的路径能直达你设定的目标,并且要验证其可行性。你必须深入思考“这个方法到底能不能帮我实现目标?”,而不是光看那些课程网站或书皮上打出的营销口号和看似真诚的笑脸。
专注,避免分心。因为你如果是个对学习编程很有兴趣的人,那你肯定也会对所有美妙的事情感兴趣。当编程遇到了困难,你需要进一步解决这个问题,而不是另起炉灶。
如果能确定一条路并坚持走下去,你最终一定会进入到下一个阶段,而不是花费了数月或数年,最终只是徒劳。
IV:如何顺利通过煎熬的上升期(Upswing of Awesome)
这个阶段是最棘手的过渡阶段之一。尽管你能开发出应用程序,但你实际上想成为一名web开发人员。通过这个阶段并找到工作,你需要做三件事情:
为编程寻找最佳实践,并效仿。你需要理解一个普通方案和最佳方案之间的差别。自己一味闷头钻研,远远比不上别人在真实工作环境下写出的产品级代码,而最佳实践样例很好地体现了这其中的差距。
检验你的假设。因为你可能回避了一些自己知识体系中的漏洞,甚至你自己都不知道有这些漏洞的存在。你需要检查并修复这些漏洞。
正确对待那些并不吸引人的技能。尽管它们很少被强调,但是你要过渡到一个专业环境,它们还是相当重要的。这些技能包括测试、数据建模、架构和部署,我们很容易忽略它们,但它们都是优秀开发的基础。
要做到上面这些并通过最后阶段,关键是要不断获得他人的反馈。完全自学或许富有成效,但难以写出易读、模块化以及可维护的代码,这就使自学者在职业环境中没那么有吸引力。你需要和和那些会怀疑你假设的人们一起工作,他们会提出尖锐的后续问题,并迫使你对自己的知识体系进行查缺补漏。
那么……这条路能行吗?
这些可能听起来让人崩溃,但我保证,在你之前已经有很多人坚持不懈地通过了这个旅程。理解前面的路,你就能有一个明确的计划,也会知道如何获取真正有用的帮助,这些都为你踏上这个旅程开了好头。
很显然,这篇文章没有按我们想的那样,深入挖掘旅程中的每个阶段,也没有提供详细的建议告诉你该怎么做。即便如此,由于我们熟知这个旅程并且对此抱有极大的热情,因此,我们希望倾尽全力帮助大家。
我们的是专为衔接整个过程而设计的,但如果你有兴趣自学这个课程,我们将在未来的博客文章中对此进行调整和深入探讨。
在此我们进一步探讨了各种问题(从寻找导师,到如何缩小差距得到一份web开发的全职工作),如果你也想尝试一下,就在下面注册吧。因为,尽管前方的路充满挑战,但你不是一个人在战斗。
祝你好运!
特别感谢Peter DePaulo、Javier Noris、 Michael Alexander、 Andy Brown、 Saul Costa、 Phil Nachum和分享你们的经历,以及帮助修正这些观点。
关于作者:
可能感兴趣的话题
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线内容团队正试图以我们微薄的力量,把优秀的原创文章和译文分享给读者,为“快餐”添加一些“营养”元素。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2017 伯乐在线作者:张砷镓
首发于微信公众号:镓话(jia-talking)
有一家饭店的大厨,烧得一手好菜,经过口碑相传,客人从五湖四海闻名而来。然而这对饭店的老板来说,并不单纯是一个好消息。因为客人不是奔着饭店,而是奔着大厨的手艺来的。老板必须想办法留住这位大厨,否则他一旦被别人挖走,饭店的生意就会一落千丈了。然而即便老板不惜血本保证了大厨的忠诚度,风险也依然存在:
大厨休息或请假的时候,菜品的口味就无法让顾客满意;
大厨只有一个,如果想在多个地方开分店,那口味也就不能保证了;
大厨再厉害,同时也只能炒一个菜,而顾客越来越多,输出总是供不应求;
大厨年纪大了总是要退休的,如果收徒的话,怎么继续保证徒弟的忠诚度呢?
有一天,老板突然悟到,决定菜品口味的是大厨烧菜的过程,而不是大厨本人。如果大厨愿意把自己每个菜的菜谱都写出来,那不就可以请别的厨师来操作了吗?虽然别人按照菜谱烧出来可能达不到原味的100分,但90分总是能达到的,而这样的差距是一般的食客无法分辨的。这样只要菜谱在,饭店菜品的质量就能得到保证,扩张店面、开分店什么的就都不成问题了。
于是老板和大厨谈了一个晚上,说服了他用菜谱技术入股。几年后,饭店生意越来越好,开了无数家分店,老板赚了很多钱,大厨也得到丰厚的分成,不用再天天靠手艺吃饭了。
什么是编程?
在洗衣机出现之前,人们只能用手来洗衣服,需要经过浸泡、揉搓、漂洗、拧干的一系列流程。而全自动洗衣机的发明使洗衣服的工作人人都可以轻松完成,从而可以将原本用来洗衣服的时间解放出来去做其他事情。随着洗衣机的不断迭代升级,洗衣服的整个流程最终会被人们遗忘,只有设计洗衣机的工程师们了解流程,因为他们负责对其进行优化和改进。
所谓程序,就是为了实现一个需求而设计的逻辑流程。大厨的菜谱和洗衣机的工作流程都是程序,只不过前者由人来执行,后者由机器来执行。正是因为有程序作为媒介,我们才可以分离设计者、调用者和执行者的角色。虽然程序的执行效果未必能让其设计者满意,但它已经可以脱离设计者的时间和空间局限而存在,可以被其他人执行、验证和改进。
所谓编程,就是指编写程序。将烧菜的过程写成菜谱,本质上就是在编程。通过编程,我们更加透彻地理解并阐述了事物的本质,让曾经专属于某个人、某个团体、某个地方甚至某个时刻的东西,得以独立的存在和发展。从这个角度来讲,说编程是在创造生命也不为过。
编程可以说是一种标准化的写作。标准化保证了服务和产品的质量,也使大规模复制和扩张成为可能。KFC正是依赖其详尽到炸薯条的油温秒数的食品加工手册,才将分店开满世界各地的。陶华碧如果不能将她的豆瓣酱配方和制作过程清楚地描述出来,交由标准化生产线去制造的话,那么今天"老干妈"最多只是一个小乡村里的作坊级产品,不可能走上我们的餐桌。
我们每天的生活,都在和各种技术产品和服务打交道,比如导航、搜索引擎、聊天软件……你可曾想过,这些产品和服务背后的原理是什么?相信除了程序员群体之外,绝大多数人不会去想这些问题,因为:
这跟我没有关系啊!我又不去干这行……
应该只有专业人士才能搞懂吧,我可不行!
能用就行了,想那么多干啥,多累呀!
他们这么想并没有错,因为编程的本质就是:设计一个逻辑流程来实现指定的需求,使调用者无需了解实现细节即可达到目的。
由于程序和编程的广义概念太过笼统,为不导致概念混淆,下文中提到的"程序"和"编程",特指使用计算机编程语言编写,由机器来运行的程序。
解放时间和注意力
假设你已经在某岗位工作了一段时间,根据经验总结出来每天下班前有下面三件事需要做:
A、在公司内网系统查询某业务当天的数据(约10分钟)
B、整理成日报表并存档(约15分钟)
C、把几个核心数据用电子邮件发送给领导(约5分钟)
你可以在认真梳理过之后,将这个流程写下来,贴在办公桌前,或者记在脑子里。这自然比那些不知道流程的人要强得多,你可以确保每个步骤都不被遗漏地执行到(然而这并不能完全保证)。虽然你已经花了时间认真思考过,但每天这样枯燥乏味的流程都需要自己执行一遍……等等,这活我不可以找个秘书来干吗?
当然可以,雇佣他人是一种用金钱换时间的解决方案。但是这同时又引入了许多新的问题:
你需要花钱(废话)
你需要把要做的事解释给秘书听,并确保他能听懂(沟通成本)
秘书下班或休假时,这些事你还得自己做(有时间限制)
你要为秘书犯的错误承担责任(质量得不到保证)
每次秘书犯了错误,你都需要进行教育(培训成本)
秘书会直接接触业务数据和信息,难保有泄密的可能(安全隐患)
换一个秘书,以上的事情都得再来一遍……
这不是把事情搞复杂了吗?人的成本太高,提供的服务又不可靠。而如果你会编程的话,也许你可以:
编一个小程序来完成查数据、做报表、发邮件的流程,再配置一个定时任务每天自动执行;
谨慎一点的话,可以让程序先发到自己的邮箱,检查没有问题后再转发给领导;
必要的话,还可以让程序在运行出现意外时给你的邮箱或手机发报警通知;
如果你愿意,甚至可以给内网办公系统直接加上邮件报表这个功能……
假设你原本手工做完ABC流程需要30分钟,那么你的程序每执行一次,就为你节省了30分钟的时间。假如你写程序用了三个小时,那么一周就能收回成本,以后全部都是净赚的。如果程序运行的时间足够长,那么单次运行的均摊成本将趋近于零。可以看出,编程是一种用时间换时间的解决方案。
当然,你需要将要做的流程写成机器能读懂的程序;如果需求发生变化,你需要对应地修改程序;如果运行时出了BUG,你需要调试修复……但更重要的是:程序不拿工资,不可能辞职,不需要休息,不会闹情绪,不可能犯错,只要你的流程正确,依赖的资源不出问题,它就可以7*24小时一直运转下去。
每当我们写程序实现了一个需求,就好比造出了一把锤子。今后你遇到类似的问题,都可以拿这个锤子来解决。当然有时会遇到锤子不称手的情况,需要持续地升级和优化。但在大多数情况下,这个锤子都是可以直接拿来用的。也就是说:完全相同的问题,你只需要解决一次就好,不会浪费时间在重复的工作上。
通过编程,你可以将那些枯燥无味的重复性工作中的部分甚至全部,交由机器来接管,这样就可以将你的时间和注意力从具体的事务中解放出来,去做更有价值的事情。比如研究和优化工作流程,或者陪伴家人,又或者去读一本书……
体验"开挂"的人生
喜欢网游的朋友可能都知道外挂这东西,这是指和游戏一起运行、为了提升游戏体验的小程序。外挂一般分为两类:一是在游戏系统框架内简化玩家操作的辅助性外挂,提供如自动拾取、自动打怪、改键之类的功能;二是利用游戏漏洞营造不平等的作弊性外挂,提供如开图、加速、无敌之类的功能。
随着游戏行业的迅猛发展,现今很多网游都已经配备了原本由辅助性外挂提供的功能,辅助性外挂正在逐渐消亡,只剩下作弊性外挂和衍生的一系列黑色产业链,你懂得。
当我们说某个人"开挂"时,其实是在说他的表现(数量、速度、精确度……)明显超出正常的范畴。当原始土著人碰到使用着各种科技产品的现代人时,大概就是一种"**,这哥们开挂了吧?"的感觉。
要知道,身体并不强壮的人类之所以能征服地球,就是因为我们会创造并使用工具来突破生理的局限,做到原本不可能做到的事情。在即将到来的全信息时代,编程将是创造工具,甚至使用工具的主要方法。我们天天都在使用的软件和APP,不管是文字处理,K歌软件还是搜索引擎,都已经和我们的生活融为一体,成为我们生命的延伸。通过使用这些软件,我们可以不断突破自己经验和能力上的局限,我们随时都在给自己"开挂"。
然而大多数人都是在被动地等待别人来满足自己的需求。他们会使用通过朋友推荐、广告宣传等各种渠道推送给自己的软件,然后感慨一下:"哇,居然还可以这样!"他们只会使用已有软件提供的标准功能,而一些个性化的特殊需求就只能因为软件不支持放弃掉了。这就和穿衣服一样,大多数人只会买标准尺寸穿,如果这里紧那里松,这里长那里短,也就只能忍了。
还有少部分人会主动考虑如何去满足自己的特殊需求。他们会想:"如果有XXX功能就好了……"他们会主动去寻找能满足自己需求的软件,研究软件的个性化配置,或者给软件的开发者提功能建议。同样,追求个性的人可能会找裁缝为自己量身订做或者修改衣服,使其尽可能地适合自己。
只有极少数的人有能力自己去实现那些别人不能满足的需求。他们能在原有软件的基础上开发插件,对软件进行二次开发,甚至写出一个全新的软件。同样,追求完美的人可能会亲自设计衣服,并把一件衣服不停地改来改去,直到自己彻底满意为止。
如果说学好英语能为你的世界打开一扇门,让你拥有更多的选择的话;那么学好编程就能让你有机会以"上帝视角"来认识和改造这个世界,并拥有几乎无限的可能性。因为在现实中的一切最终都会被信息化,而你可以通过编程来对信息做任何形式的加工和处理,只要你想得到,就能做得到。
你想体验"开挂"的人生吗?那就赶紧开始学编程吧。
培养深入的思维方式
每个人都应该学习编程,因为它将教会你如何思考。——苹果创始人 乔布斯 [1]
思考,是人之所以为人的行为,而编程是一种对人的思考进行再思考的行为。我们不需要把每件事情想清楚,就可以在现实社会中生存。对某些从事机械性操作的职业来说,甚至完全不需要进行思考。然而在编程时,我们只有在想清楚之后,才能把程序写出来。在编写正确、高效、优雅的程序的同时,我们也在塑造自己的大脑,让它能思考得更清楚、运转得更高效。
编程要求我们客观地去思考事物的本质,将注意力放在事物本身,而不是事物与我们的关系上。当古代的妇女在河边洗脏衣服时,她可能在想:"河水好冷啊……这衣服颜色真漂亮……我家孩子为啥这么调皮……"而当我们在为洗衣机设计程序时,只会想:"哦,这有一堆脏衣服需要洗"。其实很多原本困扰你许久的问题,只要跳出"我"的范畴,进行"忘我"的思考,就变得特别简单和容易解决。
编程是将人的想法"实体化"的过程,这要求我们进行更深入、更细致、更全面地思考。为了实现一个需求,你必须对其原理和运转流程了解得十分透彻,否则就无法用编程语言精确地描述出来让机器去执行。在实体化的过程中,想法的结构缺陷和逻辑漏洞会自然凸显出来,你总会发现存在没有考虑到的可能性,以及需要进一步思考的细节。
编程要求我们能够对事物和流程进行拆分,并在不同的抽象层次上进行完整自洽的思考,这使我们有可能去解决那些规模无比庞大的问题。在实现一个稍具规模的需求时,我们不太可能同时考虑主体流程和操作细节,也不太可能同时从多个角度进行思考。经过合理拆分后的需求细粒度需求简单明了,实现难度大大降低的同时,还可以分配给多人来共同进行。在一个成熟的软件或互联网公司,上千名工程师一起开发同一款产品是很常见的,而你能想象这么多人一起去写一本书么?
编程是不断解决问题的过程,也是不断完善解决问题的方法论的过程。一个优秀的程序员总是解决问题的高手。在编程的各个阶段(需求定义、方案设计、编码实现、调试纠错……)中,都将面临无穷无尽的问题。这个问题要不要解决?什么时候解决?其根源是什么?需要考虑哪些方面?如何做取舍?有哪些方案可供选择?选择的原则是什么?……解决问题的方法论展开来讲可以写一本书了,且容我有时间另撰一文来表。
在未来更好地生存
半个世纪以前,美国有70%的人口在农场工作;随着自动化耕种的大面积普及,现在只剩下不到1%。 ——凯文.凯利《必然》
从登录月球到生产纳米机器人,我们已经通过设计并使用各种机器完成了人类原本不可能亲手做到的各种事情。迄今为止,人类从事的简单重复性的工作(如洗衣、耕种、制造等)已经几乎完全被机器接管,人类的工作方向已经转向对机器的研发和维护。而那些需要复杂知识和精密操作的工作(比如驾驶汽车、外科手术等)也正在被机器逐步接管。
洗衣机解放了家庭主妇们的双手,全自动流水线则解雇了工厂里的大部分工人。只有在一些正享受人口红利的发展中国家(比如中国和印度),由于技术引入成本比人工成本高,目前体力劳动者还有一些生存的空间。但技术的成本会不可阻挡地快速持续下降,而人口红利的窗口期将快速消失,拐点很快就会到来。
资本是具有意志的,且不为人性所改变。当产出的质量不变,而技术的成本显著低于人工成本时,几乎所有的体力劳动者都会失业。机器不知疲倦,不会抱怨,干得比人又快又好又省钱,人类怎么可能和机器竞争?
与此同时,人工智能正在将逐渐接管人类的简单重复性思考活动(如寻路、翻译等),人类只需要下达命令、制定原则和做出选择即可。人工智能甚至已经进入了那些被人们认为是"人之所以为人"的领域:写作、编曲、绘画……
Google的AlphaGo战胜李世石是一个里程碑式的事件,它证明了人工智能已经可以在人类最擅长的思考领域超越人类。现在最优秀的棋手都在向AI学习下棋,职业棋手和AI进行日常训练成了常态。纯机比纯人强,人机比纯机强,这早已是棋界的共识。
当人工智能在某个思考领域的能力接近或超过人类(这在很多领域已经做到了 )时,而其成本极其低廉(这是早晚的事)时,在资本意志的作用下,这个领域就会将不可逆地被人工智能迅速占领。我们今天已经习惯了使用计算器来取代大脑进行数字计算,在不远的将来,我们也会习惯将原本需要自己思考的许多问题交给由无数程序组成的人工智能来处理。在可以预见的未来,所有构建在经验和技能基础上的非创造性工作岗位都会消失,人类的工作方向会转变成对人工智能的研发和维护。
人工智能全面普及的时代正在以光一样的速度向我们飞奔,可能下一秒就将我们远远地甩在身后,连车尾灯都看不到。届时,几乎所有的工作都将和人工智能密不可分。只有那些理解人工智能,能够很好地和人工智能合作,并帮助改进人工智能的人,才能在那个时代更好地生存下去。
每个人都应该尽早开始学习编程,我的孩子起步太晚了,我觉得应该在教他们ABC和颜色的时候就开始。——美国第44任总统 奥巴马 [2]
在《未来我们该学什么语言?》一文中,我曾畅想过未来可能出现的脑接口技术,以及与之配套的人机共用结构化语言。届时我们的大脑将直接接入互联网和人工智能,可以瞬间将需要的知识和信息下载到大脑中……我们将成为神一样的存在。但前提是你必须具备编程基础,才能享用这一革命性技术带来的成果。
什么,那时候你还没学会编程?可以洗洗睡了。
我知道你会问……
可是我又不准备当程序员啊,有必要学编程吗?
你可能会开车,还是个老司机,很会享受驾驶的乐趣,但你未必愿意去当一名出租车司机吧?同理,学习编程不一定非要做程序员,但却能使你拥有全新的视角、深入的思维方式和效率优化的思维,这都将成为你重要的软实力。在不久的将来,编程将会变成像英语、驾驶一样人人必备的技能。到那时,你希望自己是一名老司机,还是搭车族呢?
"学这个有用吗?"其实是一个很可怕的想法。由于很多东西现在看起来并没有什么用,大多数人就放弃了学习,而只有少数人会抱着"学学看能有什么用"的念头去尝试。在之后的某一天,真正需要这项技能和知识时,那些选择放弃的人只能感慨"要是当时……就好了!",而选择学习的人则会惊喜地发现"哇,原来还能用在这里!"……所谓的"惊喜"和"运气"其实就是这样一回事:在不知不觉间,已经提前做好了准备。
那我能不能现在努力赚钱,然后雇一个专业的程序员呢?
不错,你是可以找一个程序员来实现你的想法,但我们之前请秘书时遇到的诸多问题又会接踵而来。更重要的是,如果你不会编程,你可能连个靠谱沾边的想法都提不出来。就好比没有见过汽车的人,只会想着让别人为他造一辆更快的马车。只有在理解了某个事物的原理之后,这个事物的概念才能在你的脑中清晰起来,才能真正融入你的认知结构中。
有了清晰的概念,你才能对其进行思考,判断它能够用来做什么,不能做什么。如果概念不清晰,你甚至都无法讲清楚自己的需求,更难和程序员进行沟通和合作。每一位程序员在面对"给我做一个淘宝"这样的需求时,都会崩溃的。
我的英语很烂,能学会编程吗?
英语不是学习编程的瓶颈,关键在于理解其概念和原理,以及改变思维方式。虽然几乎所有编程语言的关键字都是英语,但常用的关键字也就那么几个,热门语言的相关书籍也都有译版。如果你愿意的话,甚至可以用中文来给程序里的变量、函数和命名。正如只要你认得start / save / load / quit这几个单词,就能去玩英文游戏;只要会说sorry和how much,就能去国外旅游一样。
我已经工作好多年了,现在开始学还来得及吗?该从什么地方开始?
任何时候开始都不晚,当然越早越好。中国第一款杀毒软件KV300的作者王江民,就是38岁才开始学习编程的。至于应该怎么学,从哪里开始,这将是我今年的主要思考方向,敬请期待我的后续系列文章。也许你可以先试试这些网站:
:通过玩游戏来启蒙,有中文版,适合初学者
http://www.khanacademy.org :纯英文视频讲解教学,适合学霸和笔记党
:交互式实战,效果最佳,但需有一定基础
曾经何时,想要建立一个网站服务,需要购买动辙数万元的专业服务器,支付昂贵的机房托管和带宽租赁费用,聘请专业的开发人才或团队来研发,再通过广告和运营活动去拉拢用户……门槛如此之高,使绝大多数人望而却步,只有企业才能负担得起。
而现如今,云服务器甚至比家里的宽带都便宜了,各种开源技术唾手可得,各种开放平台提供了免费的用户和渠道,一个APP通过社交网络可能瞬间火遍全国……有了树莓派这样超便宜的卡片电脑,再加上现在各种家电都在向智能化发展,想通过编程在实现自己的一些小创意,真是不要太简单。
我们正身处一个只要愿意思考,就能改变世界的时代。那么你是愿意去改变世界,还是等待被世界改变呢?
[1] Steve Jobs - The lost interview (1995), /v_show/id_XNDI1NjE1OTIw.html
[2] Obama: Everybody's Got to Learn How to Code, http://www.recode.net///obama-everybodys-got-to-learn-how-to-code
作者简介:86年射手座,陕西西安人,一名具有独立思考能力和代码洁癖,且兴趣爱好广泛的程序猿。骨灰级游戏玩家,曾在魔方、扫雷、俄罗斯方块等领域取得国内第一,多次打破全国记录,并作为嘉宾参与《佳片有约》、《天天向上》等节目录制;扫雷网(saolei.net)创始人。
记住登录状态
重复输入密码

我要回帖

更多关于 30岁开始学编程 的文章

 

随机推荐