大学计算机相关专业,对本校提供的教学资源不满意,或者大学其他专业学生,想要从事开发相关工作的本科生有较为充足的时间,但是缺乏学习资源(这里指的“资源”并不是书本或其他学习资料,而是真正意义上的“教学资源”:学校提供的上机环境、合格的老师和助教,乃至于上进心和姿势水平都足够高的同学等)
如果符合,那么这篇文章将会对你有很大的帮助
来编程问答 看看
我将首先给出一些基本的指导思想,然后介绍一个具体的学习方法路线图。本文将最大限度地保证这些方法具有尽可能强的可操作性。
两种不同的学习路线
通过自学成为开发行业从业者,有“正向”和“反向”两种路线:
反向路线——指的是绕过一系列基础知识,直接从上层应用方向,以工程为导向开始学习和实践,直接参与开发工作,然后根据实际需要逐渐补充计算机科学知识;
正向路线——指的是从基础开始,按照计算机专业培养计划,系统地依次学习。
一般而言,正向路线比起反向路线,相对来说更加“安全”,更加不容易出现计算机科学基础知识的短板——但是缺点也是很明显的:入门难度更大,门槛更高,时间容忍度也更低。
在实践中,两种路线各有千秋,既不能互相取代,也绝非互不相容——这篇文章将以正向路线为主进行详细的说明,本专栏后续的文章将会邀请一些现役工程师来介绍反向路线的相关思想方法。
正向路线的三条基本原则
关于“如何自学编程”类似的话题,在很多社区都已经有了不止一次的讨论——为什么同一个问题会有不止一次的讨论呢?这当然是因为,当读者们按照前辈们给出的书单开始读书上课,之后没多久就会受到这样那样的打击,最后信心耗尽而彻底放弃。大多数前辈自身的姿势水平高,人生经验丰富,因此不可避免地会犯下这样一个错误——过高估计了读者们的学习能力和信心。
不光是写 Guideline 的前辈,读者自身也要注意——永远不要高估自己的学习能力和信心(或者说,学习热情)。只有能完成的课程,能看完的书才有意义——负载过大,无法完成的课程,就算再怎么优秀也是弊大于利的。因此,在路线和方法的选择上,一定要以以下的三个基本法为基本的指导原则:
1、永远不要假设自己有足够的热情(信心保护)
前面说过,正向路线的缺点,在于入门难度更大,门槛更高——毕竟,同样是输出“Hello World”,一个漂亮的网页页面,总比黑乎乎的命令行更好看,也更让人有成就感。
在知乎和其他的一些跟编程学习相关的社区,总能看到有各式各样的大神,给新手们传递着这样那样的人生经验:
“编程入门一定要从 gcc+Vim 开始”、
“萌新学习 C++ 请认准《C++ Primer》”、
“大一学生要写一个 500-1000 行的课程作业,让我们先从一个小目标开始——比如实现一个编译器” :
诸如此类言论,不胜枚举——通常还会附加“连这点东西都学不会,以后就别想着学 CS 了”之类的论断。
不得不说,大神们的出发点确实是好的,这些建议也确实是有一定的合理性——但是,这些做法有一个重要的前提,那就是“大力出奇迹”,假设读者都拥有无限的学习能力和无限的热情……然而,理想很丰满,现实却很骨感——大神们初中学习编程,高中就能写出一个成型的编译器,然而现实中的大部分人学生都不具备这样的能力……
一个人的命运,当然要靠自我的奋斗,但也要考虑到历史的行程——对于名校 CS 专业的学生来说,他们就算自身的才能并不出众,至少也有“安全网”在保护他们:老师在上课的时候会重点地强调需要注意的问题,助教在上机的时候会手把手地教他们正确的做法,甚至身边才能出众的同学,也可以让他们“抱大腿”……然而,对于本文的读者来说,这一切都不存在。
孤独而脆弱,是本文读者普遍具有的特点——任何一个看起来微不足道的小挫折,都可能挫伤他们的信心和热情,当这两者降到 0 的时候,他们的学习道路便到此为止了,以后想要再一次出发将会变得非常困难,甚至完全不可能。
因此,对于本文的读者,在路线的选择上,一定要做到循序渐进,从小到大,在初学阶段尽可能地挑选不容易踩坑的路线,从第一个 Hello World 开始,通过不断地获得正向反馈来提高自己的能力和信心——在后续的内容中,我们将会应用这一原则,向大家推荐合适的路线。
2、确保你学到的东西都是性价比最高的内容(高性价比学习)
这里的“性价比”包括两个概念,其一是知识的可迁移性,其二是知识的可使用性。
所谓“可迁移性”,指的就是软件开发领域,那些共通的,放之四海皆准的内容——C 家族语言的语法,编程的熟练度、思想和方法,以及计算机科学专业知识,都是具有可迁移性的内容,而具体的某某框架的 API 用法则不是。
而“可使用性”则是另一个概念——它的含义是,这部分知识能不能立竿见影地帮助你增加代码量。很多大神都提到过,一个好的程序员必须有 XX 万的代码量——这确实是对的,但是反过来却不一定成立:如果这个世界有数万种编程语言,那么你用每一种语言都写一遍 Hello World,那么你的代码量也能达到大神说的数字——但是这代表你就有对应的编程能力吗?答案显然是否定的。
所谓“好的程序员必须有 XX 万的代码量”,更进一步地说,好的程序员必须要写数量和种类都足够多的程序。而就像上文中贴出的那个链接一样,大一学生刚学完 C 语言,如果想要写一个 500-1000 行代码的大作业,最后真的能完成的也只有“图书馆信息管理系统”这样的,看起来很“low”的程序——因为只使用基本的 C 语言语法和标准库,你是很难写出非常复杂的程序的。这个时候,就需要你学习更多的计算机科学知识,来拓展你可以编写的程序的广度与深度了……
你必须明白,学习的目的是为了提高自己的开发能力,让自己能够写出更大更好的程序。因此,对于走正向路线的读者来说,在没有项目牵引的前提下,对于流行技术和框架的学习应该有所节制,切忌贪多嚼不烂,千万不要陷入到“用更多的语言/框架写 HelloWorld”的陷阱中。
关于这条原则的应用,将与下一条原则一起进行说明。