精华内容
下载资源
问答
  • 作为一名 在大、中、小微企业都待过 的 Java 开发者,今天和大家分享下自己在不同公司的工作日常和收获。包括一些个人积累的工作提升经验,以及一些 Java 学习的方法和资源。 先从我的第一份 Java 开发实习工作说起...

    作为一名 在大、中、小微企业都待过 的 Java 开发者,今天和大家分享下自己在不同公司的工作日常和收获。包括一些个人积累的工作提升经验,以及一些 Java 学习的方法和资源。

    先从我的第一份 Java 开发实习工作说起吧~

    实习生工作日常

    我是在大二暑期开始了我人生的第一次实习,岗位正是 Java 开发,还混了个 title 叫 “助理 Java 工程师”!

    这家公司属于一家中型企业,作为第一份实习,我已经很满足了。

    刚进入公司的第一天,在导师和运维同学的帮助下,搞好办公设备,安装开发环境,本以为第二天就能开始写代码。但是整整两周,我都没有写下一行 Java 代码!而是先花了一周的时间熟悉企业的业务、我要参与的项目源码(Spring 全家桶 + Dubbo)、以及公司的各种办公套件和研发流程。这些几乎是每位刚刚进入新公司的同学都要做的事情。

    在这里插入图片描述
    然后我就开始接需求了,面对前人留下的 xx 一样的代码和复杂的业务,我根本无从下手。那么这一周我做了些什么呢?在导师的指导下,我针对这个需求涉及的业务流程画了一个很完整的流程图,并且在流程图上进行了详细的标注。画完流程图之后,我突然感觉思路清晰了很多,接下来就是写伪代码,终于在一周后,我才正式开始写 Java 代码了。

    在此之前,我基本都是跟着视频教程写写简单的 Demo 程序,或者自己为了学习做做简单的小项目。从来没有像这次一样在写代码前进行如此精心的设计,第一次有了自己走出校园的感觉,这种体验和成长是在学校无法感受到的。这也是为什么我建议计算机专业的同学在学了一些开发技术后,趁早去找一份实习,不用担心自己的经验不足,通过面试和企业工作的磨练才能让你积累更多的经验、提升技术,也能帮助你明确自己的目标。现在也有很多帮助大学生找实习的平台,像 牛客网、实习僧 都是很不错的。

    实习的这家公司虽然不大,但是团队的氛围非常好。也正因为公司不大,和技术主管、CTO 等大佬的交流机会也非常多,我们每天开工前都会开站会(敏捷开发)来讨论工作,并且定期地举办技术分享。

    整个实习过程真的非常愉快,学到了很多技术和业务知识,也开拓了眼界,明确了我今后的职业发展方向。最爽的事是工作不忙的时候也摸鱼儿刷了一些算法,真的非常感谢公司和这段实习经历!

    然后分享我目前在 腾讯 做 Java 开发的日常。

    鹅厂工作日常

    没错,鹅厂并不是只有 C++ 这一门后端开发语言,其实鹅厂的 Java 程序员数量也是很多的!

    我从大三暑假开始就在腾讯实习,并通过答辩转正,虽然只毕业半年,但至今累积在鹅厂写 Java 已经一年半多了,那除了偶尔摸鱼外,我平时的工作都做些什么呢?

    在这里插入图片描述
    起初我以为大厂程序员的工作日常也就是写代码、造轮子,在大公司,就得写更多的代码!

    结果在刚入职时,由于经验不足,再加上年轻气盛,有着莫名的自信。刚拿到需求后,我觉得特别简单,不就是 CRUD(增删改查)么?于是,我就懒得设计方案了,没怎么思考就直接上手写代码了,结果不断翻车,出现了很多细节问题,比如数据没有访问权限获取不到、和其他部门的同学接口字段没对齐等等,甚至还出现需求理解错误的情况!最后导致的结果就是做了很多无用功,把本来几天就能做完的需求一拖再拖,一度以为自己要被劝退了! o(╥﹏╥)o

    经历了一次次的翻车后,我开始思考自己的问题到底出在哪里,为什么我总感觉自己什么都知道、可以写出代码,但写出的代码却经常错误连篇呢?

    我向导师和其他的同事请教后发现,其实大家更多的时间并不是在写代码,而是在 开会讨论、核对需求、沟通对齐、设计技术方案、测试等。写代码的时间其实很少很少!

    导师对我说:“其实写代码并不难,关键是要明确为什么要写代码、怎么写代码、写什么代码。”

    原来,相比写代码,更重要的是写代码前的技术方案设计和写代码后的测试!

    技术方案设计

    当程序员确认完需求后,要先根据需求来给出一个清晰明确的技术方案,一方面是证明需求的可行性,另一方面是对自己之后的代码实现有一个大致思路。很多的问题其实是可以在设计阶段去发现和规避的,而不是等你写代码的时候,才发现之前的设计有问题、甚至是需求本身就不合理!到时候耽误了项目上线,背锅的就是程序员自己!

    之前有朋友问,在大公司,万一写着写着代码,没思路了、写不出来了怎么办?这种问题其实就是可以通过前期的技术方案设计来规避的。毕竟老板才不关心你代码写的怎么样,他只关心你的技术方案,换句话说,是关心你能不能按时完成项目!

    此前,我即使画了一些流程图,目的也仅仅是在于帮助自己写代码。觉得代码能写出来后,我就不再去考虑方案设计了。

    而在意识到技术方案的重要性后,我会在理解需求后,先写一份详尽的技术方案,包括需求的合理性分析、选用什么技术来实现指定的功能、怎么设计库表结构、怎么设计类之间的关系(用哪种设计模式)、怎么设计接口、计划工期是多久、有没有什么风险点等等。
    如需课件源码软件等资料添加小助手vx:ma-xiaoguo(备注:果果)

    开发

    设计好方案后,就要投入开发。

    基本就是先利用一些数据库管理软件或者登陆服务器去配置一些库表,然后选用一些 Java 类库和工具来编写业务代码。说是编写代码,其实 80% 以上都是复制粘贴!复制别人的,复制自己的,积累的代码多了之后,简直爽的飞起!不能复制粘贴的,也可以用一些代码生成工具、甚至是低代码工具来偷偷懒。谁说 CRUD 工程师就没有技术?哼,咱偷懒也要有水平。

    写代码的过程中,你要遵循一定的规范,不断地将重复的代码进行抽象、封装和复用,可以利用一些设计模式,并且要多多编写注释,提高代码的可读性和可维护性。

    关于代码规范,建议参考 Google 开源的 Java 代码规范或者阿里巴巴的 Java 代码规范,非常专业!
    在这里插入图片描述
    写好代码后,你要再次检查自己的代码,可以利用一些代码格式化和代码检查工具来提前发现一些规范问题以及 bug,还要在本地编写单元测试来最细粒度地保证代码的可运行性和正确性。

    Java 的单元测试类库一般用 JUnit就行了,本地自己测试请求接口的话可以直接用 IDEA 自带的测试插件,也可以选用 Swagger或者 YAPI、Postman 等接口管理工具,甚至还可以直接使用命令行 curl 等。

    在这里插入图片描述

    测试

    在写完代码之后,要经过非常非常非常充分的测试才能提交代码!这个阶段也是非常花时间的,需要配合测试同学,提供一些测试的细节和补充说明,并且对测试中发现的问题进行修复。很多程序员应该都有这种感受:写 bug 一分钟,改 bug 一小时!

    在这里插入图片描述
    这些就是我目前在鹅厂的日常工作,其实和其他公司不会什么区别,无非就是你负责的业务量级越大,你在设计、测试等环节上投入的时间和精力就要更多;业务团队越大,你在需求沟通和合作上也要花更多的时间。这些工作看似和写代码关系不大,但对于程序员的经验积累以及职业素养、工程能力的提升是至关重要的!

    优秀的程序员,不只是有能力写得一手好代码,更多的是需要具备一些工程师素养,比如:

    对技术有独特的兴趣和追求,持续学习

    • 有全局观,总能站在一个更高、更全局的视角去考虑问题

    • 处理事情小心谨慎,而不是凭直觉和过去的经验主观臆断

    • 沟通能力强,能够用方便他人理解的方式来描述问题

    • 强大的设计架构能力

    • 刨根问题,深究问题本质

    • 代码洁癖,精益求精

    • 不止技术,还注重业务底层逻辑,关心用户

    • 执行力强,有责任心

    • 懂得利用自动化工具提升效率

    • 善用绘图、图表来描述技术架构和问题

    • 乐于分享,积极为他人指路

    如需课件源码软件等资料添加小助手vx:ma-xiaoguo(备注:果果)
    !关注UP主 日常更新分享Java基础编程技术!

    在工作之余,我也在朝着成为一名优秀工程师的路上而努力。因此,我会利用公司提供的知识平台、问答平台和技术资源进行学习,并且多和身边的技术大牛们交流。大公司技术好,大佬多,提供的资源也真的非常多,这是我认为很多同学应该去大厂的一个原因,而身在大厂的同学更应该利用好这些资源。

    我还会积极参与一些公司内外的开源项目,和优秀的程序员朋友一起合作,互相学习进步,提升代码的水平。这里也建议大家多看 GitHub 上的开源项目,先在本地运行并熟练使用它,然后尝试分析源码和贡献代码。

    展开全文
  • 都知道鹅厂是cpp的主战场,而以cpp为背景的工程师大都对os,network这块要求特别高,不像是Java这种偏重业务层的语言. 之前面试Java的公司侧重还是在数据结构、网络、框架、数据库和分布式。所以OS这块吃的亏比较大...

    经过半年的沉淀,加上对MySQL,redis和分布式这块的补齐,终于重拾面试信心,再次出征。

    鹅厂

    面试职位: go后端开发工程师,接受从Java转语言

    都知道鹅厂是cpp的主战场,而以cpp为背景的工程师大都对os,network这块要求特别高,不像是Java这种偏重业务层的语言.

    之前面试Java的公司侧重还是在数据结构、网络、框架、数据库和分布式。所以OS这块吃的亏比较大

    一面:基础技术面

    电话面试,随便问了些技术问题,最后还问了个LeetCode里面medium级别的算法题,偏简单。大概整理回忆了一下:

    • redis有没有用过,常用的数据结构以及在业务中使用的场景。
    • redis的hash怎么实现的?
    • rehash过程讲一下和JavaHashMap的rehash有什么区别?
    • redis cluster有没有了解过,怎么做到高可用的?
    • 说说redis的持久化机制,为啥不能用redis做专门的持久化数据库存储?
    • 了不了解tcp/udp,说下两者的定义,tcp为什么要三次握手和四次挥手?
    • tcp怎么保证有序传输的,讲下tcp的快速重传和拥塞机制
    • 知不知道time_wait状态,这个状态出现在什么地方,有什么用?
    • udp是不可靠的传输,如果你来设计一个基于udp差不多可靠的算法,怎么设计?
    • http与https有啥区别?说下https解决了什么问题,怎么解决的?说下https的握手过程。
    • 看你项目里面用了etcd,讲解下etcd干什么用的,怎么保证高可用和一致性?
    • 既然你提到了raft算法,讲下raft算法的基本流程?raft算法里面如果出现脑裂怎么处理?
    • 有没有了解过paxos和zookeeper的zab算法,他们之前有啥区别?
    • 你们后端用什么数据库做持久化的?有没有用到分库分表,怎么做的?
    • 索引的常见实现方式有哪些,有哪些区别?
    • MySQL的存储引擎有哪些,有哪些区别?
    • InnoDB使用的是什么方式实现索引,怎么实现的?说下聚簇索引和非聚簇索引的区别?
    • 有没有了解过协程?说下协程和线程的区别?
    • 算法题一个,剑指offer第51题,数组中的重复数字?

    大概说下我自己的回答情况,redis这块没啥问题,具体rehash有印象是渐进式的,但是具体原理可能答的有点出入。

    tcp的 time_wait 这块答的不是很好,之前没有了解过quic机制的实现,所以问可靠性udp的时候,基本上脑子里就照着tcp的实现在说。

    https这块没啥说的,之前项目里面有用到类似的东西,研究的比较清楚了。

    raft算法这个因为刚好在刷,答的也凑合,不过paxos和zab算法确实不熟悉,直接说不会。

    MySQL这块很熟了,包括索引,锁,事务机制以及mvcc等等,没啥说的,都已经补齐了。

    协程和线程,主要说了go程和Java线程的区别以及go程的调度模型。面试官提示没有提到线程的有内核态的切换,go程只在用户态调度。

    最后一个算法题,首先说使用HashMap来做,说空间复杂度能不能降到O(1),后面想了大概5min才想出来原地置换的思路。

    总得来说,答的还行,一面就这么过了。

    二面:项目技术面

    二面从基础技术考察转移到了项目,主要问了我下面一些问题:

    • 针对自己最熟悉的项目,画出项目的架构图,项目主要的数据表结构。
    • 说说项目中使用到的技术点,项目的总峰值qps,时延。
    • 有没有分析过时延出现的耗时分别出现在什么地方,项目有啥改进的地方没有?
    • 如果请求出现问题没有响应,如何定位问题,说下思路?
    • tcp 粘包问题怎么处理?
    • 然后还问了下缓存更新的模式,以及会出现的问题和应对思路?
    • 除了公司项目之外,业余时间有没有研究过知名项目或做出过贡献?

    这一面答的也比较顺利,因为都是围绕项目,自己很熟悉,基本都没有啥问题,除了面试官说项目经验稍弱之外,其余还不错。

    三面:综合技术面

    这面面的是阵脚大乱,面试官采用刨根问底的方式提问,终究是面试经验不够,导致面试的节奏有点乱。举个例子:

    其中有个题: go程和线程有什么区别?

    答:起一个go程大概只需要4kb的内存,起一个Java线程需要1.5MB的内存;go程的调度在用户态非常轻量,Java线程的切换成本比较高。

    接着问为啥成本比较高?因为Java线程的调度需要在用户态和内核态切换所以成本高?为啥在用户态和内核态之间切换调度成本比较高?我简单说了下内核态和用户态的定义。

    接着问,还是没有明白为啥成本高?心里瞬间崩溃,没完没了了呀,OS这块依旧是痛呀,支支吾吾半天放弃了。

    后面所有的提问都是这种模式,结果回答的节奏全无,感觉被套路了。大多度都能回答个一二甚至是一二三,但是再往后或者再深入的OS层面就GG了。

    后面问了下项目过程中遇到的最大的挑战,以及怎么解决的?

    还问了一个问题定位的问题,服务器CPU 100%怎么定位?

    可能是由于平时定位业务问题的思维定势,加之处于蒙蔽状态,随口就是:

    • 先查看监控面板看有无突发流量异常
    • 接着查看业务日志是否有异常,针对CPU100%那个时间段,取一个典型业务流程的日志查看
    • 最后才提到使用top命令来监控看是哪个进程占用到100%。

    果然阵脚大乱,张口就来,捂脸。。。

    本来正确的思路应该是先用top定位出问题的进程,再用top定位到出问题的线程,再打印线程堆栈查看运行情况,这个流程换平时肯定能答出来,但是,但是没有但是。还是得好好总结。

    最后问了一个系统设计题目(朋友圈的设计),白板上面画出系统的架构图,主要的表结构和讲解主要的业务流程,如果用户变多流量变大,架构将怎么扩展,怎样应对?

    这个答的也有点乱,直接上来自顾自的用了一个通用的架构,感觉毫无亮点。后面反思应该先定位业务的特点,这个业务明显是读多写少,然后和面试官沟通一期刚开始的方案的用户量,性能要求,单机目标qps是什么等等?在明确系统的特点和约束之后再来设计,而不是一开始就是用典型互联网的那种通用架构自顾自己搞自己的方案。

    面试结果:3天后收到短信,被拒

    总结:

    • tcp/udp,http和https还有网络这块(各种网络模型,已经select,poll和epoll)一定要非常熟悉
    • 一定要有拿的出手的项目经验,而且要能够讲清楚,讲清楚项目中取舍,设计模型和数据表
    • 分布式要非常熟悉
    • 常见问题定位一定要有思路
    • 操作系统,还是操作系统,重要的事情说三遍
    • 系统设计,思路,思路,思路,一定要思路清晰,一定要总结下系统设计的流程
    • 一点心得,平时blog和专栏看的再多,如果没有自己的思考不过是过眼云烟,根本不会成为自己的东西,就像内核态和用户态,平常也看过,但是没细想,突然要自己说,还真说不出来,这就很尴尬了。勿以浮沙筑高台,基础这种东西还是需要时间去慢慢打牢,多去思考和总结。


    群内提供免费的Java架构学习资料,QQ群:643459718
    (里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,
    MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)

    展开全文
  • 经过半年的沉淀,加上对MySQL,redis和分布式这块的补齐,终于重拾面试信心,再次...都知道鹅厂是cpp的主战场,而以cpp为背景的工程师大都对os,network这块要求特别高,不像是Java这种偏重业务层的语言. 之前面试...

    经过半年的沉淀,加上对MySQL,redis和分布式这块的补齐,终于重拾面试信心,再次出征。

    鹅厂

    面试职位:go后端开发工程师,接受从Java转语言

    都知道鹅厂是cpp的主战场,而以cpp为背景的工程师大都对os,network这块要求特别高,不像是Java这种偏重业务层的语言.

    之前面试Java的公司侧重还是在数据结构、网络、框架、数据库和分布式。所以OS这块吃的亏比较大

    一面:基础技术面

    电话面试,随便问了些技术问题,最后还问了个LeetCode里面medium级别的算法题,偏简单。大概整理回忆了一下:

    • redis有没有用过,常用的数据结构以及在业务中使用的场景。
    • redis的hash怎么实现的?
    • rehash过程讲一下和JavaHashMap的rehash有什么区别?
    • redis cluster有没有了解过,怎么做到高可用的?
    • 说说redis的持久化机制,为啥不能用redis做专门的持久化数据库存储?
    • 了不了解tcp/udp,说下两者的定义,tcp为什么要三次握手和四次挥手?
    • tcp怎么保证有序传输的,讲下tcp的快速重传和拥塞机制
    • 知不知道time_wait状态,这个状态出现在什么地方,有什么用?
    • udp是不可靠的传输,如果你来设计一个基于udp差不多可靠的算法,怎么设计?
    • http与https有啥区别?说下https解决了什么问题,怎么解决的?说下https的握手过程。
    • 看你项目里面用了etcd,讲解下etcd干什么用的,怎么保证高可用和一致性?
    • 既然你提到了raft算法,讲下raft算法的基本流程?raft算法里面如果出现脑裂怎么处理?
    • 有没有了解过paxos和zookeeper的zab算法,他们之前有啥区别?
    • 你们后端用什么数据库做持久化的?有没有用到分库分表,怎么做的?
    • 索引的常见实现方式有哪些,有哪些区别?
    • MySQL的存储引擎有哪些,有哪些区别?
    • InnoDB使用的是什么方式实现索引,怎么实现的?说下聚簇索引和非聚簇索引的区别?
    • 有没有了解过协程?说下协程和线程的区别?
    • 算法题一个,剑指offer第51题,数组中的重复数字?

    大概说下我自己的回答情况,redis这块没啥问题,具体rehash有印象是渐进式的,但是具体原理可能答的有点出入。 tcp的 time_wait 这块答的不是很好,之前没有了解过quic机制的实现,所以问可靠性udp的时候,基本上脑子里就照着tcp的实现在说。 https这块没啥说的,之前项目里面有用到类似的东西,研究的比较清楚了。 raft算法这个因为刚好在刷,答的也凑合,不过paxos和zab算法确实不熟悉,直接说不会。 MySQL这块很熟了,包括索引,锁,事务机制以及mvcc等等,没啥说的,都已经补齐了。 协程和线程,主要说了go程和Java线程的区别以及go程的调度模型。面试官提示没有提到线程的有内核态的切换,go程只在用户态调度。 最后一个算法题,首先说使用HashMap来做,说空间复杂度能不能降到O(1),后面想了大概5min才想出来原地置换的思路。

    总得来说,答的还行,一面就这么过了

    二面:项目技术面

    二面从基础技术考察转移到了项目,主要问了我下面一些问题:

    • 针对自己最熟悉的项目,画出项目的架构图,项目主要的数据表结构。
    • 说说项目中使用到的技术点,项目的总峰值qps,时延。
    • 有没有分析过时延出现的耗时分别出现在什么地方,项目有啥改进的地方没有?
    • 如果请求出现问题没有响应,如何定位问题,说下思路?
    • tcp 粘包问题怎么处理?
    • 然后还问了下缓存更新的模式,以及会出现的问题和应对思路?
    • 除了公司项目之外,业余时间有没有研究过知名项目或做出过贡献?

    这一面答的也比较顺利,因为都是围绕项目,自己很熟悉,基本都没有啥问题,除了面试官说项目经验稍弱之外,其余还不错。

    三面:综合技术面

    这面面的是阵脚大乱,面试官采用刨根问底的方式提问,终究是面试经验不够,导致面试的节奏有点乱。举个例子:

    其中有个题:go程和线程有什么区别? 答:起一个go程大概只需要4kb的内存,起一个Java线程需要1.5MB的内存;go程的调度在用户态非常轻量,Java线程的切换成本比较高。 接着问为啥成本比较高?因为Java线程的调度需要在用户态和内核态切换所以成本高?为啥在用户态和内核态之间切换调度成本比较高?我简单说了下内核态和用户态的定义。 接着问,还是没有明白为啥成本高?心里瞬间崩溃,没完没了了呀,OS这块依旧是痛呀,支支吾吾半天放弃了。

    后面所有的提问都是这种模式,结果回答的节奏全无,感觉被套路了。大多度都能回答个一二甚至是一二三,但是再往后或者再深入的OS层面就GG了。

    后面问了下项目过程中遇到的最大的挑战,以及怎么解决的?

    还问了一个问题定位的问题,服务器CPU 100%怎么定位?

    可能是由于平时定位业务问题的思维定势,加之处于蒙蔽状态,随口就是:

    • 先查看监控面板看有无突发流量异常
    • 接着查看业务日志是否有异常,针对CPU100%那个时间段,取一个典型业务流程的日志查看
    • 最后才提到使用top命令来监控看是哪个进程占用到100%。

    果然阵脚大乱,张口就来,捂脸。。。 本来正确的思路应该是先用top定位出问题的进程,再用top定位到出问题的线程,再打印线程堆栈查看运行情况,这个流程换平时肯定能答出来,但是,但是没有但是。还是得好好总结。

    最后问了一个系统设计题目(朋友圈的设计),白板上面画出系统的架构图,主要的表结构和讲解主要的业务流程,如果用户变多流量变大,架构将怎么扩展,怎样应对? 这个答的也有点乱,直接上来自顾自的用了一个通用的架构,感觉毫无亮点。后面反思应该先定位业务的特点,这个业务明显是读多写少,然后和面试官沟通一期刚开始的方案的用户量,性能要求,单机目标qps是什么等等?在明确系统的特点和约束之后再来设计,而不是一开始就是用典型互联网的那种通用架构自顾自己搞自己的方案。

    面试结果:3天后收到短信,被拒

    总结:

    • tcp/udp,http和https还有网络这块(各种网络模型,已经select,poll和epoll)一定要非常熟悉
    • 一定要有拿的出手的项目经验,而且要能够讲清楚,讲清楚项目中取舍,设计模型和数据表
    • 分布式要非常熟悉
    • 常见问题定位一定要有思路
    • 操作系统,还是操作系统,重要的事情说三遍
    • 系统设计,思路,思路,思路,一定要思路清晰,一定要总结下系统设计的流程
    • 一点心得,平时blog和专栏看的再多,如果没有自己的思考不过是过眼云烟,根本不会成为自己的东西,就像内核态和用户态,平常也看过,但是没细想,突然要自己说,还真说不出来,这就很尴尬了。勿以浮沙筑高台,基础这种东西还是需要时间去慢慢打牢,多去思考和总结。

    转载于:https://my.oschina.net/u/4139951/blog/3068361

    展开全文
  • 欢迎关注专栏:里面定期分享Java架构技术知识点及解析,还会不断更新的BATJ面试专题,欢迎大家前来...鹅厂面试职位:go后端开发工程师,接受从Java转语言都知道鹅厂是cpp的主战场,而以cpp为背景的工程师大都对os,n...

    9a8d971f2ed2683a0bf71ade0dcd2472.png

    欢迎关注专栏:里面定期分享Java架构技术知识点及解析,还会不断更新的BATJ面试专题,欢迎大家前来探讨交流,如有好的文章也欢迎投稿。

    程序员圈内那点事zhuanlan.zhihu.com
    af7ff781ab164aaae21584a9e11d0980.png

    经过半年的沉淀,加上对MySQL,redis和分布式这块的补齐,终于重拾面试信心,再次出征。

    鹅厂

    a4bd143aaf0e89c752b9ae7cc442cdf3.png

    面试职位:go后端开发工程师,接受从Java转语言

    都知道鹅厂是cpp的主战场,而以cpp为背景的工程师大都对os,network这块要求特别高,不像是Java这种偏重业务层的语言.

    之前面试Java的公司侧重还是在数据结构、网络、框架、数据库和分布式。所以OS这块吃的亏比较大

    一面:基础技术面

    电话面试,随便问了些技术问题,最后还问了个LeetCode里面medium级别的算法题,偏简单。大概整理回忆了一下:

    • redis有没有用过,常用的数据结构以及在业务中使用的场景。
    • redis的hash怎么实现的?
    • rehash过程讲一下和JavaHashMap的rehash有什么区别?
    • redis cluster有没有了解过,怎么做到高可用的?
    • 说说redis的持久化机制,为啥不能用redis做专门的持久化数据库存储?
    • 了不了解tcp/udp,说下两者的定义,tcp为什么要三次握手和四次挥手?
    • tcp怎么保证有序传输的,讲下tcp的快速重传和拥塞机制
    • 知不知道time_wait状态,这个状态出现在什么地方,有什么用?
    • udp是不可靠的传输,如果你来设计一个基于udp差不多可靠的算法,怎么设计?
    • http与https有啥区别?说下https解决了什么问题,怎么解决的?说下https的握手过程。
    • 看你项目里面用了etcd,讲解下etcd干什么用的,怎么保证高可用和一致性?
    • 既然你提到了raft算法,讲下raft算法的基本流程?raft算法里面如果出现脑裂怎么处理?
    • 有没有了解过paxos和zookeeper的zab算法,他们之前有啥区别?
    • 你们后端用什么数据库做持久化的?有没有用到分库分表,怎么做的?
    • 索引的常见实现方式有哪些,有哪些区别?
    • MySQL的存储引擎有哪些,有哪些区别?
    • InnoDB使用的是什么方式实现索引,怎么实现的?说下聚簇索引和非聚簇索引的区别?
    • 有没有了解过协程?说下协程和线程的区别?
    • 算法题一个,剑指offer第51题,数组中的重复数字?
    大概说下我自己的回答情况,redis这块没啥问题,具体rehash有印象是渐进式的,但是具体原理可能答的有点出入。
    tcp的 time_wait 这块答的不是很好,之前没有了解过quic机制的实现,所以问可靠性udp的时候,基本上脑子里就照着tcp的实现在说。
    https这块没啥说的,之前项目里面有用到类似的东西,研究的比较清楚了。
    raft算法这个因为刚好在刷,答的也凑合,不过paxos和zab算法确实不熟悉,直接说不会。
    MySQL这块很熟了,包括索引,锁,事务机制以及mvcc等等,没啥说的,都已经补齐了。
    协程和线程,主要说了go程和Java线程的区别以及go程的调度模型。面试官提示没有提到线程的有内核态的切换,go程只在用户态调度。
    最后一个算法题,首先说使用HashMap来做,说空间复杂度能不能降到O(1),后面想了大概5min才想出来原地置换的思路。

    总得来说,答的还行,一面就这么过了

    二面:项目技术面

    二面从基础技术考察转移到了项目,主要问了我下面一些问题:

    • 针对自己最熟悉的项目,画出项目的架构图,项目主要的数据表结构。
    • 说说项目中使用到的技术点,项目的总峰值qps,时延。
    • 有没有分析过时延出现的耗时分别出现在什么地方,项目有啥改进的地方没有?
    • 如果请求出现问题没有响应,如何定位问题,说下思路?
    • tcp 粘包问题怎么处理?
    • 然后还问了下缓存更新的模式,以及会出现的问题和应对思路?
    • 除了公司项目之外,业余时间有没有研究过知名项目或做出过贡献?

    这一面答的也比较顺利,因为都是围绕项目,自己很熟悉,基本都没有啥问题,除了面试官说项目经验稍弱之外,其余还不错。

    三面:综合技术面

    这面面的是阵脚大乱,面试官采用刨根问底的方式提问,终究是面试经验不够,导致面试的节奏有点乱。举个例子:

    其中有个题:go程和线程有什么区别?
    答:起一个go程大概只需要4kb的内存,起一个Java线程需要1.5MB的内存;go程的调度在用户态非常轻量,Java线程的切换成本比较高。
    接着问为啥成本比较高?因为Java线程的调度需要在用户态和内核态切换所以成本高?为啥在用户态和内核态之间切换调度成本比较高?我简单说了下内核态和用户态的定义。
    接着问,还是没有明白为啥成本高?心里瞬间崩溃,没完没了了呀,OS这块依旧是痛呀,支支吾吾半天放弃了。

    后面所有的提问都是这种模式,结果回答的节奏全无,感觉被套路了。大多度都能回答个一二甚至是一二三,但是再往后或者再深入的OS层面就GG了。

    后面问了下项目过程中遇到的最大的挑战,以及怎么解决的?

    还问了一个问题定位的问题,服务器CPU 100%怎么定位?

    可能是由于平时定位业务问题的思维定势,加之处于蒙蔽状态,随口就是:

    • 先查看监控面板看有无突发流量异常
    • 接着查看业务日志是否有异常,针对CPU100%那个时间段,取一个典型业务流程的日志查看
    • 最后才提到使用top命令来监控看是哪个进程占用到100%。

    果然阵脚大乱,张口就来,捂脸。。。
    本来正确的思路应该是先用top定位出问题的进程,再用top定位到出问题的线程,再打印线程堆栈查看运行情况,这个流程换平时肯定能答出来,但是,但是没有但是。还是得好好总结。

    最后问了一个系统设计题目(朋友圈的设计),白板上面画出系统的架构图,主要的表结构和讲解主要的业务流程,如果用户变多流量变大,架构将怎么扩展,怎样应对?
    这个答的也有点乱,直接上来自顾自的用了一个通用的架构,感觉毫无亮点。后面反思应该先定位业务的特点,这个业务明显是读多写少,然后和面试官沟通一期刚开始的方案的用户量,性能要求,单机目标qps是什么等等?在明确系统的特点和约束之后再来设计,而不是一开始就是用典型互联网的那种通用架构自顾自己搞自己的方案。

    面试结果:3天后收到短信,被拒

    总结:

    • tcp/udp,http和https还有网络这块(各种网络模型,已经select,poll和epoll)一定要非常熟悉
    • 一定要有拿的出手的项目经验,而且要能够讲清楚,讲清楚项目中取舍,设计模型和数据表
    • 分布式要非常熟悉
    • 常见问题定位一定要有思路
    • 操作系统,还是操作系统,重要的事情说三遍
    • 系统设计,思路,思路,思路,一定要思路清晰,一定要总结下系统设计的流程
    • 一点心得,平时blog和专栏看的再多,如果没有自己的思考不过是过眼云烟,根本不会成为自己的东西,就像内核态和用户态,平常也看过,但是没细想,突然要自己说,还真说不出来,这就很尴尬了。勿以浮沙筑高台,基础这种东西还是需要时间去慢慢打牢,多去思考和总结。

    赠送面试&学习福利资源

    最近在网上发现一个不错的 PDF 资源《Java 核心面试知识.pdf》分享给大家,不光是面试,学习,你都值得拥有!!!

    需要的可以电子关注我私信【资料】即可免费获取!!!

    目录以及部分截图:

    15f49132fb12978c71918bffa9ca25b3.png

    248603aa7b003a85c920048501fd8240.png

    64134e9b61aa91e8605444e76ebe824a.png
    展开全文
  • 老大、老二、老三那么问题来了鹅厂程序员怎么给孩子取名↓以下内容,摘自腾讯内部论坛乐享乐问1直接叫程旭、戴码但可能容易重名如果——你姓吴孩子就可以叫吴霸哥(无bug)(以后肯定很招产品经理喜欢)2每个程序员都有...
  • 都知道鹅厂是cpp的主战场,而以cpp为背景的工程师大都对os,network这块要求特别高,不像是Java这种偏重业务层的语言,之前面试Java的公司侧重还是在数据结构、网络、框架、数据库和分布式。所以...
  • 2019年去过字节跳动、鹅厂面试java技术岗,我就纳闷了,怎么都会问到我熟悉GO语言开发吗,难道你们招的不是java程序员,而是GO程序员吗。GO语言Go语言是谷歌在 2009 年发布的一款编程语言,从实践上以高效的开发效率...
  • 随着Unity、x等优秀跨平台游戏引擎的出现,开发者可以把自己从繁重的、iOS原生台开发中解放出来,把精力放在游戏的创作。...特别是在鹅厂,有了Apollo这样的组件,原生的接入更加简单,可能每个项目组只需要有1...
  • 众所周知,鹅厂后台一直以C++为重,面试官也是做C++开发。但是语言只是工具,对代码的理解才是核心。面试时重点考察的是基础知识,以及解题的思考过程。凭借着对Java的理解去回答,也受到了面试官的认可,最终幸运的...
  • 我越来越担心我作为一个Java程序员的未来。 恍然间,发现自己在这个行业里已经摸爬滚打了十年了,原以为自己就凭已有的项目经验和工作经历怎么着也应该算得上是一个业内比较资历的人士了,但是今年在换工作的过程中...
  • 能够进一线互联网公司,是大部分程序员奋斗的目标,有很多小伙伴可能因为学历望而止步,其实只要能力够,学历真的不是那么重要! 今天给大家带来ATM(阿里巴巴,腾讯,蚂蚁金服)的Java面试真题,希望能帮助各位读者...
  • 点击上方“java大数据修炼之道”,选择“置顶或者星标”你想要的优质技术好文第一时间送达!来源:腾讯技术工程今天跟大家分享一点鹅厂程序员的 Git 使用经验。介绍四种工作流来更好地理解 ...
  • 点击上方Java后端,选择设为星标优质文章,及时送达来源:腾讯技术工程今天跟大家分享一点鹅厂程序员的 Git 使用经验。介绍四种工作流来更好地理解 Git 的项目使用流程,利用其强大...
  • 应对金三银四只有不停地充实自己的知识,之前没有充实现在给你个好好充实自己的机会,阿里大牛流传出来的《java程序员金三银四涨薪秘籍》赶快看出来吧! 下面会给大家展示这本书的部分内容截图,因为这本书是全...
  • 自从蚂蚁金服上市,IT界多了一批千万富翁后,去投奔的程序员愈发多了,进去了皆大欢喜,而折腾一圈还是没能入职的可就难过了。最难过的是下面这位,在简历环节就直接被刷的。个人履历还不错,在腾讯...
  • 点击上方Java后端,选择设为星标优质文章,及时送达来源:腾讯技术工程今天跟大家分享一点鹅厂程序员的 Git 使用经验。介绍四种工作流来更好地理解 Git 的项目使用流程,利用其强大的分支功能为自己的项目构筑适配的...
  • PS:本人腾讯云布道师,也是一名鹅厂面试官。 近期面了30多位工作2-10年不等的技术骨干、总监、CTO,对于互联网或计算机方向的同学们又一点建议,都写下来了。 1.趁着在校期间,多做完整项目,多写代码。哪怕没有...
  • 黑客技术点击右侧关注,了解黑客的世界!Java开发进阶点击右侧关注,掌握进阶之路!Python开发点击右侧关注,探讨技术话题!近期,一位鹅厂程序员发帖说到:说出来大家可...
  • 假如,明天你财务自由了,你会想去做些什么?待到春来时,洗手作羹汤。抛弃java C,只把歌来唱。下面我们来看看鹅厂程序员们在实现财务自由之后,会有怎样奇奇怪怪可可爱爱的举动呢?「 更多干...
  • 所以,明白这一点的我,很早就已经立下志愿,目标是鹅厂。经过我两年的努力,付出就是有回报的,我总算进入了腾讯工作。下面分享一下我自己的4面面经,PCG事业群。 以下内容除了面经以外,还涉及到我自己整理的...
  • 随着Unity、cocos2dx等优秀跨平台游戏引擎的出现,开发者可以把自己从繁重的Android、iOS原生台开发中解放出来,把精力放在游戏的创作。...特别是在鹅厂,有了Apollo这样的组件,原生的接入更加简单,可能每个...
  • 作为某鹅厂一创业团队的一员,经历了一个产品从无到有,从小到大的过程,幸运地了解了一整套在线服务全流程解决方案,能满足亿级用户的需求。 本场 Chat 将带你全面了解在线服务全流程解决方案,如何搭建满足亿级用....
  • 众所周知,鹅厂后台一直以C++为重,面试官也是做C++开发。但是语言只是工具,对代码的理解才是核心。面试时重点考察的是基础知识,以及解题的思考过程。凭借着对Java的理解去回答,也受到了面试官的认可,最终幸运的...
  • 众所周知,鹅厂后台一直以C++为重,面试官也是做C++开发。但是语言只是工具,对代码的理解才是核心。面试时重点考察的是基础知识,以及解题的思考过程。凭借着对Java的理解去回答,也受到了面试官的认可,最终幸运的...

空空如也

空空如也

1 2 3
收藏数 49
精华内容 19
关键字:

鹅厂java程序员

java 订阅