最近我退出了一个应用 Go 语言的项目组。因为此前对 Go 语言的理解还停留在实践意识的阶段,没有大型项目的教训,退出这个项目组让我算是真正体验了一把 Go 语言,职业技能树也更加丰盛了起来。
Go 语言的很多语言个性让人耳目一新,而最让我感到震撼的莫过于 Go 语言服务开发流程的简略便捷 ,通过 Go Build 进去的二进制文件,公布到服务器后,间接就能够运行。
相比 C /C++ 语言进去的二进制文件来说, 无需治理一大堆依赖、解决各种动静库、动态库等等的问题 ,且 C /C++ 语言的开发流程,如果是和性能平台相干的程序,光是开发环境、编译环境就可能折腾集体几天,相比之下,Go 语言的开发流程让人感觉难受。
当然了,我也不是无脑宣扬 Go 语言,在 Go 语言的应用过程中也有一些不解和纳闷,为此也专门横向地比照了一下本人相熟的语言:Java、C/C++、Python,次要是后盾的语言。
开发环境
就开发环境而言,Go 语言是最让人省心的;当然 Java 也很省心,只须要在本地和生产环境别离装置了 JDK,其余根本和 Go 相似了,Java 因为 JVM 中间层能够随处运行,Go 的二进制可能须要依据二进制平台从新编译,然而当初支流的平台根本都曾经对立了 Linux 版本,所以 Go 语言二进制我目前是没有遇到须要别离编译的状况。
C/C++、Python 的开发环境就有点一言难尽了,先说 Python,尽管 Python 应用简略,然而短暂依赖历史版本 2.x 和 3.x 互相不兼容以及各种依赖包的问题,也是让很多开发者感到困扰,尽管有 pyenv 等环境治理的工具,为凌乱的环境治理隔离出一片平静之地。然而,只能说没有比照就没有挫伤。
再说 C /C++,因为是和平台强相干的语言,所以就链接库、门路、符号表等等,都和底层操作系统的关联更加亲密一些,对开发者的要求也绝对更高,但即便是优良的开发者,也时常得被 C /C++ 搞得焦头烂额,特地是波及对他人的依赖的时候,因为编译时的平台、依赖等等,局部函数的符号信息不统一、菱形依赖等问题是最难搞定的,大型的 C /C++ 我的项目须要弱小的业余的团队进行环境治理。
运行性能
性能这个陈词滥调了,其实就当初的开发而言,服务对性能的要求曾经没有前辈们的那个时代那么高了,此前看过小时候玩的那些马里奥、魂斗罗等的游戏的实现,看他们是如何把图片素材、逻辑压缩到 128k、64k 的卡带内存外面,真的是精益求精。
明天就服务而言,即便对于大流量的服务,往往在谋求极致性能和老本之间,更多的会抉择扩服务、加机器来撑持起相干容量的服务;当然,不是说性能不重要,而是说在明天,性能的问题曾经能够从更高的维度或者说从更多的维度解决了。
就具体语言的性能,没有对 C /C++、Go 语言的进行过压测,但从原理上来说,两者相差应该不大,而对于 Java、Python,两者都有虚拟机,然而 Python 是解释型语言,Java 尽管是由中间层,然而也有 JIT 技术的加持,性能也是更上一个台阶,但 Java 的 GC 问题和 Stop The World 的机制,也使得一些服务不会抉择 Java。
横向比照来说, 各种语言就开发环境、运行性能而言,都有他们的特点,也各有短处、各有短板 。这也使得这些语言在不同场景下,会有不同的应用频率。
Java、Python、Go、C/C++ 这几门语言,次要的利用都在后端开发这里,尽管后端开发是一个比拟明确的方向,但也仍然能够有很多细分的畛域,不同畛域常应用的语言也仍然有很大的差异。
对于不同的岗位,写之前专门看了慕课网的首页,慕课网首页做了十分具体的划分,这个分类对以后行业的划分也是十分精确的。
下面提到的 Java、Python、Go、C/C++ 这几门语言,次要的利用也都在后端开发这里,尽管后端开发是一个比拟明确的方向,然而在后端开发里,也仍然能够有很多细分的畛域,不同畛域常应用的语言也仍然有很大的差异。
Web 后盾
最常见的,也是大学期间常做的后端开发的工作,大部分都是 Web 开发,也即是面向数据库增删改查,编写接口的业务逻辑,向上承接前端(Web、安卓、iOS、H5 等)的申请,实现数据组装并返回,兼顾性能的思考,退出缓存层、分库分表等设计。
在 Web 后盾,Java、Python 都是常应用的语言,其中尤以 Java 见长 ,这与 Java 的生态相干,Java 以及 Web 生态的 Spring Boot、MyBatis 等,曾经成为中小企业 Web 开发必不可少的技术栈,在企业招聘岗位当中,对 Java 这一类的技术要求也是最多的。
其次是 Python,尽管 Python 有丰盛的 Web 框架反对:Flask、Tornado、Django 等等,但做小网站还行,用 Python 做大型项目的不多,早年 Python Web 技术的经典案件——知乎,因为性能,一些外围的服务,也曾经改成 Go。Python 的 Web 多见于一些访问量不大的网站,比方一些经营平台、流动平台等。
微服务
微服务是近几年火起来的概念,随着云技术的一直成熟,当初都提倡把大服务拆成微服务,通过服务注册、服务发现来实现调用链关系,兼顾云的动静伸缩来实现无状态服务的扩容缩容,也曾经是比拟成熟的技术了。
在微服务外面,Java 也是用得比拟多的 ,Spring Cloud 曾经为微服务环境提供了十分多的功能齐全的工具,上手便捷,开箱即用;但因为 JVM 过程自身的耗费,在一些应用微服务架构外面的要害模块,为了缩小资源的应用和调度的老本,仍然会应用 C /C++ 来实现,通过通用协定对外提供服务。
微服务在这里提及,和 Web 后盾这些不齐全是并列的关系,微服务是架构,自身是不含逻辑的,Web 后盾也能够通过微服务架构来实现,因此在这须要强调下,这里次要是针对微服务生态提到 Java Spring Cloud,Java 提供了比拟齐备的微服务生态。
中间件
中间件是一个比拟大的概念,在这里把与业务无关的服务对立视为中间件服务,常见的比方消息中间件。
中间件的开发工作在大厂也都被认为是后盾开发;对于中间件,Java 也是最常见的语言,Go 语言也比拟常见;其实中间件的存在次要依靠于生态环境,一个开发的生态环境只有足够的简单,也才须要中间件的存在,所以这也解释了为什么 Java、Go 才是最常见的语言。
存储服务
存储服务,如数据库、文件系统、kv 存储等,次要是应用 C /C++。
因为存储服务和操作系统、硬件设施是强相干的,所以这项工作也只有 C /C++ 容易胜任;在存储服务的实现过程,大量的零碎调用、零碎参数调优,在理论开发的时候还须要看相干的内核源码,所以人造 C /C++ 是最适宜的;当然了,也有应用 Go 语言的也有一些,这次要是在开发效率和性能之间做的取舍。
云基础设施
云基础设施到明天根本是 Go 的天下了 ,依靠 kubernetes,明天十分多的云基础设施应用的都是 Go 语言,在资源调度、资源隔离等方面,Go 都有十分成熟的应用。要说资源调度,原本 Go 语言就没多少年,当初的云基础设施为什么会成为 Go 的天下?
在早年 Google Big Table 论文大行其道的时代,Hadoop、Yarn 是进行大数据平台资源管理调度的外围,不过那个时候也只有大数据平台平台须要这么多的资源,那时候的容器都是交给 yarn 托管的;起初 docker 技术呈现、成熟,再到容器编排、kubernetes,Go 语言也胜利夺位,成为云基础设施外面最常应用的语言。所以,明天咱们看到的腾讯云、阿里云这么丰盛封装对外的产品,在它们的背地,都肯定有 Go 语言与其相干的服务在撑持着。
工具平台
工具平台多指测试、运维等的平台,在理论场景中也有着十分外围的作用,对于这种工具平台,不要求很高的性能,然而个别会有很多临时性的需要,整体的布局也更含糊一些,对于这种场景,Python 这种短平快的语言就很排得上用场, 所以 Python 多见于这些工具平台的实现外面。
最初,对于编程语言,除了语言自身的生态,团队的技术栈也是影响你抉择语言的重要起因,在有抉择的状况下,还是须要依据大的生态做出更好的抉择,对的语言做对的事件,事倍功半。
作者: 咚咚呛
简介:
全栈工程师,目前就任于 BAT 的大数据部门,超过 4 年的技术研发教训,相熟 java、python 研发,负责过多个零碎研发主程,目前专一于分布式系统研发,在高并发、分布式系统有丰盛的教训
本文由 mdnice 多平台公布