UNIX环境高级编程,unix环境高级编程( 二 )


这部分我是会不断把它完善的,当成自己的小电子书库,不多,但贵在精 。我整理的这些书大家可以在这里获取,对于学习计算机的同学学习以及校招复习帮助非常大,且十分系统:书单:计算机必看经典书单数据库:sql得会写吧,这个推荐看下《SQL必知必会》,几个范式有没有正式运用过? 如何进行领域建模、数据库设计,才能够使得每次查询的开销最小?数据库原理方面可以看看《数据库系统概念》,这本书挺厚的,包含了从 SQL 到数据库设计再到数据库原理、分布式数据库都有,可以挑着看,比如关系模型、数据库设计(三大范式)、数据磁盘存储和组织方式、索引、并发控制等 。
当然了整个数据库最重要的还是索引和并发控制(锁、MVCC等),这部分也是面试常考的:索引存储结构:B树、B 树索引、Hash索引索引的使用:主键索引、覆盖索引、最左前缀原则、索引下推等锁:乐观锁、悲观锁、表锁,行锁,意向锁,读锁,写锁等等MySQL InnoDB MVCC 实现机制存储引擎:InnoDB、MyISAM等,各自的优缺点事务:ACID理论这部分推荐两本书:《高性能MySQL》《MySQL技术内幕》网络编程,后台开发基本是离不开网络编程的,其实甚至整个后台开发也可以看做是在做网络编程 。
只不过别人的框架帮我们做了协议解析、网络数据传输、解封包这些底层操作 。比如 SpringBoot 这种保姆级框架,基本上属于将一个框架能干的事都干完了,以至于我们开发业务只需要定义接收和返回包的数据格式,然后做逻辑处理就完了 。像序列化、解封包、IO 处理这种网络编程必备的脏活业务开发根本不会接触到 。但是网络编程技能还是很重要的,特别是对于 Linux C开发来说 。
Linux 下网络编程核心的包括系统编程和网络 IO 两个部分:进程间通信方式: 信号量、管道、共享内存、socket 等多线程编程:互斥锁、条件变量、读写锁、线程池等五大 IO 模型:同步、异步、阻塞、非阻塞、信号驱动高性能 IO 两种模式:Reactor 和 Proactor( 但是 Linux 下由于缺少异步 IO 支持,基本没有 ProactorIO 复用机制:epoll、select、poll(破解 C10K 问题的利器)推荐几本书:《Linux高性能服务器编程》《Unix网络编程》《Unix环境高级编程》编程语言:虽然说语言不重要,但是总得擅长一门语言吧?C的话,那几本书(Effective三部曲,《Effective C》、《More Effective C》、《Effective STL》、STL 源码剖析、对象模型)都得过一遍吧? Java的话,JVM原理得看下吧?GC 得看下吧?JDK重要集合类库得看吧项目:说句实话,学校里接触的项目能有多高大上?如果只是用几个框架的那种,我建议不要写到简历上,不如去github上参与开源项目,GSOC了解一下?当然如果你的实验室很厉害,跟导师做的项目很牛逼另说 。
还有一条路就是上面的5,6,7,任何一个花上半年时间去实现一个简陋的原型(比如实现一个简单的内核),都是非常好的简历加分项 。事实上,国外名校这些课的最后的project都是让你实现一个原型 。英语: 这个面试一般不会涉及到(除非是英文面试),但是我仍然认为英语是很重要的能力 。具体的来说,就是“遇到一个撒比问题不去打扰同事自己谷歌或者bing从stackoverflow找到回答并且独立解决” 或者“老板让我去接触一个没搞过的东西我硬着头皮点开文档看了两天两页终于能解决问题” 的能力 。
信息采集能力:对于学校不太好(非C9)的同学,这个能力其实是最关键的 。最优秀的同龄人在学习些什么?我想去的公司想招聘什么样的人才?面试会问什么?春招秋招到底是什么,如何投递?实习真的很重要吗? 这些问题,你去百度,去知乎搜索,去牛客网搜索,其实都有回答 。为什么说这个能力重要?举个例子,BAT热门岗位留给秋招的坑寥寥无几,因为坑都被实习转正的同学占了,如果你之前不知道春招,没有去实习,能去BAT热门岗位的机会自然就很渺茫了 。

推荐阅读