跳转至

如何用 3 小时入门任意编程语言

今天这期视频,我想分享一个统一的思路,让你用 3 个小时的时间入门任意的编程语言。我认为,只要你有小学三年级的水平——英语、数学和逻辑,你就可以上手任何编程语言。注意,我这里说的是上手,而不是精通。你当了 10 年、20 年程序员,都不敢说自己精通任何一门编程语言。但是上手学会基本语法,我想是可以在非常短的时间内做到的。

我认为,与其一上来就关注特性,对于新手来说,倒不如一上来先关注共性。有没有哪些特点是学习所有编程语言都必须要面对、都逃不开的?我想是有的。我是科班出身,所以说我入门过非常非常多的语言,什么 C 啊、Java 啊、C# 啊、Go 啊、TS 啊,很多我都写过。我总结了九个入门步骤(Nine Steps for Beginners),接下来我来分享一下。

第一步:理解编程语言的本质

这是我从一个曾经的大厂 CTO 嘴里得知的,他说:任何编程语言本质上都是在操控硬件资源,在硬件资源之间去做平衡。硬件资源主要有五种:CPU、内存、磁盘、网络带宽,现在可能还多一个 GPU。这一步是为了让你对编程语言、对高级语言建立一个正确的、稍微有一点深刻的初步认知。

第二步:Hello World 与输入输出思维

所有编程语言你都会学 Hello World,对吧?但是你有没有想过为什么要学?这是一种程序的思维方式,叫做输入输出思维。程序本质上是需要跟人交互的,那人通过什么去交互呢?其中一个办法就是通过打印到那个黑黑的框框里面——那个叫做控制台,这是一种输出的方式。后面你可能会知道,可以通过网络交互,有 HTTP 协议、gRPC 协议,有 GUI 图形化的交互方式,有很多。但是最基础的就是我们说的"打印到控制台"。

第三步:基本数据类型

其实基本数据类型在不同语言里的定义是不一样的,每种语言的基本数据类型都不一样,而且这种不一样的背后都能体现那门语言自己的艺术,或者自己对于编程的思考。但以一个笼统的方式来理解编程世界,我们认为基本数据类型其实就四种:整数、浮点数(就是小数)、字符串、布尔。什么是布尔?就是真或假,True or false。

第四步:条件语句与循环语句

条件语句和循环语句,也就是 if 和 for。其实编程有三要素:你掌握了顺序、条件、循环之后,理论上就能编写任何复杂的程序了。包括现在的深度学习、神经网络、大模型,它的底层本质上都是由一个一个的顺序、条件和循环组成的程序,没有任何不同。举个例子,GPU 理论上是并行计算,它可能迅速运算一些矩阵,那你说我写好几个 for 循环去运算,最终得到的结果是一样的。

通常现在的语言都有传统的 for 循环(循环变量初始化、循环条件、循环变量的改变、循环体),还有那种人类更容易理解的 for-range 循环——直接迭代索引和对应的值。你看,你把不同的语言比对到一起学习,就会发现编程语言在表象上的设计是有很多共性的。

第五步:容器(数据结构)

你会发现绝大多数语言都有两种数据结构:一种叫可变长度列表,一种叫 KV 表(Key-Value 映射表),一个键对应一个值。学数据结构、学容器最关键的就是把增删改查的语法都看一下。怎么遍历一个 KV 表?怎么删除一个 Map 里面的 Key?遍历是有序的吗?这些最常见、最基本的问题,你是要理解的。

如果你不走后端开发的面试、不需要靠编程来吃饭的话,你可以不理解它的底层原理。但比如说遍历一个 Map,遍历是不是有序的,这种事情会直接影响你编程的结果——你一定要去看一下。

第六步:函数

函数代表了一种编程思维:黑箱思维,或者说封装的思维。我只关心输入和输出。除非硬件出故障,否则你运行 function add(a, b) 一万次、一百万次、一百万亿次,它得到的结果都是稳定的。你不用关心中间是什么逻辑。如果中间是一个非常复杂的逻辑,你也不用关心。你只知道输入什么、输出什么就行了,这是函数最重要的概念。函数也分内置函数和自定义函数,不同语言组织函数的方式也不同。

第七步:面向对象

面向对象是一种组织代码的思维方式。它把现实世界的东西抽象成代码。比如你开了一扇门,门这个物体就可以抽象为一个对象(Object),它可能有一些属性(长、宽、高)和一些方法(开、关)。不同语言实现面向对象的方式不一样,Go 用 struct 加方法,Python 和 Java 用 class,但它们背后的思想是相通的。

面向对象也有它的问题,当继承层级太深时会导致代码难以维护。所以又衍生出了"组合优于继承"的思想——Go 就是非常推崇组合的语言。不管用什么方式,核心目的是更好地抽象现实世界、更好地组织代码。你理解了面向对象,后面再学泛型也好、注解/装饰器也好,都只是为这个核心目的服务的语法糖。

第八步:依赖管理

不同语言的依赖管理方式不一样。比如 Java 用 Maven/Gradle,Go 有 go mod,Python 有 pip/poetry/conda。你需要知道怎么导入一个外部库(别人写好的代码),以及导入之后怎么在代码里面调用它。

第九步:上手写项目

当你把前面的概念都过完了,就可以上手写项目了。写一个能用的程序——比如一个 To-Do List、一个计算器、或者调用别人 API 的一个小程序。在这个过程中你会发现,其实所有语言在你刚入门的时候要做的事情是一样的,都是操控硬件资源去处理数据。如果你真正理解了这句话,并且去横向对比几门语言的基本语法如何做这件事,你就会发现:编程语言不过如此。

大多数人学习习惯按部就班从基础开始,看似努力却效果缓慢,而高手采用成品思维,瞄准最终成品倒推拆解目标,走直线学习。具体分为三步:第一步忘掉循序渐进,直接从最接近最终目标的成品开始;第二步把成品拆解成最小可执行的具体动作,逐个攻克;第三步在每个动作上花足时间进行刻意练习,确保练习正好卡在有点难但努力能做到的学习区。无论是学钢琴直接磕完整曲目、学编程直接做小项目,还是备战高考从高考真题倒推补基础,永远围绕自己的目标行动,你以为的"打基础"可能只是在为别人的计划做铺垫,时间的复利终究会奖励那些走直线的人。

很多人感觉自己失去了正常学习能力,其实是掉进了过度求源主义陷阱:认为必须完全弄明白知识的来龙去脉、透彻领悟原理才能真正掌握,把"理解"和"掌握"划等号,这本质是完美主义作祟,害怕模糊和根基不牢。但真相是,人类知识体系本就是一张网,任何一个知识点都能无限追溯,用有限精力挑战无限因果链必然会力竭。走出困境有三个心法:一是给自己上"认知许可证"制度,允许自己暂时不理解某些概念,先把结论当工具用起来,学习本质是先接受再消化,就像用手机不需要先懂芯片原理,用熟了背后原理自然会慢慢浮现;二是给追溯欲望设一个"时间围栏",每次追溯根源时设15分钟硬性截止时间,闹钟一响就立刻回到主线,防止把研究背景变成逃避硬核学习的温柔乡,真正的理解往往是在用了足够多次之后才突然通达;三是用输出倒逼认知闭合,要求自己学完后用一分钟把核心逻辑讲给不懂的人听,输出会帮你自动筛选出核心内容,放过不重要细节。你不是丧失了学习能力,只是卡在了"准备学习"的无限循环中,试着不求甚解地先往前推进,你会发现自己比想象中快得多。