Violaine
“人生苦短,我用Python”,这句话是什么时候,在编码的同胞中流行开来?我自己,则是上了一段网课,才知道有这个说法。这是Python编程语言最基础的变量课上讲到的一个例句,至于最初出自谁人之口,颇有争议。有人说是Python的原创者,有人说是编程界大牛布鲁斯·埃克尔(Bruce Eckel,他是MindView公司总裁,C++标准委员会具有表决权的成员之一)。此语原文为:“Life is short,we need Python.”也许只有经历C语言、Java语言等编程语言历练的程序员才能对此有真正理解。
Python语言的创造者是大名鼎鼎的计算机工程师吉多·范罗苏姆(Guide van Rossum)。此人一九五六年出生于荷兰,一九八二年在阿姆斯特丹大学获得数学和计算机硕士学位,之后在荷兰和美国的多个研究机构工作。他尽管也是一位数学家,却更愿意享受计算机带来的乐趣,他所从事的职业都与计算机相关。一九八九年圣诞节,吉多为了打发假期的无聊,决心开发一个新的脚本解释程序,作为ABC语言的一种继承。之所以选择Python(英语“大蟒蛇”的意思)作为这套编程语言的名称,说来有点搞笑,只因为他是一个名为Monty Python的喜剧团体的粉丝。
自计算机问世以来,有过不少编程语言,为什么这个Python现在成了当红炸仔鸡,而且越来越火?简单说,就是它的语法逻辑简单,省心省力,容易上手。一个最直观的例子就是,网上挂出许多编程语言创始大佬的头像,别人脑门上都已稀稀拉拉,就数吉多·范罗苏姆头发最茂盛。再举个例子,假如要完成某个功能,用Java语言需要一百行代码才能完成的活儿,用Python可能只需要二十行左右就能搞定,这是Python最具吸引力的特点。对于不想随时挪窝的懒鬼来说,它极强的开放性兼容性很招人喜爱,几乎所有的平台都能轻松地使用,我自己就是既用PC也用Mac来写代码。想赶时髦的话还可以用它来制作动画,更深入一步,它被大量用于机器学习和人工智能;它支持多线程多进程的优点,也成为管理者的心头好。通俗点的解释是:你把十份工作交给一个人做,跟让十个人同时做那十份工作是不一样的,十个人起码得配给十张桌子和十台电脑不是?
Python成为文科生转码首选,首先因为它据称是一门注重思想的编程语言。有人说,当你阅读一段Python良好代码时,即使是在Python语法要求非常严格的大环境下,给人的感觉也像是在读一篇英语文章一样。换句话说,Python编程语言最大的优点之一,是其具有伪代码的特质,它可以让人们在用Python开发程序时,专注于解决问题,而不是老想着要搞明白语言本身。
在一个文科生的眼里,一开始总觉得“人生苦短”在文字世界的接续反应肯定要丰富复杂得多,程序员们说“我用Python”,实在是太直白,太枯索无韵。文学语言与科学语言最大的不同,是文学语言有涵容有张力的感性体验,而科学语言的文字符号组合,重点在于要传达出去的信息,感性体验并不重要。比如寄快递,语言有点像那个快递盒子。科学语言这个盒子,只是用来传递的工具而已,收件方取出物品后就可以把盒子扔掉了,庄子说“得鱼而忘筌”就是这个意思。但文学语言这个盒子,本身却也是要传递的一部分,它甚至应该是那个能让人买椟还珠的“椟”。只是你在进入编程后,发现代码语言虽然是进入完全不同的世界,同样也丰富复杂,数理逻辑的世界也有着无穷大的开放性与可能性,那个快递盒子必须完完全全毫厘不差地按规则逻辑来做,才能让你把东西送到。
吉多·范罗苏姆(Guide van Rossum)
而且,你用文字来做的事情,Python号称可以用代码来做,也能做得感性,甚至浪漫。比如,用代码来计算“水仙花数”(水仙花数[Narcissistic number]也被称作自恋数、自幂数、阿姆斯特朗数[Armstrong number]。指一個三位数,它每一位数字的三次幂之和等于它本身);用代码来代替文字完成一系列现实世界的描述;用代码为家人画一棵圣诞树、放一阵烟花……那些枯燥干巴的公式,单调的语法代码,在正确无误的书写中瞬间会活起来。想象一下文科的文字吧,无非是些字母与笔画,但它们可以用来描述这个世界、深入抵达人的思想、表达人类的感情,甚至可以创建一个超越于现实人生的世界—“人生苦短”,文字却可以长存不朽。同样,代码也可以用来创建一个虚拟的世界。所以在探索学习的过程中,虽然碰得鼻青脸肿眼冒金星,乐趣也还是逐渐尾随而来了。越到后来越觉得,与其把Python作为一项技能去学,不如把Python作为打开计算机逻辑思维,打开另一个世界的钥匙。人生苦短,多开几扇门窗,眼前就多了几道风景。
年轻时的吉多·范罗苏姆
什么是计算机逻辑思维?或者以行话来说,什么是“编程思维”?这个问题不好回答。目前我自己理解的是,往大里说,一边看《黑客帝国》一边会呆呆地想想:宇宙,人类,历史过程,是不是一个设计好的大程序啊?往小里说,任何一桩琐事都可以被纳入计算机逻辑。每一个专业都有自己的术语,外人听起来有点像黑话。有个网站的“女程序员小组”抛出“找对象为什么难”这样一个问题帖子,下面的回答是:“对象是实例化出来的,不是找出来的,找出来的也是别人实例化,被你抢走的。所以要自己new一个出来,不合心意,就delete掉,new新的。”程序员的思维,每天都是if else,for,while等循环判断,形成了生活思维模式后,日常购物也会进入这种循环:该物品购买之后的使用频率?该物品必要性值几何?该物品花费的钱与其使用价值是否在合理的比例中?
编程界流行一段著名的Python之禅,也许表达的就是计算机思维逻辑。在Python的IDLE界面输入“import this”,就会跳出这段长长的禅语—
Beautiful is better than ugly.(美丽胜于丑陋)
Explicit is better than implicit.(显性好于隐性)
Simple is better than complex.(简单优于复杂)
Complex is better than complicated.(复杂也要优雅地复杂)
Flat is better than nested.(能不嵌套就不嵌套)
Sparse is better than dense.(疏朗美于密集)
Readability counts.(让人读得下去)
Special cases arenʼt special enough to break the rules.(规则不为特殊打破)
Although practicality beats purity.(实用胜过纯净为人生一憾)
Errors should never pass silently.(错误不可藏着掖着)
……
不理解编程语境的文科生,乍看之下觉得这禅语哪有咱们那种“风动,幡动,心动”的语言高级?但许多学到深处的程序员就觉得它不仅与编程有关,更与自己的人生有关。有一位正在写编程专著的程序员对着“Python之禅”感叹:每一个优秀的“攻城狮”和“程序媛”都应该是哲学家。如果没有人文科学的学习与训练,一个只在理工科专业内打转的人,不太可能成为优秀的编程者。
到目前为止,埃里克·马瑟斯(Eric Matthes)这本著名的《Python编程:从入门到实践》,我能学习的课程已经快结束,书也快被我翻烂了。除了时间和头发(迅速减少)的消耗,财务支出甚少,在孔夫子旧书网买到的这本二手书只花了二十八元(连运费在内)。书的品相大约八成新,因为前面那位读者在书上划来划去弄了许多记号和旁注。想象中,前边那位读者应该是一个男孩,年龄在二十出头,应该是在校生(建筑系的?他所有的笔记与旁注都用铅笔书写)。一开始,他和我一样磕磕绊绊从最基础的代码搞起,跟着书本教程亦步亦趋。但在基本语法逻辑弄完后,我就跟他分道扬镳了。那家伙完全沉浸在游戏编程的学习之中。“外星人入侵”游戏的所有代码和讲解被他划得乱七八糟。在“武装飞船”游戏项目的练习题后面,他歪歪斜斜地用铅笔写下一句:“我的飞机可以上下左右自由移动了!”几乎可以隔着时空听到他欣喜若狂的叫声。而我呢,觉得游戏需要的第三方库太占内存,我的电脑配置没那么豪华,想把这课程放到以后来做,于是就跳到“数据可视化”那一章去。可就再也看不到那位前读者稀里哗啦的笔注了。
现在说起来好像是个挺轻松的进程,有人在网上宣称一个月掌握Python然后应聘成功。而我,因为觉得难,太难,难极了,好几次都想缴械投降,我又不等着去应聘饭碗,何苦硬要折磨自己的眼睛脖子和头发?好在,网络世界虽然有恶意有阴暗有龌龊等种种不堪,但它的神奇也无处不在。所有的问题几乎都可以在网络(各个社区,各种平台)上找到合适的答案。半年下来的最大感触是,吾国教育的文理分科真的太严谨了,因为读了个文科,身边就没有一个在计算机方面实际可以请教的人,幸好撞上一位朋友的女儿,美国回来的计算机专业硕士,但这一行的人都忙得死去活来无暇他顾。她只给我发来寥寥两三句话的指点,在我看来还是觉得帮助巨大。第一次是我刚开始下载Python及geany编辑器总是报错,她就说了一句:“环境没搭好!”然后我就疯狂在网上搜索搭建编程环境的攻略小作文,并且加入了CSDN社区,这是个什么东东呢?某度的介绍是:“国内最大的网络之一,提供Web论坛,博客托管,IT新闻和其他服务。CSDN拥有约一千万注册用户,是中国最大的开发者社区。CSDN社区网站是中国软件程序员寻求建议的地方。海报描述了一个问题,在论坛中以CSDN点的价格发布,然后等待回复。在一些受欢迎的电路板上,海报会在几个小时内得到响应—如果不是几分钟的话。大多数回复很短,但足以指出错误并提供可能的解決方案。一些帖子包含代码,可能会增长到几页。大多数帖子都是用简体中文写的,但繁体中文和英文帖子并不少见。在CSDN中,共享知识和互相帮助的文化占主导地位。”
埃里克·马瑟斯
事实上,就我所知的事实上,许多帖子挺水的,就是把《Python编程:从入门到实践》上或是别的网课内容抄一下发上来。但也不乏真有热心人手把手教的。我的环境搭建最重要指导就来自这地方,还有引入第三方库时,代码的顺序也受到某位仁兄手抄代码的启发。另外,“小红书”并非只是个女人们“凡尔赛”的地盘,也有许多程度从菜鸟到大佬不等的IT博主在那里神出鬼没。还有不少程序员八卦趣闻。比如我,超过百行代码就开始犯糊涂,没有注释的话自己也不知道之前写了啥。注释真是太重要,我想起社区里看到的一则八卦,一位女程序员为了报复前男友(男程序员),把他上万行代码的注释统统删光。我在想象女程序员的绝望和男程序员的愤怒,想着想着就走神了。言归正传,我的第三方库模块导入煎熬了一周都没弄成:明明用正确的网址链接下载了,就是“如一箭之入大海”般毫无反响,那情形像是公司声称工薪已经入账,可你卡上就是迟迟看不到钱打进来的焦虑抓狂。后来还是小红书某博主的主帖下面的一个跟帖给了我重大启示,照着试了一下:一举成功。
因为Python的走红,网上课程一大把,上某度某乎某瓣看看,真有许多呼朋唤友要一起学习共同促进的兴趣小组,不过多数是有一无二,有上文无下文。个人体会结合网上多数意见,还是杨淑娟老师主讲的Python课程相当有价值。在埃里克·马瑟斯的书中我只是知其然,但杨老师的课让我知其所以然。这网课是一位朋友好心发送给我的,她的课每一步都解析得非常细,例句也很实用,遗憾的是没有数据导入分析和可视化的课程。
杨老师最好的一点是把学生当作一无所知的小白来教,而埃里克·马瑟斯还是他美国教育的思路,默认你即便是美术音乐舞蹈出身也还懂点儿IT,有数理逻辑基础,甚至是有C语言基础的。他的想法不无道理,记得奥巴马执政时期就鼓励全美人人学编程。二○一三年,非营利性组织Code.org发起的“代码一小时”(Hour of Code)的倡议竟然吸引了全球一百六十六个国家的三万三千所学校,约有五百多万名学生参与到这项旨在促进全民编程代码学习的活动中来。许多政界人士也参与了这场活动的宣传。我曾参与一家美国公司的团队做电子书网上翻译工作。团队中的翻译人员好像都懂一些HTML(全称为超文本标记语言。由HTML命令组成的描述性文本)。在浏览一个时尚网站时,竟然看到一位窈窕美丽的模特儿背景介绍也有程序员这一项。
不过,《Python编程:从入门到实践》的最有趣的地方,还是每一章节后面作者出的那些练习题目。这些练习题中,山川河流、气候地理、国家民族、汽车旅行、家人宠物、饮食喜好,几乎无所不包。于是,我把家人姓名宠猫花草所读之书所到之处,在代码练习中统统敲了一遍……
按说做编程写代码是最国际化的工作,但吾国网民就是不同,有些创意别出心裁,还带着浓浓的“蓝翔”味。比如《Python编程:从入门到实践》书中推荐的一款轻巧好用的编辑器“geany”,它居然被汉化得如此彻底,我简直认不出它的本来面目了。没办法,代码本是英文的世界,土法上马也算是剑走偏锋的一招。在那些社区多混几天,有才的俊杰你都能碰上。一位博主在他的博客上就把专业内“面向对象编程”与“面向过程編程”的区别解释得既本土化又明确易懂。他用蛋炒饭和盖浇饭做比喻,他说,用面向过程的方法写出来的程序是一份蛋炒饭,而面向对象写出来的程序是一份盖浇饭。做蛋炒饭,最后就是把米饭和鸡蛋混在一起炒匀。盖浇饭则是把米饭和盖菜分别做好,至于喜欢红烧肉还是青椒土豆,可以自己选择。蛋炒饭的好处是入味均匀,吃起来香。但如果你不爱吃鸡蛋,只爱吃青菜,那么唯一的办法就只能重新做青菜炒饭了。盖浇饭就没有这个麻烦,只要把上面的盖菜拨掉,另换一份盖菜就可以了。到底是蛋炒饭好还是盖浇饭好呢?其实这类问题都很难回答,非要比个上下高低的话,就必须设定一个场景,否则只能说是各有所长。如果食客没那么多讲究,那么从饭馆角度考虑,做盖浇饭显然比蛋炒饭更有优势,他可以搞出任意多的组合,而且不会浪费。盖浇饭的好处是菜与饭分离,不对口味就换菜。用软件工程的专业术语说就是“可维护性”好,饭和菜的耦合度较低。蛋炒饭是蛋和饭搅和在一起,耦合度很高,你想换成青菜就不成,所以“可维护性”就差了。软件工程追求的目标之一就是可维护性。你不能前脚写完代码刚出门,后脚就程序崩溃无法收拾了。
程序员搭好环境后写出的第一行代码:“Hello World!”
从美国人开始,有一个编程的仪式感,程序员搭好环境后要写出第一行代码:“Hello World!”据说这能带来好运。对于Python使用者来说,第一行代码最好是:“Hello Python World!”当这句话运行起来时,真是Python一小步,我的人生一大步啊,我开心得以为万事大吉了。不是说“万事开头难”吗?以后可以在编程中大展身手了?其实,是万难才刚刚开始。因为文科生真的需要把自己的脑袋扳转,调试过后才能听使唤,哪怕是在线求助一个问题,你得用他们那套江湖行话把问题说清楚。
每一个写代码的人都会陷入困境,需要向外求援,我看到过许多在校研究生哭天喊地在网上这样求救:“救救孩子吧,明天就要交作业了,可是这段死程序它怎么都跑不起来!”可怜我一开始连别人的回答都搞不懂:“你要用tab缩进”“遍历一下列表”“你都没给赋值啊”“这不就是布尔值嘛”……世界各国程序员都会上网求救,但求救需有一定的程序:一、你想要做什么?二、你已尝试哪几种方式?三、结果如何?美国程序员们称之为:“橡皮鸭子调试法”。意思是,假如你要向一只橡皮鸭子(或任何无生命的东西)清楚地阐述自己的困境,并向它提出具体问题,你应该怎么做?在文科生看来,那是精神错乱的表现,起码是前兆。但美国有些编程公司甚至就在办公桌上放置一个橡皮鸭子,旨在鼓励程序员,“与这只鸭子交流!”好吧,幸好也有文科生看得懂的劝告:你只需回过头来重新写一遍,就足以解决许多问题(这个劝告看似扯淡,其实极为管用,许多文科生常犯的毛病是不够严谨,他们的逻辑表达跟理科生比起来总是欠缺,我都不知道怎么来形容好了)。还有一个建议我也听得懂:“如果你长时间一直试图解决同一个问题,那么休息一会,走开去喝点水或饮料,吃点清淡而健康的零食,是你实际上可采取的最佳战术。长时间从事一个任务时,你可能会变得一根筋,你对其他的假设往往会视而不见,休息一下有助于你从不同的角度看问题。不用休息很长时间,起来做做活动,溜达一下。如果还不行,这问题弄得你心情沮丧,或许可以把工作放在一边,晚上睡个好觉后,你会发现问题并不是那么难解决了。”
总之是,天无绝人之路,你使劲敲Python之门,边喊边敲,那门总会为你打开。
二0二二年一月二十二日