自学/学习路线这样的一期我想写很久了,因为一直想写的全一点硬核一点所以拖到了现在,我相信这一期对不管是还在学校还是已经工作的同学都有所帮助,不管是前端还是后端我都墙裂建议大家看完,因为这样会让你对你所工作的互联网领域相关技术栈有个初步的了解。
你们也知道敖丙我是个创作鬼才,常规的切入点也不是我的风格,我毕业后主要接触的都是电商领域,所以这一期我把目前所了解的技术栈加上之前电商系统的经验臆想了一个完整的电商系统,大家会看到很多熟悉的技术栈我相信也会看到自己未接触过的技术栈,我也会对每个技术栈的主要技术点提一下,至于细节就只能大家在我历史和未来的文章去看了。
这期可谓是呕心沥血之作,不要白嫖喲。
我先介绍一下前端
我读者群体是以后端为主的,如果有大学还没开始学习的小伙伴,这个时候我想已经是满屏幕的问号了,为啥我们后端程序员还要去学习前端呢?我只能告诉你,傻瓜,肤浅。
如果是已经大学毕业的程序员我相信每一个后端程序员都会简单的前端,甚至很多后端对目前前端最新技术也都是了解的,我们可不能闭门造车,谁告诉你后端就不学点前端了?而且你了解前端在之后工作联调过程中或许会有更好的思路对你的工作是有所帮助的。
我们上网最先接触到的肯定不是后端的一系列东西,而是移动端和前端网页,各种花里胡哨的样式不是我们要去了解的,但是网页的基本语言以及布局从0到1这个过程是我们应该去了解的,大家看到的花里胡哨的网页布局、链接、文字、图片、事件等,都是一个个的标签、class样式以及js事件而已。
技术背后的思想其实是互通的,所以作为后端以前端作为我们程序员学习的切入点是完全OK的(只是针对还未入门萌新猿),我相信在各位的大学前端基础课程也都是有安排的,而且不管是上学还是以后毕业我相信各位以后一定会接触些许前端的。
在大学一般都是用项目去锻炼技术的,那在项目里面很可能就是你一个人从前端到后端都是自己写的,我在大学就是这样的,现在工作了我们很多内容系统简单的前端也都是我们自己去开发的,因为为了简单的页面和逻辑去浪费前端的资源是没有很大必要的。
在这里我列举了我目前觉得比较简单和我们后端可以了解的技术栈,都是比较基础和我觉得比较必须的。
HTML、CSS、JS、Ajax我觉得是必须掌握的点,看着简单其实深究或者去操作的话还是有很多东西的,其他作为扩展有兴趣可以了解,反正入门简单,只是精通很难很难。
在这一层不光有这些还有Http协议和Servlet,request、response、cookie、session这些也会伴随你整个技术生涯,理解他们对后面的你肯定有不少好处。
扩展:前端技术我觉得VUE、React大家都可以尝试去用用,他们目前支持很多即插即用的插件会帮助你更便捷的开发出漂亮的网页。
Tip:我这里最后删除了JSP相关的技术,我个人觉得没必要学了,很多公司除了老项目之外,新项目都不会使用那些技术了。
前端在我看来比后端难,技术迭代比较快,知识好像也没特定的体系,所以面试大厂的前端很多朋友都说难,不是技术多难,而是知识多且复杂,找不到一个完整的体系,相比之下后端明朗很多,我后面就开始继续往下讲了。
互联网发展到现在,涌现了很多互联网公司,技术更新迭代了很多个版本,从早期的单机时代,到现在超大规模的互联网时代,几亿人参与的春运,几千亿成交规模的双十一,无数互联网前辈的造就了现在互联网的辉煌。
微服务,分布式,负载均衡、云原生等我们经常提到的这些名词都是这些技术在场景背后支撑。
单机顶不住,我们就多找点服务器,但是怎么将流量均匀的打到这些服务器上呢?
负载均衡,LVS
我们机器都是IP访问的,但是我们上网都是访问域名就好了,那怎么通过我们申请的域名去请求到服务器呢?
DNS
大家刷的抖音,B站,快手等等视频服务商,是怎么保证同时为全国的用户提供快速的体验?
CDN
我们这么多系统和服务,还有这么多中间件的调度怎么去管理调度等等?
zk
这么多的服务器,怎么对外统一访问呢,就可能需要知道反向代理的服务器。
Nginx
这一层做了反向负载、服务路由、服务治理、流量管理、安全隔离、服务容错等等都做了,大家公司的内外网隔离也是这一层做的。
我之前还接触过一些比较有意思的项目,所有对外的接口都是加密的,几十个服务会经过网关解密,找到真的路由再去请求。
这一层的知识点其实也不少,你往后面学会发现分布式事务,分布式锁,还有很多中间件都离不开这一层的Zookeeper,接下来就是整个学习体系最复杂的部分了,服务端。
这一层有点东西了,算是整个框架的核心,如果你跟敖丙一样以后都是从事后端开发的话,我们基本上整个技术生涯,大部分时间都在跟这一层的技术栈打交道了,各种琳琅满目的中间件,计算机基础知识,Linux操作,算法数据结构,架构框架,研发工具等等。
我想在看这个文章的各位,计算机基础肯定都是学过的吧,如果大学的时候没好好学,我觉得还是有必要再看看的。
为什么我们网页能保证安全可靠的传输,你可能会了解到HTTP,HTTPS,TCP协议,什么三次握手,四次挥手,中间人攻击等。
还有进程、线程、协程,内存屏障,指令乱序,分支预测,CPU亲和性等等,在之后的编程生涯,如果你能掌握这些东西,会让你在遇到很多问题的时候瞬间get到点,而不是像个无头苍蝇一样乱撞(然而敖丙还做得不够,所以最近也是在恶补操作系统和网路相关的知识)。
了解这些计算机知识后,你就需要接触编程语言了,大学的C语言基础会让你学什么语言入门都会快点,嵌入式实习结束后我选择了面向对象的JAVA,但是也不知道为啥现在还没对象。
JAVA的基础也一样重要,面向对象(包括类、对象、方法、继承、封装、抽象、 多态、消息解析等),常见API,数据结构,集合框架,设计模式(包括创建型、结构型、行为型),多线程和并发,I/O流,Stream,网络编程你都需要了解。
代码会写了,你就要开始学习一些能帮助你把系统变得更加规范的框架,SSM可以会让你的开发更加便捷,结构层次更加分明。
写代码的时候你会发现你大学用的Eclipse在公司看不到了,你跟大家一样去用了IDEA,第一天这是什么玩意,一周后,真香,但是这玩意收费有点贵,那免费的VSCode真的就是不错的选择了。
代码写的时候你会接触代码的仓库管理工具maven、Gradle,提交代码的时候会去学习项目版本管理工具Git。
代码提交之后,发布之后你会发现很多东西需要自己去服务器亲自排查,那Linux的知识点就可以在里面灵活运用了,通过跳板机访问服务器查看进程,查看文件,各种Vim操作指令等等。
当你自己研发系统发布时你发现很多命令其实可以写成一个脚本一键执行就好了,那Shell会让你事半功倍的。
系统层面的优化很多时候会很有限,你可能会尝试从算法,或者优化数据结构去优化,你看到了HashMap的源码,想去了解红黑树,然后在算法网上看到了二叉树搜索树和各种常见的算法问题,刷多了,你也能总结出精华所在,什么贪心,分治,动态规划等。
这么多个服务,你发现HTTP请求已经开始有点不满足你的需求了,你想开发更便捷,像访问本地服务一样访问远程服务,所以我们去了解了Dubbo,Spring cloud等。
了解Dubbo的过程中,你发现了RPC的精华所在,所以你去接触到了高性能的NIO框架,Netty。
代码写好了,服务也能通信了,但是你发现你的代码链路好长,都耦合在一起了,所以你接触了消息队列,这种异步的处理方式,真香。
他还可以帮你在突发流量的时候用队列做缓冲,但是你发现分布式的情况,事务就不好管理了,你就了解到了分布式事务,什么两段式,三段式,TCC,XA,阿里云的全局事务服务GTS等等。
业务场景使用的多的时候你会想去了解RocketMQ,他也自带了分布式事务的解决方案,但是他并不适合超大数据量的场景,这个时候Kafka就会进入你的视线中。
我上面提到过zk,像Dubbo、Kafka等中间件都是用它做注册中心的(后续kafka会把zk去掉)很多技术栈最后都组成了一个知识体系,你先了解了体系中的每一员,你才能把它们联系起来。
服务的交互都从进程内通信变成了远程通信,所以性能必然会受到一些影响。
此外由于很多不确定性的因素,例如网络拥塞、Server 端服务器宕机、挖掘机铲断机房光纤等等,需要许多额外的功能和措施才能保证微服务流畅稳定的工作。
Spring Cloud 中就有 Hystrix 熔断器、Ribbon客户端负载均衡器、Eureka注册中心等等都是用来解决这些问题的微服务组件。
你感觉学习得差不多了,你发现各大论坛博客出现了一些前沿技术,比如容器化、云原生,你可能就会去了解像Docker,Kubernetes(K8s)等技术,你会发现他们给企业级应用提供了怎样的便捷。
微服务之所以能够快速发展,很重要的一个原因就是:容器化技术的发展和容器管理系统的成熟。
这一层的东西呢其实远远不止这些的,我不过多赘述,写多了像个劝退师一样,但是大家也不用慌,大部分的技术都是慢慢接触了,工作中慢慢去了解,去深入的。
这里呢还是想说我经常提到的那句话,你知道的越多,你不知道的越多,所有领域都是这样,一旦你深入了解了这个技术细节,衍生出来的新知识点和他的弊端会让你发现自己的无知,但学到自己不会的不断去进步会让你在学习的道路上走更远的。
好啦我们继续沿着图往下看,那再往下是啥呢?
数据库可能是整个系统中最值钱的部分了,今年呢也发生了微盟程序员删库跑路的操作,删库跑路其实是我们在网上最常用的笑话,但是这个笑话背后我们应该得到的思考就是,数据是整个企业最重要最核心的东西,我现在在公司的大数据团队对此深有体会。
如果大家对大数据感兴趣我想我后面也可以找机会单独出一期大数据技术栈相关的专题。
数据库基本的事务隔离级别,索引,SQL,主被同步,读写分离等都可能是你学的时候要了解到的。
不要把鸡蛋放一个篮子的道理大家应该都知道,那分库的意义就很明显了,然后你会发现时间久了表的数据大了,就会想到去接触分表,什么TDDL、Sharding-JDBC、DRDS这些插件都会接触到。
你发现流量大的时候,或者热点数据打到数据库还是有点顶不住,压力太大了,那非关系型数据库就进场了,Redis当然是首选,但是memcache也有各自的应用场景。
Redis使用后,真香,真快,但是你会开始担心最开始提到的安全问题,这玩意快是因为在内存中操作,那断点了数据丢了怎么办?你就开始阅读官方文档,了解RDB,AOF这些持久化机制,线上用的时候还会遇到缓存雪崩击穿、穿透等等问题。
单机不满足你就用了,他的集群模式,用了集群可能也担心集群的健康状态,所以就得去了解哨兵,他的主从同步,时间久了Key多了,就得了解内存淘汰机制......
老板让你最最小的代价去设计每日签到和UV、PV统计你就会接触到:位图和HyperLogLog,高速的过滤你就会考虑到:布隆过滤器 (Bloom Filter) ,附近的人就会使用到:GeoHash 他的大容量存储有问题,你可能需要去了解Pika....
其实远远没完,每个的点我都点到为止,但是其实要深究每个点都要学很久,我们接着往下看。
等你把几种关系型非关系型数据库的知识点,整理清楚后,你会发现数据还是大啊,而且数据的场景越来越多多样化了,那大数据的各种中间件你就得了解了。
你会发现很多场景,不需要实时的数据,比如你查你的支付宝去年的,上个月的账单,这些都是不会变化的数据,没必要实时,那你可能会接触像ODPS这样的中间件去做数据的离线分析。
然后你可能会接触Hadoop系列相关的东西,比如于Hadoop(HDFS)的一个数据仓库工具Hive,是建立在 Hadoop 文件系统之上的分布式面向列的数据库HBase 。
写多的场景,适合做一些简单查询,用他们又有点大材小用,那Cassandra就再合适不过了。
离线的数据分析没办法满足一些实时的常见,类似风控,那Flink你也得略知一二,他的窗口思想还是很有意思。
数据接触完了,计算引擎Spark你是不是也不能放过......
数据是整个电商系统乃至于我们整个互联网最值钱的部分不是随便说说的,但是如何发挥他们的价值,数据放在数据库是无法发挥他应有的价值的,算法在最近10年越来越受到大家的重视,机器学习、深度学习、人工智能、自动驾驶等领域也频频爆出天价offer的新闻,所以算法我觉得也有机会也是可以了解一下的。
不知道大家用搜索引擎或者购物网站使用过以图搜图功能没,这就是算法的图像搜索功能,我们在搜索栏输入对应关键词之后算法同学会通过自然语言处理,然后再落到推荐系统给出最好的搜索结果,以及大家看到的热搜,默认搜索的推荐都是通过算法算出针对你个人最优的推荐,你最最感兴趣的推荐。
就比如我最近在B站看了《龙王赘婿》相关的视频,我的默认搜索推荐就出现了《画网赘婿》的默认搜索推荐,这就是根据近期热点和你个人喜好算出来的,大家可以进去刷新试试。
国内人口基数这么大,那相对来说垃圾内容应该更多才对,但是大家几乎可以一直浏览到绿色健康的网络环境,这得益于风控,算法同学也会用风控去对涉黄,涉政等内容做一个甄别。
你要知道你的每一个行为在进入app开始就会被分析,最后给你打上一个个的标签,算法算出你最喜欢的内容投喂给你,你没发现抖音你越看内容越和你的胃口么?淘宝你越逛推荐的商品你越想买么?
这都得益于大数据和算法的结合,不断完善不同的训练模型,投喂给用户他最喜欢的内容,很多训练模型甚至以小时维度的更新频率在更新。
用户数据对内对外还有差别,因为很多平台是不会给你完整的数据的,但是算法同学会尽可能的捕捉用户的每一个潜在特性,然后去给你投喂最适合你的广告。
看到这里大家可能会担心自己的数据安全了,其实每个公司都会有自己最基本的职业操守,正常公司都是不会去出卖自己用户的任何数据的,但是市面上也存在销售用户数据的黑色产业。
生在这个大数据的年代是一件好事,技术是两面性也是我一直强调的,这样的技术会让你的所有信息透明,这个时候我们就要尽可能的注重保护我们自己的数据隐私安全,不要贪图小便宜去到处填写自己的真实信息,手机号,身份证号码等,你永远都不知道你数据的价值,以及他们可能把你的数据用在什么地方。
算法这里我提到过搜索引擎,我打算单独讲一下,因为在技术侧还算有可圈可点之处。
传统关系型数据库和NoSQL非关系型数据都没办法解决一些问题,比如我们在百度,淘宝搜索东西的时候,往往都是几个关键字在一起一起搜索东西的,在数据库除非把几次的结果做交集,不然很难去实现。
那全文检索引擎就诞生了,解决了搜索的问题,你得思考怎么把数据库的东西实时同步到ES中去,那你可能会思考到logstash去定时跑脚本同步,又或者去接触伪装成一台MySQL从服务的Canal,他会去订阅MySQL主服务的binlog,然后自己解析了去操作Es中的数据。
这些都搞定了,那可视化的后台查询又怎么解决呢?Kibana,他他是一个可视化的平台,甚至对Es集群的健康管理都做了可视化,很多公司的日志查询系统都是用它做的。
以上就是整个系统所有的技术栈了,这个时候大家再看一下我开头的电商项目图大家是不是会觉得更有感觉了?是不是发现好像是那么回事,也大概知道了很多技术栈在一个系统里面的地位了?
技术路线路线图呢就用我之前的图其实就够了,不一定要严格按照这个去学习,只是给大家一个参考。
JavaFamily:由一个在互联网苟且偷生的男人维护的GitHub
B站 网址:www.bilibili.com
中国大学MOOC 网址:www.icourse163.org
IMOOC 网址:www.imooc.com
极客时间 网址:https://time.geekbang.org
极客学院 网址:www.jikexueyuan.com
网易云课堂 网址:https://study.163.com
百度/谷歌 网址:www.baidu.com www.google.com
知乎 网址:www.zhihu.com
GitHub 网址:https://github.com
我要自学网 网址:www.51zxw.net
w3school、菜鸟教程 网址:www.w3school.com.cn www.runoob.com
豆瓣、微信读书、当当 网址:www.douban.com https://weread.qq.com http://book.dangdang.com
CSDN 网址www.csdn.net
掘金 网址 https://juejin.im
博客园 网址:www.cnblogs.com
思否(segmentfault) 网址:https://segmentfault.com
stackoverflow 网址:https://stackoverflow.com
开源中国 网址:www.oschina.net
V2ex 网址:www.v2ex.com
infoQ 网址:www.infoq.cn
有道词典 网址:www.youdao.com
印象笔记 网址:www.yinxiang.com
有道云、石墨文档 网址:https://note.youdao.com https://shimo.im
ProcessOn 、xmind 网址:www.processon.com www.xmind.cn
鸠摩搜索 网址:www.jiumodiary.com
脚本之家 网址:www.jb51.net/books
牛客网 校招 网址:www.nowcoder.com
LeetCode、lintcode 网址:https://leetcode-cn.com www.lintcode.com
数据结构模拟 网址:www.cs.usfca.edu
BOSS、拉钩 网址:www.zhipin.com www.lagou.com
如果你想去一家不错的公司,但是目前的硬实力又不到,我觉得还是有必要去努力一下的,技术能力的高低能决定你走多远,平台的高低,能决定你的高度。
如果你通过努力成功进入到了心仪的公司,一定不要懈怠放松,职场成长和新技术学习一样,不进则退。
丙丙发现在工作中发现我身边的人真的就是实力越强的越努力,最高级的自律,享受孤独(周末的歪哥)。
我提到的技术栈你想全部了解,我觉得初步了解可能几个月就够了,这里的了解仅限于你知道它,知道他是干嘛的,知道怎么去使用它,并不是说深入了解他的底层原理,了解他的常见问题,熟悉问题的解决方案等等。
你想做到后者,基本上只能靠时间上的日积月累,或者不断的去尝试积累经验,也没什么速成的东西,欲速则不达大家也是知道的。
技术这条路,说实话很枯燥,很辛苦,但是待遇也会高于其他一些基础岗位。
所实话我大学学这个就是为了兴趣,我从小对电子,对计算机都比较热爱,但是现在打磨得,现在就是为了钱吧,是不是很现实?若家境殷实,谁愿颠沛流离。
但是至少丙丙因为做软件,改变了家庭的窘境,自己日子也向小康一步步迈过去,不经一番寒彻骨,怎得梅花扑鼻香?
说做程序员改变了我和我家人的一生可能夸张了,但是我总有一种下班辈子会因为我选择走这条路而改变的错觉。
我是敖丙,一个在互联网苟且偷生的工具人。
创作不易,本期硬核,不想被白嫖,各位的 「三连」 就是丙丙创作的最大动力,我们下次见!