为什么大家都在学Python?我要来唱歌反调
点击上方蓝字,关注并星标,和我一起学技术。
最近在知乎里看到一个问题挺有意思的,问题是说如何看待海淀区的妈妈们表示Python太简单了是小学生学的?
这也不是我夸大其词,我老婆家里就有人从事幼儿教育的,他们教孩子们的还真的就是Python。Python这两年也的确是火热,几乎只要是编程相关的培训班就必然会有Python的身影,往往也都会和人工智能、深度学习、大数据等高端词汇牵扯上关系。今天就和大家聊聊这个话题,帮助大家排排雷。
事先声明,我本身不是Python专家,只能勉强算是一个Python使用者,所以如果有什么错谬的地方,还请大家多多包涵。
简易但不简单
不知道大家有没有想过,Python这门语言是怎么和万金油这个词牵扯上关系的,好像Python是一门万能语言,它什么都可以做。图像处理可以做、后端开发也可以做、机器学习算法更是离不开,其他语言为什么没有变成这样,Python诞生之初就是这么设计的吗?它是如何做到的呢?
这一切都要从Python的诞生说起,Python第一版的作者叫做Guido,是个荷兰人。他最早写Python据说完全是因为圣诞节假期期间他闲着太无聊了,估计也没有女朋友,所以就想试着自己写一个新的语言。他创建这门语言的初衷只有一个,就是简易。他想要实现的就是像是类似shell脚本但是又可以实现像是C语言一样强大功能的语言。不要觉得惊讶,当时是上世纪九十年代,C语言正如日中天。
所以Python诞生之初的核心就是简易,语法简单上手容易,学习曲线比较平缓。正因为它这个特点,所以很快就打开了市场。当时第一批被Python吸引的其实都不是专业的程序员,这很好理解, 专业的程序员往往都有自己趁手的语言,一般不会突然使用一门新语言。最早使用Python的是一群高校内的学者和研究员,这些人本身没有编程的基础,但是手头大量的研究工作却离不开数据计算和分析。所以他们需要这样一门容易上手的语言来帮助他们完成这样的工作。
有了需求便有了市场,也正因此,后来越来越多的科学计算包在Python上被开发了出来。比如大家所熟知的numpy、pandas等等。后来Python火了之后,它又吸引着人们在其他领域去使用它。于是人们开发或者是移植出了更多的工具库,比如后端的flask、django框架,从C++移植来的opencv等等,Python也就变得越来越强大以及越来越万金油。
从根本上来说,Python的语言特性就是简易,语法简易,学习简易。它本身并不是针对某个问题场景而特别设计的,这一点和Go、Java等语言都不同。这样带来的问题是,Python虽然什么都能做,但未必什么都能做好。比如后端,Python虽然也有功能强大的后端框架,但由于语言本身的一些原因,它的性能和拓展性都不是非常好。所以说起后端来,大家首先想到的还是Java,而不是Python。另外Python设计之初的语法和功能非常简单,但随着它的发展,它糅杂了许许多多的高端用法,这些高端用法的使用和学习并不简单,所以它后期的学习曲线反而是比较陡峭的,典型的易学难精。
所以如果你还没有学过Python,正考虑学习它,最好先问一下自己,想学Python的目的究竟是什么?准备将它应用在什么方面?如果你只是因为兴趣那当然没有问题,但如果你是想要在某一个方向上有所发展,那么可能就需要再好好了解以及研究一下,Python在这个领域的发展情况了。
方向排坑
我们来简单列举一下目前Python比较流行的几个主要的方向,分别是算法、后端、数据分析、爬虫以及脚本工具。像是图像识别、文本处理这些方向其实都可以归纳进算法当中,我就不单独拆分了。
后端
在这些方向当中雷最大的就是后端,说起来国内外还是不少公司的后端是用Python写的,比如YouTube、instagram、国内的豆瓣等等。但Python做后端是有天然缺陷的,我其实在之前Python技术的文章当中也提到过,Python最大的问题就是GIL(global interpreter lock),也就是全局解释器锁。
众所周知Python是解释型语言,也就是说当我们执行Python的时候,其实是执行的Python解释器,由它来阅读我们的代码解释执行。既然是逐行解释执行的,那么并发就是一个很大的问题。由于一系列历史遗留问题以及种种考虑,最终Python沿用了GIL锁的设计,这就导致了同一时刻只能有一个Python解释器线程在执行。本质上来说,Python的多线程是伪多线程,因为不论我们在Python代码当中写了使用多少个线程,真正解释执行的时候,还是只有一个解释器线程在执行。
要知道现在的服务器动辄都是好几十个核心,如果最多只能有一个线程在执行,岂不是浪费了极大的资源?虽然我们也可以使用多进程或者是协程等其他的一些手段来弥补,但是还是不能从根本上解决问题,并且又会产生很多其他问题。所以Python在做后端的性能上,天然比Java以及go等语言弱了不少。一般大公司是不会使用Python作为后端的主力语言的,目前后端主流的还是Java和新兴的Go。
所以很现实的一点就是,如果想要从事Python后端方向,一个是可选择的岗位会比较少,另一个是进入大公司或者是一些比较优秀的公司的机会也会相对少一些。
爬虫
现在说起来爬虫几乎就必然会想到Python,其实爬虫对于语言本身是没有限制的,什么语言都可以用来写爬虫。只是Python写爬虫天然比较合适,因为爬虫需要有大量的网络请求,网络请求当中经常会有IO等待。Python的多线程虽然是伪多线程,但是对于这种存在大量IO等待的场景非常合适。而且现在Python爬虫相关的框架也很多,我试着用过几款,体验都还不错。
虽然如此,我还是想要劝退一下想要从事爬虫方向的学生。劝退的原因不是Python本身,而是爬虫。
前几年的时候国内对于信息安全的重视程度比较低,所以当时国内的爬虫几乎都不会遵守robot协议,管你什么能爬什么不能爬,先爬了再说。但是这几年大家也都知道了,对于信息安全的重视程度越来越高,所以爬虫的风险也就越来越大。尤其是在小公司里,老板和上层往往没有法律意识,他们也不知道获取这些信息是不是违法,然后就让程序员去做了。到时候一旦出问题,可是需要承担法律责任的,甚至要进去吃牢饭。
另外一个是现在爬虫的门槛越来越高,无论是搞爬虫的还是搞反爬虫的专家几乎都在大公司手里。因为大公司一方面需要分析竞争对手的数据,另外一方面也不希望竞争对手分析自己的数据。这就有点像是矛和盾,既要研究矛能够攻破别人的盾,又要研究盾,不能让对方的矛戳进来。
这些人才垄断了就会导致流通性降低,流通性降低就会导致贬值。无论是小公司里的想去大公司还是大公司里的想出来都不容易,职业发展也很容易到天花板。
数据分析
数据分析本身没有什么问题,Python做数据分析问题也不大。
这里唯一的一个小问题就是现在大数据平台基本上没有Python什么事,无论是hadoop家族还是spark,支持比较好的还是Java。Python虽然也可以写pyspark,但是毕竟不是原生的。pandas一般都只能用来小规模的数据分析,大数据还是不太可行。所以一般来说专业的数据分析师也都需要会一些其他的技术,比如hive、spark、flink等等,Python一般还是起到一个辅助的作用,只会Python是肯定不行的。
一点建议
首先第一个建议是不要只会Python,最好能再精通一门其他的语言。
Python的确很方便,语法写起来也很舒服,我经常用它来写各种东西,包括算法和数据结构。但是如果是工作的话,一般没有纯Python的场景,即使是机器学习岗位也是一样。我们也少不了一些数据分析、数据处理的工作,也会需要写一些脚本,甚至有的时候还需要做一点开发的活。所以只会Python肯定是不行的,我个人建议是可以考虑Python + Java,撸模型和增删改查两不误。
第二个建议是弱化语言,聚焦方向。
对于程序员来说,从事的不是语言的使用,而是某一个领域的开发。Python也好,Java也罢,它们都只是语言,语言只是最基础的工具。我们更应该着重关注的是我们这个领域内的技术或者是成长,比如后端的种种技术,其实早就脱离了Java,都是围绕着分布式系统做文章。再比如机器学习也和Python没什么关系,都是围绕模型和特征的设计。这些语言背后的东西才是真正的技术。
第三个建议是努力钻研不要浅尝辄止。
Python这门语言有一个很有意思的点是会一点语法和语法非常精通的人都能写出代码来,但是代码的质量以及可读性就千差万别了。因为很多人学习的时候只是浅尝辄止,仅仅学了一些基本的语法就上手了。这是远远不够的,Python和其他语言相比有很多自己特色的东西,比如它的面向对象的原理以及它对函数式编程的支持等等。这些相对高端的一些用法是需要仔细钻研学习的,也是真正能够体现功力的地方。
学Python本身没有问题,但如果没有想清楚自己为什么而学,只是一股脑盲目跟风的话,就有些不可取了。
好了,今天的文章就到这里,感谢大家的阅读,喜欢的话请给个三连支持一下吧~