10年左右陆续出现了一波学编程的热潮,13年某段时间受其影响隐隐约约觉得“以后编程也跟英语一样是基本技能,再不学就来不及了”。然后稀里糊涂报了公选课“C语言程序设计”,教材同名(没错就是X强版)。教课的老师是90年代末从业于非智能手机的编程,后转行教书,根据他看法,C语言是最适合入门的,C++是“最完美”的编程语言,Python等当时新秀语言的不能碰(“太幼稚”?),Java只适合给安卓编程使用面窄。懵懵懂懂地信了,然而在hello world之后完全进展不下去了,那门课没有教师指导的上机只有念PPT,任何练习问题都无法反馈只能自行解决。于是没再去上课,因此对编程(以及整个IT)产生了很大抵触情绪。

当时我对语言非常感兴趣,听文学院的一门课并了解到一些自然语言处理的情况,老师饶有兴致地讲了一些当时热门的研究方向(比如切词parsing、文章理解等等)以及他们现学现用做研究项目的情况。在今天甚至当时的眼光看来有些选择是非常不利的,比如他们用的编程语言是C++和Visual Basic。C++对零基础小白而言入门难度很大,而且当年针对特定领域(如NLP、金融)的开发还处于起步阶段,对数据处理目的的编程不太适合。当年Python、R还没有流行起来。VB是从90年代被选用一直到2017年左右官方制定的“初级”和“业余学习”语言,比如中学教材“算法初步”部分就用的VB。“业余学VB(个别推荐Pascal),专业学C”是一个持续了20多年的模式。从文学院老师那里得来的信息没有对我涉足IT/编程产生任何积极作用。

稍后一段时间恰好有机会接触到了语音分析处理的项目,Praat这个软件能自动生成声谱图,并完成指令式的分析(软件内嵌编程,后来和其他主流语言实现了对接)让我感觉很新奇和振奋。那时候正好有一波机器人和人工智能的热点,“云(计算)”先于“大(数据)”出现在了很多网站和文章上,这引发我的想法是这些底层的编程和信息处理太基础了,很快对出现模块化和非常智能的分析软件,人们主要需要把想法编程一些形式化的命令就可以让软件实现分析,所以当时的技术很快会过时,不如等等再学。

很长时间都有一个观念就是IT相关的东西比如编程是特定技术,只有特殊需要和少数专业人员掌握,其他学科的从业者只需要会使用智能化的具体产品(比如Office软件)点点鼠标就可以满足自己领域的需要。另一个背景信息:父亲80年代读的中专,土建类专业都有C语言这门课。

这些信息综合起来作为当时的考虑基础让我觉得一方面入门难度过大且选择空间极小,另一方面长时间高度固定的知识体系很快将被新的东西取代;既抵触又犹豫,看不到前途,于是放弃。

我愿意用IT而不是计算机这个词是因为核心对象是信息,大家都是关注怎么对信息进行传播、处理、储存、分析、转化……计算机是最重要的工具,软件和硬件都是针对信息这个对象而产生的,如何选用(比如编程语言)是围绕着信息处理目的来的。在9102的今天,回首当年的情况,往者不可谏,来者犹可追。现在已经真正进入全资讯时代了,大家(智能)手机不离手比当年靠XP系统笔记本电脑每天只固定上一会儿网获取的信息多太多了,盲听盲信一面之词的机率大大减小了,更多是在信息过剩时代如何筛选、合理决策。

吃一堑长一智。

续上:

今天学到了overloading和Class Constants/Variables,意识到Java虽然没有C的pointer但与C(++)一样,对内存的管理是class/object以及整个程序设计的重中之重。这个容易理解,因为程序设计讲究可行性/可算性和效率,可行性方面根据冯诺依曼模型,用来执行计算的中央计算单元就算完成计算指令,非常底层的电路层面问题不在高级语言的考虑范围内,而内存作为信息的存储单元它和计算单元的信息交换就极度重要,因此要通过控制单元(instruction pointer)把内存充分控制起来以实现高效,能少占用就避免过多占用。

编程入门书有很多,大部分都是针对IT专业的。pointer这种底层的内容是CS/CE/EE专业必须要掌握的,然而对于把编程当作工具进行数据分析等应用任务的其他人而言,肯定不是首要考虑的内容,首要考虑的内容是计算本身,“把计算机当计算器用了”,目前有Python、R、Weka等更“高级”的语言能更直接地完成这些任务。现在已不是Fortran刚诞生的时代,硬件的性能已得到飞跃发展而且可以借助网络实现计算功能

现在各个与数字打交道的专业都有自己的统计课,经管类专业的统计专业与土建类内容不一样,但还没到大部分专业都有自己的编程课的程度。类似专业英语(English for specific purpose)也应该有专业编程(Programming for specific purpose),领域特定语言(DSL)是一个解决思路但编程语言越小众越容易带来兼容性问题。一些软件制作公司与课程开发者沆瀣一气在Coursera等平台上借专业领域编程名义推销自己的软件,这种情况反映了当前专业领域编程课程开发仍处于探索阶段。

个人对20到10年前(1999-2009)计算机类专业发展壮大的十年间的就业情况略有关注,90年代的计算机专业是非常偏重硬件的,软件工程和应用导向的培养非常少(当时美国大学也处于探索阶段),而在就业层面常常两极分化——要么是打字、按设备这种今天看来非常低端但当时是作为信息化标志的工作,要么是少数高端机构、公司的开发人员,金山、新浪、网易、搜狐这些公司都是那个时候发展起来的。不幸的是,2000年左右成型以计算机理论研究为主、应用为辅的培养体系到今天还在延续,从某强版的C语言设计独霸江湖而且编程入门公选课照搬计算机专业编程专业课内容就能看出来了。6年过去了,从其他途径获取的信息来看总体情况改观非常有限。

学校给不了的只能自己探索。

计算机专业的确本来就应该是关注计算本身。重点还是了解这个过程,然后再把它对应到现实中我们能使用的平台上。我们学编程语言其实也是围绕这个核心的需求去走吧。

想起了 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 modelExcel object modelPowerPoint 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

觉得王垠前辈在这方面还是讲的很精辟的:

所以从最广义来讲,计算就是“机械化的信息处理”。所谓机械化,你可以用手指算,可以用算盘,可以用计算器,或者计算机。这些机器里面可以有代码,也可以没有代码,全是电子线路,甚至可以是生物活动或者化学反应。不同的机器也可以有不同的计算功能,不同的速度和性能……

8 个月 后

© 2018-2025 0xFFFF