先想象这样一个画面,60年后,如今最热的编程语言Python会是怎样一幅景象?
被彻底淘汰?届时今天这批Python熟练工已经彻底退休,那么目前被Python编写的这些基础设施靠谁维护呢?
疫情期间,一门上古编程语言COBOL就面临这样的“复活”问题。疫情导致美国申请失业救济人数激增,各州政府服务器面临崩溃,其中不少州的主机系统是基于COBOL建立起来的,而在过去几年甚至几十年的时间里,这些系统都没有更新过。
4月4日,新泽西州州长Phil Murphy在新闻发布会上明确表示急需COBOL程序员。
从四月初美国新泽西州都开始重聘COBOL人才,大批程序员开始重新学习COBOL,相关学习课程登顶GitHub热榜,这门寿命超过60年的上古语言忽然重回大众视线。
时隔一个月,作为一门“过时”的语言,COBOL的热度虽然逐渐散去,但是正如网友指出,和所有的编程语言一样,COBOL现在有两条路可选,要么被优化,要么接受被逐渐取代的命运。
当一门语言站在这样的分叉口,如何权衡抉择下的个中利弊?COBOL的现在是否也是其他语言终究会面临的未来?
怀着这样的关切,文摘菌特意联系到了登顶GitHub的COBOL学习项目的开发者之一John Mertic,并跟他聊了聊这个问题。
John Mertic目前是Linux基金会项目管理主任,从2015年加入Linux基金会开始,他就一直致力于发掘优秀的编程人才,其中就包括COBOL。这次他联合多位社区开发者共同编写了COBOL学习课程,目前这门课程已经指导了一大批自学成才的年轻程序员,对解决美国COBOL系统问题起到了相当大的推动作用。
站在专业COBOL程序员的角度,John指出,对于COBOL人才来说,他们始终充满了活力和竞争力,公众对他们的关注永远不会显得太迟,同样,对于企业,能够确保人才与业务直接相连将是确保业务持续发展的关键。
谈到COBOL语言本身,John也表现得相当乐观,在他看来,一门语言一旦出现,其生命力就会一直绵延下去,更何况,如今人们对编程热情不减,这也是十分重要的前提和基础。
成为一名COBOL程序员到底意味着什么?
COBOL重新火起来之前,在不少人眼中,COBOL程序员可以说是“高大上”的代名词了,因为他们出没的往往是银行、保险公司,但从事相关行业的COBOL程序员表示,事实上他们只能在这些领域进行选择。
比如知乎网友@睿波斯分享了他作为COBOL程序员的工作经验:
从事cobol对日外包一年。
说点我知道的,零基础培训两个月就可以跟着老pg做些常规的项目了,工作内容不是很难,繁琐的是不同的se对提交的工作的形式(包括程序的编写习惯,文档的内容详细程度),会让你有种“我的工作很多时候不是编程,而是在满足不同的se的一些不必要的要求”(当然,一些比较厉害的se不算,他们对整个项目有清晰的认识,因此知道殊途同归这个道理)。
工作时间,号称“弹性工作制”,比较自由,福利待遇一般,初期还好,在同学中属于中等偏上的,后期的话,涨幅比较固定,知道自己最坏、最好能混成啥样——坏不到哪去,也好不到哪去。可能跟地域和公司区别吧。
说点自己的感受,波澜不惊,整个公司的气氛是懒洋洋的,大家开玩笑说“适合养老”。当然也有的组干劲十足,忙忙碌碌。可是工资差不多,这也就有了基层pg的不定期调动,组里扛把子的基本不动。想要变成扛把子的,也不是很难,得用心,简单粗暴的说——根正(所谓的期生),有点能力(当然越多越好),还有时间。
https://www.zhihu.com/question/19747089/answer/57567186
如今COBOL程序员以肉眼可见的速度在减少,COBOL学习资料基本靠企业内部分发,系统本身也逐渐落后于时代。大多数银行也曾萌生过换掉COBOL系统的想法,但在业务支持方面,COBOL的表现还是要远胜于JAVA、C或者C++。
对于COBOL忧喜参半的现状,John Mertic表现得相当乐观,他说道,不管是哪一门编程语言,COBOL也好,Java也好,还是Ruby、PHP,精通编程语言的顶尖人才一直都是行业里的香饽饽,这是恒定不变的。
事实上,许多基于COBOL构建的系统也都处于任务关键或重要的生产部署中,拥有支持和发展这些系统的人才也十分关键,因此,任何能够有助于确保人才与需求直接相连的事都会是一件好事。
John表示,现在大家对COBOL的关注是一时的,在媒体报道影响下,不少公司习惯性地认为“难以找到COBOL人才”,但其实一直以来,“招聘COBOL程序员”相关话题在社区内一直很受关注,不少公司也始终在招聘COBOL人才。
当然,这和COBOL本身的优点是分不开的,除了业务支持外,系统的简洁性、代码的可读性、可靠性,以及处理大量数据的能力,这些都使COBOL得以在商业环境中脱颖而出。
John表示,与最近学习过COBOL的人或教授COBOL的人交谈后发现,前两点往往会让学习者认为学习COBOL是一个很快很容易掌握的过程。
他指出,COBOL肯定是令人生畏的(daunting),它的简单性和可读性使得学习曲线可以很短,这正是他们推出COBOL编程课程项目的原因和优势所在,也正是因为较短的学习曲线,疫情时代的在线学习可以获得更大的成功。
截止到目前,John团队发布的COBOL在线学习项目在GitHub上的标星已经有了1.4k。
GitHub链接:
https://github.com/openmainframeproject/cobol-programming-course
同时,在medium上,一位叫Jeremy Morgan的博主分享了参加COBOL课程后的心得,在博文中他更是明确地指出,COBOL的不足在于知道它的人太少,并非语言本身的结构问题。
Jeremy也在文章中写道,深入学习后才知道,COBOL之所以名声不佳,很大程度是由于年代问题和“千年虫”(Y2K)问题,虽然COBOL也存在缺点,但也无法否认其稳定性,也没有人能够质疑它运行数十年的系统持久性。
文章中,Jeremy还总结了COBOL与其他现代语言的7大不同之处:
大型机。想认真开发COBOL,大型机是不可少的,网上虽然能找到一些模拟器,比如GnuCOBOL,但真实数据存在于大型机上,需要访问才能进行真正的COBOL开发;
程序可读性。任何东西都具备可读性,代码用大写字母表达,因此很醒目,申明被称为“语句”,以句号进行标记,而句号很小,很难找到忘记添加的位置;
严格的语法。COBOL以严格的语法著称,每一行的开始和结尾的空格,以及每个空格和字符都很重要,这需要程序员们训练出锐利的眼神;
强制约束。COBOL存在现代语言中不存在的空间约束,并追求向后兼容,COBOL的代码每一行始终是80个字符的,报表宽度是132个字符,因为它基于打孔卡和老式打孔打印机;
内在的资源节约性。可以看到设计师如何围绕节约资源来设计语言,内存、硬盘空间和CPU周期稀缺,所以要明智地进行使用,现代开发人员很容易忘记这点;
必须做到明确。在COBOL中没有太多“松散的”编程,这也是不被允许的,每件事情都要有意义,看似很无情,但也是个好事;
作业。COBOL是围绕“作业”展开建模的,这些程序不像许多应用程序那样进行实时交互,而是被设计来定时执行,并且代码是从上到下依次运行,这意味着先读入数据,然后处理数据,最后吐出结果。
应该改善它?还是丢弃它?
既然COBOL与现代语言的差异如此明显,那么它又是如何在语言“野蛮生长”的年代仍保持着如此顽强的生命力呢?
对此,Jeremy表示,大概是因为COBOL的表现一直很优秀吧。虽然人们喜欢拿COBOL开玩笑,但别忘了,COBOL可是一门追求可靠性的语言,当你给它投喂大量的数据,它也会很高兴,毕竟COBOL经历了处理百万数据记录的年代。
COBOL如今主要应用于金融和政府机构并不是没有道理的,因为这些机构有时间和金钱成本去构建COBOL系统,随着系统不断发展壮大,就能支持其在数十年后依然保持有效运转,就像我们现在看到的一样。可以说,在性能和向后兼容性上,COBOL要领先其他语言太多。
因此,对于COBOL,如果它本身没有问题,千万不要动手修理,因为COBOL最大的弱点在于知道它的人为数甚少,而不是语言本身的结构问题。
一门语言是否终将被时代淘汰,John认为,“一种语言一旦出现,它的生命就会无限期地延续下去”。
近年来,公众对于编程越来越有兴趣,这在很大程度上是基于人才的可用性、系统的易用性以及编程语言解决影响开发者和企业面临的问题的能力和易用性。
如果我们考虑直接丢弃COBOL,转而设计一门全新的语言,那么除了理解如何分析词法外,最大的挑战在于确定这门语言要解决什么问题,以及如何设计出最好的结构和语法,这和设计应用程序或产品是一个道理。
但万事都不是绝对的,这一切还得要取决于现有语言生态系统的过渡难度。
John认为PHP在这方面做得很好,它成功地解决了很多问题,同时也保持了向后兼容和简洁性,但是一旦当某一环节出现问题,或者说其与语言设计原则相悖时,新的语言就会出现,这时的挑战就是从基础建立全新的语言生态系统。
COBOL是如何工作的?
说了这么多,如果对COBOL的工作原理没有足够的了解,似乎也只是“纸上谈兵”。接下来,我们就来看看在参加COBOL课程后,Jeremy眼中的COBOL是怎样的。
即使作为一名资深程序员,当开始深入研究COBOL时,也会听到许多不熟悉的术语和缩写,但这种情况是非技术人员在尝试理解新技术时也一定会遇到的。
对此Jeremy感叹道,“这令人大开眼界,竟然存在一个如此广阔的COBOL世界”。
在他看来,COBOL程序是一种文本,它分为四个主要部分:
标识部:提供标识信息,比如程序员姓名和编译日期,现在在注释和包文件中看到类似的东西;
环境部:它会告诉我们程序构建在什么样的系统上、使用什么样的编译器,以及其他相关信息,它不是声明性的,但能够给程序员提供构建它的运行环境的总体思路;
数据部:用于定义文件域,什么类型数据能够输入?如何定义?可以是内部域(诸如累加器、标志和计数器),也可以是外部域(诸如传递给程序的参数);
过程部:控制程序的运行,示例、方法、计算等等程序的核心要素都在这里,这是COBOL程序中最大的部分。
这样的语言架构非常好,在几乎所有的现代语言中都能看到它的影子:输入文本,然后被计算机编译成可用执行的文本。
在使用上,COBOL能够读取文件、处理数据,生成报表或是存储新的数据。因此COBOL主要适合的地方就在于处理大规模的交易数据,可以试想一下500万笔交易的数据量处理。因此,COBOL能在金融和管理领域“开花结果”也就不足为怪了。
调查显示,全球共有23,943家公司至今仍在使用COBOL,Jeremy也透露道,他工作过的公司有一半以上多多少少也都在某个地方用到过COBOL,可以说,COBOL无处不在,每天都在静静地处理日常交易。
对于这样一门默默无闻的语言,它的现状已经足以引起我们的担忧,而COBOL的未来又该走向何处?
或许,我们正在见证历史。