如何掌握一门编程语言的运用
引子
在知乎上看到有一个提问:“如何才能精通一门编程语言?”
我个人在多年开发生涯里,项目中使用过 Java,Groovy ,JavaScript,Python,PHP ,学习过 C,Scala, Go, Clisp ,Shell, 也看过一些语言特性的争论。最近在学习 Go,想想正好可以梳理下,如何去掌握一门新语言的运用,作为学习新编程语言的指导方法论。
“谦虚”的程序员从来不敢用“精通”一词,因为精通意味着你能够理解关于这个事物的几乎一切原理实现细节,从地核到天空,从指令集到编译实现,乃至语言设计的各种权衡取舍,使用它所面对的各种问题。
精通编程语言并不是特别值得追求(除非对编程语言非常有兴趣或者想设计一门编程语言),掌握原理和设计才是真正值得追求的。
就像学会用一门语言不是最重要的,重要的是能用语言表达什么以及如何表达。
学习语言设计思想
学习语言,要注重语言背后的设计思想而不是形式(语法糖)。比如:
-
变量声明,究竟是把类型放在变量名前面好,还是变量名放在类型前面好?为什么?
-
强(弱)类型系统与静态(动态)类型系统各有什么优缺点?
-
类型推导是怎么回事?有什么益处和弊端?
-
作用域怎么回事?如何有效避免名字冲突?
-
传值引用与指针引用的区别?各应用在什么场合?有什么注意事项?
-
在语言使用层面完全屏蔽指针是合理的还是不合理的?为什么?
-
(对象指针)是显式声明好还是隐式声明好?
-
为什么说组合优于多重继承?多态(继承与实现)究竟应该针对行为还是针对属性?
-
如何实现类型检查安全的泛型机制?
-
匿名类与闭包、lambda 是怎么回事?为什么要有这些特性?
-
函数即是对象怎么理解?代码即是数据怎么理解?
-
结构化/面向对象/函数式/元编程是什么?各有什么益处和弊端?
-
并发、垃圾回收、工程管理特性、代码规范内置在编程语言里,好还是不好?利弊如何?
-
网上的语言特性的争论,分歧点在哪里?为什么有人说这个语言特性设计得好(或不好)?
弄清楚这些语言背后的设计思想,或许能更快地熟悉一门新编程语言。而要真正掌握一门编程语言,最好的途径莫过于自己去设计和实现一门稍微简单的编程语言或 DSL 了。
如何判断自己是否足够掌握一门语言的运用
- 学会使用语言的良好子集来构建程序,而不是贪多求全;
- 深刻理解作用域;
- 深刻理解变量的初始化顺序和过程;
- 学会使用函数来构建模块化程序;
- 学会识别指针和引用,用对指针传值和引用传值;
- 学会根据问题域构建对应的结构体或对象;
- 学会接口、类与对象的用法;
- 学会此语言的习惯地道用法;
- 学会和掌握此语言的代码规范;
- 学会将中小规模的程序划分为多个逻辑单元;
- 能够运用编程语言实现基本的数据结构,比链表、哈希、二叉查找树;
- 能够用编程语言实现一个背包问题求解(动态规划);
- 能够运用编程语言实现一个迷宫(回溯算法);
- 做一个单词解析程序;
- 做一个简单的管理系统;
- 做一个简单的爬虫程序;
- 学习如何写出Bug 少的程序;
- 学习如何写清晰的可维护性良好的程序;
- 学习并发编程(高阶内容);
- 学习网络编程(高阶内容);
- 学习反射和泛型(高阶内容);
- 学习如何对该语言项目进行编译、打包、部署和运行(高阶内容);
- 学会语言的编译实现,比如 汇编、字节码、 虚拟机、CPU 指令集(高阶内容);
- 从入门到放弃……