V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Makabaka01
V2EX  ›  程序员

现在极其厌恶弱类型语言,弱类型就不适合中国的职场环境

  •  
  •   Makabaka01 · 127 天前 · 13703 次点击
    这是一个创建于 127 天前的主题,其中的信息可能已经有所发展或是发生改变。

    别的团队交接过来一个十几万行的 Python 项目,要重构成 Java ,我真的吐了,一点文档也没有。

    Python 里面大量的访问各种 RPC 接口,关键是特别喜欢自己转换 rpc 返回的结构,还非要用字典去自定义结构!

    现在好了,到处都是字典 + 字符串取值,这个字符串 key 还是尼玛自己定义的,和 idl 都对不上,得自己去代码里面到处翻找,看看到底是哪个接口返回的。

    最离谱的是命名还会骗人,弱类型就算了,好歹命名漂亮点吧。"xxx_list" 是个字符串我真的服了,甚至就连 "user" 也能是个字符串……


    现在国内的现状就是领导疯狂催,程序员疲于奔命,谁天天给你写文档,代码迭代几次连自己都不认得了,还搞弱类型,万一熟悉项目的人走了后面的人根本没办法看,都都读不懂。再加上英语水平有限,命名真的是一塌糊涂,更加重了理解问题。

    第 1 条附言  ·  127 天前
    不要纠结 Python 是强类型还是弱类型了,突然歪楼了…… 这不是重点。虽然 Python 确实是强类型语言,是我帖子里写错了。

    我想表达的重点是没有类型对代码可维护性的严重破坏。

    之前在 Rails 社区里看到过一句话,大意是动态语言项目需要你深入的理解每一个细节,才能快速高效的迭代项目,很多项目作者维护了十几年,甚至可以说已经成为了生命中的一部分。

    问题是现在大部分人都是前人挖坑后人填坑,拉完屎山过两年拍拍屁股就走人了,没有类型、没有单测,什么都没有,后人很可能直接一个趔趄就掉进坑里摔死了……
    119 条回复    2024-07-21 21:55:05 +08:00
    1  2  
    hhacker
        1
    hhacker  
       127 天前
    不讨厌的只是屎山,不是弱类型
    estk
        2
    estk  
       127 天前 via iPhone   ❤️ 4
    中国人老板:My grandma run faster than your code!
    qcbf111
        3
    qcbf111  
       127 天前
    ts 火不是没有道理得,当初我们用 lua 也强制必须要规范书写 type annotation.
    Makabaka01
        4
    Makabaka01  
    OP
       127 天前   ❤️ 1
    @hhacker 国内环境下,弱类型 == 不可阅读的屎山……强类型还属于可阅读的屎山,能接受一点
    lithiumii
        5
    lithiumii  
       127 天前 via Android   ❤️ 1
    可能别的团队一个月整出了能挣钱的活,现在用户多到需要重构了。但凡一开始就用 java 写,现在还没上线呢(我瞎说的
    Makabaka01
        6
    Makabaka01  
    OP
       127 天前
    @lithiumii 哎,现在大厂确实都这样,代码随便搞,能跑就行,吹一波后面反正晋升走人了,维护代码又不是自己,然后后面来的人继续这么想,继续屎山上拉屎。
    walkeronway
        7
    walkeronway  
       127 天前
    我写 python 就特喜欢写类型注解,看着特舒服,写了之后 pycharm 的语法提示也好用
    mwuxlcanrh
        8
    mwuxlcanrh  
       127 天前   ❤️ 1
    上线收益拿到手拍拍屁股挖新的坑,留下的老坑里面都是屎,接盘的有福了
    sagaxu
        9
    sagaxu  
       127 天前   ❤️ 1
    php 代码里面经常有 $item['aa']['bb']['cc']['dd'] 甚至 5 级以上的数组,运行时产生一大堆 undefined index xxx ,但产品行为却符合预期,就算是原作者维护,可能过几个月就搞不清有哪些字段了
    kenvix
        10
    kenvix  
       127 天前   ❤️ 22
    你要不先区分一下弱类型和动态类型...
    ciderzero
        11
    ciderzero  
       127 天前   ❤️ 2
    Python 是强类型动态语言吧,虽然我觉得写着也不舒服。
    akira
        12
    akira  
       127 天前   ❤️ 1
    都一样, 赶工期出来的东西,用啥写 都是屎山。。。
    Pzqqt
        13
    Pzqqt  
       127 天前
    以下内容摘自《流畅的 Python 》第 11 章“接口:从协议到抽象基类”的延伸阅读

    Python 是弱类型语言吗

    由于缺少统一的术语,讨论语言类型方面的话题时有时会让人不明其意。有些人(例如扩展阅读中提到的 Bill Venners 对 Guido 的访谈)说 Python 是弱类型语言,把 Python 与 JavaScript 和 PHP 归为一类。讨论类型时,最好考虑两条不同的坐标线。

    强类型和弱类型

    如果一门语言很少隐式转换类型,说明它是强类型语言;如果经常这么做,说明它是弱类型语言。Java 、C++ 和 Python 是强类型语言。PHP 、JavaScript 和 Perl 是弱类型语言。

    静态类型和动态类型

    在编译时检查类型的语言是静态类型语言,在运行时检查类型的语言是动态类型语言。静态类型需要声明类型(有些现代语言使用类型推导避免部分类型声明)。Fortran 和 Lisp 是最早的两门语言,现在仍在使用,它们分别是静态类型语言和动态类型语言。

    强类型能及早发现缺陷。

    下面几例体现了弱类型的不足:

    ```javascript
    // 这些是 JavaScript 代码(在 Node.js v0.10.33 中做了测试)
    '' == '0' // false
    0 == '' // true
    0 == '0' // true
    '' < 0 // false
    '' < '0' // true
    ```

    因为 Python 不会自动在字符串和数字之间强制转换,所以在 Python3 中,上述 == 表达式的结果都是 False (保留了 == 的意思),而< 比较会抛出 TypeError 。静态类型使得一些工具(编译器和 IDE )便于分析代码、找出错误和提供其他服务(优化、重构,等等)。动态类型便于代码重用,代码行数更少,而且能让接口自然成为协议而不提早实行。

    综上,Python 是动态强类型语言。“PEP 484—TypeHints”( https://www.python.org/dev/peps/pep-0484/)无法改变这一点,但是 API 作者能够添加可选的类型注解,执行某种静态类型检查。
    cmdOptionKana
        14
    cmdOptionKana  
       127 天前   ❤️ 3
    古语有云:动态一时爽,重构火葬场。
    unbridle
        15
    unbridle  
       127 天前 via iPhone   ❤️ 3
    只是不方便 javaboy 转 java 而已
    highf4324
        16
    highf4324  
       127 天前
    是的,没有 Type Annotation 的代码不是好代码,阅读、维护起来真的是灾难。
    Makabaka01
        17
    Makabaka01  
    OP
       127 天前
    @Pzqqt “很少隐式转换”这个概念很模糊啊,比如 JS 现在也不会有人写 == 了,都是 ===,然后 Python 里面也会经常在 if 里面直接放一个字典或者数组,`if dict` `if arr` 这样,这不算隐式转换吗
    DOLLOR
        18
    DOLLOR  
       127 天前 via Android   ❤️ 1
    我写 Python 都会写 type hints ,写 JS 都会写 jsdoc 。
    有的人嫌弃写 type 浪费时间,我觉得不然。写 type 能让编辑器自动提示对象里的成员,反而更能节约调试时间。
    以前写 JS 的时候,最烦的事情,比如对象成员的字段名拼写错误,或者调用 async 函数忘记 await ,写一段代码,还要花同等的时间来调试。后来坚持写 TS/JSDOC ,代码跑起来经常都是一次通过,效率高多了。
    Makabaka01
        19
    Makabaka01  
    OP
       127 天前
    @akira 万恶之源还是魔法字符串
    yolee599
        20
    yolee599  
       127 天前 via Android   ❤️ 1
    所以我很反感用 var ,auto 来定义变量,该 string 就 string ,该 int 就 int ,别搞一个通用类型
    awalkingman
        21
    awalkingman  
       127 天前
    中国的职场环境。。。。
    可惜我的 tag 容量放不下了
    hez2010
        22
    hez2010  
       127 天前 via Android
    @yolee599 var 也不是通用类型。var 的类型是静态推导的,跟你直接写 int 和 string 没区别,编译的时候会被编译器自动替换成实际类型。
    davehandong
        23
    davehandong  
       127 天前
    Java 不是也支持了 var 声明变量么,C/C++里现在也有 auto ,我是一直挺反感这个的.
    一方面像 js 这种往 typescript 这方向走,另一方面本来是强类型的又非要引入弱类型的风格。
    kenvix
        24
    kenvix  
       127 天前
    @DOLLOR #18 最麻烦的是没 type hint 文档还残废,真抓瞎
    DOLLOR
        25
    DOLLOR  
       127 天前 via Android
    @yolee599
    如果你说的 Java 的 var 和 C++的 auto ,它们都不是“通用类型”。
    那只代表类型自动推导,开启 inlay hints ,或者把鼠标 hover 上去,就能看到真实的类型。
    Biggoldfish
        26
    Biggoldfish  
       127 天前
    加上 type annotation 并且 enable type checker 不就完了
    deplives
        27
    deplives  
       127 天前 via iPhone
    连动态类型和弱类型都分不清?
    python 早就有了 hint 建议了解一下
    [Python 里面也会经常在 if 里面直接放一个字典或者数组,`if dict` `if arr` 这样,这不算隐式转换吗]
    你真的 了解一下啥叫 magic method ?
    wangritian
        28
    wangritian  
       127 天前
    语言的约束作用始终有限,主要看开发人员水平,写 java 用 Map 一把梭不也受不了
    mikewang
        29
    mikewang  
       127 天前
    @willx12123 #17 强弱应该是相对的,拿 if 举例,在 C 里面,我们也可以这样直接判断,C 是强类型。
    struct st *foo = ... ;
    if (foo) { ... }
    villivateur
        30
    villivateur  
       127 天前
    有一说一,Python 是强类型语言,建议你自己点个“下沉”,不然太尴尬了,会被人笑的
    yolee599
        31
    yolee599  
       127 天前 via Android
    @DOLLOR #25 但是这个功能需要编辑器支持才行,在网页上看到一段全是 var ,auto 的代码就要在脑子里推断很久,当然也可以拷贝下来粘贴到编辑器里,但麻烦就是了
    vituralfuture
        32
    vituralfuture  
       127 天前 via Android
    python 是强类型,动态类型的语言
    jlkm2010
        33
    jlkm2010  
       127 天前
    动态一时爽,重构火葬场
    yb2313
        34
    yb2313  
       127 天前
    喜欢我**args 吗, 然后再通过各种不可名状的 magic 方法获取到一个值
    kmyzzy
        35
    kmyzzy  
       127 天前
    你说的是静态类型 vs 动态类型,不是强类型 vs 弱类型。
    CodeCodeStudy
        36
    CodeCodeStudy  
       127 天前
    js 的坑更多,就算用 ts 也没办法完全规避,比如:

    一个 number ,有可能是 NaN ,需要用 Number.isNaN 来判断

    一个 Date 对象,比如变量名叫 d ,有可能是无效的,通过 d.toString() === 'Invalid Date' 或者 Number.isNaN(d.getTime())

    这两个坑无法使用 ts 检测出来,因为 NaN 的数据类型也是一个 number ,Invalid Date 的数据类型也是 Date
    whenov
        37
    whenov  
       127 天前 via Android
    你转到 Java 时也转成字典不就好了
    yanqiyu
        38
    yanqiyu  
       127 天前
    道理我都懂,但是 python 是典型的强类型语言。C++反倒是弱类型语言。你指的是动态类型和静态类型的区别
    duluosheng
        39
    duluosheng  
       127 天前
    js 就不如 ts 好阅读,强类型真是更适合大工程
    Rehtt
        40
    Rehtt  
       127 天前 via Android
    前段时间重构 php 也是同感
    bronyakaka
        41
    bronyakaka  
       127 天前
    Python 是强类型!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    DOLLOR
        42
    DOLLOR  
       127 天前
    @CodeCodeStudy
    你说说哪些编程语言是能够通过 type 来区分 NaN 的?
    反正 java 和 python 都不行,都需要专门的 isNaN 来判断。

    // java
    double x = Double.NaN;
    System.out.println(x == Double.NaN); // false
    System.out.println(Double.isNaN(x)); // true

    # python
    import math
    x: float = float('nan')
    y: float = float('nan')
    print(x == y) # False
    print(math.isnan(x)) # True

    你也认为这是 java 和 python 的“坑”吗?
    CLMan
        43
    CLMan  
       127 天前
    @CodeCodeStudy NaN 是计算机为了满足数学需求搞出来的,在浮点数的标准 IEEE754 里面有规定,现代编程语言差不多都支持这个概念(因为都依赖于底层实现),这怎么能怪到 JS 去。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_date

    Invalid Date 有点类似 null ,算个小坑,要在源头( new Date())进行检测(这意味着与其它编程语言并没有太大区别),后续代码并不需要防御性编程。

    个人认为比较坑的,是 Array.isArray()这种需要额外记忆成本(因为浏览器跨框架的原因)的东西。
    matrix1010
        44
    matrix1010  
       127 天前
    跟风 diss 一下 Python: "First Python version I used was 2.2. I am using Python since 2003. I cannot figure out my wife’s Python packaging issues. Skill issue." - Armin Ronacher (Creator of the Flask framework. Engineering at @getsentry)
    shijingshijing
        45
    shijingshijing  
       127 天前
    跟语言种类没啥关系,主要还是文档和流程的问题,你还没有碰到复杂逻辑的代码。
    RoninLee
        46
    RoninLee  
       127 天前
    昨天还是组内建议了不要用 var ,又不写注释,很难读。
    然后下周即将迎来一场 battle ,为啥不用 var 。
    --来自 Java 码农
    FYFX
        47
    FYFX  
       127 天前
    jianchang512
        48
    jianchang512  
       127 天前
    100 个项目里需要重构的能超过 5 个吗,小概率事件谁在乎,快速齐活就完事了
    james122333
        49
    james122333  
       127 天前 via Android
    相信我 就算用的是静态语言 迭代几次也差不多认不得 因为习惯太差 习惯太差或者纯搞事的你是拦不住的 现在最讨厌的就是静态语言 开发太慢了 字典倒是无所谓 反正 vim 类似编辑器可以补全字串
    CodeCodeStudy
        50
    CodeCodeStudy  
       127 天前
    @DOLLOR #42 然而实践当中,java 很少遇到 double 是 NaN 的情况,如果需要表示没有值的话,用 Double x = null; 来表示即可。
    只有 Math 跟数学计算有关的,才会得到 NaN 吧,如果是其他的,如果是参数不正确,通常会抛出异常,而不是返回 NaN 。
    CodeCodeStudy
        52
    CodeCodeStudy  
       127 天前
    @CLMan #43 Invalid Date 算是一个设计失误了,如果 new Date()的参数不正确,应该是抛出异常或者返回 null 的,而不是一个 Date 对象,调用方还要判断 Date 对象的有效性。
    james122333
        53
    james122333  
       127 天前 via Android
    动态语言深入的是语言细节 然而整齐方便程度还得看封装
    LuckyLauncher
        54
    LuckyLauncher  
       127 天前
    “现在国内的现状就是领导疯狂催,程序员疲于奔命,谁天天给你定义类型,认真命名”
    你用 java 通篇给你 abcd 命名你就好维护了
    DOLLOR
        55
    DOLLOR  
       127 天前   ❤️ 2
    @CodeCodeStudy
    Double x = null 恰好体现了 java 一个天坑,没有 null safety 。

    null 居然可以赋值给任意类型,方法的参数总要不厌其烦地判断 if (obj != null)。
    特别的是那个 Boolean 类型,相当于有了 null/true/false 三个值,也得先判断是否为 null 才能在判断 true/false 值。这在别的编程语言看来,都是很荒唐的现象。
    whileFalse
        56
    whileFalse  
       127 天前 via Android
    什么适合职场环境,是发钱的人说了算的,不爽可以辞职
    shmilypeter
        57
    shmilypeter  
       127 天前
    现在还给你写文档?能跑起来就不错了。以前虽然也流动性强但还是以年为单位的流动,现在以月为单位流动,迭代几次真的是连自己都不认得了。
    mekingname
        58
    mekingname  
       127 天前
    先搞清楚什么是强类型语言什么是弱类型语言再来吐槽吧。Python 是强类型语言,JavaScript 这种才是弱类型语言。区分强弱类型,就看 1 + '1' 的结果。报错就是强类型,等于'11'就是弱类型。

    你吐槽的其实是动态语言和静态语言的区别。
    tsohgdivil
        59
    tsohgdivil  
       127 天前
    Python 是强类型,动态类型
    pengdachxx
        60
    pengdachxx  
       127 天前
    @davehandong 你是没有用现代的 ide
    mengzhuo
        61
    mengzhuo  
       127 天前
    @estk Failure!!!
    chainal7777
        62
    chainal7777  
       127 天前
    看到楼上一堆人说 python 说是强类型我就想笑,一个解释型语言说自己是强类型,配吗
    Azure99
        63
    Azure99  
       127 天前
    如果我掏出 Map<String, Map<String, Object>>,阁下又该如何应对?
    yohole
        64
    yohole  
       127 天前
    所以我经常说,从 java 转 python 最难适应的就是这个类型,方法源码和调用链,可以说谁用谁知道
    onion83
        65
    onion83  
       127 天前
    “看不懂就厌恶,看不爽就是屎山”,将个人“代码洁癖”带入职场的人,一肚子怨气,注定 996 35 岁后失业。
    jackmod
        66
    jackmod  
       127 天前
    为了消除 pylance 插件的 warning ,以及自动补完,我加了一堆 assert(isinstance(var, class)) 。
    现代语言是需要现代工具辅助的,尤其是 py 这类特别灵活的玩意。
    crackidz
        67
    crackidz  
       127 天前
    点进来之前以为吐槽 JavaScript 😂
    nowheremanx
        68
    nowheremanx  
       127 天前   ❤️ 1
    @onion83 我反思一下,看别人写的垃圾代码确实会引起反感,尤其是要加代码到我的项目里。 :D
    sunpwork
        69
    sunpwork  
       127 天前
    重点不在语言,而是人。我们公司用 Java ,结构全部是 JsonObject ,各种魔法字符串取值,还沾沾自喜觉得灵活。重构直接火葬场,完全找不到结构
    james122333
        70
    james122333  
       127 天前 via Android
    @sunpwork

    这只是没有额外封装 不是不可以这么做 当然会不会想这么做有原因 基本上给它多个方法 AddField 外加其它方法检验是否有该字段就可以很灵活了
    james122333
        71
    james122333  
       127 天前 via Android
    @sunpwork

    等同于用字典实现类型系统
    fzls
        72
    fzls  
       127 天前
    我现在写 python 和 lua 的时候都习惯加上类型注释,ide 也能解析,维护起来方便很多-。-
    kandaakihito
        73
    kandaakihito  
       127 天前
    @sunpwork 这也太恶心了吧,写这种代码的人过个周末就大概率不知道自己上周写了啥
    fzls
        74
    fzls  
       127 天前
    @qcbf111 #3 加上类型注释,ide 搜引用也方便好多,不然好多地方只能用文本强行搜,不一定准确-。-
    longlonglanguage
        75
    longlonglanguage  
       127 天前
    现在有 ai 了会不会好一点,可以让 ai 读一遍,让 ai 给编一个文档说明
    fzls
        76
    fzls  
       127 天前
    @DOLLOR #17 尤其是需要长期维护的项目,加上类型真的对后面维护很有用
    javak
        77
    javak  
       127 天前 via iPhone
    一开始就用 Java ,现在现在就没你啥事,你就失业了。所以你看,增加就业拉动经济,多好
    Felldeadbird
        78
    Felldeadbird  
       127 天前   ❤️ 4
    不是哥们,你公司因为发展好,所以你才有机会换语言重构。

    这怎么又成批判语言的罪行呢?

    要知道公司成立之初啥都没有,技术选型最快实现业务才是关键。一上来就给搞 java 一套,业务还没开展,开发团队就要几十万,承担不起啊。
    kenvix
        79
    kenvix  
       127 天前   ❤️ 2
    @chainal7777 #62 😅你更是重量级,强弱类型怎么还和解释型联系起来了?
    kenvix
        80
    kenvix  
       127 天前
    @sunpwork #69 乐,我们 Javaer 也要有自己的 kwargs
    lambdaq
        81
    lambdaq  
       127 天前
    你要的不是强类型,是 IDE 里能猜出来自动提示。这一点其实主要是接口不规范。
    jjx
        82
    jjx  
       127 天前
    我即世界
    mark2025
        83
    mark2025  
       127 天前
    @sunpwork 我觉得 TypeScript 的类型很不错了
    happy32199
        84
    happy32199  
       127 天前 via Android
    各有优点吧,强类型报个错模棱两可,找半天不知道哪里问题……
    弱类型直接把行数告诉你……
    satoru
        85
    satoru  
       127 天前
    @kenvix “中国的职场环境”区分不了很正常 (doge
    sir283
        86
    sir283  
       127 天前
    python 只适合调库写点简单的东西,写 web 还是用 Java 、Go 、C++,写 web 用 python 除了抖 M ,我找不到第二种选择它的理由
    w3cll
        87
    w3cll  
       127 天前
    @DOLLOR 确实,每次还得先判断下是否是 null ,就很烦多此一举的感觉,除非把 null 转成 bool ,然后类型一致后再判断
    butterls
        88
    butterls  
       127 天前 via Android
    这是什么防御型编程
    bzj
        89
    bzj  
       127 天前
    @sagaxu 业务复杂的时候,其他语言也一样,这是写代码的人逻辑不严谨,唯一的区别是当遇到对象不存在,其他语言会报致命错误,强制要求重新写,反而其他语言更容易写出屎山代码,而 php 只是报 notice 级别的错误,缺点是容易出 bug
    wonderfulcxm
        90
    wonderfulcxm  
       127 天前 via iPhone
    归因错误😑
    mightybruce
        91
    mightybruce  
       127 天前
    人的问题非要归于语言,不知道豆瓣、谷歌、instagram 大量代码还是 python 吗
    thorneLiu
        92
    thorneLiu  
       127 天前 via Android
    Cpp 我看代码我能知道代码在做啥 python 我只能跑起来加打印才知道:(
    daysv
        93
    daysv  
       127 天前
    弱类型动态语言爽飞, 能根据我的思绪飞翔
    eachann
        94
    eachann  
       127 天前
    笑亖,什么语言根本不重要,出活快才重要。

    特别是小公司,慢点公司都倒了
    oyps
        95
    oyps  
       127 天前
    @ciderzero 运行时 Python 是强类型语言,代码外观上是弱类型,很多类型会藏起来或者误导你,不运行都不知道。Java 和 TypeScript 这种把类型写在明面上的,方便查看分析。
    oyps
        96
    oyps  
       127 天前
    @ciderzero 虽然现在有很多工具和方法去辅助,使得编码时也能方便查看类型,但是以前的屎山不一定会遵循这些约束,本质还是语言的缺陷导致代码编写时不优雅,我个人的观点
    supersu
        97
    supersu  
       127 天前 via Android
    Python 确实是强类型,但是 if "",if []返回 false 又有点不完完全全绝对强类型,这种不知道算不算语法糖,用起来很爽,但是又落下一个不是绝对完全强类型的把柄,哎,两难~
    nuk
        98
    nuk  
       127 天前
    动态类型 map 一把梭这不是很正常的嘛,真要到处继承 class 你又要跳脚了。
    woniuppp
        99
    woniuppp  
       127 天前
    还好中国职场你说了不算
    EndlessMemory
        100
    EndlessMemory  
       126 天前
    关键还是在于赶项目进度,代码质量常常不被重视
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   981 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:19 · PVG 03:19 · LAX 11:19 · JFK 14:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.