什么叫程序员的技术好?

发布时间:
2023-11-19 06:05
阅读:
4

这是一个非常好的问题,什么叫技术好,我就用一个面试官的角度来和你聊聊吧。

你以为精通底层原理就是技术好?

你说你精通cpu原理,操作系统的线程切换原理以及具体细节你可以如数家珍,cpu底层比较交换的原理你能讲出来,你能说出一次比较交换用了多少个时钟周期,多少个cpu周期,至于操作系统里面的硬中断导致资源消耗,你不仅仅了解。还能算出来,到底消耗了多少资源。谈到cpu的利用率,你更是打了兴奋剂一样,你说到你知道cpu利用率计算的底层原理的时候,比性高潮还兴奋。谈到cpu负载,你依然能够侃侃而谈,你说如果仅仅知道个cpu负载的概念那就太low了,要聊就聊原理,聊底层,聊细节。

结果面试官问,你既然这么熟悉操作系统和cpu之间千丝万缕的关系,那么你是做虚拟化方面的项目中需要优化内核,还是做sre方面的项目的时候提升了告警时效,或者提高了你们系统编译方面的编译效率?

顿时,你的高潮立即卸下来了,不甘心的你又说,如果关于使用方面,你精通底层的零拷贝以及原理,你还知道kafka是用了这一门技术所以kafka的传输效率特别高,零拷贝的原理你能从操作系统层面到总线层面层层剥茧,里面的流程都可以画出来。

结果面试官问,你们的项目有多少吞吐量?处理的tps是多少,为什么要使用kafka,kafka虽然使用了零拷贝,但是也存在很多问题,你们的项目中有没有遇到过一些难以处理的诡异的问题?

你只能说,我们确实没有遇到过这样的问题,但是kafka的零拷贝方面肯定比其他方面更优势,毕竟进程没有经过反复的用户态和内核态的切换了,这部分的切换是很消耗性能的。

结果面试官又问,你说零拷贝会很消耗资源,那么你们在项目中是否有对这方面过基准测试之类的?有没有生成测试报告?或者有没有通过一些监控手段,对使用零拷贝前后的监控数据进行对比?

你快要蔫了,发出最后的倔强,你说,基准测试我们目前没有用过,监控的基础设施暂时还不够完善,不过相信我对操作系统、网络、数据库、jvm等方面的原理非常精通,那么我就可以做到这些。

结果面试官问,既然你说你没有实践过,你只是对底层技术很了解,那么我们就只聊你的底层技术水平吧。说说你底层哪方面比较熟悉的?

你自信的说,那就从tcp热身吧。

结果面试官问,tcp你肯定了解了,那么tcp的早期替代方案你有没有了解过?tcp过去的发展脉络能不能详细说一说?以及tcp最新的发展状况是怎么样的?你研究tcp主要是看了哪些论文或者期刊?

你脑袋翁的一声,你说你只是把tcp/ip这本书认认真真的啃了一遍下去,还真没想过有什么论文讨论这方面的,也没有去过多了解它的历史,只是对里面的理论很熟悉而已。

结果面试官问,既然你对tcp协议的认识,仅限于书本,那我们就只聊书本里面介绍的tcp吧。我们都知道tcp的客户端是会随机选择一个端口连接到服务端的,那么如果在非常短的时间内,在客户端生产上百万个的tcp连接,会导致什么问题?出现这样的问题,在linux操作系统里面要怎么解决?在其他的操作系统里面又要怎么解决?既然是端口有限,为什么操作系统的端口个数不是无限的?

你侧底懵逼,你最后只能说,其实我最熟悉的是tcp协议的格式,以及三次握手四次握手。

结果面试官说,既然你只熟悉tcp的协议本身,那么你肯定对tcp里面的每个标志位非常熟悉了,假设如果写这么一个程序,疯狂的给一个正在监听的服务端的端口发送syn包会怎么样?如果是拼命发确认包呢?或者拼命发送错误重传的包呢?这个时候服务端会出现什么问题?

最后,你只能说,我只是背诵了一些tcp三次握手的流程,以及里面每个标志位代表的一种,这种实验还真没做过。

面试官说,好的,其他上百个面试者也是这么说的,感谢你今天的面试。

你以为懂的知识面广就是技术好?

你跟面试官说,我懂二十种数据库,时序数据库、关系型数据库、对象型数据库、数据湖型数据库、文档类型数据库、文件类型数据库等等。

结果面试官问,我们这里需要的是对时序数据库非常精通的同学,尤其是druid这种数据库,如果在druid这种数据库方面有集群拆分经验的就更好了,如果用druid处理过万亿级别的数据,那就是加分项了。当然,对于druid这种数据库,在多海量维度值这方面有一定处理经验的,我们也是要的,druid数据库转列式数据库方面的经验我们也是欢迎的,请问你有没有?

你只能说,数据库大部分的原理和使用场景我都知道,但是用到这么细致的目前没有。不过我还熟练掌握各种语言,java太简单了,我熟悉pyyhon、c、go、js、php等多种语言,可以一人多用,一个人可以兼任多个岗位。

结果面试官说,我们现在只需要一个精通Java的,能够徒手写出Java虚拟机的,还能够默写jvm源码的,尤其是在大并发的时候,能够通过优化jvm源码来降低系统响应时间的,你有没有这方面的经验?还有我们这边的实时性要求是10ms以下,你清楚吧,Java在实时性方面是它最大的缺点,你觉得应该裁剪jvm哪个部分的源码可以解决这个问题?或者之前有没有这方面的经验?

你只能说,Java我知道开发效率高,但是性能不怎么高,至于jvm方面,我认为只要会用就行了。不过我还会数十种操作系统,我能在各种操作系统下面写代码,并且能够优化。

结果面试官问,我们目前生产环境使用的是centos操作系统,对于这样的操作系统,你认为它的buffer/cache这方面的设计是不是不够完善,如果你在使用这种操作系统的时候,是怎么优化这方面的?因为我们这边的系统是做视频的,可能对内存到磁盘的存储比较高的性能,那么对于缓存肯定是要有自己的优化策略的。

你回答说你这方面没研究的这么细,但是如果你们换成windows server服务器,我是非常快的可以帮你们搞定的。

结果面试官说,好的,今天的面试找到这吧。如果我们的服务器全部换成windows server了,第一时间找到你。

请问,你从这个故事里悟到了些什么?

END