看完其他知友的回答,我认为他们的观点过于局限,并没有真正切中问题的要害。
我们不妨换个角度,站在更高一层来看这个问题「计算机编程入门先学什么最好?」
计算机入门最应该学的是 Linux,而非任何的编程语言。
这篇文章4600字,有点长,如果你能耐心看完,或许会给你带来更多的思考。
1. 为什么?
任何编程语言都只是一门工具,一门让人能够与计算机“交流”的工具。人学习编程最重要的是要学习解决问题的思想、方法,其次才是使用编程语言解决生活中的问题。
「计算机为什么会诞生?编程语言为什么会诞生?」,归根结底,这些事物的出现只不过是帮助人们更好地解决生活中的问题。你知道世界第一台(电子)计算机发明的原因是什么吗?第一台计算机的诞生是因为「战争」,1943年,二战后期,M 国人在研制武器过程中迫切想要解决「快速得出新武器的射程和检测模拟运算表」这个难题,随后投入建造了第一台电子计算机 ENIAC(埃尼阿克)。
三年后(1946年),ENIAC 建成并投入使用,人们在“计算”领域得到新的突破,这标志着人类文明进程进入了新的阶段,ENIAC 也是人类在电子计算上的首个里程碑,人类就此进入计算机时代。
随着计算机发展,人类对计算机的应用不满足于只将其单纯地用于计算。随着键盘、鼠标、显示屏、操作系统、计算机网络……这些东西的出现与发展,计算机也从「专用」逐渐演进到「通用」,计算机慢慢进入人们的生活。
2. 编程语言的出现
要让计算机为人类工作,必须要将人类的意图告诉计算机,我们不可能直接使用英语、汉语这些自然语言与机器沟通。人们跟 ENIAC “沟通”的方式是人们手工搬动开关和插、拔电缆。虽然计算一个运算表仍旧很费力,但是这远比之前的器械式计算机快了非常多。
人们发现计算机开关的插拔可以抽象成二进制中的“0和1”,随后人们将德国数学家莱布尼兹提出的「二进制计数法」(二进制最早起源可以追溯到中国的《易经》,感兴趣的可以去了解。)引入到计算机当中。计算机拥有了真正意义上的语言——机器语言,也可称二进制语言。
当时的工程师跟计算机交流使用的是一串串「0和1」组成的数,复杂而难学,记忆和排查问题都异常困难。随后出现了相比机器语言更抽象的汇编语言(助记符语言),有了助记符,人类能够更好地记忆与计算机交互的「指令」,汇编语言的出现进一步简化了编程过程,降低了编程难度,此时人们可以更高效地跟计算机打交道了。
但是,随着计算机架构的不同,使用的汇编指令就会有差异,人们想着能否发明一门「通用的编程语言」呢?随后,高级语言诞生了,高级语言是对汇编语言的再一次抽象,高级语言更方便人们使用,更易于记忆,更通用,人们跟计算机的“沟通”也变得更高效了。
自高级编程语言出现后,这半个多世纪里,世界上的高级编程语言已经有了上百乃至几百种。无论是什么样的高级编程语言,最终都会被编译成机器语言,以此实现人与机器的交互。
由此可见,学习编程语言只不过是让我们更好、更容易地与计算机交流,让计算机帮助我们解决现实中遇到的问题。编程语言只是一门我们与计算机沟通的语言,如同我们跟 M 国人交流,我们需要学习一门共通的语言,可以是中国人学习英语,也可以是 M 国人学习汉语。所以,我们不应该局限于学习什么样的编程语言,如果没有从根本上解决问题,那么问题永远无法被解决。
如果要学习计算机编程入门,最应该学习如何使用计算机的命令。如同图形化编程,将一个个代码块、功能模块拼接起来后可以解决某个问题、闯过某个关卡。同样我们可以使用计算机命令来控制计算机帮助我们完成某些事情,解决某个问题,计算机命令也像编程语言的发展一样,是不断对底层封装、抽象得来的,也是我们与计算机“沟通”的一种方式。
为什么应该学习 Linux 而不是学习 Dos 命令呢?这个是我从通用性和易用性出发,如果感兴趣你也可以去了解 Dos 的命令,Dos 是 Windows 电脑的通用命令。如果你不知道什么是 Linux,那么可以简单跟你科普一下,Linux 几乎构筑了当今整个互联网世界,常见的路由器、智能电器、安卓手机、自动驾驶汽车、通讯系统、操作系统、网站、各种程序应用……无一例外地、或多或少地都使用了 Linux 内核或其衍生的系统。
Linux 命令行是我们与计算机或者说操作系统沟通的一个外壳(Shell),我们将简单易懂的命令输入到 Shell,Shell 会将我们的命令传给操作系统,操作系统与计算机交互后,又会将结果返回到命令行中。Shell 在某种程度上可以看作一个翻译家,帮助我们更好地去使用计算机。使用 Linux 后,你或许会体会到:图形界面能做的,命令行也能做;命令行能做的,图形界面却无能为力。这句话虽不是绝对的正确,但却反映了命令行的精髓和巧妙之处。之前我写过一篇文章谈 GUI 和 CLI, 感兴趣可以读一读:为什么有人坚信人类不可能基于 GUI 的操作方式,发明出比「命令式编辑器」效率更高的开发环境? – 知乎
3. ShellScript 编程语言
当你学习完 Linux 命令,你会接触 Shell 编程,你会想将这些简单而又经常重复使用的命令写到一个文件里,方便下一次使用。ShellScript 脚本编程语言就是由此而来,不知不觉你已经学习了一门编程语言。ShellScript 灵活而简单,只要拥有使用命令行的基础,学习 ShellScript 就是非常简单了。
4. VimScript 编程语言
在学习写 Shell 脚本的过程中,必不可少的工具就是编辑器,通过编辑器编写代码,然后保存成文件。Linux 中可用的命令行编辑器也不少,比如 Vi、Nano、Vim、Emacs、Neovim……
我相信使用 Linux 必定会接触 Vi 编辑器,然后是 Vim 编辑器,再深一点会接触 Neovim。当你认识到 Vim 是「编辑器之神」后,你的编程观念会更近一步。你会发现,编辑器原来也拥有「属于自己的编程语言」。当你想优化 Vim 编辑器的工作流时,你会除了可以使用内置选项、别人编写好的插件外,你还可以使用 VimScript 这个专属于 Vim 编辑器的编程语言,来实现一些自定义功能、逻辑以此来实现一个更加顺手的代码编辑器。
5. Lisp 与 Elisp 编程语言
如果你接触了 Emacs 这个被程序员称为「神的编辑器」的强大编辑器,那么你一定会使用 Elisp 这门语言。因为 Elisp 是专属于 Emacs 的编程语言,相信每个入坑 Emacs 的程序员,或多或少就是想品味这个「古老的编程语言」,享受函数式编程的快感,想要使用 Org 这个强大的 Emacs 组件,我当初也是因为这些原因入坑 Emacs。Emacs 强大到无所不能,比如煮咖啡、当作视频播放器、音乐播放器、浏览器、玩游戏……Emacs 与操作系统只是一核之差。因此,许多程序员将 Emacs 戏称为「隐藏在编辑器之中的操作系统」。
Lisp 作为世界上第二古老的高级编程语言,诞生于1958年,世界第一老的高级编程语言 Fortran 只比它老一年而已。这个编程语言如同魔法一般,神奇而强大,在而后的半个多世纪里衍生出了十几种「方言」。
现在看来 Lisp 更像是一个编程语言家族,不断演进而且繁荣。Lisp 这门编程语言与人工智能(Ai)相伴相生,在上世纪60年代起,Lisp 语言就被用于人工智能编程,随后衍生出的多种方言也在某个领域深耕,比如 Emacs Lisp 就是为 Emacs 而生的 Lisp 方言。虽然现在人工智能的主力编程语言是 Python,但是丝毫不影响 Lisp 的历史地位,即便在某些领域默默退出历史舞台,但在另一些领域又再一次熠熠生辉。如果说要评选编程语言中的经典,那么 Lisp 必占一席。
所以,如果想品味 Lisp 这门具有一定魔法色彩、古老而繁荣的高级编程语言,推荐你从 Elisp 学起,从使用 Emacs 编辑器开始。当使用了一段时间后你就会慢慢喜欢上 Elisp 这门有趣的编程语言、感受一下跟现代高级编程语言有所区别或者没有的「逆波兰表达式」。
6. Lua 编程语言
如果你更喜欢「现代一点的 Vim」,那么 Neovim 一定不要错过。Neovim 从0.5版本起,官方将 Lua 这门编程语言作为 Neovim 的一等语言,提供丰富的 API 接口。虽然 Neovim 是 Vim 的一个分支,但随着 Neovim 社区不断壮大,Neovim 开始追寻更广阔的天空,既继承了 Vi 和 Vim 优秀的基因,也向着强大、易用、现代化发展。
如果做游戏开发的程序员,一定对 Lua 不陌生,这是一门简单易学、小巧灵活、易扩展的脚本语言。如果想为 Neovim 开发插件,如果想写游戏逻辑,那么你一定会接触和使用 Lua 这门编程语言的。
7. C 编程语言
当然,如果想要深入理解计算机,那么 C 语言是必学的,这是通往计算机世界的必经之路。因为目前市面上绝大多数计算机教材、经典书籍都使用 C/C++ 语言来描述,Linux 内核也是用 C 语言来写的,当你真正想去了解操作系统,了解 Linux 的编程哲学、设计哲学,那么此时就需要一定的 C 语言基础了。当然这一步,一定要放在拥有 Linux 使用经验后,否则你会学得异常吃力。
当你学成了 C 语言后,你会对许多高级编程语言的设计、原理有更深的理解,C 语言当之无愧是你打开编程世界大门的第二把钥匙。有一句话是这样讲的:一生二,二生C,C生万物。万物源于 C,对这样评价,C 语言确实是实至名归。
8. Go 编程语言
有许多编程语言一开始都是由 C 语言写出来的,随后才实现自举,不再依赖于 C 语言,比如我最喜欢的编程语言——Go。如果感兴趣也可以了解一下这门被称为“21世纪的C”的编程语言,我写有一篇文章介绍过,感兴趣可以读一读:同样是巨头的语言,为什么中国是 Go 最热的国家,而 C# 越来越少? – 知乎
9. Rust 编程语言
这是一门跟 C/C++ 比肩的现代的系统级编程语言,这一门语言几乎与 Go 在同一时期诞生。都是新时代的编程语言,它跟 Go 的定位还是不一样的。感兴趣的朋友也可以去了解一下这门语言,这门语言有可能在将来取代 C++ 这门,或许在不久地将来这门语言也会像 C++、Java 一样火气来的,只是时间的问题罢了。如果想学一门比较新的语言,Rust 兴许值得你去投资,它代表了未来的无限可能。
10. 所以
经过我这一番举例说明,你应该明白我为什么推荐你编程入门先学 Linux 了吧。编程语言迟早都会接触,基础的东西才是恒古不变的,如同九层之台起于垒土,掌握了 Linux 命令的使用,学习 ShellScript、C/C++、Java、Python、Go、Lua……众多编程语言都只是水到渠成的事情。当你使用一个 Linux 命令久了,你会思考如果使用其他编程语言要怎么实现这个功能,有了一个靶子,学习编程语言才会有的放矢。
希望这篇我写了半天的文章能给你一些启发,学习编程语言很容易,学习编程的思想才是一直探索的星辰大海。