我为什么学习Python

        在我的编程生涯中,Python给了我第二次热情。



第一次热情——编程之路的开始。

        和不少人学过BASIC的人一样,我从小就接触到了编程,但是那时无论是研究小霸王学习机,还是在课外兴趣班里由老师教。对编程方法都还是保持着一个模糊的印象。当时觉着,稍微复杂一点的问题——比如解方程式,播放动画——都挺难想出做法,所以也就知难而退了。现在回想,用编程实现解方程或者是在小霸王上实现动画效果,确实很有难度,不是小孩子能独立完成的。

        高三的时候,因为高考,心理压力颇大。那个时候,不光是因为学业繁忙,而是有一种焦虑。在人生的重要关头,许多人都有迷茫。有趣的是,在这种焦虑的心境下,却开始对任何和学习无关的事燃气了巨大的热情。那时候,班里的同学踢毽子、打篮球、看课外书,似乎都比平日里还要热情。听老师说,这种心态并不是我们有,前些年也有过高三的学生,一麻袋一麻袋的往班里运漫画书,掀起一股漫画风潮。

        在那样的心境下,一天晚上,我捡起了早已遗忘的BASIC程序,回想着循环、判断,等等算法。当时的开发工具是一台可以编程的文曲星,小小的键盘,黑白屏幕。开发环境叫做GV-BASIC,和最古老的BASIC几乎一致,但是提供了画点、画圆、画方块等等API。我摸索着,写了一个循环,打印正弦曲线。略作调试,黑色的小点缓缓的在屏幕上移动,留下痕迹,打印出一个平滑的sin曲线。当时的喜悦之情溢于言表。

        玩了两天,尝试了双重循环、三重循环,同时打印几个曲线。之后,醍醐灌顶一般,我明白了游戏的做法——游戏主循环。

        疯狂的两晚上编码,加上请教了班里的编程高手之后,我终于做出了一个打靶的小游戏。一个竖的线段代表靶子,在屏幕右方上下移动,左边是枪,按空格键射出子弹,按照打中靶的环数计分。

        爆棚的成就感促使我继续研究编程,成就了之后一个大作:大炮对射。设计初衷是模仿文曲星上的小游戏“大炮对射”,由于文曲星上的版本是回合制的,比较平淡。我果断设计了一个实时战斗版的大炮对射。对战双方一个按Q键,另一个按P键,进行射击。由于双方同时射击,运算量增加了一辈,导致可怜的BASIC卡顿。于是改进了渲染方法(当时的游戏都使用擦画法,就是一边画新的点,一边擦去不需要的点,形成动画效果。)用直线代替点,效果流畅了许多。

        在同学们一致好评之中,我给大炮对射增加了地图编辑器,后来又做了模仿《瓦利奥制造》里的小游戏,反响也很好。

        在乱糟糟的高三的日子里,抽时间写程序,心情烦躁,迷茫,而又快乐着。在那个时候,悄悄下定了决心,以后一定要做游戏。这是我编程生涯的开始。



第一次热情的衰退和第二次热情。

        大学毕业后,如愿以偿的来到了一家业内知名的游戏公司。我是以逻辑程序员的身份进去的,必须技能是C++,但是一开始只是写语法和C++很类似的一种脚本(后来知道是从一个开源脚本引擎AngelScript修改而成的)。学习游戏开发的流程,填数据,用脚本定制各种任务、副本等等。第一年还很有兴致,第二年开始就意兴阑珊了。

        后来熟悉了整个系统,介入到C++部分的代码里。涉及到道具、任务等等逻辑。那时候觉得最难的部分,是UI系统。当时的UI系统,是用XML拼出界面,然后用类似C++的那种脚本来给它写逻辑。从一开始不愿学,到被迫学明白,到最后使用的时候遇到各种问题。前后确实折腾了很久。

        写程序的热情,在实际工作中被一点点的磨灭。我想,很可能许许多多的程序员,都会遇到和我一样的问题。因为爱好而走上这条路,却被琐碎的工作磨灭了最初的冲动。等到我成为一个独当一面的程序员的时候,我甚至有一种感觉,觉得自己似乎什么都会,但是除了项目任务以外的东西,什么都做不出来。相比高中时候的自己,甚至有一些退步。

        直到有一天,我看了一本书《黑客与画家》。

        在你迷茫的时候,多吸收一些各方面的知识,偶尔会突然打开一扇窗。

        《黑客与画家》满本书都透着浓浓的技术自信,和充足的技术底蕴。它就像是一个知识丰富的技术高手,迫不及待的将平生经验一股脑传授给你,为你指明发展的方向。它的字里行间透露着对传统编程语言的鄙夷和对Lisp的崇敬。它认为精巧的语言,加上聪明程序员实现的高度抽象代码,会带来极大的生产力提升,同时带来丰厚的成果。让开发更快、BUG更少,让一两个开发人员也能撑起一个具有巨大经济效益的网站。


        在Web界已经是遍地动态语言的今天,《黑客与画家》里的判断,似乎已经失去了讨论的价值。但对于当时的我来说,就是大海里的一盏明灯。

        虽然书里对Python(作者当年还是1.x版本)的看法很具有批判性,但是由于那时Python 2.x已经有了长足的发展,加上一个同事的推荐,我全身心投入到了Python的学习之中。在写了一些小练习程序之后,我在工作中找到了一个Python的用武之地——用Python实现一个数据表格分析程序,并检查表格中的数据错误、逻辑错误。这种表格处理工具在游戏中具有很大的作用,而且非常适合用脚本来灵活的扩展功能。

        第一个实现的简单版本,使用起来大概是这样:

        

import mb
t = mb.table( "data/index.txt" );
l = t.get_line( 1001 );    # 1001 is line index
data1 = l.get_int( 2 );    # 2 means colum 2
data2 = l.get_str( 3 );

        这个代码主要问题在哪呢?在于读取数据时,程序员自己要指定数据的类型。get_int,get_str,get_float等等等等。

        很不幸而又幸运的,当时我用某某云盘保存自己的代码,有一次误同步,导致在公司写的很多代码,在家里操作时覆盖了。迫使我重写几乎整个程序。这次,在同事的参谋下,我实现了这种用法:

import mb
t = mb.table( "data/index.txt" );
l = t[1001];    # 1001 is line index
data1 = l[2];    # 2 means colum 2
data2 = l[3];

        这段代码实现的功能与上面的完全一样,但是有两点变化:1、用[]下标操作符代替了get_xxx()函数调用,更简洁。2、读取时不需要指定类型,执行时,data1自然是整型,data2自然是字符串。

        这种实现,对于当时的我来说,是一个理念上的重大突破!

        为什么这么说呢?因为强类型的问题。在Python中,我用一些很简单的处理,让mb库的底层自然的处理了类型。而你知道吗?在C++中,这几乎是不可能做到的!

        C++常常为了推断一个类型,不惜使用模版技巧,写出天书一般的代码。而且,结果上,仍然不能做到动态语言的这种用法。也就是说,显式强类型特性,并不仅仅是约束程序员减少BUG的工具,它同时也是实现高抽象系统的一个束缚。这是个很有意思的事情,对我当时的触动很大。不知读者能否理解。


        到了写出此库之后,我生命中的一扇门打开了。

        我回到了可以自由写代码的时代,就像是我的高中时代,但是比那个时代更为光辉,充满了更多的可能。

        我可以任意的写代码,对树的操作、复杂的嵌套字典,我仿佛可以操作任意复杂的数据结构,或者复杂的递归,只要我想清楚了,根本不需要多少编码时间。当时掌握了葵花宝典的我,还找到一个Python学习网站www.checkio.org,精力十足的我,没事就到上面刷题。看大神们写的“一行Python”(其实是利用了列表解析等方式做的很简短但是有点难读的代码),收获了很多乐趣。


Python与我。

        后来的我,仔细学习过wxPython库,也实现过类似Web框架的游戏框架,对Python的使用也不断进入新的阶段。当然也发现Python的很多弊端,并非语言层的,大都是虚拟机层面的。

        学习Python的过程中,我总结出项目开发的三大要点——开发速度,运行速度,维护难度。软件项目金三角。这个规则可以套用在所有的软件项目上,作为看项目的一个可观角度。而且有趣的是,这个三角形总是无法在三点上同时拿到高分。

        也许大部分人都无法理解一门语言对一个程序员生涯的影响,所以特撰此文。Python对我的影响是巨大的,Python拯救了过去的我,也必将影响未来的我。


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值