一、B 站后端源码被恶意“开源” 几 小时
1、B站源码泄露事件始末
今日,网上传出消息,bilibili整个网站后台工程源码泄露,这是国内规模较大的互联网企业中首例整个网站后台工程源码泄露。而且B站网站不仅仅是泄露工程源码这么简单,有很大一部分用户的用户名密码被硬编码在代码里面,也泄露出去了,对用户来说影响很大。
作为国内go语言的大厂,哔哩哔哩代码被上传到了github,平台上确实存在由一个名叫「openbilibili」的用户创建的「go-common」代码库,项目描述为「哔哩哔哩 bilibili 网站后台工程 源码」,这个账号于22号当天注册。截至北京时间17:04,该项目已获得6597个标星。fork数量已经突破6000(这个操作会将被Fork的代码仓库中所有的信息,包括源代码、原仓库中的issus、历史提交等全部复制到你的账号中,方便进行学习修改,这样不会破坏原仓库中的代码),issues已经成了弹幕,场面已经失控。
有人在17:22试图fork该代码库时发现,这一代码库已被GitHub「封杀」。但是仅仅删除源头,还不能完全阻止代码库继续泄露。(不过Github速度很快,被Fork的代码库很多都已经被删除)。但源码大范围泄露已成事实。源码中包含硬编码到代码里面的密码和密钥,相关服务器和服务被攻击的可能性非常大。
B站股价在盘前下跌3.72%,成交75.34万美元。
而后,B站发文回应
还附带了一套B站的Go语言微服务框架,这波福利不错
https://github.com/bilibili/kratos
2、偷偷聊聊B站,嘿嘿
在写这篇文章的时候,我也是各种查找相关的新闻。在知乎上看见这么一条数据,以下为知乎片段:
知乎上爱学习且眼尖的发现了一系列有趣的代码片段,爱学习的同学看着点哈。
记在小本本上, 要给用户鼓励,这一招产品经理学会了么?
好吧这是 anti spam....虽然很辣眼睛....
看完上面有趣的代码片段,我觉得需要聊几句严肃的了,那就是恶意泄漏这份代码会带来什么后果?
目前,可以确认的是这份代码是B站后端目前使用的代码,可以推测这份代码的泄漏者很可能是B站的员工或者前员工,网络上也有评论说,这份代码被非法“开源“是由于B站最近恶意裁员导致被裁员者反弹恶意公开代码发泄情绪。
原来删库跑路开源的玩笑,真的有人干得出来。真的是无知者无畏啊。不管该员工出于什么原因,都不应该以公开公司代码为泄愤渠道,这是对自己职业最大的不负责任,当前代码泄露已经无可挽回,如果公司执意追责,牢狱之灾是免不了了。
对于B站来说,这个问题很严重:1、后端代码被泄漏,就像是裤子被趴,很多黑产从业者会蜂拥而至,B 站被人撸是在所难免了。2、这份代码会被泄漏,也从侧面说明B站的技术管理水平不高,代码权限管理不到位。3、从今天开始估计B站后端程序员要开始 007 重构了。
各位技术管理朋友们,赶紧回去看看你们公司的权限管理做的是否到位,要知道这些年来离职员工从删库到跑路的事件发生了不少,“实习生“误删数据库的事情也每一段时间就能爆出一个,今天又新增了一个方式,恶意开源。
Golang入门到精通 已下单,辞职申请表已递交,回家钻研源码,PILIPILI.COM指日可待。哈哈哈。。开个玩笑
3、B站为何选择Go语言重构后台代码
从一位曾经在哔哩哔哩任职的开发人员那里,了解了一下B站的技术发展历程:最开始是用PHP语言开发的,后来B站的中台逐步被Node占领,而后台技术为了更高的并发、更稳健,以及为了大数据分析,逐步向JAVA靠拢,这便导致了哔哩哔哩的技术整体较为混乱。
B站早期几乎天天故障,随着团队和业务扩大,各方面的压力都增加,处处冒火。代码混乱,框架结构混乱,已经到了难以维护的地步,需要理清脉络,在这样的情况下统一技术栈是毫无疑问该做的事。最后发现重写反而是最优的解决方案。
为什么是Go?
归根到底,重写后台工程是哔哩哔哩统一技术栈的一次尝试,至于最后为啥选择了Go,很重要的一点在于Go能够满足哔哩哔哩平台重构优化的需求;另一点是其研发总监毛剑本身是一位Go语言的忠实布道者。
那我们站在哔哩哔哩的角度来分析以下:
第一:Go内置的net/http包基本上把我们平常用到的网络功能都实现了,这些特性对于网络视频平台哔哩哔哩来讲,解决其当前所面临的问题是绰绰有余的。
第二:公司有自己的Go语言团队
哔哩哔哩的研发总监毛剑,此前的工作经历均以Go为主,同时他也带了自己的Go团队共同加入,在这样的背景下,相对于JAVA、Python,选择用Go来重构后台显然能够起到事半功倍的效果。
所以哔哩哔哩采用Go语言来重写后台JAVA工程,有行业发展的必然性,也有场景、功能实现的需求性,还有技术负责人根据现实情形做出选择的主观判断性。随着行业的不断发展,各种新兴语言不断出现,一个项目中多种语言并存、互补的现象是必然的,也许几十年后你还会发现用Go写的后台被其他语言改写了,或者某种你以为已经成为历史的语言卷土重来也不是没有可能。
而从今天bilibili泄露出来的Go的源代码我们也可以看到,对于bilibili这样日以几千万的访问量,Go语言实现高并发还是非常靠谱的。
二、Go语言的特点
1、学习曲线容易
Go语言语法简单,包含了类C语法。因为Go语言容易学习,所以一个普通的大学生花几个星期就能写出来可以上手的、高性能的应用。在国内大家都追求快,这也是为什么国内Go流行的原因之一。
Go 语言的语法特性简直是太简单了,简单到你几乎玩不出什么花招,直来直去的,学习曲线很低,上手非常快。
2、效率:快速的编译时间,开发效率和运行效率高
开发过程中相较于 Java 和 C++呆滞的编译速度,Go 的快速编译时间是一个主要的效率优势。Go拥有接近C的运行效率和接近PHP的开发效率。
C 语言的理念是信任程序员,保持语言的小巧,不屏蔽底层且底层友好,关注语言的执行效率和性能。而 Python 的姿态是用尽量少的代码完成尽量多的事。于是我能够感觉到,Go 语言想要把 C 和 Python 统一起来,这是多棒的一件事啊。
3、出身名门、血统纯正
之所以说Go出身名门,从Go语言的创造者就可见端倪,Go语言绝对血统纯正。其次Go语言出自Google公司,Google在业界的知名度和实力自然不用多说。Google公司聚集了一批牛人,在各种编程语言称雄争霸的局面下推出新的编程语言,自然有它的战略考虑。而且从Go语言的发展态势来看,Google对它这个新的宠儿还是很看重的,Go自然有一个良好的发展前途。
4、自由高效:组合的思想、无侵入式的接口
Go语言可以说是开发效率和运行效率二者的完美融合,天生的并发编程支持。Go语言支持当前所有的编程范式,包括过程式编程、面向对象编程、面向接口编程、函数式编程。程序员们可以各取所需、自由组合、想怎么玩就怎么玩。
5、强大的标准库
这包括互联网应用、系统编程和网络编程。Go里面的标准库基本上已经是非常稳定了,特别是我这里提到的三个,网络层、系统层的库非常实用。Go 语言的 lib 库麻雀虽小五脏俱全。Go 语言的 lib 库中基本上有绝大多数常用的库,虽然有些库还不是很好,但我觉得不是问题,因为我相信在未来的发展中会把这些问题解决掉。
6、部署方便:二进制文件,Copy部署
这一点是很多人选择Go的最大理由,因为部署太方便了,所以现在也有很多人用Go开发运维程序。
4、简单的并发
并行和异步编程几乎无痛点。Go 语言的 Goroutine 和 Channel 这两个神器简直就是并发和异步编程的巨大福音。像 C、C++、Java、Python 和 JavaScript 这些语言的并发和异步方式太控制就比较复杂了,而且容易出错,而 Go 解决这个问题非常地优雅和流畅。这对于编程多年受尽并发和异步折磨的编程者来说,完全就是让人眼前一亮的感觉。Go 是一种非常高效的语言,高度支持并发性。Go是为大数据、微服务、并发而生的一种编程语言。
Go 作为一门语言致力于使事情简单化。它并未引入很多新概念,而是聚焦于打造一门简单的语言,它使用起来异常快速并且简单。其唯一的创新之处是 goroutines 和通道。Goroutines 是 Go 面向线程的轻量级方法,而通道是 goroutines 之间通信的优先方式。
创建 Goroutines 的成本很低,只需几千个字节的额外内存,正由于此,才使得同时运行数百个甚至数千个 goroutines 成为可能。可以借助通道实现 goroutines 之间的通信。Goroutines 以及基于通道的并发性方法使其非常容易使用所有可用的 CPU 内核,并处理并发的 IO。相较于 Python/Java,在一个 goroutine 上运行一个函数需要最小的代码。
8、稳定性
Go拥有强大的编译检查、严格的编码规范和完整的软件生命周期工具,具有很强的稳定性,稳定压倒一切。那么为什么Go相比于其他程序会更稳定呢?这是因为Go提供了软件生命周期(开发、测试、部署、维护等等)的各个环节的工具,如go tool、gofmt、go test。
三、Go语言的发展前景——2019 年,程序员最想学习的编程语言Top1
Go语言,作为云时代的C语言,出身名门。虽然说是一门只有十年历史的新语言,但是发展势头相当迅猛,容器界的扛把子 Docker 就是用 Go 写的,国内也有不少团队广泛使用 Go。近日,HackerRank 在社区发起了程序员技能调查,来自 100 多个国家、超过 70000 名开发者参与其中。调查结果显示,2019 年,程序员最想学习的编程语言 Top 3 分别是 Go、Kotlin 和 Python,其中 Go 以 37.2% 的比例排在首位。
但 Go 要想撼动编程界的常青树 Java 二十多年的地位无疑难度颇大。据 HackerRank 数据显示,2018 年,Java 在开发者最受欢迎的编程语言排行榜中仍然排名第 2,Python 排名第 4,Go 排名第 13,距离第一名 JavaScript 还有不小的差距。
Go 语言虽然“年纪尚小”,但已经拥有很多非常优秀的特性。
采用合适的编程语言做分布式系统也是一件很重要的事情。我们采用 OpenStack 有很多坑,其实就是 Python语言带来的——不是说 Python 不好,但是它很多的机制,在公有云的发展方向上会带来一些性能、并发的瓶颈。Go 语言出现之后,一大批的公有云产品都是基于 Golang 开发的,Golang 比以前的语言在并发、性能、安全性等方面做得更好,如果是用 Java 来写这些系统,要达到一样的性能效果,需要的研发周期会长很多。所以,从长期的发展来看,编程语言对云计算研发决策的影响会越来越重。
Go的应用范围一直在扩大,云计算,微服务,区块链,哪里都有用Go写的重量级项目。docker/kubernetes生态圈,几百/千万行代码,基本统治了云原生应用市场。去年大热的区块链,以太坊的geth,比特币的btcd,闪电网络的lnd,都是Go语言开发。还是那句话,多看看各种语言的生态,或许都并没有你想象的那么不堪。。。Go语言设计上确实不够“先进”,但也是另一种“务实”。其实go不管在国内还是国外已经很受待见了,国外google用的很多,uber也在用,国内有著名的今日头条,每日千亿级的访问妥妥的。多少语言终其一生都没有这么大的应用场景。
四、Go语言的岗位
最近几年,Go语言开始走向火爆,国内外很多公司都已经将Go语言应用到公司核心业务系统中。比如Google、AWS和MonGoDB等国外巨头,以及像阿里云CDN、华为、饿了么、七牛等国内公司也都在积极拥抱Go语言。
2018年求职市场Go语言工程师需求增长率达到了800%,因此这个职业方向应该是现下最有“钱”途的职业方向了。
因为Go语言工程师在国内市场的紧缺,岗位薪资也是非常高的。
五、写在最后
当然,一个技术能不能发展起来,关键还要看三点。
有没有一个比较好的社区。像 C、C++、Java、Python 和 JavaScript 的生态圈都是非常丰富和火爆的。尤其是有很多商业机构参与的社区那就更为人气爆棚了,比如 Linux 的社区。
有没有一个工业化的标准。像 C、C++、Java 都是有标准化组织的。尤其是 Java,其在架构上还搞出了像 J2EE 这样的企业级标准。
有没有一个或多个杀手级应用。C、C++ 和 Java 的杀手级应用不用多说了,就算是对于 PHP 这样还不能算是一个好的编程语言来说,因为是 Linux 时代的第一个杀手级解决方案 LAMP 中的关键技术,所以,也发展起来了。
上述的这三点是非常关键的,新的技术只需要占到其中一到两点就已经很不错了,何况有的技术,比如 Java,是三点全占到了,所以,Java 的发展是如此好。当然,除了上面这三点重要的,还有一些其它的影响因素,比如:
学习曲线是否低,上手是否快。这点非常重要,C++ 在这点上越做越不好了。
有没有一个不错的提高开发效率的开发框架。如:Java 的 Spring 框架,C++ 的 STL 等。
是否有一个或多个巨型的技术公司作为后盾。如:Java 和 Linux 后面的 IBM、Sun……
有没有解决软件开发中的痛点。如:Java 解决了 C 和 C++ 的内存管理问题。
用这些标尺来量一下 Go 语言,我们可以清楚地看到:
Go 语言容易上手;
Go 语言解决了并发编程和写底层应用开发效率的痛点;
Go 语言有 Google 这个世界一流的技术公司在后面;
Go 语言的杀手级应用是 Docker,而 Docker 的生态圈在这几年完全爆棚了。
所以,Go 语言的未来是不可限量的。当然,我个人觉得,Go 可能会吞食很多 C、C++、Java 的项目。不过,Go 语言所吞食主要的项目应该是中间层的项目,既不是非常底层也不会是业务层。
也就是说,Go 语言不会吞食底层到 C 和 C++ 那个级别的,也不会吞食到高层如 Java 业务层的项目。Go 语言能吞食的一定是 PaaS 上的项目,比如一些消息缓存中间件、服务发现、服务代理、控制系统、Agent、日志收集等等,没有复杂的业务场景,也到不了特别底层(如操作系统)的中间平台层的软件项目或工具。而 C 和 C++ 会被打到更底层,Java 会被打到更上层的业务层。
好了,我们再用上面的标尺来量一下 Go 语言的杀手级应用 Docker,你会发现基本是一样的。
Docker 上手很容易。
Docker 解决了运维中的环境问题以及服务调度的痛点。
Docker 的生态圈中有大公司在后面助力。比如 Google。
Docker 产出了工业界标准 OCI。
Docker 的社区和生态圈已经出现像 Java 和 Linux 那样的态势。
……
所以,虽然几年前的 Docker ,当时的坑儿还很多,但是,相对于这些大的因素来说,那些小坑儿都不是问题。只是需要一些时间,这些小坑儿在未来 5-10 年就可以完全被填平了。
同样,我们可以看到 Kubernetes 作为服务和容器调度的关键技术一定会是最后的赢家。
最后,我还要说一下,为什么要早一点地进入这些新技术,而不是等待这些技术成熟了后再进入。原因有这么几个。
技术的发展过程非常重要。因为你可以清楚地看到了这种新技术的生态圈发展过程。让我们收获最大的并不是这些技术本身,而是一个技术的变迁和行业的发展。
从中,我们看到了非常具体的各种思潮和思路,这些东西比起 技术本身来说更有价值。因为,这不但让我们重新思考已经掌握的技术以及如何更好地解决已有的问题,而且还让我看到了未来。不但有了技术优势,而且这些知识还让我们的技术生涯多了很多的可能性。
这些关键新技术,可以让你拿到技术的先机。这些对一个需要技术领导力的个人或公司来说都是非常重要的。
一个公司或是个人能够占有技术先机,就会比其它公司或个人有更大的影响力。一旦未来行业需求引爆,那么这个公司或是个人的影响力就会形成一个比较大的护城河,并可以快速地产生经济利益。