所有你需要做的就是打开一本书,然后开始阅读,是这样的吗?
不全是这样的。我的意思是,你可以用那种方式学习——如果你喜欢挫折的话。
还记得我们谈到过的通过动手才能学得最好吗?
这就是本文的主旨。
我会给出学习第一门编程语言的理想方法布局,你不仅应该学习这个布局方法,还应该享受精通它——如果不能掌握的话。
学习第一门编程语言或许是学习编程最困难的事情,但并非一定会这样。
大多数程序员——包括我自己 ——通过阅读一本书尝试做一些东西出来,遇到挫折难题,然后再重读并继续尝试的事情,直到终于可以按预期工作。
我将与大家分享的东西来自于教导和训练软件开发人员学习第一门编程语言和提高语言技能的经验。我也加进去了我自己学习语言,如C++,C#和Java的经验。
基本上,在这篇文章中,我将展示给你我做的一些事情——我现在了解的东西——如果我是你,并且现在要去学习第一门编程语言的话。
从看一个正在工作的应用程序开始
大多数程序员,当他们想学习编程的时候,往往是从一本书开始。
虽然有一些优秀的书籍会手把手地教你编程,但我认为最佳的开始是查看一个能实际工作的应用程序的源代码,然后试着尽可能多地找出正在发生的事情。这很难。
它会让人觉得不舒服,但是不要畏惧。要习惯这种不舒服的感觉。这是让人成长的唯一路径。
我想要你做的是选择一个开源应用程序——最好是流行的,才有可能被精心设计——然后浏览它的源代码。你可以在GitHub上找到大量项目,因此我建议你去那里寻找。
并且,你最好可以下载这些代码,自己构建并运行这个应用程序——虽然这样说的话超出了这本书的范围。如果你有一个朋友可以帮助你做这些事情,那就更棒了。当然没有,也没有关系。
重要的是,你要去探索代码,从而了解编程语言的语法看起来是什么感觉,并试着阅读代码看看你能否理解或弄清楚意思。
使用应用程序本身,如果可能的话,这样你才能够感觉到代码和代码作用之间的关系。
就像我说的,这让人感到很不舒服。你可能会觉得你看不懂任何东西。
再说一遍,那没关系。你只需要竭尽全力看看你能够搞清楚一两件事是如何工作的,或在代码中你可以做哪些变动以便于用某种方式改变功能。
此外,大致了解代码如何命名以及如何被组织的。就像你是一个考古学家试图了解一些古文明的著作一样。这样的开始可以让你比大多数不知道将要学习的编程语言是什么样的程序员要更有目的性。
在没有开始旅程之前先大致了解当地情况总归是好的。编程没什么不同。
找一些好的资源或书籍,大致看一遍
要想在启航之前,更进一步地了解当地情况,接下来要做的并不是反复阅读编程书籍,而是挑选一些其他资源——如视频,文章,或教程——大致看一遍。同样的,这又让人觉得有些不舒服,因为很多你看到的内容你并不明白它是什么意思。
但是……你需要涉足这个领域。你只要能够差不多了解这个东西到底有多大,你要学习的是什么以及常见概念是什么就可以了。
这些前提工作在你大概明白要学习什么类型的东西以及概念是如何建立在彼此之上的时候,会收到效果。
了解如何创建“Hello World”
好的,关于这一点你依然不用“阅读”或上手编程。
以后会让你做到想吐的——如果你想的话。(不遵循这些步骤,实际上你也能学习编程语言。)
此时你要做的是尽可能地创建最基本的程序,无论你学习的是什么编程语言。
还记得我们谈到过的“如何开发技术技能”吗?这正是此处的目标。你想要尽快开始,这样你就有足够的信心和知识学以致用。
你所要开始的一个非常基本的程序叫“Hello World”。大多数编程书籍一开始都会让你去创建一个“Hello World”程序,这通常指的是输出“Hello World”到屏幕上。
这可能并不需要太多关于编程语言的知识,但是需要熟悉并测试用来构建和运行程序所需的基本工具链。
如果你正在阅读有关编程语言的书,那么书中应该包含一个“Hello World”程序便于你创建。
如果没有,那就谷歌搜索“Hello World +你的编程语言”。马上就能找到例子。通过创建“Hello World”程序,你还可以学到该编程语言程序的基本结构。
学习基本构造,并用真正的问题测试
如果你使用相应的书籍或某种形式的教程学习编程语言,那么现在你可以通过它们来学习了。
此时,你会觉得正在阅读的书或上的课程并没有你刚开始认为的那么神秘。
现在你要做的是熟悉所学编程语言的每个基本结构,然后使用这些构造编写一些代码。
你需要尽可能实际地尝试和思考将所学的东西与问题和应用程序联系起来,当你将技能应用到实际问题的时候,这样才能更好地理解和记住这些知识。
下面是大多数编程语言所包含的一些基本结构:
- 能够输出到屏幕上
- 基本的数学能力
- 作为一个变量存储信息
- 组织代码成函数,方法,或模块
- 调用函数或方法
- 布尔逻辑评估的性能
- 分支条件语句(if / else)
- 循环语句
下面是一些好消息。
一旦你了解这些基本结构并知道如何使用它们,你就具备了语言的基础知识。是的,语法可能不同,但这是编程的核心。你可能会花费大量时间在这个阶段。
用你自己的方式去做,一次一个地去学习编程语言的结构,并通过实际编写一些代码来应用每个结构。如果你采取的是自己的方式,那么你需要确定结构是什么以及学习的顺序。
如果你正在阅读书籍或学习教程(最好是多本书籍和多个教程),那么具体路径应该已经呈现在你眼前,甚至有一些例子和挑战任务。尽量确保明白你正在学习的内容以及如何应用它们。
现在可以回去看看你第一步看的源代码了,看看你能明白多少。
知道语言功能和库之间的区别
经常绊倒初级程序员的一件事——尤其是今天的编程语言——是知道语言的部分是什么,以及语言自带的标准库的部分是什么。
通常情况下,区别不是很清楚,因为,习惯上看,你会非常频繁地使用标准库编写代码。
没关系。你需要了解所学编程语言的编程约定,但你应该特别小心地去尝试并指出实际语言部分以及常用于语言的库的部分。
这似乎有点鸡蛋里面挑骨头,但我认为这很重要,因为它可以撸顺此刻在你脑中杂乱无章一塌糊涂的语法,并帮助你更有意义地分类和组织。
你会明白,对于大多数编程语言,语言的实际部分本身并不是很大,并且比较容易学,但标准库很大,用你的方式了解它们相对而言要困难得多。
现在的编程,比起说是做语言绝对的专家,更多的是关于知道如何使用库和框架。这就是为什么这种区别显得重要的原因之一。
通过认识到哪些并非语言的一部分,而是库的一部分,并了解如何查找库来完成相应语言中的常见任务,你会成为一个更好的程序员。
审查现有代码,理解每一行代码的意思
此时,你应该已经熟悉所有所学编程语言的主要概念,并在实际例子中用过大多数编程语言功能。
你对语言本身和与语言结合使用的库之间的差异也有了深入了解。但你对编程语言可能仍然觉得没有那么舒服,或者你实际上还不懂。
这是一个你感觉自己可以理解所有一切是如何工作的阶段,但却不知道如何把它们放在一起,写出一个真正的应用程序。许多初级程序员往往会因此而停留在这个阶段,感到沮丧,觉得他们永远成不了一个真正的程序员。
脱离这个困境并确保在知识上不会有欠缺的最好方法之一是,查看现有的代码,一行一行地,确保你能准确理解每一行和每一个声明在代码中是做什么用的。(即使你有时不知道原因,知道具体的过程依然是一种进步。)
这里的现有代码可以用你在第一步时看的项目的源代码里面随机的项目文件。打开一个文件并仔细检查文件中的每一行代码,确保你知道它到底是做什么的。
如果你不明白——话说会有很多东西你都不明白——那就花一些时间思考一下,仔细查看你不明白的地方。有点乏味。甚至可能是枯燥的,但是值得。
当你到达一个你觉得你可以读懂任意一行代码并理解它做什么的阶段——同样的,知道为什么在此时也并没有那么重要——说明你已经做好了继续前进的准备。
构建东西,构建很多东西
现在是时候真正开始使用编程语言了。
此时,你已经能写一些小程序了,使用大部分的语言特性,但只有真正实际去构建应用程序,你才能更深刻地感受编程语言。
挑几个小项目——别太大——然后构建应用程序。
不要太雄心勃勃,要知道一口吃不成个大胖子,所以在这个阶段不要试图做任何相关于平台或UI密集的东西。最好你的应用程序只输出文本到屏幕上,并暂时只从键盘中接受输入。
目的是为了建立专注于使用编程语言和标准库的简单应用,不要额外添加针对于平台功能的框架——接下来会涉及这方面。
这样做可以帮助你增加使用编程语言的信心,并了解为了完成目标你需要使用什么样的语言构造。
下面是一些帮助你开始的简单的项目点子:
创建一个解决数学问题的程序,从用户获取输入。
创造一个可选择冒险类型的程序,从用户输入来确定接下来会发生什么。
创建一个非常简单的基于文本的冒险游戏,用户可以发出命令来拾起对象,在房间移动等。
创建一个能够从一个文本文件中读取输入并输出写入到不同文本文件的程序。
创建一个聊天机器人,能和用户交流,假装是人或给出幽默的回复。
应用编程语言到特定技术或平台
到了这个时候,你主要学习了关于在封闭条件下如何使用编程语言。
这是有意的,因为你需要在增加环境和用于构建真正应用程序所需框架这些额外的复杂性之前,了解并熟悉编程语言本身和它的标准库。
为了用编程语言创造一些有用的东西,你需要应用语言到特定的技术或平台。
所以,这个时候,你需要确定几个可以完成的需要在特定平台上使用编程语言的小项目。
举个例子,假设你正在学习Java。到现在为止,你会编写Java代码,代码可工作在任意Java可运行的平台上,因为你大多数时间会使用标准库,并且只会输入和输出到屏幕或文件。
此时,你可能会决定使用Java来构建一个Android应用程序。你需要学习如何构建Android应用程序以及有关Android框架的知识。 但是,由于你已经熟悉Java,所以就没有必要一次性学习大量的东西。
当然,你可以一起学习Android和Java,事实上,我做了一个Pluralsight课程来教授如何做到这一点——但为了实际掌握语言并且避免混淆,从平台或技术独立语言,然后再结合它们可能会容易得多。
现在,你用编程语言来发展特定和专业技能,在找工作时会很有用。
选择任何你想要使用的任何平台或技术,用这些平台或技术来创建一些小的应用程序。
我还建议你在这个时候最好还是只专注于单个技术或平台。以后你总能学到更多。
通过这种专攻的方式,你不仅可以了解你需要学习的东西,还能让你更深刻地了解知识和掌握特定技术,而这能让你更有自信,大大提高你的技能的市场化能力。
解决困难的算法问题以便于更好地掌握语言
到现在为止,你对你所学的编程语言应该感觉舒服多了。
你已经对它知之甚深,并且已经在各种不同的应用程序中使用过了。
你应该有了一个应用技能的特定技术或平台,并且使用此技术来创建基本的应用程序感觉已经趁手和舒服多了。
尽管如此,你可能还是不觉得你掌握了这种编程语言。
不要担心;这也是正常的。
当我第一次学习C ++的时候,我记得即使在我知道关于语言的一切,并且已经用这种编程语言实际创建了多个应用程序,甚至还被聘为一个编写C ++代码的开发人员的时候,我仍然不觉得我真正掌握了这门编程语言。
我觉得我是一个很好的C ++程序员,但并非是伟大的。我真的很想提升我的C ++技能,但我不知道怎么办。然后,我发现了这个叫TopCoder的编码竞赛网站。
每个星期,那里都会有一系列新的编程挑战,你可以和其他的程序员一起比赛着解决一些相当困难的算法问题。起初我怕极了。我甚至连最简单的问题也解决不了。
我去看其他人的解决方案,我不知道他们是如何想出这个解决方案的,也不知道他们的代码是如何工作的。他们用着一种我万万没有想到的方式使用C ++代码。但后来,随着时间的推移,随着我锲而不舍地去尝试解决问题,以及看别人是如何解决问题的,我渐渐成长起来了……一点一点,越来越优秀。
我发现了解决某些类型问题的模式。我开始真正了解如何利用我以前忽略了的C ++特性。我学会了如何高效地使用标准库和语言功能以及数据结构来解决复杂的问题。我变得不仅擅长于C+ +,而且非常出色。我终于觉得自己貌似掌握了这门编程语言。这就是我要你做的。
你不必去TopCoder参与竞争,有很多你可以练习解决算法类型编程问题的地方。
对于这类问题,我已经提到了一个很好的资源,还有一些是:
这些问题一开始你解决起来会觉得极其困难,没有关系。本来就是这样的。
你会发现,随着时间的推移,你会开始认识到,只有屈指可数的一些问题类型,并且你能立马指出如何解决这些问题。
起初,你毫无头绪,不知道该做什么,就像我说的,没关系——只要继续努力即可。
另外,不要忘了去看看其他人是如何解决这些让你疲于应对的问题的。尝试着去理解为什么他们要用这样的方式去解决特定的问题。
这是我用于学习如何解决这类问题的最佳途径之一。
我会看看TopCoder上顶级程序员的解决方案,从中我学到了很多东西。
一旦你可以用你所学的编程语言解决这些类型的编程问题,那么你不仅相当接近于掌握语言,而且通过编码面试将会成为一件轻而易举的事情,因为其他的候选人碰到问题只能汗流浃背,自愧不如。