vlambda博客
学习文章列表

为什么我会选择golang做Goby的开发语言

程序员的圈里有很多段子,其中一个讨论“最好的开发语言”是这么说的:

======

女神:你能让这个论坛的人都吵起来,我今晚就跟你走。

程序猿:PHP语言是最好的语言!

论坛炸锅了,各种吵架。

女神:服了你了,我们走吧,你想干啥都行。

程序猿:今天不行,我一定要说服他们,PHP语言是最好的语言。

======


       作为一个潜质很一般的程序员,我从来没有参加这方面的争论,原因有两个:一个当然是没有一门语言深入内核做研究,水平不够去“装B”;另一个是因为我的研究过程接触过不少语言,每一种语言都是一段时间的深爱,深爱过后又爱上了另一种语言(说明程序员都是潜在的渣男对不对)。

      大学时大一下半学期时我勤工俭学,给院里开发新生登记系统,当时是用的asp作为开发语言。后来切换到php开发了成绩查询系统,在大二被小我一届的师弟黑了(那是我第一次接触SQL注入),这也让我对网络安全产生了强烈的兴趣。于是学着老一辈白帽子用pascal(Delphi)写过一些带有恶作剧性质的“远控”。

     后来进到了第一家公司HW,我用C语言开发了一系列跟系统底层相关的工具开发,用Perl/Python做了很多网络协议测试工具开发,期间还尝试用Java开发了一些代码,后来发现对于网络安全而言,Java实在是过于臃肿和复杂。甚至还用过通信行业曾经比较火的erlang语言(过程非常痛苦,根本感受不到编程的乐趣)。

     再然后,我用C++ Builder开发了Pangolin/JSky等等带有GUI界面的客户端工具,作为我人生第一次创业的所谓“产品”。后来公司被收购后,我用业余时间来做一些方向性的验证,突然发现ruby简直是对全栈最好的证明,一个人可以把前后端全做了,什么消息队列数据库网络协议以及css/js全部搞定,于是毅然决然用ruby来开发了fofa.so平台。


     这一次创业一晃马上5年了,回顾一下之前的语言经历,C++Builder这种拖拽式编辑生成GUI界面的体验当时让我很兴奋,如果不是因为Borland公司就这么没了,我可能会坚持用更长的时间。后来Ruby的元编程让我感觉到很惊艳,用代码生成代码,出色的预置文本操作库和Rails框架非常明显的提升了编程了乐趣和效率。只是后来大量的网络编程发现并发行实在效率跟不上,多处理器的优势没有发挥,看到jruby这种过渡产物我就很不舒服,终归不是大家风范。

     2015年有一段时间我去招聘Ruby程序员,跟一位行业大佬聊天,他表示已经放弃了阵地,指给了我一个新方向叫做Golang。最初我是非常失落的,很难受,我还是很关注松本行弘,也对未来的改进充满了期待。但是至少,我也想看看Golang还有Rust这种被吹上天的语言有什么不一样的地方,因为我总觉得语言改来改去好像该有的功能都差不多了,能实现的也都实现了,还能怎么玩出花?

     一种机缘巧合,我招进来了一个年轻人,对go有着执着的信念,于是我就说给你一个月时间,把ruby实现的后端协议识别全部切换成go,然后告诉我区别在哪,有什么改进。后来的结果就是fofa3.0上线,性能提升的不是一点半点。当初考虑了开发效率和乐趣,所以选用了ruby,但是在单机运行效率的冲击下有点惨不忍睹。这时候我还没有体会到go的开发乐趣,但在极少代码量引发的运行效率飞跃上,给我留下了很深刻的印象。2017年我开始正视go可能带来的新的体验,于是零零散散写了一些网络工具来进行系统性的学习理解。一直持续到2019年,我准备正式启动新一代网络安全工具Goby的开发,这时候我已经明确了选择golang作为主开发语言。


我总结了一下,golang打动我的三个核心点如下:

一)高并发

     以前经常说的CPU多核编程(类似的还有32位64位支持)可以开一门学科,当时没把我累死。我记得十几年前学习Windows的完成端口编程,小心翼翼,一点小差错就万劫不复,弄到后面我对自己的能力产生了极大的怀疑,无处不在的挫败感。后来的异步编程,我也看了很多这方面“技能高超”的书,看得越多,越觉得自己不是编程的好材料。多线程编程我都觉得费劲,一件理解起来非常简单的事情,为了追求所谓的高性能,你得尸解成很多段飘散在各处的代码,逻辑你得细琢磨,不琢磨个十天半个月你都不明白代码是干嘛的。我以前一直觉得是能力不行,后来发现原来真的有一门语言,可以不让你对自己的能力产生了怀疑,你可以更加轻松的去编写高性能代码,不用考虑太多底层。尽管我听过无数次G-M-P 模型,但是即便是我不了解细节,也并不影响我写出想要的功能。

二)跨平台

     很多语言都宣传跨平台,但是在一些arm,mips等未来物联网世界的芯片架构的适配性并不好,各种磕磕碰碰,移植起来成本非常高,另外对操作系统的支持也比较有限。这方面go从一开始就给出了最令人满意的答案。go tool dist list可以看一下支持的系统,几乎所有的主流架构和主流操作系统都是天然支持,并且直接支持跨平台交叉编译。另外,编译好的程序不需要依赖其他任何的解析引擎,单个文件复制过去开箱即用。让软件的分发变成了一个非常美好的体验。

三)严格的格式要求

     这个问题很多人认为是缺点,对我而言简直不能再好。导出的函数必须大写开头,左大括号不换行,go module路径开始必须是域名……我能罗列一堆这种严苛到变态的要求。我之所以欢迎,是因为我经历过从一个人单打独斗到团队协作的转变。其他语言基本都有一个语言规范,包括命名方式要求,编码格式要求,比如骆驼式命名法和匈牙利命名法,你说哪个更好?都没毛病,都能解决问题,只是不同团队的不同喜好罢了,毕竟一个团队内部,总要统一格式嘛,不然怎么协作开发。但是研发人员换来换去是一种常态,每来一个人就培训一次,那么多要求培训一次哪够,每个项目都很着急,所以到代码里面就是五花八门的代码风格,越往后走就越失控。我们是来输出激动人心的功能的,不是来培训的,如果能把时间多往核心业务上讨论,岂不是更有效率。尤其是,我是一个懒人,我根本不想花时间去制定规范,也不想成天跟人沟通规范,当然我可以找其他人做,但是其他人不也会话费大量精力吗,尤其是他做的规范膈应我了怎么办。所以,go官方的这种做法我很享受,大规模作战,统一思想统一行动。对于“条条大路通罗马”的诉求,我肯定是没有的,除非有必要,否则我就希望一条路杀过去。


     我觉得肯定有很多人并不认可我上面的描述,我只能代表一类人,不能代表所有人,我代表的是那一类自认潜质一般,同时又不甘于放弃,选择厚着脸皮往前冲的人群。我并不是来炫技的,而是用开发语言来实现我的想法的,我的想法很多难度很大,我要完成太多上层的应用搭建。所以一方面我当然觉得对底层的原理理解的越多,就越能帮助我更好的实现更高要求更高性能更稳定的代码,但是,这些确实又不是我的需求,或者说应该不是大部分人的需求。那些高端的工作交给语言设计者,交给科学家,他们是最棒的,我们在他们的肩膀上能够走的更快更好。这并不冲突,就好像我使用了RSA算法,我并不一定得是算法专家,只要知道能够完成“私钥加密,公钥解密”效果就好,我们拿到了库来满足上层需求,如果某一天有更好的算法,我们可能也没有太多考虑,就更新了一个新算法。所以,我觉得大家能够正确的认知就好,重要的是让自己舒服,不是为了他人的“语言绑架”,不管是技能上的还是道德上的,都大可不必。


     上层应用开发的工程师关注的是目标功能的实现,不同的场景对应会有不同更适合的语言,综合考虑开发效率和运行效率。比如开发网页你不用Ruby不用PHP非得用C,大家也不拦你,你开心就好;还比如你做机器学习,不用Python非得用Lisp,也是那句话,你开心就好。正常情况下,你选择C是考虑性能和编译的大小,你选择Python是想做科学计算做机器学习,你选择Go是为了更轻松的做高并发开发,你选择Ruby是为了一个人打通全栈。对于一个具体的功能,我觉的不同语言理论上都能实现,只不过有一个可能让你开发起来更快更轻松更享受,那你就用它。韦小宝有七个老婆,咱们研发工程师每个人抱着几个开发语言,也很正常嘛对不对?


我希望每个程序员都能享受开发的过程,都能获得开发交付后带来的成就感,没有比你自己的感受更重要的事情了。用另一个段子来结束

======

我是一个苦b的程序员,今晚加班到快通宵了,困得快睁不开眼了,女上司很关心,问我要不要吃宵夜。

我没好气地说,宵夜就算了,能让我睡一觉就行了。

女上司红着脸说了句讨厌啊,然后坐在我身边不动,好像距离我很近,搞得我很紧张,难道她发现我的程序出了bug?

======