用Go语言做产品半年的一些感觉
用Go语言做产品刚好半年,有一些感觉跟大家说道说道。
在使用Go之前,我常常想象,无法使用先进的Debug工具会对工作进度造成多么巨大的影响。甚至在Visual Studio的娇惯下认为,不能调试基本就无法正确的写出代码了。
由于我在Windows平台,能够支持Go语言调试的gdb老是无法工作,所以在这半年中,我一次都没有打过断点,也没有开启过一次单步跟踪。刚开始我心里非常没底,只好老老实实为每一个方法写测试代码,每开发完一个功能之后就运行所有测试。这个方法其实也算是家喻户晓的了,但很奇怪,我在写C#的时候并不会自觉地这样做。只有在一些非常特殊的部分会写部分测试代码。
事后我想了想,懒惰只是其中一个原因,还有一个原因是“编译速度”。众所周知,Go语言的编译速度是非常快的。平时看到这个消息应该没什么感觉,一旦开始写一段就执行一次”编译-》测试“,效果马上就出来了。我的项目目前约有3万行代码,编译速度平均时间2秒。再加上SublimeText3里面方便的GoSublime插件,写完代码 Ctrl+. Ctrol+r,几秒之后就看到结果了。非常方便。
当然,你可能说这样的事情在Visual Studio里面也很容易能做到,哈,你说的对,但你坚持写一段就来一次试试看,会有被打断的感觉。(我可能有编辑器强迫症,以前喜欢Vim,现在爱SublimeText,总觉得图形化IDE的各种面板很容易让我分神,大家别较真,:P)
以前每次碰到bug,必须用单步调式跟下去,现在武功被废了,我只能硬着头皮肉眼看代码,不时用print把变量值打出来看看。一段时间之后我发现碰到bug的次数在减少。语言熟练度增加是一方面,但我自认是个粗心的人,况且写了近10年C#也没这种感觉。
仔细想了想,我觉得是Go语言本身的简洁带来的好处。Go语言的语法和特性就那么点,清清楚楚,没有什么诡异的技巧,也没太多花哨的概念。写之前不需要去看”Go语言注意事项100条“之类的东西。再加上编译器的严格提示(比如声明一个变量不赋值会导致编译无法通过),很大程度上保证了不会因为疏忽而写出”神奇“的代码。
在这里还得提一下Go语言在问世之初就固执的带上的一个小工具”GoFmt”,它的作用很简单,格式化Go代码。当初我还挺纳闷,这东西可有可无,早期有这时间做点别的什么不好?
现在明白了,代码的可读性对于程序员来说再重要不过了。这让肉眼找问题舒服了不少。
所以一套组合拳下来,简洁的语法设计+极好的代码可读性+严格的编译器+内置的测试支持 = 非常舒适的编写体验+高质量的代码。
大家应该都对“最佳实践”这个词又爱又恨,应该都过这种场景:要实现一个功能,但脑子里出现了两三种实现方式,于是花了很长时间做选择。当然,对系统级的设计,这样做无可厚非。但如果是非常简单的功能,比如“这里究竟应该用指针呢?还是指针的指针呢?还是数组呢?还是链表?“,这种选择的痛苦就显得意义不大了。
在写Go的时候我很少会被这种问题挡住,不需要考虑这里究竟是传递引用还是传递值,到底是深拷贝还是浅拷贝。不知不觉间编写过程就非常顺滑,真正的专注到了业务逻辑上。大家也可以骂我没出息,这种基础问题还会纠结?水平太差了吧!可是,能用三行代码表达的逻辑,为什么要用十行呢?这个道理大家都懂,嘿嘿,那运用到语言设计上应该也是一样的吧。
另外一点就是部署上的舒服了。反正Go语言的程序到最后编译出来都是一个可执行文件,跑起来就行了。这句话看起来没什么意义对吧?好,那咱就先来聊聊如何部署一个网站,安装Apache,安装xxxMod(比如Python和Ruby),配置xxx(此处省略200字),中间还要注意各个模块的版本哦,否则遇到各种不明白的错误还得抓掉无数头发。
Go语言呢?编译,运行。什么?恩,就是这么简单。不要Apache或者其他Http服务器了?不要。那不是很不科学?呃,是有点魔幻。
以前一直觉得IIS和Apache都是很黑很大的一坨东西,里面全是超科技,配置文件也很高深,高人过来这里改改那里改改默默的性能就提高了n倍。
刚开始还觉得一个可执行文件孤零零的跑起来好单薄,等理解的更多之后就发现其实Http服务器的核心概念就这么几个,Go语言内置支持了,所以这么轻便就能跑了。
不觉得厉害?恩,考虑一下更新代码的场景呢?关闭实例,更新代码,编译,运行(更新时间如何让服务不间断咱先不讨论,这需要其他服务器配合)。很省心。
特别像我这种windows程序员,本来面对linux的时候就各种心惊胆颤,各种不熟悉,要是让我再去修改修改文件夹权限什么的我就炸了。
好吧,唠唠叨叨说了一堆,总结下来就一点。我已经从Go语言的粉丝变成死忠了(所以大家也不用费口舌来跟我辩论了哈哈),看到Go语言就开心,写着舒心,用着顺心。
你要是看到这儿了,那就顺便提一句,我们打算在1月份召一个Go语言的服务器端工程师,如果你碰巧喜欢Go语言,爱看网络小说,对算法充满了爱,又身在上海,那不妨找我聊聊,咱也许能一起开开心心的做个好东西出来。
用Go语言做产品半年的一些感觉的更多相关文章
- [Windows Phone] 以多国语言做为开发前提 (1)
原文:[Windows Phone] 以多国语言做为开发前提 (1) ? 前言 在先前 TechDays 2013 的课程 [开发 Windows Phone 商务应用程式就是这麽快] 中,其中一个部 ...
- 【转】做产品VS做项目
相关定义 根据GB/T19000—2008<质量管理体系基础和术语>,有以下定义 过程process 一组将输入转化为输出的相互关联或相互作用的活动 注:一个过程的输入通常是其他过程的输出 ...
- [Windows Phone] 以多国语言做为开发前提 (2)
原文:[Windows Phone] 以多国语言做为开发前提 (2) ? 前言 在先前的文章 [Windows Phone 开发 - 以多国语言做为开发前提 (1)] 中说明了简单的多国语言范例,今天 ...
- 用R语言 做回归分析
使用R做回归分析整体上是比较常规的一类数据分析内容,下面我们具体的了解用R语言做回归分析的过程. 首先,我们先构造一个分析的数据集 x<-data.frame(y=c(102,115,124,1 ...
- 京东无人超市的成长之路 如何利用AI技术在零售业做产品创新?
随着消费及用户体验的需求升级.人货场的运营效率需求提升.人工智能技术的突破以及零售基础设施的变革等因素共同推动了第四次零售革命的到来,不仅在国内,国外一线巨头互联网亚马逊等企业都在研发无人驾驶.无人超 ...
- 产品相关 做产品VS做项目
做产品VS做项目 by:授客 QQ:1033553122 相关定义 根据GB/T19000—2008<质量管理体系基础和术语>,有以下定义 过程process 一组将输入转化为输出的相互关 ...
- 继续C#开发or转做产品
本人今年大四,C#开发,在一家公司实习了一年后,面临一个选择,是继续C#开发还是转做产品?我C#开发能力目前还一般,但很有兴趣.也喜欢设计与创意,做过产品专员.求大婶们指导!
- 使用R语言预测产品销量
使用R语言预测产品销量 通过不同的广告投入,预测产品的销量.因为响应变量销量是一个连续的值,所以这个问题是一个回归问题.数据集共有200个观测值,每一组观测值对应一种市场情况. 数据特征 TV:对于一 ...
- 想要转行/入行做产品经理,你得先get这些正确姿势
转自:https://mp.weixin.qq.com/s/Bh9QEihdV1JLWwB5I4VJ7Q 参考: 张小龙首次公开演讲(官方无删减版) 前腾讯高级产品经理:如何用“女性思维”做更好的产品 ...
随机推荐
- LeetCode-4MedianofTwoSortedArrays(C#)
# 题目 4. Median of Two Sorted Arrays There are two sorted arrays nums1 and nums2 of size m and n resp ...
- Python学习--04条件控制与循环结构
Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...
- 旺财速啃H5框架之Bootstrap(二)
突然感觉不知道写啥子,脑子里面没水了,可能是因为今晚要出去浪,哈哈~~~提前提醒大家平安夜要回家哦,圣诞节生00000000000这么多蛋....继续 上一篇的已经把bootstrap了解个大概了,接 ...
- .net 分布式架构之任务调度平台
开源地址:http://git.oschina.net/chejiangyi/Dyd.BaseService.TaskManager .net 任务调度平台 用于.net dll,exe的任务的挂载, ...
- Android之数据存储的五种方法
1.Android数据存储的五种方法 (1)SharedPreferences数据存储 详情介绍:http://www.cnblogs.com/zhangmiao14/p/6201900.html 优 ...
- iOS7 NavigationController 手势问题
在iOS7中,如果使用了UINavigationController,那么系统自带的附加了一个从屏幕左边缘开始滑动可以实现pop的手势.但是,如果自定义了navigationItem的leftBarB ...
- Linux设备管理(五)_写自己的sysfs接口
我们在Linux设备管理(一)_kobject, kset,ktype分析一文中介绍了kobject的相关知识,在Linux设备管理(二)_从cdev_add说起和Linux设备管理(三)_总线设备的 ...
- Quartz
Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中.它提供了巨大的灵 活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复杂的调度. eg: ja ...
- BZOJ 4453: cys就是要拿英魂![后缀数组 ST表 单调栈类似物]
4453: cys就是要拿英魂! Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 90 Solved: 46[Submit][Status][Discu ...
- centos7+mono4.2.3.4+jexus5.8.1跨平台起飞
很早之前就开始关注.net跨平台,最近正好测试了下用EF6连接mysql,于是就想直接把网站扔进Linux.查了很多资料,鼓捣了两个晚上,终于成功. 这里我使用的是budgetvm的1G openvz ...