把代码写的晦涩是为了速度还是装酷

12 Sep, 2011

以前看过一篇程序员装逼指南,就是说为了耍酷,把代码写的有多复杂就复杂,写的有多不清晰就多不清晰。作为码代码不久的学生,还是比较喜欢那种一看就能明白的代码,而对那种比较晦涩就感觉是为了耍酷之作,具体对我来说,晦涩指的是:1.代码看了很久也不知道怎么做的,但执行结果是对的;2.看着明白,就是自己想不出来。

但,觉得晦涩,很有可能是自己水平有限,不明白这门语言的哲学,或者说就是作者耍酷,也有可能是有更高的执行效率,不过,究竟是什么,仍然很困惑。就拿现在自学的Python来说吧,选择Python而非Ruby,重要的一点就是我觉得Python写出的程序十分好理解,基本上就像是读一篇文章。然而,Python有一种哲学,就是Pythonic,简单理解就是灵活和内省,看到过一个求100内质数的Python代码:

import math
[ p for p in range(3, 100)
      if 0 not in [ p%d
            for d in range(2, int(math.sqrt(p))+1)
                   ]
   ]

以前也用过C语言来求质数,自己也写过Python求质数,但这种方法我肯定是想不出来的,这个就是我所说的晦涩的第二种,读过去能明白,并知道使用的是列表推导,不过这种方法,是因为符合所谓的Pythonic,或者是执行速度快,还是因为作者纯粹是耍酷,我是说不清了,毕竟水平有限,不好说。

在用webpy框架设计一个网站时,用户注册的密码需要加密,现在比较通用的做法就是随机生成一个字符串,然后和用户密码混合,然后再进行加密运算,最后存入数据库中,于是我写了一个生成随机字符串的函数:

def getsalt():
    seed = "1234567890abcdefghijklmnopqrstuvwxyz \
           ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    sa = []
    for i in range(8):
        sa.append(random.choice(seed))
    salt = ''.join(sa)
    return str(salt)

当然,这一看就是新手的做法,为什么这么说呢,因为我在网上找到了几个看着非常简洁,但比较晦涩的:

''.join([(string.ascii_letters+string.digits)[x] for x in random.sample(range(0,62),8)])

''.join(map(lambda xx:(hex(ord(xx))[2:]),os.urandom(16)))

当然,我的那个看着确实没有上面两种方法酷,也没有那么简洁。对于第一个方法,我明白原因,对于第二个,是一直没有搞懂是为什么。对于执行速度,很容易看出我的那个确实慢得多,不过理解起来就快得多了。

由于是初学者,当然很多不懂,我这里也敢把自己简单的代码秀出来,也算有勇气了。在各类程序问答区,你问个问题,来回答的很多人并不是用最容易理解的代码说明问题,而好像是为了显示自己的高深或者怕别人说自己的低级,用一些晦涩的代码来回答。对我来说,我认为用作展示的代码(公开的,教学的,开源的)还是应该把简单易懂做为第一位,当然在不是很拖累速度的情况下,文档又懒的写,代码又晦涩,这种情况下估计没人会夸奖你高深,而是看都懒的看。自己使用的,晦涩得来自己能懂都可以。

最后再说明,我是初学者,可能有些见解会让大神们感到不爽。