如何快速学习一门新编程语言
一、前言
Hi,大家好,作为一个程序员,编程语言这么多,前端js、后端go、java、python,嵌入式c、c++…且每几年可能都冒出一些新的语言,比如说前几年出现的go语言,这几年各大厂后端实现都切go语言了,又比如说linux都要使用rust语言重写了,我们难免要学习新的语言。如何快速学习一门新语言,这里斗胆提一些我的心得,相当于是我的一些笔记,以便后续查阅,若能帮到诸君,不胜荣幸。
1.1 “技” 和 “术”
目前LLM盛行,对于新技术的学习借助LLM效率有非常的提升,网络上也有一些介绍方法论的东西,但总感觉飘在空中,不够具体,实践上没有指引,借用LLM当然能提升效率,但是这些方法论始终是LLM的,不是我们自己的。所谓“技术”,分“技” 和 “术”,所谓"技" 的核心含义: 具体操作能力。比如我们会C语言,那C语言就是我们的技能,python语言也是我们的技能。但是这么多语言,我们不能学完,这么多技能,不可能全掌握。所谓"术",就是这些技能的方法论,一通百通,比如“如何快速掌握一门新的编程语言”就是“术”。 个人发展的前几年可以通过提升自己的技能,将"技"通过case by case的方式累计,但是随着年龄增长,一定要掌握“术”的东西,因为面试时面试官可不会问你每一项技能的具体情况。尤其是当下LLM如此强大,每一个"技" 都可以快速通过LLM获得,或者直接通过LLM实现。我们更要掌握“术”,也就是方法论。编程语言是一辆辆车,学习编程语言的方法,就是开车的方法。
1.2 文档目标
介绍方法论的文章网络上很多,这里旨在提供一份checklist,切实的可通过一一对应的方式,快速学习新语言。
1.3 面向对象
本文章面向对象是已经熟练掌握至少一门编程语言的程序员。
二、正文
2.1 学习效率公式
眼花缭乱的编程语言,其实都是大同小异,基本的设计原理都是接近的,70%是相近的,基于已有知识(意掌握的语言),主要聚焦于30%的语言特性差异即可,这其实也是类比的过程。
学习效率公式:
掌握速度 = (已有经验迁移 x 项目复杂度 / (特性差异 x 无效学习时间))
2.2 编程概念
什么是学习?学习是建立认知的过程。什么又是认知?认知就是将对象的概念明确的过程。其实编程语言中的概念:变量、函数、运算符、调试手段、并发性、内存管理、IO处理、面向对象等。主要关注与已掌握的语言的差异,我这里说的主要是语法的快速掌握。
可按如下步骤推进:
1、快速查阅语言特性:
脚本语言 or 编译语言?
面向流程 or 面向对象?
是否是类C语言?
语言特色,如go语言适合高并发,适合后台开发。C语言可以直接底层内存,适合嵌入式等。
2、hello world & 1+1
写一个hello word程序,计算1+1,快速掌握变量定义,函数定义,调试printf实现,如何格式化打印。(粗暴点,掌握了printf的使用,其实就可以开始编程调试了hahaha~)
3、语法学习
根据如下check list,对比已知语言,填写差异项即可。对照checklist,2小时基本可以掌握语法差异。
4、demo开练
掌握基本语法,直接写demo练习。
4、高级feature支持情况和学习
高级feature如泛型、元编程、内存管理gc、函数式编程、闭包,线程创建等可以靠后学习,这是从1到100的过程。
2.3 语法自检表
以博主为例,我是掌握C语言和python的语言基础上,学习JS语言。建立如下语法对比表格。
语法概念 | C语言 | python | 目标语言(JS) |
---|---|---|---|
行尾标识 | ; | 换行符 | ; |
格式化打印 | printf(“love you %d year”, 10000); | print(“love you %d year” % 10000) | console.log(“Name: %s, Age: %d, Height: %f”, name, age, height); |
变量 | int a = 0; | a = 0 | var a = 5; |
变量类型 | 强类型 | 弱类型,根据值确定 | 弱类型 |
变量赋值 | a = 100; | a = 100 | let a = 100; |
变量空值 | NULL | nil | 空(Null)、未定义(Undefined) |
变量生命周期 | 栈变量: 函数内; 堆变量:全局 | 默认局部变量,global修饰为全局 | 和C一样,全局变量和局部变量 |
函数定义 | int func(int a) | def func_c(a,b) | function myFunction(var1,var2) |
函数体格式 | {} | 缩进 | {} |
函数返回值 | 单个返回值,可以返回指针 | 支持返回变量列表return a,b | 不支持,可以以数组形式返回return [a,b] |
逻辑运算符 | 无特殊 | 除//,not、or | ===, 绝对等于,值和类型均等于 |
分支条件 | if (!ok){}; switch-case | if not ok: | if (time<20) { x=“Good day”; } |
循环语句 | for(i=0;i<10;i++) {} | for a in listA: | 同C语言。for (var i=0;i<cars.length;i++) { />} |
面向对象支持 | 不支持 | 支持 | 支持 |
类定义 | struc{int a;int b;} | class MyClass: i = 12345 def f(self): return ‘hello world’ | class MathUtils { static PI = 3.14; // 静态属性 static add(a, b) { // 静态方法 return a + b; } } |
self指针传递 | 传递struct指针 | 类方法调用自动传递 | 自动传递 |
构造函数定义 | 无 | class Complex: def _init_(self, realpart, imagpart): self.r = realpart | class ClassName { constructor(参数列表) { // 初始化实例属性 this.属性名 = 值; } } |
继承 | 无,手动复制struct | class DerivedClassName(BaseClassName): | class Child extends Parent { |
线程和协程 | pthread_create | thread.start_new_thread( print_time, (“Thread-1”, 2, ) ) | const worker = new Worker(‘worker.js’); worker.postMessage({ data: ‘Hello’ }); |
GC机制 | 无 | 有 | 有 |
泛型 | 不支持 (宏,C++支持template) | 支持 | 支持 |
元编程 | 宏,#define | 支持,class AddInfo(type): def new(cls, name, bases, attr): attr[‘info’] = ‘add by metaclass’ return super().new(cls, name, bases, attr) class Test(metaclass=AddInfo): pass | 支持,Proxy、Reflect、Symbol |
函数式编程 | 不支持 | 支持,lambda表达式 | 支持,const sum = [1, 2, 3].reduce((acc, num) => acc + num, 0); // 6 |
闭包 | 支持,static变量实现。 | 支持,def f1(): n=999 def f2(): print(n) | 支持,var add = (function () { var counter = 0; return function () {return counter += 1;} })(); |
三、借用LLM
可以利用LLM给我们生成一份学习思路,当我们不知道如何问LLM时,可以让LLM给我们生成一份提示词
1、你好,我是一名掌握C语言和python的程序员,想要通过LLM学习javascript语言,请帮忙写一份提示词
2、将LLM生成的提示词喂给AI,生成学习报告
可以将上述表格喂给LLM,让其给我们输出报告,但是不建议。因为纸上得来终觉浅,这份表格就是让自己建立认知的过程。具体代码调试过程错误可以交给LLM来解决,通过对话方式即可。
四、学习网站
1、菜鸟教程 - 学的不仅是技术,更是梦想!
2、Learn X in Y Minutes: Scenic Programming Language Tours