我最近将一个系统从Node重构到了Go,花了大概两周多的时间,这个过程也是不得已而为之,因为公司开发的系统最终需要部署到客户的服务器,而又不想暴露源码。

但是NodeJs开发的系统却无法从根本上来保护源码,由于JavaScript是个解释型的脚本语言(实际上现在已不是直接解释),因此,即便有各种加壳加密方案,但是运行时还是要解压出源码(即便是在内存)。那么只能把目光投向其他语言了,这个语言首先不能是脚本语言,那么PHP,Python,Ruby就直接Pass掉了;然后是编译成中间字节码的java和C#,貌似会更安全一些,但是还是可以很轻易的被反编译到源码,虽然加壳混淆等技术,但毕竟治标不治本,还是不放心;接下来那就只剩下静态编译型语言了(实际上是指直接编译到机器码的语言),这类语言是直接编译到二进制,执行的时候不需要依赖任何运行时环境,可直接执行编译好的二进制程序,那么想把二进制代码最终反编译到源码,几乎是不可能的,顶多能拿到汇编代码,然后想要根据汇编代码反推逻辑...那我估计他会晕死在半路上,,,因此,终极方案就是采用一种直接编译到机器码的语言进行重构,可选的较成熟语言有:C/C++,Go,Rust,更进一步得讲,只有Go和Rust可选,C/C++就是做底层,做系统的,做web还是想都不要想,Go和Rust相比,明显Go这几年的生态更好一些,做起Web来坑会更少一些。经过各种方案的对比斟酌,我们最终决定采用Golang这门语言对系统进行重构,这样,我们最终发布到客户服务器上的就只是一个可执行文件,以及一些配置文件和静态页面文件,Go源码就无法拿到了。

我使用NodeJs已经有两年了,我不敢说精通,但最起码是相当熟悉了,相当亲切了,这个环境里的一切都是那么自然,那么舒服。可人都有一个弱点,就是在一个熟悉的环境待久了,会本能地抗拒新的环境,新的事物,尤其是成年人。因此,突然来到一个陌生的环境,会有种种不适,会有一段相当艰难的磨合期。感性就是这样,可理性告诉我,为了达到最优目标,应该抛弃原有的偏见和有色眼镜(其实我一直认为用Golang做Web开发不是最优的方案,尽管它是一门很便捷的静态语言),去做该做的事情。

JavaScript和Go的本质区别是:一个是无类型的动态语言,一个是强类型的静态语言。这个本质区别也决定了不同的编程体验(虽然Go融入了一些脚本语言的味道),强类型就是强类型,即便搞了个自动类型推断,你也处处摆脱不了类型,你需要多花一些额外精力去把所有变量的类型搞清楚,这对于一个从弱类型语言转过来的人是相当折磨,写起来会让人感觉拖拖拉拉和麻烦,使人无法一心专注业务逻辑,会明显感觉到增加了额外的心智负担。就好像你开惯了自动挡,再回去开手动挡就会觉得很麻烦很累。代码啰嗦重复我都可以忍,可就是这个类型问题真的折磨到我一度想打退堂鼓,看来真的是被弱类型语言“惯坏了”,说句实话:如果不是出于保护代码考虑,我仍会毫不犹豫地选择NodeJs来开发,开发效率实在不是一个级别的。可这就是事实,鱼与熊掌总是不能兼得!!!你想要静态编译的特性,你就得牺牲开发的便捷性。其实从另一个角度想想,Go作为一门静态语言,能做到这步已经算很不错了,想想用C/C++来写业务...,Go已经算是很便捷了。所以,放下抱怨,接受现实吧!

不过令我欣慰的是,Golang这门语言确实有它不可掩盖的优势:1. 系统运行速度明显感觉会快点儿;2. 编译速度挺快,搞个热编译跟Node是一个体验,Ctrl+S瞬间就编译好了;3. 部署方便,干脆利落;4.七牛云开发的Golang嵌入脚本qlang可以极大提高开发便捷性。除了这几个明显的优势外,还有些地方感觉体验不错:代码提示比较完善准确(由于是强类型),因而可以加快一点编码速度,也降低了出错的概率;

记得有句话叫:不要去做你喜欢做的,要去喜欢你现在做的!也确实应该要这样,何必折磨自己,既然别无选择,那就好好去爱

从Node到Go的心路之旅的更多相关文章

  1. mac 如何卸载node和npm采坑之旅

    因为本地npm一直报错,所以决定直接卸载node和npm,重新装.第一次卸载,具体咱也不会呀!能咋整呢,百度呗 茫茫百度中各种找呀,找到一个转载最多的方法 sudo npm uninstall npm ...

  2. 从「Hello World」说起

    标签: node模块 从一个简单「hello world」程序对 node.js 有个感性的认识. const http = requier ('http'); const pathname = '1 ...

  3. 蒲公英 · JELLY技术周刊 Vol.13 跟 VSCode 学习如何开发大型 IDE 项目

    开发一个 IDE 很难么?这或许是件很难的事情,但当我们参考 VSCode 的技术构架来看,整个开发流程就会平滑顺畅很多,从内核开发.代码编辑器.视图结构到插件系统,在这整个技术构架中我们可以看到很多 ...

  4. babeljs源码

    babel.min.js!function(e,t){"object"==typeof exports&&"object"==typeof mo ...

  5. Node.js 自学之旅

    学习基础,JQuery 原生JS有一定基础,有自己一定技术认知(ps:原型链依然迷糊中.闭包6不起来!哎!) 当然最好有语言基础,C#,java,PHP等等.. 最初学习这个东西的原因很简单,在园子里 ...

  6. Node.js 自学之旅(初稿篇)

    学习基础,JQuery 原生JS有一定基础,有自己一定技术认知(ps:原型链依然迷糊中.闭包6不起来!哎!) 当然最好有语言基础,C#,java,PHP等等.. 最初学习这个东西的原因很简单,在园子里 ...

  7. Ubuntu下Node.js开发起步之旅

    因为忙其它的事,把Node.js的学习放下了快两个月了,世事变化还真快,发现很多东东都改变了,express已经升级到4.x了,变化还不小! 我原来的学习过程是在VirtualBox中安装Ubuntu ...

  8. 微软与Node.js的开源之旅

    微软近年来在开源领域可谓是大刀阔斧的前进中,继2015年微软与红帽合作,微软智能云Azure与Linux进一步融合等举措之后,2016年,微软继续加大开源之举,大力推进Node.js的开发和开源社区的 ...

  9. 【react native】有关入坑3个月RN的心路历程

    由于一些原因,笔者最近变更到了RN的团队,回归到了hybrid app的开发的圈子中,固然是有蛮多新鲜感和新机遇的,不过遥想起以前在hybrid中各种view之前跳转的头疼等各种问题,笔者怀着忐忑的心 ...

随机推荐

  1. Javascript Date类型

      Date 类型使用自 UTC 1970 年 1 月 1日 午夜 开始经过的毫秒数来保存日期.   创建日期对象 var now = new Date();//获取当前日期   Date.parse ...

  2. javascript的数组之splice()

    splice()方法通过删除现有元素和/或添加新元素来更改一个数组的内容.修改数组自身 var months = ['Jan', 'March', 'April', 'June']; months.s ...

  3. 菜鸟详细解析Cookie注入原理

    一.SQL注入原理 我以aspx为例,现在我们来研究下Cookie注入是怎么产生的,在获取URL参数的时候,如果在代码中写成Request[“id”],这样的写法问题就出现了.我先普及下科普知识,在a ...

  4. | dp-the Treasure Hunter

    题目: A. Mr. Kitayuta, the Treasure Hunter time limit per test 1 second memory limit per test 256 mega ...

  5. Facebook AI的工业级NLP开源框架—— Pytext

    PyText是基于NLP深度学习技术.通过Pytorch构建的建模框架.PyText解决了既要实现快速实验又要部署大规模服务模型的经常相互冲突.并且,Facebook已经采用了使用PyText快速迭代 ...

  6. 学习ActiveMQ(八):activemq消息的持久化

    1. 持久化方式介绍前面我们也简单提到了activemq提供的插件式的消息存储,在这里再提一下,主要有以下几种方式: AMQ消息存储-基于文件的存储方式,是activemq开始的版本默认的消息存储方式 ...

  7. react高阶组件的使用

    为了提高代码的复用在react中我们可以使用高阶组件 1.添加高阶组件 高阶组件主要代码模板HOC.js export default (WrappedComponent) => { retur ...

  8. linux查看所有用户信息

    所有的用户信息在根目录/etc/中passwd文件内,而passwd的所有权限是root用户及root组用户,所有想要查看所有用户,需要root用户登录系统. root用户登录后,可以直接用查看命令c ...

  9. Oracle数据泵远程导入数据

    查看现存镜像目录 select * from dba_directories; 创建镜像目录 create or replace directory my_dir as 'local_dir' ; 把 ...

  10. chrome通过devtools来查看Devtools Extension与浏览器内核实际通信的数据情况

    1.chrome通过devtools来查看Devtools Extension与浏览器内核实际通信的数据情况,步骤如下: (1)开启开发者工具实验模式 ---浏览器进入chrome://flags - ...