说说那篇「我为何从python转向go」

@朱晓华(分答联合创办者&产品老总)

一头模型并非不行,因为 overhead
丰裕低,很多政工场景下用同步模型反而会赢得更好的效益,比如豆瓣。同步模型最大的题目是对于
IO 密集型业务等待时间丰硕长,那时候需要的不是换语言
,而是唤醒你是不是架设要改一下了。

好苗子本来就是少数,在“找”上更多下功夫,而不是吃力“培育”。有五点可以看清一个苗子好糟糕。

曾经知乎有个帖子问 Python
会不会减低程序员编程能力
,我只可以说这的确很人有关。你不去研讨深层次的事物怪语言至极是没道理的,这好,Go
里面 goroutine 是怎么落实的,一个带 socket 的 goroutine
最小能成功多少内存,思考过?任何语言都有友好的优势和劣势,都亟待执行者自己去看清,一味的以为简单就不会深切思考这是有问题的。其余,代码混乱我觉得依然工程上的控制力不够,豆瓣有超常10W行的
Python 实现,即使不说很周详,大体上到位了不会混杂这么个目标。

一个店铺从0到独角兽的经过中,产品团队从1民用发展为一个全体的系统,中间会经过什么样紧要阶段?在怎样条件下扩充哪些的部署会相比较合理?

属性,go的习性可能赶不上c,c++以及openresty,但确实也挺强悍的。在我们的花色中,现在单机就布局了一个go的长河,就完全可以胜任以前200个python进程干的事体,而且CPU和MEM占用更低。

……

当自家首先次利用python开发项目,我是没成功安装上项目需要的包的,光安装成功mysql库就弄了很久。后来,是一位同事将他一切python目录打包给自家用,我才能正常的将品种跑起来。话说,现在有了docker,是何等令人幸福的一件业务。

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

同理心:站在用户角度想想,前提是大气输入用户相关的音讯,然后带入思考。(我个人觉得这有点像“角色切换”的力量,像小白一样发现产品问题,像我们一致设计缓解方案)

一头形态写异步,在 Python
实力强的公司里面早普及了,这是个工程问题,并非语言问题。当然把这种事怪在
Python 身上,Python:怪我咯?

出品团队怎么布局,比如互联网金融行业,他们不时问我到底用互联网背景依旧经济背景的人,都用的话怎么搭配?

那是有代价的,goroutine
的内存消耗统计(当然1.3仍旧1.4开首拿到了很大的改良,内存最小值限制已经没了),channel
跨线程带来的性质损耗(跨线程锁),还有对 goroutine 的控制力几乎为 0
等。不言而喻这种嘛,算不上是杀手级特性,大家都有,是利于了一点,但也有友好的流弊。比如大家用
go 吧,平时就相比蛋疼 spawn 出去的 goroutine 怎么出色的
shutdown,反而有时候把作业做复杂化了。

非产品首席营业官出身的产品老董怎么着管理产品主管?

python没有原生的协程协理,尽管可以透过gevent,greenlet这种的上patch模式来支撑协程,但说到底更改了python源码。其它,python的yield也得以开展简短的协程模拟,但究竟不可以跨堆栈,局限性很大,不晓得3.x的本子有没有改正。

iamsujie,前阿里成品经营,写过《人人是产品经营》、《Taobao十年产品事》、《人人都是产品经营2.0》,现在做创业者服务,『良仓孵化器』创始合伙人。

骨子里,Python 有宏可以绕开这个GIL,不过呢架构设计得好其实可以制止的,到异步这块我会说。

先从以前的交换说起。

无状态的分布式处理利用多进程很便利,譬如处理http请求,大家就是在nginx前面挂载了200多少个django
server来处理http的,但这样三个过程自然导致全体机器负载偏高。

但不怕我们运用了四个django进程来处理http请求,对于一些超大量请求,python如故处理不復苏。所以我们应用openresty,将高频次的http请求使用lua来贯彻。可这般又导致使用二种开发语言,而且一些逻辑还得写两份不同的代码。

滴滴产品高级副主任

本人不审慎的实测大概 gevent+py2 能达到相同逻辑 go 实现的
30%~40%,pypy+tornado 能达到
80%~90%,混合了有的总计和连接处理什么的。首要依旧看业务场景呢,纯粹的
CPU bound 当然是 go 好,纯粹的 IO bound 你不怕用 C 也没用啊。

微信截图1

django的网络是手拉手阻塞的,也就是说,即便我们需要拜访外部的一个劳务,在等待结果重返这段时日,django无法处理任何另外的逻辑(当然,多线程的不外乎)。假使访问外部服务需要很长日子,这就象征我们的上上下下服务几乎在很长一段时间完全不可用。

为了化解这多少个题目,我们不得不不停的多开django进程,同时需要保证拥有服务都能便捷的处理响应,但考虑这实则是一件很不靠谱的业务。

异见:人都是有体会盲点的,要经受这或多或少,不断自我省察,鼓励同样关系和不同看法,比较依赖集团文化。

这其实是 Go style,无论是 go fmt 如故 error style,Go
其实是想抹平不同工程师之间的风格问题。不再为了一个缩进和大括号地方怎么的浪费时间。这种模式并不是不佳,只是自我个人觉得没
rust 这种再次回到值处理友善。

前两点有的依赖先天条件,第三点的核心是深度思考的能力,后两点依赖于集体文化,好苗子放在一起,互相学习互相刺激,事半功倍。

一段段来吧,首先作者说 Python 是动态语言

经验:没有思考的经历,不是经验,很多5年工作经历的人,其实只是5年工作经验。经验是周边的新闻输入,加上经历,加上思考,再做出改变,再作证。工作的抉择,连忙增长的正业、集团分外关键,这样你才有时机不断试不断错,同样的时刻内更频繁上报,才能积累经验。

本条还真不是,要是说没有 ES6 的 JavaScript,可能真有 Callback
hell,但那是 Python 啊!Python 早就实现了左值绑定唉,yield
这架式比某些时刻吹的言语不明了高到何地去了,当然我说的是一体化版的 Python3
yield。固然是不完全的 Python 2 yield
用来异步表明式求值也是一心充裕的,tornado 的 gen.coroutine 啊。

时刻少于,现场还有些问题没能展开互换,都是有关人的,比如:

所以这是个工程问题,并非语言问题。 Python
提供给了您了这般多工具,硬要选一个传统的,Old fashion
的,Python:怪我咯?

对了,One More Question,候场时,我偷偷又问了一个题材:

GC,java的GC发展20年了,go才这样点时间,gc铁定不系数。所以大家照样不可能随随便便的写代码,不然在大请求量下边gc可能会卡顿整个服务。所以有时候,该用对象池,内存池的一定要用,即使代码丑了点,但好歹性能上去了。

以上互换,我下场之后顺手凭回忆画了一张图。似乎这背后,如故隐藏那几个“输入–>思考–>输出”的模子。

甭管 Gevent 依旧 格林(Green)let 均没修改 Python 源码,事实上这货已经变成了
Py2 coroutine
的正统,加上豆瓣开源出来的greenify,基本上所有的库都可以平滑的异步化,包括
MySQL 等 C 一流的 lib。自从用上这套技术后,豆瓣的 Python dev
各个爽得不要不要的。

俞军的基本观点:

即便如此tornado是异步的,不过python的mysql库都不扶助异步,这也就表示假若我们在tornado里面访问数据库,大家仍旧可能面临因为数据库问题导致的一切服务不可用。

前几天在京都,插足了三节课的年终千人大团聚——有可能大烩。终于看出了境内互联网产品圈的鼻祖,活的俞军先生(现

运维部署,直接编译成二进制,扔到服务器下面就成,比python需要安装一堆的环境这是简约的太多了。当然,假如有cgo,大家也急需将相应的动态库给扔过去。

也愿意将来有机会和现场的诸位互换,他们是:

go 的付出功用高是相比较 C,相比 python,大概后者只需要3天呢……

本着继续问,“具备持续输出正确决策能力”的成品经营怎么培训、怎么找?在面试选人的时候,倚重什么?

事实上这一个一向是过两人吐槽python的地点,可是想想,python最开首是为了化解什么问题而被支付出来的?我们就是要将他用到高性能服务器开发方面,其实也是有点难为它。


综上说述,Go 不是糟糕,Python
也不是老大,做工程嘛,无外乎就是考虑资金,时间资产,人力成本,维护资产等等。
Go 和 Python 互有千秋,就看取舍了。当然一定要说 Python
不行,Python:怪我咯?

面试的方法论,有什么样好题材可以便捷判断一个产品总经理的力量?

python是一门动态语言,不是强类型系统。对于一个变量,大家有时候压根不知晓它是什么样类型,然后就可能出现int

  • string这样的运转时不当。

在python里面,可以允许同名函数的产出,后一个函数会覆盖前一个函数,有一遍我们系统一个很要紧的荒谬就是因为这么些导致的。

顺手乱画

天生的交互补助,因为goroutine以及channel,用go写分布式应用,写并发程序非凡的容易。没有了蛋疼的callback导致的代码逻辑割裂,代码逻辑都是各样的。

于是,前几日自我连续问了这一个题目:

还有,C 写几十行搞定的 Python 一行解决这纯属是生死攸关
feature,生产力啊,人士配备啊,招人培养的本金啊,从工程上来说,Python
在这一块完全是加分项,不是各个系列都要求最好的产出,极致的功能,做工程很多时候都是要取舍的。

自然,我以为这是站在同行业而不是店铺的观点,给出的一个更高级的应对。

Openresty 用 lua
假若依据动态语言的角度去看,还真算不上,顶多是个简易点的
C。许式伟走的时候大多数都是
CPP,葱头近来本身还不领悟她创业用的是咋样写的,然而她一定没言语倾向。当年无论是
leo 依然 ufa,一个用 Python 一个用 Java,
他都是从工程实际来抉择使用什么的言语。

我的领悟是,时代的大背景,比如技术发展,观念变动,会因此影响集团事处境态来影响协会结构和职位计划;行业里各个玩家的关联网整合,也有类似影响;而集体内各样人的力量特点,会使得最后的天职设定会有很多世故。于是,岗位只是为着知足集团业务需要的一种阶段性解决方案,不用纠结于叫什么抬头,而相应看背后需要做的职责、需要拥有的能力,而俞军提议的“具****备持续输出正确决策的力量”已经走到逻辑尽头了,甚至有点太普适,对业主、对创业者、对每个人,似乎都对。

骨子里,假诺是静态检查,pylint 和 pyflakes 是足以做这件事的,就算不可以和
go
这种静态编译型语言比,但也丰裕了。假若没记错的话,阿通当年是要求全组都在付给前做静态检查的。我觉着这种题材更多的应该是人士素质上来制止,毕竟葱头也说过,代码自己写的即将多回头看看,看能不可能重构,能不可以做更好。不是说偷懒不行,不过从中得出
Python 动态特性太灵活,Python:怪我咯?

俞军的中激情念:

假诺没记错,无论是轻办公或者快盘,是重 IO 不重
CPU,最大耗时是数额块加密这块,我在的时候是 Java
写的。其余高性能服务器选 Go 也是虐得不要不要的,各样小心翼翼避免GC。大多数极其情形下,pypy 的习性足矣胜任了,我觉得这不算丰盛规范。

),为啥这么说,因为二零零五年事先,百度的几乎拥有成品决策都是他一人负担,而我二〇〇六年才开头工作……

支出功效,尽管go是静态语言,但我个人感觉开发效能确实挺高,直觉下面跟python并辔齐驱。对于自身个人来说,最好的例子就是自我用go快速支付了老大多的开源组件,譬如ledisdb,go-mysql等,而那么些最初叶的本子都是在很短的年月里面完成的。对于我们项目来说,大家也是用go在一个月就重构完成了第一个版本,并宣布。

现实职务的疆界是动态变化的,不不过成品经营,对另外岗位都是,随着大到一世、中到行业、小到协会的内需而变更。而产品经营最实质是对结果承担,要享有持续输出正确决定的能力。

tornado 是有那一个题材,不过 gevent 已经缓解了。我在 node.js
的某问题下已经回答过,对于 node 而言,能采取的异步模型唯有一个,而
Python 就是太多采纳了。此外 pypy+tornado+redis
可以随意虐各类长连接的光景,比如我给我厂写过的一个 push service。

数据:广义的数目,是指各种输入的音讯,要相信没有丰硕的优质输入,就不会有不利的核定输出。但多少不是万能的,要特别小心哪些情境下无法借助,哪些情形下要更多应用数据。

实际异步模型最大的问题在于代码逻辑的隔离,因为是事件触发的,所以大家都是透过callback举办有关处理,于是代码里面就平常出现干一件事情,传一个callback,然后callback里面又传callback的情景,这样的结果就是百分之百代码逻辑相当混乱。

微信截图2

python十分灵活简单,写c几十行代码才能搞定的服从,python一行代码没准就能迎刃而解。不过太简单,反而导致众多同校不可以对代码进行深层次的思念,对任何架构举办精雕细刻的勘察。来了一个需求,啪啪啪,键盘敲完开速实现,结果就是代码越来越混乱,最后造成了全体项目代码失控。

@张涛(映客高级产品总经理)

尽管java和php都是最好的编程语言(大家都如此争的),但我更赞成一门更简约的言语。而openresty,尽管性能强悍,但lua如故是动态语言,也会遇见前边说的动态语言一些题目。最后,前金山许式伟用的go,前快盘架构师葱头也用的go,所以我们很当然地挑选了go。

事先俞军帮我的新书《人人都是成品经营2.0》写过推荐语,在微信里有过只言片语的沟通,但总归粗浅,前天能和此外几位产品牛人一起问她有些题材,如故挺有收获,分享一下俞军先生的回答和我的通晓。

假如估摸没错,你们现在还在用五年前写的 Gateway?那么些基于 django route
的流量分发层?四年前我偏离的时候已经小范围的利用 Flask+Gevent Demo
测试过了,无论是性能仍旧负载都比同步模型的 django 有优势。如若仍旧django
这套的话,我只能说相比遗憾,毕竟这时候金山新职工大赛头牌就是本人和多少个小伙伴写的实时同步在线文档编辑系统,用的就是这套技术。

逻辑:逻辑严厉,这是基础,凡事结论可以错,逻辑不可以错。

python的GIL导致导致力不从心真正的多线程,我们莫不会说自家用多进程不就完了。但只要有些总计需要涉及到多进程并行,进程之间的报导支出也是只可以考虑的。

@耿新跃(豆瓣用户产品副总)

恩看了这篇本身干吗从python转向go,看来作者也是
KSO
轻办公/企业快盘团队的。作为快盘从无到有一代的工程师之一(总是被潇洒哥说他们改我留下的
bug ),又恰好是 Python/Go 双修(大雾其实自己是 Rust
党),其实一先导自己是不容的,duang duang duang,这就随手写一些把。

俞军先生坚定的认为应当互联网人主导,理由很粗略,不破不立,互联网人主导,会有颠覆的做法,有可能破产,但一旦是行业内的人为主,自相残杀的可能性更低。

1.4 开端 go 就是 100% 精确 GC
了,另外说到卡顿啊,完全和你怎么用对象有关,能内联绝不传引用大部分面貌是一心够用的,那样
gc 的熏陶程度会低于。实在想用池……只好说怎么不选 Java。

好久没加入大活动了

其它,函数作为第一目的,在 Python 中是 feature,Go 要写个
mock,简直虐得不要不要的。

产品经营这么些岗位的界线在何地?业内有成百上千说法,说产品岗即将被“肢解”、我自己有时也本着我们的食量说“十年未来再无产品经营”,但这背后,其实是一个职务的定义问题。

恰恰我又是在付出基于 docker 的阳台, docker
还真不是用来做安排这事的。首先, Python 是有 virtualenv
那么些工具的,事实上比较包管理和包隔离,Python 比 Go
高得不了然啥地方去了。Python 跟 Git 谈笑风生的时候, Go 的 dev
们还得考虑自身如何才能使得 import
的包稳定在一个版本上(当然现在有众多第三方方案)。Virtualenv + Pip
完全可以实现 Python
部署自动化,所以这一个题目本身以为是,工具链选拔问题。毕竟是个十几年的老妖怪了,Python
啥情况没见过呀,各样包裹工具任君接纳,强行说 Python
部署不便利,Python:怪我咯?

大家前几天遵照 glibc 所处的 host
版本不同有2套编译环境,看上去是安排简单了,编译起来坑死你。其余尽管说
disk 便宜,这几行代码就几M了,集群同步部署耗时在好几情状下还真会出篓子。

error,好呢,假设有语言洁癖的同桌也许确实受不了go的语法,尤其是预约的末段一个再次来到值是error。

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注