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

这就是我为什么从 PHP 转向 Go 的原因

  •  
  •   wangbenjun5 · 2020-04-01 22:22:32 +08:00 · 16482 次点击
    这是一个创建于 1681 天前的主题,其中的信息可能已经有所发展或是发生改变。

    记得以前有一次面试,面试官是一个和我年龄相仿的人,他就 PHP 里面 count 的用法连续问了我很多情况下的结果:

    count(0);
    count('00000');
    count("0")
    count(1)
    count(null)
    count("null")
    count($undefinedVariable)
    ...
    

    平时一般只会用 count 去计算数组或集合的元素个数,没想到还有这么多种情况,就一下子被问到了,只怪自己基础不扎实,没把 PHP 的手册背下来。。。

    很多 PHP 的内置函数令人非常头疼,很多函数有很多功能、可以接受各种参数,返回的结果更无章可循,相比之下,go 的内置函数就非常简单明了,其参数类型固定,基本上一个函数只干一件事。

    在写 PHP 的时候,每次调用别人写好的函数都非常不放心,因为你根本不知道这个函数返回的结果是什么东西,它可能是数组、可能是字符串、也可能是个数字。。。即使函数有注释也不一定可信,这其中有部分原因是因为开发人员水平较差,但是 go 的类型限定保证了一个函数只会返回一个固定类型的结果。

    写 PHP 的时间越久你就会发现 PHP 的弱类型带来的好处远远大于坏处,项目写到最后几乎无法维护!而且里面会出现各种各样的奇怪 bug 。虽然说良好的编程习惯和规范可以避免部分情况,但是很多时候你没法通过这点保证。

    使用 PHP,一个接口写完,很多时候心里压根没底,但是用 GO,写完只要编译没报错,基本上都没问题。

    第 1 条附言  ·  2020-04-02 12:39:31 +08:00
    只是一小方面,如果换个时髦的说法,那就是写 go 的心智负担要小很多,php 虽然灵活,但不确定性太多。
    第 2 条附言  ·  2020-04-02 12:49:20 +08:00
    不是说弱类型就一定有问题,PHP 的很多问题不是弱类型导致的,而且设计之初就留下的坑,比如毫无规律的函数命名方式、无章可循的参数顺序,你找不到边界。。。现在最新的 php7+已经在类型上面做文章了,这是个好事
    155 条回复    2020-04-09 16:17:05 +08:00
    1  2  
    encro
        101
    encro  
       2020-04-02 13:52:14 +08:00   ❤️ 1
    PHP 开发,
    首先要做的事就是开启 notice 级别错误,
    然后编程时候用 7.0+版本,
    所有函数参数,类属性都加上类型,
    这样代码提示等都会非常友好。
    ideacco
        102
    ideacco  
       2020-04-02 13:52:32 +08:00
    我们公司帮人做过软件开发,然后客户要求我们代码部署到他们的服务器上,然后。。。。。为了防止源代码泄露,我们那个项目就开始用 Go 写了。。。
    KasuganoSoras
        103
    KasuganoSoras  
       2020-04-02 14:19:00 +08:00   ❤️ 9
    6 年 PHP 开发路过,看了楼上的回答,无非都是 “弱类型” “函数命名” 的问题,这些是问题么?根本不是。

    弱类型问题完全可以自己判断一下,简单点用 === 进行强制类型判断,或者 is_string is_int 等等函数完全可以用来判断类型,还有楼上说的 Key 问题,在 PHP 里面 $arr[1] 和 $arr['1'] 都是一样的。或者如果你想把 PHP 玩成强类型语言,那么,PHP 7.4,请。

    函数命名问题呢?觉得函数命名记不住的多半都是框架的受害者,长期使用框架导致记不住内置的函数,但凡是写过一两年原生 PHP 的都不至于记不住内置函数名。例如 LZ 问的面试题,count 除了 null 和 [] 以外,其他值全部都是 1,类似的还有 empty 函数。只有写原生写得多的,踩的坑多了,才会知道这些问题,长期依赖框架的话,各种可能看得见的问题全都被框架自行处理了,剩下你看不到的问题在项目上线运行后就全出来了。

    “项目写到最后几乎无法维护”,这是不存在的,只要文档写好,注释写好,没有什么不可维护的项目,以前我经常从一些不正经的开发论坛上找那种什么 PHP 发.卡之类网站源码来自己改,那代码写的真的是屎.山,我都能给它全部改的工工整整而且还修好了一堆的 bug,顺便再套个新 UI,全都是手写原生,不依赖任何框架。

    少用点框架,多写点原生,这才是写 PHP 的真谛


    对了,我的编辑器是 Np.p,什么 IDE 都没用过,纯靠大脑来语法检查,甚至补全功能都可以不用开。
    charlie21
        104
    charlie21  
       2020-04-02 14:46:43 +08:00   ❤️ 2
    每次调用别人写好的函数都非常不放心
    心智负担要小很多

    。。。
    说白了,这还是无法处理 “遇人不淑 / 猪队友” 的愤怒,和 PHP 又有什么关系
    RipL
        105
    RipL  
       2020-04-02 14:49:13 +08:00
    要说心智负担小应该写 java
    Zackkkk
        106
    Zackkkk  
       2020-04-02 14:53:14 +08:00   ❤️ 1
    你的吐槽,得出结论:搞 Java
    Flourite
        107
    Flourite  
       2020-04-02 14:56:48 +08:00
    脚本语言都有这种问题,尤其是 php,一个方法返回的结果可能有无数种,上层各种 if/else 判断,一个文件上万行代码,根本没有设计 /维护可言
    vitoliu
        108
    vitoliu  
       2020-04-02 14:57:35 +08:00
    @KasuganoSoras 说的真厉害,佩服
    mokeyjay
        109
    mokeyjay  
       2020-04-02 15:45:04 +08:00   ❤️ 1
    @KasuganoSoras #103 补全都不开?那是真的牛逼
    KasuganoSoras
        110
    KasuganoSoras  
       2020-04-02 15:48:45 +08:00
    @mokeyjay #109 以前还在用记事本写代码的时候连语法高亮都没有,更别提什么补全了,时间长了已经习惯了
    yxzblue
        111
    yxzblue  
       2020-04-02 15:58:45 +08:00
    @KasuganoSoras 说的真真厉害
    LokiSharp
        112
    LokiSharp  
       2020-04-02 16:07:28 +08:00
    @KasuganoSoras #110 哈哈,我想起了以前直接在 WordPress 编辑器里折腾主题和插件的样子
    KasuganoSoras
        113
    KasuganoSoras  
       2020-04-02 16:13:50 +08:00
    @LokiSharp #112 我最早写 PHP 的时候是因为想给自己 Minecraft 服务器做个官网,那时候哪知道什么 IDE,高级编辑器,拿个 Windows 记事本就开始写了,写了半年多才有人告诉我有 Np.p 这种东西,然后就一直用到现在了
    paoqi2048
        114
    paoqi2048  
       2020-04-02 16:39:15 +08:00
    go,🏊‍滴神!
    uxff
        115
    uxff  
       2020-04-02 16:56:55 +08:00
    @KasuganoSoras 你有没碰到大量的函数看似返回值一致但是返回值不一致,弱类型的返回值导致你开发过程对返回值猜测的太心累。别人的类接口上注释不好的时候,你必须运行一次才能知道返回值。而在强类型语言下,ide 能帮你快速解决这些问题。
    uxff
        116
    uxff  
       2020-04-02 17:01:11 +08:00   ❤️ 1
    楼主说的,所有弱类型语言都有这个通病。开发 js 项目,python 项目,lua 等,都很头疼,发现 ide 再强大也无法猜测你的返回值。
    有人说是函数类接口注释写的不规范。这些东西的约束,真不如用强类型语言来帮你约束,编译过程强制约束让开发者遵守。
    强类型语言开发过程中 ide 提示会让效率提高很多很多,不心累。
    我认为开发效率还是强类型更高更舒服。
    abcbuzhiming
        117
    abcbuzhiming  
       2020-04-02 17:03:33 +08:00   ❤️ 3
    @KasuganoSoras
    现代编程的真谛,说白了就是逐步把一些以前要求很高的编程需求,变成让大部分工具人也能干的活。所以,“纯靠大脑来语法检查,甚至补全功能都可以不用开”,厉害吗?当然厉害,这是你的父母给你馈赠了一个厉害的大脑。但是如果我站在你面前,听到你这么描述你正在做的事情,我一定会嘴上夸奖你,然后一定想方设法把你换掉,因为你是一个巨大的风险——很多人不具备你有的这种天然的能力,项目严重的依赖着你的个人能力,屎山都能改好的人确实牛逼,但是这也意味着这个项目离了你就玩不转了,那这不是巨大的风险是什么呢?

    为啥现代编程工程化越来越不喜欢动态语言,为啥前端 js 也被 ts 替代,说白了,就是要消灭这种风险。所以,你夸耀的能力,反而进一步暴露了,PHP 确实有这样的问题
    Rwing
        118
    Rwing  
       2020-04-02 17:05:59 +08:00
    C# 你值得拥有
    KasuganoSoras
        119
    KasuganoSoras  
       2020-04-02 17:20:01 +08:00   ❤️ 2
    @abcbuzhiming #117 没错,所以我除了写 PHP 以外,还去学了 Java 学了 Go,三种语言混着用,前所未有的舒适。PHP 负责做网页端,Go 处理高并发,Java 做通讯,写 API 。PHP 确实有一些缺点,不过只要有适当的技巧,就能把缺点利用起来。当然,也可以像我一样,用其他语言来填补 PHP 的不足,实现灵活开发 + 省时省力。

    “但是这也意味着这个项目离了你就玩不转了” 所以我成了管理和策划整个项目的人 🐶
    Sapp
        120
    Sapp  
       2020-04-02 17:25:18 +08:00
    js 也有这种奇葩问题,但是现在貌似已经没什么人问了
    fanqianger
        121
    fanqianger  
       2020-04-02 17:52:16 +08:00
    据说 facebook 还是用的 php 的变种叫做 hack 。facebook 要你去写 php 你去吗
    justfortest
        122
    justfortest  
       2020-04-02 17:56:20 +08:00 via Android
    因为动态类型或者弱类型转语言,以为静态类型好维护代码质量高,往往最后被打脸,还是 naive
    justfortest
        123
    justfortest  
       2020-04-02 18:03:20 +08:00 via Android
    @wangbenjun5 建议你用 go 多些一些测试看看,看看写测试是不是很恶心
    dragonbuf
        124
    dragonbuf  
       2020-04-02 18:18:43 +08:00   ❤️ 1
    @wangbenjun5 我强行推的 php7.4 。这种 count 直接抛异常,哈哈,心智负担小了不少。省的整天关心这个
    gigantic222
        125
    gigantic222  
       2020-04-02 18:28:07 +08:00
    在公司 php 和 go 都用,使用 php 主要是因为出活实在太快了,借助框架和一些规范比如参数优先使用类和接口,也能保证项目质量,用 symfony 用出了 spring 的感觉。fpm 这种模式可以在写业务的时候顾虑更少,况且 7 以后的性能显著提升,还可以限制类型。

    用 go 类型优势明显,我一般改一个需求直接从源头的 struct 下手,跟着提示报错一步步改过去。最方便是异步编程和与 docker 的契合。用 php 可能你要借助队列或者 swoole 这样的框架,而 go 在语言层面的支持着实给力。go 的一些基础包比如 http,io,sync,encoding 等都巨好用,源码值得一读。测试和部署作为重要的一环,在 go 这里都变得容易了,跨平台的编译,docker,k8s,真香。

    当时是学习 MIT 分布式课程入坑,现在觉得没白学啊。。
    beidounanxizi
        126
    beidounanxizi  
       2020-04-02 18:30:54 +08:00
    说真的确实 go 心智负担 很小
    liuxu
        127
    liuxu  
       2020-04-02 18:35:45 +08:00
    php7 想尽办法优化 zval,相对于 php5 的 zval 是大刀阔斧重构,zend_array 等类型更是绞尽脑汁重新设计,为了提升性能,已经到想到用物理顺序的内存存储链表。

    最后到你这里一句话弱类型不好。。。
    secondwtq
        128
    secondwtq  
       2020-04-02 19:17:07 +08:00   ❤️ 2
    @liuxu 优化问题和语言问题不要混在一起
    就好比一个厨子把自己做的菜”优化“得很好,但是客人不吃肉 /辣椒 /香菜,优化半天白瞎
    RRRSSS
        129
    RRRSSS  
       2020-04-02 19:18:30 +08:00
    其实不是 PHP 和 Go 的比较,是强类型语言和弱类型语言的比较
    sagaxu
        130
    sagaxu  
       2020-04-02 21:27:36 +08:00 via Android   ❤️ 1
    关于类型系统,可以大概看一下 2010 年之后出现的语言,有几个是动态弱类型的? dart2 不也改成强类型了。

    php 的所谓特色,没有一个被人抄了,这还不够说明问题?

    假如放弃短平快,按照 oop 方式开发,那写起来跟 java 或 go 之流也没多大区别了,干嘛还用 PHP ? php 所谓开发效率,在 2015 年之后,已经没有明显优势了。
    gamexg
        131
    gamexg  
       2020-04-02 21:38:04 +08:00
    动态一时爽,重构火葬场是真的体验过。

    对一处代码的修改不知道会影响多少其他代码。
    当然完善的测试覆盖能够减小影响,但是又有多少项目能够保证全部细节都覆盖了?

    顶级大神能够做到全部人脑搞定,
    但是我做不到, 所以我还是老实的用静态类型语言依赖 ide 查找依赖,编译器检查错误吧。
    secondwtq
        132
    secondwtq  
       2020-04-02 22:30:20 +08:00
    我没学过 PHP,但是我说一点我的观察:楼主所谓的“设计之初就留下的坑”,很大程度上是设计者最开始的动机就有问题。

    根据 PHP 的维基百科页面所述 https://en.wikipedia.org/wiki/PHP:
    “Early PHP was not intended to be a new programming language, and grew organically, with Lerdorf noting in retrospect: 'I don't know how to stop it, there was never any intent to write a programming language [...] I have absolutely no idea how to write a programming language, I just kept adding the next logical step on the way.'"

    可见 PHP 的设计者最开始并不知道该怎样设计编程语言,甚至本来就没想设计一个好语言出来,仅仅是为了满足自己手头的需求。
    当然,就算一个人对“设计语言”这件事真正上心,想做一个好语言,而不仅仅是一个短期好用的工具,这个人本身也要有足够的水平。
    这两点是一个好语言的最基本前提。PHP 在第一点上摔了,Go 貌似在第二点上摔了。

    https://zhuanlan.zhihu.com/p/66349646
    yuwangG
        133
    yuwangG  
       2020-04-02 22:55:02 +08:00
    Warning: count(): Parameter must be an array or an object that implements Countable in Command line code on line 1
    int(1)
    xingfu0539
        134
    xingfu0539  
       2020-04-02 22:57:38 +08:00 via Android   ❤️ 1
    先不说 php,这面试题太 low
    jhdxr
        135
    jhdxr  
       2020-04-02 23:22:11 +08:00
    @xingfu0539 同感,这种会导致报 warning 的用法,知道不应该这么用就够了,再去深究返回值意义不大。
    写项目难道都奔着产生尽可能多的 warning 但程序居然还能正常跑完这种情况去么。。。在违法的边缘试探.jpg
    liuxu
        136
    liuxu  
       2020-04-03 00:20:10 +08:00 via Android
    @secondwtq 所以我想表达什么意思你就没过脑子理解一下,语言学家们
    explore365
        137
    explore365  
       2020-04-03 00:33:27 +08:00
    PHP 是最好的语言
    secondwtq
        138
    secondwtq  
       2020-04-03 02:27:49 +08:00
    @liuxu 那不妨把你想表达的意思以更直接(也就是更“傻瓜友好”)的表达表达出来?

    我个人的理解,你的意思是楼主对 PHP 的抱怨,是对 PHP 团队工作的不尊重。
    我的意思是,PHP (实现)团队在优化方面尽力了,但是无力改变 PHP 语言本身设计的一些问题。用极端点的话说就是,路线错了,知识越多越反动。
    楼主也并没有抱怨 PHP 有性能问题,只是觉得 PHP 不适合自己而已。
    a132811
        139
    a132811  
       2020-04-03 04:09:53 +08:00   ❤️ 1
    你说的这个缺点,在别人眼里就是强大的隐式类型转换,简单、耐操呀。

    准确的说,你说的这种问题还不是弱类型的通病,python 也是动态语言,人家可是强类型,只不过不强制类型检查而已。

    强类型+类型系统 才能解决这个问题。这方面,动态语言中,我觉得 typescript 做得最好,这个是前端界开发的趋势。

    go 的类型系统其实很一般,太简陋了,现在还缺乏泛型、异常以及成熟一点的包管理,现在的 module 还是有问题,无法解决冲突。模块依赖我认为 deno 的 方案最好
    xingfu0539
        140
    xingfu0539  
       2020-04-03 09:38:56 +08:00 via Android   ❤️ 2
    @jhdxr 好多面试官问“回”字有几种写法,不但没意义,还显示自己水平低下
    Eds1995
        141
    Eds1995  
       2020-04-03 09:44:18 +08:00
    @ideacco 然后被反编译了
    JB18CM
        142
    JB18CM  
       2020-04-03 09:44:58 +08:00
    PHP 又被黑了? 强调一篇, PHP 是世界上最好的语言
    NiZerin
        143
    NiZerin  
       2020-04-03 09:51:11 +08:00   ❤️ 1
    zkqiang
        144
    zkqiang  
       2020-04-03 11:01:27 +08:00
    弱类型和强类型本身就不应该放一起讨论,双方都有优劣势。

    虽然团队项目中强类型更和谐,但是自己撸项目,你知道弱类型是多爽吗...

    而且像爬虫这种项目,用强类型还是会一堆泛型或者 interface{} 这种。

    所以,建议用 Python 黑 PHP (狗头
    bnm965321
        145
    bnm965321  
       2020-04-03 13:02:11 +08:00
    一年前写 python 喜欢加 type hint.

    之后学了 typescript 觉得 python 的 type hint 是个残废,就懒得写了。通过单元测试也能保证质量
    handsomehaitao
        146
    handsomehaitao  
       2020-04-03 14:06:52 +08:00
    你可以使用 7.4,可以定义函数的返回值类型
    liuxu
        147
    liuxu  
       2020-04-03 14:19:39 +08:00 via Android   ❤️ 2
    @secondwtq
    动态类型和静态类型没有谁好谁坏,观点错了,脚本语言和编译型语言有什么好与不好的。各位却因为某种不是缺点的事实,先入为主的说它有毛病,这是偏见。脚本语言很多,为什么楼主会点名挂姓 php 不如 go ?为什么没说 lua 不如 go,python 不如 go,ruby 不如 go,nodejs 不如 go,这个问题你们可以想想。

    不知道各位有没有学习过 lua,Linux script,python,ruby 等等。如果你知道 lua 中 0 也是 true 时,会不会更觉得匪夷所思,会不会说 lua 不如 go 。但 lua 在各种地方的应用,是否还要说因为它是动态类型所以也不好?因为 php 同样使用了动态类型,就以 php 为炮灰说 php 不好。

    一个语言好不好,或者说一个软件好不好,可以从它本身的效率,bug,生态,开发组负责程度,版本更新质量来评价。这些从 php 中你能挑出什么毛病出来吗?效率已经有了多倍提升,bug 你遇到过几个?生态敢说不好?从 php7 就知道开发组的贡献,php7 现在的版本更新都是跨越性的。

    现在 v2 就有一种风气,说“php 不如 go,快来用 go 吧”。我不是很理解这个观点,就像在 18 年前后,v2 一堆人说“”php 不如 nodejs,快来用 nodejs 一样”。问下你们都是一批人吗?

    建议各位平时看帖关注下发帖人信息,有这么一批账号,在 17 年 18 年初左右注册,时隔一年两年后会发某种争议性的话题。
    我不是暗指什么,我就想说明一下这种现象。

    有点意思。
    vtoexwj
        148
    vtoexwj  
       2020-04-03 14:48:10 +08:00
    标题是病句?
    GreyYang
        149
    GreyYang  
       2020-04-03 14:51:43 +08:00   ❤️ 1
    secondwtq
        150
    secondwtq  
       2020-04-04 04:57:26 +08:00   ❤️ 1
    @liuxu #147 你这个回复信息量有点大,一点点说

    首先,我在 #128 和 #138 的回复,都是表达“把‘语言本身’和非‘语言本身’的东西”分开的意思。
    然后,就我个人而言,我并没有说哪个语言“不如”哪个语言,或者哪种语言“不如”哪种语言的意思。比如我在 #138 说的是“PHP 不适合自己”,而不是“PHP ‘不好’”,也就是说我认为楼主本主题表达的是个人观点,但是为什么这个“个人观点”(以及如你所说,本站其他人的“个人观点”)听起来就好像“哪个语言‘不如’哪个语言,或者哪种语言‘不如’哪种语言“呢?

    我先说我的个人观点,对于”动态类型和静态类型没有谁好谁坏“,”脚本语言和编译型语言有什么好与不好的“这种言论我不评价,我个人偏向于说”不同的语言以及不同种类的语言适合不同的场景“。
    比如静态类型语言在”交互式使用“的场景下一般就不如动态类型语言好用,我目前没见过静态类型语言有好用的交互式 shell 。
    但是说到(虽然楼主一直没说但是你一直在说的)性能问题,静态类型语言的”性能天花板“是要比动态类型语言高的,我不止一次说过这个问题: https://v2ex.com/t/594287#r_7803900 https://v2ex.com/t/632869#r_8401400 然而换到另一个角度,这个性能天花板有多重要,到底什么时候能达到性能天花板,这又是另一个问题。

    很多人没有意识到的一件事是,我们现在说的话,做的决定,干的事,都是建立在大量的假设( assumption )下的,这些假设,很多人习以为常但是并不自知(有时我们把这种东西叫做“常识”)。比如上一段说的性能问题,是建立在现有主流计算机体系架构的前提下的,如果换到一个不同的架构中,结论可能会不一样。
    接受和学习新东西的过程,很大可能伴随着”不断发现并打破自己原有的假设“的过程(现在某些人喜欢用”重建三观“之类的词来表述这一过程)。
    比如数据库这东西,十年前可能大多数人会觉得数据库一定要有 SQL,没有 SQL 不叫数据库,NoSQL 火了之后才发现原来数据库可以有其它的形式。
    有些老一辈就有”网上的一定是骗人的“之类的假设,如果不能打破这种假设的话,肯定是不能享受各种互联网应用的。
    注意这个“发现并打破原有的假设”的过程,是在新事物的输入下,被动触发的。而相应的可以认为,创造新东西的过程,则是主动的”寻找未被打破的假设并试图将其打破“的过程,这些”未被打破的假设“,很大概率上就是大家”习以为常但是并不自知“的。
    比如 GPU,最开始只是拿来显示界面和玩游戏的,你需要信号转换就给你加信号转换电路,你需要 3D 投影和灯光就给你加投影灯光电路,我就满足我手头的需求就可以了。后来有人发现游戏越来越复杂,总加功能不是个事,该改变模式了,于是把其中的某些组件做成了可编程的,大家写的游戏花样也越来越多。这时候它名字还叫 GPU,宣传还是游戏画面多么好。后来有人从这坑里面跳出来了,发现这东西跟 vector processor 有啥区别呢,能编程算力又高,好像没人规定我只能做 rasterization 吧,于是 GPGPU 出现了。又过了十几年 GPGPU 的风把老黄吹上风口了,图形领域一群无聊的人在比谁的全局光照和光线追踪算法效果更好效率更高,老黄告诉他们我在 GPU 里面把这东西做进去了,你们软件的问题我用硬件解决了,现在是你们发挥的时候了——NVIDIA 的人在 DXR API 教程中说:”在 Programmable Shading 刚刚引入的时候,很多人以我们根本无法想像的方式使用这个功能,做出了很多奇奇怪怪的效果( https://www.shadertoy.com ),现在又有新的功能了,并且它是可编程的,我希望能复制当年的盛况,硬件 Raytracing 的能力并不仅仅能用来做 Raytracing,或者说,Raytracing API 并没有’正确‘的用法( There isn't a 'Right' way to use Ray Tracing.)“

    再有,哥白尼所提出的“日心说”,其实按照现在的观点并不完全“正确”,然而它在历史上依然有很重要的地位,就是因为在当时的环境下“地心说”属于“习以为常但并不自知”的东西,哥白尼思考、 挑战并打破了这一“常识“。
    哥白尼这个例子的有趣之处在于,哥白尼所打破的常识(假设),是在特殊的宗教环境下形成与维持的。这种“特殊环境”和本站有一定的相似之处——本站的主体用户群体是所谓“互联网”行业的程序员,所开发的东西大体也类似,所以本站的大多数言论,其实都是在“程序员”“互联网行业”“互联网应用”甚至”男性““一二线城市”之类的假设之下。

    而我前面说了,很多人无法意识到自己平常所做的“习以为常但并不自知”的假设,所以会轻易地无视掉这些假设,对自己的观点进行 generalize——比如某语言在互联网行业不好用,那就是没用的语言;某技术我用着不对付,那就是垃圾的技术,这就构成了你看到的“某语言‘不如’某某语言”的言论。
    这并不限于本站,其实大多数人都是这样,我上面说了:创造者打破假设,学习者的通过跟随创造者的脚步,才能意识到“啊,原来还可以这样”。大多数人并没有足够的“寻找并打破假设”的能力(或者说可能有这个能力,但是没这个意识),所以大多数人并不能创造出什么新东西来。
    但是这种能力的缺失的锅,我认为不能甩到“大多数人”身上,毕竟一个人从出生开始,就被社会进行各种各样的规训,大多数人接受的教育也并不注重这方面的内容——这些规训和教育,都是让你接受并巩固已有的东西(思维定式)的过程,接受的越多,就越有可能成为社会合格的螺丝钉,也越没可能发现并跳出假设。(有没有可能不接受这些假设,从而让自己成为一个彻划时代的创新者呢?不太现实,我认为文明的一个重要前提是知识的代际传递,拒绝前人知识与这一点相悖)

    还有一种可能,就是人们能够意识到自己所做的一些假设(比如“仅适用于互联网行业”活着“仅仅是我的个人体验和个人观点”),但是在发表言论时,并不会有意对这些假设进行说明。这个锅同样也不能甩到“大多数人”身上,因为我们做了无数多的假设,没人能枚举整个上下文中所有的假设,更不能完整地写出来。自然语言的局限性要背一部分锅,毕竟在编程语言中,每个变量是什么值,每个结构是什么意思,上下文中有什么东西,都可以通过查源码和 spec (如果有的话)来严格地定义,自然语言做不到。

    简单来说可以认为,本站的大多数帖子中,当出现“某语言不如某某语言好用”这样的言论时,脑内需要自动变换为“某语言在互联网项目中不如某某语言好用”,甚至“某语言我用着不如某某语言好用”。所以我对楼主主题内容的理解是“楼主认为 PHP 不适合自己”。

    这是我对你所说的“V 站怪现象”的解释。(当然,我并没有做“某个人或者某群人存在奇怪的恶意”这样的假设,我在这里额外做的假设是“楼主,以及大多数发表类似言论的人,表达的都是自己真实的个人感受”)
    值得一提的是,这个理论和 Elon Musk 以及 Jim Keller 等人经常说的“First Principle”有一定相似之处。按照 Jim Keller 的话说:”(Elon Musk) has a deep belief that no matter what you do, it's a local maximum…Elon was good at taking everything apart and what's the deep first principle. That ability to look at it without assumptions and how constraints. And that's super fun and he's into it“ (
    ) 很明显他认为 Elon Musk 是有很强的“寻找并打破假设”的能力的。
    secondwtq
        151
    secondwtq  
       2020-04-04 04:58:47 +08:00
    说回之前的回复。

    我前面说本站很多帖子都包含“程序员”“互联网行业”“互联网应用”等隐式的假设。这个列表还可以继续扩展,对于大多数帖子而言,还包含一个假设,就是“对编程语言没有系统的了解”。很多人容易将编程语言的设计、编程语言的实现、编程语言的生态等问题混在一起谈。
    这也并不是本站独有的特点,国内就算科班的教育很多方面也是不合格的,站内以及行内很多人入行也只是为了恰饭而不是真有什么技术热情。出现一群信奉“地心说”的人大谈天文学的现象一点也不奇怪。

    虽然这些概念容易混,但是稍微注意一下应该还是能分清的。所以我试图在 #128 提示“语言”和“语言的实现”是两个东西。
    而说 #147 信息量大是因为这句话:
    “一个语言好不好,或者说一个软件好不好,可以从它本身的效率,bug,生态,开发组负责程度,版本更新质量来评价。”
    你列的东西都没问题,问题出在你没列的东西上。
    评价一个软件的标准可以有“效率,bug,生态,开发组负责程度,版本更新质量”,但是你好像排除掉了其他标准。我做一个软件,功能只有 Hello World,效率巨高,bug 极少,开发者有求必应,就是“好软件”了么?
    就好比在电商平台上买东西看别人的评价:“物流很快,包装很好看,客服态度很好,还送了东西”,唯独缺了“商品本身”的评价。

    还一个错误在于,“编程语言”并不是软件,“编程语言的实现”才是软件。就好像 POSIX 并不是软件,POSIX 的实现才是软件。
    比如在设计一款处理器时,第一件事是定义它的指令集,指令集定义完之后,就出现了一种新的汇编语言,但是这个时候处理器还没动工,这个语言尚未有实现。
    我个人猜测,造成混淆“编程语言”和“编程语言的实现”的原因之一是,大多数编程语言都没有正经的 spec (或者说就算有大多数人也并不真的关心),同时有自己的 de-facto standard implementation,并用这个 de-facto standard implementation 充当 spec 的作用。这很容易给此类编程语言的用户造成概念上的误解。
    但是也有很多语言是有像样的 spec,并且有多个共存的被广泛使用的 implementation 的,比如 C 、C++、Standard ML 、OpenCL 、Scheme 、Common Lisp 、Java 、Fortran 和以前的 JavaScript 。比如 Standard ML 这个编程语言,可以使用的实现有 SML/NJ 、MLton 、MLKit 、CakeML 等,我不管用哪个,都是在写 Standard ML 。其实上面有不少都是响当当的名字,这个错误本来不该犯。

    对于编程语言的实现,某种程度上可以应用软件的标准来评判(至于你在 #147 钦定的标准合不合理是另一个问题)。对于编程语言本身,应该应用什么标准呢?我现在并不真的想讨论这个事情,因为一个非常明显的问题是:我看到“语言好不好”的标准是“效率,bug,生态,开发组负责程度,版本更新质量”时,就知道——和之前我见过的很多人一样,“编程语言本身”这个概念,在你这根本就不存在。也就无怪我在 #128 的提示是无用的,并且在 #138 做的假设也是错的了。
    secondwtq
        152
    secondwtq  
       2020-04-04 05:01:04 +08:00
    (我很纳闷链本站的帖子也属于“外链”么
    secondwtq
        153
    secondwtq  
       2020-04-04 05:01:37 +08:00   ❤️ 1
    类似的问题我好久之前就有提过,不想在这重复了: /t/636465#r_8459703

    > 我觉得这几个帖子应该引发的思考是:我们真的有过“在意”这件事情么?再看一遍:C 的成功是 UNIX 的成功,C++ 的成功则是建立在 C 的成功的基础上,PHP 和 JavaScript 的成功是 Web 的成功,Java 的成功是 Sun 和 C++ 的成功——它们都不是“语言本身“的成功。
    > 什么是“语言本身”?考虑这样一个问题,当被问到“XX 语言为什么好?”时,你会怎样回答?
    > 它的 IDE 支持好?它的库多?某个平台甚至某个行业钦定了用它?它的工作多(或者好招人)?它的语法“优雅”?或者单纯它的爹比较厉害?
    > 这些都不是“语言本身”的东西。虽然这些东西会影响大家对其的评价(甚至决定你有没有听说过它)。
    > 但是最有趣的事情是,这些东西不仅会影响对语言的评价,还会影响对“语言本身”的评价,能让人把坏的吹成好的,把好的贬成坏的,所谓 dssq 。



    PS:科班教育的失败可能不是国内的特色。王垠也有说过“IT 业人士经常混淆编程语言( PL )和编译器两个领域”。这话来自《我不是编译器专家》,这篇文章很大程度上是王垠的吹逼文,我对其其他内容,包括文中表达的对 compiler 和 PL 两个领域及其从业者的意见不做评价。但是其指出的一些问题是确实存在的。包括“编译器领域处于编程语言( PL )和计算机体系构架( computer architecture )两个领域的夹缝中,上面的语言不能改,下面的指令也不能改,并没有很大的创造空间。”,我在 /t/632869#r_8401400 有提到过。
    wangbenjun5
        154
    wangbenjun5  
    OP
       2020-04-05 20:26:23 +08:00
    各位大佬 666
    crist
        155
    crist  
       2020-04-09 16:17:05 +08:00
    直接怼他:你这种问题太低级了,我不想回答;现实工作中我根本就不会犯这种低级的错误,所以你考的这个题目完全没有意义。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2726 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:25 · PVG 20:25 · LAX 04:25 · JFK 07:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.