百度工程师厂外生存指南

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

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


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
Paddle https://github.com/PaddlePaddle


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

                         640.jpg 

                                                      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更好用。

640.jpg

                                                     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是更可爱的说法……


640.jpg

                                                    biu

舵主


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


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


其他的,欢迎大家补充

相关文章
|
1月前
|
机器学习/深度学习 自然语言处理 算法
【数据挖掘】百度机器学习-数据挖掘-自然语言处理工程师 历史笔试详解
文章汇总并解析了百度机器学习/数据挖掘工程师/自然语言处理工程师历史笔试题目,覆盖了多分类任务激活函数、TCP首部确认号字段、GMM-HMM模型、朴素贝叶斯模型、SGD随机梯度下降法、随机森林算法、强连通图、红黑树和完全二叉树的高度、最长公共前后缀、冒泡排序比较次数、C4.5属性划分标准、语言模型类型、分词算法、贝叶斯决策理论、样本信息熵、数据降维方法、分箱方法、物理地址计算、分时系统响应时间分析、小顶堆删除调整等多个知识点。
31 1
【数据挖掘】百度机器学习-数据挖掘-自然语言处理工程师 历史笔试详解
|
1月前
|
机器学习/深度学习 自然语言处理 算法
【数据挖掘】百度机器学习-数据挖掘-自然语言处理工程师 2023届校招笔试详解
百度2023届校招机器学习/数据挖掘/自然语言处理工程师笔试的题目详解
43 1
|
小程序
百度2015年系统工程师笔试题:判断当前机器的大小端
百度2015年系统工程师笔试题:判断当前机器的大小端
59 0
|
小程序
百度2015年系统工程师笔试题
百度2015年系统工程师笔试题
|
监控 算法 数据挖掘
百度数据挖掘工程师实习生笔试面试题
笔试题: 一、简答题30分 1. extern”C”{}的作用好应用场景; 2.写出两者你熟悉的设计模式,及应用场景,可以给出伪代码; 3.TCP中time_wait是表示那种状态,及应用场景,以及起好处和坏处; 二、算法题40分 1. 有一个任务执行机,任务数N<1000,该机器每次只能执行一个任务,而任务之间存在依赖关系, 但是任务之间没有循环依赖,请给出适
6308 0
|
机器学习/深度学习 C++ 人工智能
一道百度机器学习工程师职位的面试题
题目:现在有 a 到 z 26 个元素, 编写程序打印 a 到 z 中任取 3 个元素的组合(比如 打印 a b c ,d y z等) 分析: 大家看看我这么做行不 char a, b, c; for(a = 'a'; a
1015 0
|
存储 程序员 数据库
百度2013研发工程师笔试卷B
1 面向对象的三个基本元素,五个基本原则 三个基本元素: 封装 继承 多态 五个基本原则: 单一职责原则(Single-Resposibility Principle):一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。 开放封闭原则(Open-C
1440 0
|
算法 数据挖掘 数据库连接
2013百度校园招聘数据挖掘工程师
2013百度校园招聘数据挖掘工程师 一、简答题(30分)1、简述数据库操作的步骤(10分) 步骤:建立数据库连接、打开数据库连接、建立数据库命令、运行数据库命令、保存数据库命令、关闭数据库连接。 经萍萍提醒,了解到应该把preparedStatement预处理也考虑在数据库的操作步骤中。此外,对实时性要求不强时,可以使用数据库缓存。 2、TC
1768 0