• Why Sometimes I Write WET Code at 2018年09月14日

    认可这个看法,我着手了一年多静态语言之后,虽然 eval / mm / reflect 很灵活,现在反过来就不再爱这些 EMR 了。

    如果是在小公司呆着,而且自己写项目,后者小团队,大家互相不干扰干活,是挺好的。

    如果碰到是华为、外包、要求严格的企业,他们就不让这么干了,因为他们崇尚 接口设计,而且也不允许使用灵活的语言。

    接口定义得良好,实现烂一点影响范围也有限,并且容易重构过来。

    不过对于 Python,我建议 @hooopo尤其是 Ruby、Python这样动态语言, 在没那么熟悉业务的情况下 删掉 Python,因为 Python 其实是一门很不灵活的语言。

    Python 的 private 根本不是大众口味的面向对象继承的,更像是 C++ 的 private 继承,到了后面的类没法好好取出来,只能通过 Parent_method,因此我觉得 Python 是怪味的,一开始就不旨意你去 call parent private。

    C++ 有 public 也有 protected 也有 private 继承模式,组合起来应对各种变态的场景,但是我觉得 Python 学到了它的坏处,同时在动态语言中多重继承。

    Python 这么做是为了让 object plain (扁平)得成个 dict,所有 object 都是 meta-table,而且还要是 C-flavor 的 map。

    怎么评价呢,反正个人的观点是认为 Python 就是模仿着强类型静态的模式和论调去进行动态编程,然而最终编码和行为一定是诡异的。

    所以 Python 的 object 让人用起来很刻板,写起来也感觉很死板。

    不像 Ruby,Ruby 从语法上光扬了 EMR,更偏向于 Java 真正将 object 当成有血有肉的 object 的 flavor。

    但是 Python 的刻板和死板好处就是对于数据结构初学者有好处,刚学计算机、编程的也很好接受基本类型,是字典就是字典,类就是个字典,对象也是个字典,数据结构就是 struct 套 struct,加上 Python 很少的语法糖,可以让新手很好入门。不用想太多。

    Ruby Java 适合进阶玩家,已经有了一套体系,在明白了基础之后,再去带有感性、抽象思维去使用才会好用。

    EMR 就是充斥了大量的 感性,就像人编码往往带有个性,这时候不是所有 team member 都理解自己的 imagination,这时候就会带来维护的困难,甚至自己也不记得当初 how to imagine this design 而维护困难。

    所以很多公司选择 Python 而不是 Ruby,也有这方面的原因。

    如果说:

    可读性 > 可扩展 > 优雅

    那么,Ruby EMR 之后产生了 DSL,是很优雅,很抽象,但是很可能别人是看不懂的,跟读唐诗文言文一样,得背负着可能无法读懂的框架的问题。DSL 赞扬了个性与隐晦,对于扩展与可读性也是不好下手的事情。

    作为企业,企业要尽可能考虑快速生产、迭代、编辑维护(Edit),在经济极端时刻必须极力消灭隐晦,宁可让你去写着从头到尾过程编程,连类(class)都不写,从一个又一个 file module import a import b 变量,跟 C 一样这里那里 extern,甚至干脆全局变量的无脑的 Python,也不会让你去 OOP,让你去 EMR,因为 EMR 是他们的大敌。

    所以 Ruby 是一门很可怜的语言,企业不敢用,尤其在现在霜月时刻(涉及敏感 ZZ 问题,不讨论)。

    同时,看到最近 Python 在拼命招人,感觉对编码越来越没兴趣了,感觉社会趋向变成了网站编辑、没智商的调包侠的世界了。

  • 小农思想害死人 at 2018年06月22日

    你想说我吗

  • 进程死锁 at 2018年06月10日

    哈哈哈哈哈哈哈哈

    你的浏览器提交死循环了

    还是说你重复点了很多次?

    表示 jruby 我只敢用 1.7 的…… 估计是兼容性问题

    jdk?openjdk?6? 7? 8? 9?

  • 这一定是程序猿画的

  • 哈哈哈,“面向对象本身就快不起来”,嗯,怎么说吧,跟“面向对象”可能关系吧,个人觉得有点不太大(个人而已),Py Rb 的对象都是一块块有点体积的内存,相对于纯 C / C++ / Go writing 来说哈,我在 C / Cpp programming 的时候,ref 或 指针引用是高效的,其中 ref 是最高效的。 就拿字符串拷贝讨论,你从文件 read 一波数据,你的变量的内存得 copy 来 copy 去,C++ 的 vector 可以:

    auto data = new std::vector<char>();
    std::FILE* f = std::fopen("test.txt", "r");
    char * data_piece = new data_piece[4096];
    
    while (fin.eof()) {
        length = std::fread(& data_piece[0], sizeof(char), 1024, f);
        data.insert(data_piece, data_piece + length); // 重点在这一句
    }
    
    ...
    

    请不要吐槽这段代码,纯粹是随即编写的,就当作伪代码好了。

    C / C++ / Go 可以很好地重复利用一块内存其中的一部分,而且很好地自由地去利用它。因为反复内存分配(系统调用)是在 C++ 开发界普遍认为是很低效的。

    但是脚本语言让人遗忘了这些,反正 GC 会管理,写得痛快。

    所以之前就有人说,你要是用 JS 去处理 pack unpack 二进制,还得转 Array,总之就是不方便。

    另外,这也是当初我比较喜欢 ObjC 的原因,因为 ObjC 是面向对象的可半手动管理内存的语言,虽然 ObjC 有 ARC,但是很多场景你是可以高效利用内存的。

    要想在 AI 高效反复利用这些变量去进行快速而且高效的操作,那肯定还是这样的语言(C / C++)比较擅长。但是这还并不算最高效的,C / C++ 编译之后出来的机器码具体运算算法并不是最优的,有些大神喜欢用自己手工优化的汇编来将无法优化或编译器优化得不够极致但是需要效率的地方。

  • 吓得我赶紧把问题打勾了,免得更夸张的回复,有些时候只是为了陈述某种场景,很多时候没有遇见过的情况或者不同因人而异的想法,很容易引起别人另有想法。

    有时候网上很多新闻说的是父亲带着调皮的小孩因为闹眼子被打,父亲却露出笑容,然后结果一堆键盘侠的回复可能超出实际事件预期。

    有时候评论说说还好,但是别太认真。

    有时候他人不站在自己具体场合下去讨论具体情境,有时候说多了难免引起误会。

  • 谈谈我对 Python 的看法 at 2018年04月29日

    听到你的回复我已经安心了

  • 谈谈我对 Python 的看法 at 2018年04月29日

    你去看看是不是所有人都拿 jsonpath 来做这些的?你的前端给你传个 fomdata 你也去 jsonpath parsing 吗?

    另外,我们又不是审计局,我不做精算师,不是数据分析员

    做个小后端虽然只是增删改查,要不都把 matlab / R 也调进来 parse 一下某个 key value 吧,逼格更高一些

    要不我们别写代码了,让 AI 自动分析我们的代码 tab 缩进几个了然后自动化为业务 generate 代码吧

  • 谈谈我对 Python 的看法 at 2018年04月29日

    绕来绕去讨论好费劲……不想聊了,不回复了

    在最后最后,我举个极端的例子

    假如,你的 IDE 抽风了,把你的代码:

    if isinstance(result, list)
        if result == ...
          // code
    if isinstance(result, str)
        if result == ...
          if isinstance(result, int)
             if isinstance(result, int)
                if result == ...
                    // code
             if isinstance(result, int)
                 if result == ...
                     // code
    if isinstance(result, int)
        if result == ...
          // code
        ... 省略
    

    这样结构的,突然 IDE 一抽风,或者你不小心按 tab 加入了 shift 键盘,那么成了这样子:

    if isinstance(result, list)
    if result == ...
      // code
    if isinstance(result, str)
    if result == ...
      if isinstance(result, int)
         if isinstance(result, int)
            if result == ...
                // code
         if isinstance(result, int)
             if result == ...
                 // code
    if isinstance(result, int)
    if result == ...
      // code
    

    或者这样子:

    if isinstance(result, list)
    if result == ...
    // code
    if isinstance(result, str)
        if result == ...
    if isinstance(result, int)
    if isinstance(result, int)
        if result == ...
            // code
    if isinstance(result, int)
         if result == ...
             // code
    if isinstance(result, int)
            if result == ...
    // code
    

    或者这样子:

    if isinstance(result, list)
    if result == ...
    // code
    if isinstance(result, str)
    if result == ...
    if isinstance(result, int)
    if isinstance(result, int)
    if result == ...
    // code
    if isinstance(result, int)
    if result == ...
    // code
    if isinstance(result, int)
    if result == ...
    // code
    

    我这里是给了 // code 所以你看得出来,但是现实逻辑是残酷的……如果 IDE 还在抽风,你在撤销的时候并没有还原完整成了:

    if isinstance(result, list)
    if result == ...
    // code
    if isinstance(result, str)
        if result == ...
    if isinstance(result, int)
        if isinstance(result, int)
    if result == ...
            // code
        if isinstance(result, int)
        if result == ...
             // code
    if isinstance(result, int)
            if result == ...
    // code
    

    if 的先后顺序,逻辑都彻底不对了!

    当然大的变动可能性不大,小的有可能,比如你在 if 前面的空格不小心 backspace 错了,但是没察觉没在意,继续写代码,过后你发现逻辑出问题了

  • 谈谈我对 Python 的看法 at 2018年04月29日

    https://stackoverflow.com/questions/4043741/regexp-in-switch-statement

    Python 应该跟 PHP / Perl / Ruby / JavaScript 比,Java 不要拿进来说,Java 作为静态语言,天生编译时可以类型、行为直接检查完了,很多静态的优势,但是你要拿静态语言去跟脚本比灵活性没意义,所以 Python 应该跟 PHP / Perl / Ruby / JavaScript 比,但是比起 PHP / Perl / Ruby / JavaScript 没有任何优势,除了库比较大

    但是只要 Rubygems / npm 发展起来,我并不认为 Py 再有任何优势

    我觉得 Py 应该去接近 Ocaml / Haskell 去,因为大家没发现“普通人”用的语言都是 { },begin end,就 Python 拿 tab / space,就 Ocaml / Haskell 用各种函数式串式编程。总之就是 异类