作者:zc43pml | 来源:互联网 | 2023-05-18 09:59
上周末在知乎看到一个问题“都说当初编程技术更新速度快很多技术会过期,那么有哪些技术不容易过期呢?”,长期起意做了一个答复,没想到点赞数很快破千,成了热门答复,感觉很多技术人都比较关心这个问题。趁着在北京大兴酒店隔离有闲,把这篇答复扩大成一篇文章,联合我研发 TDengine 的教训,再更加深刻地开展论述一下,分享给研发同学。
把握最根本的原理和办法,你永远不会被淘汰
我是 1984 年高中一年级时开始写程序的,见证了整个 IT 的高速倒退。外表上技术倒退很快,特地是与用户间接接触的前端技术包含人机交互局部,但计算机的根本技术和原理都没有什么变动。
如果要我从新学一次计算机专业,我肯定会认真上几门课,1:数据结构,2:算法,3:计算机体系结构,4:操作系统,5:编译原理,6:计算机网络,7:数据库,8:软件工程。再从本人的趣味登程,学习一下数字信号处理、数据分析相干的课程。这些课里学到的常识,至多我 30 年前在用,当初依然在用。我能够必定的说,这些课里的常识把握的很相熟的,技术水平肯定高。
以我本人守业开发的时序数据库(Time-Series Database)TDengine (http://www.tdengine.com)为例,咱们开发了本人的内存治理、文件治理、调度器、音讯队列,应用了多种索引办法、排序等等。如果你不能顺手写一个二叉树、Hash,你都没法做 TDengine 的研发工作。尽管这些根本的原理都有现成的库,但针对本人的场景,比方时序数据场景,很多状况下都不能间接用,或性能不够,因而就肯定得本人写,而本人写的话,不把握那些原理是写不进去的。
举一个例子,操作系统课程里介绍的“生产者-消费者”问题,就是一个经典问题,在很多场景下,你往往都会遇到,比方 TDengine 里的查问调度就须要。只有你对生产者消费者问题齐全搞清楚,你才可能把异步线程通信搞明确,顺手拈来。在 TDengine 的程序里,咱们就应用信号量来将网络的异步操作转化为用户侧的同步操作。再举个例子,比方编译原理,工作中不太可能有工作要你写一个编译器,然而学会了编译原理,你对怎么最大水平地去优化本人的程序、学一门新的编程语言、写个简略的 parser ,就会得心用手。
我集体最推崇的是认真学习操作系统这门课,因为它讲的都是各种资源的治理和调度,包含 CPU、内存、网络、外围设备等等。世界上绝大部分 IT 零碎都是治理这种或那种资源,抽象地来看,与 CPU、内存、外围设备的治理其实没任何区别。因而你能够用操作系统课里学会的办法、算法去解决其余理论问题。
所有这些计算机的基本原理、办法几十年都没变,咱们只是把它组合起来,去解决新的问题,比方区块链,再比方 IoT 场景下的时序数据处理。因而只有把握最根本的原理和办法,你就永远不会被淘汰。
我 1996 年认真读过的书,正在上大三的儿子也认真读过。这本书里很多办法都用在了 TDengine 的开发上,这书里的常识很惆怅时。
把握了根底的原理和办法,还要学会做翻新
以底层根底软件的实现来说,很多根本的原理和办法都没有变过,然而为什么做进去的产品,所呈现出的性能、市场竞争力却有很大差距?起因还是在于如何奇妙使用这些原理和办法,就像数学、物理公式一样,简单难题的解析也是看你对这些公式的了解和使用水平。
以实现一个时序数据库(Time-Series Database)为例,为实现程度扩大所采取的的分片分区策略,其实都是操作系统、数据库里的根本内容,应用的客户端服务器之间的通信也都是计算机网络中最根本的传输协定,构建索引所应用的也都是根底的索引办法,等等。一个好的产品性能,脱胎于用户和市场需求,建设在泛滥根底原理和办法的翻新之上。
在时序场景下,IoT 设施规模可能达到千万甚至上亿,每秒产生的数据就能高达千万、亿级别,面对这样大的吞吐量,一般数据库基本难以承受,那咱们在开发时序数据库时,就要思考数据如何充分利用时序数据特点来做分区分片、如何更好地实时构建索引等等,这些极具挑战性的理论问题的解决思路就是要翻新。
以 TDengine 为例,为了更好地解决这些问题,TDengine 从最后就自研了存储引擎,翻新地提出了“一个数据采集点一张表”与“超级表”的概念。咱们从传统的数据库里汲取了 WAL,Skip List 等办法,同时把风行的 LSM Tree 做了很大的改变,把树层级构造去掉了,变成了只是按时间段分区、按工夫线分块的数据块。这种对存储引擎的翻新设计,也让 TDengine 与典型的 NoSQL 存储模型相比,实现了标签数据与时序数据齐全拆散进行存储,不仅极大地升高了因为标签反复存储所带来的存储空间的节约,还可能极为高效地实现多表之间的聚合查问,使得千万级别规模的标签数据查问能够在毫秒级别返回。
在我 2008 年守业做和信时,就是一台手机一个音讯队列,当初物联网数据的解决,和我当年做音讯队列模块相比,在存储架构上,只是一个结构化与非结构化的区别,前者是为了更高效地做各种计算和查问,但在理论利用中,咱们还须要思考到多个设施间数据如何进行高效聚合,我很快就想到了对策,那就能够用数据分析中的维度表、事实表的模型来解决,这样一来,超级表的概念也就进去了。
TDengine 受这些经典数据结构的启发,应用到的也都是风行十几年甚至更久的根底技术,但在此之上还有对技术的正当使用和不断创新,最初才真正成为一个为时序数据场景量身定做的数据库产品。
对于开发者来说,把握根底的技术常识和原理是迈进这个职业门槛的一个通行证,如果是一个有谋求的人,真的想要在工作中有所建树,还想往上更进一步,那就还应该时刻思考怎么使用好这些常识,怎样才能更疾速去取得一些对代码的创意思考。
想要往上走,就肯定不能躺平
软件特地是根底软件开源,曾经成为不可抵御的潮流,对于开发者来说,这是最好的时代,你不须要苦思冥想本人瞎琢磨,很多时候也不必齐全从 0 到 1 去进行一个设计思考。开源我的项目就像是一本书籍,你总能从中取得一些超出你认知的对于根底技术的翻新使用,毫无疑问,站在前人的肩膀上,你能看到的会更远。
就拿编程语言来说,因为互联网行业自身变动大,倒退迅速,编程语言也是形形色色,除了 Java、Javascript 一类的,近几年新出的还有如 Go、Rust、Dart、Kotlin、Swift 等等,在应用型技术占比很高的行业中,对于语言的把握也要绝对宽泛一些,好在这些风行语言还并不是很难把握。
还有些偏底层的语言,自身是很弱小的,开发需要低,所以始终都很稳固,C 语言就是这类语言的代表,学好了几十年后也不会过期。但难点就在于这种语言比拟难把握,而且大多波及硬件和操作系统底层,所以很多人都会对 C 语言望而生畏。但事实上 C 语言十分值得学习,它的灵活性极强,向上能够写利用,向下能够写硬件,如果哪一天互联网没落了,依附对这门语言的精通齐全能够让你平移到其余赛道。
TDengine 就是一款应用 C 语言自主研发的时序数据库(Time-Series Database),没有应用任何第三方的库,一切都是本人开发,包含定时器、RPC 等模块等,并且曾经开源。当初我抉择 C 语言作为开发语言的起因,其实是受到了 SQLite 的影响,它没有服务器,仅仅一个 C 语言库,整个数据库寄存于繁多跨平台的文件,反对 ACID,零配置,而且体量能够仅为 600KB。我很庆幸TDengine 抉择了 C 语言,尽管的确有一系列头疼问题,如内存泄露、有效指针、多线程同步等,但这些都在前期优化中失去了改善,而 TDengine 所领有的无依赖、体量小、内存远远小于 InfluxDB、OpenTSDB 等其余时序数据库这些劣势,都是十分显著的。
参加开源我的项目也是学习编程语言的一个好办法,要晓得,风行的开源我的项目都是通过实际斟酌、比拟成熟的代码创作,认真去研读相干我的项目的源码,而后再依附学习到的代码思路去解决问题,这会让你在语言学习上事倍功半。如果你正在蛊惑,无妨参加到 TDengine 开源我的项目中来,只有你真心有投入,我乐意花工夫与你一起探讨问题。
结 语
以前很多人质疑过我,认为我不是一个从 Oracle、DB2 外围团队进去的人,怎么能研发Database?但如果你深挖了我的背景,晓得我从 1997 年起就在做分布式高牢靠的无线外围网络设备研发,也明确音讯队列与时序数据之间的相似之处后,你就不会奇怪了。就像我开篇时说的,技术圈里很多的根底原理和办法,几十年都未曾扭转,长于思考总结的人总会从中失去相干的法则。可能正是因为我是跨界过去的,比起沉迷在数据库畛域多年且曾经造成技术思维固化的开发者,才更容易在根底原理和办法的使用上,想到翻新甚至是颠覆式的设计思路。
所以,过期的不是根底的技术原理和办法,而是人的思考能力以及没有跟上节奏的对技术的认知。
陶建辉
2022年5月29日于北京大兴隔离酒店
想理解更多 TDengine Database的具体细节,欢送大家在GitHub上查看相干源代码。