• 过去十年,编程语言领域的重要进展


    摘要:十年来,尽管软件行业发展迅速,热门编程语言的发展似乎却成了例外,始终未有太大改变。不过事实并不尽然,编程语言的真正变化在于:为了竞争存活,前十大热门编程语言都借鉴了其他语言的功能,作为新功能引入。究竟哪几方面变化明显?

    如果把当前TIOBE编程语言排行榜的前十拿出来,与十年前的前十做以比对,就会发现这两份名单完全相同!

    唯一的不同在于:其中Visual Basic、PHP和Perl与同为十大热门却更现代的C#、Python和JavaScript交换了位置。在这十年间Objective-C确曾进入过十大热门语言,甚至还攀升到了前三的位置,不过在苹果宣布用Swift代替Objective-C之后,它便很快销声匿迹了。

    根据这些情况,我们可以得出结论:编程语言并无实质性变化,而且未来十年也不会出现什么新的大型编程语言。 

    编程语言排行榜2016年8月 TOP 20 榜单

    不过事实并不尽然,编程语言的真正变化在于:为了竞争存活,前十大热门编程语言都借鉴了其他语言的功能,作为新功能引入。由于十大热门语言的代码库都很庞大,使用者更愿意在该语言中实现变更,而不是换用新的编程语言。 编程语言内核是万变不离其宗。我个人看法是以下几个方面的变化比较明显

    工业标准

    网页标准有 W3C 控制,尤其是浏览器的开发,所有主流的浏览器都会自觉符合这个组织的标准,当然这些开发商本身就是这个组织的成员。所以新的 HTML5、 CSS3、ES6 JavaScript 的新特性得到顺利推动,让大部分主流浏览器都支持它,W3C 功不可没。

    PHP 有 PHPFIG 组织,虽然不是强制性的,但是很多新的框架和库都自觉遵守这个组织的编程标准。

    Java、C 语言都有各自的工业标准准则,来维护各自工业标准。

    工业标准其实不是强制性的,虽然很多程序员在自己工作上不遵守这些工业标准,但是要推出新的模块的话,不遵守这些工业标准的模块,是没有人会去使用的。如今,是不是面向标准编程,这是体现一个程序员是否专业、一个模块是不是专业模块的一个重要指标。

    第三方模块走红

    各种语言的框架和库,可能比自己的语言还出名,比如 CSS 的 Bootstrap、JavaScript 的 jQuery;一个好的框架和库甚至可以推动这个语言的发展,比如 PHP 的 Laravel 框架、JavaScript 的 jQuery。

    模块化的发展,大大加快了开发的速度。很多人也愿意开发各种框架和模块,不但可以锻炼自己的开发技能,也是一种展示自己的能力。

    过去,程序员要成名,要开发出有用的软件,比如求伯君开发出了 WPS,牛;张小龙开发出了 Foxmail,牛。

    现在,程序员要成名,可以开发出一个大家都会用的框架和模块。比如 Evan You 开发的 Vue.js,玉伯开发的 SeaJs。

    模块化编程和依赖管理

    2010 年前,依赖管理工具只是个很时髦的概念,大家都习惯到库的官方网站下载库后手动导入到项目中。升级也比较麻烦。所以,程序员一般是下载一两个必要的库,其他的库都自己手写完成。

    如今,依赖管理工具已经是必备的了,大家不再手动导入库了;能找到第三方模块的功能,就不再自己编写了,全部用工具导入项目;自己编写的程序代码,能模块化的代码都模块化,甚至是独立出来,网上开源,然后使用依赖管理工具进行管理导入到自己的项目中。

    框架使用

    现在一般会先选一个合适的框架,再开始编程,而不是所有功能完全靠自己从头开始编写。

    框架要先选好,模块在需要的时候慢慢加就行了。

    测试代码

    2006 年,单元测试在开发过程中,重要性不是很大,可有可无,只要程序完成,功能能用就行。

    如今的代码,如果没有单元测试部分,这个工程就不能算完结。甚至是,测试驱动开发已经成为主流,先写测试代码,然后再开发。

    测试代码的发展不仅仅是单元测试这部分。单元测试、集成测试、功能测试、性能测试、压力测试等,都在开发过程中占了重要的位置。以前测试都是由专门的测试员进行人工测试,或者由他们负责测试;如今单元测试和集成测试都是要开发者自己编写。

    跨设备,跨平台

    Java 提出的跨平台,一次编译到处运行的梦想,其实至今未很好实现。但是,如今跨设备、跨平台编程趋势是越来越明显了。

    跨设备,主要是指跨桌面和手机,尤其是针对显示器的最佳实践是层出不穷,如今响应式成为了主流。

    跨平台,出自于Java 的一个概念,如今已经普及了,桌面、手机、服务器、浏览器、嵌入式都能看到 JavaScript 的身影,这大大归功于 JavaScript 标准化的推广。跨平台过去是指一次编译到处运行,如今是指只要这个平台支持这个语言或标准,就能用。如今的跨平台编程,更讲究特性检查这个功能,如果你的平台没有这个特性,那么就关闭特性检查功能,但其他功能还可以继续使用。

    工具化

    编程语言工具化如今非常突出了,凡是工具能完成的事情,绝对不手工完成。从以下几个方面都可以找到相应工具,帮助开发者管理代码质量。

    工程化

    工程化是近年来最突出的一个发展趋势,过去只是选择性的,现在是必须的。工程化是以工具化为基础的,没有工具,那么工程化也无从谈起。工程的核心就是流程自动化,又称为构建,这些包括了:代码质量检测、代码压缩、代码合并、代码优化、代码编译、单元测试等部分。构建就是把这些部分以工作流程的方式组合起来,然后用一个命令行运行整个流程。它有点像批处理,但是是程序开发中使用的特殊批处理。

    网页编程现在又流行“实时编程”,就是当你在保存代码的时候,以上的构建流程工作完成后会自动刷新浏览器,保证新代码效果立刻反映在浏览器上。现在,在 GitHub 项目库中找软件,首先查看是否有工程文件,看看它的构建流程是什么,就知道这个项目的专业程度和项目质量了。如果没有配置一个工程化的流程系统,都不好意思说自己在做软件工程。

    自动化

    自动化是以工程化为基础的,工程化本身就是一种流程自动化,而自动化又在工程化的过程中更进一步自动化。

    持续集成是全自动化的一个终极体现,主要流程是:版本控制库—构建—测试—报告。持续集成有点像 Windows 的定时任务,但它是程序开发专用的定时任务。

    持续集成的特点就是全自动,一个项目一次配置好,要求不变的话,就不用管了;然后开发者不断把代码加入到版本控制库里就可以了,每当库有新代码时候,持续集成就会下载代码进行构建;当它完成构建和测试后,如果测试没有通过,就会返回报告,然后根据报告结果修改代码。

    所以每次往版本库添加新代码,持续集成就会全自动地帮你构建和测试代码,尽快通知代码的问题。这样,程序员就可以更加集中精力编写功能代码和测试代码,而不用担心新代码是否会影响过去的代码。

    在多人一起开发的时候,持续集成更有用,谁上传的代码没有通过测试,能马上知道。这样可以保证多人项目的代码顺利合并,体现“持续集成”的功效。

    另外还有持续部署,其实就是持续集成在测试成功后部署上产品服务器的流程。如今有些网站一天就要部署几十次,有了持续部署后,部署多少次都毫无压力。

    工具化、工程化以及自动化的关系很有意思,前者是后者的基础,而后者又极大推动了前者的发展。它们相互积极作用,相互推动了对方的发展,这形成了一个很好的良性循环。

    生态圈意识

    生态圈意识在业界是越来越强了,它应该和编程工具化和工程化有极大的关系。一门语言、框架或者库出现后,人们应用它们,不只是因为它们本身的强大,更是因为它们背后的生态圈。

    选择语言也一样。选用 JavaScript 编写爬虫,还是选 PHP 或者 Python?更多的是看它们的生态系统了,Python 的爬虫库强大且丰富,所以更多人选用 Python 编写爬虫。

    一门新的语言是否成熟,看的就是它的生态圈,比如是否有测试框架、 MVC 框架,是否有成熟的时间库、数据库 SDK 等,这些都是其必要的生态圈组成部分。

    Web API 的全面发展

    Web API 虽然历史悠久,但是真正使其推广流行的应该是 Twitter,而后移动设备的普及使其得到更大发展和普及。移动设备如果没有 Web API 基本就不能工作。Web API 的普及,也使得网络服务之间相互连通,形成一个更大的服务网络。总之,如今的 Web API 已经是不可或缺的存在了。

    Web API 更多是一种服务,或是一种数据交换模式。只要语言带有 HTTP 的网络访问功能,就都能使用。提供 Web API 的公司,发布 Web API 后,一般也会同时发布一些常用语言的 SDK,方便语言开发人员快速上手;但是如果语言比较小众,没有提供相应的 SDK 也没有关系,编写一段 HTTP 的请求,也可以交换数据。

    正是以上这些原因,可以说在编程界里,使用 JSON 作为数据交换语言是大势所趋了。

    总结

    以上所列的现象和趋势,其实都是相辅相成的,最终行成了一种良性循环。这些现象和趋势都会继续发展下去,并成为以后新趋势的基础。这些特点非常重要,应该成为每个程序员都应该知道的知识。

  • 相关阅读:
    关押罪犯
    文化之旅
    [USACO11OPEN]玉米田迷宫Corn Maze
    排队布局
    最短路计数
    【模板】单源最短路径(标准版)
    最短路径问题
    无向图最小环
    localStorage的使用
    移动端如何引入日期插件
  • 原文地址:https://www.cnblogs.com/z12568/p/10986758.html
Copyright © 2020-2023  润新知