胶水语言的背后


调包侠

调包侠」是使用其他编程语言的程序员对Python程序员的一种称呼,带用一丝嘲讽的意味。为什么呢?Python这门语言发展了20多年,积累了大量的框架,包,库,模块,总共多达十几万个。让Python程序员很轻松就能写出程序,不用知道背后的原理。故称Python程序员为调包侠,Python也被称作胶水语言

我感觉Python就像赫胥黎做过的一个比喻(赫胥黎之桶):

地球上生命的增加,就像往一个大桶中放苹果,苹果满了,但桶还有空隙,还可以往里加石子,石子在苹果中间,不会使苹果溢出来,石子加满了,还可以加细沙,最后还要加几仑水。

既然有了桶,就可以往里填入各式各样的东西。

先举个用Python调包的例子吧

假设现在要写一个程序:打开电脑默认浏览器然后访问指定的网址。

下面是Java版的程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.awt.Desktop;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
 

public class BrowserUrl {
    public void browserUrl(String url){
 
        if (Desktop.isDesktopSupported()){
            try {
                URI uri = new URI(url);
                Desktop desktop = Desktop.getDesktop(); //创建desktop对象
                //调用默认浏览器打开指定URL
                desktop.browse(uri);
 
            } catch (URISyntaxException e) {
                e.printStackTrace();
 
            } catch (IOException e) {
                //如果没有默认浏览器时,将引发下列异常
                e.printStackTrace();
            }
 
        }
    }

   
BrowserUrl browserUrl = new BrowserUrl();
browserUrl.browserUrl(网址);

下面是Python版的程序

1
2
3
import webbrowser

webbrowser.open(网址)

Python通过调用标准库webbrowser来写程序只用了两行代码

写这段Python代码的人可能根本不知道HTTP协议和其他网络知识,但也能实现想要的功能,这就显得不够专业,容易让人瞧不起。从Python这几年的崛起可以看出,人们似乎挺喜欢Python这种调包的方式,那Python胶水语言这种设计背后的原理是什么呢,我尝试用控制论的原理解释一下。

智力放大

首先我们谈谈什么是「智力放大」

人们早已熟悉人的体力放大,就是用机器替代人力。那什么是智力放大呢?控制论把智力在某种程度上一个人或者一个组织在单位时间进行正确选择的能力。所谓智力放大,就是一个选择能力的放大问题。

举个历史上的例子:

汉高祖刘邦本人并不是一位很杰出的军事家,他直接指挥的战役经常失利,韩信说他最多只能指挥10万人马。但刘邦最后能打败项羽,建立汉王朝,完成统一中国的大业。为什么呢?从军事才能上看,刘邦确实不如项羽。但项羽采取了孤家寡人的政策,不善于用人,他的智力再强,得不到放大,毕竟是有限的。刘邦尽管没有很强大的军事指挥和管理国家的才能,但他善于用人,他选择了张良,韩信,萧何这样一批人才,通过他们打天下,这样他的智力就大大地增强了。历史上所有有组织才能的大政治家都是善于用人,放大自己选择能力的人。

再过来看Python程序员的「调包」过程,不正像是智力放大的过程吗?向前面写的那个打开浏览器访问指定网站的程序,Python程序员可能不知道背后的HTTP协议和浏览器知识,但是能通过调用别人写好的库来实现功能,Python程序员的智力被放大了。

这让我想到了Paul Graham在他那本《黑客与画家》里面的一段话:

一百年后的程序员最需要的编程语言就是可以让你毫不费力地写出程序第一版的编程语言,哪怕它的效率低下的惊人

这并不是说Python程序员就不应该学习底层的基础知识了,恰恰相反,底层知识十分重要。不把底层知识(数据结构,算法,网络协议等等)打通,核心问题就还没有解决。就好像做一个手机,芯片还不能自己制造,那就只是解决了外围问题,只是做组装的小公司。能做芯片了,这就厉害了!此时就可以跟最厉害的公司叫板了,比如微软,谷歌