简单讲讲自己成为架构的经历

1.1.4 数组,容器
java提供了一套非常有用且强大的api,通过这套api几乎可以满足绝大部分工作中对于数据存储转换传递的需要.
这就是java的容器类.这里的容器是指java当中存放对象的一些数据结构.简单来说就是放数据的内容
学习容器首先需要理解容器的概念和容器能帮助我们做什么.在实际工作中经常会对一些数据处理.通过java处理一批数据必定需要
把这些数据放起来.然后做操作.java当中的容器就是放这些东西的类.

就像之前我所讲的.对于面向对象来说,我们需要对于我们的功能进行抽象.所以java当中提供了一些接口来表达容器对应的功能
容器有:Collection,Map
进一步划分有:List,Set
容器的实现有:
ArrayList,LinkedList,Vector->Stack
HashSet->LinkedHashSet,TreeSet
HashMap->LinkedHashMap,TreeMap
这里就很有意思了.大家发现实现类有这么多种,是不是没一个都是不用的用法呢?
其实只有两个,一个是Collection一个是Map.
这就是我之前说的抽象的概念,我们抽象的是通用操作方法.不同的实现提供的是内部不同的功能实现.一个相同的操作方法可能会有不同的表现形式.希望大家体会体会.

同样,对于容器的迭代使用java也抽象出了公用的迭代器:Iterator,用于封装同样的访问方法.虽然map无法直接使用迭代器进行访问,但是map的key和entry是可以使用的.这些内容比较基础.大家学习会各个容器的访问和设置方法自己多联系联系即可

下面说一些学习核心:
1. 对于了解容器类.首先需要了解的是每一个不同容器的实现逻辑和内存结构.一定要至少知道内存结构.比如ArrayList是一个数组,LinkedList是一个链表结构.
同样的.对于HashMap重点理解"链表散列"这个概念.如果实在无法理解,就多多看几遍代码.HashMap在设计上有个hash思想.这个通过Hash值来离散数据的设计可以用在很多地方.可以多多理解,比如数据水平拆分,负载均衡设计.包括分布式缓存中的一致性hash设计.都是基于这个.

2. 对于不同内存结构.带来功能和性能上的不同需要理解到.比如经常问到的Array和Linked这两个的性能区别和使用场景区别
需要能够自己理解到.比如随机访问的情况用LinkedList还是ArrayList?
答案是都不用,重写hashCode方法然后用HashMap.希望大家真的能理解这点.

3. 对于容器的迭代器.插入删除的并发控制.目前记住这点内容即可.后续在并发的时候重点有并发的讲解

4. map是一个很特殊的容器.因为使用场景实在太多了.所以jdk1.8对hashMap进行了优化.大家一定要去详细了解一下.(这里不说了.因为这个都已经可以形成一个blog了)

5. 常用编程规范.目前学习到现在应该养成一些编程规范了.比如初始化容器的时候指定大小这些.

楼主 清风_树  发布于 2019-03-23 23:10:00 +0800 CST  
1.1.5 多线程与并发
多线程和容器需要一起来看.前几天面试一个同学的时候就挂在多线程这部分了.他说他的web开发中几乎用不到多线程.
当时我就立即说到.tomcat的线程模型是什么.不同的req是不是运行在不同的线程里面?只是你没有关注过罢了.

所以可以看出来.如果不是做基础架构.一般多线程使用场景较少.一般用多线程的场景也建议使用统一异步调度的方式来进行.
比如在蚂蚁,定时调度使用schedule和三层分发来做.
但是大家必须意识到.自己的程序天然就是运行在多线程里面的.

在面试过程中会单独考察多线程的概念和联合容器一起考察.后者工作中用到的更多.

java多线程体系:
1. 基本的多线程操作.Thread类.启动线程的方法.线程并发的概念.线程安全的处理方式.Sync的方式
然后就是 jdk 1.5中的concurrent包中的新的方式.Lock和Sync的区别.这些基础必须学习好
2. 线程通信的概念,notify的含义.volatile的底层处理方式
3. 底层cpu指令集.性能概述
4. 在工作中使用容器时的并发处理.如map是如何进行并发控制的ConcurrentHashMap和Collections.con的区别是什么.
5. 线程模型.如boss线程守护.多线程轮训的方式.这里涉及到线程池的概念.Executor的处理

多线程的内容非常非常多.需要大量的阅读书籍和练习才能掌握.对于一开始学习java来说.可以考虑先了解概念
针对面试常问的来学习.一般我在面试的时候会重点问下面几个问题
1. 多线程并发控制方式. 答案:api方式sync和lock. 设计方式去掉共享变量.
2. 容器的并发控制方式区别.map的区别和性能.
3. 线程池的相关操作.

由于一般在工作中极少极少用到notify相关内容.所以一般较少考察.不过建议大家学习的时候一定要学习会.
比如下面这个联系题
A,B,C三个线程执行任务.X发放任务.按照A->B->C的方式进行多线程处理任务.用代码实现.

希望大家思考思考.用sync和notify的方式来做

楼主 清风_树  发布于 2019-03-23 23:11:00 +0800 CST  
1.1.6 java异常处理
java对于异常很多人诟病很多.不过基于java异常也可以实现很多优雅的设计.
并且异常也是非常多架构设计中需要考虑的内容.所以针对java的异常学习.除了需要学习基本的概念意外.
需要重点掌握的是针对异常的一些设计.
对于基础知识.
1. 最简单的.了解Throwable,Error,Exception,RuntimeException这些的概念.并且知道用法.对于try-catch-finally需要明白是做什么的
2. 异常设计.一些基本的设计概念.比如通用的需要检查的异常处理内容.方法上抛出的异常.try-catch处理转换.日志打印等内容

对于基础知识来说大家肯定用到了.比如多线程的时候就有打断异常.所以这里不过多介绍.
我更加想给大家介绍一些基本的异常设计方法.可能大家不会太理解.不过知道这个概念也行

工业场景下的典型异常设计方法:
1. RuntimeException
事实上,对于Exception真的是深恶痛绝.这个东西真的会让代码变的非常难看.我们更希望使用非检查异常.并且是自定义异常.
所以最基础的就是.一般我们会设计一个基础异常比如 MyException 继承RuntimeException.
然后把所有的Exception进行try-catch.统一处理成自己的异常.

这样做的好处是.我们可以在架构层面把底层异常封装起来.进行一些特殊处理.让其他同学focus on business.
同时.对外返回统一的业务异常.可以方便使用者统一的进行处理.

2. 统一异常处理设计
一般在程序中.我们是不会到处使用try-catch的.会在 入口层面统一异常处理.返回特定的结果.如果是web服务器的架构.
可以使用filter或者springmvc 的interceptor这种方式.
这样做的好处就是可以定义一套完整的公用的异常处理内容.让业务异常统一处理
并且业务check代码也非常优雅.比如可以用Checker.notNull的方式进行检查.统一报错.这样就不用书写
if(obj ==null){//do something}这样的代码了

3. none Exception设计
关于这点可能有很多疑问.这里主要分业务系统和中间件.其实中间件还是会有很多的异常抛出的.
但是业务系统上一般都设计成没有任何异常抛出.因为对于系统异常.业务系统也需要返回一个特殊的处理内容.让外围可以明确的知道
否则每个系统抛出大量异常.会让调用方非常难以接受.

此外对于一些Aop的设计和处理.为了通用性考虑.我们一般也不会进行异常的抛出.

楼主 清风_树  发布于 2019-03-24 11:43:00 +0800 CST  
好久没更新 就多更新一些大家来看看呀

楼主 清风_树  发布于 2019-03-24 11:43:00 +0800 CST  
1.1.7 封装,继承,多态,接口.
这个概念实际上在面向对象中应该讲到.但是在面向对象里面我更加希望介绍面向对象是一种设计思想的方式
而这里的技术概念.是java来实现面向对象的一些基本方法.
首先必须了解面向对象的概念.这里建议大家重新阅读我之前的概述.并且在这之前建议大家了解面向对象五大原则
他们是:SRP单一职责,OCP开闭,LSP里式替换,DIP依赖倒置,ISP接口隔离

这些职责有很多相似的地方.大家一定完全的明白.并且了解每个原则的概念和细微的差别.比如SRP和OCP对于职责的处理是否有重复描述的地方?这些问题需要能够根据自己的理解来回答.

了解了这些概念之后.学习java如何实现面向对象就非常简单了.
1. 了解继承的基础内容.extends关键字.什么时候使用继承.为什么要用继承.继承解决了什么样的问题.然后是继承面试中问的,重写父类方法.
2. 需要明白什么是多态和java接口的概念.为什么要有interface而不是直接使用abstract class
3. 多态.什么是多态的概念.如何实现多态.如何设计多态.
4. 一些其他的面试题.如重写重载等.
这些基础内容说实话.多写写就知道了.但是知道和正确使用然后是正确设计有着非常大的鸿沟.

这里列举一个很简单的例子来让大家学习这些内容.
这个知识点可以配合设计模式来学习.我们以工厂模式来学习
设定一个工厂接口.他返回一个具体的对象实例.外围系统通过工厂来构建这个实例对象.
比如 ToyFactory.我们首先定义接口定义方法createToy.然后写一个实现类实现这个接口.如 R18ToyFactory.
返回R18的createToy,同样可以定义R14ToyFactory.返回另外的Toy.不同的Toy都是继承自父类AbstractToy

可以在Toy里面定义play方式.不同的工厂返回不同的toy具有不同的play.大家可以试试

简单总结
java实现面向对象需要了解面向对象原则.然后理解基础api的概念.然后配合设计模式来学习

楼主 清风_树  发布于 2019-03-24 21:21:00 +0800 CST  
1.1.8 反射与注解
首先讲一下反射的概念.我们之前有讲过面向对象中的对象是一种抽象.抽象到后面只有特征.java在实现面向对象的时候使用class这个东西.
很自然的.我们能否针对class来进一步抽象呢.class中有方法.局部变量.构造方法等内容.其实反射就是把class进一步抽象.抽离出定义的class的更加基本的"特征".这些特征我们再次使用对象来表达.就是反射.即把java中的对象的特征来进一步抽象封装成更加基本的对象.
以上属于个人理解.
标准反射定义是java操作class的api.什么是反射大家还是基于资料自己来进行理解
然后学习反射中的基本操作.写一个类然后对应获得对应的class然后尝试做一些操作
java反射中有非常多的内容.大家一定要全部学习会.然后进行练习.因为从初级到中级开发.就是反射使用场景的变化
这里我简单介绍一下反射的场景.

1. 通用型框架
因为我们在写框架的时候是给后面的人用的.后面可以自由定义自己的class.所以框架全是基于反射来完成自己的功能的.
比如通用日志打印.新写一个类在方法上加一个@Log的注解就可以完成.其实就是通过反射来拦截具体的方法执行.
所以反射也和注解一起来使用.标记框架运行的方式.

这块的内容非常多.后面我会用具体的例子来说明.这里就不过多介绍了
2. 通用功能
我们提供一个通用的功能.可能只能基于Object或者泛型的方式来提供.因为这样可以提供更加丰富的功能.
但是这样我们就不知道基础类型了.所以只能通过反射的方式来完成.比如把一个bean转换成map
我们可以定义Object.然后通过反射的方式获取所有的变量.然后获取对应的值.转换成map返回.
典型的如BeanUtils的copy属性.就是基于反射来完成的.

简单总结一下吧
对于新手,可能需要完全了解到所有的java反射的操作.对于中级.更多的是需要把反射当成一种技术手段来完成自己的工作
如果是要面试,那么建议刷刷题即可

楼主 清风_树  发布于 2019-03-24 21:21:00 +0800 CST  
主要的javase部分后面就不过多介绍了
相比一些市面上的内容我这里介绍的很粗
我只是针对各个常用知识点罗列了一些大家容易忽略的地方 并且记录了一些知识点大家需要重点理解的地方

大家千万不要觉得只要学习我说的就可以了 对于基础必须全面夯实

接下来简单介绍一下常用框架和一些简单的设计 或者更新一下lz的找工作经历了 最近真的忙 不一定什么时候更新

楼主 清风_树  发布于 2019-03-26 00:08:00 +0800 CST  
不好意思童鞋们 之前一直忙晋升和项目 目前晋升结束啦 可以继续更新了 谢谢大家

楼主 清风_树  发布于 2019-06-03 13:50:00 +0800 CST  
下面讲讲自己的经历 先从来上海第一份工作开始吧 每份经历都会总结一下个人成长和下一段方向的review

第一份经历是上海一个创业的移动互联公司 当时运气比较好 整个互联网仍然处于蓬勃发展中 由于lz没有什么工作经历 所以凭借对ssm的了解和java的基本功也找到了一个8k左右的工作 勉强糊口

在这份工作中我从一个创业公司的java开发 做到了小创业公司的架构

楼主 清风_树  发布于 2019-06-03 22:47:00 +0800 CST  
初加入公司的时候 我加技术老大 还有一个后台开发 一共三个人

整个公司因为是初创 全是新的 这也完全锻炼了我 一开始老大丢一个基于angular的前端 和基本都ssm后端架构让我看

一开始公司也没找准方向基本前三天我都在看这个项目 后面路陆续到齐了ios和安卓同学 公司准备做整形相关的内容上线

由于老大丢的架构是后台项目 个人也只经历谢谢什么图书管理系统的经验 所以整个app的server端全需要从0开始 而我担当次重任

而所有这些都通过同事告诉我的一句话开始”app交互也很简单 就是他们发送http请求 我们返回json就行”

依照这个思路 我把app当成一个ajax请求 所有返回值都是json来开始搭建系统

首先统一包装了三层应用架构 然后网上学习到了restful的概念 然后依据restfull来设计整个业务结构 然后围绕功能进行设计了整个架构

整个架构包括 统一数据层 json返回处理 统一返回结构 统一异常管理内容

然后依据该功能完成了登录 注册 商品内容 这是第一个阶段

楼主 清风_树  发布于 2019-06-03 22:57:00 +0800 CST  
第一个阶段的总结是 学习和实际开发差别很大很大

我们需要的是具体解决问题的能力和思路 在这其中思考方式尤其重要 当时的整个思考方式是架构精美 代码复用层度高

同时我们需要考虑的业务方方面面 需要写sql 需要设计数据结构 需要设计异常管理 需要设计包名字 应用分层等等等等的内容

在这其中思考非常重要

第一阶段完成之后 我进入到第二个学习阶段 因为刚才说到的商品展示 那么狠明显商品是有图片的 然后了解到了cdn的概念并且使用了公共cdn服务 学习了整个的cdn使用

此外 当时的创业公司 所以所有服务用的都是ucloud云服务 包括服务器 数据库以及后面的redis 这时又学习了云服务相关知识 学习了Linux命令和服务部署

可以发现第二个阶段是非代码技能 我们因为项目的上线和应用 需要了解和使用从开发之后的整个部署包括技术体系

在这个时候老大对我的帮助非常非常大 很多技术体系都是老大直接告诉我的 然后我去进一步学习和了解 并且老大也愿意把整个应用交给我负责(也是之前学习的态度起作用了)

这个时候痛苦和快乐并存 痛苦的是学习压力真的很大 快乐的是每天都看到自己的成长 不断的学习和挑战

楼主 清风_树  发布于 2019-06-03 23:07:00 +0800 CST  
不好意思断更这么久 我现在新开一贴主讲架构模式 后续这个帖子就不更新架构和技术的内容了 如果大家还敢兴趣 我就把我的经历继续讲一下吧

楼主 清风_树  发布于 2020-06-04 20:55:00 +0800 CST  
我继续讲讲我在第一家公司的成长经历吧


也是机缘巧合 我一个新手加入了一个从0开始的企业 并且技术总监也方心让我抄刀整个项目

这其中的成长总结一句话就是独立解决问题 即遇到问题就去查资料 去思考 想办法优化代码 优化结构

然后需要具备抽象思维去解决具象的问题


另外就是之前的培训也让额有了比较好的起点 可以让我知道怎么上手代码 关键的地方比如spring 搭建 db和mvc的使用这些都不会抓瞎

楼主 清风_树  发布于 2020-06-04 21:11:00 +0800 CST  
我们聊点技术外的 讲讲我当时的生活吧

楼主 清风_树  发布于 2020-06-04 21:15:00 +0800 CST  
在前面其实也说了 当时是退学来到上海的 培训1.4万也没钱 所以自己从银行卡里面贷款了两万 现在想想当时真的也是孤注一掷了 贷款完毕之后交学费和住宿费也没剩什么了

还好我这个人比较抗饿 吃了早点可以不吃午饭 哈哈 所以就是早上买四个大包子 全吃了之后中午就可以休息休息看看代码 然后晚上就路边摊买菜饭骨头汤 话说菜饭骨头汤真是厉害啊 鸡腿那时才八块 简直救了我的命

楼主 清风_树  发布于 2020-06-04 21:19:00 +0800 CST  
现在还清晰的记得培训学校旁边有个徽州面馆还是什么 同学会去吃蹄花面 一碗面要三十多 三十多是我三天的伙食费了 所以也就一直忍住没吃


学习的时候每天学到凌晨两三点吧 当时感觉洗澡都是浪费时间 每天思考代码 设计模式 三层架构 ssm等等内容 做梦都会梦到分页算法

其实专注起来时间过的很快 六个月之后毕业就找工作了 当时人品爆发 找到了一份1.45k的工作 就这样踏入了工作

楼主 清风_树  发布于 2020-06-04 21:24:00 +0800 CST  
后面出来工作 当时自己租了一个房子 一楼的一个隔断房 里面只有一张床 卫生间也是在室内的

隔断房是不可能通风的 每次洗澡水汽都会冒出来 并且一楼也实在太潮湿了 身上都会起很多湿疹 但是好歹便宜

上班的地方距离家将近两个小时的路程 上下班的路上当时也是在地铁上看书 看了很多励志书和技术的书 现在想想还真是很有趣

楼主 清风_树  发布于 2020-06-04 21:41:00 +0800 CST  
工作当中学习的内容上面也说了 这里就不重复了


说实话 第一份工作的时候压力非常大 什么都不懂 但是也专心学习 重点是下班了之后仍然进行查询资料 学习框架 学习设计 看一些网上的文章

一般而言网上的文章都不成体系 比较零散 此时就自己深入分析整理资料 加上自己的思考 慢慢就掌握了第一份工作

楼主 清风_树  发布于 2020-06-05 20:45:00 +0800 CST  
如果有什么问题 大家可以私聊我加我的微信

楼主 清风_树  发布于 2020-06-06 08:43:00 +0800 CST  
我的微信 letmehi 有问题的同学可以加我微信

楼主 清风_树  发布于 2020-08-04 19:14:00 +0800 CST  

楼主:清风_树

字数:23707

发表时间:2019-01-17 21:04:00 +0800 CST

更新时间:2021-02-23 06:19:43 +0800 CST

评论数:1927条评论

帖子来源:百度贴吧  访问原帖

 

热门帖子

随机列表

大家在看