我最近将一个系统从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. 微信小程序免费Https获取以及Ubuntu Nginx配置

    先贴上Nginx的配置文件 user www-data; worker_processes auto; pid /run/nginx.pid; events { worker_connections ...

  2. HDU 2008 数值统计

    题目链接:HDU 2008 Description 统计给定的n个数中,负数.零和正数的个数. Input 输入数据有多组,每组占一行,每行的第一个数是整数n(n<100),表示需要统计的数值的 ...

  3. __x__(7)0905第二天__HTML的发展

    HTML的发展 浏览器各个厂商有不同的标准,一个网页的兼容性非常差. 于是,W3C出来了,作为公益组织定义了HTML标准. 在 1993.6 实现并发布了第一个 HTML. 在 1995.11 开始创 ...

  4. ECMA Script 6_模块加载方案 ES6 Module 模块语法_import_export

    1. 模块加载方案 commonJS 背景: 历史上,JavaScript 一直没有模块(module)体系, 无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来. 其他语言都有这项功能: ...

  5. Jvm 中的 重排序、主存、原子操作

    一.重排序 好处:重排序可以提升性能,避免在一个耗时很长的指令在“执行”阶段呆很长时间,而导致后续的指令都卡在“执行”之前的阶段上. 坏处:重排序对多线程的影响 class ReorderExampl ...

  6. about this blog

    这个博客大概是被我用来整理模板的吧╮(╯▽╰)╭ 因为本小盆友巨懒,99.9%是不会写什么题解或者学习笔记什么的

  7. 自动化测试如何使用driver.findElements去操作页面元素

    当你要操作的元素页面有很多个的时候,如下图这样,你想使用".datagrid-row-expander.datagrid-row-expand"这个cssSelector,这个时候 ...

  8. Linux下面使用命令如何运行.sh文件的两种解决办法

    Linux下面用命令如何运行.sh文件的方法,有两种方法: 一.直接./加上文件名.sh,如运行hello.sh为./hello.sh[hello.sh必须有x权限] 二.直接sh 加上文件名.sh, ...

  9. day25:接口类和抽象类

    1,接口类和抽象类知识背景:一开始在程序界是没有这些概念的,后来就流行了一种语言叫做JAVA,JAVA是一种典型的纯面向对象的语言,JAVA写的程序都是非常适用于更庞大的项目,很多程序员就总结出了一些 ...

  10. delphi调用windows自带语音功能

    windows自带语音接口 SAPI.SpVoice, 接口说明如下 https://docs.microsoft.com/en-us/previous-versions/windows/deskto ...