Table of Contents:

重视语言特性,而不是语言

重视“语言特性”,而不是整个的“语言”。任何一种“语言”,都是各种“语言特性”的组合。
很多人盲目的崇拜语言设计者,只要听到有人设计(或者美其民曰“发明”)了一个语言,就热血沸腾,佩服的五体投地。他们却没有理解,其实所有的程序语言,不过是像 Dell,联想一样的“组装机”。语言特性的设计者,才是像 Intel,AMD,ARM,Qualcomm 那样核心技术的创造者。

如果你不能用一种语言里面的基本特性写出好的代码,那你换成另外一种语言也无济于事。你会写出一样差的代码。我经常看到有些人 Java 代码写得相当乱,相当糟糕,却骂 Java 不好,雄心勃勃要换用 Go 语言。这些人没有明白,是否能写出好的代码在于人,而不在于语言。如果你的心中没有清晰简单的思维模型,你用任何语言表述出来都是一堆乱麻。如果你 Java 代码写得很糟糕,那么你写 Go 语言代码也会一样糟糕,甚至更差。

很多初学者不了解,一个高明的程序员如果开始用一种新的程序语言,他往往不是去看这个语言的大部头手册或者书籍,而是先有一个需要解决的问题。手头有了问题,他可以用两分钟浏览一下这语言的手册,看看这语言大概长什么样。然后,他直接拿起一段例子代码来开始修改捣鼓,想法把这代码改成自己正想解决的问题。在这个简短的过程中,他很快的掌握了这个语言,并用它表达出心里的想法。
在这个过程中,随着需求的出现,他可能会问这样的问题:
- 这个语言的“变量定义”是什么语法,需要“声明类型”吗,还是可以用“类型推导”?
- 它的“类型”是什么语法?是否支持“泛型”?泛型的 “variance” 如何表达?
- 这个语言的“函数”是什么语法,“函数调用”是什么语法,可否使用“缺省参数”?
- ……

这些实际问题都是随着写实际的代码,解决手头的问题,自然而然带出来的,而不是一开头就抱着语言手册看得仔仔细细。因为掌握了语言特性的人都知道,自己需要的特性,在任何语言里面一定有对应的表达方式。如果没有直接的方式表达,那么一定有某种“绕过方式”。如果有直接的表达方式,那么它只是语法稍微有所不同而已。所以,他是带着问题找特性,就像查字典一样,而不是被淹没于大部头的手册里面,昏昏欲睡一个月才开始写代码。

掌握关键语言特性,忽略次要特性

这里举一些次要语言特性的例子:
- printf 的各种“格式字符”的意义
- C 语言的语句块,如果里面只有一条语句,可以不打花括号。
- Go 语言的函数参数类型如果一样可以合并在一起写,比如 func foo(s string, x, y, z int, c bool) { ... }
- JavaScript 语句可以在某些时候省略句尾的分号

语言特性

变量定义
算术运算
for 循环语句,while 循环语句
函数定义,函数调用
递归
静态类型系统
类型推导
lambda 函数
面向对象
垃圾回收
指针算术
goto 语句

静态/动态
编译、解释
运行效率
标准库、生态
并发性
安全性
包管理工具
支持的编程范式
动态编程,反射,运行时动态更改代码
错误处理

学习难度
性能
安全性
协作
特性
使用成本

工程实践出来的语言
• 智能的编译器
• 完善的文档
• 齐全的工具链
• 成熟的包管理

编程范式

语言的学习路线

语言特色

python

list comprehension

函数工具:装饰器、迭代器、生成器

c++

参考链接