本文为沈剑关于算法训练营的分享。
1. 聪明
- 智商我们无法改变,从出生那天就决定了,但能通过努力逼近智商上限。
- 勤奋练习更重要,通过练习让自己变得熟练。
- 给自己定个小目标:比最晚下班的同学再晚一小时。关于这点我的理解为:下班不是工作的终点,而是学习的起点。下班不意味着享乐的开始,而是将自己从白天被公司支配的工作中解脱出来,让时间回归自己,开始思考和精进。
- 程序员那么忙,哪有时间写文章?就问一个题?大家晚上在干嘛?就算晚上11点下班,也还有两个小时。
2. 业务过硬
- 做什么业务?业务是进入一家公司的薪酬起点。
- 业务过硬,要靠时间积累(经验很有用),不在一个业务里面浸淫几年,是不会遇到所有问题,踩到所有坑的。
3. 基本功扎实
- 通用素质:沟通能力和管理能力,带团队,带项目。沟通能力:即把别人不懂的事情给说明白。
- 底层操作系统的建设:数据结构和算法,设计模式。
4. 数据结构与算法与工程实践的关联
a). memcache/redis/leveldb,这些数据库哪个好?
没有最好,而是要找到每个工具的使用场景,它们一定是各有利弊的,否则只会存在一种了。在某个场景下,redis很好,为什么?底层原理,越偏底层,越与数据结构相关。面试官不会因为不会使用工具而挂人。
b). 快排:一个partition,两个递归。几行代码,很简单。为什么时间复杂度是O(NlogK),需要数学推导。此外,八大排序算法一定要会,分分钟手撕代码。
c). 数据库底层索引是B+树,为什么?B树改进了二叉树的什么?B+树又改进了B树的什么?
d). 开源的es搞不定,需要自己实现搜索引擎。50亿的帖子,2万的并发,全量数据的检索能够在10ms内返回,怎么做到的?说到底,底层还是和数据结构算法相关的。
e). 关于技术决策,技术选型。大家都是同一个技术栈,为什么别人做出来的东西性能就是比自己好?还是涉及到底层。
f). 上层工具,会用工具,不能成为核心竞争力。至少要到第二层:为什么要用这个?第三层:它是怎么做的。关于底层的细节,需要看源码,看英文文档,英文能力很重要。
5. case:
- memcache三层认知
- TopK
- 复杂度分析
- 数据库索引结构
- 搜索内核