序言
最近面临放假。很多同学发信息请教问题,问我想入门计算机,该学习什么程序语言比较好,应该怎么学习。
其实我在学习编程的初期也这个疑惑,之前固有的思维让我总是想找出一个最好的编程语言,于是我开始大量查阅网上帖子,反而加深了这个问题的疑惑。好像很多人都会把自己熟悉的编程语言当成最好的编程语言,并且为使用哪种程序语言争论不休。甚至还会被玩梗的误导:“PHP是世界上最好的语言”。但是实际上并不能绝对的称某某语言是最好的。于是我当时带着疑惑选择了C语言。选择的原因很简单,很多大学把C语言当成入门编程的第一门课,虽然不明原因,但是我也跟风照做了。不过现在对于我来说,任何从没见过的语言,我都是直接拿起来就用,而不需要经过学习的过程。看了这篇文章,也许你也可以和我一样做到这点。就让我们开始吧!
抽象的概念
我以为抽象(abstraction)是学习计算机科学至关重要的思维方法,它可以帮助我们进行高层面的思考,而不为细节所累。
因为计算机专科学的知识点极其繁多。想要把每一个细致的知识点全部都记住是一件非常困难的事情。而任何无法学以致用的知识都会被迅速遗忘。我们不能再像高中一样的思维模式去学习计算机科学了。林子太大了会迷路。学计算机要先长树枝后长树叶。**建立体系观念很重要。**我称其为一种自顶向下的学习方法。
关于抽象的定义,百度百科是这样说的:
抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征的过程。具体地说,抽象就是人们在实践的基础上,对于丰富的感性材料通过去粗取精、去伪存真、由此及彼、由表及里的加工制作,形成概念、判断、推理等思维形式,以反映事物的本质和规律的方法。实际上,抽象是与具体相对应的概念,具体是事物的多种属性的总和,因而抽象亦可理解为由具体事物的多种属性中舍弃了若干属性而固定了另一些属性的思维活动。
Wikipedia 的解释是:
抽象是指为了某种目的,对一个概念或一种现象包含的信息进行过滤,移除不相关的信息,只保留与某种最终目的相关的信息。例如,一个皮质的足球,我们可以过滤它的质料等信息,得到更一般性的概念,也就是球。从另外一个角度看,抽象就是简化事物,抓住事物本质的过程。
简单来说,抽象的过程就是寻找共性、归纳总结、综合分析,提炼出相关概念的过程。
所以通过自顶向下系统化学习。优点是一开始就能在心里画好知识图谱建立自己的学习路线,以后每一步学习实践都有条理,每一次投入都有点亮某个知识技能点的目标。可以快速打通在计算机科学的道路。学编程也是这样的。可能一开始比较难以理解。但是学会了后学起东西会非常迅速。
利用抽象快速理解新的编程语言
我觉得任何一种“编程语言的语法”,都是各种“语言特性”的组合。这也是一种抽象的思想。把每个编程语言的语法抽象出来。找到他们共同的地方。就不需要再费劲的去学习了。
举一些语言特性的例子:例如许多编程语言都有变量的定义。算术运算符,各种各样的循环语句例如for与while。函数定义,函数调用 。或者有自己专属特长“lambda 函数”,“类型推导”,“面向对象”,“并发编程”等等。而这些语言特性,就像你选购面包一样。面包的基本成分大都相同,但是他们有各自不同的味道。而每个人喜欢吃的东西也不太一样。但是不能说某个口味就不好吃。而是每种面包都有自己独特的风味。
程序语言也是一样的道理。对于初学者来说,其实没必要纠结到底要先学哪一种语言,再学哪一种。许多人的选择困难症犯了,纠结了好几个星期非要选个最好的,结果一个语言都还没开始学。可有这纠结的时间,其实都可以把他纠结过的语言全部掌握了。
但是这和我所说的快速学习新的编程语言有什么关系呢。但是实际上。每一种语言里面必然有一套“通用”的特性。比如变量,函数,整数和浮点数运算,等等。这些是每个通用程序语言里面都会有的,一个都不能少。你只要通过“某种你喜欢的语言”学会了这些特性,掌握这些特性的根本概念,就能随时把这些知识应用到任何其它语言。你为此投入的时间基本不会浪费。所以不需要纠结要“先学哪种语言”,这种时间花的很不值得,还不如随便挑一个语言,跳进去。
但是我是如何记住这么多语言的语法呢。其实我能记住我最常用的编程语言的语法。别的语言的语法其实也不能很好的记住。可是这个时候我也不会去看相应语言的课程教学。或者是发行的书籍,因为当我使用非常用语言进行编程的时候,通常只是因为用“某一个语言”完成“某一件事”比较方便快速。所以我不会完完全全把这个语言学透。我只会查询官方的文档,把需要用的知识大概的看一遍,了解一下基础语法,例如“变量怎么定义啦”。是“强类型语言”还是“弱类型语言”。定义函数是什么语法,有没有“权限修饰符”。输入输出等等基础语法。而这些恰恰就是编程语言的语法特性,他们的概念其实是相同的。只是语法不太一样。就像“Hello”和“你好”表达的都是同一个东西一样。所以大概花个把小时就可以上手该语言了,当然用新的编程语言中一定会遇到许许多多的问题,善于使用搜索引擎可以帮助你很好的解决问题。而不是习惯性的问别人。这也便是上文提到的自顶向下的学习方法的具体体现。
总结
重要的是学会抽象,并且学会如何抽象出编程语言中的语言特性,只有这样才能达到融会贯通,拿起任何语言几乎立即就会用。另外推荐观看课程或者书籍: “Structure and Interpretation of Computer Programs”