首页  ·  知识 ·  研发管理
优秀程序员养成指南:掌握两大基础知识
网友  36氪  技术管理  编辑:白衣沐风   图片来源:网络
优秀的程序员有着扎实的基本功,他们对解决问题、计算机背后的理论了解地十分透彻。这两大基础知识不仅有助于写出简洁的代码,更有助于程序员未来的提高

我们都知道,优秀的程序员能够开发出超棒的功能、网站、应用程序等。他们有什么共同点呢?

在我的研究中,他们的共同点不仅仅是精通某门语言或拥有很好的教育背景。真正有才华的程序员对基础知识掌握到炉火纯青的地步。这个基础使他们能创造伟大的东西,提出突破性的想法。

想想金字塔:它的底部非常之大,越往上越小,顶部是尖尖的。编程的基础知识就是金字塔的底部,一切都从那里开始。

那么这些基础知识是什么呢?根据我的经验和我研究过的程序员的背景,我认为编程基础知识有两部分。

超凡的问题解决者

首先,你必须是一个高效的问题解决者。这是一个重要的起点,因为编程就是解决问题。

虽然解决问题的方法有很多,但问题解决流程有几个部分让我印象深刻。超凡的问题解决者会提炼出问题的本质,以便确定他们的总体目标,并有目的地开始处理问题。然后,他们将每个问题分解成小块的、可管理的部分,依次处理每个部分。有时还会实现它的可视化。

这个过程比听起来要难。当我刚开始编程时,我遇到了瓶颈:跟很多人一样,我在学校从来没有学会如何解决问题(这是一种不容易教授的技能)。数学老师给我们布置了一组习题集,然后我们就立即开始做题——这就是我刚开始编程时所做的事情。毫不奇怪,我压根儿不会,连最简单的问题也不知道如何解决。

我开始学习问题解决流程、学习如何高效解决问题,这时,事情开始发生变化。我现在在解决一个问题之前,先分析它的目的。我要感谢George Polya的书《怎样解题 数学思维的新方法》(购买链接:当当京东)给我的建议。

我将Polya的一些理念应用到编程中,比如理解问题。Polya 写道:“必须理解问题。”这包括能够“指出问题的主要部分:未知部分、数据和条件”。对于每个问题,我都会拿出一张纸,写下这些问题的答案:我要解决什么问题?(未知部分);我现在拥有什么?(数据);我需要注意哪些限制或细节?(条件)。

上面的几个问题答案似乎是显而易见的,但很容易被忽视。我经常在某个问题上投入数小时,但很久之后才意识到,我忽略了问题陈述中一个小而关键的细节。写下问题的细节让我的思考慢下来,让我能够准确地思考我需要做什么。这是成功的一半。

在此基础上,我会制定一个计划,这也是Polya的另一个建议。它很有意义。我写文章前先写提纲,画家在作画之前先画一幅素描稿,建筑商根据图纸建造房屋……编程也一样。与其急着去做,还不如先思考我要做什么,然后制定一个计划。

做计划的方法很多。

  • 有时我只是简单地用数字列表列出我需要采取的步骤:1. 做AAA;2. 做BBB。

  • 我还会把问题“可视化”:当我学习for循环的时候,我拿出一把杏仁,用这堆杏仁学习迭代。这现在看起来可真够愚蠢的,但它在我初学阶段帮助我思考了这个问题。

  • 我还会画图或者图表。对于递归问题,我会绘制一个图表,说明每次递归调用时发生的情况,直到我理解它为止。

我几乎总是能找到一种方法使问题更易于处理,这就简化了问题,并帮助我发现处理此类问题的模式。

在此之上最重要的是,在解决一个问题之前,先分析它的目的,并在解决问题的过程中始终保持这种目的感。

尽管制定了计划,但问题仍然很难,我仍然会被困住。成为一个伟大的问题解决者需要时间。我仍在为此而努力,我知道这份努力绝对值得。你可以看到不同之处。

当我阅读一个超凡的问题解决者编写的代码时,我能感到他的代码很干净,很容易理解;变量的名称都很好;功能简单明了;每一行代码都有特定的用途,没有多余。代码的清晰性反映了程序员的思想流程:我从头到尾流畅地阅读代码,确切地知道每一行代码的意义。这是超凡的问题解决途径,也是我所追求的。

计算机科学

学习计算机科学是第二个编程基础知识。我最近开始学习计算机科学,我很喜欢它,因为我正在超越表面的层次。例如,当我使用内置函数时,我将“在后台”了解其运行。我还在学习内存和运行时间等等其他主题。简而言之,我正在学习为什么计算机会做它所做的事情。

了解这个原因可以增加我的背景知识,让我更有见识,这样,我在写代码时会更加深思熟虑。例如,现在我对运行时间有了一些了解,我将选择使用二分查找,而不是循环访问列表中的每个元素。

它还丰富了我对核心编程概念运行的理解。例如,我正在处理一个递归问题,但没有得到预期的解决。经过仔细检查,我明白了其中的原因:它与调用堆栈的执行有关。而就在几个月前,我几乎完全不会意识到这一点。

以及使用“类”(class)。我在“类”上挣扎了很长一段时间,不敢用它。我知道怎么写,但不确定什么时候以及为什么要用它。我创建实例和调用方法,当我了解到这时我的计算机内部实际发生了什么时,这种情况发生了变化。当我有了一些背景后,我终于知道怎么用“类”了。在递归和类上,计算机科学填补了我知识的空白。

很多时候,基础知识被抛到了一边。进步很可能非常慢:当有所选择时,人们倾向于选择更“有趣”的方法来解决问题,这是一个耻辱。掌握基础知识的程序员似乎对编程充满信心:他们知道自己如此选择的方式和原因——这还可以改进他们的工作,提高他们的认可度。

此外,扎实的基础知识使学习新的语言和技术变得更容易。例如,花时间真正理解一种语言的核心概念,如迭代、递归和抽象,将有助于另一种语言的学习。简单地说,掌握了基础知识,就会有很多收获,而且几乎没有什么损失。


本文作者:网友 来源:36氪
CIO之家 www.ciozj.com 微信公众号:imciow
    >>频道首页  >>网站首页   纠错  >>投诉
版权声明:CIO之家尊重行业规范,每篇文章都注明有明确的作者和来源;CIO之家的原创文章,请转载时务必注明文章作者和来源;
延伸阅读
也许感兴趣的
我们推荐的
主题最新
看看其它的