近来很多同学提问求助: 海森你学过XX语言吗? 其实在有限的时间经历下, 我不可能精通每一门编程语言. 但是通过本文介绍的方法, 你可以在一小时内快速上手一门语言.
本文前半篇介绍一些相关概念, 后半篇附上方法论.
相关概念
在阐述方法论之前需要明确一些定义.
使用 vs. 精通
使用一门语言意味着你可以利用该语言解决问题. 精通一门语言意味着你了解语言运作的原理, 底层实现细节, 以及语言生态(库).
通常语境下, 学会一门语言指的是前者. 精通一门语言所需要的时间精力远大于学会如何使用它. 所幸的是, 大多数情况下我们只需要掌握使用即可. 一个直观(但不准确)的对比: 如果精通一门语言需要投入一万小时, 学会使用只需要二十小时左右. 本文介绍的就是快速入门的技能.
算法 vs. 实现
计算机解决问题的核心是算法与数据结构的总和. 但是同样的一个算法(功能)function
可以有很多种实现implementation
. 这里举一个例子:
问题:取出床头柜里的一件指定物品. 几种可能的解法如下:
- 逐个打开抽屉, 遍历每一件物品. 如果当前物品是被指定的, 结束搜索.
- 在放入物品时候记录到索引里. 取出时直接查表并更新索引.
- 随机打开一个抽屉, 随机抽取一个物品. 重复该过程直到这个物品是指定的.
- 拆毁床头柜, 在散落一地的物品里找到指定的那一件, 然后把柜子组装回去.
虽然其中一些解法匪夷所思, 但是它们都可以解决问题. 在这个例子里, 方案2在效率上有显著的优势. 在实际问题里, 不同实现很多各有优缺点, 需要结合实际权衡. 比如说归并排序merge sort
, in-place
实现需不要开辟额外的内存空间, 但内存交换次数会增加. 因此在大容量低速存储器上, 标准实现更占优势; 反之则原地实现更有利.
计算机程序的抽象允许我们只关心算法功能, 而不必纠结内部的实现. 这也是许多语言标准库存在的意义.
方法论
这一节我们讨论如何快速上手一门编程语言. 这个方法适用于大多数的现代语言.
概览
学习一门新语言之前你需要回答以下问题:
- 这门语言有什么特性?
- 这个特性如何解决目前遇到的问题?
这会告诉你值不值得学习这门语言.
其次就是掌握结构化程序的常见语法在这门语言里的表示方法, 要点详细写在Checklist里.
注意并非所有语言都在语法层面支持下面提到的这些要点. 毕竟如果所有编程语言都一样, 那也就没有那么多名目存在的必要. 但是, 这些缺失的支持往往可以使用库/复杂的实现来完成, 例如C语言并没有类的概念, 但是也可以用struct来达成目的.
也有很多时候, 语言提供了语法糖(Syntax Sugar)来简化某些操作; 或者提供了不在下面列表内的新特性. 这些往往是这门语言的精髓, 但是如果只是想快速学习一门语言以快速投入生产, 把这些高级功能暂时忘了吧, 除非非用不可. 请在二十小时之外再拿些时间来学习它们.
此外还有一条建议. 和写作一样, 多读多写也是快速提升代码能力的一种非常有效的方式. 不妨在网络上找一个简短但演示了大多数常用语法的例程, 对照着原本已经熟悉的语言来学习.
Checklist
基本数据类型
- 声明
- 类型
int
float
str
- 变量赋值
基本语句
- 输入输出
- scan
- 文件操作
- open
- close
- read
- write
- 条件跳转
if/else
switch
- 循环
while
for
break/continue
- 输入输出
复合数据类型
OOP面向对象编程
- 类定义
- 类实现
- 权限控制
增删查改常见数据结构
- 数组/列表/链表
- 字典/映射
- 集合
常用库
- 网络
- 并发
- 图形