计算机专业的确本来就应该是关注计算本身。重点还是了解这个过程,然后再把它对应到现实中我们能使用的平台上。我们学编程语言其实也是围绕这个核心的需求去走吧。
想起了 Web 前端领域的大牛 winter-cn 在一个付费专栏的文章里面提到了这个观点:
编程语言的一般规律:用一定的词法和语法,表达一定语义,从而操作运行时
来源地址:https://time.geekbang.org/column/article/77804
如今计算机世界相较于20年前,已经十分复杂,不是一个人就可以 Hold 住的,重点也在于掌握基本的规律,然后找到合适自己的位置去参与分工和深挖。
为了 Hold 住现实越来越多的需求,就有了分工,为了提高各自分工的效率,就有了各个层次的抽象,特定的平台,通过对更低一层的抽象,对外提供了一致而稳定的 API 方法、数据结构、特定的编程语言等等。我们通过编程语言操作 API,就类似于 winter 说的“操作运行时”。
在这方面能想到很多例子,比如说底层通过不同平台的编译器,实现同样的 C 语言程序在不同的 CPU 架构上运行。再底层可以是汇编语言封装了某些特定指令集的机器码等等。
操作系统提供了运行程序、操作资源的一致方式,比如说用 C++ 写程序,调用 Windows API 实现程序需要的各种功能。iOS 平台下用 Swift 、Android 平台用 Kotlin, Java 写应用程序。多个程序可以“同时”运行,我们可以假设各个程序独占了整台计算机,放心地编程,不用担心底层计算资源分配之类的问题。通过特定的操作接口来操作相关的,一个很明显的例子是 Unix “一切皆文件” 的思想。
应用层也很多编程方面的抽象。比如说,MS Office 把文档抽象成对象模型(比如 Word object model,Excel object model,PowerPoint object model,等等等等),把所有的操作抽象成对应的函数,提供了 Visual Basic 的环境,然后用户可以写 VB 去对它做批量操作(批量自动处理 Word,Excel 什么的);浏览器把展示的文档内容抽象为文档对象模型(Document Object Model,简称 DOM),提供 JavaScript 运行时,然后开发者就能通过写 JavaScript 代码操作 DOM 来实现对网页展示内容的控制和与用户的交互逻辑。实现了跨平台的一致性。
我觉得,程序设计最重要的,还是对目标用户需求的抽象,将现实的需求痛点抽象成软件的交互流程。这也是微软和苹果做的比较好的地方。就像《黑客与画家》说的,“人类似乎不善于处理精细的工作,所以最好还是交给计算机处理”。很多时候沉浸在某些抽象之间的技术中的我们为了技术的革新,很容易就忽略了这一点。
在计算机学习方面,最近我悟出一点:虽然抽象有很多层次,但不管工作在哪个层次的抽象,作为计算机的体系,基本的规律都差不多,所以不必为自己没有在底层入门而有什么担忧。(程序设计的过程本身,写函数, Class 也是一种抽象啊!
关于基本的规律,我想起了这篇文章:
《解谜计算机科学》
http://www.yinwang.org/blog-cn/2018/04/13/computer-science
觉得王垠前辈在这方面还是讲的很精辟的:
所以从最广义来讲,计算就是“机械化的信息处理”。所谓机械化,你可以用手指算,可以用算盘,可以用计算器,或者计算机。这些机器里面可以有代码,也可以没有代码,全是电子线路,甚至可以是生物活动或者化学反应。不同的机器也可以有不同的计算功能,不同的速度和性能……