我最近将一个系统从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. CSS(六)

    CSS权重 CSS权重指的是样式的优先级,有两条或多条样式作用于一个元素,权重高的那条样式对元素起作用,权重相同的,后写的样式会覆盖前面写的样式. 权重的等级 可以把样式的应用方式分为几个等级,按照等 ...

  2. day11_单元测试_读取yaml文件中的用例,自动获取多个yaml文件内容执行生成报告

    一.使用.yaml格式的文件直接可以存放字典类型数据,如下图,其中如果有-下一行有缩进代表这是个list,截图中是整体是一个list,其中有两部分,第二部分又包含另外一个list 二.单元测试:开发自 ...

  3. Java try-cath-finally异常

    Java 内置异常类 Java 语言定义了一些异常类在 java.lang 标准包中. 标准运行时异常类的子类是最常见的异常类.由于 java.lang 包是默认加载到所有的 Java 程序的,所以大 ...

  4. js面向对象关键点

    函数加new 工作流程: (1) 创建一个新对象: => var this = new Object(); (2) 将构造函数的作用域赋给新对象(因此 this 就指向了这个新对象) : (3) ...

  5. Selenium 3----WebDriver常用方法

    在学会定位元素的基础上,进行元素的操作. WebDriver常用方法: clear(): 清除文本. send_keys (value): 模拟按键输入. click(): 单击元素. submit( ...

  6. STREAMING HIVE流过滤 官网例子 注意中间用的py脚本

    Simple Example Use Cases MovieLens User Ratings First, create a table with tab-delimited text file f ...

  7. 用servlet进行用户名和密码校验1

    运行效果如下: 代码截图: 登陆网页: 显示网页: 网盘链接: 链接:https://pan.baidu.com/s/1g5XJ6y8u5R5Wt0Lkj9g9lg 提取码:bphb

  8. Vue2.2版本学习小结

    一.项目初始化继续参考这里 https://github.com/vuejs-templates/webpack-simple 或者 https://github.com/vuejs-template ...

  9. 理解 Memory barrier(内存屏障)无锁环形队列

    原文:https://www.cnblogs.com/my_life/articles/5220172.html Memory barrier 简介 程序在运行时内存实际的访问顺序和程序代码编写的访问 ...

  10. Python insert()方法--list

    描述 insert()方法:用于向列表中指定的索引位置之前插入新的对象,因为是在对应目标之前插入,故此方法无法像append()方法一样将对象添加到列表末尾. 语法 语法格式:list.insert( ...