IT培训网 - IT职场人学IT技术上IT培训网
菜鸟学Java开发的流程有哪些
时间:2020-10-10 21:35:00 来源:编程网 作者:IT培训网 已有:名学员访问该课程
你是如何学习 Java 的?
举个例子好了:我现在是个懵懂的小白,老师让我用java做一个图书管理系统:
图书管理系统得有页面吧,页面我该怎么开发呢?于是你百度:前端入门,然后你就知道了,原来我使用 html js css就可以写一个页面出来了。
假设你坚持到了这一步,你发现用js写这些东西好麻烦啊,特别冗长,关键是原生的JavaScript还有各种浏览器兼容性的问题,你写出来的东西在chrome上能用,在ie上就展示的不正常了。于是乎你又百度:js框架。浏览器告诉你js的框架有很多:JQuery,React,Vue,
假设挑选了Jquery来做你的项目,你会发现,额 是比之前爽多了,毕竟框架会集成好很多方便的功能,你觉得你的效率在提高。
现在你坚持到了第四步,但是你又发现了新的问题,虽然相比之前JQuery操作起来是简单了许多,不过还是要我主动操作dom对象,有没有办法:我只关心我当前页面所用的数据是啥玩意就行了,改了数据之后,跟数据绑定的页面元素能够自动改变呢?这样我不就不用自己操作dom了吗?哦,对了,我之前搜索js框架的时候还有Vue和React,这都是啥玩意,于是乎,你百度:Vue入门。
好了,你开始使用Vue来写你的前端页面了,相比之前效率又高了很多,使用Vue的过程中,你可能接触到越来越多的概念,前端的模块啊,打包啊等等。你也许觉得写前端真他妈好玩,于是乎你关闭了这篇文章,去搜索:前端学习路线图。。。。
PS:我现在很难受,我是来跟你们一起学习java的
终于到后端了:现在你已经会写页面了,可是管理系统的数据我怎么展示在页面上呢,总不能写死在页面上吧。要是能有个地方存这个图书管理系统的数据,并且我的页面可以从那个地方拿就好了。
存图书数据的地方肯定就是叫数据库啦,于是你百度:数据库入门,书上告诉你数据库有好多种:sql server、mysql、oracle、db2 ..... 但是无论是哪一种都要先学习一下SQL,不管了,程序员就是爱学习,学呗
你现在学会了sql了,你按照网上的说明安装了mysql数据库,知道了怎么用sql操作数据库里面的数据,真是个天才。但是没用啊,我给别人用的是系统哎,我不能跟他说,你过来,我给你用sql展示一下数据库里面有哪些数据吧。
既然是个图书的管理系统,图书的增删改查肯定都得放在后端来做吧,毕竟前端只是做页面样子和交互,后端才是处理数据的,对图书的增删改查就是对数据库的增删改查呗。哦,我记得之前java书上看到JDBC可以操作数据库,把这块知识点捡起来,试着写一段程序操作一下吧。
好厉害,你竟然已经学会了java操作数据库,现在哪怕不打开数据库,不借助数据库的各种客户端你也能通过你的java代码查到库里面的内容了。但是还有个问题,我前端页面怎么跟后端打交道呢?换句话说,我前端页面写的花里胡哨的,可是该怎么告诉后端程序:你给我展示一下数据库里面有哪些书?数据库里面有没有一个叫java从入门到放弃的书?于是你百度:js前后端交互
你发现了Ajax,js中的这种技术可以请求后端的接口,拿到数据。然后用数据做相应的展示、交互之类的。并且你也知道了json,他几乎成了前后端交互事实上的数据标准。于是乎,你通过简单的百度之后,知道了该怎么向后端发起请求(当然了 也许在前5步的时候,你已经知道了怎么向后端发送请求,并且你有各种不同的姿势来发,什么原生的js啊,vue啊,react啊,jquery啊。各种姿势都不在话下)
页面写好了,也知道在页面上怎么向后端发送指令了,现在就差后端接口了。我刚刚写的java操作数据库,花里胡哨的,但是没用啊,我要先接收到前端发给我的指令,我再开始查询,或是各种管理吧。前端都没说话呢,你一顿操作,不是个沙雕吗?
好吧,那我的java怎么能接收前端发给我的指令呢?你百度:java http接口。于是你知道了 servlet ,tomcat。原来我只要写一个servlet,接着将其放到tomcat中执行,就能对外提供一个接口了呀。
天哪,我的servlet成功接收到了前端请求,根据前端的各种命令,后端开始尽职尽责的执行各种java指令,返回json数据给前端。
完美啊,我做完了,关闭这篇文章,打游戏去了。。。
等等,首先那个jdbc操作的是在是太麻烦了吧,open connection 各种try catch 。上面不是有个mybatis说是可以简化jdbc操作吗,怎么玩的?百度一下:mybatis入门
嗯,mybatis确实太香了。优雅的orm映射、灵活的sql编写。都让你觉得使用原生jdbc操作起来真是太费劲了。
不对,我觉得用servlet也有点麻烦,每次建立一个servelt之后,还要在web.xml配置,而且写起来也不优雅,json数据都是各种拼装起来的,真麻烦。
是时候学习一下spring了,大家都说spring是java程序员必学的,他到底好在哪呢,我的程序能不能用一下spring?让我百度一下spring入门。
果然spring确实方便,有了spring,我再也不用new对象了,我想要的,她都懂我,给我提前准备好了之后,我直接拿就行了。并且啊,她还会贴心的把依赖关系给我搞好。没错,这就是Spring核心的容器和DI功能。
你发现,spring家族竟然还有个东西:spring mvc,他是一个MVC框架,大家都在用,你也尝试了一下。十分钟后你觉得:我再也不会用servlet去写了,用springMVC写效率提升十倍不止。
爱好学习的你在项目中用了spring,springMVC,mybatis。额,这tm的不就是SSM三大框架吗。嗯,不错,可以出去装逼了
同学啊,你这个管理系统怎么那么慢啊,我查了一本书 :java从入门到放弃,每次查询都要好几秒,程序太烂了吧。你很难受,你的程序被大家吐槽了,要是我能快一点就好了?
加个缓存吧,大家都说redis很好,性能高,支持事务,还能持久化。你一顿操作,在项目中集成了redis。
班上的同学都很满意,见到你就说,同学,你现在好快啊,每次都不到3秒。用户体验哗哗的提升。你很满足,很自豪。
学校新进了一本书,刘慈欣的《三体》,大家都很喜欢看,一听到书籍上架的消息都去用你的系统。结果由于人数太多,你的系统没有抗住,挂掉了。。。
不行,有点丢人。加机器吧,我要是能有十台机器,每台上面都部署我的程序,并且这十台都提供给用户服务。那么自然每台的压力就小很多了。但是该怎么做呢,总不能告诉他们说:一班的同学你们使用135的这台机器,二班的同学你们使用136的这台机器吧。
要是大家都有统一的入口,但是通过该入口,请求会自动分配到这10台机器上就好了。于是你搜索一下:负载均衡。你发现了nginx还有h5负载均衡器等各种软件或是硬件实现的负载均衡(当然nginx不止这个功能)。
加一台nginx吧,毕竟不要钱。你按照文档配置好10台机器的权重。现在用户的请求能被10台机器处理。学校又进了一批热门的图书,这次你的系统没有垮掉。真厉害。
又来了一个需求,系统加了一个关注的功能,用户可以关注某本未上架的书,等它上架的时候,系统要通知用户。所以该怎么做呢,现在的你可能想着,我写个程序不停的去询问数据库,看这本书有没有上架。但是这么做有个问题,就是及时性的问题,你该设置多久询问一次呢?所以,是时候使用mq了,当书上架的时候,将书的信息放到消息队列中,消息消费者一监听到消息,立马就去发送通知。怎么样,这样做是不是逻辑上也解耦了,代码写着也不累了。
你闲着蛋疼,往系统里面新增了各种各样的功能:当用户预约的书到了的时候,发送提醒。一些淘汰的书籍你还给加上了公益拍卖的功能,用户只要竞拍,就可以获取到这个书籍,为公益做贡献。真是个商业奇才。
你越写越多,想法犹如泉水一样连绵不绝,然后你发现了一个问题,系统实在是功能太多了,你随便改一下东西可能都影响到别的功能,启动一次动不动五六分钟,关键是有一些新的小伙伴加入你的时候,每个模块的功能他都要了解,否则一不小心就像拍仓鼠一样,一个bug改了,又冒出来一个。
拆分吧,装个逼。拆成微服务。用户一个服务,图书的管理一个服务,拍卖一个服务,短信一个服务。每个服务由不同的人来负责,大家都对自己的业务比较熟悉,项目小而精致。但是拆分会面临以下很多问题:
怎么拆分,如何划分颗粒度
拆分后怎么协作
下游服务频繁的失败怎么办
怎么保证高可用
怎么保证数据的一致性
系统间怎么监控?(调用链路、日志、报警机制、)
....
后面的路,只要有好奇心和不安分的想法,你就会控制不住自己的双手打开谷歌:xxxx 该怎么办?祝你入坑愉快 哈哈哈哈哈
前言
这个回答我想写很久了,但是因为时间的原因一直拖到了现在,我以为一两天就写完了,结果从构思到整理资料,再到写出来用了差不多一周的时间吧。
你们也知道丙丙一直都是创作鬼才来的,所以我肯定不会一本正经的写,我想了好几个切入点,最后决定用一个完整的电商系统作为切入点,带着大家看看,我们需要学些啥,我甚至还收集配套视频和资料,暖男石锤啊,这期是呕心沥血之作,不要白嫖了。
正文
在写这个文章之前,我花了点时间,自己臆想了一个电商系统,基本上算是麻雀虽小五脏俱全,我今天就用它开刀,一步步剖析,我会讲一下我们可能会接触的技术栈可能不全,但是够用,最后给个学习路线。
Tip:请多欣赏一会,每个点看一下,看看什么地方是你接触过的,什么技术栈是你不太熟悉的,我觉得还算是比较全的,有什么建议也可以留言给我。
编辑
不知道大家都看了一下没,现在我们就要庖丁解牛了,我从上到下依次分析。
前端
你可能会会好奇,你不是讲后端学习路线嘛,为啥还有前端的部分,我只能告诉你,傻瓜,肤浅。
我们可不能闭门造车,谁告诉你后端就不学点前端了?
前端现在很多也了解后端的技术栈的,你想我们去一个网站,最先接触的,最先看到的是啥?
没错就是前端,在大学你要是找不到专门的前端同学,去做系统肯定也要自己顶一下前端的,那我觉得最基本的技术栈得熟悉和了解吧,丙丙现在也是偶尔会开发一下我们的管理系统主要是VUE和React。
在这里我列举了我目前觉得比较简单和我们后端可以了解的技术栈,都是比较基础的。
作为一名后端了解部分前端知识还是很有必要的,在以后开发的时候,公司有前端那能帮助你前后端联调更顺畅,如果没前端你自己也能顶一下简单的页面。
HTML、CSS、JS、Ajax我觉得是必须掌握的点,看着简单其实深究或者去操作的话还是有很多东西的,其他作为扩展有兴趣可以了解,反正入门简单,只是精通很难很难。
在这一层不光有这些还有Http协议和Servlet,request、response、cookie、session这些也会伴随你整个技术生涯,理解他们对后面的你肯定有不少好处。
编辑
Tip:我这里最后删除了JSP相关的技术,我个人觉得没必要学了,很多公司除了老项目之外,新项目都不会使用那些技术了。
前端在我看来比后端难,技术迭代比较快,知识好像也没特定的体系,所以面试大厂的前端很多朋友都说难,不是技术多难,而是知识多且复杂,找不到一个完整的体系,相比之下后端明朗很多,我后面就开始讲后端了。
网关层:
互联网发展到现在,涌现了很多互联网公司,技术更新迭代了很多个版本,从早期的单机时代,到现在超大规模的互联网时代,几亿人参与的春运,几千亿成交规模的双十一,无数互联网前辈的造就了现在互联网的辉煌。
微服务,分布式,负载均衡等我们经常提到的这些名词都是这些技术在场景背后支撑。
单机顶不住,我们就多找点服务器,但是怎么将流量均匀的打到这些服务器上呢?
负载均衡,LVS
我们机器都是IP访问的,那怎么通过我们申请的域名去请求到服务器呢?
DNS
大家刷的抖音,B站,快手等等视频服务商,是怎么保证同时为全国的用户提供快速的体验?
CDN
我们这么多系统和服务,还有这么多中间件的调度怎么去管理调度等等?
zk
这么多的服务器,怎么对外统一访问呢,就可能需要知道反向代理的服务器。
Nginx
编辑
这一层做了反向负载、服务路由、服务治理、流量管理、安全隔离、服务容错等等都做了,大家公司的内外网隔离也是这一层做的。
我之前还接触过一些比较有意思的项目,所有对外的接口都是加密的,几十个服务会经过网关解密,找到真的路由再去请求。
编辑
这一层的知识点其实也不少,你往后面学会发现分布式事务,分布式锁,还有很多中间件都离不开zk这一层,我们继续往下看。
服务层:
这一层有点东西了,算是整个框架的核心,如果你跟我帅丙一样以后都是从事后端开发的话,我们基本上整个技术生涯,大部分时间都在跟这一层的技术栈打交道了,各种琳琅满目的中间件,计算机基础知识,Linux操作,算法数据结构,架构框架,研发工具等等。
我想在看这个文章的各位,计算机基础肯定都是学过的吧,如果大学的时候没好好学,我觉得还是有必要再看看的。
为什么我们网页能保证安全可靠的传输,你可能会了解到HTTP,TCP协议,什么三次握手,四次挥手。
还有进程、线程、协程,什么内存屏障,指令乱序,分支预测,CPU亲和性等等,在之后的编程生涯,如果你能掌握这些东西,会让你在遇到很多问题的时候瞬间get到点,而不是像个无头苍蝇一样乱撞(然而丙丙还做得不够)。
了解这些计算机知识后,你就需要接触编程语言了,大学的C语言基础会让你学什么语言入门都会快点,我选择了面向对象的JAVA,但是也不知道为啥现在还没对象。
JAVA的基础也一样重要,面向对象(包括类、对象、方法、继承、封装、抽象、 多态、消息解析等),常见API,数据结构,集合框架,设计模式(包括创建型、结构型、行为型),多线程和并发,I/O流,Stream,网络编程你都需要了解。
代码会写了,你就要开始学习一些能帮助你把系统变得更加规范的框架,SSM可以会让你的开发更加便捷,结构层次更加分明。
写代码的时候你会发现你大学用的Eclipse在公司看不到了,你跟大家一样去用了IDEA,第一天这是什么玩意,一周后,真香,但是这玩意收费有点贵,那免费的VSCode真的就是不错的选择了。
代码写的时候你会接触代码的仓库管理工具maven、Gradle,提交代码的时候会去写项目版本管理工具Git。
代码提交之后,发布之后你会发现很多东西需要自己去服务器亲自排查,那Linux的知识点就可以在里面灵活运用了,查看进程,查看文件,各种Vim操作等等。
系统的优化很多地方没优化的空间了,你可能会尝试从算法,或者优化数据结构去优化,你看到了HashMap的源码,想去了解红黑树,然后在算法网上看到了二叉树搜索树和各种常见的算法问题,刷多了,你也能总结出精华所在,什么贪心,分治,动态规划等。
这么多个服务,你发现HTTP请求已经开始有点不满足你的需求了,你想开发更便捷,像访问本地服务一样访问远程服务,所以我们去了解了Dubbo,Spring cloud。
了解Dubbo的过程中,你发现了RPC的精华所在,所以你去接触到了高性能的NIO框架,Netty。
代码写好了,服务也能通信了,但是你发现你的代码链路好长,都耦合在一起了,所以你接触了消息队列,这种异步的处理方式,真香。
他还可以帮你在突发流量的时候用队列做缓冲,但是你发现分布式的情况,事务就不好管理了,你就了解到了分布式事务,什么两段式,三段式,TCC,XA,阿里云的全局事务服务GTS等等。
分布式事务的时候你会想去了解RocketMQ,因为他自带了分布式事务的解决方案,大数据的场景你又看到了Kafka。
编辑
我上面提到过zk,像Dubbo、Kafka等中间件都是用它做注册中心的,所以很多技术栈最后都组成了一个知识体系,你先了解了体系中的每一员,你才能把它们联系起来。
编辑
服务的交互都从进程内通信变成了远程通信,所以性能必然会受到一些影响。
此外由于很多不确定性的因素,例如网络拥塞、Server 端服务器宕机、挖掘机铲断机房光纤等等,需要许多额外的功能和措施才能保证微服务流畅稳定的工作。
Spring Cloud 中就有 Hystrix 熔断器、Ribbon客户端负载均衡器、Eureka注册中心等等都是用来解决这些问题的微服务组件。
你感觉学习得差不多了,你发现各大论坛博客出现了一些前沿技术,比如容器化,你可能就会去了解容器化的知识,像Docker,Kubernetes(K8s)等。
微服务之所以能够快速发展,很重要的一个原因就是:容器化技术的发展和容器管理系统的成熟。
编辑
这一层的东西呢其实远远不止这些的,我不过多赘述,写多了像个劝退师一样,但是大家也不用慌,大部分的技术都是慢慢接触了,工作中慢慢去了解,去深入的。
好啦我们继续沿着图往下看,那再往下是啥呢?
数据层:
数据库可能是整个系统中最值钱的部分了,在我码文字的前一天,刚好发生了微盟程序员删库跑路的操作,删库跑路其实是我们在网上最常用的笑话,没想到还是照进了现实。
编辑
这里也提一点点吧,36小时的故障,其实在互联网公司应该是个笑话了吧,权限控制没做好类似rm -rf 、fdisk、drop等等这样的高危命令是可以实时拦截掉的,备份,全量备份,增量备份,延迟备份,异地容灾全部都考虑一下应该也不至于这样,一家上市公司还是有点点不应该。
编辑
数据库基本的事务隔离级别,索引,SQL,主被同步,读写分离等都可能是你学的时候要了解到的。
上面我们提到了安全,不要把鸡蛋放一个篮子的道理大家应该都知道,那分库的意义就很明显了,然后你会发现时间久了表的数据大了,就会想到去接触分表,什么TDDL、Sharding-JDBC、DRDS这些插件都会接触到。
你发现流量大的时候,或者热点数据打到数据库还是有点顶不住,压力太大了,那非关系型数据库就进场了,Redis当然是首选,但是MongoDB、memcache也有各自的应用场景。
Redis使用后,真香,真快,但是你会开始担心最开始提到的安全问题,这玩意快是因为在内存中操作,那断点了数据丢了怎么办?你就开始阅读官方文档,了解RDB,AOF这些持久化机制,线上用的时候还会遇到缓存雪崩击穿、穿透等等问题。
单机不满足你就用了,他的集群模式,用了集群可能也担心集群的健康状态,所以就得去了解哨兵,他的主从同步,时间久了Key多了,就得了解内存淘汰机制……
他的大容量存储有问题,你可能需要去了解Pika….
编辑
编辑
其实远远没完,每个的点我都点到为止,但是其实要深究每个点都要学很久,我们接着往下看。
实时/离线/大数据
等你把几种关系型非关系型数据库的知识点,整理清楚后,你会发现数据还是大啊,而且数据的场景越来越多多样化了,那大数据的各种中间件你就得了解了。
你会发现很多场景,不需要实时的数据,比如你查你的支付宝去年的,上个月的账单,这些都是不会变化的数据,没必要实时,那你可能会接触像ODPS这样的中间件去做数据的离线分析。
然后你可能会接触Hadoop系列相关的东西,比如于Hadoop(HDFS)的一个数据仓库工具Hive,是建立在 Hadoop 文件系统之上的分布式面向列的数据库HBase 。
写多的场景,适合做一些简单查询,用他们又有点大材小用,那Cassandra就再合适不过了。
离线的数据分析没办法满足一些实时的常见,类似风控,那Flink你也得略知一二,他的窗口思想还是很有意思。
数据接触完了,计算引擎Spark你是不是也不能放过……
编辑
搜索引擎:
传统关系型数据库和NoSQL非关系型数据都没办法解决一些问题,比如我们在百度,淘宝搜索东西的时候,往往都是几个关键字在一起一起搜索东西的,在数据库除非把几次的结果做交集,不然很难去实现。
那全文检索引擎就诞生了,解决了搜索的问题,你得思考怎么把数据库的东西实时同步到ES中去,那你可能会思考到logstash去定时跑脚本同步,又或者去接触伪装成一台MySQL从服务的Canal,他会去订阅MySQL主服务的binlog,然后自己解析了去操作Es中的数据。
这些都搞定了,那可视化的后台查询又怎么解决呢?Kibana,他他是一个可视化的平台,甚至对Es集群的健康管理都做了可视化,很多公司的日志查询系统都是用它做的。
编辑
学习路线
看了这么久你是不是发现,帅丙只是一直在介绍每个层级的技术栈,并没说到具体的一个路线
编辑
资料/学习网站
JavaFamily:由一个在互联网苟且偷生的男人维护的GitHub
CodeGym :一个在线Java编程课程,80%的内容是练习,适合一窍不通的入门者。
Wibit Online Java Courses :一个非常有趣的编程学习网站,各种生动的动画形象能让人忘记学习的枯燥。在线视频学习,非常适合零基础。
stanford CS106A: Programming Methodology :斯坦福经典课程系列,完全没有编程经验,想学Java语言的,可以看看这个课程。
Bloombenc :一个在线交互式学习平台,老师可以根据你的学习能力和节奏修改他们的教学方法,还可以在平台上编码。
Imooc:慕课网,我大学的C语言就是在这里看的
CodeAcademy :比较实用的Java在线课程,注重的是在找工作时非常有用的技术能力。
PLURALSIGHT:整合了很多Java的视频课程,部分免费,部分付费,可以根据自己的需要挑选。
Lynda Online Java Training Videos:Java进阶课程,包括如何使用JDBC来集成MySQL数据库,Reflection API,管理文件和目录等。
九章基础算法班(Java):中文在线互动课,随时开始学习。
BeginnersBook:Java初学者免费教程,有稍微一些编程基础之后,可以跟着文档里的代码练习。
docs.oracle.com/javase/tutorial:官方Java指南,对了解几乎所有的java技术特性都非常有帮助。
JournalDev:Java相关教程及问答
JavaWorld:最早的一个Java站点,每周更新Java技术文章。
developer.com/java :由http://Gamelan.com 维护的Java技术文章网站。
IBM Developerworks技术网站:IBM的Develperworks技术网站,这是其中的Java技术主页
絮叨
如果你想去一家不错的公司,但是目前的硬实力又不到,我觉得还是有必要去努力一下的,技术能力的高低能决定你走多远,平台的高低,能决定你的高度。
如果你通过努力成功进入到了心仪的公司,一定不要懈怠放松,职场成长和新技术学习一样,不进则退。
丙丙发现在工作中发现我身边的人真的就是实力越强的越努力,最高级的自律,享受孤独(周末的歪哥)。
编辑
总结
我提到的技术栈你想全部了解,我觉得初步了解可能几个月就够了,这里的了解仅限于你知道它,知道他是干嘛的,知道怎么去使用它,并不是说深入了解他的底层原理,了解他的常见问题,熟悉问题的解决方案等等。
你想做到后者,基本上只能靠时间上的日积月累,或者不断的去尝试积累经验,也没什么速成的东西,欲速则不达大家也是知道的。
技术这条路,说实话很枯燥,很辛苦,但是待遇也会高于其他一些基础岗位。
所实话我大学学这个就是为了兴趣,我从小对电子,对计算机都比较热爱,但是现在打磨得,现在就是为了钱吧,是不是很现实?若家境殷实,谁愿颠沛流离。
但是至少丙丙因为做软件,改变了家庭的窘境,自己日子也向小康一步步迈过去。
说做程序员改变了我和我家人的一生可能夸张了,但是我总有一种下班辈子会因为我选择走这条路而改变的错觉。
每期开班座位有限.0元试听抢座开始!
温馨提示 : 请保持手机畅通,咨询老师为您
提供专属一对一报名服务。