如何掌握一门编程语言的运用

引子

在知乎上看到有一个提问:“如何才能精通一门编程语言?”

我个人在多年开发生涯里,项目中使用过 Java,Groovy ,JavaScript,Python,PHP ,学习过 C,Scala, Go, Clisp ,Shell, 也看过一些语言特性的争论。最近在学习 Go,想想正好可以梳理下,如何去掌握一门新语言的运用,作为学习新编程语言的指导方法论。

“谦虚”的程序员从来不敢用“精通”一词,因为精通意味着你能够理解关于这个事物的几乎一切原理实现细节,从地核到天空,从指令集到编译实现,乃至语言设计的各种权衡取舍,使用它所面对的各种问题。

精通编程语言并不是特别值得追求(除非对编程语言非常有兴趣或者想设计一门编程语言),掌握原理和设计才是真正值得追求的。

就像学会用一门语言不是最重要的,重要的是能用语言表达什么以及如何表达。

学习语言设计思想

学习语言,要注重语言背后的设计思想而不是形式(语法糖)。比如:

  • 变量声明,究竟是把类型放在变量名前面好,还是变量名放在类型前面好?为什么?

  • 强(弱)类型系统与静态(动态)类型系统各有什么优缺点?

  • 类型推导是怎么回事?有什么益处和弊端?

  • 作用域怎么回事?如何有效避免名字冲突?

  • 传值引用与指针引用的区别?各应用在什么场合?有什么注意事项?

  • 在语言使用层面完全屏蔽指针是合理的还是不合理的?为什么?

  • (对象指针)是显式声明好还是隐式声明好?

  • 为什么说组合优于多重继承?多态(继承与实现)究竟应该针对行为还是针对属性?

  • 如何实现类型检查安全的泛型机制?

  • 匿名类与闭包、lambda 是怎么回事?为什么要有这些特性?

  • 函数即是对象怎么理解?代码即是数据怎么理解?

  • 结构化/面向对象/函数式/元编程是什么?各有什么益处和弊端?

  • 并发、垃圾回收、工程管理特性、代码规范内置在编程语言里,好还是不好?利弊如何?

  • 网上的语言特性的争论,分歧点在哪里?为什么有人说这个语言特性设计得好(或不好)?

弄清楚这些语言背后的设计思想,或许能更快地熟悉一门新编程语言。而要真正掌握一门编程语言,最好的途径莫过于自己去设计和实现一门稍微简单的编程语言或 DSL 了。


如何判断自己是否足够掌握一门语言的运用

  1. 学会使用语言的良好子集来构建程序,而不是贪多求全;
  2. 深刻理解作用域;
  3. 深刻理解变量的初始化顺序和过程;
  4. 学会使用函数来构建模块化程序;
  5. 学会识别指针和引用,用对指针传值和引用传值;
  6. 学会根据问题域构建对应的结构体或对象;
  7. 学会接口、类与对象的用法;
  8. 学会此语言的习惯地道用法;
  9. 学会和掌握此语言的代码规范;
  10. 学会将中小规模的程序划分为多个逻辑单元;
  11. 能够运用编程语言实现基本的数据结构,比链表、哈希、二叉查找树;
  12. 能够用编程语言实现一个背包问题求解(动态规划);
  13. 能够运用编程语言实现一个迷宫(回溯算法);
  14. 做一个单词解析程序;
  15. 做一个简单的管理系统;
  16. 做一个简单的爬虫程序;
  17. 学习如何写出Bug 少的程序;
  18. 学习如何写清晰的可维护性良好的程序;
  19. 学习并发编程(高阶内容);
  20. 学习网络编程(高阶内容);
  21. 学习反射和泛型(高阶内容);
  22. 学习如何对该语言项目进行编译、打包、部署和运行(高阶内容);
  23. 学会语言的编译实现,比如 汇编、字节码、 虚拟机、CPU 指令集(高阶内容);
  24. 从入门到放弃……
posted @ 2021-09-27 23:16  琴水玉  阅读(75)  评论(0编辑  收藏  举报