从2017年开始,区块链逐步成为互联网的风口浪尖。曝光度的激增带来了人才市场的火爆,我陆陆续续接触了许多来参加面试的候选人,大部分是没有区块链从业经验的。
作为专业方向是分布式系统理论并且从事相关行业 5 年多的研发架构师,我想从面试官的角度来阐述要想要掌握区块链核心技术所需要的一些知识和技能。希望能给到加入这个新兴行业的同学,一些启发。
说到技术,我所指的主要还是研发。由于我负责的是技术岗,因此对于技术上要求会比较严格(严格并不等于高),简单来说,基础知识需要十分扎实。许多过来参加区块链工程师面试的同学,大部分人给我的印象是,看过一点介绍区块链知识的书籍,问一点浅显的知识是能够答得上来,但是稍微具体一点的,就会变得含糊不清了。
在我看来,区块链所要求的知识并非什么特殊的或者新兴的知识,除了密码学领域的知识需要专门了解之外,其他知识和技能几乎都是一些比较通用的网络开发核心知识。
由于区块链行业涉及到的范围非常广泛,从各种基础设施,到各种上层应用,它们对技能的要求范围是不一样的。根据我的经验,大致把区块链开发分为两个大的部分:技术层和应用层,以便候选人根据自己以往的专业技能背景选择自己合适的领域。
一、技术层
技术层是区块链最下面的一层,这一层主要工作是底层技术与基础设施的开发。我们可以把技术层比作操作系统的内核,应用层则是在操作系统之上构建各种软件。比如我们最常见的比特币网络,它的核心技术就来源于它的共识机制(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 通信、负债均衡等等
二、应用层
应用层是区块链最重要的一层,也是区块链行业能蓬勃和持续发展的力量来源。应用层主要涉及的是区块链产品,我们常见的有比如:数字钱包(imToken)、分布式交易所(Cosmos、bitshare)、浏览器插件(MetaMask)、区块链游戏(CryptoKitties、FOMO3D)、保险产品等等。
开发这些应用级别的产品,通常是与底层的区块链系统进行交互,因此并不需要对区块链底层技术达到非常专业的掌握。但需要我们对区块链的核心概念有了解,以便能与链的开发者在同一语言上进行沟通而不至于误解。
当然,应用层的开发对技术的要求也是共同的。它虽然没有技术层对技术能力要求的那么高,但是其更加侧重对创新和落地。
之后,我会通过分析一些常见的区块链应用,来展示思路而不是技术本身在应用层所展现的强大能量和生命力。
作为区块链行业中的一员,我深深感受到区块链技术对互联网世界的重大意义,它不仅带来的是技术上的创新,而且对未来的经济关系、行业分工都有着巨大的价值潜力。当然现在,区块链技术还处在改变世界的早期阶段,没有一个大规模的应用是其一个硬伤。但是我们也看到,各种区块链创新项目在这波浪潮中如雨后春笋般冒出来,许多顶尖的人才都在致力于解决当前区块链项目的去中心化、安全性和可扩展性这个所谓的“不可能三角”,甚至已经有项目处在领先的位置。所以,我们不仅需要找准自己的目标和方向,更需要夯实技能,争取成为区块链领域中有分量的一员。