赞
踩
本文是我大学两年知识的总结。涵盖数据结构、算法、语言基础、操作系统、关系数据库、NOSQL、网络/前端/项目基础知识、安全和测试、框架的学习、中间件和工具、设计模式和框架原理、我推荐的资料、我的建议
本篇文章应该算是Java后端开发技术栈的,但是大部分是基础知识,所以我觉得对任何方向都是有用的。
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。 —摘自百度百科
为什么把数据结构放在第一位呢?因为我认为这是一切的基础。
比如
学了时间复杂度空间复杂度,你就能写出更好的程序,解决更多的性能问题。
学了顺序表和链表,你就知道,在查询操作更多时,应该使用顺序表,而在修改操作更多时,应该使用链表;
学了栈之后,你可能才能理解并写出递归,学了队列,会对消息队列有一个认识,之后用轮子(比如kafka)才更得心应手。
学了串,你才知道String到底怎么实现的,你才知道了字符串如何匹配(KMP),搜索引擎(ES)是如何做出来。
学了排序,你才知道各种排序优缺点,知道各种语言的sort是如何实现的(别给我说就是快排),用到实际项目中。
学了哈希,你才可能读懂HashMap是怎么玩的。
这是我做的一些总结:旧版总结
我进行了删减,新写的东西懒得加了。
涉及语言:
py3:注重算法本身的知识
c/c++:实现基础数据结构和算法
java:实现较复杂数据结构
笔记:
基础代码实现:
应用:
笔记:
基础代码实现:
数组实现队列(易懂实现循环)
应用:
相关算法:
笔记:
基础代码实现:
相关算法:
注:题目慢慢添加
笔记:
部分题目实现:
应用:
笔记:
基础代码实现:
应用:
相关算法:
笔记:
基础:
相关算法:
皇后问题(位运算)
旅行商问题(认识状态压缩)
基础代码实现:
相关算法:
基础代码实现:
相关算法:
总之不要着急,基础打牢。
跟着经典走,绝对没错,这个书写的真的不错,里面的伪代码你有能力自己实现一下。
2、大话数据结构
讲的太入门了,看一遍对小白很有帮助
另外一本经典书,是第一本的延申,有能力绝对要多看几遍,写的不错。
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
先不说有没有用(事实上工作上连leetcode知识用到的都不多),国内大厂面试笔试,算法是占很大部分的;国外(比如北美),更是刷leetcode就能进(我只是听说的hhh)。
首先关于ACM的建议:强校尽可能打一打吧,弱校除非很热爱,否则不建议。
其中,强校指的是能稳定产出区域赛银牌以上的学校。
如果在弱校,你可能举步维艰:
首先我见过的,听说过的一带二的选手,最多也就区域银,但是消耗了大量学习时间,还带了两个水货拿牌子,这是很不值的。
其次,遇到某些让你很难受的教练,可能你打了名额不让你去,可能各种打压你等等(竞赛环境好的同学可能都想象不到吧)
当然,环境决定不了一切,如果你决定由你创造历史,也是可以的,请你在大一就判断一下:是否算法编程比赛比赛每次都第一,并且落下第二两道题以上(反正要碾压)?如果是的话,在考虑是否走这条路。(我大一就是这样,但是其实p都不会)。
当然,你的学校如果有打ACM的那一群人,有一个集训队,非常建议加入他们,
第一,可以锻炼自己。你不知道多少个日日夜夜为了调试一个bug在那里冥思苦想,你写的代码加起来可能有几万行(500题*30行=15000行,很正常吧),而这几万行代码是你几万行业务代码不能比的。
第二,这群人不一定是将来混得最好的人,但是一定是中上游的人,而让这些人成为你的朋友,对你很有帮助。
第三,享受快乐,你ac的那种快感。
这里我自己写的ACM博客并不多,也不全,所以给你们点oj和板子合集。
新手推荐匡斌专题,刷完保铜冲银绝对没问题kuangbin专题合集
我推荐的,也是比较有名的一些oj
国内:(排名不分先后)
浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/
同济大学(TJU):http://acm.tongji.edu.cn/ 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/
吉林大学(jlu):http://acm.jlu.edu.cn/ 哈尔滨工程大学(hrbeu):http://acm.hrbeu.edu.cn/
哈尔滨工业大学(HIT):http://acm.hit.edu.cn/ 北京邮电大学(Bupt):http://acm.scs.bupt.cn/onlinejudge/
汕头大学(STU):http://acm.stu.edu.cn/ 福州大学(FZU):http://acm.fzu.edu.cn/
华中科技大学(HUST):http://acm.hust.edu.cn/JudgeOnline/ 华东师范大学(ECNU):http://acm.cs.ecnu.edu.cn/
国外:
俄罗斯:乌拉尔大学(URAL):http://acm.timus.ru/ 萨拉托夫大学(SGU):http://acm.sgu.ru/
美国:USACO: http://train.usaco.org/usacogate
波兰:SPOJ:http://www.spoj.pl/
另外,基本各路模板我都有,可以找我要哈。
你也可以去洛谷,计蒜客等网站刷题,这些网站都对新手比较友好,是刷题的好去处。
不是每个人都会打acm,所以面向实际,性价比很重要,这里推荐《剑指offer》和leetcode。
其中,《剑指offer》肯定要看完并且理解,leetcode据说刷一百多道就能应付一般面试。
我本来想总结十篇精华帖,但是说实话leetcode题解绝对够了。
建议刷这几个专题,性价比高一些哈。
这不用我说,绝对是很重要的一部分,语言都学不明白,别的更不要想。你可以学习Java、c、c++、python、go等语言。
我主要是Java技术栈的,但是总结的基础知识有一些不方便放出来,是我的私密文章,我只把一些公开的放出来。
1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?
**2、short s1= 1; s1= s1+1; 有没有错?**3、short s1= 1; s1 += 1;有没有错?
4、使用final关键字修饰一个变量时,引用的内容一定不能变?
5、是否可以从static方法内对非static方法调用?为什么?
**6、Overload和Override的区别?**7、Overloaded的方法是否可以改变返回值的类型?
8、接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concreteclass)?抽象类中是否可以有静态的main方法?
**9、Java中实现多态的机制是什么?**10、abstractclass和interface有什么区别?
11、String s = “Hello”;s = s + “world!”;执行后,原始的String对象中的内容变了没有?
12、下面这条语句一共创建了多少个对象:String s=“a”+“b”+“c”+“d”;
**13、final, finally, finalize的区别。****14、error和exception有什么区别?**15、Java 中堆和栈区别
16、能将 int 强制转换为 byte 类型的变量吗?(引申到所有大类型转小类型
17、hashCode有什么用?与 a.equals(b) 有什么关系?19,java中会存在内存泄漏吗
这些问题以及更多问题都是我总结的比较好的问题,要答案去评论,我发。
想获取更多笔记的。。。。。我不会给你们的hhhhh。
只有这些公开的了。
另外,如果是零基础py,我推荐廖雪峰的教程,百度搜即可。
哪种语言需要小白教程,评论,我给你想想有哪些好东西。
另外,py爬虫建议学习一下。
如果你时间紧,可以跳过。
操作系统是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。
放下我的操作系统基础知识总结
我认为学了最好可以把经典的算法都实现一下。
我模拟了一些。
如果你是Java技术栈,jvm是肯定要接触的,这部分我也是小白,暂时没怎么弄过jvm调优,但是知识一定要准备好,毕竟你学红黑树的时候也不知道将来写TreeMap的时候有用呢?
linux是人人都要会的。
我这部分其实很菜,基本上啥都不会,但是真的很重要。。。
我懒得找我总结的东西了,其实大部分就是一些命令的使用。
linux-在cenos上安装大全(nginx/JRE/maven/Tomcat/MYSQL/redis/kafka/es…)
对于原理,我读过一本书的小部分,后来因为各种原因没有继续读下去,但是推荐给你们。
《linux内核设计与实现(第三版)》 拉夫,机械工业出版社的那本。
比如Java多线程,这其实也是属于操作系统只是的一部分,所以我放到了这里。
我这部分暂时没有总结完。
synchronized使用和原理全解(((((推荐)))))
基础知识:
推荐王道考研的视频,真的很赞,b站就可以搜得到。
优点:声音好听(有磁性)、学长总结(学生更容易听懂)、不讲废话(节省时间)、讲的通俗易懂(反正我一遍就懂)
我对比了不下五种视频,这是最好的。
有的人可能会问我又不考研?那你不能看一遍?这么好的视频不看多浪费啊?
多线程:
这本书我犹豫了很久到底要不要推荐呢?因为我看完了其实感觉一般,有些例子过于啰嗦,而且没有底层原理的讲解。但是用来入门的话,如果你是一个细心且耐得住性子的人,这本书还算不错。
这本书个人感觉比上一本好。但是还是看个人感觉吧,需要手把手教的那种,还是第一本好。
开发离不开数据库,我把数据库的知识分为以下几个阶段:
请注意,这是两个事,前者我推荐数据库系统概论,相信大部分学校的教材都是这本,里面的理论很重要,是基础。
后者我推荐MySQL必知必会,这本书绝对是入门sql语言的最佳选择。
这两本书我不接受任何反驳,是相关方面国内最好的。
再推荐一个视频:b站上面的东南大学徐立臻教授数据库原理,真的讲的很好,我看了不止一遍。
下面放下我的总结:
这部分我认为非常重要,实际工作中都是很复杂的sql,并且涉及到优化。
我推荐高性能MySQL(第二版),这本书说实话我读不完,甚至只读了十分之一,惭愧惭愧,但是还是让我受益良多。
还有,推荐leetcode数据库专题,真的也让我受益良多(你们可能只知道leetcode算法吧hhhh)
这里我推荐《MySQL技术内幕:InnoDB存储引擎(第2版)》
我当然是没达到的,但是我看到了很多大佬都在做这方面内容,包括本校的几届毕业薪资最高的学长、包括同级的外校大神,强行让我做但是我不会啊。。。哭了
但是我想当推荐一下资源,我虽然没实现,但是看了有很多收获,如果你按着做出来了,完全可以当作一个不错的项目。
推荐两门网课:mit6.830 和 cmu15445(建议做前者的实验(相对完整),看后者的课程)。
学完两门网课之后,对数据库系统已经有了大致的了解。
接下来可以看数据库系统概念(但是这本书写的有点繁琐),推荐看pingcap的tidb源码阅读二十四篇(https://pingcap.com/blog-cn/),看文章的时候可以看一下源码(需要学一下go)。
另外一个好的学习资源是talent plan,作业质量挺高的。
(https://university.pingcap.com/)
如果你对pingcap的tidb很感兴趣,想继续深入学习,可以再了解一下分布式,推荐mit 6.824,接下来就是看论文,写lab的快乐时光,接着你可能想看看tikv,那么可以学一下rust啦。
内存越来越快、越来越便宜的今天,你要是不会一个nosql那可以不用干活了吧?
但是简单地用当然不够(你会用map就会用nosql),你最好知道一下复杂的操作,和nosql的原理。
我这里研究的是redis:
Redis是一款基于键值对的NoSQL数据库,它的值支持多种数据结构:
字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。
• Redis将所有的数据都存放在内存中,所以它的读写性能十分惊人,用作数据库,缓存和消息代理。
Redis具有内置的复制,Lua脚本,LRU逐出,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供了高可用性。
• Redis典型的应用场景包括:缓存、排行榜、计数器、社交网络、消息队列等
但是我们实战之前,还是要了解基本使用
这部分在我看来是最有意思的,我们有必要了解底层数据结构的实现,这也是我最感兴趣的。
比如,你知道redis中的字符串怎么实现的吗?为什么这么实现?
你知道redis压缩列表是什么算法吗?
你知道redis为什么抛弃了红黑树反而采用了跳表这种新的数据结构吗?
你知道hyperloglog为什么用如此小的空间就可以有这么好的统计性能和准确性吗?
你知道布隆过滤器为什么这么有效吗?有没有数学证明过?
你是否还能很快写出来快排?或者不断优化性能的排序?是不是只会调库了甚至库函数怎么实现的都不知道?真的就是快排?
包括数据库,持久化,处理事件、客户端服务端、事务的实现、发布和订阅等功能的实现,也需要了解。
另外,
对象(字符串对象、列表对象、哈希对象、集合对象、有序集合总结)
进一步的了解了redis的使用和原理,我们来写一些简单的实战代码
只要是开发肯定离不开网络知识。
但是我不建议你把那本《计算机网络(第七版)谢希仁著》看完,我感觉太过无聊而且底层的那几层我个人感觉是真的用处不大。
推荐书籍:《计算机网络:自顶向下》、《图解http》
除非你可以牛到给老板说:“老子就是不会前端,专做后端”,否则你还是要会一些前端的。
建议上vue\react\node.js,这些是我问的前端同学的建议。
如果时间不够上面的知识,bootstrap建议看一下(因为我就会一点hhhh)
不同于基础语言知识,这部分知识可能涉及到网络方面知识,学会后你可以具体做一些东西比如Java,你就需要学servlet、JDBC等JavaEE技术,但是这些技术又不会真的工作用,只是基础,但是真的很重要,建议拿这些知识写一些项目,比如学生管理系统。
但是我不建议你再学JSP,这都9102年了,为啥非抱着它不放呢?你学leaf不好吗?如果说servlet、JDBC是基础,我觉得jsp真的没必要,他也不是什么所谓的“基础”。
这部分我觉得也是很值得学习的,反向思维很重要,不要以为开发就可以不懂测试,不懂安全。
咱们写代码的时候也是边写边侧不是么。
说一下我学这些的理由:
压测的话,LoadRunner太不方便,太过于庞大,可能专业测试需要学,开发学jmeter就可以啦。
安全方面其实我挺有感触的,你们知道为啥要放验证码吗?你们知道SpringSecurity是咋实现的吗?你们知道xss,sql注入,文件上传漏洞,浏览器安全,这些东西怎么攻击怎么防御吗?
我们作为开发其实是需要知道的吧。
Java来说,学完了JavaEE肯定要学框架的,你总不能拿servlet和jsp、JDBC写项目吧?
推荐ssm,不要学ssh了,都9102年了,咱们就不要浪费时间了。
springboot是一定要学的,相关的spring生态圈都要学,这部分我也刚接触,以后要多多学习。
至于原理,抱歉我能力有限,目前正在学习中。。。。。。。。。。。。。。。
这一部分我暂时没怎么写总结博客,但是我认为都是要会用并且了解原理的。
推荐的链接有几篇是其他人写的,因为我也是小白,有的方面没什么经验。
这是必会内容,否则你写的项目可以说没有什么性能可言吧。
首推kafka,当然你学别的未尝不可,就算拿redis也能写,看你自己的需要吧。
建议学习原理,我觉得挺重要的。
这我认为不是必会的,但是最好学习一下,推荐你可以自己基于字典树做一个小型搜索引擎,还可以统计热点词、过滤敏感词等等,非常方便。
至于具体的我推荐elasticsearch,并且我建议原理一定要了解一下,什么倒排索引之类的。
现在光会关系数据库肯定是不行的,你要会一种nosql数据库,你要做缓存,提升性能,,但是进一步提高性能,预防缓存问题(比如缓存雪崩),你就需要做多重缓存,本地缓存是少不了的。我推荐咖啡因。
不多解释,就是给你提个醒。
教程推荐廖雪峰
这个也是必学内容,小白的直观感受就是可以不用到处搜jar包了。还有很多其他强大的功能。
Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。
Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司项目采用 Maven 的比例在持续增长。
没有商量,必须会。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
必会,关键你kafka啥的都得在这上面跑。
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
ZooKeeper包含一个简单的原语集, [1] 提供Java和C的接口。
必会
必会
我这里列举了两个工具,他们两个都可以做概要设计的脑图
这个是接口调试的神器,单测比较繁琐的你可以试试这个嘛,不过很多接口还是只能写写单测,反正很香。
不过这个名字一看就是男生用的,那我们女生用啥呢?往下看
官网地址 :https://postwoman.io
PostMan一听就是男生用的,咋妹子们肯定要用最近开源的Postwoman啊,它是一款开源的 Postman 替代品
开源没多久优点如下:
轻盈,可直接在线访问;
简约,采用简约的 UI 设计精心打造;
支持 GET, HEAD, POST, PUT, DELETE, OPTIONS, PATCH 方法;
支持验证;
实时,发送请求即可获取响应。
官网地址 :https://gradle.org
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具。
它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,目前也增加了基于Kotlin语言的kotlin-based DSL,抛弃了基于XML的各种繁琐配置。
这个跟Maven功能是一样的,但是两者语法不一样,而且我觉得版本控制的时候没Maven好使,有小坑,胜在语法简洁。
当你开发到一定程度,学习设计模式肯定是避免不了的
建议阅读经典书籍,这是笔记,我觉得看笔记也可以。
《Head First设计模式》第七章-适配器模式、外观模式
《Head First 设计模式》第十章-状态模式 状态模式
学了设计模式你才敢去看源码。
至于spring源码,我毕竟还年轻,写代码太少,没勇气去看(也没能力去看),以后再说吧。
文中提到的书和视频我都是看过的,不会只听说过就推荐给你,那是不负责任。
跟着经典走,绝对没错,这个书写的真的不错,里面的伪代码你有能力自己实现一下。
2、大话数据结构
讲的太入门了,看一遍对小白很有帮助
另外一本经典书,是第一本的延申,有能力绝对要多看几遍,写的不错。
推荐《剑指offer》和leetcode。
其中,《剑指offer》肯定要看完并且理解,leetcode据说刷一百多道就能应付一般面试。
我本来想总结十篇精华帖,但是说实话leetcode题解绝对够了。
这本书我犹豫了很久到底要不要推荐呢?因为我看完了其实感觉一般,有些例子过于啰嗦,而且没有底层原理的讲解。但是用来入门的话,如果你是一个细心且耐得住性子的人,这本书还算不错。
这本书个人感觉比上一本好。但是还是看个人感觉吧,需要手把手教的那种,还是第一本好。
《计算机网络:自顶向下》、《图解http》
总:
Stack Overflow,https://stackoverflow.com/questions/tagged/java
Stack Overflow 可以说是解决问题的杀手锏
哔哩哔哩
上边的视频都是非常高质量的,你可以去搜索看一下。
慕课网
虽然有些视频时付费的,但是质量是真的高,那些免费的入门足够看了
菜鸟教程
一听名字就知道适合菜鸟的,但是基础的知识写的非常详细,很清晰易懂,非常适合刚开始学习编程的小伙伴。
W3School
刚开始学WEB开发时,经常结合w3school学习前端,开发时,如果遇到记不清的标签,就去w3school搜索。
中国大学MOOC
如果你是非科班的,想要系统着补某们大学的课程,那么中国大学MOOC是个不错的选择,这里有各种各样的课程,有些老师还是讲的挺好了,和大学课程老师的教学差不多。我编译原理就是在这里学到.
永远保持一颗谦虚的心,你认为你厉害或者你很努力是因为你的环境不好而已。
在一个中专,你会写项目,能写增删改查,就觉得自己特别努力特别厉害。
在一个三本院校,你可能天天按时上课,就觉得自己特别努力特别厉害。
在一个一本院校,你可能觉得上课好好听讲,下课好好写作业,就觉得自己特别努力特别厉害。
在一个211,你可能没课的时候也去图书馆,并且课下时间对老师讲的东西做了一些拓展,就觉得自己特别努力特别厉害。
在一个985.。。。。。
还用继续说吗?你认为的努力和厉害,换个环境,毛都算不上。骄傲的人必定失败
很多人焦虑找不到好工作,我也是。
我见过省会城市一个挺大的当地企业,四五十平米的屋子挤着几十个人,每个程序员在自己的一平米空间里工作,月薪2500.
我见过清华的,手写操作系统运行在自己做的cpu上,手写数据库,oi省一、数双学位、一天速成java写了个app拿了第一,GPA大部分4.0。
人和人的差距,比人和狗的差距还大。
所以不要慌,你再慌,也有人不如你,你再慌,也有人比你厉害。
一步一步走,永远不要被别人影响,做好自己。
挺多人还在比那个语言好,纠结学哪个语言,纠结哪个方向挣钱。
想的多不如去做,我相信不管你做什么,只要努力一定有收获。
AWT 和 Swing
好像不知道大清朝早已经亡了几百年一样。已经 9102 了,谁还会用 AWT 和 Swing 去开发桌面应用呢?
Struts
Struts 是早年一个优秀的 MVC 框架,单从技术的角度来看,还是蛮不错的。但是自从有了 SpringMVC 后,Struts 就被拍死在沙滩上了。
Hibernate
Hibernate 太重量级了,学习成本太高,取而代之的是轻量级的 MyBatis(支持定制化 SQL、存储过程以及高级映射)。
JSP
等等。。。
当然谁和谁的情况都不一样,如果你入职的小公司确实需要,还是要学的(但是我建议你跑路,没意义的)
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。