博主呓语:

无处不在的Python

Posted by 破冰 on 2017-12-27 17:10 Wednesday

文/佟达

ThoughtWorks 高级咨询师,深度学习研究小组技术负责人。专注于深度学习与智能系统的设计和研发,对人工智能、深度学习、大数据架构、云计算、DevOps 等有深入研究。

1991 年 2 月 20 号,后来被称为“仁慈的独裁者”的 Guido van Rossum 首次发布 Python,当时这还只是作为一个名为 Amoeba 的操作系统项目中的辅助工具,Python 甚至没有被正式立项。没有人会想到,Amoeba 项目在 1996 年就停止开发,而 Python 却在 20 多年后发展成为最流行的编程语言之一。

(图片来自:http://t.cn/RHGUMx6)

Guido van Rossum 设计 Python 的初衷,是希望用它来简化系统管理工具的开发,这个目标确实达到了,大部分 Linux 操作系统以及 macOS 都内置 Python,更不用说还有 Fabric,Ansible, Saltstack 这些基于 Python 系统的管理工具。然而,只把主业做好,从来不是 Python 的唯一目标。世界这么大,Python 要去看看。

不务正业的 Python

当 Python 不再仅仅作为系统管理工具,迈出跨界的第一步时,就再也停不下来,从 Web 开发到科学计算,从 3D 建模到人工智能,从嵌入式开发到云计算和大数据,几乎每一个角落,都能看到 Python 的身影。

系统管理工具

Python 从一开始就是为了提高系统管理效率而开发的。内置的os模块可以在兼容大部分主流操作系统的情况下,提供基本一致的操作方式,系统管理员的脚本只需要写一次,就可以运行在不同的操作系统上。借助 Python 简洁高效的语法,Python 在复杂系统管理任务上的开发效率要远远高于 Shell,同时执行效率也是远高于需要不停进程切换的 Shell。为了可以使用常用的 Linux 命令行工具,David Beazley 用 Python 在几天之内在 Windows 上开发了一套 Linux 常用的工具集。

对于复杂的系统管理工作,目前流行的配置管理工具,如 Fabric,Ansible,Saltstack 等,可以让运维人员使用几行命令,让成百上千台服务器俯首帖耳。随着 DevOps 运动的发展,“基础设施即代码”的理念越来越深入人心,借助于 molecule 或者 testinfra 这样的工具,开发者可以像运行单元测试一样,对基础设施的配置进行测试。

Web 开发

全世界第一个网站在 1989 年上线,而万维网(World Wide Web)在 1994 年被发明出来。可以说,Python 是和互联网一起长大的。作为动态语言,并且具有更高的抽象层次的 Python 和 Perl,很快就被开发者们发现更适合用于开发网站,并在早期互联网的兴起过程中发挥重要作用。

随着互联网的发展,很多以互联网为生的编程语言被发明出来,比如 Java,PHP,Ruby 等,逐渐超越了 Python 和 Perl 这些前辈。不过 Python 在 Web 开发领域仍然占有一席之地。比如著名的一站式 Web 框架 Django,轻巧的 Flask,高并发性能的 Tornado 等。一些著名的网站,也是在 Python 技术的支持下运行着,比如 Youtube、Reddit、Pinterest、Dropbox、豆瓣等。

科学计算

在 Web 技术大行其道,Java、PHP 等编程语言来势汹汹之时,Python 的注意力却没有完全放在 Web 上面,随随便便的就把先发优势给放弃,转而搞科学计算去了。

Python 在设计之初的一个理念是,尽可能的用英语或者高中代数中约定的表达方式来编程,所以尽管一开始的应用场景并没有考虑科学计算,但学术界却盯上了 Python。1995 年,一个研究如何让 Python 支持高效矩阵运算的小组成立,Python 的创始人——Guido van Rossum 也在这个小组之中,为了让 Python 能够更好地支持矩阵操作,还专门设计和修改了一些 Python 语法。就在这一年,Numeric 数值计算库发布,在 2006 年,Numeric 正式改名叫做 NumPy。

进入新世纪,围绕 NumPy,更多科学计算相关的工具包被开发出来,比如用于科学计算的 SciPy,用于符号计算的 SymPy,用于数据分析的 Pandas,用于数据可视化的 Matplotlib,以及可以实时画图的交互式开发环境 IPython Notebook 等。在 Matlab 等专业软件主导整个科学计算领域多年之后,Python 用近 10 年的时间,在学术界赢得了一席之地。而当其他通用编程语言在 Web 浪潮中厮杀结束,回头也想要到科学计算中抢一块领地时,却发现事情已经变得比当年要难得多了。

云计算

在后互联网时代,云计算和大数据是被提起最多的两个概念。互联网的普及,带来了信息生产和交换成本的大幅降低,也因此导致了信息大爆炸。为了进一步降低成本,并释放数据的价值,云计算和大数据技术应运而生。

提到云计算,不得不提的就是 OpenStack,目前已经成为了事实上的开源私有云平台标准。OpenStack 选择 Python 作为主要开发语言,其最主要的原因,是 Python 作为胶水语言,可以和操作系统很好的交互,同时集成其他语言编写的工具库也很容易,而且 Python 自身的生态足够健壮,像分布式任务管理,Web 开发等都能够很好的支撑。出于同样的原因,目前市场份额最大的公有云平台 AWS 在发布之初就提供 Python SDK 支持。

大数据

大数据技术的兴起,让很多新技术有了露脸的机会。比如 Scala、R、Julia 这些语言,曾经都是小众语言,但因为他们在大数据方面的优势,吸引了大量的开发者。除了这些小众语言之外,Java 和 Python 算是在传统强势编程语言中没有掉队的两个。

Python 的不掉队,要得益于其在科学计算领域的积累,比如 Pandas 和 SciPy,这些曾经用在学术界的工具,在大数据处理中同样变得重要。因此,像 Spark, H2O 这样的大数据处理工具,核心部分并不是 Python 编写,但为了满足工具使用者的需求,都花了巨大精力来开发 Python 接口。除此之外,完全基于 Python 的工具,虽然不多,但还是存在,比如 Airbnb 开发的数据可视化工具 superset 和任务编排工具 airflow。

仿真模拟

在程序员圈子里一提到 Python,第一反应就是“上手简单”。正是由于简单,每个人都会写一点,就算不会写,也可以看懂,因此大家并不以会 Python 为多么骄傲的事情。相比 Python,程序员们更愿意炫耀自己擅长 Clojure 或者 Haskell 这样相对复杂的编程语言。

不过简单也有简单的好。正是由于上手简单,让 Python 成为各种仿真模拟软件首选的脚本语言。比如大名鼎鼎的图片处理工具 GIMP,3D 模型制作工具 3ds Max,Blender,电影特效工具 Houdini, Maya,电影后期合成工具 Nuke 等等,都以 Python 作为脚本。

人工智能

自从 AlphaGo 战胜李世乭开始,人工智能就火得一塌糊涂。然而,人工智能并不是什么新概念,其历史已经超过了半个世纪。在人工智能领域过去这几十年的发展中,传统的主流编程语言明明是 Lisp,而后起之秀也是像 Prolog 这样的语言。但是当这一波人工智能真正开始流行起来时,人们发现,那些流行的框架和工具,要么是用 Python 写的,比如 Theano,要么是 C++ 写的,但是 Python 作为接口语言,比如 TensorFlow,Caffe,MxNet 等。仅有的非 Python 框架 Torch,在 2017 年也抵不住压力,开发了 PyTorch。

其他

在算法交易和量化投资领域,Python 是最佳选择之一。

在嵌入式领域,广受欢迎的程序员玩具树莓派,选择 Python 作为主要编程接口。

在软件开发管理中,构建工具 Scons 和事务追踪工具 Trac 虽然不算特别流行,但也处于活跃的状态。

尽管 Python 的主要应用场景都在命令行,但不代表其不能做桌面软件开发,借助于 PyQt 和 Kivy 这些图形库,Python 也可以开发出漂亮的桌面软件。

借用一句流行语:Python 这么厉害,咋不上天呢?

事实上,NASA 确实在使用 Python 来开发软件,主要是用于系统集成和卫星、火箭等的测试自动化方面。

软件开发的万金油

看似 Python 没有在哪个领域成为最好的编程语言,但是 Python 在各个领域都数得上号。从最初的系统管理到互联网时代,云计算和大数据时代,再到现在的人工智能时代,只有“不务正业”的 Python,在每一波浪潮之中都在。

在领域细分的时代,像 Python 这样的通而不专的语言在每一个领域之内收到的重视都不如领域中的主要语言。然而时代在变,数字化浪潮伴随着人工智能与物联网的东风,汹涌而来,企业为了能够快速应对,不得不做出改变。

业务没有线上与线下之分,只有已经数字化和即将数字化之分。

为了跟上需求的变化,原本的“分析-设计-开发-集成-测试-上线”这个瀑布式开发流程被不断压缩。在敏捷软件开发运动的推动下,首先是开发和测试的界限不再明确;后来 DevOps 运动兴起,开发与运维之间的墙被打破;实时大数据架构和数据驱动业务的出现,让曾经原本相对独立的数据团队,也要更紧密的参与到业务开发中。

当所有的角色都在同一个团队中,为了一个业务目标而写代码的时候,用同样的语言进行交流就变得异常重要。这时候,不掉队的 Python,优势就显现出来了。“不务正业”的 Python 曾在不同的领域中都占有一席之地,这让分属于不同的部门、不同角色的团队成员有机会使用 Python 来统一工作语言。不论是开发、测试、运维,还是数据科学家,Python 都是一个虽然不是最好、但还不错的选择。

低成本试错的最佳选择

曾经,编程本身就是一项业务;现在,编程只是一个用来实现想法的工具。当年可以因为一个新概念,炒出很多新语言,比如面向对象技术的出现,并没有给企业的业务带来什么巨大创新,但却掀起了一波技术浪潮;而现在,一项新技术被提出来,企业首先要考虑能够在业务上带来什么收益。

像人工智能这样的新概念(或者说是老概念新提法),对于企业来说,本身的门槛相对较高,业务收益尚不明朗,如果要投入大量的人力和资金去学习全新的技术,对企业来说,风险是非常大的。然而为了创新,企业不能故步自封。尤其是作为追赶者或者初创企业,在互联网赢家通吃的规则下,创新甚至和企业的生死息息相关。因此,低成本试错是企业成功的关键。

利用开源软件或云服务,避免重新创造轮子,对于企业降低试错成本是非常有效果的。因为 Python 语言本身非常适合作为服务集成的“胶水”语言,所以很多开源软件和云服务都选择 Python 作为接口语言(比如 Spark、TensorFlow、AWS 等)。如果企业希望利用这些技术进行创新试验,Python 是一个非常好的选择。

Python 之后是谁?

Python 的流行,并不是从一开始就设计好的剧本。只是在特定的时间,对于编程语言有特定的需求,而刚好 Python 满足这样的需求。Python 作为一门编程语言,并不比其他编程语言更优秀。

技术没有最好,只有最合适。

如果要预测未来什么编程语言更流行,就必须要知道未来对于编程语言有什么样的需求。当前对于编程语言的需求是能够让不同角色使用,并且可以集成或者重用已有技术或服务,而 Python 上手快,可读性高,和其他语言的互通性好,刚好能够满足这样的需求。

如果未来某一天,对于程序执行速度的关注,超过了其他需求,也许C语言或者 Go 语言,会成为更流行的语言;如果是对于编程语言的抽象能力有更高要求,也许 Elixir、Scala 或者 Clojure 会更加流行;如果是对程序员数量的需求更高,就需要降低入门难度,也许 Java 还会再次流行;再或者,未来对于编程的需求,对于目前所有编程语言来说,都没办法满足,就会有新的编程语言出现。所以,未来的编程会走向何方,要看企业对于编程提出什么样的需求。

结束语

也许 Python 还有很多缺陷,在每一个方面都不是特别出色,但是它可以串联所有的关键技术,降低引入新技术的成本,可以让团队的成员具有共同语言,企业何乐而不为呢?

纯粹的编程已经不再,玩跨界,Python 可以,你可以么?


更多精彩洞见,请关注微信公众号:思特沃克

标签:

发表评论: