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

2020-04-01 22:22:32 +08:00
 wangbenjun5

记得以前有一次面试,面试官是一个和我年龄相仿的人,他就 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,写完只要编译没报错,基本上都没问题。

17347 次点击
所在节点    程序员
155 条回复
Eds1995
2020-04-03 09:44:18 +08:00
@ideacco 然后被反编译了
JB18CM
2020-04-03 09:44:58 +08:00
PHP 又被黑了? 强调一篇, PHP 是世界上最好的语言
NiZerin
2020-04-03 09:51:11 +08:00
zkqiang
2020-04-03 11:01:27 +08:00
弱类型和强类型本身就不应该放一起讨论,双方都有优劣势。

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

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

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

之后学了 typescript 觉得 python 的 type hint 是个残废,就懒得写了。通过单元测试也能保证质量
handsomehaitao
2020-04-03 14:06:52 +08:00
你可以使用 7.4,可以定义函数的返回值类型
liuxu
2020-04-03 14:19:39 +08:00
@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
2020-04-03 14:48:10 +08:00
标题是病句?
GreyYang
2020-04-03 14:51:43 +08:00
secondwtq
2020-04-04 04:57:26 +08:00
@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“ ( <amp-youtube data-videoid="Nb2tebYAaOA" layout="responsive" width="480" height="270"></amp-youtube> ) 很明显他认为 Elon Musk 是有很强的“寻找并打破假设”的能力的。
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
2020-04-04 05:01:04 +08:00
(我很纳闷链本站的帖子也属于“外链”么
secondwtq
2020-04-04 05:01:37 +08:00
类似的问题我好久之前就有提过,不想在这重复了: /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
2020-04-05 20:26:23 +08:00
各位大佬 666
crist
2020-04-09 16:17:05 +08:00
直接怼他:你这种问题太低级了,我不想回答;现实工作中我根本就不会犯这种低级的错误,所以你考的这个题目完全没有意义。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/658465

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX