两岸猿声啼不住,轻舟已过万重山。人生,像一场(长期的)修行;程序猿的道路,亦如是!
今天,你悟了吗?
《白帝下江陵》
作者/李白
朝辞白帝彩云间
千里江陵一日还
两岸猿声啼不住
轻舟已过万重山
💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦
💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙
💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦
一、Java后端开发的星海征途
1.修炼之道 🐞 🐞 🐞 🐞 🐞 🐞 🐞 🐞 🐞 🐞
■ 镜子中的眉毛 🐞
● 就像照镜子一样,左边的眉毛其实在右边。【学习阶段】与【应用阶段】具有对称性,很多东西、很多道理,【学习阶段】跟【应用阶段】需要反着来:(1)比如所谓的“不要重复造轮子”,这句话其实是应用阶段的事情,了解是怎么一回事就好,对于学习阶段,其实“就是要反复造轮子”,需要不断练习,同一件事情,通常需要反复练习很多遍,我的理解是,“真理就像美人,需要爱她的人,抚摸她的每一寸肌肤,很多很多遍”,在不断的接触中,反反复复的过程中,达到熟练、细致细腻的地步。总之,拳不离手、曲不离口,学习就是要反复折腾、折腾着向前进;(2)又比如采坑,学习阶段,就是需要不断地采坑,即所谓反复练习和异常测试,你不掉到坑里去,你就不知道坑到底是个啥玩意,坑都是具体的、有很多很多的坑,需要我们去踩,学习阶段如果太顺、将来出问题,不会解决的话,那工作效率,那工作中的坑之大,就可想而知了,学习阶段就是要对自己狠一点,一个声音高叫着【掉到坑里去吧,我要祝福你】;而应用阶段,如果还是出来很多坑,那就真的是坑,不是坑爹、就是坑自己。
■ 时间简史 🐞
● Java码农心中的Java时间简史:
【1】JavaSE阶段(混沌)
【2】JavaWeb阶段:
0 Servlet(盘古开天地),
1 类库阶段:远古(中小型应用系统)
1.1 Servlet-JSP-类库:JSP什么都干(旧石器时代)
1.2 Servlet+JSP+类库:JSP专职做好UI模板 (新石器时代)
* 类库:JSPDBUtils+BeanUtils+CommonsIO等阶段(石器世代)
番外:Servlet与JSP的职责分离与专业化,代表了一种趋势。
【3】JavaEE阶段(本质仍然是JavaWeb):
2 框架阶段I:中古和近古
# SSH为主,大型应用系统,分布式开发-重量级,成熟(但缺陷明显),偏稳定
2.0 框架出现(文明纪元):
2.1 EJB:(奴隶社会)【中古】
2.2 Web Service[SOA]阶段:CXF框架(封建社会)【近古】
3 框架阶段II:近、现代史,当代史
# SSM为主,超大型应用系统,分布式开发-轻量级,成熟,偏性能
# Maven,Gradle的流行、基于HTTP协议的RESTful开发风格的流行和SpringBoot的出现或诞生是重要的标志性事件,是JavaEE轻量化与敏捷化开发的发展历史中的里程碑事件。
3.1 分布式之RPC阶段:Dubbo框架(近代世)
3.2 微服务之HTTP&RESTful阶段:SpringCloud框架(现代史)
3.3 服务网格(当代史)
■ 雪花飘飞,魔法师召唤神兽 🐞
● 我们需要学习很多很多的命令,就像天上的雪花一样多:比如Dos命令,Linux命令,MySQL指令,Redis指令,SVN指令,Maven指令,Git指令,MongoDB指令,Docker指令,Npm指令,Yarn指令,NVM指令,Chocolatey指令。其实我们学的各种API,那些方法和函数,也都可以理解为指令,因为它们最后都是通过名称来调用的。命令或指令,就是法师的符咒,每一个程序员,都在修道。念几句咒语,就能招唤神兽,看起来是件神奇又轻松的事情;但咒语念多了,才会知道“反噬”两个字的份量,这个世界上,任何事情都是有代价、有筹码的,都是辩证的。再厉害的孙悟空,也翻不了如来神的五指山。
2.工具之格 🐞 🐞 🐞 🐞 🐞 🐞 🐞 🐞 🐞 🐞
● 屠龙刀:IDEA
● 三十六路打狗棍法:快捷键
3.知识之阶 🐞 🐞 🐞 🐞 🐞 🐞 🐞 🐞 🐞 🐞
■ 兄弟?影子? 🐞
● 好像兄弟又好像影子:(1)对象和实例,并不完全是同一的概念。这样理解就对了:a)一切皆对象;b)实例或实例对象,只是对象的一种形式;实例或实例对象,是通过构造器new出来的对象;c)实例或实例对象,是我们接触和使用最多的一种对象形式;d)除了实例对象,还有类对象等其它对象形式,又比如根对象Object。e)就范畴范围而言,对象和实例是一种包含关系,对象(概念上)包含实例或实例对象(2)类属性和类字段(成员变量),并不是同一的概念。类属性的存在,是因为类实现封装后(使用了private、protected等权限修饰符修饰,直接存取权限受限),提供setter和getter存储器方法决定的。属性名和成员变量或类字段变量名称,通常保持一致,但这只是实用性决定的或概率上讲的,二者其实可以不一样。
4.设计之法 🐞 🐞 🐞 🐞 🐞 🐞 🐞 🐞 🐞 🐞
■ 永生术:常青不老的法术 🐞
● 长生不老术/或永生之法:软件向后兼容的功能特性(《西游记》中孙悟空到须菩提祖师那拜师学艺,最想学的,就是永生之术。全世界的古文明中,最具永生特征的,就是中华文明,因为与其说我们这个民族注重血统、历史和传统,不如说,是注重向后兼容之法,是一个注重永生术的民族或文明。也正因为这一点,我们最讲究传承,历史最是悠久而能始终接续。Java语言,是一门典型的向后兼容的语言,然后在此基础上,不断抄袭其它语言的优点或一些卓越的特性,从而保持持久常新、青春不老,显出倾向永生的特点。反过来,像Python这样的语言,像PHP的一门叫Drupal的CMS系统,每个大的本版更新换代或升级之后,仿佛就是学习一门全新的语言,全新的软件,有太多的东西需要从头学起,因为它的变化往往是革命性,因为它的文化或遵循的法则,是不讲究向后兼容的。)
■ 降龙18掌:编程最佳实践的典型 🐞
● 降龙十八掌:GoF23
■ 默契基于效率 🐞
● 最大的默契:就是一切尽在不言中 ——心照不宣、心领神会地把一切能做的都做好了。有两个经典的例子:一个是Lambda表达式;一个是SpringBoot。【1】Lambda的核心原则就是:可推导可省略。【2】SpringBoot提供了大量的starters(启动器/或起步依赖) + 尽可能地减少不必要的手动配置,它的底层支撑是自动化配置机制和所遵循的“约定高于配置”的理念,使用SpringBoot手脚架,一方面可以通过大量相应的starter,让程序员减少重复书写模板代码,一方面可以让配置的工作,无限地逼近“零配置”的理想王国。
■ 语法糖的甜度 🐞
● 语法糖,有点甜。语法糖,大抵都是为效率而生,而且大多数是为了提升开发效率而出现的。其实Java中的语法糖,是很多的。语法糖集中体现了编程语言间的相互抄袭精神,嘿嘿!
■ 面向接口编程
● 面向接口编程的典范:JDBC, Spring。面向接口编程的本质,是面向抽象编程,是面向抽象的极致体现。最后,体现出【顶层设计】的优势来!
5.实战之术 🐞 🐞 🐞 🐞 🐞 🐞 🐞 🐞 🐞 🐞
■ 箫传五音 🐞
● 开发架构模型:吹箫五音模型。互联网,最根本、最广泛地应用级协议是HTTP协议,HTTP协议,最核心的一个概念,是HTTP事件模型,简称【请求-响应】模型;请求和响应,言简意赅,却构成了整个回路与闭环;请求是简单的,复杂的是整个响应的过程,是服务器端的架构;上帝三位一体归于一,上帝是的绝对的,请求端的叫客户,也可以说是顾客,顾客就是上帝,顾客的需求是绝对的,是压倒性的,相对的是服务端的整个豪华的服务团队。现代的大型互联网应用系统最终完成向上帝提供完美服务,其架构是复杂的,最复杂的就是服务端,从基础设施型的服务器,到应用型的服务器,从集群到分布式,由各种各样的服务器组成整个服务主体架构。对于开发者来说,个人认为,主要有5种服务器类型,再加上相应的使用上的客户端,构成了整个的基本架构框架或模式(模型),这5种服务器,分类为:【1】DNS域名解析服务器,【2】Web服务器,【3】应用服务器,【4】数据或数据库服务器,【5】文件服务器。HTTP的请求-响应过程,就相当于ping-pong,ping代表请求,pong代表响应,但这个pong展开后是非常复杂的,这些复杂的服务器,分布于请求-响应的整个线程闭环的诸节点上,提供不同的服务,就像吹簫一样,不同的节点,有不同的音口,发出不同的声音,通过有效的组织形成共同完成最终的服务,响出美妙的乐章。基本公式为:
上帝在吹簫
【浏览器】请求--------------------------------------------------------------->
Client--->【宫】--->【商】--->【角】--->【徵】--->【羽】
<--------------------------------------------------------------响应
DNS Web App Db File
Server Server Server Server Server
【host】 【Nginx】 【Tomcat】 【MySQL】 【FastDFS】
______ ______ ______ ______ ______
Client Client Client Client Client
【Switchhost】【CMD/Shell】 【IDEA】【NaviCat】 【Postman】
Developer/Coder
其中,最复杂的,是App Server和Db Server,App Server主要是因为分布式,Db Server主要是因为衍生出了满足各种不同需求类型、解决不同痛苦的数据形式的服务器,包括SQL和NoSQL,NewSQL等。总之,类似于一句话:上边一张嘴,下边跑断腿。也可以正能量一点,消费与需求,正是推动时代发展的根本动力。嗯?我又悟了?!!
■ 上帝造人,或 画师肖像 🐞
● 上帝造人:电商系统数据表关系与设计
○ 总体上讲,电商系统几张核心数据表的关系,就相当于上帝造人,上帝是怎么造人的呢?1)当然是先造了天地万物,有了伊甸园,然后再造的人;2)具体讲,人是怎么造的呢?就是先造了个男人,叫亚当;然后,再从亚当身上弄了根肋骨,造了女人,再往后,就是人造人了。
○ Java中,创建对象,就相当于造人,而各种类(接口、抽象类、父类、子类)就相当于造人的方法或方式法则。
○ 现在我们来看一下电商系统中的几张主要的表的关系,我们也可以这样对照着去理解!那品牌表、商品分类表、规格分组(或分类)表、规格参数表、SPU表、SKU表怎么理解呢?其实,我们可以这样去理解,商品的分类和商品的品牌,相当于是帖在商品上的标签,因此,可以理解为是接口;规格分组(或分类)表和规格参数表的关系,相当于抽象父类和具体子类的关系,是造人的图纸;而SPU和SKU,合起来,就相当于具体的实例对象,相当于是人,只是SPU作为标准商品或抽象商品集合而存在,体现的是人的共性,而SKU是商品最小存储单位,相当于是人的个性。所以,理解这几张表的相互关系的大体框架,就相当于下面这样:
◆ 分类表(cid1/cid2/cid3) + 品牌表(brand_id) --------相当于接口 interface
◆ 规格组表(规格分类表)--------------相当于抽象父类 abstract/parent class
◆ 规格参数表(规格属性表)-----------相当于具体子类 child class
◆ SPU表(包含spu表/spu详细表)/SKU表------相当于实例对象 object
◆ SPU -------------------------更多体现为共性(通用性)
◆ SKU -------------------------更多体现为个性(差异性)
○ 简单地讲,我们可以把商品理解成人,或者具体的对象;在上面这些表中,最像人的,是SKU表。但严格地讲,SKU虽然更为具体,SPU相对抽象--体现为共性,但真正的一个商品,依然是SKU+SPU的综合结果产出。而spec_group,spec_param更多的像造人的模板、像图纸、像OOP中的类、像五官和轮廓线条;brand和category,更多地像标签,像OOP中的接口。接口和类,都是服务于造人用的;在造人的过程中:1)接口像天,极为抽象,类像地,开始有五观形象,2)接口像轮廓,类像结构线条,3)而最后的SPU,SKU像光影,赋予事物具体的值,最终走向细致和细腻,有血有肉,有体觉官感上的冲击力,有疼痛,有爱恨,有质感和现实感,更或者说有鲜活感;就像购物时,同一款商品,一个人喜欢红色,另一个则喜欢绿色,这就是疼痛,这就是爱恨,这就是断舍离。所以,整个数据表的设计过程,和OOP编程的本质,其实,基本上是一致的,就像画家画像,就像上帝造人一样。上帝为什么要造人?因为理想是灰色的,生命或生活之树常青。顾城有诗(《感觉》)为证:
天是灰色的
路是灰色的
楼是灰色的
雨是灰色的
在一片死灰中
走过两个孩子
一个鲜红
一个淡绿
6.星罗之光 🐞 🐞 🐞 🐞 🐞 🐞 🐞 🐞 🐞 🐞
● 三头六臂和基因变异:
○ 方法重载(overload) 是三头六臂
○ 方法重写(overwrite) 是基因变异。方法重写,也叫方法的覆写或覆盖(override)
● Bug是一种物质,Debug是一种反物质;Bug是一种暗物质,Debug是一种反暗物质。
● 抽刀断水水更流:过滤器&拦截器&网关
● 形上形下(形气道理):接口规范(形而上之道)、抽象类(形而上之理)、普通类(形而下之气)、实例对象(形而下之形)
● 五四运动:【1】Java类有五脏——即Java类的五大成员(成员属性,成员方法,构造器,代码块,内部类)。【2】还需要学习四个重要的关键字:this, super, static, final
● 从后台到前台:我们可以想像一个电商系统,主要包括两部分:后台管理系统和前台业务系统。所谓坐地经商,开门迎客。后台以增删类操作为主,前台则需要承受不计其数的客户的访问,以查询和修改操作为主。LinkedList和ArrayList两种数据类型,似乎暗合了这从后台到前台的不同需求特点:ArrayList的数据结构——Array(数组),决定了其特定是增删慢、查询和修改快;而LinkedList的数据结构——Link(链表),决定了其特定是增删快、查询和修改慢。所以,理解LinkedList和ArrayList的特点,可以结合满足从后台到前台的现实需求来看,将抽象的设计与现实的需求联系起来,将理论(数据结构)与实践结合起来,对于我们的学习理解的加深和记忆的持久化,以及应用上的信手拈来,会有很多好处。
● 酸(ACID):事务四大特性
● 框架的灵魂:反射
● 自我感知:内省
● 一站式框架或容器:Spring
● 真水无香:解耦思想
● 撒豆成兵:Java Bean
● 拈花一笑、天女散花: @ 之注解
● API三部曲:包 -> 构造器 -> 常用方法
● 顺藤摸瓜:XML解析,HTML解析,DOM解析
● JavaWeb三件套(三大组件):Servlet + Filter + Listener
● 主流框架(SSH&SSM)之天地人三才:天(struts/springmvc)+人(Spring)+地(hibernate/mybatis)。容器思想:人道中庸,乃经天纬天之才
● 工商局:注册中心
● 一阳指:Servlet
一阳指出自金庸多部武侠小说中,是大理段氏(修订版)的独门绝学,既可御敌,亦可疗伤救人。 一阳指以品境界,最高为第一品,第四品便是修炼大理最高武学「六脉神剑」的基础。 |
● 如来神掌:Spring容器是如来神掌
● 六脉神剑:
Spring&SpringMVC&SpringBoot&SpringCloud&SpringData&SpringSecurity
💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦
💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙 💙
💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦 💦
二、大前端的修罗场
1.JS 🌸 🌸 🌸 🌸 🌸 🌸 🌸 🌸 🌸 🌸
2.JS高级 🍀 🍀 🍀 🍀 🍀 🍀 🍀 🍀 🍀 🍀
3.ES6 🌹 🌹 🌹 🌹 🌹 🌹 🌹 🌹 🌹 🌹
4.Vue 🍁 🍁 🍁 🍁 🍁 🍁 🍁 🍁 🍁 🍁
■ 成❄️ 住❄️ 坏❄️ 空 🍁
● 成住坏空:Vue实例生命周期&钩子函数([create/mount/update/destory]*[before/ed])
■ 三魂❄️ 七魄 🍁
● 三魂七魄:Vue实例&组件参数选项
new Vue({
el: '#app', //挂载元素
template: '', //模板
components: {}, //组件
data: {}, //数据
methods: {}, //方法
computed: {}, //计算属性
watch: {}, //监测
//created(){} //钩子函数...
})
参考:vue实例的参数说明
vue实例的参数说明 - 简书