我把 b 站拉黑了!
The following article is from 高性能服务器开发 Author 张小方
无意中在知乎看到这样一个提问:
感觉算法在程序员中快被吹上天了,如果只是搞编程的话,是不是没必要死磕算法?
看到不少人各种吹算法,什么刷leetcode啥的,之前刚入门编程之前我也以为算法有那么重要,我还担心我那点算法功底进公司抗不了几天就被劝退了,身边也见过不少刷题家,完全把自己刷魔怔了,只会刷题,连接个linux服务器问我说用windows远程连接能连接上吗?让他关闭个连接,不会关,之后半天连不上问我咋回事原来是把服务器关机了,业务代码几乎写不出来,天天死磕算法,我跟他们不一样入门了之后就感觉算法真心没多大用,没把算法看太重,自己经常开发实际项目,学的比较早,17岁开始学,大一就找到工作了,一边上学一边上班(远程开发)现在大二了,公司项目也不简单,公司后端项目核心代码都是我写的,目前也更坚定了自己心里的想法,真心没感觉算法有那么的重要(可能我水平太差,眼界太低,格局太低),大多数功能都是这种,这个评论回复功能怎么实现,点赞功能怎么实现,这个私信功能怎么实现,充值提现等等,遇到的好多业务功能几乎不需要啥算法,到现在为止我提升技术都不是去刷算法题来提升实力,我就刷了一道leetcode感觉很没意思就没刷了,目前我遇到的问题和已经解决的问题都跟算法不沾边,所以我个人觉得真心感觉没太大必要死磕算法,看到那些死磕算法,可能有的人为了面试,我不知道他们进公司里会怎么样?
看到这个问题,想想我曾经的经历,我真是百感交集啊,默默地流下了苦涩的泪水。
造化弄人,我大学被调剂到地理专业,对的就是那个文理分科中文科生学的地理,然而我高中学的是理科。然后在大学误打误撞当选为学院学生会副主席,后来又成了学院学生会第一任电子技术部部长之后,开始接触编程,靠着大一公共基础课那微薄的 C 语言知识,一路凭着兴趣自学,转行、求职、小厂,再到如今在大厂做研发。
毕业那会儿,由于非科班出身,过不了大厂简历筛选,然后只能退而其次进入一家小公司。但是,我一直想去梦想中的 BAT,或者像爱奇艺、b 站这样的二级互联网公司呀,尽管每次找工作都会去将这些大厂的职位投递一边,然后每一次都是铩羽而归,黯然落泪。
面试百度
我记得,我在第一份工作两年后,找了一个熟人帮我内推百度。
那个时候百度是我特别向往的公司,简直是我梦中女神一样的存在,收到百度的面试邀请,我自然非常珍惜这来之不易的机会,也很感激帮我内推的那位朋友。那个年头找人大厂内推,可不像现在这样方便。因此我在面试前几天刻意看了算法和数据结构的知识。
面试当天,我早早地坐地铁到张江高科地铁站,然后骑了四十多分钟来到纳贤路 701 号,带着忐忑不安的心情参加了面试,一面的面试官是个和我年纪相仿的小伙子,他出了一个场景题让我写一个算法,然而我并没有想出算法该怎么写,后来面试官就把算法说出来了,然后让我写,我花了四十多分钟,写的仍然不完整,然后面试官还是让我过了。
接着,二面来了,二面是一个带着眼镜,个子挺高白白净净的小哥。一上来也是开始聊算法,先问我计算 hash 值的几种方式,我搜索脑袋,算是勉强答出来了,接着问我如果 hash 某个 key 如果冲突了,怎么办,我当时其实不太明白他想问什么,在后来的沟通中,原来他是想问 hash 冲突之后,可以以链表的形式将冲突的元素挂在后面。再后来聊到 malloc 的效率,然后引出 ptmalloc、tcmalloc 的内存结构,我已经完全懵逼了。
最后,我非常尴尬,但是二面的面试官还是和我说,虽然你的算法没答好,但是其他方面还是不错,我上去和领导沟通一下,看看能不能进入三面,我等了一会儿,他下来告诉我,说领导不同意,于是他礼貌性地把我送到楼下。
面试喜马拉雅听书
面试喜马拉雅的时候,面试官全场就和我聊 Redis 的数据结构,当问我 Redis 大的数据结构如何 rehash 的时候,我其实已经快崩溃了。面试结果让我又羞又愧。
面试爱奇艺
既然进不了百度,那就尝试退而求其次进爱奇艺吧。
爱奇艺的面试官一开始和我聊红黑树,他问我什么是红黑树,我当时只是记忆了红黑树的平均算法复杂度,当他问我,插入一个元素最坏的情况下的算法复杂度是多少,我说是 log(n),面试官那种鄙视的神情和质疑的语气,让我想找个地洞钻下去。
在面了几个大厂没通过之后,我又找了一个小厂继续工作。
后来我也认清了形势,分析了一下基本事实:我,由于是非科班出身,没有受到过系统的算法与数据结构的教育与训练,加上我对算法和数据结构知识一直心存恐惧,所以我对于这些东西都是尽量逃避,这样面试大厂的时候,遇到算法和数据结构的题目时,由于实力的不足,进而加深恐惧和抵触,所以面试总是通不过。
但是在小厂干活,由于面试要求不高,你的收入一般也不会很高,而且在小厂总会遇到这样那样的糟心事,你的心情和收入完全看老板的良心。可能是我的运气总是比较差,总是遇到各种奇葩的老板,什么工作三个月后,以试用期未过辞退员工的呀,拖欠工资不发呀,年终奖不兑现呀,加班没有加班费迟到扣钱呀。
后来痛定思痛,再次找工作的时候,我就硬着头皮去认认真真地看算法和数据结构的书。这个阶段强迫自己不要抵触算法和数据结构,于是再次去面试了一些大厂。
面试腾讯
那天,去漕河泾的腾云大厦的路上,天突然下起了雨,在雨中狂奔了几公里,来到前台,然后在会议室等待了几分钟开始了面试。由于已经准备了一些算法和数据结构的内容,所以刚开始的时候还是可以和面试官过几招的,之后遇到场景题还是挂了,其实现在想想,所谓场景题无非就是从几亿个数中找出最大的几个,这是 topN 问题呀。
回家的路上,雨下的更大了,心情更沉重了。
面试京东
后来,我投递了京东,在某天上午,请了一天的假,坐了一个多小时的车到了北新泾京东的办公区,上午一面还是挺轻松的,面试官问了一些基础问题之后,让我写出从 1 加到 100 的汇编代码,我很流利地给写出来了,然后面试官很满意,其实快到饭点了,然后让我先去吃个饭,我去楼下街边快餐店吃了个饭,然后等了两个多小时,终于到下午的二面了,然而二面写一个算法题,又没写出来,然后就让我回去了,我又挂了......
一个月之后,我又投递京东的另外一个岗位,一面很快就通过了,当二面面试官出场的时候,我差点哭了,是一个月前面试的二面面试官,我不确定他是否记得我,但是我记得他,然后他在那里和我侃侃而谈,大概聊了两个多小时,然后让我回去等通知,之后我也没等来通知......
于是,我回去一边工作,一边把算法和数据结构又刷了一遍。
后来,我去面试声网,当然我当时并不想去声网,纯粹去走个形式,然而虽然声网有一些算法题,然而我却过了,对面给的薪资是 26k,我那个时候当前薪资才 16k 呀,后来禁不住诱惑还是去了。
在去声网之前,我又跑去面试爱奇艺,虽然爱奇艺伤过我,但是我还是喜欢它,然后又莫名其妙地挂了。
面试 b 站
从工作到现在,我一共面试过三次 b 站。
第一次,是在一个周五的晚上九点多钟,去的是浦东大道那边,然后我一个技术面试安排的是一个产品经理面试我,还问我当前的薪资,末了,我想问他一些问题的时候,他告诉我他不是我面试的部门的,所以不熟悉情况,我感觉有种被戏弄的感觉。面试结果嘛,肯定就不了了之了。
第二次,我去的杨浦五角场附近,我路途上坐车加上步行,花了近两个小时,终于到了他们的工区。面的过程中,面试官突然说有一个线上的故障要解决,让我等一下,我一直从下午三点等到晚上六点,等我实在等不了的时候,给 HR 打了个电话,HR 问了面试官,结果说把面试这个事情忘记了,然后说改日再安排,之后再也没安排。
第三次,是前不久的事情,一面算是过了,二面面试官上来看我写了本书,就问我书卖了多少本呀,赚了多少钱呀,然后简单地问了一些问题就结束了,然后过了两天 HR 告诉我我不符合他们的要求,也就没下文了。
我其实一直挺想去 b 站工作的,但是感觉命中与 b 站无缘,三次面试体验都不好,而且都很奇怪。
在第二份工作以后,我开始彻底、深刻地反思,并有意识地去系统地梳理和弥补数据结构这块的知识。
之后,我遇到算法题再也不怕了,即使遇到不会的算法题也能坦然地分析问题、解决问题。如今我作为大厂技术面试官,也可以坦然地和面试者聊算法、聊场景题。
那么算法和数据结构到底该怎么学呢?
相比较五六年前,网上这类书籍以及刷题网站和资料还没有像现在一样到处都是。
首先,无论是科班还是非科班,如果你在算法和数据结构方面学的并不好,一定要尽早去补好。这种补,不是说面试前去突击,而是在平常的工作学习中有意识的去补,将这块知识学的系统化、条理化。
受过系统算法和数据结构教育和训练的同学与欠缺这块知识的同学相比,最大的差异就是思维方式。未学好的同学,也知道这块知识的重要性,但是他们的知识体系中这块知识都是一个个孤立的点,例如红黑树就是红黑树,与链表没关系。
但是如果系统地去学习,不应该这么学的,首先要去掌握算法的一些常见思想和计算逻辑,从最基本的如何计算时间空间复杂度,到递归法、分治法、贪心法这些基本的算法思想,再到排序与查找引出的各种数据结构,这是一套成体系的东西。
例如,由于我早些年没有这些体系的知识,这样在面试中,遇到一些不会的算法,我甚至连穷举法、递归法这样万能的解决问题的方式都想不到,因此很多算法题也都交了白卷。
凡有所学,皆成性格。学算法更重要的是培养算法思维。
人年纪越大,惧怕的东西越多,逆恐惧而上,大多数人都做不到。譬如大多数人的数学水平的巅峰是高考时。
从最初恐惧算法到如今面试时侃侃而谈算法,这是自我克服的提升,我希望读者也能迎难而上,毕竟那些让我们恐惧的东西,总有一天会成为挡在我们面前的大山。你说是吧?
相关算法书籍
01
《代码随想录——跟着Carl学算法》
孙秀洋 著
解析100+力扣原题,从容应对名企面试
分析多个算法应用场景,快速构建算法知识体系
上架首日即卖爆!
基于C++编写
本书首先讲解程序员面试时需要了解的制作简历的技巧和IT名企的面试流程,以及面试时经常忽略的代码规范性问题。然后详细分析程序的时间复杂度和空间复杂度,包括如何把控程序的实际运行时间,以及编程语言的内存管理。接着讲解数组、链表、哈希表、字符串、栈与队列、二叉树、回溯算法、贪心算法、动态规划的理论基础及其相关题目。
(京东满100减50,快快扫码抢购吧!)
02
《labuladong的算法小抄》
付东来(@labuladong) 著
GitHub 68.8k Star的硬核算法教程
抛开各语言独有的语法特性,不论是学过Java、C/C++,还是Python,阅读此书都没有障碍!
荣获CSDN“程序员IT好书评选”奖
用喜闻乐见的语言讲述算法,书中配有几百幅有趣的算法图示,并送上部分动画演示
简单地会解某一道算法题并不意味着什么,因为很少有人能刷完力扣的上千道题;“小抄”是指不那么正式的笔记,算法小抄把算法题分门别类汇总,提炼出各类题的解题框架,从而以不变应万变。
(京东满100减50,快快扫码抢购吧!)
03
《漫画算法2:小灰的算法进阶》
魏梦舒(@程序员小灰) 著
全网阅读量近2000万的漫画算法故事
爆款漫画算法书进阶版
和快乐的小仓鼠一起搞定数据结构和算法,从容面试
《漫画算法:小灰的算法之旅》续作,新增红黑树、图、KPM、希尔排序等高阶数据结构与算法,并有更多面试实战题。
书中小灰的算法故事给算法这颗“炮弹”包上了“糖衣”,让算法的威力潜藏于内,外表不再吓人,萌萌哒Q弹可爱。
和一群快乐的小仓鼠共同领悟算法思想、理解算法对内存空间和性能的影响,并开动脑筋去寻求解决问题的高效方案。
(京东满100减50,快快扫码抢购吧!)
04
《剑指Offer(专项突破版)》
何海涛 著
百万程序员圆梦面试皇冠书再续新篇
作者世界名企面霸+金牌面试官
新题新考点可与第2版搭配学习
聚焦数据结构与算法的首创面经
代码基于Java语言
本书全面、系统地总结了在准备程序员面试过程中必备的数据结构与算法。
本书首先详细讨论整数、数组、链表、字符串、哈希表、栈、队列、二叉树、堆和前缀树等常用的数据结构,然后深入讨论二分查找、排序、回溯法、动态规划和图搜索等算法。除了介绍相应的基础知识,每章还通过大量的高频面试题系统地总结了各种数据结构与算法的应用场景及解题技巧。
本书适合所有正在准备面试的程序员阅读。无论是计算机相关专业的应届毕业生还是初入职场的程序员,本书总结的数据结构和算法的基础知识及解题经验都不仅可以帮助他们提高准备面试的效率,还可以增加他们通过面试的成功率。
(京东满100减50,快快扫码抢购吧!)
更多算法图书可见书单 | 所有面试必备的经典畅销算法书都在这里了!
作者著作
▊《C++服务器开发精髓》
张远龙 著
从操作系统原理角度讲解C++服务器开发技术栈
内容详尽细致、版本新
重磅级C++服务器开发红宝书
本书详细讲解如何掌握C++服务器开发技术,以及如何成为合格的C++开发者,秉承的思想是,通过掌握技术原理,可以轻松制造“轮子”,灵活设计出优雅、鲁棒的服务,并快速学习新技术。
无论是对于C/C++开发者、计算机专业的学生,还是对于想了解操作系统原理的读者,本书都极具参考价值。
(扫码了解本书详情)