2016年11月27日 13:14:02 阅读数:2958更多
个人分类: 后端
这里有一篇关于后端技术需要学什么东西的讨论。有机会大家去看看吧
https://www.zhihu.com/question/26350691
============================以下正文===================================
很荣幸的今年通过了阿里巴巴的实习生招聘!
我把我看过的书罗列一下吧!
最近正在看《算法导论》,和《算法》,md,其实我也想成为算法狗
当然,上面这些书我表示只懂50%,惭愧。不能完全吸收大牛的精髓啊!
java:基础非常重要,当然也要深入理解原理,什么JVM,JMM,Classloader,还有一些常见类的源码,自己可以试着分析一遍,现在让你说出LinkedList的内部实现你能不能说出来,HashMap不用多说了,80%的面试都会问到。还有重要的,多线程,并发,网络,IO。这些都是要看看看看的!自己多思考!还有楼主说的那些框架,说实话,你要是基础好了,这些都是能够学得很快的,很多问题,看一下源码什么都就懂了!特别是spring的源码要好好看看,里面的架构设计得非常好!各种设计模式满天飞!
另外,linux要了解一下,至少要回基本命令吧,脚本语言可以学习一个。比如py!前端要了解一下.
关于如何看书:两个字,思考!三个字,不要脸的思考!…………,书不在多,在于精,选书要慎重!反正题主一本叫做“王者归来”的书,我看见名字我就不想看!
除了这些然后呢:每天刷几遍CSDN,平常可以上上oj刷刷题目,国内的牛客网(牛客网-专业IT笔试面试备考平台,最全求职题库,全面提升IT编程能力)非常不错,也可以去leetcode上面把题目刷一遍哦。关注一些好的社区(我一般混迹在CSDN高性能javaweb板块),睡觉之前看微信公众号,当然是技术方面的!推送的文章都挺不错的!
做程序员个人觉得眼界很重要,就算这不是你的领域,但是你也要知道一点,所以经常关注其他的新技术是非常重要的!平常多接触一点开源技术,多上上github,争取能在github上面贡献一点自己的东西!
然后,多看看别人的技术博客。思考自己!
这是我学习路程的经验和一些资料总结,大家可以看看,链接——>技术文字 | 「浮生若梦」可以再评论箱中评论,我会一一回复(下面贴一部分)
我的经验与分享
关于我的学习方法和面试经验的分享
下面是我写给我现在带的学弟在学习路线上的一些建议,大家可以参考一下!希望能够帮助到大家,有写得不太合适的地方,还请大家指正!
一、基础
二、提高
三、深入
那么除了看书籍之外还有哪些学习方式呢?下面说说其他的学习方式
---更新在此----
距离发表这个答案到现在, 已经快一个月了.
目前我也只拿到了一家公司的offer, 而且居然是依赖我在学校的online judge网站刷的算法题积累拿到的offer, 想想就觉得这个剧情不可思议, 自己也绝对无法预料到.
实际上写这篇东西的起因是在微众银行二面后等短信等得很焦虑, 于是就决定将当时积累的几乎所有的经验都写下来. 写完之后就收到了hr面的邀约短信了, 当时开心地直接出宿舍跑了四公里的路, 就像幸福来敲门描述的那种感觉, 然后hr面挂了.
论自己的自信在找工作的过程中如何被消磨殆尽.
看着身边很多在实习期间就拿到offer然后转正的同学, 真是羡慕不已.
这几个月以来, 不断地学习, 不断地投简历, 不断地总结, 尤其是在自己身上找各种问题. 这样子的循环下来, 我变得越来越不自信, 跟面试官们说话都唯唯诺诺的. 找工作本来不应该这么卑微, 但越来越怕那机会从自己手中溜走. 不被面试官认可, 除了从自己身上找问题以外, 还能怎么办呢?
这一个补刀只是想提醒身边一样在路上的同仁: 一定要一直保持自信.
想得不可得, 你奈人生何. 愿好运降临给每一个一直努力的人.
--------------------
能收到这么多赞感觉挺意外的, 粉丝数也从2个涨到了一百来个, 后面干脆匿名了, 因为我确确实实不是什么大神, 只能说是一个普通的还在拼命积累实战经验的程序员吧..
发此帖的意图之一, 是觉得自己在学习过程中踩了很多本不该走的坑. 尽管百度谷歌是好东西, 但有时也会把自己坑到说不出话来.
总之真诚地感谢各位知友的反馈和建议, 此帖会定期更新, 我也会继续努力达到自己想要的目标
---------------------
针对评论区里关于列书单的讨论, 我还是阐述一下我的观点吧....
这些书有些本身是需要反复看的, 有些是属于工具书(用的时候再去查)....如果我能够完全读完并完全理解的话就真的是超级大脑了...我认为这些书对我有一定的帮助, 质量也不错, 所以就推荐阅读了, 也顺带说明了一些读书的方法之类的, 算是一种分享吧...学校的那些计算机教材也未必把所有章节都要求是考点, 不是吗?就算忘记了, 或者理解错了, 起码有个印象, 知道问题出在哪里了就去查哪本书, 而不总是把平常遇到的异常信息复制粘贴在百度谷歌上搜索, 也是种能力, 不是吗?谁百分百能保证百度谷歌搜索到的解决方案是正确的?
此外, 一个人阅读的过程难免会产生理解上的误差, 因此我在知乎上才会去关注大v的回答, 看看人家是怎么理解的, 再看看自己是怎么理解的..
读书对我来说是一种适合我的学习方式, 身边也有人喜欢泡在牛客网刷题来学习的, 选择适合自己的就好
(今天想了想, 觉得有必要把markdown也添加到基础上去...做读书笔记的时候确实很常用啊!!!)
近几个月以来都是在找工作,真心觉得这个过程对我来说很不容易,踩了不少坑,感受也很多。上半年也来过这个帖子看过,从 @谢照东 的答案受益很多,现在是时候写一些干货之类的东西,内容无非是一些书籍、网站、经验的推荐,算是一种回馈方式吧。
其实我自己水平并不高,可能书看得太多而项目做得相对较少的缘故吧....关于这方面自己也在努力和反思当中。
如果觉得有什么做得不当的地方务必指出来(比如说引用图片方面的...话说知乎编辑器不能调字体大小吗- -),谢谢大家。
(发现不少bug- -罪过罪过,赶紧救急修改中)
以下是原文。
2017年秋招Java后台的学习与面试经验
在经历了这么多场面试后, 我觉得有以下经验是可以分享的:
(我一个0 offer的人扯这些鸭汤其实感觉蛮脸红的....) 下面列举一些我觉得对我来说非常有用的书单和网站, 还有推荐使用的工具, 仅供参考, 希望能帮助到跟我一样找工作的兄弟姐妹们, 还有尚未定位自己的师弟师妹. 以下所有书籍(网站)建议阅读, 不一定要读完, 但关键和核心得抓住
一、计算机基础
《深入理解计算机系统》
著名的CSAPP, 这本书没有作为教材让我觉得很惊讶, 从c语言到汇编语言到硬件再到操作系统, 写得非常好. 虽然是本非常厚的砖头书, 而且看英文的效果比看中文更好, 但是是一本能帮助深入理解计算机系统的书. 基本上把这本书吃透面试操作系统的大部分问题都不是问题
《具体数学》
读这本书的前提是大一的微积分, 高能预警. 其实对面试什么的并没有特别大的帮助, 但是如果想挑战思维的话可以看看, 因为很多解决问题的技巧确实蛮惊艳我的. 实际上我自己也没有看完, 但是会争取看下去
《算法导论(第三版)》
被很多acmer coder奉为学算法的经典之作, 尽管不太适合初学者, 因为它这本书很多内容只提供了伪代码, 而没有具体实现. 但是我建议还是从这本书学数据结构和算法最好, 因为日后的编程语言对实现而言实际上并没有特别大的障碍, 只是适合与不适合的选择罢了, 而把想法转换成编程语言才是对算法知识的考验. 如果不想太过深入的话可以忽略掉 第四部分(高级设计和分析技术) 第五部分(高级数据结构) 和 第七部分(算法问题选编), 你会发现书其实比你想象中薄很多噢!
acm-cheet-sheet
如果你觉得看伪代码转换成编程语言这样的学习方式很吃力, 没关系, 这个pdf链接完全可以满足你的需求, 里面把很多常用的算法实现了(c/c++语言), 坚持临摹(注意不是死记硬背, 是临摹!)绝对能应对大多数公司的笔试编程题, 附上pdf下载链接
《剑指offer》
你未来面试的很多手写代码题 源题库, 你还不看?
《STL源码剖析》
如果你是经常用c++刷算法题的同学, 那么一定经常用STL的各种集合, vector, set, stack, queue等等..它们的实现原理, 在源码面前, 了无秘密
《Linux命令行与shell脚本编程大全》
亚马逊书店五星推荐噢! 里面大概讲述了很多linux系统的使用和命令行等. linux是Java后台开发人员必知必会的操作系统, 而命令行是使用linux系统必须要面对的 对于不想装linux系统的同学其实可以考虑使用腾讯云学习一些linux相关的命令行知识(没错, 不需要图形界面), 学生价一个月才一块钱, 跟月饼厂一个月十块钱比起来也太划算了吧! 而且用linux也蛮酷的啊(.....)再推荐一个神器: GitHub - robbyrussell/oh-my-zsh 具体的好处可以看这则知乎: mac 装了 oh my zsh 后比用 bash 具体好在哪儿? - 软件@defcon 的解答.
另外关于linux命令行的详细使用, 有一个网站也特别好用: Linux命令大全(手册)_Linux常用命令行实例详解_Linux命令学习手册. 将相关命令的功能, 配置项和使用案例讲得非常详尽.
VIM
vim编辑器相对其他编辑器来说确实难用了一些, 入门的学习成本也很高, 不过在linux系统中使用vim可以说是必须掌握的技能. 记得我大一的时候程序设计课的TA就开始安利我们使用vim了, 不过当时真的是太愚钝, 根本就学不会(说得好像现在就学会了一样...)
网上关于vim的教程很多, 不过有的感觉太专业(比如自定义功能之类的), 我个人认为只要你安装了vim后, 命令行输入vimtutor, 把那个教程过一遍基本就可以了....入门的难点主要是理解vim的三种模式: 编辑/命令/视图...理解了这个后就顺风顺水了
至于自定义功能的话, 交给网上的其他大牛来完成吧233333, 这里强烈推荐 GitHub - spf13/spf13-vim: The ultimate vim distribution . 效果如下, 比以往的效果好了太多:
《计算机网络: 自顶向下方法》
软件学院的计算机网络教材, 里面将计算机网络从顶层到底层逐章分析了一遍, 非常适合初学者阅读, 不过最好能够结合一些实验来辅助理解, 因为里面的讲解确实蛮抽象的
《图解HTTP》
日本人著的介绍HTTP协议的书, 对理解HTTP协议的一些细节有非常大的帮助, 插画也很多(日本人的行文风格, 感觉就像看漫画一样), 很容易就理解了
《TCP/IP详解卷一》
觉得上面两本讲解网络的还不够深入?我很钦佩这本书的作者, 能把枯燥的知识讲得那么那么那么细致, 非常强烈推荐这一本, 看完相应章节后大概能够明白为什么TCP/IP要这么设计了. 面试的时候经常问到三次握手和四次挥手, 还有各种状态的转移, TIME_WAIT的时间为什么是2*MSL...
《UNIX网络编程卷一: 套接字联网API(第三版)》
中文版快800页, 不过我只看了一些章节, 这本书也是把TCP/IP的细节讲得很深很深, 此外还有非常重要的基本套接字编程, 就是写网络程序的时候那些bind, accept, listen, send, receive函数之类的, 内容非常多, 但是这些是理解多路复用模型所需要掌握的...select/poll/epoll这些系统调用解决了什么问题? 事件机制能不能理解? 就看这本书的前六章了
《数据库管理系统(原理与设计)》
这个也是web开发中离不开的东西, 必须划重点学会的是ER图/SQL语句/存储数据(磁盘|文件|RAID|缓冲池等)/三大范式/索引以及相应的数据结构/事务相关的所有概念, 尤其重点学习SQL, 附上学习链接 .之后学会使用mysql workbench来进行数据库建模/逆向工程生成建表语句/根据SQL生成JAVA实体类等就不赘述了, 开发过程中百度谷歌一下就知道啦, 然后如果习惯在windows下开发的同学推荐利用navicat这个好东西, 当然如果说想训练自己写sql语句的能力那纯粹用命令行也无所谓...
html/css/javascript
这个是做web开发基础中的基础, 个人感觉学习难度不大, 但是建议一口气学完并尝试利用它们做一个简单的个人简历, 否则学习曲线会比较断断续续, 不够一气呵成, 具体教程可以参考 html/cssjavascript入门javascript进阶Javascript深入浅出
jQuery/Bootstrap/AngularJs
关于javascript, 其实纯粹使用原生javascript开发网站的话很麻烦, 所以就萌生出了这么一些框架: jQuery解决了浏览器兼容性的问题(虽然据说要过时了), Bootstrap可以很无脑地开发出看起来蛮好看的网页(其实还有很重要方面是响应式前端); 而AngularJS主要是有一个很重要的思想:MVVM, 随后崛起的vue.js也如出一辙而上手更快...对于Java Web开发程序员而言建议刚开始有选择性地进行学习, 可能真正涉猎深了就可以随意转换了. ps: 我的前端基本都是在慕课网学成的, 我觉得这个网站真的业界良心. 去官网搜索吧!
JS的原型链与闭包
可能利用上面框架开发的时候会遇到一些很棘手的问题不知道如何解决或理解, 那么建议先看看王福朋的博客: 《深入理解javascript原型和闭包系列》, 我觉得看完理解了以后定位js的bug应该会更容易一些
SublimeText
一个对于前端开发工程师来说非常强大的编辑器, 可以提供各种各样的自动补全(必会emmet插件语法), 附上教程 快乐的sublime编辑器 和 前端开发工具技巧介绍—Sublime篇. 自从用了SublimeText, 我再也不畏惧前端编程了...如果觉得教程看得不过瘾, 知乎上这几个帖子可以让你领略SublimeText的奇淫技巧
WebStorm
Jetbrain旗下的前端IDE, 我觉得相比SublimeText它更好的一点就是不需要你自己去装插件就已经有了很多方便的功能, 上手比SublimeText快
VSCODE
微软开源的编辑器, 知乎上也有比较详细的讨论. 个人认为好看/高雅/好用, 如果习惯SublimeText入手vscode并不难, 反正我现在已经转战VSCODE了, 就因为它可以设置背景为萌萝莉喔, 是不是蛮可爱的, 感觉打代码更有精神了
Github
将github列为基础可以足以说明它的重要性, 其实主要是理解版本控制与分支协作的概念, 不过使用这个网站之前得先学git, 廖雪峰的博客就介绍得非常到位. 建议刚入门github的时候可以将github当成成云仓库(你甚至可以把东京热的种子放在github里哈哈哈), 熟悉一些基本命令. 到后面团队作业的时候强制使用github进行协同合作, 会渐渐发现和理解github的好处的. 除此之外github还是一个搜索开源优质项目的好网站(下图源于怎样使用 GitHub? - GitHub@珊姗是个小太阳 的答案)
Markdown
markdown也是很相见恨晚的东西, 我觉得markdown类似于html, 但是比html更简单简洁, 对于喜欢做网上笔记或者个人博客的同学而言是值得推荐的工具. 半小时应该就能上手了, 教程在此Markdown——入门指南...附上vscode的markdown笔记截图(分栏看预览效果, 感觉高大上了呢), 你会爱上markdown的(虽然我个人笔记整理得很乱- - 等我闲下来再好好整理)
此外我觉得markdown也不止是用来写笔记的...github上的那些README.md也都是markdown呀....就是做项目的时候大家应该会有一些百度谷歌到一些有用的东西, 但是总是用收藏夹又不是很好处理, 这个时候markdown就起作用啦..就像下图这样..把做项目或者小demo时有用的链接放在github的README.md上, 之后再看自己做过的项目时觉得有难题的时候就直接点链接就好啦
二、Java
《疯狂Java讲义》
个人认为Java入门最好的书籍, 虽然真的很厚, 不过里面重复的话会写很多遍(每天坚持看一点, 一次性读完, 印象也会很深刻的)...对于这本书而言, 除了图形界面编程以外, 其他内容最好认真读完并实践一遍, 会对理解Java Web有不少的帮助
《Effective Java》
建议有一定项目经验的人才去看这本书, 里面列举了很多开发必须注意的条目. 说实话这本书真的不那么好看, 但是你会发现在某些笔试题上会出现这本书的很多条目
Intellij IDEA
学习Java怎么能不知道有这么个牛逼轰轰的IDE! 可以说彻底提升了我的开发效率, 简直相见恨晚, 在所有教程中我觉得极客学院做得最为认真, 附上极客学院的学习地址
Maven
为什么我把Maven放在这里? 因为它蛮重要的(其实用gradle也可以). 一个解决java web项目开发中所需要的依赖问题, 同样论工具的使用教程, 极客学院最给力, 附上教程地址
《轻量级Java EE企业应用实战》
(阅读此书时建议把基础部分的全部搞定,)这本书跟《疯狂Java讲义》是配套的, 里面先讲解Servlet/Jsp(Java Server Page)等技术, 然后就是SSH(Struts/Spring/Hibernate)等后台框架的各种使用, 其实说白了就是把这些技术的官方文档给翻译一遍给你而已. 有人觉得struts2都过时了还有没有学习的必要? 我认为理解一下也不会花太长时间, 因为学习任何框架的重点也不仅仅是用而已. 初学者把重点放在一些思想上的东西(尽管很虚, 但是后续的框架基本都会延续这些思想), 比如控制翻转IoC|面向切面编程AOP|对象关系映射ORM|模型-视图-控制器MVC等, 把这些弄懂后之后的SpringMVC, mybatis等后台框架上手会很快的. 这些东西真的太太太太太太基础了, 搞不懂就要考虑转行了(= . =) 另外看这本书入门Java web的时候不要对作者那种用记事本编程的方式太较真, 会debug到天昏地暗的, 使用Intellij Idea就好了(如果不懂使用Intellij Idea可以先去慕课网或极客学院或csdn等网站看看别人是怎么操作的即可). 还有想说的就是, 请务必学会使用maven, 手工导jar包学习Java Web的方式简直就是弱智行为, 而我居然坚持了三个月..最后, 把这本书当成工具书比较合适: 初次阅读理解就好没必要动手实践, 等到需要的时候再翻阅查询
《Spring Boot实战》
还在用xml配置各种依赖注入/数据源/事务管理器? out啦! 随着微应用的流行, 以注解替代xml配置的开发方式将越来越流行. 作者汪云飞没有讲太多废话, 内容基本都是说Spring Boot的某个特性然后举个例子实战, 有利用SSH开发过简单项目的同学可以尝尝先(我去实习的岗位早就开始用了, 觉得蛮新颖的) 实际上学习任何一个框架的时候要先了解这个框架解决了什么问题, 只有理解了这个后才能更有针对性也更有效率地去进行学习
《Head First 设计模式》
隆重推荐这本神书, 很有趣. 刚开始读觉得很深, 但是和《轻量级Java EE企业应用实战》一起看, 思考那些设计模式存在的意义, 会对软件架构方面的知识豁然开朗...
《两周自制脚本语言》
一本用Java教你开发脚本语言的教材, 实际上可以把它当做编译原理的正课来学习. 我之前以为编译原理不重要, 没有认真学, 结果阿里面试官问了我Json字符串如何转换成一个对象我就懵逼了. : 你知道编译原理的重要性了吗? 一个问题答不好可能就断送了你的求职生涯啊! https://www.infoq.com/articles/HIgh-Performance-Parsers-in-Java-V2 这个链接提供了一种巧妙的解决方案, 值得阅读.
不止是简单的词法分析和语法分析, 重排序等编译器的性能优化方式也最好能理解一番.
《Java并发编程实践》
又是个歪果仁写的书, 里面详细介绍了Java并发工具包java.util.concurrent的各种工具以及很多的并发编程实践之道, 是并发编程的入门之作.
《Java并发编程的艺术》
国人写的书, 也是写Java并发编程的, 与上一本相比个人认为比较凝练/干净/易懂
三、Java进阶
《架构探险: 从零开始写Java Web框架》
作者叫黄勇, 一本非常让我拍手叫绝的书....首推! 绝对干货! 如果你不想看spring源码也没有太大关系, 这本书带你一步步地开发出一个类似spring mvc的简单框架, 并且逐步地增加需求和完善, 理解了每个细节对于理解Java Web的开发是很有帮助的
《深入分析Java Web技术内幕》
这本书我觉得是必看的, 可以说是对我帮助最大的一本技术书籍, 覆盖了Java Web很多方面的知识, 比如计算机网络|Tomcat结构|Spring架构|SpringMVC原理|模板引擎实现原理等, 绝对很有收货, 足够有深度也很有难度
《Spring源码深度剖析》
一本比较详细的书, 其实对于阅读源代码, 跟着作者的思路读, 再结合自己的断点调试进行学习的方式是最好的
《深入理解Java虚拟机-(JVM高级特性与最佳实践)》
想知道Java虚拟机为什么会帮你自动收集垃圾而不需要你管理资源释放吗? 想知道Java虚拟机的内存区域是如何划分的吗? 想知道Java虚拟机是如何唯一确定一个Java实现类, 并且如何加载类的吗? 想知道JVM凭什么能够将远程服务器发送的网络字节加载到JVM内存, 从而实现远程过程调用的吗? 这本书你值得拥有!(感谢这本书让我回答出RPC的实现原理)
500 lines or less
500行代码! 尽管跟Java没有太大关系, 强烈推荐, 里面的程序主要是一些玩具轮子, 都是用python实现的, 学习这个主要是理解别的程序员在开发软件的时候所做的决策/思路/取舍, 虽然我也没看完, 但是觉得这个资源很赞!!! 官方网址
《MySQL技术内幕-InnoDB存储引擎》
其实讲道理这种书应该给DBA看才对, 不知道为什么Java Web开发也要看- - 有次面试就问到说对mysql数据库的性能调优有什么看法, 所以就列在上面. 不过说真的有点晦涩难懂, 如果想简单粗暴地应付面试的话就看这个博客 这篇博客应该是我目前看到的对于mysql索引的解释最最通俗易懂的了
四、分布式系统
《大型网站技术架构: 核心原理与案例分析》
李智慧著, 确实是很好的入门书籍. 实际上如果有操作系统和Web项目后台开发的基础话阅读起来不会特别困难, 主要内容是介绍当今企业应对大型网站高并发请求的种种策略
《分布式Java应用-基础与实践》
这本书比较深, 介绍分布式Java应用和相应的应用场景, 什么远程过程调用(RPC)呀, 基于服务的体系架构呀(SOA)等, 同时也讲了很多java比较底层的知识, 最后介绍构建高可用/可伸缩系统的工程经验
《大型分布式网站架构: 设计与实践》
与上一本书类似, 不过个人觉得更偏向于"介绍"互联网安全架构和分布式系统的各种组件(比如分布式缓存|消息队列|搜索引擎等), 目前我只接触了Redis, 相应的组件实在太多了- - 此外对系统监控和数据分析等也做了相应介绍, 这些我感觉比较偏向运维岗的工作人员
《Redis实战》
Redis的基本用法和在生产环境的应用, 值得拥有, 虽然书籍是用python, 不过官方github也有放java的源码
《Redis设计与实现》
Redis的源码解读, 怎么说呢, 反正比spring源码好读太多了....而且作者读得很用心, 整理出了带注释版本的redis源码, 去读个痛快吧少年
五、博客与网站
博客
这里再着重推荐两个大神的博客, 都是歪果仁
网站
此外还有一些常用的学习网站:
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
实际上很多同学可能对项目经验比较头疼, 不知道做什么, 我提供一个最简单的思路
做个人博客|简历, 输入账号密码进行校验(登录注册太基本了), 之后就是对文章|简历的增删查改操作, 后台三层架构(控制层/服务层/数据对象层), 部署到云服务器上, 这就是你的博客|简历v1.0了
v2.0就可以考虑多终端, 将服务层从原来的单机抽离出来, 利用hession框架(或者其他RPC框架)让控制层和服务层服务器进行网络通信, 从而实现将应用服务部署在独立的服务器, 这样假如要面向多终端, 比如现在微信小程序就可以多编写一个控制层应用, 使用REST风格URL, 与之前思路类似调用统一服务平台的服务, 这样就是一个非常简单的分布式应用吧
之后的版本再慢慢尝试redis, mongodb之类的分布式组件, 虽然我自己还没有实践过, 不过应该是可行的. 驱动性的做项目的效率和学到的东西还是很高的.
(考虑某些因素决定删了这部分,谢谢大家)