我几次分享学习计算机语言的经验,都会受到挤兑,比如:
其实我都已经分别回答过了这些迷思,不过觉得意犹未尽,所以再唠叨几句,供刚刚有小孩想学计算机的参考.
1)作为计算机专业,是不是就学一门语言就够了?
我的答案是否定的。如果找一个编程的工作,也许一门语言就够了。我九十年代进入一家银行,里面大多数都是没上过大学的程序员,只会Cobol,照样在银行工作了2、30年没问题。
但是一个年轻人主修计算机,显然是不够的。好比说,你一辈子只吃饭,也饿不死,但天底下这么多好吃的东西,为什么不去吃吃呢?再说,天底下那么多帅哥美女,如果你只交往过一个,你有可能成为情场高手吗?
不同的语言有不同的优势,不同的功能,新的语言不断的在创造出来,起码有了几千门计算机语言了。年轻人,你不希望自己被禁锢在一个语言里吧
80年代初,我在理论物理所跟郝柏林学计算机,他同时教我们C和LISP,还有用于数学推导的 Reduce语言。他说他是中国第一个懂C和Lisp的人,而且也是中国第一个懂Fortran的人,1972年经周总理批准,理论物理所进口了中国第一台小型机,他成了中国第一个在小型机上用FORTRAN编程的人,70年代他在中国推广了FORTRAN,80年代他在中国推广C,我们算是中国第一批学C的人,当时我已经有了在alpha小型机上编程Fortran的经验,我写Fortran的时候,程序是写在纸上,然后把程序给机房的小姐姐工作人员,由她打孔,然后再由机器读打孔卡片如下:
FORTRAN编程给我的感觉就是计算机编个程,太难了,经常要看小姐姐的脸色,她如果发脾气,不给你打孔,你的code就只是纸上谈兵。
而郝柏林给我们使用的Reduce语言,居然可以人机交互,给他一个多项式a^2-b^2要求因式分解,它能马上输出(a+b)(a-b). 给它一个5次方程,它马上给你给解了。太神奇了。
40年前就知道,作为年轻人,只学一门语言不行啊。想想看,一辈子只吃一道菜,睡一个人,可行吗?
2)是不是所有语言都一样?
如果所有语言都一样,为什么这么多的天才们还在创造新的语言呢?早期不同语言可以通过 link 把目标文件连起来,现在语言大部分都是产生Virtual Machine上的assembly. 所以不同语言运行的速度,安全性等等都是完全千差万别的。
3)汇编语言要不要学?
几乎没有汇编语言的工作,即使操作系统,从windows到linux, 97%以上都是用C来写的。所以学汇编语言肯定不能帮你找到工作,但是如果你想成为比其他编程员更厉害的人,你就得精通汇编语言。汇编语言也有高级汇编语言,和低级(或者说基础)汇编语言。现代语言(除了C/C++)基本上不容许Goto语句,而低级汇编语言只有Goto,没有子程序,没有for loop,没有 if else,所以要理解高级语言是如何通过低级语言来实现的。
绝大多数程序员,都会碰到一些bug后,束手无策。为什么?因为不了解底层语言,如果你懂了底层汇编语言,你就能帮他解决问题。另外,很多Code,都有安全漏洞、安全隐患,如果深入到汇编语言,你就比较容易的发现这些安全漏洞和安全隐患。
当年高校的汇编语言是非常重视的,从单板机的汇编语言,到Motorola 68000 汇编语言,到 RISC-V ASM, 到当年被瞧不起的x86, 到逐渐重视的 x64, 以前汇编语言是重中之重的必修课,现在好像很多计算机专业也就草草的浏览一下皮毛。
4)到底应该学哪些语言呢?
Java曾经如日中天,2004年之前,Java势不可挡,不仅横扫各种语言,甚至横扫所有操作系统。连微软都在搞Visual J++,而且从 VJ++1.0,直接跳到 VJ++6.0 不然就跟不上趟了。2003年圣诞节前的微软年会上,J++组粉墨登场,兴致勃勃的展示微软的JVM,完胜Sun Microsystems的JVM,计算机世界将真正进入 write once, run anywhere. 什么计算机语言,什么操作系统,都不重要了。Java将一统江湖,一统天下。 报告人没有等待到同事们的掌声,相反的是比尔盖茨上了讲台,问道:是谁给你发的工资?是Java吗?不是!而是 Windows!是Microsoft Office! 盖茨宣布,解散J++团队,下岗一半,分流一半,成立C#,搞 .NET,微软的口号是:write whatever you want, run Windows
今天的Java,已经行将就木,被批的无一是处。遥想1995年,Java因为推出Hotjava web browser 而一举大红大紫。Hotjava 是第一个动态浏览器,为了推广Java,很多java coding大赛,我当年也参加了,没得到千元大奖,但得到了厚厚Java书。Netscape受到严重威胁,不得不屈尊和Java达成协约,共同开发新的JavaScript作为浏览器客户端,再由Java,PHP,C#包装成OO给程序员用。时至今日,Java,PHP,越来越衰,C#转入游戏业,而JavaScript成了Full stack的不二选择。
所以现在学Java,不是与时俱进的选择,但无奈AP考试只考它,所以还是得学。
如果想参加USACO等等竞赛,C++是不二选择,不仅速度快,而且有强大的算法库 STL
数据的处理,你可以不必用SQL写,你可以用C,C++甚至任何一个语言写,通过产生的bytecode injection 到数据库产生 stored procedures 或者 user functions,但是这需要更高的权限,也需要一样对于数据库的理解,为什么不把SQL也学了呢。 而且SQL是NoSQL的基础,不需要Join而已,有了SQL,对写 key-value, Graph database 等等的 query,也是基本基础。
再者是functional programming language. 虽然业界用到的纯fp不多,但functional programming是完全不同的理念,图灵的state machine的理念是万物皆数,万物皆state。state可以是数,是table(SQL),是矩阵(量子力学),是各种数、array等等的组合(Object Oriented Languages), 而图灵的博士导师Alonzo Church 却认为 计算皆函数,计算机应该是 stateless machine,即没有State。只有你給它一个自变量,它给你一个返回函数值,计算机本身是干净的,没有痕迹的。很明显,functional programming有很多好处, 因为没有state, 所以没有 side effects, 不容许mutation,可以同时运行进行并行计算,debug非常简单,而且几乎没有什么隐藏的bug。
所以和汇编语言一样,学习functional programming,不是为了找相关的工作,而是写出更好的code。现在Java, Python, C#, C++,,,,等等都支持functional programming
同理,学习C语言,其目的之一是使你成为一名更好的程序员,即使不用C。所以也是值得学的,因为它帮助你理解计算机是如何运作的。
总结一下,学习计算机语言,要带着热情去学,带着探险的激情去学,而不是带着畏惧的心情去学。多多益善的学。学习各种语言的特点,特别是要注意学习各种不同类型的语言。比如在学 distributed system时,是否用Go语言去做作业,学操作系统的时候,用 Rust语言去练习,学游戏编程的时候,用一下C#,图像处理时用用Julia。。。。不仅Open your eyes开了眼界, 而且了解到很多你以为不能做,或者很难做的事情,其实其他语言易如反掌。
最后一点,尽量避免dying language, 比如 PHP,VB,LISP,甚至 Java