老齐教室

什么是学习编程的正确方法

对程序员、开发人员和数据科学家的高度需求吸引了许多人加入 IT 领域。通常,初学者总要试图在学习过程中找到捷径,以便更快地谋得一份工作。

速成式学习不一定是好事。不少人,为了缩短学习过程,或者出于畏惧心理,可能跳过某些重要内容。

“我发现:新手程序员犯的最大错误是专注于学习语法,而不是学习如何解决问题。” —— 安东·斯普拉尔

无论你的目标职业是软件开发人员、web开发人员还是数据科学家,所有基于IT的职业都有一个共同点,那就是编程。

在本文中,我将引导你完成5个步骤。我相信这是学习编程的正确方法。在开始之前,要澄清一下,我不会谈论如何用特定的语言编程。相反,将讨论如何培养解决编程问题的直觉和思维过程。

作为一名程序员,你要做的可不仅仅是坐在电脑前快速地敲键盘,还要解决各种问题。

首先要有逻辑地解决问题

第一步是用纸和笔合乎逻辑地解决问题,可能你觉得这种做法“老旧”了。每当我教一个零基础的初学者学习编程时,都会在真正开始编码之前,先解释解决编程问题背后的逻辑,我会用笔和纸来解决许多问题。

为了培养你的编程直觉,建议完成以下练习:

  1. 仔细阅读问题。阅读问题的目的在于找出具体细节,包括你需要做什么,输入是什么,以及期望的输出是什么。
  2. 在不考虑代码的情况下解决问题。 我把这一步放在第一位,因为如果你已经知道如何编码,往往会直接开始写代码。 不要这样做!首先常用自然语言的词汇解决问题。
  3. 用多种输入用例测试解决方案。一旦想出了一个解决方案,就将它用于不同情形的实际案例中,看看你的解决方案是否能满足所有的情况。
  4. 每天都练习解决问题。每天都做这个联系,能帮助你培养编程直觉,并锻炼你在解决问题方面的技能。

这个第一步非常关键,但许多人似乎完全忽略了这一步。学习正确的思维方法以及学习如何解决编程问题,这将有助于减少你在将来解决问题时所花费的时间。它还将帮助你更快、更高效地学习多种编程语言。

学习算法和数据结构

不少人试图避免学习数据结构和算法,因为他们认为这些内容很复杂、很难学,在实际开发中没有什么用处。

的确,在没有扎实的算法和数据结构知识的情况下,也可以在职业生涯中取得一定的成功。但掌握好这些概念将加强你的知识基础,让你成为一名更优秀的程序员。

算法的概念不仅仅适用于计算机。算法是一系列步骤,当遵循这些步骤时,可以解决特定的问题。如果你用心想一想,我们每天都在开发和使用算法!比如早上醒来时,我总是煮一些咖啡。这就包含着算法过程:拿咖啡豆,研磨,在咖啡机里装满水,然后煮咖啡。

这就是按照一套特定的步骤来解决一个特定的问题——我对咖啡因上瘾!后来改为喝茶了。当你学习如何有逻辑地解决问题并培养直觉时,也基本上是在学习如何开发和应用算法。

另一方面,数据结构是输入和输出的呈现方式。回到咖啡算法,咖啡的初始状态将影响煮咖啡的方式。例如,若有整粒咖啡豆,需要先把它们烤熟并磨碎,然后才能煮咖啡。然而,如果豆子已经磨碎了,就可以直接用它煮咖啡。对于煮咖啡这件事情来说,整个的咖啡豆和磨碎的咖啡豆是可能存在的数据结构。因此,不同形式的数据(或咖啡)需要不同的处理方式。

有很多学习算法和数据结构的书籍、课程供选择 。

阅读复杂性理论

对于以编写代码为生的人来说,复杂性理论是非常重要的,是应该熟悉的。

复杂性理论(complexity theory)是理论计算机科学和数学的一个分支,它致力于将可计算问题根据它们本身的复杂性分类,以及将这些类别联系起来。一个可计算问题被认为是一个原则上可以用计算机解决的问题,亦即这个问题可以用一系列机械的数学步骤解决,例如算法。

复杂性理论描述了算法在输入和实现方式方面的性能。用外行的话说,它描述了你的算法有多好。计算机虽然能够执行高难度的任务,但也有其局限性。如果你开发了一个非常复杂的算法,以至于现在的计算机无法运行它,那么它可能是没有好处的。

当你致力于现实生活中的应用程序,试图解决许多问题时,总是需要记住答案的复杂性。例如,如果我给你一本书,让你打开第5页,你可以简单地翻阅第1~5页。因为第5页离开始很近,翻阅前几页并不需要很多时间。但是如果我想让你打开第489页,你可能需要多花费一点时间。

这就是复杂性理论所描述的特征。虽然问题是相同的,但可以提出不同的解决方案,并非所有的解决方案都具有相同的效果。选择最佳解决方案是每个开发人员都需要掌握的技能,而复杂性理论就是掌握这一技能的基础。

从伪代码开始

慢着!现在还不是使用某种编程语言的时候,但是你已经快要做好准备了。

当你已经解决了许多问题后,就培养了自己的直觉,并且了解了所使用的基本算法和数据结构。是不是希望开始编写代码并做一些很酷的项目。

但是,

在此之前,我建议首先使用伪代码来实现你的算法和练习解决问题的技能。正如我们刚才讨论的,算法是用于解决特定问题的一套步骤。伪代码被认为是“任何算法中用普通语言描述的步骤”,也就是说用伪代码将算法的实现过程描述为介于普通英语和编程语言之间的一种形式。

通常,伪代码是给人看的,而不是让机器读取。这是一种向他人而不是向计算机解释你的思维过程的方式。

简而言之,如果你的算法对其他程序员来说没有意义,那么它可能会非常复杂或不准确。

以特定的语法应用知识

最后,做好开始编码的准备。

一旦具备了解决问题、算法和复杂性理论的坚实基础,你就可以坐下来,开始选择并学习某一编程语言。根据维基百科,有700多种编程语言。现在,并非所有这些语言都是众所周知的、或仍在使用的。

此时,你可能会问自己:从哪种编程语言开始学起?

好消息是,所有编程语言基本相同。这意味着,如果你有良好的编程直觉,可以将这种直觉应用于任何编程语言。你只需要学习它的语法。

不同的编程语言可以看作是表达同一事物的不同方式。例如,如果我想说我家附近有一个漂亮的花园,我可能会说(注:没有翻译表示此种意图的各种表述,以便读者理解“对同一事物的不同表达方式”)

  • There is a beautiful garden near my house.
  • I absolutely love the garden near my house.
  • I enjoy the beauty of the garden near my house.
  • There is a garden near my house. It is beautiful.

所有编程语言都有相同的关键词、变量、循环、数据类型、条件语句、函数、类等。只是它们的编写方式略有不同。

所以,不管你使用哪种编程语言,只要你的基础是坚实的,就能很快学会。话虽如此,基于你的目标职业,有些编程语言可能比其他语言更值得学习。

结论

不管你的职业规划如何,只要跻身于 IT 行业中,必须要学习并擅长编程。 虽然学习编程的方式很多,在我看来,正确的路径是:

  1. 培养良好的编程直觉(解决问题的技能)。
  2. 学习算法和数据结构。
  3. 至少学习复杂性理论的基础知识。
  4. 首先用伪代码实现解决方案。
  5. 学习某些编程语言的语法。

如果遵循了前四步,在第五步时学习任何语言都不会太吃力。把前四步看作你的知识支柱,支柱越强大,可以取得的造诣也就越高。

参考文献

[1]. How to Learn Programming The Right Way

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

关注微信公众号,读文章、听课程,提升技能