这是一篇非常具有操作性的程序员初学者攻略。

1

前言

如今编程成为了一个越来越重要的「技能」:

作为设计师,懂一些编程可能会帮你更好地理解自己的工作内容;

作为创业者,技术创始人的身份则会让你的很多工作显得更容易。

而作为刚入门的新手,面对眼前海量的信息,或许根本不知道从哪里开始。入门轻松度过初级材料的学习后,发现学习越来越困难,陡峭的学习曲线又让你望而却步。

你知道如何在页面上打印输出一些文本行,但是你不知道何时该进行一个真正的有用的项目;你不清楚自己还有哪些不知道的东西,你甚至搞不清下一步该学什么。

这篇文章的内容对此不仅会有一些方向性的建议,还会包含一个基础核心向的编程入门导引。当然,Step by Step 的路线是不现实的,并且每个人都会有自己的特点,所以给出的这个编程入门导引更多的是为了引发小伙伴们的思考,最终帮助你形成适用于自己的学习路线。

但要注意:这篇文章是写给那些真心想学编程的人看的——那些憋着一股狠劲儿,一定要做出个什么真东西,不学好不罢休的人;而不是那些「听说编程好玩」的人,在我看来,这种人永远都入不了编程的门,更别提做出个像样的东西来了。

2

心态调整

确定目标

在你学习编程之前思考一下你的目标,当你有最终目标时道路会更加的清晰。那么,你想要写什么?网站?游戏? iOS 或者 Android 应用?或是你是想自动化完成一些乏味的任务让你有更多的时间看窗外的风景?也许你只是想更具有就业竞争力找个好工作。

所有的这些都是有价值的目标,这些目标都是你编程学习推动力的一部分,没有推动力的人,是无法在略显枯燥的漫长学习之旅中走远的。

不要浮躁

不管是在线下还是线上的书店,满目都是《21天学通 X》这种速成书目,它们都承诺在很短一段时间内就让你能够学会相关技术。Matthias Felleisen 在他的著作 How to Design Programs 一书中明确指出了这种「速成」的趋势并予以了以上的讽刺。

所谓的「捷径」或者说「银弹」是不存在的,智者说过,精通某个东西需要10年或10000个小时,也就是汉语中的「十年磨一剑」,所以不用着急,功不唐捐。

培养兴趣

沉醉于编程,编程更是为了兴趣。兴趣是推动力的不竭源泉,保持这种充满兴趣的感觉,以便于你能将其投入到你的10年/10000小时的编程时间中。

编程很有趣,那是探索的喜悦。那是创造的喜悦。看到自己亲手完成的作品显示在屏幕上很有趣;有人为你的代码而惊叹很有趣;有人在公共场合称赞你的产品、邻居使用你的产品、以及在媒体上讨论你的产品很有趣。编程应该十分有趣,若并非如此,就找出导致编程无趣的问题,然后解决之。

3

启蒙

「学编程应该学哪门语言?」这经常是初学者问的第一个问题,但这是一个错误的问题,你最先考虑的问题应该是「哪些东西构成了编程学习的基础」?

编程知识的金字塔底部有三个关键的部分:

•算法思想:例如怎样找出一组数中最大的那个数?首先你得有一个 maxSoFar 变量,之后对于每个数…

•语法:我怎样用某种编程语言表达这些算法,让计算机能够理解。

•系统基础:为什么 while(1) 时线程永远无法结束?为什么 int *foo() { int x = 0; return &x; } 是不可行的?

启蒙阶段的初学者若选择C语言作为第一门语言会有点困难,但是这是绝佳的选择。

学习 C 语言会帮助你以靠近底层的视角思考问题,并且在后期帮助你理解操作系统层级的一些原理。

4

入门

结束启蒙阶段后,初学者积累了一定的代码量,对编程也有了一定的了解。这时你可能想去学一门具体的技术,诸如 Web 开发, Android 开发,iOS 开发什么的,你可以去尝试做一些尽可能简单的东西,给自己一些正反馈,补充自己的推动力。

但记住别深入,这些技术有无数的细节,将来会有时间去学习;同样的,这时候也别过于深入特定的框架和语言,现在是学习计算机科学通用基础知识的时候,不要试图去抄近路直接学你现在想学的东西,这是注定会失败的。

那么入门阶段具体该做些什么呢?这时候你需要做的是反思自己曾经写过的程序,去思考程序为什么 (Why) 要这样设计?思考怎样 (How) 写出更好的程序?试图去探寻理解编程的本质:利用计算机解决问题。

设想 :

X = 用于思考解决方案的时间,即「解决问题」 部分

Y = 用于实现代码的时间,即「利用计算机」部分」

编程能力 = F(X, Y) (X>Y)

要想提高编程能力,就得优化 X,Y 与函数 F(X, Y),很少有书的内容能同时着重集中在这三点上,但有一本书做到了——Structure and Interpretation of Computer Programs (SICP)《计算机程序的构造和解释》,它为你指明了这三个变量的方向。

在阅读 SICP 之前,你也许能通过调用几个函数解决一个简单问题。但阅读完 SICP 之后,你会学会如何将问题抽象并且分解,从而处理更复杂更庞大的问题,这是编程能力巨大的飞跃,这会在本质上改变你思考问题以及用代码解决问题的方式。

此外,SICP 的教学语言为 Scheme,可以让你初步了解函数式编程。更重要的是,他的语法十分简单,你可以很快学会它,从而把更多的时间用于学习书中的编程思想以及复杂问题的解决之道上。

完成了这部分学习后,你会逐步建立起一个自己的程序设计模型,你的脑子里不再是一团乱麻,你会意识到记住库和语法并不会教你如何解决编程问题,接下来要学些什么,在你心里也会明朗了很多。这时候才是真正开始进行项目实践,补充推动力的好时机。

关于项目实践:对于入门阶段的初学者,参与开源项目还为时过早,这时候应该开始一些简单的项目,诸如搭建一个网站并维护它,或是编写一个小游戏再不断进行扩展。

如果你觉得 SICP 就是搞不定,也不要强迫自己,先跳过,继续走常规路线:开始读 The Elements of Computing Systems 吧,它会教会你从最基本的 Nand 门开始构建计算机,直到俄罗斯方块在你的计算机上顺利运行。 具体内容不多说了,这本书会贯穿你的整个编程入门阶段,你入门阶段的目标就是坚持完成这本书的所有项目(包括一个最简的编译器与操作系统)。

5

计算机系统基础

有了之前程序设计的基础后,想更加深入地把握计算机科学的脉络,不妨看看这本书:Computer Systems: A Programmer's Perspective, 3/E《深入理解计算机系统》。

这里点名批评这本书的中译名,其实根本谈不上什么深入啦,这本书只是 CMU 的「计算机系统导论」的教材而已。CMU的计算机科学专业相对较偏软件,该书就是从一个程序员的视角观察计算机系统,以「程序在计算机中如何执行」为主线,全面阐述计算机系统内部实现的诸多细节。

完成这本书后,你会具备坚实的系统基础,也具有了学习操作系统,编译器,计算机网络等内容的先决条件。当学习更高级的系统内容时,翻阅一下此书的相应章节,同时编程实现其中的例子,一定会对书本上的理论具有更加感性的认识,真正做到经手的代码,从上层设计到底层实现都了然于胸,并能在脑中回放数据在网络->内存->缓存->CPU 的流向。

6

数据结构与算法基础

如今,很多人认为编程(特别是做 web 开发)的主要部分就是使用别人的代码,能够用清晰简明的方式表达自己的想法比掌握硬核的数学与算法技巧重要的多,数据结构排序函数二分搜索这不都内置了吗?工作中永远用不到,学算法有啥用啊?这种扛着实用主义大旗的「码农」思想当然不可取。没有扎实的理论背景,遭遇瓶颈是迟早的事。

数据结构和算法是配套的,入门阶段你应该掌握的主要内容应该是:这个问题用什么算法和数据结构能更快解决。这就要求你对常见的数据结构和算法了熟于心,你不一定要敲代码,用纸手写流程是更快的方式。对你不懂的数据结构和算法,你要去搜它主要拿来干嘛的,使用场景是什么。

供你参考的学习资源:

•《算法导论》:有人说别把这本书当入门书,这本书本来就不是入门书嘛,虽说书名是 Introduction to Algorithms,这只不过是因为作者不想把这本书与其他书搞重名罢了。

当然,也不是没办法拿此书入门,读第一遍的时候跳过习题和证明就行了嘛,如果还觉得心虚先看看这本《数据结构与算法分析》。

•Algorithms: Design and Analysis [Part 1] & [Part 2]: Stanford 开的算法课,不限定语言,两个部分跟下来算法基础基本就有了;如果英文不过关:麻省理工学院:算法导论

•入门阶段还要注意培养使用常规算法解决小规模问题的能力,结合前文的SICP部分可以读读这几本书:《编程珠玑》,《程序设计实践 》

7

编程语言基础

此外还要知道,学习第 n 门编程语言的难度是第 (n-1) 门的一半,所以尽量去尝试不同的编程语言与编程范式,若你跟寻了前文的指引,你已经接触了:「干净」的脚本语言 Python, 传统的命令式语言 C, 以及 C++ 三个好朋友。

但仅仅是接触远远不够,你还需要不断继续加深与他们的友谊,并尝试结交新朋友,美而雅的 Ruby 小姑娘,Hindley-Milner 语言家族的掌中宝 Haskell 都是不错的选择。

现实是残酷的,在软件工程领域仍旧充斥着一些狂热者,他们只掌握着一种编程语言,也只想掌握一种语言,他们认为自己掌握的这门语言是最好的,其他异端都是傻X。这种人也不是无药可救,有一种很简单的治疗方法:让他们写一个编译器。要想真正理解编程语言,你必须亲自实现一个。现在是入门阶段,不要求你去上一门编译器课程,但要求你能至少实现一个简单的解释器。

8

其他

编程入门阶段比较容易忽视的几点:

1.学会提问:学习中肯定会遇到问题,应该学会正确的使用搜索引擎。当单靠检索无法解决问题,去老九学堂交流群或其他平台提问,提问前读读这篇文章:能有效解决问题的提问方法。

2.不要做一匹独狼:尝试在多与他人交流想法。尝试搭建一个像这样简单的个人网站。试着在博客上记录自己的想法。

3.学好英语:英语是你获取高质量学习资源的主要工具,但在入门阶段,所看的那些翻译书信息损耗也没那么严重,以你自己情况权衡吧。

9

其他

以上的内容你不应该感到惧怕,编程的入门不是几个星期就能完成的小项目。期间你还会遇到无数的困难,当你碰壁时试着尝试「费曼」技巧:将难点分而化之,切成小知识块,再逐个对付,之后通过向别人清楚地解说来检验自己是否真的理解。当然,依旧会有你解决不了的问题,这时候不要强迫自己——很多时候当你之后回过头来再看这个问题时,一切豁然开朗。

此外不要局限于上文提到的那些材料,还有一些值得在入门阶段以及将来的提升阶段反复阅读的书籍。

10

后记

如果你能设法完成以上的所有任务,恭喜你,你已经真正实现了编程入门。这意味着你在之后更深入的学习中,不会畏惧那些学习新语言的任务,不会畏惧那些「复杂」的 API,更不会畏惧学习具体的技术,甚至感觉很容易。

当然,为了掌握这些东西你依旧需要大量的练习,腰还是会疼,走路还是会费劲,一口气也上不了5楼。但我能保证你会在思想上有巨大的转变,获得极大的自信,看老师同学和 CSDN 的眼光会变得非常微妙,虽然只是完成了编程入门,但已经成为了程序员精神世界的高富帅。不,我说错了,即使是高富帅也不会有强力精神力,他也会怀疑自己,觉得自己没钱就什么都不是了。但总之,你遵循指南好好看书,那就会体验「会当凌绝顶」的感觉。

原文发布于微信公众号 - 老九学堂(xuetang9)

原文发表时间:2017-03-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习网

我从1万小时编程中学到了什么

我从1万小时编程中学到了什么 12年前有人告诉我,你至少需要10,000小时才能说自己在某方面是专业的。对此我并不理解。假设我每月至少工作160小时,那么我每...

2457
来自专栏PHP实战技术

如何面试 PHP 工程师?

1,解决问题的能力和掌握的知识,看你招聘的目的而决定其二者的平衡。了解流体力学的确会对通下水道有很大帮助,但流体力学专家未必都会疏通下水道。

675
来自专栏Java架构

资深架构师谈Java——最牛逼的编程语言

有些人问我,在现有的语言里面,有什么好的推荐?我说:“Java。” 他们很惊讶:“什么?Java!” 所以我现在来解释一下。

2267
来自专栏程序员互动联盟

小白学java系列:前言

为什么要学习java? java是目前最流行的编程语言,主流公司框架基本上都离不开java的影子,未来还会火很多年。java应用范围极其广泛,无论在客户端还是在...

3276
来自专栏web前端教室

【今晚8点】- 先行者计划:作业 &总结 & 讲一些有难度的事情

这就至于了一个问题,很多同学会花了很多心思在教程的收集上,花心思在各种示例、demo等的代码的整理上面。就像七龙珠一样,收集了n篇教程之后,你的前端开发能力就自...

690
来自专栏程序员互动联盟

编程小白喜欢走的几条弯路

经常有小伙伴通过小编微信号问一些编程的常识,语言基础或者是职业方向之类的问题,小编归纳了以下四点供大家参考 第一:盯住一个问题牢牢不放,不搞定这个问题,绝不向下...

34711
来自专栏飞雪无情的博客

Go语言实战笔记(二十八)| Go 后记

《Go语言实战》笔记到现在算是结束了,基本上关于Go的方方面面都讲到了,还有些不是太常用的,比如CGO以后会专门再讲,不会放在这个系列里了。该系列一共写了近30...

382
来自专栏企鹅号快讯

想转行的和零基础编程的如何用五个月精通python?

Python简单易学,入门容易,非常适合没有编程基础的人学习。而且python的应用范围非常广泛,自动化运维,web编程,人工智能,科学计算,图形界面开发等都可...

19810
来自专栏程序员互动联盟

自学编程的人,都是怎么找到自己的第一份工作的?

每年毕业这么多大学生,很多被培训机构弄去培训了,但是更多的还是选择在大学期间,自力更生去自学,自学的人很多都觉得没有方向太难了,自学怎么坚持下去,自学完了怎么去...

2774
来自专栏CDA数据分析师

推荐 | 100分程序员的8个习惯!

慎于说Yes 在没有搞清楚开发需求、任务工作量、团队期望值之前,100分的程序员不会轻易答应。特别是对于新人来说,比较急于表现自己,对于同事或者老板的工作安排来...

1735

扫码关注云+社区