类似Python这种动态语言的一个疑惑

类似Python这种动态语言的一个疑惑

初问

Zhang Jiawei <[email protected]>
发件人当地时间 发送时间 11:33 (GMT+08:00)。发送地当前时间:上午9:56。 ✆
回复      [email protected]
发送至     python-cn <[email protected]>
日期      2010年12月25日 上午11:33
主题      [CPyUG] 类似Python这种动态语言的一个疑惑

codebase 中 merge 了别人的代码以后。即便双方都没有改动同一个文件,也可能出现这种情况:

merge 了两个文件以后, 程序员基本都不会意识到现在出了问题。

原因有两个:

  1. python 程序员基本不用什么IDE, 如果使用 pydev 之类, 大致还能依靠 IDE 在merge 以后看到这个错。
  2. python 没有编译的概念,没有机会看到编译器对这个语法问题的报错。

好了,现在只有等上线以后,通过某个事件触发这个bug了。

请问各位是杂么防范这种问题的?

强答

沈崴 <[email protected]>
日期      2010年12月28日 上午10:58
主题      [CPyUG] Re: 类似Python这种动态语言的一个疑惑

On 12月25日, 上午3时33分, Zhang Jiawei <[email protected]> wrote:

关于这个问题,

所以我想说的是:

   试图使用静态检查,和使用 IDE 进行参数约束的想法,才是真正危险的!

   1 def adduser(**args):
   2    u = args['username']
   3    p = args['password']
   4    #...

如果这样调用 adduser(name='tom', gender='male') 就会出错,这时调用者 可以立即明白,逻辑上有问题了。你的程序就真正减少了一个 bug。

所以,结论完全相反,比起静态语言,像 python 这种动态语言更难产生 "bug"

> 1. python 程序员基本不用什么IDE, 如果使用 pydev 之类, 大致还能依靠 IDE 在merge 以后看到这个错。

许多人都是这样的。

> 2. python 没有编译的概念,没有机会看到编译器对这个语法问题的报错。

> 好了,现在只有等上线以后,通过某个事件触发这个bug了。

我想说的是:

   即便上线了,当有问题时不出错,才是真正可怕的事情。

上线的程序,都需要从静态语言崩溃和动态语言报错中恢复的机制,和错误报告机制。 当然,当程序上线时,traceback 总比 core dump 要可爱得多。 而且动态语言调试又要方便一些,用户很快可以得到更新补丁。

> 请问各位是杂么防范这种问题的? > > unit test ?

所以结论是,不仅不防范,而且还要尽量制造和纵容这种所谓的错误。

继续

On 12月28日, 上午4时59分, Wei guangjing <[email protected]> wrote:

> 在 2010年12月28日 上午10:58,沈崴 <[email protected]>写道:
> > 而在讨论中,大家都在想办法保证参数个数必须一致的问题,我这里随便举个例子:
> >    adduser(username, passwod)
> >    adduser(name, gender)
> > 作为同名接口,都具有两个参数,甚至都是字符串类型的,而且无论在编译还是运行期
> > 都不会报错。
>
> 静态语言是不会有这个问题的,因为不可能定义2个同名并有同样参数个数的方法。

两个同名并有同样参数个数的方法


c++ 可以 python 不行。

的情况 ;)

矫枉过正

Zhang Jiawei <[email protected]>
发件人当地时间 发送时间 20:38 (GMT+08:00)。发送地当前时间:上午10:03。 ✆
回复      [email protected]
发送至     [email protected]
日期      2010年12月28日 下午8:38
主题      Re: [CPyUG] Re: 类似Python这种动态语言的一个疑惑

如果得出这样的结论,我感觉有些矫枉过正了。

  1. 真的是个bug, 因为用户访问到这个语句行的时候,报错了。
  2. 我们不可能要求无论谁在写参数列表的时候都用map。
  3. 我的案例实际上用IDE或者其他的静态检查机制其实就可以解决问题,而且安全省力,没有附加步骤。
  4. 您说的参数语义的内涵发生变化而导致的问题其实开辟了第二个案例。其实静态语言里也存在,用 map也解决不了。因为大家merge代码的时候仍旧没有人意识到这里有问题,只有调用的时候才会发现问题。靠 unit test 应该能检查出来。如果unit test没报错,那么错的也是对的。
  5. IDE 或者 静态检查 的确检查不出您开辟的第二案例,但不等于 IDE 或者静态编译就是危险的,他们在自己力所能及的范围内检测出某些问题即可。比如我的案例。
  6. 我还是觉得不用把事情扯到静态语言的动态链接上,事情很简单,适用范围没有那么大,就说两个py之间 和 两个 .c 之间都有互相调用,如果 .c 是静态编译,通过编译器的报错会比执行到py才报错安全的多。即便是动态链接,楼上的朋友说了,参数个数的变化至少是可以通过编译发现的,因为.h 变了。您的第二案例,无论是动态语言还是静态语言都没办法不通过Unit Test解决。
  7. 我的案例同样是上线了,有问题不出错,和您的案例一样可怕。我和您的案例同样在静悄悄的等待出错的机会。

所以我想说的是:

  1. 试图使用IDE和静态检查机制解决所有问题是危险的,但是进行参数约束还是安全的,起码参数的个数首先没问题,然后再用Unit Test去保证参数语义的准确。

我的结论依旧,动态语言的出错几率会比静态语言大。靠 静态检查 + Unit Test 双保险解决问题。除此以外自己给自己制造问题太折腾。

另:c/python 好说,我想像不出 java 不用 IDE还能用什么写?

吐糟

Zoom.Quiet <[email protected]>
发件人当地时间 发送时间 10:32 (GMT+08:00)。发送地当前时间:下午11:09。 ✆
主题      Re: [CPyUG] Re: 类似Python这种动态语言的一个疑惑

嗯嗯嗯,其实呢,俺是理解 沈论的,只是没有他那么多案例来支撑; 内什么,,,其实呢,大家心里想说的和 Jiawei 在反馈的问题,完全不是一个位面的事儿!

不论是 蟒禅还是蟒之8荣8耻,一直在表达的都不是语言的什么动态性,这些都是浮云!

不论Python/Erlang/Perl 等等广泛得到程序使用但是从来没在主流商业领域得到青睐的开发语言, 都有独特的开发文化包含在其中,涉及到动态语言的开发, 近年 erl 的兴起,其内置的质量保证方式之一就是"脆崩"或是说"速死"~进程只要有一点儿不对味立即死亡,绝对不允许继续呆在内存中影响其它进程!这样才能确保整个系统是稳定的...

> 0. 真的是个bug, 因为用户访问到这个语句行的时候,报错了。

- 写出这种代码来的人,才是bug

> 1. 我们不可能要求无论谁在写参数列表的时候都用map。

- 为什么呢? 一个团队难道没有任何统一规约的嘛?

> 2. 我的案例实际上用IDE或者其他的静态检查机制其实就可以解决问题,而且安全省力,没有附加步骤。

- 也就是说,不期望成员真正明白什么是逻辑错误了? 那么人的创造力是无限的,总是会有人写出NB到IDE也检查不出的隐藏逻辑 bug 的,每年 C++/JAJA/C# 制造了无数神奇的这种bug,在 Python 中,难道还要在 IDE 养护中促进这种 bug 的创造!?

> 3. 您说的参数语义的内涵发生变化而导致的问题其实开辟了第二个案例。其实静态语言里也存在,用 map > 也解决不了。因为大家merge代码的时候仍旧没有人意识到这里有问题,只有调用的时候才会发现问题。靠 unit test > 应该能检查出来。如果unit test没报错,那么错的也是对的。

- unit test 也是人写的,也有工作量的,如果良好的团队规约,交叉审阅等等促进团队知识管理的柔性协同可以从根儿上解决问题,为什么要使用同样包含问题的测试代码来解决问题代码?

> 4. IDE 或者 静态检查 的确检查不出您开辟的第二案例,但不等于 IDE 或者静态编译 > 就是危险的,他们在自己力所能及的范围内检测出某些问题即可。比如我的案例。

- 他们是谁? 是IDE 的团队,不是你的团队,想通过这种方式来提升自个儿团队的生产力是种美好的想象...

> 5. 我还是觉得不用把事情扯到静态语言的动态链接上,事情很简单,适用范围没有那么大,就说两个py之间 和 两个 .c 之间都有互相调用, > 如果 .c 是静态编译,通过编译器的报错会比执行到py才报错安全的多。即便是动态链接,楼上的朋友说了,参数个数的变化至少是可以通过编译发现的,因为 > .h 变了。您的第二案例,无论是动态语言还是静态语言都没办法不通过Unit Test解决。 > 6. 我的案例同样是上线了,有问题不出错,和您的案例一样可怕。我和您的案例同样在静悄悄的等待出错的机会。 >

- 所以,沈游侠强调的是,应该想办法让这种问题在上线前就暴发出来哪,,,

> 所以我想说的是,试图使用IDE和静态检查机制解决所有问题是危险的,但是进行参数约束还是安全的,起码参数的个数首先没问题,然后再用Unit > Test去保证参数语义的准确。 >

> 我的结论依旧,动态语言的出错几率会比静态语言大。靠 静态检查 + Unit Test 双保险解决问题。除此以外自己给自己制造问题太折腾。 >

这个结论和大家没有什么不同哪,只是解决态度有不同

Exoweb

[email protected] <[email protected]>
发件人当地时间 发送时间 19:16 (GMT+08:00)。发送地当前时间:下午10:29。 ✆
主题      Re: [CPyUG] 类似Python这种动态语言的一个疑惑

我说说我原来在Exoweb时,我们的项目是怎么处理你这个问题的吧。

以上这几个步骤应该能够防范你所遇到的问题了吧?

Gary Jia <ke(AT)jia.name>
http://www.jiake.org
珍爱生命,远离京东!
http://www.tianya.cn/publicforum/content/free/1/1662804.shtml

人肉味太重

Zhang Jiawei <[email protected]>
发件人当地时间 发送时间 21:10 (GMT+08:00)。发送地当前时间:下午10:46。 ✆
主题      Re: [CPyUG] 类似Python这种动态语言的一个疑惑

做的确实非常好。

我也补充几点:

  1. 这样环境并非哪里都有。
  2. 你们的流程非常好,但是仅仅从描述我都感受到了巨大的人肉成本,所以我们从来都在说一个意思,但是我更倾向于简单的问题能用工具就用工具去提早发现,复杂的问题才需要人肉介入。
  3. 没有IDE存在我个人并不感到敬畏,因为只不过是适用场合的问题。如果你说写Java你不用IDE,我的确会感到敬畏,而且十分想了解你们是杂么做的,我还特此发了个邮件给沈大,结果得到的答复不过是戏謔之词。我本人的Vim技巧大抵不会比你们公司里任何人差,相信还比大多数人好,
  4. 我在公司内部的例会上还做过专门的Vim演示去推广,发过邮件给Vim的作者提示他的Vim主页上没有加上他名字的中文版本,并且得到了该作者的答复和更正。我从来不正面刻意的去宣扬非IDE的意义,相反我在某些场合推荐IDE的存在,尤其是在Python的领域,这不代表我不知道Vim/Emacs系的好处,而是我更深知选择他们的场合。我研究过python.vim的源码说实话,真的够烂的。我也研究过pydev的eclipse plugin, 说实话,真的很用心的在写。
  5. 如果你们是做Python Web的,我认为不使用IDE大致问题不是那么大,因为在一个稳定的web framework之下,需要掌握的api就那么几个,从一个request过来到一个response返回就这点破事,比较费劲的是业务逻辑,完全是用基础的Python语法就可以应付。
  6. 如果你们是写PyQt一类,对不起,用Vim之类是自虐。因为那是C++的原生接口,Python 只是胶水语言,大妈扯到 Python 接口可以减少参数输入,在这里是不适用的。尤其面对成千上百个 GUI API 每个API有诺干个参数,每种参数的输入有各自的界面效果,再加上各个API之间的叠加效果。好吧,还是郑重推荐 PyDev。还是那句话,看场合,分情况来解决问题。

  7. 最大的问题就在这里,用 Python 和 用 Vim/Emacs 一样,并不显得你比别人高一等。说话做人都不要那么偏激,不用把其它诸如 Java, IDE, 静态检查都说的一文不值,相反我印象里 Pythoner 更应该低调才是,两个字概括 “暗爽”

  8. 你们有一个除了大姐都在用Linux或者Mac的环境,很好没问题。我在一个几百人都用Windows的IT公司里,应该比贵公司的市值要高很多很多倍。一个人一点一点的给自己开发机上的Ubuntu配置了能运行公司代码的工作环境 -- 我的桌面永远都是紫红色的。

人,还是人!

[email protected] <[email protected]>
发件人当地时间 发送时间 22:21 (GMT+08:00)。发送地当前时间:下午10:49。 ✆
主题      Re: [CPyUG] 类似Python这种动态语言的一个疑惑

环境无非是由人组成的,只要有足够多的靠谱的人什么环境都可以有。


反馈

创建 by -- ZoomQuiet [2010-12-29 02:05:43]

MiscItems/2010-12-25 (last edited 2010-12-29 15:22:59 by ZoomQuiet)