查看原文
其他

百度工程师厂外生存指南

Linux爱好者 2022-07-01

The following article is from 编程往事 Author 果冻虾仁

百度曾经一度被称为中国互联网的黄埔军校。这句话其实有两方面含义:一是说从百度走出来的工程师活跃在中国各大互联网企业中,对整个中国互联网的繁荣发展做出了贡献。二是说百度如同历史上的黄埔军校一般,为外界培育和输送了大量人才,但是自身却在逐步没落,暗示百度的人才流失严重。然而很多百度厂内高管常以『百度是中国互联网的黄埔军校』而自豪,这只是理解了这句话的第一层含义,却殊不知其第二层。高管们不对厂内人才大量流失的原因做反思,反而因为一句黄埔军校而沾沾自喜。着实让人唏嘘不已。

Anyway,俗话说『干着SEO的活,操着CEO的心』,当然我也没资格评价大公司的管理制度,好好挣钱过好自己的日子才是王道。本文主要是写给从百度跳槽(或即将跳槽)到其他公司的工程师们。尤其是跳槽到小厂的工程师们,因为其他的大公司都有自己的基础设施,进去之后自然就能找到好的技术替代。

百度已开源的库和框架

首先,你要知道百度其实开源了不少东西,这些你都可以在厂外继续使用。下面收集了一些百度的开源项目。


github地址
百度github地址https://github.com/baidu
brpc(厂外使用的也比较多)https://github.com/apache/incubator-brpc
echarts(前端图表库)https://github.com/apache/echarts
Doris(OLAP系统,内部叫Polo)https://github.com/apache/incubator-doris
BFE(应用层负载均衡网关)https://github.com/bfenetworks/bfe
Paddlehttps://github.com/PaddlePaddle

大部分开源项目都可以在baidu账户中查看。但brpc、echarts等项目由于捐献给了Apache基金会所以不在baidu的账户中。bfe由于未知原因没有放到baidu账户中。

值得一提的是深受百度做离线的同学所喜爱的bigflow也是开源的:

  • https://github.com/baidu/bigflow

当然由于开源世界Spark、Flink等大数据技术演进,bigflow或许已经过时。

替换bsl(百度C++基础库)

bsl是“百度STL”的意思,主要包含了一些百度自研的C++容器,有一些用以作为std容器的替代,另外有一些是补充(比如json)。在厂外可以使用boost + 腾讯的Rapidjson + Facebook开源的folly库来替代。

bsl诞生的其中一个原因是std容器不是线程安全的,而bsl容器做到了线程安全。但是其实这也会让程序员变懒。可以通过调整并发逻辑、增加容器初始化等,让std容器在不使用锁的情况下达到安全使用的目的。并且很多情况下并非是多线程竞争操作std容器的场景,无需使用bsl容器。当然bsl还有一些特性比较公共的内存池等,这些在folly中都能找到类似的替代,不过大多数时候std容器 + boost 就已经足够满足要求。

替换bcloud(百度内部C++编译构建工具)

bcloud是百度内部的C++编译工具,基于Python实现的。众所周知,C++没有像Java的maven、Python的pip、JS的npm这种被广泛认可且好用的构建工具。

为此百度自研了bcloud,用来编译C++项目。这绝不仅仅是不用手写Makefile这么简单。

厂外可以使用腾讯开源的blade(https://github.com/chen3feng/blade-build)或者谷歌开源的bazel(https://github.com/bazelbuild/bazel) 。blade和bazel用法和BUILD文件写法都很像,不过blade开源时间要比bazel早很久。

坊间传言谷歌bazel是最先开发的,但是并未开源,后来谷歌员工离职在其他公司找不到像bazel一样好用的C++构建工具,就开始仿照bazel自研。这期间来到腾讯的那批人做了blade,去了Facebook的人做了buck,主要用于给安卓源码做编译。当然这可能是谣传。

当然bcloud也有一些独到之处,比如依赖打平和支持集群编译等。所谓的支持集群编译指的是,自己在开发机开发过程中,可以用bcloud让当前C++项目在集群上进行编译,最后再自动下载到开发机上。这是因为某些项目如果不用集群编译,本地可能编译个把小时……是的你没听错。我犹记得我使用了集群编译还是编译四五十分钟的心痛回忆,当然这某些老项目没有使用SOA或微服务思想做拆解所导致,bcloud支持让本地代码发送到集群做编译只不过是给这些项目擦屁股。

替换ODP(百度内部PHP集成框架)

在百度开发过PHP的RD和FE们应该都使用过ODP。其实所谓的ODP是在鸟哥(惠新宸)开发的PHP框架Yaf基础上做的调整和整合(整合了一些Web框架以外的东西,比如Nginx、PHP扩展等统统打包)。

Yaf是开源的,项目手册:https://www.laruence.com/manual/

github地址:https://github.com/laruence/yaf

yaf

替换百度配置格式

百度内部C++、PHP项目配置文件格式是基本统一的,这是一种升级版的ini文件格式。注意是升级版,普通的ini文件格式层级比较浅,最多只有一级section,并且没办法表示数组类型。百度配置格式语法比较复杂,但能表示的嵌套的多级section,也支持数组类型的表示。比如这样一个demo:

[A]
name: abc
[.B]
id: xxx
[.@C]
user: a
[.@C]
user: b
[.@C]
user: c

该配置转成json表达是这样:

{
 "A": {
  "name""abc",
  "B": {
   "id""xxx"
  },
  "C": [  
                        {"user""a"}, 
                        {"user""b"}, 
                        {"user""c"}
                ]
 }
}

配置文件格式有很多,在厂外可以替换的百度配置文件格式,我首先推荐toml,其次是yaml

yaml没有xml那种臃肿,但也有槽点,就是yaml用缩进表达section的嵌套递进关系,虽然这样配置文件比较直观,但层级如果太多,就会有大量缩进。如果你不喜欢yaml,那么我推荐你使用toml,这是一种和百度配置一样的扁平配置格式,同样是基于ini文件格式的升级版。上面的配置用toml表达是这样:

[A]
name = "abc"
[A.B]
id = "xxx"
[[A.C]]
user = "a"
[[A.C]]
user = "b"
[[A.C]]
user = "c"

或许toml比yaml更适合你。

替换BNS(百度内部命名服务)

BNS是百度内部的命名服务,它不仅可以给后台服务做服务发现,从而避免直接配置 ip+端口。也可以给机器本身(ip)做命名服务,所以主机、容器也有BNS,可以用它们BNS名字来做ssh登录。不过在厂外,我们一般直接通过机器ip登录机器就可以了。我们只需要给后台服务的服务发现找替代就可以了。像阿里的dubbo采用了zookeeper做服务发现,随着Go语言和云原生的兴起,采用etcd做服务发现也日趋流行。

不过若是C++在线服务则还有其他选择,那就是consul。因为brpc现在默认集成了对consul的支持,你可以直接给brpc的channel地址配成consul://

consul主页:https://www.consul.io

替换Matrix(百度容器化技术)

Matrix是百度内部自研的容器技术。想替换它,毋庸置疑必然是Docker和K8S。并且可能比Matrix更好用。

docker

替换iCode

iCode就是百度内部管理代码库的代码平台,基于git。这个在其他公司应该都有独立的部署gitlab来做代码托管。

wiki

百度内部的wiki是一个大宝库,可以搜到很多资料。我在百度期间也有写wiki的习惯,而且自认为写得还不错,不信你在内网搜搜wangwei114

而这个wiki系统其实不是自研,而是直接购买的商业软件confluence,然后在内网部署了一套而已。很多公司应该都有购买confluence,即使也没有confluence那也会有自研的替代笔记软件。毕竟我们不应该把工作写到外网笔记上,以免泄密!

话术更新

百度有一套约定俗称的话术体系。其实这些都不是通用话术,初次跳槽的百度工程师们,千万不要把下面这些话术当成业内标准,其实都只是百度内部的习惯叫法。

RD、FE、PM、OP、QA

比如:RD、FE、PM、OP、QA。RD在百度内部表示的是后端的工程和算法工程师。其实RD一词表示的是“研发”,不应该仅限于后端才对。在百度把前端开发称为FE,包括web和移动客户端开发的工程师。

PM一词也有歧义,在腾讯PM表示的是项目经理,在百度PM特指产品经理。谁叫project manager和product manager的缩写都是PM呢?

QA在百度表示的是测试工程师。在腾讯则不然,QA和测试并不等价,虽然QA一般也隶属于测试团队,但是人员配置却相对较少,一般不负责具体的测试工作。只负责做事故定级等外围工作。

OP表示的是运维,这个没有什么争议。

据说这套词汇也被百度工程师们带到了字节跳动,除此之外还有一个习惯被带到字节,那就是“串讲”。

串讲

串讲指的是阅读历史代码,然后做PPT开个分享会去讲解的意思。一般是新人串讲。百度所有码农入职后估计都有被要求做串讲的经历。新人串讲这个习惯据说也被带到了字节。

词表

我之前所在的部门,把词典文件称之为词表,比如什么静态词表、动态词表之类的。在其他公司一般就叫词典文件,也就是dict文件。

showcase

貌似是需求开发差不多的时候,给老大们看效果叫做“show case”

case study

case study,直译是案例研究。看起来是中性词,表示大家一起学习研究某一案例。其实在百度base study表示的事故发生之后的复盘会(批斗会)。

CI

CI本身是持续集成的意思。在百度,CI一词变成了特指把代码合并到代码主干的这一操作。其实合并代码只是持续集成中的一个环节而以……

wise

另外还有一些黑话,比如“wise”。最早wise原本是wireless search的缩写,即无线搜索,也就是移动端的百度(不仅限于手机百度APP上的百度),但是常常被员工误解为wise就是移动端的意思,其实只是表示移动端的百度搜索。

biu

百度把团建叫做biu。团建的英文是team building,如果要缩写building也应该是bui才对。但是不知道哪位前辈起的头,让biu成为了团建的代名词,据说和bui相比,biu是更可爱的说法……

biu

舵主

“为人不识陈近南,便称英雄也枉然”。好了,好了,串台了。在百度每个组都有一个同学担当舵主,所谓舵主就是负责组内组织团建活动、掌管经费开支的同学。同样不知道是哪位前辈高人首先这样命名的……

“舵主,我们周四去哪biu啊~”

其他的,欢迎大家补充


- EOF -

推荐阅读  点击标题可跳转

1、吐血整理的万字 Linux 内核源码规范

2、9个Linux 常用查看系统硬件信息命令(实例详解)

3、超全整理!Linux 性能分析工具汇总


看完本文有收获?请分享给更多人

推荐关注「Linux 爱好者」,提升Linux技能

点赞和在看就是最大的支持❤️

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存