用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语言做产品半年的一些感觉的更多相关文章

  1. [Windows Phone] 以多国语言做为开发前提 (1)

    原文:[Windows Phone] 以多国语言做为开发前提 (1) ? 前言 在先前 TechDays 2013 的课程 [开发 Windows Phone 商务应用程式就是这麽快] 中,其中一个部 ...

  2. 【转】做产品VS做项目

    相关定义 根据GB/T19000—2008<质量管理体系基础和术语>,有以下定义 过程process 一组将输入转化为输出的相互关联或相互作用的活动 注:一个过程的输入通常是其他过程的输出 ...

  3. [Windows Phone] 以多国语言做为开发前提 (2)

    原文:[Windows Phone] 以多国语言做为开发前提 (2) ? 前言 在先前的文章 [Windows Phone 开发 - 以多国语言做为开发前提 (1)] 中说明了简单的多国语言范例,今天 ...

  4. 用R语言 做回归分析

    使用R做回归分析整体上是比较常规的一类数据分析内容,下面我们具体的了解用R语言做回归分析的过程. 首先,我们先构造一个分析的数据集 x<-data.frame(y=c(102,115,124,1 ...

  5. 京东无人超市的成长之路 如何利用AI技术在零售业做产品创新?

    随着消费及用户体验的需求升级.人货场的运营效率需求提升.人工智能技术的突破以及零售基础设施的变革等因素共同推动了第四次零售革命的到来,不仅在国内,国外一线巨头互联网亚马逊等企业都在研发无人驾驶.无人超 ...

  6. 产品相关 做产品VS做项目

    做产品VS做项目 by:授客 QQ:1033553122 相关定义 根据GB/T19000—2008<质量管理体系基础和术语>,有以下定义 过程process 一组将输入转化为输出的相互关 ...

  7. 继续C#开发or转做产品

    本人今年大四,C#开发,在一家公司实习了一年后,面临一个选择,是继续C#开发还是转做产品?我C#开发能力目前还一般,但很有兴趣.也喜欢设计与创意,做过产品专员.求大婶们指导!

  8. 使用R语言预测产品销量

    使用R语言预测产品销量 通过不同的广告投入,预测产品的销量.因为响应变量销量是一个连续的值,所以这个问题是一个回归问题.数据集共有200个观测值,每一组观测值对应一种市场情况. 数据特征 TV:对于一 ...

  9. 想要转行/入行做产品经理,你得先get这些正确姿势

    转自:https://mp.weixin.qq.com/s/Bh9QEihdV1JLWwB5I4VJ7Q 参考: 张小龙首次公开演讲(官方无删减版) 前腾讯高级产品经理:如何用“女性思维”做更好的产品 ...

随机推荐

  1. win10 环境 gitbash 显示中文乱码问题处理

    gitbash 是 windows 环境下非常好用的命令行终端,可以模拟一下linux下的命令如ls / mkdir 等等,如果使用过程中遇到中文显示不完整或乱码的情况,多半是因为编码问题导致的,修改 ...

  2. .Net Core MVC 网站开发(Ninesky) 2.4、添加栏目与异步方法

    在2.3中完成依赖注入后,这次主要实现栏目的添加功能.按照前面思路栏目有三种类型,常规栏目即可以添加子栏目也可以选择是否添加内容,内容又可以分文章或其他类型,所以还要添加一个模块功能.这次主要实现栏目 ...

  3. H5坦克大战之【建造敌人的坦克】

      公司这几天在准备新版本的上线,今天才忙里偷闲来写这篇博客.接着上一篇的"H5坦克大战之[玩家控制坦克移动2]"(http://www.cnblogs.com/zhouhuan/ ...

  4. 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)

    从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  5. Canvas坐标系转换

    默认坐标系与当前坐标系 canvas中的坐标是从左上角开始的,x轴沿着水平方向(按像素)向右延伸,y轴沿垂直方向向下延伸.左上角坐标为x=0,y=0的点称作原点.在默认坐标系中,每一个点的坐标都是直接 ...

  6. 学习ASP.NET Core, 怎能不了解请求处理管道[5]: 中间件注册可以除了可以使用Startup之外,还可以选择StartupFilter

    中间件的注册除了可以借助Startup对象(DelegateStartup或者ConventionBasedStartup)来完成之外,也可以利用另一个叫做StartupFilter的对象来实现.所谓 ...

  7. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第一章:创建基本的MVC Web站点

    在这一章中,我们将学习如何使用基架快速搭建和运行一个简单的Microsoft ASP.NET MVC Web站点.在我们马上投入学习和编码之前,我们首先了解一些有关ASP.NET MVC和Entity ...

  8. [C#] C# 知识回顾 - 学会处理异常

    学会处理异常 你可以使用 try 块来对你觉得可能会出现异常的代码进行分区. 其中,与之关联的 catch 块可用于处理任何异常情况. 一个包含代码的 finally 块,无论 try 块中是否在运行 ...

  9. SQL Server2016升级前几点自检

    SQL Server2016已经出来一段时间了,而且最新的SP1包也于2016年11月18日正式发布,各种新的特性推出让我们跃跃欲试.那么对于我们真实的业务环境,特别是生产环境要不要"跟风& ...

  10. 前端MVC学习总结(一)——MVC概要与angular概要、模板与数据绑定

    一.前端MVC概要 1.1.库与框架的区别 框架是一个软件的半成品,在全局范围内给了大的约束.库是工具,在单点上给我们提供功能.框架是依赖库的.AngularJS是框架而jQuery则是库. 1.2. ...