背景
区块链面试是一个挺新的话题,主要得益于区块链行业 2018 年成为风口行业,不仅曝光度激增而且人才市场火爆,而我在年后也是接触了许多来参加面试的候选人,大部分是没有区块链从业经验的,为此我当时写了一篇《寻找适合恋爱的区块链工程师》,从面试官的角度来讲了如何寻找一个合格的候选人。
从经历来看,这个行业非常之新兴,并且人才也相当匮乏。作为我针对面试写的第二篇文章,我决定从一个从技术的角度来详尽阐述要成为一个区块链专家所必备的技术。
前言
说到技术,我所指的主要还是研发。由于我负责的是技术岗,因此我对于技术上要求会比较严格(严格并不等于高),简单来说就是,基础知识需要十分扎实。许多过来参加区块链工程师面试的同学,大部分人给我的印象是,看过一点介绍区块链知识的书籍,问一点浅显的知识是能够答得上来,但是稍微具体一点的,就会变得含糊不清了。在我看来,区块链所要求的知识并非什么特殊的或者新兴的知识,除了密码学领域的知识需要专门了解之外,其他知识和技能几乎都是一些比较通用的网络开发核心知识,如果是从事网络服务端相关开发的,可能会对这部分知识比较熟悉。
由于区块链整个行业涉及到的范围非常广泛,下到各种基础设施,上到各种上层应用,它们对技能的要求范围是不一样的。根据我的经验,大致把区块链开发分为两个大的部分:技术层和应用层,以便候选人根据自己以往的专业技能背景选择自己合适的领域。
一、核心层
核心层是区块链最下面的一层,这一层是底层技术与基础设施的开发。我们可以把这一层比作操作系统的内核,而应用层则是在操作系统之上构建各种软件。比如我们最常见的比特币网络,它的核心技术就来源于它的共识机制(POW),当然,对于大部分链来说,共识的原理都是其最核心的部件。要构建这样的共识机制,又需要更加底层的技术支持,比如:网络通信,数据存储,加密安全等等。所以,这一层对于技术的内涵要求比较高,这里的技术是一项综合的能力,我把它总结为三个部分:理论基础、专业经验以及技术能力。
1)理论基础
理论基础主要是指分布式系统理论,如果是专业出身(比如计算机专业-分布式系统方向),或者有过从事过分布式数据库,网络等相关的经验,那么可能会对这一部分相对了解或熟悉,熟悉并深入理解分布式网络的特点和各种算法是能够在区块链领域大有作为的前提之一。
这里,我简单列举需要掌握的一些分布式系统核心概念:
- 全序/偏序,因果顺序
- 物理时钟/逻辑时钟
- 两阶段算法(2PC)/三阶段算法(3PC)
- Safety && Liveness
- FLP 不可能定理
- Paxos/Multi-paxos
- Raft/Multi-Raft
- CAP 理论
- 副本一致性,强/弱、最终一致性
- 简单哈希/一致性哈希
- Base/ACID,分布式 ID 等等
- BFT(Byzantine Fault Tolerance)
关于这部分内容详细介绍,可以参见我的系列文章之《区块链核心技术:分布式理论》。
2)专业经验
专业经验则是指对目前最主流的区块链项目的掌握程度,比如 Bitcoin,Ethereum 等,了解账户模型,智能合约等等,而且,不仅是它们的运行原理,而且能在它们的基础上持续改进、开拓以及创新,比如对侧链,轻节点、分布式存储,扩容方案等有一定的理解等等。
为此,我也做了一个列表,主要展示对区块链的专业经验的一些要求:
- 目前区块链主流共识算法之间的差异(比如 PBFT 与 POW 之间区别)
- 联盟链、公链及私链之间的区别,部署方式
- 针对区块链的攻击方式:51%算力攻击,Sybil 攻击,Eclipse 攻击,DDos 攻击
- P2P 网络通信模式(Gossip,Totem,DHT 等)
- Merkle Tree 数据结构
- Bitcoin UTXO 模型,以太坊转账流程(GAS 计算,Nonce 值等等)
- 以太坊智能合约的编写,Solidity 相关知识
- 密码学(公钥/私钥,ECDSA,RSA,哈希算法),签名,多重签名,盲签名等等
- 以太坊协议 ERC20 ERC721 ERC223 ERC875
- 比特币(P2SH 地址,交易脚本等)
这部分内容可以详见我的系列文章之《区块链核心技术:专业经验》。
3)技术准备
最后,技术能力则是一项通用能力,是网络编程,内存控制,操作系统,编解码,密码学,异步编程等等开发功底的一个综合考核。它是一个日积月累的能力,扎实的技术背景可以让我们快速适应区块链底层的开发。
为此,我列举了一些比较核心的研发能力和技术准备:
- 数据结构(二叉树,trie 树,数组,结构体/类 等等)
- 算法(回溯/递归,字符串编码,排序,搜索等等)
- 锁(原子锁,互斥锁/自旋锁),死锁检测,内存泄露检测
- 多线程编程(共享内存,线程/进程/协程),用户态/内核态
- 同步、异步,阻塞/非阻塞,多路复用 I/O
- 异步编程/响应式编程范式,事件驱动
- 网络编程:TCP/IP/UDP 协议,time_wait 状态,socket/select/epoll, C10k 问题等
- 服务器编程:熟悉 Linux 编程,系统资源(如:cpu/io, disk usage 等)
- HTTP 协议,RPC 通信,负债均衡等等
这部分内容可以想见我的系列文章之《区块链核心技术:技术准备》。
2、应用层
应用层是区块链最重要的一层,也是区块链行业能蓬勃和持续发展的力量来源。应用层主要涉及的是区块链产品,我们常见的有比如:数字钱包(imToken),分布式交易所(Cosmos,bitshare),浏览器插件(MetaMask),区块链游戏(CryptoKitties, FOMO3D),保险产品等等。
开发这些应用级别的产品,通常是与底层的区块链系统进行交互,因此,并不需要我们对区块链底层技术达到非常专业的掌握。但是需要我们对区块链的核心概念有了解,以便我们能与链的开发者能在同一语言上进行沟通而不至于误解。
当然,应用层的开发对技术的要求也是共同的,它虽然没有核心层对技术能力要求的那么高,但是其更加侧重对创新和落地
我会通过分析几个典型区块链应用,来展示思路而不是技术本身在应用层所展现的强大能量和生命力。
这部分内容可以详见我的系列文章值《区块链核心技术:编写应用》