文/李玮
近期创事记的一篇报道建议将编程纳入高考范围。实际上,关于“编程应当从娃娃抓起”这一问题,过去几年已在欧美得到广泛讨论。不支持这一做法的人常常会提出的一个论据是:乔布斯也不会写代码,甚至没有获得过工程类学位,但他仍取得了巨大成功。
这一问题的重点在于,如果想成为乔布斯式的人物,你能否找到“自己的史蒂夫·沃兹尼亚克”?乔布斯拥有提出概念和硬件设计方面的天才,因此可以完美地与沃兹尼亚克这样的软件工程师合作开发出想要的产品。此外,尽管不是传统意义上的“骨灰级程序员”,但乔布斯的技术能力也很强,仅仅只是被沃兹尼亚克这一方面的光芒所掩盖。乔布斯只有一个。如果会编程,那么可以从事与甲骨文CEO拉里·埃里森和Facebook CEO马克·扎克伯格一样的创业活动;如果不会编程,也不具备乔布斯的才能,那么如何在科技行业立足?
不仅仅是工程专业,关于文科、理科、工程和艺术等专业的学生是否应当学习编程,大部分人的看法是肯定的。以下为主要原因:
1.学习编程有助于理解原则,同时分步骤解决问题
我们如何利用技术去解决能源、环境、城市、健康和教育等方面的问题?学习编程是一个好方式。这里以艺术专业为例。艺术专业学生通常倾向于从宏观角度来看问题。例如在城市规划中,规划人员需要思考如何在建筑、环境和交通等方面实现可持续发展,相关工作非常繁琐。在这一过程中,许多编程工具可以带来帮助,包括用于数据可视化的JavaScript框架D3。
规划人员可以收集有关多少土地可被用于城市绿地的数据,并基于D3框架进行可视化处理。实现这一目标需要完成许多后端工作,包括从哪里收集数据,如何以符合统计学原理的方式来组织数据,在可视化的过程中如何配色,如何基于公式来简化数据。与此同时,规划人员还需要兼顾可视化工作是否符合总体项目。简单来说,这一工作实际上是一个包含分析问题和解决问题在内的逻辑思维过程,而编程是思维过程的具体体现。
从更高的层次来看,在编程时规划人员所做的主要是为了获得更直观的信息,以帮助决策。程序有助于更好地“讲故事”。一个故事的要素通常包括概要、循序渐进的叙事方式以及人物。而编程语言的一系列组成部分,包括指令、if语句、变量属性及循环,可以扮演故事要素的角色。如果能更好地讲故事,那么就能更好地决策。
2.未来一个世纪,超过40%工作可被机器取代。成为机器的主人,否则就被淘汰。
社会发展速度很快。在新经济环境下,除非掌握新的计算技术,否则很难适应社会。设计大师唐·诺曼(Don Norman)曾写过《设计心理学》和《未来产品设计》两本书,其中一个主要观点是:最优秀的机器不会帮你完成一切,而是帮你更好地决策,人类应当利用这些机器使自己更聪明。那么具体方式是什么?还是编程。如果需要与这些机器互动,或是进入一个极度依赖机器(包括智能手机和计算机)的经济环境,我们需要知道如何操纵这些机器。
实际上,这些机器能完成的工作远超出科技行业的范畴。《哈佛商业评论》曾在一篇文章中指出,科技能与许多行业形成互动。文章称:“我们开发的软件可用于多个垂直行业,例如汽车、医疗以及公共服务。这些行业都有不同的需求和目标。因此在讨论多样性时,主要是指客户、工作及背景的多样性。在曼哈顿街头,你能遇到许多专业人士。将他们集合在一起,你将发现一个拥有丰富技能和经验的人才库,这是硅谷难以匹敌的。当这种专业的多样性遭遇软件工程天才时,才能推动突破性的创新。”
举一个简单的例子。在许多公司,人们都会花很多时间向Excel表格输入数据,某些时候数据源为客户文件。在这种情况下,文件中的数据往往是可分析的,例如.csv文件。如果不懂编程,那么即使是名校毕业生也需要把大量时间浪费在复制粘贴数据的操作上。而如果掌握了VB这样的简单语言,整个工作就可以自动化。无论何时获得多大的数据文件,只要运行一遍代码,所有数据就可以被导入Excel表格中。
而另一个例子是许多大学课程设置中的数值计算。大学之所以开设这样的课程是为了告诉学生,如何使用程序重复处理大批量数据。回顾在大学研究室中的生活,我们可以发现最具效率的同学往往编程能力都很强,他们可以使用Perl或VB等语言来分析文件或处理数据,并输出一个可被其他程序识别的结果。尽管这些脚本程序并不复杂,但这有助于完成许多日常工作,节约大量时间用于思考问题或从事其他方面的学习。
简而言之,如果希望脱颖而出给世界带来不同,那么编程是一项必要技能。
不过,仍有许多业内人士反对将编程作为一种通识教育。其主要理由包括:
1.编程不是目的。软件开发者的终极目标并非写代码,而是开发解决方案。强调编程是一种舍本逐末的行为。
2.编程是一类方法。强调方法而弱化问题解决将带来困扰。一方面,在解决问题时,作为方法的具体代码并不是唯一的,因此如果不考虑代码效率很难对优劣进行判断,而代码效率问题已可以被硬件的快速发展所解决。另一方面,由于解决问题的方法众多,代码的可阅读性一直是困扰程序员的一大问题。对于Perl等脚本语言的开发者,这样的问题尤为明显。此外,强调方法往往导致人们忽略对问题的深入研究,你是否能保证程序在任何情况下都真正解决了问题?
3.泛泛学习编程无助于事。一些科技公司的人士反映,尽管许多人自称从事软件开发工作,但实际上编程能力很弱,因此对团队的帮助很有限,甚至带来负面作用。此外,尽管可以通过短平快的方式了解一些语言,例如Perl,但真正运用好这些语言需要花很长时间。而达到这样的水平是无法通过短期培训或通识教育实现的。
在以上讨论中,支持编程学习的人士大多从思维训练和时代发展的角度来看待问题,而反对者通常着眼于编程本身是否有意义。毫无疑问,编程并非所有人都会每天去做的工作,但掌握这一技能也可以满足不时之需,提升工作效率。如果不考虑是否有利于眼前工作这样的短期功利性因素,那么学习编程不失为一种培育学生综合素质的好方式。
结合当下的人工智能热潮,梅宏教授认为我们正在进入一个软件定义的时代。软件定义的技术本质是把原先一体化的硬件设施打破,将基础硬件虚拟化并提供标准化的基本功能,然后通过管控软件,控制其基本功能,提供更开放、灵活、智能的管控服务。
来源:AI科技评论
梅宏,中国科学院院士,发展中国家科学院院士,中国计算机学会会士,IEEE Fellow。曾任北京大学信息科学技术学院院长,上海交通大学副校长,现任北京理工大学副校长,北京大学高可信软件技术教育部重点实验室主任。主要从事软件工程和系统软件领域的研究,在构件化软件中间件、开发方法学和工具环境等方面取得了系列成果。
梅宏教授的主题报告是《软件定义一切:挑战和机遇》。主要内容分为三部分,无处不在的软件,软件定义的时代,新时代的机遇和挑战。
他从软件从业者的视角,将计算机软件发展历程分为三个阶段,并分别总结概括了各个阶段的大体体征以及应用领域。
第一个阶段是1946—1975年,软硬一体化阶段;
第二个阶段是1975年以后,软件的产品化、产业化阶段;
第三个阶段是1995年以后,软件的网络化、服务化阶段。
结合当下的人工智能热潮,梅宏教授认为我们正在进入一个软件定义的时代。软件定义的技术本质是把原先一体化的硬件设施打破,将基础硬件虚拟化并提供标准化的基本功能,然后通过管控软件,控制其基本功能,提供更开放、灵活、智能的管控服务。
他认为软件技术是新一轮制造业革命的核心竞争力之一。智能制造业需要实现“硬件”、知识和工艺流程的软件化,进而实现软件的平台化,本质上即“软件定义”。
报告中除了回顾了软件技术的发展,梅宏教授还从操作系统的视角来理解软件定义的本质和内涵:硬件资源虚拟化、管理功能可编程。最后,梅宏教授也展望了软件定义的未来,他认为在人-机-物融合计算的场景下,万物皆可互联、一切均可编程、进而分析了软件定义的带来的机遇和挑战。
软件定义一切,人-机-物互联就是软件人的机遇。软件定义的挑战是什么?梅宏教授认为是体系结构设计决策,系统安全,系统质量以及如何更轻量的虚拟化,还有怎样打造高度自适应的软件平台。
以下是梅宏教授的会场实录。
感谢大会给的这个机会!近几年中,我在不同的场合也做了很多不同的报告,但是这几年都是被动地被拉去讲大数据,后来想想,差点把自己的主业忘了。现在软件很重要,我们每天的生活都离不开软件,可能大多数人每天早上起床的第一件事儿就是打开某个APP。所以我今年给自己订了一个小目标,但凡有机会做报告,我就只讲软件,也是为本行业的人呼吁一下,所以我今天讲的题目很大,软件定义一切。
无处不在的软件
“软件定义一切”并不是我说的,我要是这么说可能把咱们今天在座的很多同行都给得罪了。我是想借这个题目讲一讲软件的三个阶段。第一个题目我想大家都认可,软件已经无处不在,第二个题目是软件定义的时代。我们正在进入一个新的时代,刚刚过去的十九大讲是中华民族复兴的时代,我是从信息技术对人类社会的改造这个角度来谈这个新时代,不同的人从不同的角度也给了这个时代不同的赋名。
从基础设施视角来看,这是一个互联网+时代;从计算模式视角来看,这是一个云计算时代;从信息资源视角来看,这是一个大数据时代;从信息应用视角来看,这是智能化时代。我想说在这些里面有一项很重要的技术,那就是软件。某种意义上来说,我们这个时代就是一个软件定义的时代。
软件产业呈持续增长态势。从国内来看,国家工信部公布的2012年到2016年的五年数据中,软件和信息技术服务业始终保持高增长,在电子信息行业的比重也在不断上升。2008年金融危机开始以后,很多行业都在下滑,而信息技术行业还在保持增长,而软件行业的增长又是远远高于信息技术其他的比重。
从国际上来看,全球有19个国家软件支出占国内生产总值的比重超过0.5%,其中美国已经超过1%。这个产业规模一直在保持增长。第二个软件从业的人数,2014年全球ICT技术工人约为2900万人,其中专业软件开发人员约1100万人。国家工信部给出的近五年数据中,软件从业人数也在逐年增长,2016年达到576万人。但如果换一个视角,从开源社区来看,比如程序员经常去的一个软件问答网站stack overflow,注册3200万人,其中超过2500万人是多次访问。再比如CSDN,注册用户达2500万,活跃用户超过800万。
它们普遍都要比工信部公布的数据高,这说明和软件相关的从业人数有很多。
回顾过去计算机软件发展,我认为大概可以分为三个阶段。第一个是1946到1975中期,是软硬一体化阶段。第二个是1975年以后,软件产品化、产业化阶段;第三个是1995年以后,软件的网络化、服务化阶段。
我想讲一讲这三个阶段的大体特征。在软硬一体化阶段,也就是计算机刚出现的时候,是没有软件的,都是以程序实现的,大体上展现方式的是机器语言,汇编语言。早期应用领域以破解密码,军事领域的计算为主。60年代初期,开始出现“软件”一词,融合程序和文档为一体,作为独立的形态从硬件分离出来,以IBM 360系列机为代表(尽管还是和硬件捆版一起销售),也逐渐形成了计算机学科和程序员行业。它的展性形式是高级程序语言+文档,应用领域主要是商业计算和其他科学计算领域。
软件产品化、产业化阶段,以Microsoft和Oracle的出现,标志着软件开始成为一个独立产业。PC的广泛应用和软件产品化催生了人类历史上信息化的第一波浪潮,其主要特征即以单机应用为特征的数字化阶段。紧接着就出现了办公软件,彻底改变了人类传统的办公行为,微软office迄今依然是微软标志性产品之一。九十年代中期开始 ,软件进入网络化,服务化阶段。互联网推动了软件从单机向网络计算环境的延伸,带来了信息化的第二波浪潮 ,其基本特征是以联网应用为特征的网络化阶段。
做软件的人总是希望把互联网作为平台,来研究软件。软件的形式也因互联网发生变化,形态从传统的拷贝行为变为软件服务,等到后期移动互联网的产生,促成APP的诞生,整个软件模式都发生了变化。应用领域已经渗透到社会经济生活中的方方面面。
互联网环境下软件呈现新特性和新特征
我们中国学者自己定义一个词:网构软件。指的就是面向互联网计算的软件新范型。这些新范型是什么,总结有几个性质,实体的自主性,实体对环境的情景感知,实体之间的自主协同,实体的在线演化,以及可信性需求。简单来说,软件呈现网络化体系结构,基于网络进行开发,通过网络交付分发并提供服务,这就是软件的服务化。
软件和硬件相比,同样都作为功能性产品,但软件这种工具和互联网结合就能够实现一种真正的服务化。紧接着移动互联网的产生,又产生了一种新的模式,这就是APP。苹果商店拥有300万+个APP,累计下载量超过1500亿次。这个时候创造了一种新的模式,客户端要和服务器端合起来完成一件任务,他也是一种拷贝,不过是一种新的拷贝方式。互联网深刻改变了人类社会和生活模式,而互联网的核心价值是连接,软件是实现互联网核心价值的重要使能技术。硬件连接虽然很重要,但最终的灵活连接还要靠软件。
最终我引用两位名人的话,NetScape创始人Marc Andreessen说:Software eats the world! 软件吞噬世界。另一位是C++语言发明人,Bjarne Stroustrup说:人类文明运行在软件之上。
软件定义的时代
第二部分我讲的是软件定义的时代。互联网及其延伸,正在导向我们走在一个新的模式,人-机-物的融合。信息技术的网络化、泛在化、智能化趋势蕴含了人-机-物和谐发展的愿景。当前,正在兴起信息化的第三波浪潮,即以数据的深度挖掘与融合应用为特征的智慧化阶段。这个阶段我命名为智能化阶段,在这个新的环境下,人机物融合环境下的信息基础设施是海量的资源。第二来看他的应用,人机物融合环境下的新型应用:需求形态多样。面对海量资源和应用需求形态多样的这两个特征,人机物融合需要新的平台环境,如何凝练应用共性,如何有效管理资源这是这个平台的基本要求。在这样的平台之下,由于应用需求变化频繁和应用场景动态多变,这个平台能否实现按需灵活定制?
什么是软件定义?
软件定义的真正落地,还是在云计算平台里面的应用。2011年前后,OpenFlow被用于云计算平台中进行网络管理,并被广泛接受。在15年的时候,Gartner战略报告首次出现SDN(软件定义),SDN重新“定义”了传统的网络架构甚至通信产业。
软件定义网络的技术原理是通过一组API对网络设备进行任意的编程从而实现新型的网络协议、拓扑架构而不需改动网络设备本身。
计算机的操作系统是什么,是管理硬件资源、控制程序运行、改善人机界面和为应用软件提供支持的一种系统软件,即向上提供公共服务,向下管理资源。如果从操作系统视角来看软件定义,操作系统是软件定义的“计算机”,从软件研究者的视角,操作系统体现了“软件定义”之集大成。
在我的理解看来,软件定义的技术本质就是把过去的一体化硬件设施打破,基础硬件及其虚拟化提供标准化的基本功能,然后通过管控软件控制基本功能,提供更开放、灵活、智能的管控服务。
软件定义的技术本质:硬件资源虚拟化,管理功能可编程。硬件资源抽象为虚拟资源,然后用系统软件对虚拟资源管理和调度。就是在硬件资源虚拟化的基础上,用户可编写应用程序,满足访问资源的多样性的需求。大家现在可以看到软件定义出现了各种各样的延伸,软件定义的存储,软件定义的计算,软件定义的环境,软件定义的数据中心等等。但所有架构都跳不出操作系统的三层架构,就是说软件平台的三层架构,这些SDX均符合“硬件资源虚拟化”与“管理任务可编程”的技术原理。
这就是我对软件定义的理解。
软件定义带来的机遇和挑战是什么?
我们可以看到的机遇就是软件定义一切。定义一切,人-机-物互联是我们追求的目标。我们是不是最终能做到万物皆可互联,一切均可编程呢?这就是软件定义给未来世界达成的目标,也就是我们的机遇所在。我们看到软件定义的本身进一步泛化和延伸,我们要软件定义我们的物理世界,再进入我们的城市、我们的行业、我们的校园,从单一的资源管控到人、机、物融合环境下对各种资源全方位的互联互通。这是我们今后努力的方向。
人工智能是当今的热潮,但我个人的观点还是认为处于数据驱动的算法智能阶段,软件平台如何提供“通用”的智能应用支撑,并允许按需深度定制?是否会出现面对AI的操作系统?我想这个也是可以通过平台的方式去实现。软件技术在新一轮革命技术中毫无疑问是核心竞争力之一,新一轮制造革命需要实现“硬件”、知识和工艺流程的软件化,进而实现软件的平台化,本质上即“软件定义”。随着人、机、物的融合,软件定义的挑战可以分为这几个方面:体系结构设计决策,系统质量,系统安全,更轻量的虚拟化,从原有系统到软件定义系统平滑过渡,高度自适应智能软件平台。
体系结构设计决策,包括比如如何确定受管元素的合理“粒度”和“层次”?如何界定软、硬件的功能划分并组装、配置相应元素?等。
系统的质量,需要解决的问题有如何合理平衡管理灵活性和“虚拟化”后的性能损耗(与直接访问原系统相比)?如何降低“软件实现”的复杂性和故障率,有效定位故障以保障可靠性?等等。
系统安全,对硬件资源管理可编程带来开放性、灵活性的同时,也可能会带来更多的安全隐患。对于工业控制等安全攸关领域来说,可能会带来难以难以估量的损失。
更轻量的虚拟化。大量的新设备产生,虚拟化实现了对硬件资源的软化,是软件定义的基础技术,现有以虚拟机为单位的技术过于重载,难以满足性能和实时性要求。
原有系统到软件定义系统平滑过渡。如何将原有系统平滑过渡到软件定义系统?通过对已有的资源进行大幅度的改造,我们需要安装新的硬件,需要做新的软件管理系统,以及面临的人力,时间,经济,风控等因素。这个平滑过渡也需要合理的方案,否则很难做成这样的事情。
高度自适应软件平台。从软件人追求的目标来看,我们想追求一种更为高度自适应的智能软件平台。现在平台方式是以硬件资源为中心的,如果基础设施层发生变化,软件平台就要发生改变,改完之后,上面的应用也可能发生改变。我们追求的理想方式是,软件平台具有预测和管理未来硬件资源变化的能力。