从Node到Go的心路之旅
我最近将一个系统从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的心路之旅的更多相关文章
- mac 如何卸载node和npm采坑之旅
因为本地npm一直报错,所以决定直接卸载node和npm,重新装.第一次卸载,具体咱也不会呀!能咋整呢,百度呗 茫茫百度中各种找呀,找到一个转载最多的方法 sudo npm uninstall npm ...
- 从「Hello World」说起
标签: node模块 从一个简单「hello world」程序对 node.js 有个感性的认识. const http = requier ('http'); const pathname = '1 ...
- 蒲公英 · JELLY技术周刊 Vol.13 跟 VSCode 学习如何开发大型 IDE 项目
开发一个 IDE 很难么?这或许是件很难的事情,但当我们参考 VSCode 的技术构架来看,整个开发流程就会平滑顺畅很多,从内核开发.代码编辑器.视图结构到插件系统,在这整个技术构架中我们可以看到很多 ...
- babeljs源码
babel.min.js!function(e,t){"object"==typeof exports&&"object"==typeof mo ...
- Node.js 自学之旅
学习基础,JQuery 原生JS有一定基础,有自己一定技术认知(ps:原型链依然迷糊中.闭包6不起来!哎!) 当然最好有语言基础,C#,java,PHP等等.. 最初学习这个东西的原因很简单,在园子里 ...
- Node.js 自学之旅(初稿篇)
学习基础,JQuery 原生JS有一定基础,有自己一定技术认知(ps:原型链依然迷糊中.闭包6不起来!哎!) 当然最好有语言基础,C#,java,PHP等等.. 最初学习这个东西的原因很简单,在园子里 ...
- Ubuntu下Node.js开发起步之旅
因为忙其它的事,把Node.js的学习放下了快两个月了,世事变化还真快,发现很多东东都改变了,express已经升级到4.x了,变化还不小! 我原来的学习过程是在VirtualBox中安装Ubuntu ...
- 微软与Node.js的开源之旅
微软近年来在开源领域可谓是大刀阔斧的前进中,继2015年微软与红帽合作,微软智能云Azure与Linux进一步融合等举措之后,2016年,微软继续加大开源之举,大力推进Node.js的开发和开源社区的 ...
- 【react native】有关入坑3个月RN的心路历程
由于一些原因,笔者最近变更到了RN的团队,回归到了hybrid app的开发的圈子中,固然是有蛮多新鲜感和新机遇的,不过遥想起以前在hybrid中各种view之前跳转的头疼等各种问题,笔者怀着忐忑的心 ...
随机推荐
- Python开发技术详解PDF
Python开发技术详解(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1F5J9mFfHKgwhkC5KuPd0Pw 提取码:xxy3 复制这段内容后打开百度网盘手 ...
- 03-JavaScript
上一次内容进行复习: CSS: 层叠样式表 主要作用: 美化页面, 将美化和HTML进行分离,提高代码复用性 选择器: 元素选择器: 元素的名称{} 类选择器: . 开头 ...
- angularjs 初始化方法执行两次以及url定义错误导致传值错误问题
1.初始化方法执行两次以上的问题定义一个 route.如下所示:.state('main.channelQryDetail', { url:'/channelDetail/:channelNo/:pa ...
- Node.js_express_中间件 middleware_登录/注册实例源代码
静态资源: 都写死了的资源,如 css,html 解析规则: 所有路由和中间件都在一个数组中,js 引擎会按照代码先后顺序添加路由和中间件 当请求发送到服务器时,服务器获取当前的请求信息(请求方式.请 ...
- 9、vuex快速上手
vue脚手架 npm install -g vue-cli usage: vue init example: vue init webpack myvue 安装vuex: npm i -S vuex ...
- 【C++ 流类库与输入输出 】实验七
1. 基础练习 (1)教材习题 11-7 (2)教材习题 11-3 (3)教材习题 11-4 2. 应用练习 (1)已知有班级名单文件 list.txt(见实验 7 附件包).编写一个应用程序实现随机 ...
- Java代码导入导出 Excel 表格最简单的方法
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStrea ...
- atom编辑器安装插件报错。。
Checking for native build tools failed gyp info it worked if it ends with ok gyp info using node-gyp ...
- Python全栈-magedu-2018-笔记2
第二章 - Python 基础语法 基本语法 注释 -- # 标注的文本 数字 整数,不区分long和int 进制0xa.0o10.0b10 bool,2个值True.False 浮点数 1.2.3. ...
- NoSQL数据库常见分类
1.列式数据库HBaseBigTable2.K-V数据库RedisCassandraLevelDBMemCacheEhcache3.文档数据库MongoDBCouchDB4.全文搜索引擎Elastic ...