指南 | 快速上手一门编程语言

近来很多同学提问求助: 海森你学过XX语言吗? 其实在有限的时间经历下, 我不可能精通每一门编程语言. 但是通过本文介绍的方法, 你可以在一小时内快速上手一门语言.

本文前半篇介绍一些相关概念, 后半篇附上方法论.

相关概念

在阐述方法论之前需要明确一些定义.

使用 vs. 精通

使用一门语言意味着你可以利用该语言解决问题. 精通一门语言意味着你了解语言运作的原理, 底层实现细节, 以及语言生态(库).

通常语境下, 学会一门语言指的是前者. 精通一门语言所需要的时间精力远大于学会如何使用它. 所幸的是, 大多数情况下我们只需要掌握使用即可. 一个直观(但不准确)的对比: 如果精通一门语言需要投入一万小时, 学会使用只需要二十小时左右. 本文介绍的就是快速入门的技能.

算法 vs. 实现

计算机解决问题的核心是算法与数据结构的总和. 但是同样的一个算法(功能)function可以有很多种实现implementation. 这里举一个例子:

问题:取出床头柜里的一件指定物品. 几种可能的解法如下:

  1. 逐个打开抽屉, 遍历每一件物品. 如果当前物品是被指定的, 结束搜索.
  2. 在放入物品时候记录到索引里. 取出时直接查表并更新索引.
  3. 随机打开一个抽屉, 随机抽取一个物品. 重复该过程直到这个物品是指定的.
  4. 拆毁床头柜, 在散落一地的物品里找到指定的那一件, 然后把柜子组装回去.

虽然其中一些解法匪夷所思, 但是它们都可以解决问题. 在这个例子里, 方案2在效率上有显著的优势. 在实际问题里, 不同实现很多各有优缺点, 需要结合实际权衡. 比如说归并排序merge sort, in-place实现需不要开辟额外的内存空间, 但内存交换次数会增加. 因此在大容量低速存储器上, 标准实现更占优势; 反之则原地实现更有利.

计算机程序的抽象允许我们只关心算法功能, 而不必纠结内部的实现. 这也是许多语言标准库存在的意义.

方法论

这一节我们讨论如何快速上手一门编程语言. 这个方法适用于大多数的现代语言.

概览

学习一门新语言之前你需要回答以下问题:

  1. 这门语言有什么特性?
  2. 这个特性如何解决目前遇到的问题?

这会告诉你值不值得学习这门语言.

其次就是掌握结构化程序的常见语法在这门语言里的表示方法, 要点详细写在Checklist里.

注意并非所有语言都在语法层面支持下面提到的这些要点. 毕竟如果所有编程语言都一样, 那也就没有那么多名目存在的必要. 但是, 这些缺失的支持往往可以使用库/复杂的实现来完成, 例如C语言并没有类的概念, 但是也可以用struct来达成目的.

也有很多时候, 语言提供了语法糖(Syntax Sugar)来简化某些操作; 或者提供了不在下面列表内的新特性. 这些往往是这门语言的精髓, 但是如果只是想快速学习一门语言以快速投入生产, 把这些高级功能暂时忘了吧, 除非非用不可. 请在二十小时之外再拿些时间来学习它们.

此外还有一条建议. 和写作一样, 多读多写也是快速提升代码能力的一种非常有效的方式. 不妨在网络上找一个简短但演示了大多数常用语法的例程, 对照着原本已经熟悉的语言来学习.

Checklist

  1. 基本数据类型

    • 声明
    • 类型
      • int
      • float
      • str
    • 变量赋值
  2. 基本语句

    • 输入输出
      • print
      • scan
      • 文件操作
        • open
        • close
        • read
        • write
    • 条件跳转
      • if/else
      • switch
    • 循环
      • while
      • for
      • break/continue
  3. 复合数据类型

    • OOP面向对象编程

      • 类定义
      • 类实现
      • 权限控制
    • 增删查改常见数据结构

      • 数组/列表/链表
      • 字典/映射
      • 集合
  4. 常用库

    • 网络
    • 并发
    • 图形