Go是一门和谐的语言

这周T神问我了一个问题,如果用Golang开发防火墙设备软件,你会有什么担心? 我无脑便答没什么可担心的,其实这个问题我自己问过自己,并在我的“无脑”中简单推导过几次。Go可以用在哪里?

于是我按直觉上大致再捋了一下,软件粗分为两种:系统软件,应用软件。

先说应用软件,应该是距离用户最近的,满足用户各种异想天开的需求,也是种类繁多,变化频繁的。不用多说,写这样的软件如果用C那么简直就是自虐。 当然这也是有前提的,如果是1980年,那么也别无选择,LinkList也要自己实现。但在今日,随着硬件,操作系统,开源库的发展的基础上,用高级语言带来的好处显而易见,开发周期短,代码少,维护简单,变更迅速。例如:Android应用就是Java开发运行在dalvik虚拟机上的。

系统软件一般功能单一,完成对资源的分配和调度,这种软件虽然看起来好像管好自己的一块饼就可以了,但实际却不是这样。在一个规模系统中,资源需要弹性得分配,调度也需要做到并发/并行,这些资源的管理和调度需要按需进行,分布式部署。于是更多的层次和模块在这里产生了,大型系统中有各种资源调度的中间件,线程池,读写缓存,消息队列等待。使得现代系统变得很复杂,如果从头到尾维护一套,显然不划算。

做优秀的系统要集中精力做好这个系统上最有价值的部分。

问题需要分治解决,软件设计上就是对系统分层,分模块,我不想凭空的大谈理论,实际这些理论是与工程相互结合的。先不细节,我想暴力定义每层可以使用不同的技术或者不同的语言。这种分离无疑是最强的,比方说用Java写一个让JVM Crash的程序就很难,或者用C语言来摧毁CPU也不太容易,用Golang维护世界和平也是不可能的…当然…“三个代表,和谐社会”也不行。

简单做从包处理角度看一个系统。

####一. #### 首先进入包处理系统的底层,这里可以逐级使用ASIC,NP,CPU做信号数字化,Pattern Match,查表,转发,策略,QoS调度等。用到的语言可能是专用微码,汇编,兼容C语言。 ####二. #### 然后进入协议栈这层,这时报文可能按包属性被分发到不同CPU处理,可用C语言写IP协议栈,报文行为识别,安全策略执行。对于4-7层报文安全处理,80%的通用协议用可以C语言,或者协处理芯片。20%的不常见的应用报文,或者定制的处理,完全可以考虑Golang或者Lua脚本语言完成。 ####三. #### 报文通过后,应该有个中间件层,各种应用构筑在它之上,它承载资源虚拟化,缓存,负载均衡等能力。软件中间件尽量与硬件无关,可以选择能构建在llvm虚拟机或者java虚拟机上的技术,他们通过通用的中间字节码,引入了更多优雅的语言。既降低开发难度,又保证不失性能,如C++0x,Object-C,Java,Scala,甚至各种已经支持的语言Haskell, Ruby, Python等等。这样大量的第三方库就可以被导入,轻松构筑弹性的资源层面,为上层应用平台服务。 ####四. #### 报文最后被应用软件处理。应用软件可以根据自己的喜好,用特性选择不同的语言。比如SSH/FTP/HTTP这些成熟基础应用可以继续用过去的C/C++语言。高同步/高并发类的网游可以用erlang语言,数据库CRUD类的可以用动态解析脚本语言Python,Ruby,PHP…。 又扯远了,回到我熟悉的路由协议,配置管理,OAM,北向接口等控制类应用来说。这些应用有一定的变化,但又不大,要求性能,但又不会海量,最好还能赶个时髦,支持虚拟化,弹性,多核并发,当然还要开发简单,容易维护。这里我自然想到了Golang,Golang是编译型语言,性能不错,又隐藏了并发处理中调度和通讯的细节。

####接着黑#### 当然如果你有华为的团队,你完全可以用C语言来搞定一切,一个应用协议20人维护,一个系统至少1000人交叉开发。产品性能不错,开发效率很低,软件维护痛苦,产品演进缓慢。 地球上没有几个这样的平台,所以如果我是架构师,我也许会用一个转发平面erlang,控制平面golang的结构。erlang代码两成,处理八成工作,重在并发。golang代码八成,实际两成常用,重在性价比。当然这是我的臆想了…想喷请留言…

####FIN#### Golang是一门中庸的语言,每个方面都是80分,当你它注定不是文艺青年的最爱,对我这种媳妇口中的“性价比哥”来说再好不过。看来我已经把使用一种语言上升到价值观的高度了,不能再远了。 好吧,说个近的,其实我对golang感兴趣,是因为它的吉祥物gopher很萌,像个屌丝二货工程师。

P.S. 关于这丑陋的贴图

是这周我的Bitcoin自动交易机器人(绰号:无脑赔钱货)7*24小时无中断的一周交易记录

时间 动作 成交价 收益率(100%) 币数(100元)
2014-01-12 10:33:08 卖出 5410.0 5.9879%
2014-01-12 05:22:41 买入 5440.0 0.019591
2014-01-12 04:53:41 卖出 5405.01 6.5756%
2014-01-12 04:22:20 买入 5421.99 0.019718
2014-01-12 03:03:25 卖出 5395.03 6.9104%
2014-01-11 17:00:47 买入 5310.89 0.019816
2014-01-11 14:35:13 卖出 5256.11 5.2430%
2014-01-10 23:52:51 买入 5006.66 0.020023
2014-01-10 21:48:00 卖出 4990.01 0.2483%
2014-01-10 16:19:50 买入 5020.0 0.020090
2014-01-10 12:41:22 卖出 4982.1 0.8508%
2014-01-10 04:30:13 买入 4972.0 0.020243
2014-01-10 02:34:09 卖出 4888.01 0.6463%
2014-01-10 01:32:42 买入 4968.0 0.020590
2014-01-09 19:36:13 卖出 4956.12 2.2934%
2014-01-09 04:52:09 买入 4807.99 0.020640
2014-01-08 22:08:13 卖出 4870.0 -0.7640%
2014-01-08 17:16:22 买入 4908.99 0.020377
2014-01-08 13:32:47 卖出 4812.0 0.0307%
2014-01-08 10:30:40 买入 5061.4 0.020788
2014-01-08 10:27:43 卖出 5695.0 5.2152%
2014-01-07 08:35:17 买入 5668.01 0.018475
2014-01-07 07:32:38 卖出 5612.01 4.7165%
2014-01-07 05:26:13 买入 5736.59 0.018659
2014-01-06 20:22:46 卖出 5786.01 7.0411%
2014-01-06 08:22:10 买入 5464.56 0.0185
2014-01-06 07:06:24 卖出 5358.0 1.0943%

机器人启动时是持币状态,差不多从5300开始(100元=0.018868 Bitcoin),截至这篇文章结束差不多也是回到5300(105.99元=0.019997 Bitcoin)。

本周结果我很满意,但市场总是会调节的,需要运气。

机器人是Python脚本,因为Python很擅长http和JSON处理,适合做原型。我也正在尝试用golang重写它,做得完善一些。如果有人感兴趣,我可以写写关于Bitcoin的话题。