在工程上,中文编程的合理性 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Cbdy
V2EX    编程

在工程上,中文编程的合理性

 
  •   Cbdy 2018-11-02 19:46:52 +08:00 3746 次点击
    这是一个创建于 2585 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看了首页几个帖子有感,我也写点东西


    在工程上,中文编程的合理性

    先说观点:我支持“中文编程”

    什么是中文编程

    事实上,中文编程是一个模糊的概念,什么是中文编程?

    1. 所有代码都用英文写,但是有的数据或者数据结构是使用中文算中文编程吗?(大家都是这么干的)
    2. 所有代码都用英文写,但是有的注释是中文算中文编程吗?(我认为一定程度上注释是代码的一部分)(绝大多数大多数国内程序员是这么干的)
    3. 小部分变量名、函数名、类名采用中文命名,大部分采用英文命名以及或者中英文混合的命名算中文编程吗?(很少有人这么干)
    4. 所有变量名、类名、函数名使用中文命名,只有关键字采用原语言的的关键字算中文编程吗?(除了 Python2 和 Golang,其他流行语言都支持的很好)
    5. 所有变量名、类名、函数名、关键字、注释都使用中文才算中文编程吗?(易语言)

    如果我说 2 甚至 1 也是中文编程也不过分吧?因为中文是我们生活的一部分,编程也是是人民群众生产生活的一部分,我们的语言、我们的解释、我们的交流的载体就是中文,无论如何都是绕不开的。全部使用英文是脱裤子放屁

    我定义的中文编程是 3,或者说,实际是:“一定程度上合理采用中文的编程方式”。我认为在工程上,采用这种方式或许能够提高我们的工作效率、降低我们的沟通成本

    程序设计里的难题

    Phil Karlton: There are only two hard things in Computer Science: cache invalidation and naming things.

    取名字

    众所周知,取名字是很难的。我在 V 站看到无数次:老婆生了,是男(女)娃,求名字。

    程序设计也是如此,我们写完程序会花很多时间读自己的代码,好的名字可以降低我们读代码的思考成本,使我们更专注于设计。因为我们生活在中国,写的程序大多也是给中国人用的,所以很多“实体”用中文描述可能是更合理的,我们的程序员中文才是母语,同样取名字,用中文很大几率能够取出比英语更合适、更贴切、更易懂的名字,甚至他的同事一看就知道他想表达什么。

    多余的注释

    类似如下的代码,传统的写法

    // 下订单 var params = { customer: '张三', product: '00010001' } var order = placeOrder(params) 

    使用中文编程

    var params = { 客户: '张三', 商品: '00010001' } var 订单 = 下订单(params) 

    如果使用中文编程,在有的时候,我们就可以把一些嗦注释省略掉了

    难取的名字

    如果我们做一个封神题材游戏,里面有很多神话人物,我们需要为每个神仙取个名字吗?或者是一个三国题材的游戏,武将的名字怎么取?

    我认为最好的方法是:该叫啥叫啥

    var 雷震子 = { 名字: '雷震子', 武器: ['雷公凿'], 阵营: '天庭' } var 哪吒 = { 名字: '哪吒', 技能: ['混天绫', '火尖枪'], 阵营: '天庭' } 

    我实在不知道怎么翻译哪吒或者混天绫,只能使用拼音拼音还不如汉字呢

    为什么不全部使用中文?

    答案很简单,因为编程需要英文。

    抽象泄漏

    Wiki

    我们的程序的基础是英语构建的。

    • 我们的操作系统是 C 语言写的,源代码使用的是英语单词,注释也是英语,最好的文档也是英语
    • 我们的网络协议栈是 C 语言写的,源代码使用的是英语单词,注释也是英语,最好的文档也是英语
    • 我们的高级语言虚拟机、解释器是使用 C/C++写的,源代码使用的是英语单词,注释也是英语,最好的文档也是英语

    做程序员离不开英语,当我们遇到问题(我们肯定会遇到问题),最后还是要解决这些棘手的“英文”问题。

    试图依靠一层薄薄的封装彻底解决英文的问题(比如易语言)是天方夜谭,也是一种幼稚除非他能把计算机科学的大厦的基石换掉,否则英文会渗透出来

    我们的传统

    在人民群众几十年的程序设计事件中,我们总结出很多有用的方法和设计,有些名字已经约定俗称,采用原名子是最合理也是最经济的

    • 我们熟悉的流程控制关键词:whileforswitchif
    • 代理:Proxy
    • 委托:Delegate
    • 工厂:Factory

    使用中文不是一刀切,因为使用中文不是目的,是手段,程序员的目的是高效地写出程序,满足用户需求。只是在使用中文更加合适的场景使用中文,在使用传统的英文更合适的场景,应当使用英文

    现状

    绝大多数语言无痛满足符合定义 3 的中文编程,包括 Java、C++、Javascript 等很流行的语言,只要想就可以做,而不是像有的人想的一刀切的方案,比如易语言

    在实践中,我们可以慢慢引入中文,比如一些枚举、常量或者很难取英文名的变量

    手段而非目的

    中文编程只是手段,我们身边有很多编程工具和理论。他们很大程度上都是为了高效地写出健壮、可维护性好、满足用户需求的程序

    中文编程也可以理解为一种方法理论,就像《代码整洁之道》里面的各种方法,中文编程在有的场景可以让代码更加清晰整洁,更好维护。

    如果是这样,在工程上,何乐而不为呢?

    13 条回复    2019-05-26 07:43:42 +08:00
    boris1993
        1
    boris1993  
       2018-11-02 20:54:03 +08:00 via Android
    下订单的例子个人不认同,这不是注释的锅,这是写代码的人英语不行的锅

    var order = { customer: '张三', product: '00010001' }
    var isSuccessful = placeOrder(order)

    稍微有点英语常识的人都可以看出,order 是订单不是命令不是顺序,placeOrder 就是下订单没啥好说的,isSuccessful 是 placeOrder 成功与否的状态,换成中文没有任何意义

    同时我是坚定不支持用中文关键字和 /或中文命名的这种中文编程的。原因就是我认为没必要。

    关键字就那么几个,还是英语高频词,从小学到大学上了这么多年英语课,愣是能不认识这几个字?

    命名的话,通用词汇直接上翻译 /词典 /问别人,专业词汇就上专业词典,大不了写一行注释,能费多大事

    至于英语,您也说了,编程的世界是由英语构成的,英文社区就是比中文社区内容丰富。英语这东西,迟早要学好用熟,跑不掉的。既然如此,继续拿英文写程序不就得了,何必再搞一套纯中文的?为了文化自信?
    chanin
        2
    chanin  
       2018-11-02 20:56:50 +08:00
    中国这个神奇的民族,什么东西都能弄变味道,论基础教育的缺失性!
    chanin
        3
    chanin  
       2018-11-02 20:58:08 +08:00
    @chanin PS 看看学 E 语言那帮大傻逼!就知道哦中文编程会变成什么样子了
    xzc19970719
        4
    xzc19970719  
       2018-11-02 21:02:16 +08:00 via Android   1
    我也是个自学的初学者。。老被人笑用中文变量名总有人说辣眼睛 可是我自己写的学习用 自己看着舒服不就行了嘛 还可以少写注释。。如果以后工作了 团队规定怎么写 我就怎么写 只不过英语不太好 还是得多靠谷歌翻译了
    helionzzz
        5
    helionzzz  
       2018-11-02 21:03:06 +08:00
    这种所谓的汉化编程除了方便不会英语的初级开发者之外没有任何作用
    boris1993
        6
    boris1993  
       2018-11-02 21:24:14 +08:00 via Android
    @xzc19970719 #4 建议尽快养成英文的习惯。我司有个内部应用,变量和表名列名全是拼音首字母简写,如果不给你写注释,你知道 gjjjs 是啥东西吗?然而,他们确实好多地方,就是没有注释,就是口口相传和大胆猜。
    boris1993
        7
    boris1993  
       2018-11-02 21:25:05 +08:00 via Android
    @helionzzz #5 然后走上了日本的老路,自己搞了一套与外界不兼容的东西还美滋滋 /狗头
    woodensail
        8
    woodensail  
       2018-11-02 21:29:57 +08:00 via Android
    中文编程可以,但是你只能用不超过 100 个字符,要不键盘放不下。
    trait
        9
    trait  
       2018-11-02 21:31:21 +08:00 via iPhone
    1. 字符替换不是中文编程,non-ascii identifier 现代语言基本都支持
    2. 讨论这种问题之前先去读几本 PL 书,中文编程在于汉语背后这套语言,跟汉字无关
    carlclone
        10
    carlclone  
       2018-11-02 22:30:39 +08:00
    你以为注释只是用来理解这一小段代码吗....注释可以用来分隔过长的一段逻辑(历史遗留常见现象),还可以打锚点用
    innoink
        11
    innoink  
       2018-11-02 22:33:25 +08:00 via Android
    实现伟大复兴之后,整个世界都是中文的
    xuanwu
        12
    xuanwu  
       2019-05-07 11:09:55 +08:00
    ”使用中文不是一刀切,因为使用中文不是目的,是手段,程序员的目的是高效地写出程序,满足用户需求。只是在使用中文更加合适的场景使用中文,在使用传统的英文更合适的场景,应当使用英文“
    -- 很赞同!欢迎到专栏或者 github 组(或其他渠道)一同探讨中文命名的实践。
    testeststs
        13
    testeststs  
       2019-05-26 07:43:42 +08:00
    @chanin
    学 e 语言的人相对来说傻逼,不是因为学了然后傻逼;
    而是一般英文不太好的人才去学易语言,而一般英文不太好都是没受过良好教育的,或者上学时成绩差的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     852 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 19:27 PVG 03:27 LAX 11:27 JFK 14:27
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86