如何学习一门语言(以scala为例)
简介
这个章节会是我对于如何学习一门语言的方法论的探索, 也是我面临着要学习从来没有接触的语言scala的过程的记录(并不是完全陌生, 有着Java的底子在, 而scala是个同样运行在JVM上的语言)
学习的过程
我们需要掌握哪些知识可以说我们“学会”了, 又用什么标准来衡量我们已经”掌握“了, 可以迈向下一个阶段, 如果你要学习一门语言, 你可以使用下面的阶段清单来去评估自己所处的阶段和去补足自己
特性熟悉阶段
我在这部分试图给出来一个完整的check list供查漏补缺, 但是这些只是一些不同语言基本都会提供的共性部分, 每个语言都会有自己的差异化的特性, 这部分的特性需要自己查找官方的文档来去补充(这部分的核心特征往往会是这个语言存在的理由)
推荐的资料
- 官方的文档: 官方往往会提供一个简明但是又足够概括核心特性的教程
这个阶段你需要知道
语言的基本运行环境
- 运行起来这个语言需要的基本的环境
基本的语法
- 类型的详细信息(强弱类型, 基本类型, 引用类型, 占用大小, 如何声明等)
- 类型推断
- 类型转换, 隐式转换的规则
- 运算符
- 函数
- 分支控制语法
- OOP(如果是只面向过程的语言也可以进行检查, 实际上OOP的思想往往也会有在面向过程语言体现出来(比如C语言同样能实现struct继承), 毕竟解耦合的需求无关编程范式)
- 继承, 多态的语法
- 抽象类
- 接口(纯虚类), 这部分的命名因语言而异
- OPP(现代编程语言中往往会提供函数式编程的额外的特性, 极大地加强了灵活性和可读性, OPP和OOP并不是冲突或者说有高下之分的)
- lambda表达式
- else(看具体的语言提供的内容)
- 错误机制
- 抛出错误
- 捕获错误
- 自定义错误类型
- I/O
- 文件I/O
- 网络I/O
- 包管理机制
- 类型的详细信息(强弱类型, 基本类型, 引用类型, 占用大小, 如何声明等)
工程化的基础
这个阶段的知识往往是搭建大型应用的时候需要掌握的知识
推荐的资料:
- 官方的进阶的资料, 一般来说官方同样会提供进阶的教程, 这些内容基本都是一定会被涉及的
- 以这门语言为名字的书籍(一般来说这种教科书性质的书籍都包括下面的内容, 除了测试框架)
- 主流的测试框架
- 标准库的使用(Std lib)
- 集合
- Map
- 迭代器
- …
- 并发编程
- 内存模型 (在JVM语言里是JMM, 而C等编译型语言往往是直接是操作系统的内存模型)
- 锁类
- 原子类
- 线程(进程/协程)完整的生命周期管理
- 并发安全集合类
- 池化技术(线程池等)
- 内存屏障
- else
- 包管理工具
- 项目管理工具
框架
这部分的内容往往是要视工作内容而定, 将其归为”语言学习“是出于这部分的check list的完整性, 毕竟很少不用框架只做原生开发的工作内容, 但是实际上里面并不是所有的内容都需要掌握, 下面会按框架的种类进行分类
学习资料:
- 框架自身的文档, 一般来说能直接搜到, 从下面的这几个方面入手搜就行
- Web框架: Spring MVC, Django..
- 通用框架: Spring, vue, react
- ORM框架: Mybatis, Django…
- 脚手架框架: Spring Boot
- …
深入了解
这里我们需要深入了解这门语言, 最终的目的是帮助我们写出高质量的符合这个语言特性的代码
- 源码
- 集合等容器的源码
- 并发编程中的各个部分的源码
- I/O部分的源码
- 语言从源码到最后的运行状态之间的过程
- 编译
- 加载
- 链接
- 运行
- 语言的运行时
- 虚拟机(有的话)
- GC
- 没有GC的话, 内存管理机制
- 推荐的编程范式
…
限于笔者水平, 别的等后续拓展, 其中还需要说明的是关于框架的深入学习, 我这里认为那已经是个额外的命题了, 过于脱离“语言学习”本身的范畴
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.