为什么我认为 “从 Python 转向 Golang” 不是一个好主意

jopen 9年前

原文  https://www.textarea.com/zhicheng/weishenmo-wo-renwei-cong-python-zhuanxiang-golang-bushi-yige-hao-

引子

某KSO工程师 我为什么从python转向go 芒果TV CTO CMGS 说说这篇「我为什么从python转向go」

个人认为 CMGS 的观点句句在理。

为什么你不应该放弃 Python

python是一门动态强类型语言。但是,仍然可能出现int + string这样的运行时错误,因为对于一个变量,在写代码的时候,我们有时候很容易就忘记这个变量到底是啥类型的了。

int + string 这样的运行时错误是因为 Python 是 “强类型“ 的编程语言,就是为了防止你们 “有时候很容易就忘记这个变量到底是啥类型的了” 这种情况。忘计这个变量到底是啥类型的,任何编程语言都无法完全避免。个人的解决方案是,不要使用全局变量,不要使用超大的类和函数,相信几乎每一本进阶编程指南都有这两句话。

在python里面,可以允许同名函数的出现,后一个函数会覆盖前一个函数,有一次我们系统一个很严重的错误就是因为这个导致的。

这完全是编程经验不够或者团队协作不够导致的,在 C/Java/C++ 中,这也是经常发生的,尤其是 C++ (函数重载,模板机制),灵活和严格是无法完全融合的,对于一个动态语言,灵活是首先要实现的目标。

其实这个一直是很多人吐槽python的地方,但python有它适合干的事情,硬是要用python进行一些高性能模块的开发,那也有点难为它了。

我从来不会吐槽 Python 的性能,相反的它在目前的性能上已经非常满意了。你需要定义一下什么是“高性能模块”,一般我认为,任何没有用 C 或 C++ 甚至 Java 的,性能就是相对不重要的。

python的GIL导致无法真正的多线程,大家可能会说我用多进程不就完了。但如果一些计算需要涉及到多进程交互,进程之间的通讯开销也是不得不考虑的。

这和对项目的架构能力有关系,一个稍大型的项目,除程序的健壮性,低耦合也是非常重要的一项。一般有一个规律,对性能要求高的场和,需要协作就少。需要协作多的场合,大多是对性能要求不高的业务逻辑。

所谓同步和异步,明显 KSO 的工程师依然停留在 FCGI 的时代。

当我第一次使用python开发项目,我是没成功安装上项目需要的包的,光安装成功mysql库就弄了很久。后来,是一位同事将他整个python目录打包给我用,我才能正常的将项目跑起来。话说,现在有了docker,是多么让人幸福的一件事情。

自从用了 pip 之后,从来没有遇到过。另外 docker 完全不是为了解决这个问题的。

而部署python服务的时候,我们需要在服务器上面安装一堆的包,光是这一点就让人很麻烦,虽然可以通过puppet,salt这些自动化工具解决部署问题,但相比而言,静态编译语言只用扔一个二进制文件,可就方便太多了。

理想很好,当你真的试过到处丢个 Binary 出了问题的时候,相信你会怀念 Python 的。

python非常灵活简单,写c几十行代码才能搞定的功能,python一行代码没准就能解决。但是太简单,反而导致很多同学无法对代码进行深层次的思考,对整个架构进行细致的考量。来了一个需求,啪啪啪,键盘敲完开速实现,结果就是代码越来越混乱,最终导致了整个项目代码失控。

这个简直就是无理取闹了,也是我最想吐槽的地方,“写c几十行代码才能搞定的功能,python一行代码没准就能解决。” 这是缺点?这是缺点?这是缺点? 另外需要说的一点是,Python 都写不好的同学,用 C 写代码几乎就是灾难。

虽然这也有我们自身的原因,譬如没好的代码review机制,没有好的项目规范,但个人感觉,如果一个程序员没经过良好的编码训练,用python很容易就写出烂的代码,因为太自由了。

没有经过良好编码训练的工程师写出的 Python 代码至少还能看,可能还能用。你让他写 C 试试看。

当然,我这里并不是说用python无法进行大型项目的开发,豆瓣,dropbox都是很好的例子,只是在我们项目中,我们的python代码失控了。

技术管理能力不足,不做过多评价。

对于 Golang

完全没有使用过 Golang 不做评价,用过几个 Golang 写的项目,评价只有一个字,disaster 。

结束

KSO 明显是为了用 Golang 而用 Golang ,项目或团队出了问题,不找到问题去解决问题,却把问题推给编程语言,然后做梦似的认为换一个新的编程语言就能解决遇到的问题。简直是对团队和公司的不负责任。

</div> </div>