首页 > 笔经面经 > 双非菜鸡回馈牛客

双非菜鸡回馈牛客

头像
杭电一级划水运动员
编辑于 2020-05-28 11:50:06 APP内打开
赞 142 | 收藏 560 | 回复52 | 浏览13755

前言

首先写这篇文章的目的是回馈牛客,非常感谢这个平台为我们广大学子提供一个学习、交流以及求职的机会。本文对我从去年秋招到今年春招的一些经验和情况作总结。所谓知己知彼方能百战不竭,我先对个人情况进行介绍。

我的学校虽然不是985,211但是计算机专业挺好,评级为B+,在江浙沪口碑还算不错。我本硕均为计算机专业,算是科班出身,虽然不是尖子生,但是水平也还说的过去。我本硕期间均没有实习经历;项目方面参加过军工项目,自己平时也鼓捣一些小项目。去年这个时候对自己的情况评估了一下,感觉竞争力不太强,所以重心放在了基础的复习与强化。下面给出目前战绩(还有一些混在邮件里懒得找了)。



下面从基础准备、算法、软技能、项目、个人建议以及资料汇总等方面进行详细叙述。

基础准备


这块本来想放面经的,但是我还是觉得放面经没啥意思,拿别人的经验死记硬背虽然可以获得Offer,但是知识并没有过脑子导致回头就忘,这种方法其实有些过于投机,也不希望大家这么干。其实一开始我的确找了很多面经,经过总结和归纳后得到了一个自己的题库,但是也发现这个题库不够完善,所以经过了海量面试后这个题库也得到了不断补充,最终以博客的形式记录了我近一年的Java学习经历。博客地址如下,欢迎交流技术。


还要声明一下,我这总结的内容,大部分来自GitHub上CS-Note和JavaGuide提炼精华以及无数CSDN博主的总结,向这些大佬们致敬。其他部分是我从一些相关书籍上整理得到。下面给出基础知识大致的分类:
- 数据结构
- 计算机网络
- 操作系统
- Java基础
- Java集合类
- JVM及其调优
- 多线程以及并发
- Java-I/O
- Spring及其Web开发
- 数据库
- 消息队列MQ
- Redis
- Nginx
- 其他中间件
- Linux操作系统及其常见指令

对知识分类总结并逐个击破是我学习的方法。在了解这些分类后,下面就是如何去填补这些知识空白。快速填补方法就是参考`GitHub`上`CS-Note`和`JavaGuide`的总结,建立基本的知识架构,随后通过看书加深并获取他们没有总结的东西。这里推荐一下我认为应该看的书,注意必须看不等于全书都要看,要挑重点章节有侧重点地反复看。以深入理解Java虚拟机为例,第一章看看就行,第二三七八章必须反复看,第四章偏实践建议多操作,第六章只需要仔细了解`Class`文件的基本结构即可,字节码指令可以简单涉猎或不看。第十二十三章做基本了解即可。下面给出一些书单供大家参考:
- Java多线程核心技术(技术类)
- Java并发编程的艺术(技术类)
- 深入理解Java虚拟机第二版(技术类)
- Redis设计与实现(技术类)
- RocketMQ技术内幕(技术类)
- Java核心技术卷1/2(技术类)
- 高性能MySQL(技术类)
- 数据结构严蔚敏版(基础类)
- 计算机网络、操作系统的王道408系列(基础类)
- `CyC2018`的`CS-Note`与 `JavaGuide`(GayHub上面试相关得总结)

其实,弄懂Java基础只需要了解一个看似很简单却又不简单的问题,你确定你真的能讲明白下面这段代码么?反正我到现在也没有自信能完全讲清楚这段代码执行的全部细节。等你把上面跟Java相关的知识点和书都看完了,再来自己捋一遍这段代码到底做了什么?
public class Main {

    public static final boolean FLAG = true;
    public static final byte BYTE = 123;
    public static final char X = 'X';
    public static final short SHORT = 12345;
    public static final int INT = 123456789;
    public static final long LONG = 12345678901L;
    public static final float PI = 3.14f;
    public static final double E = 2.71832;
    private int age;
    private String name;

    public Main() {}

    public Main(int age, String name) {
        this.age = age;
        this.name = name;
    }

    protected int add(int input) {
        int output = input+1;
        return output;
    }

    public static boolean compare(int a, int b) {
        return a > b;
    }

    public static void main(String[] args) throws RuntimeException {
        System.out.println("Hello World!");
    }

}

算法

算法注重积累,除非你天赋异禀,否则很难速成,尤其是跨专业的同学。我上大一才有自己的电脑,第一次C语言上机,肯定要`Hello World`嘛,结果在打印`double`的值时,我一直无法正确输出结果,后来班里有个搞ACM的大佬告诉我,我把`%lf`打成了`%1f`,不知道有没有跟我干过一样蠢事儿的人。我们学校ACM还是小有名气的,所以学院挺注重这方面培养的。我们很多人都选修过老刘的ACM入门课,所以对算法也算有点基本了解,不过上老刘的课更好听的集训队的故事。后来,有一些课程也引导学生去看算法导论这种充满力量的书,看了部分章节后实力稍微涨了一丢丢。自己平时也会刷刷题,LeetCode(300+题)和LineCode(100+题)都有账号,周末有周赛也会偶尔比划下,虽然都是签到水平。算法题平时基本靠LeetCode积累,面试前需要精读剑指Offer,而且要做到滚瓜烂熟,懂我意思吧。对于绝大多数面试中涉及的手撕代码,90%不会逃出剑指Offer+LeetCode热题精选。甚至,你可以通过面试官出的题反推其水平。 最近发现牛客上有算法视频课,左神大名也有所耳闻。看了下相关课程内容觉得比较适合正在求职的同学用它来构建解题思路以及查漏补缺(https://www.nowcoder.com/courses/cover/live/350?coupon=AmPd42S)当时买还是全价买的,现在好像可以优惠140元,有需要的同学可以试试,几百块换一个20w-40w的Offer,你懂得。

[Java算法系列](https://github.com/zx950519/zx950519.github.io/tree/master/_posts)
大致分类如下:
- 字符串
- 位运算
- 背包问题
- 树
- 贪心动归
- 链表
- 深广搜
- 数学
- 数组
- 二分

个人觉得,面试官在面试时偏向出数组、链表、数学、二分这类题目,因为输入简单,而且答案固定。反倒是动归,我基本没遇到过,撑死就是迭代题。下面给出一些其他人总结的高频题,其中部分是我自己额外加的,字丑见谅:





有部分大厂,喜欢对一个简单问题,展开夺命连环式追问,下面给出几个剑指Offer上的案例供大家分析:
- 面试题3:数组中重复出现的数字
- 面试题39:数组中出现次数超过一半的数字。这题是阿里碰到的,变型题有找两个数字,出现次数均超过1/3;找n个数字,出现次数均超过1/n+1
- 面试题53:在排序数组中查找数字,参考Java算法系列中的二分查找
- 面试题56:数组中数字出现的次数,参考Java算法系列中的位运算

希望大家做算法题还是要多动脑多思考,尽量少靠背诵!

这里在额外说一下笔试中的代码题,有很多公司出的题很难,甚至是ACM水平的题。如果做不出来,或者样例过的很少也不要怕,玄学等通知。我去年做完京东的笔试感觉没法和东哥做兄弟了,结果不还是跑了两趟上海拿下。一般笔试中的代码题可以跳出,一定要养成保留题目和代码的习惯,笔试后多反思复盘。


软技能

这里提一下这个点,很多时候沟通和交流能力也很重要。即使埋头苦干且业绩突出也不一定会得到领导的青睐,虽然我很不愿意承认这一点,但是社会就是这样。面试的时候不仅仅考察你的业务能力,也会对你的沟通交流能力进行考察。此外,像PPT这种技能也是必不可少的,毕竟是世界上最好的语言嘛。最后抗压能力是必不可少的,并不是每一个面试官都是正常人,就算觉得不爽也得忍着,遇到下面常见情况请不要发飙:
- hr阴阳怪气,好像你欠她钱一样
- 技术官无缘无故地朝你冷笑
- 技术官不开摄像头
- 技术官经常怼你,态度很差
- 技术官拿他们实际遇到的问题考你让你想解决方案

这里我就要提一个事儿,有家公司临时通知现场签约,不带三方不跟你谈部门分配、薪资以及福利待遇。我反正当场拍桌子就走了,也不想在学校惹事。总之在面试中做到一个词,不卑不亢!

项目

个人没啥拿得出手的项目,就做了一个秒杀。不过在这个秒杀的基础上,又看了不少分布式系统架构、中间件的书籍扩展知识面。然而,在面试中基本没有表现这些知识的机会。绝大多数时候面试官都比较愿意了解你秒杀的流程以及你的系统架构设计。还有一些时候会感受到面试官的恶意与鄙视。所以我建议大家不要再去弄什么秒杀啊、在线商城或者什么仿饿了么这些比较low的项目了,面试官估计也听腻了。硬要建议的话,找点高级网课,比如MIT的操作系统,跟着做一遍能让绝大多数面试官觉得你是真的nb以及谦虚好学;Java方向的可以去GitHub上找找一些人实现的Raft代码,把这个项目fork后全搞懂也挺好的。总之,一定不要再去做别人都做的东西,即使你能搞出点花花样,大概率你是展现不出来的。



建议

这块其实不多说学习相关的事儿,重点谈谈选择和心态。

知己知彼方能百战不竭

首先是知己,你要掌握自己的情况啊。基础会多少,算法刷了多少题,有啥项目,参加过啥比赛。对自己的强势点和弱势点要有清晰的认识。

其次是知彼。这里分为竞争对手和招聘方。举例来说,如果你是搞CV的,你应该先去了解都是哪种神仙再跟你对线,顶会,实习你都有么?招聘方会有多少hc,这其中又有多少hc是实习转正的?明知CV要白给,趁早转开发不香么?对于方向的选择,我个人感受是DL和ML神仙打架,NLP相对宽松点;后端需求最多,且竞争对手最多,上岸难度适中;前端和客户端比较好上岸;大数据不太了解。这里也不想争论前端和后端哪个更好,留给大家自行思考。推荐大家询问下不同层次的人,985,211,双非,统计大家的倾向、选择理由以及Offer情况,你会得出结论的。谈完了竞争对手,再来看看招聘方。有条件的同学可以通过熟人内部打听下Leader挑简历的几个指标。就我的感受来看,大厂越来越倾向名校、实习转正和有大厂经验的同学,为什么?首先是名校毕业的同学,这些大佬的学习能力毋庸置疑,这里不多解释了;其次,大厂招人自然希望招那种来了就干活的人,而不是培养你最后让你跑了,尽可能地压低成本以换取最大收益。对于实习转正的同学,在部门干了几个月,是骡子是马心里肯定有数;其他大厂的实习经验对面试官或bp简历的人来说,也相当于得到了一定认可。那么应对之道就有了,实习被。那肯定也有一些同学,没办法实习啊。破局之道就是搞基础,把目标适当降低,不要盯着头部那几块本不属于你的肥肉。这里不是让你彻底放弃,而是有计划地尝试,失败后要尽快释然,不要给自己太大负担。

行百里者半九十


大家要有个认识,大佬们往往在提前批一个人能拿10几个20几个Offer。但是他们只能挑一个,所以后期肯定会有hc空出来。我去年也是9月份才开始收到Offer,以一些中小厂起手,陆续拿了几个大的,甚至今年春招也还能拿一些好的Offer。不要因为7月8月的失利而丧气,坚持到最后你会得到满意的结果。不妨告诉大家,我所有大厂Offer都是10月份以后下来的,虽然感觉是捡了别人不要的剩菜,但是心态摆正以后就没事儿,反正公司都给你机会了,还要啥自行车。再送给大家一句名言:

我们遇到什么困难,都不要害怕,微笑着面对他,消除恐惧的最好方法就是面对它,坚持才是胜利!加油!奥利给!




不积跬步无以至千里

知识都是一点一滴积累起来的,Offer同样也是海投后一次一次跑面试换来的。

学无止境

摆正心态,把面试当成对自己知识体系的差缺补漏,这样路才能走的远。

本条没有谚语

面试是有技巧的,能否引导面试官进入你的节奏就看你的造化修为了。面试最好的状态是双方互有输出,面试不是问答,而是双方的一次技术交流,面试者在面试后无论结果如何都能有所收获才是双赢。然而,这种面试我并没在头部大厂见到,很遗憾。个人觉得整个秋招体验最好的是华为的面试,听说他们是通过考试选拔的面试官,看起来效果还不错。还有一些愿意主动发掘面试者亮点的面试官也很nice。

本条也没有谚语

脉脉是个好东西,虽然负面情绪很大,但是也能反映出一些社会现象。牛客里大部分都是学生,社会经验不足一定要吃亏,多一个了解信息的渠道不是坏事儿。

资料汇总

我自己有一个GitPage当博客(后续考虑迁移到牛客博客),自己也有GayHub仓库,地址如下:
- GitPage:https://zx950519.github.io
- GayHub:https://github.com/zx950519
- 牛客:https://blog.nowcoder.net/alitria

私货


送大家两段我最喜欢的话。

故天将降大任于是人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其所不能。

世有伯乐,然后有千里马。千里马常有,而伯乐不常有。



PS

如果大家觉得我上面总结的有啥遗漏,或你有啥想问的,欢迎评论区提出。我希望这个帖子能帮助更多跟我一样硬件条件有缺陷的同学,希望将来大家都能大厂做兄弟!!!

更多模拟面试

52条回帖

回帖
加载中...
话题 回帖

相关热帖

笔经面经近期热帖

近期精华帖

热门推荐