当前位置:网站首页 > Java教程 > 正文

java 教程 知乎



》》》》》》

距离发帖到现在(2016/5/8),已经有8位同学发来了感谢信,分别来自阿里巴巴(3人),蚂蚁金服(2人)百度,美团,蘑菇街。都是校招的同学。各位加油 :),我相信会有更多的人从这份答案中获得帮助。

》》》》》

============================以下正文===================================

很荣幸的今年通过了阿里巴巴的实习生招聘!

我把我看过的书罗列一下吧!

  • 《java核心技术:卷一》,这个是我入门java的时候看的,非常适合新手!
  • 《java设计模式》这本书虽然是个外国人写的,但是感觉不是很好。评价一般。学习设计模式的时候我一般都看大牛的博客。
  • 《深入理解jvm虚拟机》 这本书不用多说,业界非常非常好的一本书!多看几遍,每一遍都有很多收获
  • 《深入分析java web 技术内幕》 @君山 山哥,竟然还能@你出来!(不得不说,这本说在各个方面都非常优秀,不愧是偶像写的书!还求山哥多多照顾。嘿嘿
  • 《Spring技术内幕》在spring源码讲解方面,个人感觉非常不错。能够深入理解内部机制,但是需要多看几遍
  • 《编程之美》业界翘楚,在算法方面终结的非常好,题目也非常有代表性
  • 《剑指offer》不用多说,和上面一样,可以锻炼一些算法能力
  • 《java编程思想》传说是java行业内的神书,但是目前表示还处于一知半解状态
  • 《Hadoop技术内幕》这个可以pass掉,学习hadoop的时候看的
  • 《TCP/IP详解,卷一:协议》可以对tcp有更加深刻的认识
  • 《java网络编程》,不是很好,将就可以。学学api还是可以的
  • 《大型网站技术架构》 @李智慧 在大型web架构方方面面简直膜拜,
  • ------------------今天又想起一些------------------------
  • 《分布式java应用:基础与实践》这个是毕玄大大写的书,非常不错哦
  • 《how tomcat works》在讲解tomcat内部原理方面,个人觉得是非常不错的书!等级又要上升一个档次
  • 《java并发编程实战》对java并发方面,讲得还算不错的书籍
  • 当然还有一些杂七杂八的书(走了不少弯路,你懂的!),我就不列出来了,上诉都是笔者认为非常不错的书籍。

最近正在看《算法导论》,和《算法》,md,其实我也想成为算法狗

当然,上面这些书我表示只懂50%,惭愧。不能完全吸收大牛的精髓啊!

  1. 其他的,数据结构,计算机网络,操作系统,数据库都是平时学习的课本,数据库做项目的时候实践一下!先学习基础,在继续深入
  • 数据结构不用多说,什么B树啊、红黑树啊、栈、队列等等,至少保证能够清楚的说出来,说出他们的原理!具体的应用场景是什么啊!,当然能写出来更好(手写btree会死人,其实还有一个数据结构叫skiplist,逃
  • 算法的话,建议题目多看看算法题目,或者把leetcode上的算法题目刷一遍(目前本人只AC的几道题,惭愧。知道该资源的时候已经晚了,现在在努力刷刷刷)。另外可以看看july的博客,结构之法 算法之道。目前july已经有自己的网站了,七月问答 ─ 面试·算法·机器学习快速问答平台 .本人是july的忠实粉丝,在此感谢 @July ,对我在算法方面有很大的帮助,谢谢
  • 数据库就更多了,索引(结合B+tree,两个引擎的不同之处,推荐文章:MySQL索引背后的数据结构及算法原理)、存储过程、引擎、触发器,事务 @沈询 实力打广告,还有沈大大的视频和博客(weibo.com/whisperxd)微博里面有链接哦,ACID等等等等,SQL必须是要熟练的,写SQL的时候多考虑考虑效率,想想还有没有其他的语句能完成这个任务,在哪方面提高了,为何呢?数据库引擎要了解一下,分布式数据库也是,什么主从分离啊,分库、分表、分区啊,这些常见的解决方案
  • 操作系统我属于渣渣,个人就知道一些进程、线程、一些调度算法之类的~~~~(逃
  • 计算机网络如果是研发岗位得话,TCP/IP这一张需要好好看看,HTTP协议不用多说,常见的状态码等等,一次http请求有哪些过程,这个要理解透彻

java:基础非常重要,当然也要深入理解原理,什么JVM,JMM,Classloader,还有一些常见类的源码,自己可以试着分析一遍,现在让你说出LinkedList的内部实现你能不能说出来,HashMap不用多说了,80%的面试都会问到。还有重要的,多线程,并发,网络,IO。这些都是要看看看看的!自己多思考!还有楼主说的那些框架,说实话,你要是基础好了,这些都是能够学得很快的,很多问题,看一下源码什么都就懂了!特别是spring的源码要好好看看,里面的架构设计得非常好!各种设计模式满天飞!

另外,linux要了解一下,至少要回基本命令吧,脚本语言可以学习一个。比如py!前端要了解一下.

关于如何看书:两个字,思考!三个字,不要脸的思考!…………,书不在多,在于精,选书要慎重!反正题主一本叫做“王者归来”的书,我看见名字我就不想看!

除了这些然后呢:每天刷几遍CSDN,平常可以上上oj刷刷题目,国内的牛客网(牛客网-专业IT笔试面试备考平台,最全求职题库,全面提升IT编程能力)非常不错,也可以去leetcode上面把题目刷一遍哦。关注一些好的社区(我一般混迹在CSDN高性能javaweb板块),睡觉之前看微信公众号,当然是技术方面的!推送的文章都挺不错的!

做程序员个人觉得眼界很重要,就算这不是你的领域,但是你也要知道一点,所以经常关注其他的新技术是非常重要的!平常多接触一点开源技术,多上上github,争取能在github上面贡献一点自己的东西!

然后,多看看别人的技术博客。思考自己!

这是我学习路程的经验和一些资料总结,大家可以看看,链接——>技术文字 | 「浮生若梦」可以再评论箱中评论,我会一一回复(下面贴一部分)

我的经验与分享

关于我的学习方法和面试经验的分享

下面是我写给我现在带的学弟在学习路线上的一些建议,大家可以参考一下!希望能够帮助到大家,有写得不太合适的地方, 还请大家指正

一、基础

  • 主要看《java核心技术:卷一》的重点章节
  • 掌握java常用技术,io、多线程、反射、常用集合框架
  • 数据结构看一遍,作用至少要清楚。如hash冲突解决办法,常用排序算法的应用场景和空间/时间复杂度等
  • 数据库,能看懂ER关系,熟悉数据库三大范式,熟练常用SQL语句
  • 可以掌握一点java网络编程方面的知识,对tcp/ip有初步的认识
  • 课程不能落下,专业课程(计算机网络,操作系统,数据结构,数据库,计算机组成原理)要好好学。不要挂科
  • 学习servlet/jsp,至少能写简单的图书管理系统,熟悉核心api
  • 了解前后端交互方式,ajax、json/xml至少知道,会使用jquery,html,css,js最好

二、提高

  • 学习后端框架,SpringMVC/Struts2、Mybatis、Spring,熟悉MVC模式,知道三层架构及每一层之间的关系
  • 会用chrome/firefox浏览器分析http请求,解决、定位问题。知道常用http状态码,了解TCP/IP,知道一次http请求发生了哪些事情
  • 学习设计模式,23种设计模式都需要了解一点,熟悉常用的如:单例,工厂,模板,适配器,代理,责任链,构造器,装饰器,迭代器,策略,命令,观察者,外观,享元。理解他们的好处,可以找找在其他框架哪些用了这些设计模式。
  • 可以适当的看一些源码,Spring的源码可以着重的看一下。tomcat可以从源码的角度看看tomcat的整体设计方案,一次请求tomcat如何处理,servlet在tomcat中的加载,编译过程。tomcat自定义的ClassLoader有什么作用。
  • 会设计数据库,多对多,一对多,迭代,会写复杂的SQL,了解SQL调优,会写存储过程,触发器。熟悉索引的使用,了解视图。去了解一些常用NOSQL,比如Redis/mongodb
  • 学习Linux,熟悉基本命令,学习一种脚本语言(shell/python)。会在linux下写脚本开发

三、深入

  • 算法,可以看看编程之美,算法导论。学习一些算法相关的知识
  • 深入java:理解JVM,JMM,Classloader,GC算法,GC收集器。学会定位OOM问题所在。
  • 源码分析,常用集合类如:Hashmap,Arraylist,linkedList,HashSet,ConcurrentHashmap等的源码分析,要非常熟悉java集合框架设计。最好能够分析一种框架源码,比如Spring
  • 深入数据库,理解至少两种数据库引擎(Inndb/Mysiam)的差异性,熟悉索引的内部数据结构,熟悉常见的索引方式(Btree,hash),和索引类型(unique,full text,normal),会使用explain分析SQL语句,会优化SQL语句,熟悉一种NOSQL,知道内部实现原理(内部数据结构,在算法优化,内部机制),掌握分布式数据库的知识,分表,分库,分区,分布式事务等,可以学习一个数据库中间件(TDDL/COBAR)
  • 架构设计,看看大型高流量/高并发的网站设计(CDN,异步,前端优化),了解缓存(分布式memcached/常用本地缓存),搜索引擎(lucene/solr/elasticSearch),分布式(负载均衡/分布式数据库/分布式应用集群),消息队列(ActiveMQ/Rabbitmq)在大型网站中的作用
  • 还有一些其他的知识,如RPC框架,分布式服务架构,SOA,REST架构等等
  • 可以接触一些云计算方面的知识,如Hadoop/Storm/Spark等,要是再能接触一点机器学习就更棒啦(反正我是没有,听着就吓人,跑个kmeans算法都要弄死人,(+﹏+)逃
那么除了看书籍之外还有哪些学习方式呢?下面说说其他的学习方式
  1. 参加开源项目/自己写点东西放在GITHUB上面,笔者我写了一个自己的MVC框架(Dreamvc),github地址->Yaccc (Zhaodong Xie) · GitHub.另外可以去fork下其他人的开源项目,如果感兴趣就贡献一下,不感兴趣就学习别人的编码风格,去其糟粕!
  2. 多看看大牛的博客,这里我列举一些大牛的博客
  • 结构之法,算法之道,july大神的博客
  • xieyuooo的专栏,《java特种兵作者》
  • @兰亭风雨人任平生|兰亭风雨的专栏, 目前人在腾讯,博客都写得很好,很深入!受益匪浅
  • 机会永远留给有准备的人,享受编程和技术所带来的快乐(目前人在VMware)
  • 分布式架构、大数据、机器学习、搜索、推荐、广告
  • 赵伊凡's Blog,涉及各个领域
  • 搜索技术博客-淘宝,搜索团队的blog
  • 廖雪峰的官方网站,python就是跟着他学的
  • 空虚浪子心的灵魂,java安全,alibaba的安全专家
  • 阿里中间件团队博客,咱事业部的中间件,很厉害 (๑¯ิε ¯ิ๑)
  • 服务器运维与网站架构|Linux运维|X研究,里面提到的技术都碉堡,博客质量也高。曾经memcached在哪里学到了很多
  • 淘宝沈询_WhisperXD的博客,TDDL作者,ONS消息服务负责人,差点就跟着沈沈混了(•‾̑⌣‾̑•)✧˖° (๑´ `๑) (๑¯ิε ¯ิ๑),在数据库方面强烈推荐
  • 跟阿铭学Linux
  • 刘未鹏 | MIND HACKS,这个大牛简直不要太叼
  1. 多上一些高质量的网站,下面我列举一些,每天都最好抽时间去走一遍
  • GitHub,程序员不知道这个可以考虑转行了(๑´ `๑)
  • CSDN.中国最大的it交流网站
  • cnblogs,还是有很多资料的,里面也有大神
  • Stack Overflow,问答网站,回答质量高
  • LeetCode OJ,刷算法的oj
  • V2EX,一个关于分享和探索的地方。
  • ITeye,前身为JavaEye。
  • 并发编程网,致力于促进并发编程研究和传播的垂直性技术网站。
  • IBM developerWorks 中国,里面有高质量的文章
  • 开源中国,可以关注一些开源动态
  • 7月算法,july的在线教育项目,主要是算法方面
  • InfoQ,促进软件开发领域知识与创新的传播
  1. 关注一些技术类的微信号(晚上睡觉或者平时杂碎时间看)@Michael的知乎|cindy总结的 (๑¯ิε ¯ิ๑),这是原地址

最后送一句话,越努力,越幸运!

要私信我的同学,请先看这篇文章,谢谢!EchoQME只为最好的你 - 谢照东的文章 - 知乎专栏

“十年饮冰 难凉热血”,欢迎关注,推送互联网技术,也许是个自媒体. : )

PS:转载须经本人同意,并支付报酬

PHP:没有优点

Java:库多,库多,库多

Python:语法清楚,语法清楚,语法清楚

C:能操纵底层,能细粒度优化性能

C++:啥都有,啥都有,啥都有

————————————————————————————————————————————

汇编:

C:

Java:

C#:

PHP:

Python:

Go:

Haskell:

Lisp:

最后是 C++:

(图部分为自制,部分来自网络)

身为一名全栈程序员

居然要我修电脑,修打印机。

你以为我会和领导说告辞?

不!

面对需求程序员永远不会说不!!!

而且我真的会,所以我都修了,我甚至还在公司教人用excel。

不就是偶尔修修电脑嘛,理工男应该多多少少都会点。

直到周六的时候,老板的助理跟我说

“你帮我看看U盘怎么了”

我一开始以为是那种假U盘,就是那种动不动标着128G,但实际容量只有几百M的U盘。我插到电脑上看了一下,没有任何反应,但是我扭了扭,就有反应了。可能这U盘有脾气,要摸一摸抚慰一下?

当然不是

以我多年的经验,其实也就几个月吧。肯定是插口的问题。

所以我拆开看了一下。

没错,引脚断了,断了三根,不过我拆开的时候,全弄断了。

天啊,我要修这玩意吗??

第二天周末,我陷入了沉思,这完全不属于我该做的了吧~~~

但是!!!

程序员永远不能说不!

我今天带着这玩意来上班了。

开始点了几下,发现没用,点不上,要焊锡丝才行,但是我的已经用完啦。

上某宝看了一下。

看到这个价格,我心在滴血,就我这点工资。。

不,程序员永远不能说不!!

我想其他办法。

我一开始以为易拉罐是锡的,所以花了两块五的巨资买了瓶饮料。

慢慢的一口一口的喝着,平时都没机会享受碳酸饮料,含着泪喝完。剪开。

然后发现这不是锡!!

我有想过放弃,我的确胜任不了程序员的工作,我修不好U盘,给广大程序员朋友丢脸了,我也没必要在这行做下去了,准备提交辞呈。

但是,我的心中在呐喊:程序员永远不能说不!!

然后我换了个方式,找来一个电路板。(这里要感谢一下老板助理,为我提供了电路板)

从上面一点一点慢慢扣。扣除多余的锡。

然后成功焊上去了。

虽然焊的不好看,但是看上去没问题了。

插电脑上试试。

U盘的头上撒发着绿光~很快就七夕了。

没有问题!

封好!

我再一次的为程序员这个群体赢回了尊严!

我们程序员,永远不会说不!!(骄傲)

之前做ZF网站,对方很喜欢红色,老是觉得这不够红那不够红。就是那种鲜红,不是暗红也不是浅红,调到#FF0000他还嫌不够红。

怎么解释是他电脑显示器的问题,甚至用不同显示器去接他的主机,他都不认同,不认同也就罢了,还卡着这个问题,不让工程继续……

最后还是老板有办法,就这个问题,找他上级来视察一下工作,就指着这个界面“做的还不错嘛“,然后就通过了。

从大学到现在,我使用Java已经将近20年,日常也带实习生,还在公司内部做training,所以可以分享下我的经验,希望对你有用。

因为是在工作中培训,就必然有两个约束:实用、时间紧,因此就不能像大学那样,把所有的知识点都面面俱到的讲到。而只能挑基础的,实用的,难理解的讲。至于其他边边角角的知识,就一笔带过。一则没有时间,二则不常用,再则既使讲了,学生印象也不深刻。总之一句话:“好钢用在刀刃上”。

下面,就根据我的实践,具体谈下学习过程:

1.基础知识

我学习java的时候,先是通读了《Java编程思想》,然后是《Java核心技术》。当时这两本书还不像现在这么厚,而刚才我把案头的《Java核心技术》第9版翻了翻,上下两册已经1700多页了,可想而知,如果要把它通读一遍,且不说把所有的代码都调通,就是当小说读,估计也需要些时间。

但我现在教学依然首推《Java核心技术》,主要是体系完整,实例多,可操作性强。但对初学者,我一般是只讲前6章,也就是下面的内容:

  1. Java程序设计概述
  2. Java程序设计环境
  3. Java的基础程序设计结构
  4. 对象与类
  5. 继承
  6. 接口与内部类

就《Java核心技术》第9版来说,也就是到250页为止,加把劲,1个月拿下完全没问题。

因为你是自学,所以建议你一定要把其中的代码都调通,课后的作业尽量去做。除此之外,还有两点特别重要:

#.学习笔记

因为你是自学,不像在企业中学了就能够实践,印象自然特别深刻。而自学因为没有实践的及时反馈,所以记笔记就显得特别重要。因为记笔记就像写作一样,是整理思路的绝佳方法。同时学习笔记也是你以后开发,面试的绝好资料。

学习编程,人跟人是不一样的,别人觉得难理解的东西,对你却不一定;而你觉得难理解的东西,别人可能又会觉得特简单。而学习笔记就是自己专有的“难点手册”,有点像高考时的“错题本”,以后无论是在面试前,还是在日常工作中,随时都可以翻出来看看,自是获益匪浅。

#.分门别类保存demo

学习笔记是很好的文字资料,但编程界有句话说的特别好,所谓“no code, no text”,意思就是说:千言万语都没有一段代码来的实在。

以我的经验,在你在学习的过程中,就某个知识点,无论当时理解的多透彻,调试的多棒,只要时间一长,等到了实用的时候,肯定会碰到各种各样的问题,一些看似简单的东西,此时死活就是调不通,正所谓人到事中迷。这个时候,如果你手头恰有运行良好的demo,打开参考一下(甚至直接拷贝过来),问题自然迎刃而解。而且因为这些demo都是你亲手调试出来,印象自然特别深刻,一碰到问题,在脑子中自会立刻涌现。

所以说,在学习的过程,一定要善待你调通的demo,千万不要用完了就扔,等后来碰到困难,想要用时却找不到,追愧莫及。正确的做法就是把所有调通的demo,分门别类的保存起来,到时候查起来自是得心应手。

人都说“书到用时方恨少”,其实代码也是这样,所谓“demo用时方恨少”。

2.Spring

目前在Java EE开发中,Spring已经成为和Java核心库一样的基础设施,所以说如果想成为一个合格的Java程序员,Spring肯定绕不开。另一方面,如果掌握了Spring体系,Java基本上就算入门了,就有能力进行一些实用级的开发了。

但Spring本身也是日渐复杂,衍生项目越来越多,但最最核心的概念依旧是IOC和AOP,掌握了这两个概念,再把Spring MVC学会,再学习其他的衍生项目就会平滑很多。

同时,因为Spring本身就应用了许多优雅的设计理念,所以学习Spring的过程,也是加强Java基础知识学习的过程。因此等你掌握了Spring,原来很多你理解不透彻的Java特性,此时就会恍然大悟,包括接口、抽象类等。

我学习Spring,读的第一本书是《Spring实战》,坦率的说,书很一般,但市面上比它好的书,我却没有遇到过。还有一本《Spring源码深度解析》也不错,对Spring的设计理念讲的尤其透彻,虽然整本书读起来有些艰涩,但前几章却生动有趣,也是整本书的精华。所以建议你在学习Spring之前,先把该书的前几章通读一下,然后再回过头来学习《Spring实战》会顺利很多。

以我经验,要学透Spring,终极的方法还是阅读源码(我当时就是这么干的),待把Spring的核心源码通读了,人就真的自由了(所谓无真相不自由),不仅是对Spring,而是对整个Java体系。以后再遇到其他框架,大概一眼就能看出其中的脉络,所谓到了“看山不是山”的境界。但这都是后话,可以作为以后你努力的方向。

和学习Java基础知识一样,学习Spring也一定要记笔记,一定要分门别类保存demo。

老实说,Spring对初学者不算简单,因此最好能有个好老师带一下,不用太长时间,2个课时即可,然后就是在你遇到大的困难时,能及时的点拨下。

以我的经验,要初步掌握Spring,大概需要1到1个半月的时间。

3.其他知识

Spring是Java编程的基础设施,但真要进入到实际项目的开发,还有些东西绕不过,包括 MySql,Mybatis,Redis,Servlet等,但如果你经过Spring的洗礼,这些东西相对就简单多了,以我的经验,1个月的时间足够了。

4.实践

学习Java,光学不练肯定是不行的。但因为是自学,所以就没有实际的产品让你练手,但也没有关系,谁大学还没有做过毕业设计呢?以我的经验,大家最爱的“学生管理系统”依旧是个很好的练手系统。

别看“学生管理系统”逻辑简单,但麻雀虽小五脏俱全,其中数据库设计、Mybatis,Spring、SpringMVC,Servlet、Tomcat一个都不缺,绝对的练手好伴侣。

还有,虽然你的学习重点在Java,因为要做一个完整的demo,前端的配合肯定少不了。因此就免少不了要学一些简单的JS、HTML知识,但因为前端本就是个很大的topic,所以一定要控制好边界,千万不要顾此失彼。就“学生管理系统”来说,在前端上,只要实现一个包含table、textbox、button,能发送REST请求到server,能实现学生的“增删改查”的简单页面即可。

作为一个练手项目,目标就是把Java的主要技能点串起来,所以自不求尽善尽美(也不可能),所以1个月时间足够了。

.最后

按照上面的过程,4个月的时间刚刚好。当然Java的体系是很庞大的,还有很多更高级的技能需要掌握,但不要着急,这些完全可以放到以后工作中边用别学。

学习编程就是一个由混沌到有序的过程,所以你在学习过程中,如果一时碰到理解不了的知识点,大可不必沮丧,更不要气馁,这都是正常的不能再正常的事情了,不过是“人同此心,心同此理”的暂时而已。

在日常的教学中,我常把下面这句话送给学员们,今天也把它送给你:

道路是曲折的,前途是光明的!”

祝你好运!

--- 上面是原答案 ---

我把上面的内容作了下整理,画了学习路线图,内容也有些升级,供参考。

沈世钧:来自一线,Java高效学习路线图

因为有朋友,通过留言或私信方式问我:Java中有哪些知识已经过时,不需要再学习了

回答的多了,就感觉这是一个普遍的问题,因此统一整理了下,作为这篇文章的补充,希望对你有用。

目前Java后端有哪些不是很必要去学的?

我曾经接手过一份代码,遇到过一个三十几个if else套if else的模块。

心理骂骂咧咧谁他喵写的这玩意,然后开始review历史。

大致情况是这样的:第一个程序员写下这段代码时,只有两个if else;后来开始逐渐加需求,先是一个、两个,随后量变引起质变,于是逻辑分支快速扩张。

这个时候已经没有人愿意去重构成switch或是其他什么设计模式了,毕竟复杂度摆在那里,万一崩了还得背锅。

三四个程序员接手这段代码之后,就变成我现在这种局面了。

第一个程序员绝对没有料到这么简单的逻辑在之后会变成这么复杂的模块,甚至在增添第一第二条else时,也只是很随意的加上。

所以我觉得,这个锅绝对是是甲方的,让他娘的随便改需求。

这么一想心里就好受多了,编程嘛,最重要的是要看的开。

于是我又增加了两条else,测试,提交,下班。











————————————————

回来更新一波,下文与本题目无关,算私货:

papi酱更新了一个视频,别人是看着看着就笑了,我是看着看着就哭了。

bilibili.com/video/av37

之前的回答算是皮一下,带有一点自我调侃的意味。但大环境的事实如何,各位想必也是心知肚明的,不然也不会有这么多赞同了。

有时候真的不是我们不想写好代码,是不能写好代码。写着写着需求砍了、需求变了,什么设计模式都不顶用,最终还是怎样快怎样方便怎样来,因为根本没人知道这段代码还能不能活的过下一段需求变动。

有的人肯定要说怎么不订合同。合同肯定是有的,但是明明白纸黑字写的合同,该改还是得改,毕竟你要是不同意甲方那些“微小的变动”,以后还做不做了?!金主真能去得罪?

还是要学会得过且过,跟什么过不去也不能跟自己过不去,糟糕的代码忍一忍就完了:代码能跑、头发不少,对我们这些打工的人而言比什么都重要。

现实工作绝不是课本中的理想状态,会有无数的突发情况在等着你。你定义了半天观察者、备忘录,第二天这部分需求被砍了;写了半天接口,抽象类,忽然下午告诉你要加个十万八千里打不着边的啥东西,于是又开始加适配器,等你加完了告诉你又砍了。甚至有次半夜被喊起来改代码,等改完了发现需求被撤回了,气的我直接请了两天假调整心情。

设计模式和大的框架绝对是一个项目中非常重要的东西,但不是绝对重要的;一个好的PM团队,在某种意义上,才真正决定了这个项目的代码质量。

看到问题下许多答案有误导,忍不住出来解释一下。

Android 平台的绝大多数应用是使用 Java 语言写的,CPU 只能理解汇编指令,无法直接识别 Java 语言的虚拟机指令;为了让 CPU 能运行 Java 语言编写的程序,一般有两种办法:

  1. 「计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决」 引入一个中间层,这个中间层负责 Java代码的执行,然后这个中间层本身编译为 CPU 能理解的汇编指令,也就是 CPU -> 中间层 -> Java 代码。如果这个中间层采用 Java 语言直接作为输入,理解一句 Java 语句就把Java语言翻译一下让CPU 执行一段,我们一般称这种模式为「解释执行」。毋庸置疑这种方式效率是相当低效的。
  2. 直接把 Java 语言翻译成 CPU 能理解的机器语言。这里又有两种方式:
    1. 在程序运行之前直接把 Java 代码编译为机器语言。这种模式我们称之为 AOT (Ahead of time)编译。
    2. 在程序运行起来之后,实时地把 Java 语言编译为机器语言然后执行。这种模式称之为 JIT(Just in time) 编译。

背景介绍完了回到 Android 平台上面,Android 平台分为几个阶段:

  1. 在 Android 5.0 正式采用 ART 之前,Android 采用的是 解释执行 + 辣鸡 JIT 的方式执行 Java代码。在这个阶段是货真价实的「边解释边执行」的模式,代码效率相当低下,再加上那时候同样辣鸡的 GC (垃圾回收),Android 用起来真是惨不忍睹。
  2. Android 5.0 ~ Android 6.0 。Google 推出了 ART (Android Runtime)来解决之前的 Java 代码执行效率问题。这个阶段采用的是完全 AOT 模式;Android 应用在安装的时候,系统会把所有Java代码提前编译为机器码。这种模式有两个缺点不能忍:
    1. 安装速度巨慢。即使是现在吊炸天的 855 采用 AOT 模式编译一下安装包比较大的应用(如支付宝)可能就要一分钟。那个时候的 CPU 可不如现在,安装一个应用都让你等得头皮发麻。更要命的时候,系统 OTA 开机会对所有的应用执行 AOT 操作,这时候你的开机速度可能要半个小时。。。
    2. 占用磁盘空间,Java 代码编译为机器码之后体积会急剧膨胀。
  3. Android 7.0 ~ 现在。Google做了很大的改进,基于这样一个事实:我们使用一个应用的时候,基本每个人只使用它一小部分功能,为什么要把所有代码全编译呢?只编译你经常用的那部分代码不就 OK 了,这样安装的时候啥也不干速度飞快,等你用的时候系统就能知道哪部分代码经常被执行,把这部分代码编译为机器码,运行起来速度也快。于是 Google 又引入了 JIT,这时候的执行模式是 AOT + JIT + 解释执行。
    1. 应用安装的时候不执行 AOT 编译,安装速度飞快。初次使用应用的时候没有机器码,因此只能解释执行。
    2. 应用运行起来之后,系统收集经常被运行的代码的信息,做两件事:1)在必要的时候在运行时直接把 Java 代码编译为机器码 (JIT),然后使用机器码执行提高运行效率。2)把这个「经常被运行的代码信息保存起来」
    3. 设备空闲的时候,系统拿出应用运行时候保存的「热点代码信息」直接把这些代码编译为机器码 (AOT)

关于 Android 7.0 系统的演进可以参阅这里:s3.amazonaws.com/connec

Android 8.0上改进了解释器,解释模式执行效率大幅提升;Android 9.0上提供了预先放置热点代码的方式,应用在安装的时候就能知道常用代码会被提前编译。可以看到,当前 Android 平台的执行模式在空间占用+安装速度+运行速度上已经达到了一个很好的平衡。

回到华为的这个方舟编译器上面,

  1. 现在的 Android 是边解释边执行的吗?可以说是,也可以说不是。上面我已经提到了,现在的 Android 是 解释执行 + 还算可以的JIT + AOT 的模式。并且,你也可以手动把应用的代码全部提前编译达到完全 AOT 的效果(很多答案里面提到的 AOT 就是说的这种);不过这属于开倒车,Google 肯定不会这么做。这样做效果有多大呢?这个我有发言权。之前在支付宝做性能优化的时候,我干过这么一回事:让应用在后台运行的时候请求系统直接采用 everything 模式编译支付宝,本地测试启动速度有爆炸性提升(30%~50%);但是灰度测试的时候效果不明显,为什么呢?其一是后台全编译运行成功率低,其二是系统的 JIT + 后台 AOT 不是吃素的;考虑到耗电/占空间的问题压根没上线。所以如果华为只是简单地用这种方式去避免所谓的「边解释边执行」那就相当滴 low,但是按照 GPU Turbo这种黑科技来看,我觉得不太可能是这个。
  2. 除了 Android 系统的这种 AOT 之外,难道没有别的办法了吗?我不负责任地猜测一下,方舟编译器是不是在Android 应用打包成APK的时候,直接把 Java 代码编译为了机器码?注意这个跟Android系统的那个 AOT 是不样的,系统是在应用安装或者系统空闲的时候做编译;这种方式你下载到的安装包就是编译好的了,不需要系统动手。

如果是第一种,辣鸡华为。如果是第二种,吊炸天!!!当然还有别的可能,不管咋样,静待开源 :)

程序员必须掌握的常用算法正如 @力扣(LeetCode)所讲,主要包括以下内容:

算法:

1、排序算法:快速排序、归并排序、计数排序
2、搜索算法:回溯、递归、剪枝
3、图论:最短路径、最小生成树、网络流建模
4、动态规划:背包问题、最长子序列、计数问题
5、基础技巧:分治、倍增、二分法、贪心算法

数据结构:

1、数组和链表
2、栈与队列
3、树和图
4、哈希表
5、大/小跟堆,可并堆
6、字符串:字典树、后缀树

还可以在此基础上细分,例如单单排序算法就可以分为以下十种:

对于学习算法,我推荐在力扣上刷题:

力扣 (LeetCode) 官网 - 全球极客挚爱的技术成长平台

此外,推荐一个用动画的形式演示 LeetCode 上的题目的项目:

github.com/MisterBooo/L

例如基础的冒泡排序法演示如下:

选择排序法:

插入排序法:

希尔排序法:

归并排序法:

快速排序法:

堆排序:

计数排序:

桶排序:

基数排序:

该项目正在完善中,已经用动画的形式演示出了一下题目:

因为知乎排版没有表格,所以我就截图了,以上内容详见:

MisterBooo/LeetCodeAnimation

此外,再推荐一些免费的学习资源:

在学习的时候,要想为什么要这样设计,优点在哪里,有什么改进方法,逐步通过这样的方式提升逻辑思维能力。不懂就查,找学习资料和相关解答,坚持学习。

1. 算法学习 LintCode:lintcode.com/

算法学习网站,上去每天刷两道算法题,走遍天下都不怕。

2. 算法学习 LeetCode:leetcode.com/

也是算法题网站,同上。

3. 算法学习 LeetCode 中文站:leetcode-cn.com/

这个是上面算法题网站的中文站点,英文不好的可以刷这个,英文好的推荐去刷英文网站的题目,还能提升英语能力。

4. 中国大学MOOC网:icourse163.org/

中国大学MOOC是由网易与高教社携手推出的在线教育平台,承接教育部国家精品开放课程任务,向大众提供中国知名高校的MOOC课程。在这里,每一个有意愿提升自己的人都可以免费获得更优质的高等教育。

我是程序员客栈,中国领先的程序员自由工作平台,技术新人力解决方案。

央视天气预报主持人宋英杰在其微博中说,他的儿子、年仅4岁的小豆包,近来行为举止异常,竟然在一次临睡前与其聊天时说:

“我的老家在四川,就在成都西边一点点。我的两个女儿还在那儿,一个15,一个10岁了。我已经好久没有见到她们了,可能可能快认不出来了。我想去四川看她们,然后再回来。我和四川都是中国不可分割的一部分。

说完这些话,他就睡着了,我却陷入了深深的遐想……”

原微博截图如下:

微博发出后,一石激起亿层浪。有人表示很有可能,并举出类似例子;也有人表示有些怀疑,认为是不是小豆包近日看多了纪念汶川抗震救灾的新闻,所以才会有意无意地出现这些言行?

然而,宋英杰在微博中予以否定,他说,儿子”这些天就没看新闻“,宋还感叹:“有点吓到我了。我又想起一位朋友对我说的话:看豆包的眼神,一看就是老灵魂。”

宋还在微博中讲了小豆包的另外一些奇怪现象:“关键他说在成都西边,然后我说雅安,他说不是;都江堰?不是;我就帮着数,最后说北川?他说是。所以吓到我了。虽然之前也跟我翻地图书,但从来没聊过县级地名。他说离开老家十年了,可是他根本就从未听说过汶川地震这个词汇,而且也不看电视。”

宋和网友在微博上的对话:

当然,按照套路,这些消息会附带几个所谓转世的故事,比如:北宋名人黄庭坚的前世,居然是个女人!印度少女轮回再生,灵魂依然存有前世记忆~~然后,再加上佛教关于“轮回”的说法,最后给出一个结论:我们不知道的事物,并不代表不存在!

然后想,难道这个主持人是文科生?于是上网查了一下,宋老师于1984年考入南京气象学院天气动力专业,毕业后被分配到中央气象台从事预报工作。

妥妥的理科生啊?能进央视工作,大学也应该是没有白混吧

再看看宋老师的年龄,65年1月出生,今年也满53周岁了,这个年龄也不小了啊!儿子4岁,怎么回事?于是八卦了一下,原来宋老师比他妻子大12岁,1995年的时候,宋老师去北京气象学院参加40周年校庆,两人相识,宋老师的妻子当时是大学生,2000年两人结婚。算起来,宋老师也是中年得子。

按理说,一个53岁,理科男,应该比较成熟稳重了,不至于像小网红一样搞些低智商的噱头来博人眼球,就为了微博吸粉。

何况宋老师在央视工作,太不严肃,恐怕给领导留个不好的印象,也影响自己退休时的行政级别啊!

当然,我非常同意一个观点,现代科学还有无数解释不了的现象。人类的认知水平,目前还非常有限。微观世界,宏观世界,都仅仅认知了极少的规律。尤其是引力波的发现,让民间也掀起了学习物理学的高潮。霍金的去世,导致他生前写过的科普读物《时间简史》《果壳里的宇宙》《大设计》一度热卖断货,尽管九成的人买来其实也就是装点书架。但,好像引力波或者霍金的理论,没有关于灵魂和转世的研究吧!

那就说转世吧!顺便问问宋老师,麻烦你问问你家小豆包,他前世叫啥名字?咱去查查北川遇难者中有这个名字没有?再问问他前世的儿女、老婆,村里村长都叫啥名字?

汶川地震都过去10年了,按照港台鬼片的节奏,这孤魂游荡了6年多才落入凡人胎里,这尼玛时间也太久了吧!魂不但没散掉,还跑到几千里外的北京城!这尼玛得有多深厚法力的高僧,念多久的经,才能把这魂聚拢6年而不散,九九八十一天够不?法海老湿有这等功力没有

我最早看到印度人转世的故事,是当年上大学的时候,在火车站的地摊报刊上看到的,现在地摊报刊也升级了,都改朋友圈传播了,前前后后传了都几十年了吧!印度那么多高智商的学生在美国普林斯顿、斯坦福、耶鲁大学读书,在硅谷当高管的,难不成都是一帮SB?证实一个转世的例子,妥妥的诺贝儿奖啊!!天下闻名的宝莱坞再拍部纪录片,顺带把奥斯卡金像奖也抱走哇!!然后印度政府成立一个转世神童公司,老老少少的神童一锅烩,全球巡回演出,印度GDP绝对2年超中,3年赶美呀!!

蛋扯远了不好,话说回来,也许我们对央视大裤衩过度仰视了,角度绝对超过黄金45°。你想想,当年人民日报报道过亩产10万斤,90年代的时候,青年报报道过下岗工人把水变成油,央视老大哥,那就更牛了,所以,在这样的环境中生存了快30年,你懂的~~连小崔都抑郁了,还有神马不可能呢!!

随后,看到一个说法,无法辨别真假,还是贴出来,如果是假的,请大家留言更正:

对于如此奇妙的玄像,宋老师的夫人(毕业于北京气象学院计算机系)解释是:

第一:豆包2岁就和爸爸学习地理,知道中国的每个省名;

第二:我家阿姨是重庆人,豆包知道四川在重庆边上,他说是四川我觉得也很正常。

第三:他刚有个小妹妹,见证了妹妹的出生,他想象自己有女儿,也只是想象力吧,我觉得四岁小孩有虚拟的朋友,有想象故事都是正常范围,只是他爸爸和他聊天比较少而已。

总而言之,原因是这样的:

❶ 豆包同学的地理学的早,家里阿姨是重庆的,会聊到四川,所以对那边的具体地名比较了解。

❷ 豆包同学正处于想象力很丰富的年龄,会想像出虚拟的朋友。

好了,这个事就此打住,重申一下观点:

科学也是一种思维方式,更是一种精神。

佛教是信仰,值得尊重,但绝不是迷信和港片中的神神鬼鬼。

常年待在不说真话的环境,脑子不坏品德就会坏。

蜉蝣(寿命只有一天)认识了蚂蚱,他们玩的很开心,蚂蚱该回家了,说,我们明天见。蜉蝣吃了一惊,还有明天?!

蚂蚱认识了青蛙,他们玩到了秋天,青蛙说,我该找地方冬眠了,我们明年见。蚂蚱很吃惊,还有明年?!

有人说,咱们下辈子还做朋友。我们很吃惊,还有下辈子?!

有没有前世来生,我也不知道,我不敢说有或没有,只能说我见识浅薄。

小时候太贪玩惹祸,老爸经常打我,大概七岁的时候,有一天中午大家都午睡了,我一个人无聊去老屋子玩,在土炕夹缝里面发现了爷爷的日记,看了一下午之后,接近晚饭的时候,老爸来找我,很生气的样子,可能是一下午不见人影,以为我被人拐跑了。当时我很害怕,摸了摸还隐隐作痛的屁股,心一横,突然就豁出去了,模仿着隔壁赵大爷的神态语气语重心长跟老爸聊了聊,聊了一些关于他小时候的事,他一开始不信还作势要打我,我一摆手挡住,很生气的训斥他,说你现在当老子了可以骑我头上了是吧,亏你小时候我逢集给你带包子吃,然后说了他六岁那年掉到粪坑的事,我爸当时就震惊了,很难想象一个三十多岁的糙汉子,蹲在地上拉着我的手哭着跟我说了奇怪的话,我只好一脸慈爱的看着他,尽量忍着不笑出来,笑出来就死了。爷爷去世的早,不知道为啥那天之后老爸就对我超好。后来他试探着问我那天的事,我都假装不记得。我爷爷的日记也让我给扔了,怕被我爸看见。

不 BB,直接上干货,非科班出生,毕业工作后才开始学算法,到目前学了 4 年 !!!

为了让你对数据结构和算法能有个全面的认识,我画了一张图,里面几乎涵盖了所有数据结构和算法书籍中都会讲到的知识点。

这里面有10个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;10个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。

掌握了这些基础的数据结构和算法,再学更加复杂的数据结构和算法,就会非常容易、非常快。

这里也给大家推荐一个特别适合新手免费刷题的网站

牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网

如果觉得不错,别忘了双击点个赞哦。

在这里也送大家一本帮助我拿到BAT 等一线大厂 offer 的算法笔记,是一位阿里大神写的,对于算法薄弱或者需要提高的同学都十分受用,算法一定是计算机学习的重中之重:

BAT大佬写的Leetcode刷题笔记,看完秒杀80%的算法题!

貌似手机端打开连接有的会出现问题,可以点击这个总结看看:

五分钟学算法:算法与数据结构文章详细分类与整理!-五分钟学算法

这里补充一下,无论是学习算法还是学习编程的任何一个技术点,想要得到提升,最好的一个方法就是去阅读,阅读优秀牛人的分享,目前主流的程序员习惯阅读的博客网站中,掘金社区属于质量不错的一个,内容包括前端、后端、Android、iOS、人工智能等等,各个方向,各个技术点都有,C++程序员需要的知识都能找到。

喜欢在掘金社区阅读的小伙伴可以通过下方链接了解。

看动画轻松理解时间复杂度(一)

看动画轻松理解时间复杂度(二)

冰与火之歌:「时间」与「空间」复杂度

每个程序员都应该收藏的算法复杂度速查表

五分钟了解一下什么是「贪心算法 」

有了四步解题法模板,再也不害怕动态规划!

(进阶版)有了四步解题法模板,再也不害怕动态规划!

(再进阶版)有了四步解题法模板,再也不害怕动态规划!

浅谈什么是分治算法

看动画轻松理解「递归」与「动态规划」

浅谈什么是动态规划以及相关的「股票」算法题

深度解析「正则表达式匹配」:从暴力解法到动态规划

「多图警告」手撕排序算法 – iOS进阶必备

十大经典排序算法动画与解析,看我就够了!(配代码完全版)

这或许是东半球分析十大排序算法最好的一篇文章

几道和「广度优先搜索」有关的算法面试题

初识广度优先搜索与解题套路

从简单二叉树问题重新来看深度优先搜索

二分查找算法详解

一网打尽!二分查找解题模版与题型全面解析

面试官,我会写二分查找法!对,没有 bug 的那种!

动画:BM 算法中的坏字符规则与好后缀规则

动画:七分钟理解什么是KMP算法

动画:什么是 BF 算法 ?

动态规划之 KMP 算法详解(配代码版)

如何高效对有序数组/链表去重?

超详细!详解一道高频算法题:数组中的第 K 个最大元素

一道简单的数组遍历题,加上四个条件后感觉无从下手

数组特性的妙用!如何找到「缺失的第一个正数」

剑指 offer 第一题:二维数组中的查找

动画:什么是单调栈?

在数据结构中穿针引线:链表实现栈和队列

从简单的线性数据结构开始:栈与队列

五分钟学算法小知识:用栈实现队列/用队列实现栈

几道和「堆栈、队列」有关的面试算法题

超详细!图解「合并 K 个排序链表」

动画:面试如何轻松手写链表?

LeetCode 上最难的链表算法题,没有之一!

链表算法面试问题?看我就够了!

看动画轻松理解「链表」实现「LRU缓存淘汰算法」

从简单的线性数据结构开始:穿针引线的链表(一)

在数据结构中穿针引线:链表实现栈和队列

五分钟速读:什么是散列表(哈希表)?

什么是哈希洪水攻击(Hash-Flooding Attack)?

几道和散列(哈希)表有关的面试题

如何判断一个元素在亿级数据中是否存在?

面试前准备:二叉树高频面试题和答案

懵逼树上懵逼果:学习二分搜索树

LeetCode 二叉树问题小总结

从简单二叉树问题重新来看深度优先搜索

几道和「二叉树」有关的算法面试题

详解什么是平衡二叉树(AVL)(修订补充版)

【面试现场】为什么 MySQL 数据库要用B+树存储索引?

字典树概念与题型解析

面试官:为什么 MySQL 的索引要使用 B+ 树,而不是其它树?比如 B 树?

心里没点 B 树。。。

数据结构与算法——最小生成树

植树节,程序猿种的那些树

数据结构与算法——2-3-4树

数据结构与算法——2-3树

看动画轻松理解「Trie树」

浅谈什么是图拓扑排序

数据结构与算法——图论基础与图存储结构

数据结构与算法:三十张图弄懂「图的两种遍历方式」

数据结构与算法——图最短路径

学习数据结构和算法的过程,是非常好的思维训练的过程,所以,千万不要被动地记忆,要多辩证地思考,多问为什么。

如果你一直这么坚持做,你会发现,等你学完之后,写代码的时候就会不由自主地考虑到很多性能方面的事情,时间复杂度、空间复杂度非常高的垃圾代码出现的次数就会越来越少。

你的编程内功就真正得到了修炼。


2020 年 01 月 13 日补充:

入门的同学,我建议你不要过度追求上去就看经典书。

不要一来就拿着《算法导论》开始啃,初学就去啃这些书肯定会很费劲。你一旦啃不下来,挫败感就会很强。

然后就放弃学算法了。

所以,入门的同学,我建议你找一些比较容易看的书来看,比如《大话数据结构》和《算法图解》。

不要太在意书写得深浅,重要的是能不能坚持看完。

《大话数据结构》 这本书最大的特点是,它把理论讲得很有趣,不枯燥。而且每个数据结构和算法,作者都结合生活中的例子进行了讲解, 能让你有非常直观的感受。

虽然这本书有 400 多页,但是花两天时间读完,应该是没问题的。

如果你之前完全不懂数据结构和算法,可以先从这本书看起。

《算法图解》 跟《大话数据结构》走的是同样的路线,就像这本书副标题写的那样,“像小说一样有趣的算法入门书”,主打“图解”,通俗易懂。它只有不到 200 页,所以内容比较少。

作为入门,看看这本书,能让你对数据结构和算法有个大概的认识。

当然,这些入门书共同的问题是,缺少细节,不够系统,也不够严谨。

所以,如果你想要系统地学数据结构和算法,看这两本书肯定是不够的。

通过基本入门算法书的调教,你已经逐渐体会到了算法的魅力,现在正是时候踏入基础系列算法的领域!!!

这些书籍需要你费点心思去阅读。

很多同学在学习的过程中,看到一篇算法科普文章经常会有这样的想法。

哎呀,要是文章的代码是 Java 语言就好了呀。

哎呀,要是文章的代码是 Python 语言就好了呀。

虽然代码并不会很严重影响阅读,但还是有很多强迫症的同学喜欢看到文章的解释代码是自己擅长的。

我这里推荐《数据结构和算法分析》,这本书非常系统、全面、严谨,而且又不是特别难,适合对数据结构和算法有些了解,并且掌握了至少一门编程语言的同学。而且,这个作者也很用心。

他用了三种语言,写了三个版本,分别是:《数据结构与算法分析 :C 语言描述》《数据结构与算法分析:C++ 描述》《数据结构与算法分析:Java 语言描述》。

大家都知道,对于程序员来说很大程度上算法就是为了应付面试的。

所以,推荐三本有益于面试的书籍,分别是:《剑指 offer》《编程珠玑》《编程之美》。

《剑指 offer》这本书的目的非常明确,就是为了面试。

这本书几乎包含了所有常见的、经典的面试题。如果能搞懂这本书里的内容,应付一般公司的面试应该不成问题。

面试之前也可以去牛客看看笔面经,知己知彼百战不殆!

我做了一个 图解《剑指 offer》的小程序,应该能帮助你学习,感兴趣的可以在微信搜索 图解剑指offer。

我也在 B 站录制了一些图解剑指 offer 的免费视频课程,感兴趣的也可以看看,每个视频控制在5分钟以内。

图解剑指offer:二维数组的查找_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili「双指针」的魅力!图解 LeetCode 第 11 号问题:盛最多水的容器_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili剑指offer精讲图解面试题03. 数组中重复的数字_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliLeetCode 图解 | 739.每日温度_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili

《编程珠玑》这本书的豆瓣评分非常高,有 9 分。

这本书最大的特色就是讲了很多针对海量数据的处理技巧。这个可能是其他算法书籍很少涉及的。面试的时候,海量数据处理的问题也是经常会问的,特别是校招面试。不管是开拓眼界,还是应付面试,这本书都很值得一看。

《编程之美》这本书有多位作者,其中绝大部分是微软的工程师,所以书的质量很有保证。不过,这里面的算法题目稍微有点难,也不是很系统,这也是我把它归到面试这一部分的原因。如果你有一定基础,也喜欢钻研些算法问题,或者要面试 Google、Facebook 这样的公司,可以拿这本书里的题,先来自测一下。


正如 N.Wirth 教授所说的: 数据结构+ 算法=程序

遇到一个实际问题,充分利用所学的数据结构,将数据及其之间的关系有效地存储在计算机中,然后选择合适的算法策略,并用程序高效实现。

这句话可能有点抽象,我举个例子给你们解释一下

在工作过程中,我们多多少少都接触过 OAuth2 ,在使用 OAuth2 授权的时候,通常应用会弹出一个类似这样的信息:

1) 获取用户基本信息接口

2) 获取用户列表接口

3) 用户分组管理接口

。。。

微信获取授权

思考一下,如果让你设计数据库,应该怎么设计信息存储权限?

如何你熟练掌握了各种数据结构的特点的话,那自然而然想到使用 bitmap 来存储权限。

我们把权限划分成最小粒度之后,每一个 bit 都它的含义, 例如我们把权限划分为以下几种:

  • 获取你的头像、性别、昵称等基本用户信息
  • 以你的身份发布微博
  • 获取你的好友列表
  • 获取你的朋友圈信息

每勾选一个选项,就代表着这个权限被授权,为了保证可扩展性,我们使用一个 uint64 来保存这些 bit ,也就是说,我们一共可以划分 64 种细分权限,然后对这些权限进行组合。

例如,第一个 bit 如果设置了,那么就代表可以获取你的昵称、头像、地区、性别等基本用户信息, 第二个 bit 如果设置了,就可以用你的身份发状态。

数据结构的实际作用还有挺多,感兴趣的可以搜索以下知识点:

  1. 二叉树搜索用于中断处理、登记缓存查找等
  2. 哈希表,用于实现索引节点、文件系统完整性检查等
  3. 红黑树用于调度、虚拟内存管理、跟踪文件描述符和目录条目等
  4. Radix树,用于内存管理、NFS相关查找和网络相关的功能
  5. ......

上面这些例子是关于数据结构的,我再举一个算法的例子,如果有帮助,不妨点个赞收藏一下,好的内容值得肯定。

同样的也来思考一个问题:计算机的缓存容量无论再大,缓存满了还是要删除一些内容,给新内容腾位置。

那么删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。那么,什么样的数据,我们判定为「有用的」的数据呢?

这个时候采取的策略就是 LRU 缓存淘汰算法

LRU 的全称是 Least Recently Used,也就是说我们认为最近使用过的数据应该是是「有用的」,很久都没用过的数据应该是无用的,内存满了就优先删那些很久没用过的数据。

具体的关于 LRU 缓存淘汰算法 的介绍可以看我之前写的一篇文章。

补充:

为了避免知乎大佬觉得我吹逼,先贴一下自己的 GitHub 地址,目前 70,000 star,全球排名 51 名。

github.com/MisterBooo

算法是一种技能,是可以通过科学合理的方式训练出来的能力。

在想刷题之前,得从心里认识到接受刷题很重要,才能坚持去刷题。

江湖有个传言:国内刷 LeetCode,最多够你吃 1 年老本;湾区刷 LeetCode ,够你吃 10 年老本了。

为什么湾区的刷题性价比这么高呢?

你想想,电面考 4 道题,一道题值 5 万!单位是 Dollar !

刷到就是赚到!!

想想是不是很刺激,有没有动力开始刷题了!可以提速刷题了!

就目前互联网的情况来说,无论是面国外大厂还是面国内大厂,如果想换工作都要去刷题,一面二面不丢你几道 Hard 题,都对不住你偷偷摸摸找个会议室假装开会实则面试的鸡贼。

同时,还得认识到一点,面试能力和你平时的工作能力其实差别挺大的。

有些人技术挺厉害的,但没有刷题,一面二面都过不了,而某些小镇刷题家,还真就靠刷题拿下了 Google、微软、脸书等大厂offer。

国内大厂也有这种趋势,比如字节,一大半都是面试题。

要不是他提前先看视频刷题,妥妥得凉凉。

所以,刷题很重要。

(PS:感谢大家耐心的阅读,算法是程序员的重中之重,必须攻克,大厂面试必考,顺便送一份阿里大佬刷Leetcode总结的算法笔记,如果你能吃透,那我相信80%的技术面试都会不在话下:

BAT大佬写的Leetcode刷题笔记,看完秒杀80%的算法题!

这本书的目录,非常经典:

刷题大概可以分为 4 个阶段。

1、纯小白,不知道怎么刷题,对很多概念都很陌生,各种数据结构和知识点几乎完全不懂,打开 LeetCode 第一题,满头问号。

有人相爱、有人夜里开车看海、有人 LeetCode 第一题都做不出来。

2、算法上基本已经入门,Easy 可以做出来,Medium 纠结半天也能有头绪,但基础不牢,比如字符转字符串还得 Google 一下。

3、刷了几百道题后,总结了自己的解题模板,参加周赛有时候甚至可以全部完成。

4、开始以 beat 100% 作为 AC 的目标了。

就目前的算法面试大环境来说,能达到第二阶段,中小公司可以应付过去了,到达第三阶段,字节、腾讯算法面试环节妥妥没问题了。

怎么样到达第三阶段?

给一下我的一些小建议吧。

1、如果目标是国内大厂,那么一定要刷足够的题,不需要把 LeetCode 上 2500 道算法题都刷完,但至少刷 200 道算法高频题,这些高频题我都写了题解同时也录制了视频,

在这个链接总结了:algomooc.com/1659.html

2、面试前一周以看题为主,因为刷题也刷不了几题,多看看自己总结或者别人总结的模板,比如回溯算法模板,掌握后,几十道回溯题都不在话下。

一些模板:

回溯,不难!

3、刷题过程需要注意难度要循序渐进,算法训练是一个系统工程,需要循序渐进,太过于急功近利,反而容易因做不出难题而产生挫败感,带来反效果。

如果你本身有基础,熟练度高,那你刷简单的 LeetCode 应该是几分钟一题,几分钟一题的,花不了你多少时间。

如果你刷简单都花费很长时间,说明熟练度不够,就更应该从简单开始,然后过度到中等,再过度到困难。

并且,目前国内大厂的算法考察,基本不会超过 LeetCode 中等难度,上限难度基本都是 LeetCode 中等题里面的中等难度,所以不要太去纠结难题怪题偏题。

把高频题掌握就行了:algomooc.com/1659.html

再退一步,如果你觉得 LeetCode 的题目太难,可以先从《剑指 Offer》上的算法题开始学起。

为了帮助大家更好的入门学习算法,经过半年的积累,我给大家了《剑指 Offer》系列的三十道题目,结合动画的形式录制了视频,相信能帮助你更好的刷题。

领取地址:

当《剑指 Offer》上的题都变成了动画

4、按算法分类来选题,比如一个时间段,只刷链表题,刷得差不多的时候,接下来再刷二叉树的题。

这样做有几个很明显的好处。

一、持续地刷同个类型的题目,可以不断地巩固和加深理解,可以总结出自己的思考路径或者解题模板。

比如链表题目,就会去思考虚拟头节点、双指针、快慢指针。

二、可以更全面地接触这个数据结构,算法的各个变种,这会促使你对这个数据结构,算法的理解更加全面和深刻,学习的效率会更高。

我一直认为读书是世界上性价比最高的成长方式,书很便宜但分量很重,是让我们摆脱平庸走向卓越的方式之一。

对于计算机专业的学生而言,读计算机经典书籍不光能让你快速提升知识和能力,更会让你在校招之际如虎添翼。

书籍下载:计算机必看经典书籍(含下载方式)

下面这是一个高赞回答合集,建议大家点赞&收藏,Mark住别丢了,大学期间绝对用得上

1、怎么学好数据结构,看下面这个回答,已经获得了 21000+ 的赞和 50000+的收藏。

怎么学好数据结构?2.2 万赞同 · 349 评论回答

2、如何系统地学习算法,看下面这个回答,已经获得了 11000+ 的赞和 26000+的收藏。

如何系统地学习算法?1.1 万赞同 · 97 评论回答

3、新手该如何使用 GitHub,看下面这个回答,如果在大学期间就知道使用 GitHub ,那么能力远超同龄人。

新手该如何使用 GitHub?7704 赞同 · 87 评论回答

4、想成为一名优秀的程序员,那么这些程序员平时都喜欢逛的论坛怎么说你也得收藏一些吧。

程序员们平时都喜欢逛什么论坛呢?4177 赞同 · 119 评论回答

5、无论别人怎么说,我都是坚定不移的选择计算机专业。

为什么有人劝别选计算机专业?3493 赞同 · 319 评论回答

6、如何系统地学习 C++ ,这个回答能帮你找到路线。

如何系统地学习 C++ 语言?2109 赞同 · 19 评论回答

7、想要准备 Java 面试,那么这些面试题必须掌握。

Java 面试都只是背答案吗?884 赞同 · 13 评论回答

赶紧点赞和收藏吧~

微弱?

给你讲个故事。

当年,中文输入是个极大的难题。

这个难题有两个解决思路:

一是五笔字型,搞一套很难记的规则,给所有汉字一个不重复的编码。这个办法输入速度非常快,但只有专业打字员用,需要很多练习;

二是拼音输入,计算机显示所有同音字,用户选择自己需要的那一个——计算机甚至能自动调整字频,把常用字词显示在最前。

但无论如何折腾,拼音输入的重码率都太高了,需要不断的选择同音字,因此输入速度怎么都上不去。所以只有业余玩家用它,唯一的好处就是不用刻意学,上过小学会拼音就会打字。

总之,当时,你到大街上随便找一家“电脑培训班”,它的重要业务之一就是教你五笔输入法。

那么,能不能进一步提高拼音输入的速度,让人不需要专门训练就会打字呢?

可以。词组输入。就是每次不是只输入一个字,而是输入一个词。

相对于同音字,同音词就少多了,输入速度自然增加。

为了吻合到更多词,当时国内的输入法公司,包括微软、包括紫光拼音,走的都是“疯狂搜罗更多的词汇”乃至“区分不同领域的专业词汇”以及动态调整词频的路子——换句话说,走的是词输入这条路。

但,对于句子中的单字,这个办法仍然无法提高速度。

后来,国内一家公司来了个大力出奇迹:它把一切能搞到的中文资料,从报刊到小说,所有的句子都录入计算机。

现在,你只要一次连续输入整个句子,它就能自动帮你匹配到某一句现成话——或者,匹配半句话也可以很好的提高输入速度。

为了准确匹配,这家公司的输入法带了个巨大的词库——在当年主流硬盘容量只有20G、Windows安装后不到1G的时代,这个输入法的词库超过了300M!

这个输入法较好的解决了拼音输入速度的问题;但缺点是,如果你说的话,之前没有人说过,那就又回到了解放前。

而且,它的词库实在太太太太大了——还得付费!

不掏钱,你就只有一个二三十兆的小词库用,整句输入就大打折扣了。

也有高校做其他方面的探索。比如,自动分析句子结构,主谓宾定状补,然后计算机选择符合语法的句子,这个句子……大概就是你要说的话了?

但这个分析非常难,效果也很差。

事实上,当时的这个领域,全世界都还处于探索阶段,根本就没有可用的产品

总之,当时,国内大大小小二三十家输入法公司,没人能解决这个问题;其中最令人耳目一新的,还就是那个大力出奇迹的“智能狂拼”……

智能狂拼是当时国内唯一可以有效输入长句的拼音输入法;包括微软输入法(12年它才和哈工大合作,之后整句输入才慢慢跟上),在当时几乎没人用,闪退太多(可能原因是微软炫技,非要把待输入文字显示在文档里面、以下方虚线和正式文字区分:这的确很酷,但经常在移动光标时崩溃、导致文字处理软件跟着闪退。别说它没有整句输入能力,就是有,凭这闪退的劲儿,我也不敢用它)。相比之下,还是紫光拼音更稳定一些,是当时我的首选(本来首选是智能狂拼,但早期安装包我没保留,之后就成付费软件了)。但它们都是词组输入法(紫光拼音到现在都只能词组输入,不支持整句输入)——真正想快、想整句输入,就只有智能狂拼一家。

但智能狂拼的语料库实在太大也太贵了……

就在这时,google搞了个google输入法。

这个输入法基于马尔科夫链原理:假设第一个字是什么,那么它后面跟读音为输入内容的另一个字的概率是多少、然后第二个字后面跟第三个字的概率是多少……

最终,机器自动计算出一个“所有字出现概率最大”的文字序列出来,提示给用户——这个序列,往往就是用户想要输入的句子。

实际上,google刚开始把这个链搞到了六阶。也就是第一个字是什么后面是某字的概率叫一阶,那么第一到五个字是什么、第六个字后面是某字的概率叫六阶。

显然的,阶数越多,词库就越庞大;而google发现,只需二阶马尔科夫链,计算机自动选取的语句符合用户心意的概率就足够高了。

所以,最终,它的第一版带的语料库就非常小,但表现却非常精准。

换句话说,和智能狂拼一样,google收集了海量的中文语料;但和智能狂拼不一样,google在语料库上面应用了统计学,借助概率实现提示。

如此一来,google的词库只需几兆、至多一二十兆大;但提示正确率却远超智能狂拼——而且,它还不限定你必须说前人说过的话,而是允许你灵活造句。因为它统计的是一个字后面跟另一个字的概率,并不是“和哪句前人说出的话重叠”。

更有趣的是,Google输入法不光是完全免费的、还在不久后把整个技术原理公开出来,于是整个中文输入法的水平一下子提升了一大截——以至于这些年来,几乎没人从头学五笔输入法了。

事实上,和评论区一些热衷名利的低能儿鼓噪出来的魔幻历史不同,当时全世界各国的语言专家都在研究人类语言的计算机模型,但全都局限在传统的“语法”“词性”“变格”等等东西里面,以至于相关领域没有任何先例、更没有任何成品。

药店碧莲。

google是全球第一个彻底抛弃了传统语言模型、以纯数理统计搞人类语言的开创者。

之后,有人还基于类似原理,统计对联中上下联对应位置的字的出现概率,实现了“电脑对对联”甚至“电脑作诗”……

至于现在,全球语种的语音识别、不同语言的实时识别和翻译,google仍然是一枝独秀。

原因就在于,它是全球第一个把统计学扶持到语言学领域核心位置的先驱,也是第一个重新捡起已经凉掉好多年的神经网络并重建理论体系、成功拿它来下围棋、搞语音识别的公司。

正因为这个方面的积累,google的翻译服务至今都还被“特许访问”:

这是唯一一种无需技术手段、在大陆可以直接访问的google服务。

要点碧莲。

再讲一讲Google盗用搜狗词库这件事。

当时中国还是全民盗版时代。我们压根就没有版权意识。
智能狂拼这么好的输入法,最终其实就败在收费上——别人都是给你免费用(因为那时候我们就没有为软件付费的想法),就它,要你掏钱买词库。

我们那时候,包括各大企业、包括其他要害机关,几乎全都在公然使用盗版的Windows、office以及mssql数据库、vc5.0/6.0等等等等。

我那时服务过的公司,除了极个别较为讲究的,如HW,别的几乎都是全公司用盗版——当时的程序员普遍认为,只要网上能找到的,就可以用到我的计算机上、放进我的程序里面的。
亦因此,当时一些较大的公司, 内部往往会专门开发一种软件,要求所有员工安装在自己电脑上;这些软件会自动监控你电脑上的进程列表,一旦发现违规软件,公司马上就会追查、要求删除,严重违规的个人也会被警告甚至辞退,且需自己承担损失。

其中,违规软件主要就是盗版——你用盗版,公司就得赔。

但只靠这种软件也无法绝对阻止员工用盗版;所以公司还会不定期的安排人过去检查,以免有人有意无意违规,给公司造成损失——至今都记得,IT部负责人动不动发邮件,要求所有人运行“软件合规检查工具”、并把工具生成的报告作为邮件附件,回复给IT部门。

这个报告我打开看过,各公司都差不多。里面大概包含四大类软件。
一是公司给每个人购买了的正版软件,如Windows以及它自带的记事本画图等等。
报告会携带它的序列号,大概是为了检查有没有哪个脑子有坑的家伙把自带正版搞成盗版、给公司惹来麻烦(别笑,这类人在当时比比皆是;甚至哪怕现在,好好的预装正版Windows10不用,非要找电脑城伙计装成盗版win7都大有人在)。
二是需要部门/个人申请的、工作需要的商业软件,如sublime text等。这类软件出现在软件开发人员的电脑上是合规的;出在销售/采购或者其他人的电脑上,是违规的。
这类软件IT部留有申请记录,软件可以据此自动判断是否违规。
三是知名的常用开源或免费软件。这类软件经常是可以安装使用的,但理论上需要先和部门经理打个招呼。
四就是其他未知软件了。比如软件团队自己开发的新软件,工具不能识别,就可能也给标记出来、显示为黄色。

报告中,合规软件标记为绿色;可能不合规的显示为黄色,要求员工自己审查是否合规、自担风险;违规软件显示为红色,员工禁止安装红色违规软件,查出来问题就大了。
有的公司还会检查诸如网络嗅探工具、ARP欺骗工具等可能导致公司信息泄露的软件,这类软件也会标记为红色。


在这个背景下,Google输入法被人发现,它的词库抄袭了搜狗——里面发现了搜狗的识别词(一些根本不是词的文字组合,专门放在词库里面,追查有没有人盗用词库的)。

在当时,国内输入法公司也和其他一样,彼此抄袭成风,整天不是这个抄那个就是那个抄这个。结果没想到连google也黑化了。所以当时就引起了极大关注。

引起关注的原因是,Google等外企一向是非常守规矩的;因为一旦侵犯版权,在国外,必然被判处海量赔偿。而在中国,它们——尤其是微软——向来是进攻方,动不动就告这家公司侵权那家公司盗版。

现在,它自己犯事了。你猜我们看不看笑话?

很快,三天后,4月7号,Google就发言道歉了,只是形式不够正式;之后又按照搜狐要求,发布专门的***再次正式道歉:
再炒谷歌中文输入法抄袭事件:谷歌公开道歉了 – Blog Behind GFW
同时,有传闻说,盗用搜狗等输入法词库的是一名中国员工。

大概原因是,Google搞的是基于统计的整句输入法,它只有语料库,语料库只有“字与字偕同出现的概率”,根本没有任何词汇(或者说“词库”)。
这就使得,当用户按照过去的习惯、做词组输入时,会发现这款输入法词汇量极低、命中率极其糟糕。于是Google公司就安排任务,让这位程序员解决词组输入问题。
谁知,这位基于一贯思路,直接解析了其他公司的输入法词库、然后原样拷贝进去……

这个说法,当时业内认为可信度颇高。

之后,搜狐接受了道歉,没有采取进一步行动。
这是因为,在当时,版权诉讼非常难,旷日持久、劳民伤财——这是我们对付外国公司版权诉讼大棒的手段之一;但相应的,也使得我们自己彼此抄袭盗用时,只能在网上唇枪舌战一番,极少诉诸法律、要求赔偿。


注意,当时国内除了智能狂拼,就没人做整句输入。他们做的都是词组输入;技术要点是:
1、 更多的词汇
2、 词汇分类
专业用户有专门的专业词典——更多的词典反而会造成命中率下降,因此你搞化工的话,最好别导入IT词汇或者建筑业词汇,不然效果适得其反;
3、 动态造词
比如我所在行业有个词叫“鲁棒性”,词库没有,那我就把这三个音同时拼出来、然后选字;选完,输入法就把这个词录入词库(早期可能没有这么智能,需要用快捷键加入用户词库;后期大多玩整句输入了,也没法自动组词了;只有词组输入最兴盛时有这个)。
4、 动态调整词频
比如,jixu可能对应“继续”“急需”“积蓄”“几许”等词;哪个词出现在第一位、可以让用户直接敲空格输入呢?
如果输入法总能保证用户想要的词在最前面,那么输入效率自然就会高很多。
这时候,就有两种技术,可能同时使用:一是自动统计用户选哪个更多,基于最近最少使用原则淘汰不太热的词、把热词提前;二是允许用户手动指定哪个词应该更靠前。

你看,哪来的语料库。
有语料库的,第一个是智能狂拼,然后就是Google输入法。其他输入法还没有进入整句输入时代(微软输入法只有形,实质上仍然是词组输入,完全不是智能狂拼的对手)。

这些词组时代的输入法,它们就只有词库,根本没有什么“语料库”。

当然,语料库这个词出现的挺早;但它指的是海量的、来自报刊杂志或其他文件的电子文本,并不是分析后、标注了频率信息的“语言模型”。

事实上,通过一定的统计学算法,是完全可以自动从语料库中提取出各种词汇的——整句输入时代,这个技术是非常必要的。但遗憾的是,起码我经常用的微软输入法就做的非常差,基本不会自动把我经常敲的新词加进词库;而且,即使某个词被偶尔加入了,过不了几天往往也会丢失。

我能理解“看Google出丑”这种事有多好玩;但不要用屁股决定意识。

要点逼脸!


不说这种一下子影响一整个行业的大事件;我自己的工作中也曾遇到过一个简单问题,大概是根据不同策略计算用户的偏好指数,根据偏好指数帮用户自动选择商品。

我粗略的估计了一下不同因素的影响,随手给某个因素取了个对数;然后调整了一下值域,不同策略就是不同的系数(权值)乘以不同的因素的某个函数值、然后把所有的乘积加起来,这就可以给每个条目打分了。

这个东西做出来,测试团队马上发现我的程序表现的极其灵敏且符合预期,于是马上通过了。

之后,我接手了其他项目,这个项目就给别人接手维护了。

几个月后的某天,他们发现策略失效了。要么极其迟钝,怎么调都不切换;要么过度灵敏,差一丁点就在几个商品间猛跳……总之完全没有规律,怎么都达不到预期,只好过来找我。

我一看,计算分值的函数给改了,傻乎乎的就那么直接乘了系数然后加了起来。我就问谁改的?为什么要改?

一个同事就站出来,说是他改的。原因是,让他增加一种策略,他就去看需求,上面说让按一定权重计算几个因素的影响,累加出分值;然后他发现我做了很多莫名其妙的计算,觉得又浪费性能又看不出意义,就给改了……

我晕了:你就没看看这几个因素的物理意义吗?用户究竟对什么感兴趣?这个参数,它其实是用户真正感兴趣的另一个值的平方,算它的影响是不是应该先开方?这个因素,它其实相当于能量值,而用户心理上真正能区分的是能量值的对数,取个对数才符合用户心理预期……最后,为什么要给它们各自乘一个值?因为你要先估计它的值域,然后用这个系数把它们的值域调整到同一个区间;映射到同一区间之后,加权,累加,这样才能让每个因素按权值体现在总分中……但我们这个计算并不需要很精确,所以我把系数改成了2的幂,这会被自动优化为移位操作,耗时更少,但偏差不大,可以接受。所以最终我敲的公式是这样……这个我写注释里面了啊,你干嘛要改?

他听的两眼翻白,更晕乎了:越听越糊涂了……还是不明白为什么要这么算?而且我看你的注释和你的计算公式不一样啊?

我:几个因素的加权评分并不能随便乘个系数加起来。我的注释不是写清楚了吗?你得先把每个因素对用户的偏好的影响整理成一个正比例函数。我们的需求比较粗糙,不需要严格的正比例,粗略的像一条直线就行。然后,把每个因素对应的偏好值的值域调整到0到1之间,这样它们加起来才不会掩盖某个因素、或者过于凸出某个因素,才能让每个变化立竿见影的反映到“偏好指数”上……换一个说法,看我的注释,第一步,我们先把每个因素的取值和用户偏好值之间的关系搞成线性的;第二步,给它们统一到某个值域;第三步,加权,求和,算出综合评分……好了,列出公式了吧?当然,接下来的我没有写进注释,但做了多年软件工程师的应该都知道啊……这个公式太多浮点运算了,计算机处理起来很慢,所以,我们先全都给它弄成整数运算,喏,放大值域,从0到1放大到0到65535,放大值域就是同步增大这个系数……然后,我们不需要算的很精确,所以可以把系数就近取整到1024这样的二进制整数,方便编译器优化成移位……行了,我原来的公式是不是这个?现在再拿测试数据试试……效果对不对?

这位晕乎半天:……我回去再想想……有什么书讲这个吗?

我:哪有什么书。自己稍微动下脑子就弄出来了,还值得写到书上……

经理:你不知道意义就不要改啊……搞的大家焦头烂额的。都注意了,正常运行的东西,你们不懂就不要碰。真有个任务需要你动了,先问,看看有没有人知道为什么,不弄明白不要贸然动手。

这个案例实际上仅仅涉及了高中知识。但很遗憾,我看出来了,其实在场的除了经理,就没别的人能听懂……

而另一个更牛X的领域,Google的发家之作,著名的PageRank算法,实质上和这个是类似的思路——只是要把人家的思路顺下来,你得深刻理解线性代数……

谷歌背后的数学 (changhai.org)百度创始人李彦宏如何拥有搜索引擎核心技术的?为何世界上只有四个国家拥有搜索引擎核心技术?

计算机专业就是这样。你不懂,你感受不到,那么你随便怎么做都不会对;但你懂了,你闭着眼睛随便敲,敲出来的公式就是能解决问题——不懂的人永远不会知道自己错在哪里、错过了什么。

只有光头才能变强

这个学期开了Linux的课程了,授课的老师也是比较负责任的一位。总的来说也算是比较系统地学习了一下Linux了~~~

本文章主要是总结Linux的基础操作以及一些简单的概念~如果不熟悉的同学可下个Linux来玩玩(或者去买一个服务器玩玩【学生版的不是很贵】),对于开发者来说,能使用Linux做一些基本的操作是必要的!

那么接下来就开始吧,当然了我的Linux仅仅是入门水平,如果有错的地方还需请大家多多包涵,并不吝在评论区指出错误~

相信大部分人的PC端都是用Windows系统的,那我们为什么要学习Linux这个操作系统呢???Windows图形化界面做得这么好,日常基本使用的话,学习成本几乎为零。

而Linux不一样,可能刚接触Linux的人会认为:Linux好麻烦哦,不好玩,都是字符界面。不直观、这个破系统是用来干嘛的~~

日常用的话Windows是比较顺手的,但是我们要知道的是:我们开发出来的程序一般都是放在Linux下运行的。

那可能就会有人提出疑问了:Windows同样是操作系统,为啥要放在Linux下,而不放在Windows下呢??相信Windows也是可以运行我们写出来的程序的。

我总结了Linux的几个优点

  1. 免费
  2. 很多软件原生是在Linux下运行的,庞大的社区支持,生态环境好
  3. 开源,可被定制,开放,多用户的网络操作系统
  4. 相对安全稳定

参考资料:

  • www.zhihu.com/question/19…

所以开发者选择了Linux来跑我们自己写出来的程序。

Linux系统的组成

  1. linux内核(linus 团队管理)
  2. shell:用户与内核交互的接口
  3. 文件系统:ext3、ext4等。windows 有 fat32 、ntfs
  4. 第三方应用软件

除了Shell、其他的都应该挺好懂的,那么Shell是什么东西呢???

Shell是系统的用户界面,提供了 用户与内核进行交互操作的一种接口(命令解释器)

Shell可以执行:

  • 内部命令
  • 应用程序
  • shell脚本

使用type命令可以区分内部命令和外部命令

于是乎,我们利用Shell就可以干下面这些事了:

  • 命令行解释(这是用得最多的!)
  • 命令的多种执行顺序
  • 通配符( wild-card characters )
  • 命令补全、别名机制、命令历史
  • I/O重定向( Input/output redirection )
  • 管道( pipes )
  • 命令替换( 或$( ) )
  • Shell编程语言( Shell Script )

Shell的主要版本有以下这么多:

  • 我们常用(默认)的就是bash(bourne again shell)

使用ps命令观察正在执行的shell

在Windows下,会有基本的目录结构的:

Linux下也不例外了,也是有基本的目录结构的:

Linux 文件系统是一个目录树的结构,文件系统结构从一个根目录开始,根目录下可以有任意多个文件和子目录,子目录中又可以有任意多个文件和子目录

  • bin 存放二进制可执行文件(ls,cat,mkdir等)
  • boot 存放用于系统引导时使用的各种文件
  • dev 用于存放设备文件
  • etc 存放系统配置文件
  • home 存放所有用户文件的根目录
  • lib 存放跟文件系统中的程序运行所需要的共享库及内核模块
  • mnt 系统管理员安装临时文件系统的安装点
  • opt 额外安装的可选应用程序包所放置的位置
  • proc 虚拟文件系统,存放当前内存的映射
  • root 超级用户目录
  • sbin 存放二进制可执行文件,只有root才能访问
  • tmp 用于存放各种临时文件
  • usr 用于存放系统应用程序,比较重要的目录/usr/local 本地管理员软件安装目录
  • var 用于存放运行时需要改变数据的文件

cmd [options] [arguments],options称为选项,arguments称为参数

选项和参数都作为Shell命令执行时的输入,它们之间用空格分隔开

  • Linux是区分大小写的

一般来说,后面跟的选项如果单字符选项前使用一个减号-单词选项前使用两个减号--

  • 这是一般的情况,有些命令还是不归属这种规律的(相对较少)~~~
  • 例子:ls -als -alla 单个字符使用一个-,一个单词all 使用两个--

在Linux中,可执行的文件也进行了分类:

  • 内置命令:出于效率的考虑,将一些常用命令的解释程序构造在Shell内部
  • 外置命令:存放在/bin、/sbin目录下的命令
  • 实用程序:存放在/usr/bin、/usr/sbin、/usr/share、/usr/local/bin等目录下的实用程序
  • 用户程序:用户程序经过编译生成可执行文件后,可作为Shell命令运行
  • Shell脚本:由Shell语言编写的批处理文件,可作为Shell命令运行

学过一些正则表达式的或者有点基础的同学对通配符应该就不陌生的了,在Linux也有通配符(在搜索的时候挺有用的)

  • *:匹配任何字符和任何数目的字符
  • ?:匹配单一数目的任何字符
  • [ ]:匹配[ ]之内的任意一个字符
  • [! ]:匹配除了[! ]之外的任意一个字符,!表示非的意思

在Linux下文件的类型有这么多:

  • 普通文件-
  • 目录d
  • 符号链接 l
    • 硬链接: 与普通文件没什么不同,inode 都指向同一个文件在硬盘中的区块
    • 软链接: 保存了其代表的文件的绝对路径,是另外一种文件,在硬盘上有独立的区块,访问时替换自身路径(简单地理解为 Windows 中常见的快捷方式)。
  • 字符设备文件 c
  • 块设备文件b
  • 套接字s
  • 命名管道p

我们常见的就是普通文件,目录和符号链接。其他的了解一下即可~

符号链接参考资料:

  • www.jianshu.com/p/dde6a01c4…

可能在网上查阅资料的时候会出现用户主目录这么一个名词,那他是什么呢???

前面已经说了,我们的Linux是多用户的网络系统!所以,我们可以在Linux下创建多个用户,每个用户都会有自己专属的空间

  • 所以,在创建用户时,系统管理员会给每个用户建立一个主目录,通常在/home/目录下
  • 比如:用户osmond的主目录为:/home/osmond

用户对自己主目录的文件拥有所有权,可以在自己的主目录下进行相关操作。


说实话,学习Linux命令还是直接买一台服务器比较方便,这会让你节省很多的时间,现在一台服务器只要89块一年。如果没有特殊的需求,不要把自己的时间花在虚拟机上,那是不值得的!

阿里云服务器89/年,229/3年,买来送自己,送女朋友马上过年再合适不过了,买了搭建个项目给面试官看也香,还可以熟悉技术栈,(老用户用家人账号买就好了,我用我女朋友的 )。扫码或者点击购买

我这里还有一个Javae环境的搭建教程,保证你能学会:搭建教程,从0开始一步一步带你搭建

上面说了一堆的基础概念,这是给我们敲命令之前打了一点基础,在敲命令的同时也会遇到一些比较重要的知识点的。那就到时候再说说了~~~

这是我们使用得最多的命令了,Linux最基础的命令

  • 可用 pwd命令查看用户的当前目录
  • 可用 cd 命令来切换目录
  • .表示当前目录
  • .. 表示当前目录的上一级目录(父目录)
  • -表示用 cd 命令切换目录所在的目录
  • ~ 表示用户主目录的绝对路径名

绝对路径:

  • 以斜线(/)开头 ,描述到文件位置的完整说明 ,任何时候你想指定文件名的时候都可以使用

相对路径 :

  • 不以斜线(/)开头 ,指定相对于你的当前工作目录而言的位置 ,可以被用作指定文件名的简捷方式

tips:输入命令的时候要常用tab键来补全

  • ls:显示文件或目录信息
  • mkdir:当前目录下创建一个空目录
  • rmdir:要求目录为空
  • touch:生成一个空文件或更改文件的时间
  • cp:复制文件或目录
  • mv:移动文件或目录、文件或目录改名
  • rm:删除文件或目录
  • ln:建立链接文件
  • find:查找文件
  • file/stat:查看文件类型或文件属性信息
  • cat:查看文本文件内容
  • more:可以分页看
  • less:不仅可以分页,还可以方便地搜索,回翻等操作
  • tail -10: 查看文件的尾部的10行
  • head -20:查看文件的头部20行
  • echo:把内容重定向到指定的文件中 ,有则打开,无则创建
  • 管道命令 | :将前面的结果给后面的命令,例如:ls -la | wc,将ls的结果加油wc命令来统计字数
  • 重定向 > 是覆盖模式,>> 是追加模式,例如:echo "Java3y,zhen de hen xihuan ni" > qingshu.txt把左边的输出放到右边的文件里去

学了这些命令我们能干嘛?其实就是在Windows下复制文件、粘贴文件、创建文件、查看文件这几种~~~

巩固一下基础,来做做题目:

  • (1)Linux的shell程序默认是bash 程序
  • (2)Linux命令格式包含三个部分,分别是: 命令选项参数
  • (3)Linux命令选项前为单个减号(-),后面一般为 单字符 ,选项前为双减号(--),后面一般为 单词
  • (4)Linux命令中使用的通配符有 ? * []
  • (5)命令 ls /usr/bin/w* 的效果是 列出指定目录下的所有以w开头的文件或目录
  • (6)命令 ls /usr/bin/w?? 的效果是 列出指定目录下的以w开头名称长度为3的所有文件或目录
  • (7)命令 ls /usr/bin/[xyz]* 的效果是 列出指定目录下的文件名以x或y或z开头的所有文件或目录
  • (8)命令 ls /usr/bin/[!a-h]* 的效果是 列出指定目录下的文件名不以a到h区间字母开头的所有文件或目录
  • (9)目录操作时,“.” 表示 当前目录
  • (10)目录操作时,“..” 表示 上一级目录
  • (11)目录操作时,“-” 表示 上一次工作目录
  • (12)目录操作时,“~” 表示 用户主目录
  • (13)命令ln可以建立文件链接,这种链接分为: 硬链接软链接
  • (14)命令touch可以改变文件的三种时间,分别是: access timemodify timechange time
进入/tmp目录,建立一个文件,goldXX(XX为学号的末两位),查看文件的时间
在账户的主目录中,建立一个dog目录,进入dog目录后,建立一个catXX(XX为学号的末两位)目录,进入catXX目录,显示当前目录;然后返回上一级目录,删除catXX目录;
复制/etc/passwd文件到账户主目录,修改账户主目录下passwd为passwdXX(XX为学号的末两位)
查找文件名叫做zcat的文件;复制该文件到/tmp目录;用长格式列出该文件;然后删除/tmp目录下的所有文件,并检查文件是否已被删除
复制/etc/hosts文件到账户主目录下;在账户主目录中建立一个硬链接文件(文件名为hostsYYY(YYY为学生姓名拼音缩写)),链接到主目录下的hosts文件;分别查看hosts和hostsYYY的文件的inode信息
复制/usr/bin/vdir文件到账户主目录下;在账户主目录中建立一个软链接文件(文件名为newdir),链接到主目录下的vdir文件;分别查看vdir和newdir的文件的inode信息
用长格式列出目录/usr/bin目录下的所有文件,输出重新定向到文件outXX(XX为学生学号末两位),检查结果;用长格式列出目录/etc目录下的所有文件,输出结果补充到文件outXX末尾
用长格式列出/usr/bin目录下的所有文件,通过管道与more命令连接,实现对文件列表的浏览
>和>>有何区别?

答:>覆盖方式重定向到新的文件;>>是以补充方式,添加到原文件的末尾。

通过管道和more命令,浏览文件列表方便在哪里?

答:对于文件列表超出一个屏幕显示的情况,这种方式可以分屏浏览,比较方便

在Windows操作系统下,我们会使用WinRAR或者快压等等的压缩软件来进行压缩或者解压。

在Linux下当然也存在压缩或解压的操作咯,下面我们就来学习一下在Linux下是怎么压缩和解压的!

压缩的方式也是有好几种,我们常用的有下面这三种:

  • gzip
  • bzip2
  • tar

常用的压缩的命令就有:

  • gzip filename
  • bzip2 filename
  • tar -czvf filename

常用的解压命令有:

  • gzip -d filename.gz
  • bzip2 -d filename.bz2
  • tar -xzvf filename.tar.gz

上面我们已经学过了cat、more、less、tail这些查看文本文件的命令了,但是我想快速查看这个文本文件下的某些关键字是否存在,那怎么办???

在Windows下就比较简单的,几乎所有的文本编辑器(记事本)都支持CTRL+F,往里面输入关键字就可查找出来:

那在Linux下,没有图形界面,没有CTRL+F的情况下,如果不懂一些命令的话,那还真是难找对应的字符出来。下面我就来说说如何快速查找一个文本文件下的某些字符

首先我们就来说说正则表达式,如果接触过的同学就知道:这玩意并不好记。一旦不用就很容易就忘记了,所以只能在用的时候查查了~~~所以下面我就直接给出一些规则了,不多说啦。

grep(global search regular expression)是一个强大的文本搜索工具。grep 使用正则表达式搜索文本,并把匹配的行打印出来。

格式:grep [options] PATTERN [FILE...]

  • PATTERN 是查找条件:可以是普通字符串、可以是正则表达式,通常用单引号将RE括起来。
  • FILE 是要查找的文件,可以是用空格间隔的多个文件,也可是使用Shell的通配符在多个文件中查找PATTERN,省略时表示在标准输入中查找。
  • grep命令不会对输入文件进行任何修改或影响,可以使用输出重定向将结果存为文件

例子:

  • 在文件 myfile 中查找包含字符串 mystr的行
    • grep -n mystr myfile
  • 显示 myfile 中第一个字符为字母的所有行
    • grep '^[a-zA-Z]' myfile
  • 在文件 myfile 中查找首字符不是 # 的行(即过滤掉注释行
    • grep -v '^#' myfile
  • 列出/etc目录(包括子目录)下所有文件内容中包含字符串“root”的文件名
    • grep -lr root /etc/*
用grep查找/etc/passwd文件中以a开头的行,要求显示行号;查找/etc/passwd文件中以login结束的行;
  • 自动补全命令
    • TAB键
  • 历史命令
    • 上下箭头键
  • 别名alias

这里感觉要说说的就只有别名alias了,我们下面看看例子就懂了!

显示shell当前已经定义的别名;执行其中的两个定义别名的命令;定义一个别名grep,要求其采用彩色方式显示结果

在Windows下有用户的环境变量,系统的环境变量。在Linux一样也是有的。

Shell 变量大致可以分为三类

  • 内部变量:由系统提供,用户只能使用不能修改。
    • ?
    • GROUPS
  • 环境变量:这些变量决定了用户工作的环境,它们不需要用户去定义,可以直接在 shell 中使用,其中某些变量用户可以修改。
  • 用户变量:由用户建立和修改,在 shell 脚本编写中会经常用到。
    • 变量赋值(定义变量)
      • varName=Value
      • export varName=Value
    • 引用变量$varName

Shell变量的作用域

  • 局部变量的作用范围仅仅限制在其命令行所在的Shell或Shell脚本文件中
  • 全局变量的作用范围则包括本Shell进程及其所有子进程
  • 局部变量与全局变量互换:可以使用 export 内置命令将局部变量设置为全局变量。 可以使用 export 内置命令将全局变量设置为局部变量。

export命令

  • 显示当前Shell可见的全局变量
    • export [-p]
  • 定义变量值的同时声明为全局变量
    • export <变量名1=值1> [<变量名2=值2> ...]
  • 声明已经赋值的某个(些)局部变量为全局变量
    • export <变量名1> [<变量名2> ...]
  • 声明已经赋值的某个(些)全局变量为局部变量
    • export -n <变量名1> [<变量名2> ...]

Shell环境变量:

  • 环境变量定义 Shell 的运行环境,保证 Shell 命令的正确执行。
  • Shell用环境变量来确定查找路径、注册目录、终端类型、终端名称、用户名等。
  • 所有环境变量都是全局变量(即可以传递给 Shell 的子进程),并可以由用户重新设置。

Shell变量:查询、显示和取消

  • 显示当前已经定义的所有变量
    • 所有环境变量env
    • 所有变量和函数(包括环境变量) :set
  • 显示某(些)个变量的值
    • echo $NAME1 [$NAME2 ……]
  • 取消变量的声明或赋值
    • unset <NAME>
定义Shell变量stuXX(XX为学生学号末两位),初值为学生姓名全拼,用echo命令显示stuXX变量的值;用unset命令取消stuXX变量,检查结果;用env命令观察当前有哪些已经定义好的shell环境变量
Shell环境变量的值是否可以修改?为什么?

答:环境变量的值一般情况下,可以修改。但一定要慎重修改,因为一旦修改错误,对shell正常运行造成严重影响,甚至导致shell无法运行。

相信没有用过Linux的同学在看一些段子的时候都会看到过两个编辑器:

  • vim
  • emacs

下面我们学习如何简单使用vi。vi 是 “Visual interface” 的简称,它可以执行输出、删除、查找、替换、块操作等众多文本操作,而且用户可以根据自己的需要对其进行定制,这是其他编辑程序所没有的

  • vi可以看做成我们Windows下的记事本
  • vim 即 Vi IMproved,vi 克隆版本之一

使用Vi来编辑文件:

Vi有三种模式:

  • G用于直接跳转到文件尾
  • ZZ用于存盘退出Vi
  • ZQ用于不存盘退出Vi
  • /和?用于查找字符串
  • n继续查找下一个
  • yy复制一行
  • p粘帖在下一行,P粘贴在前一行
  • dd删除一行文本
  • x删除光标所在的字符
  • u取消上一次编辑操作(undo)

在 Normal 模式下输入插入命令 i、 a 、 o进入insert模式。用户输入的任何字符都被vim当做文件内容保存起来,并将其显示在屏幕上。

  • 在文本输入过程中,若想回到Normal模式下,按 Esc 键即可。

Normal 模式下,用户按冒号 :即可进入 Command 模式,此时 vim 会在显示窗口的最后一行 (屏幕的最后一行) 显示一个 “:” 作为 Command 模式的提示符,等待输入命令。

  • :w 保存当前编辑文件,但并不退出
  • :w newfile 存为另外一个名为 “newfile” 的文件
  • :wq 用于存盘退出Vi
  • :q! 用于不存盘退出Vi
  • :q用于直接退出Vi (未做修改)

设置Vi环境:

  • :set autoindent 缩进,常用于程序的编写
  • :set noautoindent 取消缩进
  • :set number 在编辑文件时显示行号
  • :set nonumber 不显示行号
  • :set tabstop=value 设置显示制表符的空格字符个数
  • :set 显示设置的所有选项
  • :set all 显示所有可以设置的选项
在用户主目录下,执行vi程序,编辑文件install.log;移动光标到第10行,第五个字符;按大写字母G,达到文件末尾;不存盘退出;
在用户主目录下,执行vi程序,编辑文件install.log;用/命令查找字符串sudo,复制包含字符串sudo的行
在用户主目录下,执行vi程序,编辑文件install.log;进入命令模式,设置显示行号;用?命令查找字符串openssh,用命令n查找下一个

本文主要讲解了Linux的最基础的知识,可以简单地操作Linux了。命令可以说是学不完的,只能是记住Linux是有这个功能,到时候去网上查查也很方便。

主要是多练、多玩就可以记住一些常用的Linux命令了~~~~

下面我就花点时间画个Linux命令的脑图(当然了,命令仅限于是本文章的知识点,等写到用户、网络等知识点的时候再继续补充上去!)

如果文章有错的地方欢迎指正,大家互相交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以 关注微信公众号:Java3y

GitHub地址:github.com/ZhongFuCheng

现在学Java的人多,公司招聘要求越来越高。

想在当下的行情想做Java开发,那就一定要卷过其他人才行。

如何卷过其他学Java的人要综合多个因素。

首先最重要的就是自身技术水平,所学技术栈一定要符合现在的招聘要求。

书籍推荐:

《Java核心技术》(第11版)
《Java编程思想》(第 4 版)
《head first Java》(第2版)

上面的书籍一定要学完Javase内容之后再看,起到巩固作用,直接看书学习容易看到自闭。

学习目标:

打下扎实的语言基础,深刻理解面向对象的概念,具备初步编码能力,培养对于编程的兴趣,拥有良好的理论与实操水平。

除去过程中多做一些练习巩固学到的知识,学完Javase内容一定要做一个综合性比较强的练手项目,锻炼自己的代码思维以及实际开发能力,这里为大家推荐一个酒店管理系统项目给大家练手,这个项目综合性非常强,当你可以独立完成这个项目的时候,那就证明Javase学的没有任何问题。注意做这个项目需要学完SE和数据库的内容。

点击下面的插件加群找管理员获取完整项目视频及课件源码,群内还有很多其他的学习资源,加群和大家一起交流学习,互相监督,共同进步。

1

书籍推荐:

《MySQL必知必会》
《高性能MySQL(第3版)》
《 数据库索引设计与优化》

学习目标:

掌握基本的增删改查SQL语句编写,以及对于数据库性能的调优,根据具体的需求场景来锻炼设计表的能力,最后可以独立设计数据库表。

书籍推荐:

学习目标:

掌握JavaEE核心技术的理论知识,了解企业级项目开发的内核。

书籍推荐:

《Spring实战》(第5版)
《Spring微服务实战》
《Spring Boot实战》

学习目标:

熟练掌握现代企业常用的主流框架,应付日常项目开发的工作。

书籍推荐:

数据结构:

计算机组成原理:

推荐学习书籍《计算机组成与设计》、《计算机体系结构 》、《计算机程序的构造和解释》

计算机网络:

推荐学习书籍《TCP/IP详解卷一:协议》、《计算机网络》、《计算机网络自顶向下方法》

操作系统:

推荐学习书籍《深入理解计算机系统》(原书第3版)

程序员的灵魂:算法

推荐学习书籍《数据结构与算法图解》、《算法图解》

需要这些电子书点击下方插件加群找管理员获取,群内还有很多其他的学习资源,加群和大家一起交流学习,互相监督,共同进步。

2

推荐刷题网站牛客网、力扣网,每天至少刷一道题

想要冲击一二线大厂必须要掌握的技能,无论是校招还是社招,都是必考的内容。

语言拓展

学一门辅助语言,建议选择Go语言或者Python,目前很多大厂在招聘的时候,如果你会Go语言会成为加分项,Go语言在处理高并发时有天然的优势,而且学习起来较为简单。

交流沟通能力(非常重要)

找工作时的面试能力尤为重要,有好的口才甚至比技术本身更为重要,如果一个人会说,会更加容易找到更好的工作,现代企业非常看重的一项个人能力。

1.训练自己的逻辑思维。有条理,有层次,尽量抓住重点,简单明了的表达。

2.多观察别人的说话技巧和方式,然后抓住机会表达和练习。

3.沉下心来开始读书,改变的不仅仅是一些知识,无形中也有改变面对事情的看法和态度,会去思考如何去正确的表达。

提前实习

提前实习进入公司接触实际项目,可在大一、大二、大三寒暑假进入公司实习,锻炼实际开发能力,增加自己的工作经历,提高就业竞争力,大厂校招非常看重在校实习经历。

参加竞赛

①ACM国际大学生程序设计竞赛

含金量:计算机竞赛中含金量最高的竞赛,是进入top名校的敲门砖,也是个人计算机水平及团队合作能力等综合素质的极佳证明。

②GPLT团队程序设计天梯赛

含金量:中国高校计算机大赛下较为权威的算法竞赛,是官方认定的保研加分项。

③蓝桥杯全国软件和信息技术专业人才大赛

含金量:同程序设计天梯赛。

④中国大学生计算机设计大赛

含金量:国奖含金量较高,在保研面试中经常会问到作品的制作过程中的问题。

参加实验室

多人合作开发项目,锻炼实际开发能力,校招招聘尤为看重。

考证

计算机一二三级考证,普通话证书等。

四、外企必备

过英语四六级

按照上述学习方式提高学习,系统提升,充分准备学校春秋招聘,对标一二线大厂,起步薪资可达15-30K。

建议以实际就业出发,加紧学习节奏,Java体系掌握70%以上利用应届生身份优先就业,就业之后继续补充学习,稳定工作之后,做技术补充,技能提升。

转行学习更注重技术培养,用技术弥补自身非科班,非应届生的劣势。学习过程中切莫急于求成,一定要稳扎稳打,拒绝赶进度的学习,学完全部内容之后大量的进行项目练手,丰富代码量,锻炼实际开发能力,同时用项目去丰富简历,最后适当包装1-3年工作经验提高简历优势。

不要抱怨行业,抱怨没用,既然卷,我们就要卷过其他人!!!

我是去年9月22日才正式学习Java的,因为在国营单位工作了4年,在天津一个月工资只有5000块,而且看不到任何晋升的希望,如果想要往上走,那背后就一定要有关系才行。而且国营单位的气氛是你干的多了,领导觉得你有野心,你干的不多,领导却觉得你这个人不错。我才26周岁,实在的受不了这种工作氛围,情绪已经压制了很多久,一心想着要跳出来,却一直找不到合适的机会。因为身边的朋友有在北京做Java开发的,他工作了四五年的时间,可以在北京拿到3万的月薪,说心里话我是真的羡慕,这远超出了我的认知范围。所以经过朋友的推荐,我开始学习Java,一共学了大概5个多月的时间,今年的3月6号在天津找到了一份Java开发的工作,我包装了一年的工作经验,月薪9K五险一金,这算是成功上岸了。

在刚开始学习的时候我考虑过去线下培训班,但是我朋友不建议去,因为他就是培训出来的,他和我说去培训班几乎没作用,你去了之后会发现全程都是靠自己自学,老师上完课就走,不如自己看视频学有效率,如果再有一次机会,我绝对不会花3万块钱去培训。因为朋友是过来人,他的建议我不得不听,而且我在网上查了一下,培训班的口碑似乎都不好,这就让我直接放弃了培训的想法。况且3万的培训费用是我不吃不喝半年的工资,确实有点舍不得。

于是我开始自学,因为有朋友是做这行的,所以自己在开始的时候少走了很多弯路,他给了我很好的建议,所以学习Java有个大佬带是尤为重要的。因为做软件研发的都有一个圈子,所以经过了朋友的引荐,他让我加了他们那个圈子的Java技术研讨群。里面大部分都是自学成功的大佬,在整个学习期间,我在他们这里真的是得到了不少的帮助。因为他们每个人都积累了很多资源,所以平时都是相互分享资源,如果公司有内推就业的名额也会相互推荐工作机会,我的第一份工作就是群里大佬给我推荐的。当然里面也有一些还在学习中的人,这都是朋友相互推荐聚到一起的。所以我建议那些还在学习Java的初学者,一定要多结识一些行业内的大佬,可以加一下这个Java交流群,对于一个初学者来说可以获得非常多的帮助,平时有一些问题发在群里,他们中有人工作不忙的时候就会出来解答,效率很高而且每个解答都讲解的非常透彻。我之所以能在5个月左右的时间自学Java就业,确实是得到了这些大佬不少的帮助。

1

我的学习心得,我认为能不能自学成功的要素有两点。

第一点就是自身的问题,虽然想要转行学习Java的人很多,但是非常强烈的想要转行学好的人是小部分。而大部分人只是抱着试试的心态来学习Java,这是完全不可能的。所以能不能学成Java并且就业,最关键的一点就是自己的愿望是否强烈。我是属于非常强烈那种,因为忍受不了现在工作的氛围,以及羡慕朋友在北京可以拿到3万的月薪,这些因素都促使我非常拼命的学。在加上自身可以做到从下班就开始看视频自学,一直学到晚上12点的这股劲,所以才能在5个月的时间内达到就业的水平。

第二点就是有大佬带你,如果全程都靠自己摸索是非常难的,对于一个不是本专业的人来说从开始的时候就“无从下手”。更不要说在学习过程中遇到的无数bug问题很难得到解决,因为我们在学习过程中会遇到无数问题,有的时候一个小问题就能困扰我们几个小时的时间,会导致我们的学习效率很低,这种情况出现多了以后,信心就会受到打击,觉得自己不适合学编程,最终放弃。而当有一个大佬去给你解答后,你会很快得到答案,并且能理解为什么要这样做,到底是哪里出现了问题,学习效率会非常高。

所以总结就是自身自觉主动学习在加上大佬全程带你,其实学习就是这么简单的事情,无非就是这两个关键的要素,少了其中一个都很难成功。

(1)代码规范

初学者一定要注意培养自己的代码规范,每行代码必须要注释,我之所以只学了5个月就能拿到9K的薪资,就是因为我代码规范很好。其实一个初学者在开始的时候能培养出好的代码规范很难,这源于在整个学习过程中有大佬带我的原因。

(2)交流沟通

切记不要认为自己可以摸索自学成功,能达到一定高度的水平,一定离不开很多专业人的指导,所以多认识一些大佬尤为重要,圈子真的可以决定我们可以达到什么水平。如果大家找不到合适的圈子,我强烈建议大家添加下面的Java技术研讨群,多认识几个大佬对于职业生涯有好处。

2

(3)效率:

能快尽量快,如果你已经决定要转行学习Java,就千万别拖泥带水,把大部分的精力都投入进来,如果你是那种三天打鱼两天晒网的情况,我劝你尽早的放弃不要浪费时间,有这个时间去锻炼锻炼身体不好吗?

(4)学习心态

一定要抱着决心转行的心态来学,自身的意愿强度决定了你是否能转行成功。

1.了解如今的市场,都需要掌握哪些主要技术就可以快速就业,目前的企业都需要什么人才,这是你学习的方向和目标。

2.系统的学习规划:有一个整体学习大纲,要知道自己每天学习什么,做什么练习进行知识巩固,一个阶段学完后应该完成什么项目实战,进行循序渐进的学习,不可以盲目的瞎学。

3.一个大佬的指导:作为一个初学者一定要记得找大佬指导你,即使是花点钱也没关系,只要你能把技术学好就行。自己摸索基本都是弯路,很多人为什么学了一两个月就放弃了,因为他不知道路在哪里,整个人都是迷茫的,自然容易放弃。但如果你有了一个大佬带你,他就会给你做详细的学习计划,给你安排好一切,在整个学习过程中给你解答疑问,你学习起来就会思路清晰,简单效率。

如果需要下面资料,可以点击下面的插件进行获取

3

一、JavaSE基础篇

JavaSE就是一种标准版,是Java语言的基础部分,Java衍生出来的各种框架(如Spring系列)各种产品都是基于JavaSE标准,JavaSE是Java向上发展的基础,Java任何高级产品的底层基础都是JavaSE,通俗来讲这是所有孩子的”爹“。JavaSE如果学不好,理解不透彻,后面学习框架时就有如天书一般,所以JavaSE这部分的重要性是不言而喻的,希望各位初学者铭记。

主要包含内容:数据类型、基础语法、运算符、流程控制、数组、面向对象、常用类、异常处理、集合、IO流、多线程、反射、注解、解析、网络编程。

二、数据库篇

数据库是学习Java语言必学的一项内容,常见的数据库就是MySQLOracle这两种,作为初学者一般都是学习MySQL为主,一般情况下中小型企业都会选择MySQL数据库,比较大型的互联网公司会选择用Oracle,而学习Oracle相对于MySQL也要复杂一些,建议是主要学习MySQL数据库,Oracle作为了解即可。学习数据库较为简单,基本的操作就是增删改查。

三、Web开发

Web前端内容:HTML/CSS/JavaScript/(前端页面)

注意:Java后端开发可以不用过多关注HTML页面及CSS的处理,但是最起码要会用简单的HTML,JavaScript是必需要会的,因为Javaweb后端程序员毕竟要接触使用AJAX方式处理数据及显示。当然如果只关注服务器端实现而不考虑任何用户界面,则HTML、CSS、JavaScript都不用关注,但是完全脱离前端的开发现在虽然也不少,但是绝对不关心前端是不可能,尤其是JavaScript,但是前端却可以完全不关心服务器后台的任何实现。

JavaEE内容:Servlet/JSP

虽然现在网上在传JSP很少用了,可能是被一些模板或JS AJAX方式代替了一些,但是我认为还是应该接触一下,万一要用到不会怎么办,而且它是Java EE的动态网页实现标准组件。学习JSP过程也能更好的帮助我们理解web会话的过程,掌握web会话都有哪些我们必需知道的。如果学习Javaweb、JSP都不接触那就相当于学习使用Springboot而一点不接触SpringFramework一样,岂不是稀里糊涂。包括开发Javaweb 我们必需知道的概念诸如Web应用上下文,请求对象,响应对象,HttpSession,Cookie等都是在接触学习JSP和Servelt中体现的,还有一些比较少见的EJB JSF JMS 以及 Java Felix等。

一些初学者不清楚这些难免会有误区,尤其是有些较成熟的工程师也这么说,我只能说他们很无知,只是代码机器而已,其实对于应用开发设计也就稀里糊涂,人云亦云罢了。

永远没有被淘汰的技术也没有永远流行万能的技术,要看在什么环境和场合应用,符合我需求的技术和工具就是好的,就是对的。

四、高级框架

1、Springframework 核心IOC容器

2、Spring boot 在Spring基础上的更全面提升效率的Spring工具

3、ORM 框架当今流行使用较多的是Mybatis 和 MP(Mybatis插件),Hibernate是可选性学习的

4、模板技术,比较成熟的Freemarker

5、Spring Cloud 微服务框架,Spring Cloud提供的全套的分布式系统解决方案。

五、工具

maven 是构建管理项目的工具,svn git是团队协作开发的项目源代码及相关文档资料管理工具,需要学习者初步掌握其应用。

像Tomcat,jetty ,resin,JBoss,GlassFish 等都是部署运行Java web应用的服务器。

以上就是初学者大概学习的内容,我是尽量站在初学者的角度来说的,没有写得特别复杂,怕初学者看不懂,没有实质性的帮助。所以我尽量用白话把话说的简单一些,给大家罗列出主要学习的Java知识点。

Java学习 - 知乎

有任何关于Java相关的疑问,随时私聊我。

  • 上一篇: java教程app安卓
  • 下一篇: java角色权限教程
  • 版权声明


    相关文章:

  • java教程app安卓2025-03-26 19:50:03
  • 巢湖java教程推荐2025-03-26 19:50:03
  • java变长参数教程2025-03-26 19:50:03
  • java线程模型教程2025-03-26 19:50:03
  • java上传图片教程2025-03-26 19:50:03
  • java角色权限教程2025-03-26 19:50:03
  • java教程极客学院2025-03-26 19:50:03
  • java教程20142025-03-26 19:50:03
  • java编写界面教程2025-03-26 19:50:03
  • java网络群聊教程2025-03-26 19:50:03