架构之路

来源:互联网 发布:c 多文件编程问题 编辑:程序博客网 时间:2024/05/29 17:19
JDK1.5新增的功能   ==>>>
字符流和字节流的区别,使用场景,相关类   ==>>>
线程安全的概念,实现线程安全的几种方法   ==>>>
抽象类和接口的区别,使用场景   ==>>>
hash算法的实现原理,hashcode的实现原理   ==>>>
error和exception的区别,RuntimeException和非RuntimeException的区别   ==>>>
继承与组合的区别,使用场景   ==>>>
使用静态工厂方法的好处和坏处   ==>>>
排序算法,他们是时间复杂度是多少   ==>>>
数据库设计原则、范式   ==>>>
数据库常用的编码方式有哪几种
如果有10万条学生成绩信息,怎么获取成绩最高的那一条数据,怎么获取成绩第三的那一条数据,列举你认为性能最好的方式   ==>>>
序列化的作用,应用场景,除了网路传输   ==>>>
spring的IOC、AOP的使用场景   ==>>>
ajax是否能跨域请求,解决的办法   ==>>>
解析xml的几种方法,他们的原理   ==>>>
怎么样实现高性能的代码  ==>>>
如果有和其他系统有接口调用,但其他系统还没开发完成,怎么进行单元测试   ==>>>
防止重复提交有哪几种方式 (这个网上很多,可以google下)
怎么样运用样式设计一个DIV浮出层
数据库连接池的实现原理,请求怎么样去获取连接,,关闭连接时,连接池是销毁连接还是回收连接   ==>>>
tomcat、weblogic、jboss的区别,容器的作用   ==>>>
apache是容器么,它的作用是什么   ==>>>
内部跳转和外部跳转的区别,底层实现原理   ==>>>
http和https的区别   ==>>>
宕机的原因有哪几种,怎么样分析宕机的原因,如:数据库的长连接。。。   ==>>>
在velocity页面,为什么不推荐不推荐使用宏定义   ==>>>
webx的核心原理,webx框架和velocity的优缺点   ==>>>
页面上如果有一个screen和两个control,那么他们有几个context   ==>>>
一个含有layout、screen和control的页面,他们的加载顺序是什么,是等所有的加载完一起显示,还是其他。。。   ==>>>
#if($!a==’true’)会出问题么,为什么   ==>>>
支付宝怎么样保证他的安全,他的调用异常分哪几种   ==>>>
项目中你觉得做得最好的是什么   ==>>>
35.java除了8种基本类型外,在虚拟机里还有哪一种,有什么作用?
36.除了使用new关键字创建对象意外,试列举另外三种以上创建实例的方式?
37.classloader中,JDK的API、Classpath中的同web-inf中的class加载方式有什么区别?
38.列举三种以上垃圾回收算法,并比较其优缺点?
39.编写代码实现一个线程池
40.描述一下JVM加载class文件的原理机制?
JVM中类的装在是由ClassLoader和它的子类来实现的,java ClassLoader是一个重要的java运行时组件。它负责在运行时加载和装入类文件的类。
41.试举例说明一个典型的垃圾回收算法?
42.请用java写二叉树算法,实现添加数据形成二叉树功能,并以先序的方式打印出来.
43.请写一个java程序实现线程连接池功能?
44.给定一个C语言函数,要求实现在java类中进行调用。
45.如何获得数组的长度?
46.访问修饰符“public/private/protected/缺省的修饰符”的使用
47.用关键字final修饰一个类或者方法时,有何意义?
48.掌握类和对象的概念,掌握面向对象编程的本质
49.静态变量和静态方法的意义,如何引用一个类的静态变量或者静态方法?
50.JAVA语言如何进行异常处理,关键字:thorws,throw,try,catch,finally
51.Object类(或者其子类)的finalize()方法在什么情况下被调用?
52.一个“.java”原文件中是否可以包括多个类(不是内部类)?
53.掌握内部类和接口的概念
54.StringTokenizer类的使用
55.数据结构,如何遍历List中的元素?
   如果要按照键值保存或者访问数据,使用什么数据结构?
   要掌握Collection相关的接口和类的使用
56.使用StringBuffer类与String类进行字符串连接时有何区别?
57.调用Thread类的destroy()方法有什么后果?
58.多线程,用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
59.使用socket建立客户端与服务器的通信的过程
60.JAVA语言国际化应用,Locale类,Unicode
61.描述反射机制的作用
62.如何读写一个文件?
关于Hashcode方法和equals?

哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率。在Java的Object类中有一个方法:

1
public native int hashCode();
  根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现。

  为何Object类需要这样一个方法?它有什么作用呢?今天我们就来具体探讨一下hashCode方法。

一.hashCode方法的作用

  对于包含容器类型的程序设计语言来说,基本上都会涉及到hashCode。在Java中也一样,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。

  为什么这么说呢?考虑一种情况,当向集合中插入对象时,如何判别在集合中是否已经存在该对象了?(注意:集合中不允许重复的元素存在)

  也许大多数人都会想到调用equals方法来逐个进行比较,这个方法确实可行。但是如果集合中已经存在一万条数据或者更多的数据,如果采用equals方法去逐一比较,效率必然是一个问题。此时hashCode方法的作用就体现出来了,当集合要添加新的对象时,先调用这个对象的hashCode方法,得到对应的hashcode值,实际上在HashMap的具体实现中会用一个table保存已经存进去的对象的hashcode值,如果table中没有该hashcode值,它就可以直接存进去,不用再进行任何比较了;如果存在该hashcode值, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址,所以这里存在一个冲突解决的问题,这样一来实际调用equals方法的次数就大大降低了,说通俗一点:Java中的hashCode方法就是根据一定的规则将与对象相关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数值称作为散列值。下面这段代码是java.util.HashMap的中put方法的具体实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public V
 put(K key, V value) {
        if (key
 == null)
            return putForNullKey(value);
        int hash
 = hash(key.hashCode());
        int i
 = indexFor(hash, table.length);
        for (Entry<K,V>
 e = table[i]; e != null;
 e = e.next) {
            Object
 k;
            if (e.hash
 == hash && ((k = e.key) == key || key.equals(k))) {
                V
 oldValue = e.value;
                e.value
 = value;
                e.recordAccess(this);
                return oldValue;
            }
        }
 
        modCount++;
        addEntry(hash,
 key, value, i);
        return null;
    }
  put方法是用来向HashMap中添加新的元素,从put方法的具体实现可知,会先调用hashCode方法得到该元素的hashCode值,然后查看table中是否存在该hashCode值,如果存在则调用equals方法重新确定是否存在该元素,如果存在,则更新value值,否则将新的元素添加到HashMap中。从这里可以看出,hashCode方法的存在是为了减少equals方法的调用次数,从而提高程序效率。


HashMap与HashTable?


1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。

2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。

3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。

4.HashTable使用Enumeration,HashMap使用Iterator。


支付宝笔试面试


1. cookie 和 session 的区别

cookie机制采用的是在客户端保持状态的方案,
  而session机制采用的是在服务器端保持状态的方案。
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
      考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
   考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、
   将登陆信息等重要信息存放为SESSION
   其他信息如果需要保留,可以放在COOKIE中

2. JVM 内存模型

3. SQL注入的原理

4. 悲观锁 和 乐观锁

5. 读程序,输出结果. 关于treemap的

6. linux 基础命令,统计日志中的信息

7. java 分布式集群

8. 一道设计题,具体到数据库的表.大概是淘宝的搜索中,输入手机,会出来很多类型,按品牌按价格区间按手机种类.

还有2道题我记不住了.

面试:

1.介绍你做过的项目,用到的技术,涉及到的模块,然后从项目中问各种技术实现的细节(为了确保你是真的懂了).

2.看你的试卷,喊你讲解做题的思路,以及这样结果的原因.(考的是各位的java基础知识了,这点是绕不过去的,懂了就懂了啊,只有平时多看书)

3.团购6位验证码以及团购成功后,发送到你手机上的条码的实现方式.(第一个问题我说用随机数+时间来验证.第二个问题老实说,我也没答上来,我说用序列,面试官说序列到后期20位以上的时候,用户体验很差的)

4.淘宝上是如何保证库存和订单之间的数据准确性的.(考点是分布式事务,这个问题我也没答上来,最后他问我有什么问题问他的时候,我就反问的这个问题,面试官人挺好的,给我耐心的讲解了一遍淘宝的实现方式以及

epay的实现方式. 淘宝是通过分布式事物,中间用了一个叫协调者角色的程序,当那边点击购买时,会库存减一,保存一条预扣的状态,但是是个预准备状态,然后做成功后,协调者会在另一个数据库生成订单,然后这个订单也是预状态,等两边都准备好以后,通知协调者,又协调者统一完成这2个数据库的事物,从而达到完成一笔交易的目的,若其中一方失败,则将预扣的数字返回到库存从而实现类似回滚的操作.)

5.索引的原理.能否构建时间索引.时间索引构建后会存在什么问题.(索引原理我是回答的堆表索引的构建原理以及查询原理,但是关于时间索引的问题,我也没回答出个所以然来,看面试官的反馈,好像回答得不够好吧)

6.你们数据库的数据量有多大,(回答:我们是电信方面的系统,表上亿的数据很正常).问:如果保证效率?

(我是如此回答的,各位自行结合自身的情况参考.答:后台J OB程序会定期备份,把生产表数据移走,然后备份表也会再备份一次,如此剃度的备份,保证生产库的数据是最小的.然后备份表采用分区和子分区,加上构建战略索引(分析系统的sql,常用

查询字段构建复合索引,以减少每次查询时对表的访问次数)).

7.SQL注入的原理以及如何预防,并举例.(这个相对简单,网上一搜一大片)

8.使用过Memcache么? 用在项目中哪些地方? (答,在门户主机上使用,缓存session,分布式的时候,统一访问这台主机验证用户session是否存在,来维持回话的状态和实现回话同步.又追问:java代码中如何实现访问门户服务器的这个session池子的? 几年前的代码,确实忘记了..于是坦白的说,记不清楚了 )

这些是主要的问题,当你回答一个大问题时中间还有很多比较碎的追问性质的小问题,总体给我的感觉是,氛围很轻松+愉快的,技术层面上还是需要你真正的理解透彻一些关键技术点,才能做到应付各种追问和给出满意的答案吧.如果只是一知半解想去蒙混过关肯定是不行的,毕竟在支付宝的技术大牛面前,多追问几句,也就把你逼到死角了.

还有一点比较重要的感觉就是,他们比较在意你是否了解当下的一些比较热的技术点,比如淘宝的秒杀,是如何保证高并发下的安全性和性能,新浪微博那种大数据量的发送,怎么就保证正确性和时效性的.


高级面试总结


  列举常见集合框架类型
(1)       List、Set、Map。由这三个接口实现出ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等常用集合框架。
(2)       Vector属于重量级组件不推荐使用。
(3)       Map类型维护键/值对,Hashtable与HashMap相近但效率略低于HashMap、高于TreeMap、TreeMap优点是可以排序。
(4)       Set类型可以装入唯一值,HashSet效率高于TreeSet但TreeSet可以维护内部元素的排序状态。
(5)       List类型可按某种特定顺序维护元素。ArrayList允许快速随机访问,但如果添加或删除位于中间的元素时效率很低;LinkedList提供最佳循环访问及快速的中间位置添加删除元素,并有addFirst、addLast、getFirst、getLast、removeFirst、removeLast方法。
18、  面向对象的特征:
(1)       继承:通过子类可以实现继承,子类继承父类的所有状态和行为,同时添加自身的状态和行为。
(2)       封装:将代码及处理数据绑定在一起的一种编程机制,该机制保证程序和数据不受外部干扰。
(3)       多台:包括重载和重写。重载为编译时多态,重写是运行时多态。重载必须是同类中名称相同参数不同(包括个数不同和类型不同),但返回类型不同不构成重载;重写发生于子类对父类的覆盖,子类继承父类方法名相同、参数列表相同、返回类型相同才构成重写。
19、  Java命名规范:
(1)       必须以应为字母、下划线或$开始,其余可以有数据但不允许包含空格,且组合后的名称不能是Java关键字或保留字。
(2)       匈牙利命名法:以m开始为类成员变量,以g开始为全局变量,以v开始为本的局部变量,常量命名一般不以下划线、美元符开始。
(3)       驼峰命名:一般称由多个单词或缩写组成的变量名,并且该变量名每个单词首字母均为大写(一般类名全部首字母大写,方法或属性名第一个字母小写)的称为驼峰命名。
20、              Java语言共包含47个关键字。
21、              设计模式:
一个设计模式描述了一个被证实可行的方案。这些方案非常普遍,是具有完整定义的最常用的模式。一般模式有4个基本要素:模式名称(pattern name)、问题(problem)、解决方案(solution)、效果(consequences)
常见23种模式概述:
(1)       抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
(2)       适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。
(3)       桥梁模式(Bridge):将抽象部分与他的实现部分分离,使他们都可以独立的变化。
(4)       建造模式(Builder):将一个复杂对象的构建与他的标表示分离,使同样的构建过程可以创建不同的表示。
(5)       责任链模式(Chain of Responsibility):为解除请求的发送者和接收者之间耦合,而使多个对象都有几乎处理这个请求。将这些对象连成一条链,并沿着这条链传递给请求,知道有一个对象处理他。
(6)       命令模式(Command):将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排列或记录请求日志,以及支持可取消的操作。
(7)       合成模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。
(8)       装饰模式(Decorator):动态地给一个对象添加一些额外的职责。就扩展功能而言,他能生成子类的方式更为灵活。
(9)       门面模式(Facade):为子系统中的一组接口提供一个一致的界面,门面模式定义了一个高层接口,这个接口使得这一子系统更加容器使用。
(10)   工厂方法(Factory Mehtod):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。
(11)   享元模式(Flyweight):运用共享技术以有效地支持大量细粒度的对象。
(12)   解释器模式(Interpreter):给定一个语言,定义他的语法的一种表示,并定义一个解释器,该解释器使用该表示解释语言中的句子。
(13)   迭代子模式(Iterator):提供一种方法顺序访问一个聚合对象中的各个元素,而又不需暴露该对象的内部表示。
(14)   调停者模式(Mediator):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式的内部表示。
(15)   备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。
(16)   观察者模式(Observer):定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于他的对象都得到通知并自动刷新。
(17)   原始模型模式(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这个原型创建新的对象。
(18)   代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。
(19)   单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问他的全局访问点。
(20)   状态模式(State):允许一个对象在其内部状态改变时改变他的行为。对象看起来似乎修改了他所属的类。
(21)   策略模式(Strategy):定义一系列的算法,把他们一个个封装起来,并且使他们可相互替换。本模式使得算法的变化可独立使用他的客户。
(22)   模板模式(Template Mehtod):定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
(23)   访问者模式(Visitor):表示一个作用于某对象结构中的各元素的做。该模式可以实现在不改变各元素的类的前提下定义作用于这些元素的新操作。
22、              简述常用的软件开发文档
(1)       可行性研究报告
(2)       项目开发计划
(3)       软件需求说明书(必有)
(4)       数据要求说明书
(5)       概要设计说明书(必有)
(6)       详细设计说明书(必有)
(7)       数据库设计说明书(必有)
(8)       用户手册(一般会有)
(9)       操作手册(必有)
(10)   模块开发卷宗
(11)   测试计划(必有)
(12)   测试分析报告
         进度报告

         项目总结报告


============================================

JDK1.5新增的功能
  字符流和字节流的区别,使用场景,相关类
  线程安全的概念,实现线程安全的几种方法
  抽象类和接口的区别,使用场景
  hash算法的实现原理,hashcode的实现原理
  error和exception的区别,RuntimeException和非RuntimeException的区别
  继承与组合的区别,使用场景
  使用静态工厂方法的好处和坏处
  排序算法,他们是时间复杂度是多少
  数据库设计原则、范式
  数据库常用的编码方式有哪几种
  如果有10万条学生成绩信息,怎么获取成绩最高的那一条数据,怎么获取成绩第三的那一条数据,列举你认为性能最好的方式
  序列化的作用,应用场景,除了网路传输
  spring的IOC、AOP的使用场景
  ajax是否能跨域请求,解决的办法
  解析xml的几种方法,他们的原理
  怎么样实现高性能的代码
  如果有和其他系统有接口调用,但其他系统还没开发完成,怎么进行单元测试
  防止重复提交有哪几种方式 (这个网上很多,可以google下)
  怎么样运用样式设计一个DIV浮出层
  数据库连接池的实现原理,请求怎么样去获取连接,,关闭连接时,连接池是销毁连接还是回收连接
  tomcat、weblogic、jboss的区别,容器的作用
  apache是容器么,它的作用是什么
  内部跳转和外部跳转的区别,底层实现原理
  http和https的区别
  宕机的原因有哪几种,怎么样分析宕机的原因,如:数据库的长连接。。。
  在velocity页面,为什么不推荐不推荐使用宏定义
  webx的核心原理,webx框架和velocity的优缺点
  页面上如果有一个screen和两个control,那么他们有几个context
  一个含有layout、screen和control的页面,他们的加载顺序是什么,是等所有的加载完一起显示,还是其他。。。
  #if($!a==’true’)会出问题么,为什么
  支付宝怎么样保证他的安全,他的调用异常分哪几种
  项目中你觉得做得最好的是什么




前台:jquery,velocity
框架:springMVC,spring mybatis (以前用struts2,后因OpenSSL等各种漏洞,用得少了)
DB:mysql(分库、分表,及主从备份、双机热备、纵向扩展、横向扩展),mongoDB,hbase,h2(嵌入式DB)
缓存:Redis,memcached
通信:WebService(cxf的soap、restful协议)
消息队列:activeMQ
异步并行框架:TBSchedule
worker:quartz
工作流:activity
搜索引擎:lucene,基于lucene封装的solr
集群技术:hadoop



===========================================================

JAVA EE架构师 需要具备的知识 (2014-03-21 14:10:46)
标签: 杂谈    
1、构架师胚胎(程序员)
学习的知识是语言基础、设计基础、通信基础等,应该在大学完成,内容包括java、c、c++、uml、RUP、XML、socket通信(通信协议)——学习搭建应用系统所必须的原材料。
2、构架师萌芽(高级程序员)
学习分布式系统、组建等内容,可以在大学或第一年工作时间接触,包括分布式系统原理、ejb、corba、com/com+、webservice(研究生可以研究网络计算机、高性能并发处理等内容)
3、构架师幼苗(设计师)
应该在掌握上述基础之上,结合实际项目经验,透彻领会应用设计模式,内容包括设计模式(c++版本、java版本)、ejb设计模式、J2EE构架、UDDI、软件设计模式等。在此期间,最好能够了解软件工程在实际项目中的应用以及小组开发、团队管理。
4、软件构架师的正是成型在于机遇、个人努力和天赋软件构架师其实是一种职位,但一个程序员在充分掌握软构架师所需的基本技能后,如何得到这样的机会、如何利用所掌握的技能进行应用的合理构架、如何不断的抽象和归纳自己的构架模式、如何深入行业成为能够胜任分析、构架为一体的精英人才这可不是每个人都能够遇上的馅饼……
第一阶段,think in java关于java方面的特性都需要知道
第二阶段,要学会使用jdk的帮助文档,
第三阶段,开始看effective java
第四阶段,必看 java模式
后面还需要了解rup,uml东西
这些完了,经过一些列项目经历下,2-4年后你应该就可以到达java的中等水平了吧
Java学习的30个目标以及系统架构师推荐的书 收藏
第一阶段
2.你需要学习JAVA语言的基础知识以及它的核心类库 (collections,serialization,streams,networking, multithreading,reflection,event,handling,NIO,localization,以及其他)。
5.你需要学习java数据库技术,如JDBCAPI并且会使用至少一种persistence/ORM构架,例如Hibernate,JDO, CocoBase,TopLink,InsideLiberator(国产JDO红工厂软件)或者iBatis。
24.你应该熟练掌握一种JAVAIDE例如sunOne,netBeans,IntelliJIDEA或者Eclipse。(有些人更喜欢VI或EMACS来编写文件。随便你用什么了:)
26.你需要熟悉一种单元测试体系(JNunit),并且学习不同的生成、部署工具(Ant,Maven)。
27.你需要熟悉一些在JAVA开发中经常用到的软件工程过程。例如RUP(RationalUnifiedProcess)andAgilemethodologies。
第二阶段
1.你需要精通面向对象分析与设计(OOA/OOD)、涉及模式(GOF,J2EEDP)以及综合模式。你应该十分了解UML,尤其是class,object,interaction以及statediagrams。
3.你应该了解JVM,classloaders,classreflect,以及垃圾回收的基本工作机制等。你应该有能力反编译一个类文件并且明白一些基本的汇编指令。
6.你还应该了解对象关系的阻抗失配的含义,以及它是如何影响业务对象的与关系型数据库的交互,和它的运行结果,还需要掌握不同的数据库产品运用,比如:oracle,mysql,mssqlserver。
7.你需要学习JAVA的沙盒安全模式(classloaders,bytecodeverification,managers,policyandpermissions,
codesigning, digitalsignatures,cryptography,certification,Kerberos,以及其他)还有不同的安全/认证 API,例如JAAS(JavaAuthenticationandAuthorizationService),JCE (JavaCryptographyExtension),JSSE(JavaSecureSocketExtension),以及JGSS (JavaGeneralSecurityService)。
第三阶段
10.你需要学习如何使用及管理WEB服务器,例如tomcat,resin,Jrun,并且知道如何在其基础上扩展和维护WEB程序。
8.你需要学习Servlets,JSP,以及JSTL(StandardTagLibraries)和可以选择的第三方TagLibraries。
4.如果你将要 写客户端程序,你需要学习WEB的小应用程序(applet),必需掌握GUI设计的思想和方法,以及桌面程序的SWING,AWT, SWT。你还应该对UI部件的JAVABEAN组件模式有所了解。JAVABEANS也被应用在JSP中以把业务逻辑从表现层中分离出来。(这条可有可无)
9.你需要熟悉主流的网页框架,例如JSF,Struts,Tapestry,Cocoon,WebWork,以及他们下面的涉及模式,如MVC/MODEL2。
14.你应该学习如何利用JAVAAPI和工具来构建WebService。例如JAX- RPC(JavaAPIforXML/RPC),SAAJ (SOAPwithAttachmentsAPIforJava),JAXB(JavaArchitectureforXMLBinding),JAXM(JavaAPIforXMLMessaging), JAXR(JavaAPIforXMLRegistries),或者JWSDP(JavaWebServicesDeveloperPack)。
15.你需要学习一门轻量级应用程序框架,例如Spring,PicoContainer,Avalon,以及它们的IoC/DI风格(setter,constructor,interfaceinjection)。
20.你需要熟悉对不同有用的API和frame work等来为你服务。例如Log4J(logging/tracing),Quartz (scheduling),JGroups(networkgroupcommunication),JCache(distributedcaching), Lucene(full-textsearch),JakartaCommons等等。
25.JAVA(精确的说是有些配置)是冗长的,它需要很多的人工代码(例如EJB),所以你需要熟悉代码生成工具,例如XDoclet
第四阶段
16.你需要熟悉不同的J2EE技术,例如JNDI(JavaNamingandDirectoryInterface),JMS (JavaMessageService),JTA/JTS(JavaTransactionAPI /JavaTransactionService),JMX (JavaManagementeXtensions),以及JavaMail。
11.你需要学习分布式对象以及远程API,例如RMI和RMI/IIOP。
12.你需要掌握各种流行中间件技术标准和与java结合实现,比如Tuxedo、CROBA,当然也包括javaEE本身。
17.你需要学习企业级JavaBeans(EJB)以及它们的不同组件模式:Stateless/StatefulSessionBeans,EntityBeans(包含Bean- ManagedPersistence[BMP]或者Container-ManagedPersistence[CMP]和它的EJB-QL),或者 Message-DrivenBeans(MDB)。
13.你需要学习最少一种的XMLAPI,例如JAXP(JavaAPIforXMLProcessing),JDOM(JavaforXMLDocumentObjectModel),DOM4J,或JAXR(JavaAPIforXMLRegistries)。
18.你需要学习如何管理与配置一个J2EE应用程序服务器,如WebLogic,JBoss等,并且利用它的附加服务,例如簇类,连接池以及分布式处理支援。你还需要了解如何在它上面封装和配置应用程序并且能够监控、调整它的性能。
第五阶段(优先级低)
19.你需要熟悉面向方面的程序设计以及面向属性的程序设计(这两个都被很容易混淆的缩写为AOP),以及他们的主流JAVA规格和执行。例如AspectJ和AspectWerkz。
21.如果你将要对接或者正和旧的系统或者本地平台,你需要学习JNI (JavaNativeInterface) and JCA (JavaConnectorArchitecture)。
22.你需要熟悉JINI技术以及与它相关的分布式系统,比如掌握CROBA。
23.你需要JavaCommunityProcess(JCP)以及他的不同JavaSpecificationRequests(JSRs),例如Portlets(168),JOLAP(69),DataMiningAPI(73),等等。
28.你需要能够深入了解加熟练操作和配置不同的操作系统,比如GNU/linux,sunsolaris,macOS等,做为跨平台软件的开发者。
29.你还需要紧跟java发展的步伐,比如现在可以深入的学习javaME,以及各种java新规范,技术的运用,如新起的web富客户端技术。
30.你必需要对opensource有所了解,因为至少java的很多技术直接是靠开源来驱动发展的,如java3D技术。
====================================================================
附:
JAVA系统架构师应该看的几本书
Thinking in Java
Effective Java
UML基础、案例与应用
UML入门提高
软件工匠
设计模式——可复用面向对象软件的基础
重构-改善既有代码的设计
敏捷软件开发-原则、模式、实践
企业应用架构模式
Expert One-on-One J2EE Development without EJB
软件工程——实践者的研究方法
软件领导--成功开发软件的指导准则
后面的两本书,其实已经有点属于项目经理的范畴了,不过还不是很深入,看看对做成功的系统架构师是很有好处。
企业应用的系统架构师应该关注的几个方面 (具体情况具体分析,以下未必准确,只是参考)
先来一些基础面试题,您答得出么?
1、说说JVM原理?内存泄露与溢出区别,何时产生内存泄露?
2、用java怎么实现有每天有1亿条记录的DB存储?mysql上亿记录数据量的数据库如何设计?
3、mysql支持事务吗?DB存储引擎有哪些?
4、mvc原理,mvc模式的优缺点,如果让你设计你会怎么改造MVC?
5、hibernate支持集群吗?如何实现集群?
6、tomcat 最多支持并发多少用户?
7、map原理,它是如何快速查找key的?map与set区别?
8、描术算法,如何有效合并两个文件:一个是1亿条的用户基本信息,另一个是用户每天看电影连续剧等的记录,5000万条。内存只有1G???
9、在1亿条用户记录里,如何快速查询统计出看了5个电影以上的用户? ----可以参考 位图索引的原理
10、Spring如何实现IOC与AOP的,说出实现原理?
数据持久层的设计
在Spring和Hibernate,ibatis出来以前,几乎每家公司都有自己的一套方法和架构,而架构师的50%的精力也会集中到这上面,EJB只是增加架构师的负担。在Spring出来以后,基本上,大多数的架构师都从重复设计这个轮子的无用功中解脱出来了。Rod的轮子太好用了,基本上,大家只要套上去就行了,或者,剩下最重要的事情,是选择一个合适的数据库连接池的开源项目吧
MVC架构的具体设计
MVC只是个概要的概念,具体如何实现的具体技术很多,根据项目设计最恰当的架构
大并发性访问
太多了,包括从广域网到服务器到业务层再到架构再到程序、数据库的各种调优,如使用缓存,静态化,静动态server分离,在数据量达到一定程度时,使用集群技术,优先考虑利用服务器的集群,其次是硬件集群,最后才是应用本身加入集群功能
超大数据量返回结果
缓存命中率,分页,优化SQL语句,循环处理数据时尽可能共用对象,只保留关键数据,及时释放内存占用
超大文件的读取和生成
尽可能快的读取大文件,并进行分析。写入大文件时,如何及时释放内存。学会适当利用操作系统的命令行资源来更快完成任务。这方面经验比较少,以后有空研究。
多线程的应用和管理
线程池的管理和监控,线程的启动(包括定时启动),结束,回收,线程资源的释放,这句话太简单了,待深入研究
用户界面可用性设计
平衡速度和可用性,恰当的使用异步和同步技术,展现关键数据为重点
分布式的数据交流和集成
选择恰当的数据交互方式,从最泛滥低效的Web Service到最实用的文件共享
群集系统的管理
如何确保缓存的同步?如何确保对象唯一性?如何保证各台机器的同步?
是否采用EJB?如何利用J2EE的特性(例如JNDI)
复杂的业务规则
规则引擎和工作流引擎场景和应用
其实,作为一个真正的系统架构师,不应该局限于企业应用的系统,这种系统往往有数据库的局限性,有时候,应该考虑是否可以横向跨越,直接对其它系统做一些架构考虑,在没有丰富的实战经验的前提下,而只是看了其它人的系统和代码,就能够给出有效的设计指导。
例如对于一个下载软件,可以有如下考虑:
1. 未明和非法url的检验,已经下载失败的容许,信息记录
2. 多线程下载一个文件,文件的切分和拼合,部分切片丢失的拼合可能性
3. 下载线程管理
4. 服务器或者P2P的机器之间的通讯协议
5. 速度监控和限制
6. 下载进度的监控和显示
作为一个在线播放软件,可以做如下考虑
1. 播放速度的保证
机器的问题基本不存在了,关键是网络问题。如何在检测网络速度,根据影片的质量,并缓冲足够多的内容,保证播放一直尽可能顺利的完成。
2. 播放质量的保证
如何利用DirectX等技术,最快的进行渲染,是自己写底层,还是利用已有的API
由于没做过类似的项目,可以写的东西还是少很多了。
系统架构师应该有的素质:
1、 实际的编程经验
最少2年吧,多了就不说了,其实从大学就开始钻研的话,
2、 书面表达能力和口头交流能力
综合利用架构图,UML图,文字和代码片断,表达自己设计思想,至于是Word还是ppt,应该通吃
在开发人员中发现架构师的最有价值标准是有效的沟通。您需要技术娴熟、经验丰富的开发人员,这样的人员需要有就项目中的业务相关问题进行沟通的经历。架构师经常必须对理解方面的差距进行预计,然后才能有所贡献。他们必须愿意克服困难来确保技术和业务观点的融合。他们并不必对意见交换工作进行计划和协调;这仍然主要是项目经理的工作。他们的任务是确定表述系统设计时的最佳工具和构件,以促进有效的意见交换。他们必须能够判断当前方法显得不足而需要采用新方法的情况。写作技能也非常重要,还需要具有制作草图的技能或使用制图软件的能力。
3、 自觉主动;积极解决设计问题
架构师的日常工作目标经常并不明确。很多开发人员直接参考功能规范来列出任务清单。架构师通常则是向这些开发人员提供所需结构的人员,以便尽可能提高工作效率。好的候选者不仅进行沟通方面的工作,而且也会预计各种设计问题并加以解决——通常在没有任何具体指示的情况下自觉进行。无论所分配的职责如何,积极参与项目的开发人员都有机会从一起工作的人员中脱颖而出。
4、 抽象思维能力和总结能力
架构师,顾名思义,在系统未搭建好之前,就要能够有一个草图在心。而如果是对现有系统的改造,那么能在看过系统的文档(如果有的话)和代码后,就能总结出系统的架构特点。
架构师必须能够理解表述模糊的概念并将其变成相关各方能够理解的项目构件。他们必须能够理解抽象概念,并以具体的语言对其进行沟通。开发人员中好的候选者经常要求或自己主动解释开发生命周期中容易混淆的问题。他们能迅速评估各种想法并将其纳入后续工作的操作建议中。
开发人员经常具有很强的数学能力,而好的架构师则倾向于表现出更强的口头表达能力。管理人员经常说开发人员具有“工程意识”,而这是一个用于评估架构师的非常有意义的方面。架构师应该具有很强的解决技术问题的能力,但还必须能够准确获知更为全面的人员如何与技术交互的信息。这要求具有某种形式的抽象思维(而不再是代码的细节),这种思维能力可能较难形成。
5、 全面的技术资讯吸收能力和选择鉴别能力
作为开发人员出身,对于某一个具体问题的研究能力(虽然很多人总结为google能力),已经相当具备了。但是对技术资讯的全面接受和选择性深入了解能力,并且做出正确的判断,那些技术无非是厂家的噱头,而那些技术是真正可以用到项目,提高项目质量的好技术,这种能力确实至关重要的。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fish88168/archive/2010/09/10/5875944.aspx
系统架构师知识结构
软件系统架构师综合的知识能力结构包括9个方面,即:
(1)战略规划能力。
(2)业务流程建模能力。
(3)信息数据架构能力。
(4)技术架构选择和实现能力。
(5)应用系统架构的解决和实现能力。
(6)基础IT知识及基础设施、资源调配的能力。
(7)信息安全技术支持与管理保障能力。
(8)IT审计、治理与基本需求分析、获取能力。
(9)面向软件系统可靠性与系统生命周期的质量保障服务能力。
作为系统架构师,必须成为所在开发团队的技术路线引导者;具有很强的系统思维的能力;需要从大量互相冲突的系统方法和工具中区分出哪些是有效的,哪些是无效的。架构师应当是一个成熟的、丰富的、有经验的、有良好教育的、学习快捷、善沟通和决策能力强的人。丰富是指他必须具有业务领域方面的工作知识,知识来源于经验或者教育。他必须广泛了解各种技术并精通一种特定技术,至少了解计算机通用技术以便确定哪种技术最优,或组织团队开展技术评估。优秀的架构师能考虑并评估所有可用来解决问题的总体技术方案。需要良好的书面和口头沟通技巧,一般通过可视化模型和小组讨论来沟通指导团队确保开发人员按照架构建造系统。
因此,系统架构师知识维度可以总结为"多层次+多方面"。所谓多层次,意味着系统架构师必须在体系结构、计算机软硬件与网络基础知识、信息化基础知识、信息安全与可靠性基础知识等基本功的层面上受过良好的教育和快捷的学习能力;还须在系统架构设计方法、设计模式、设计流程以及各种模型等方面有丰富的经验,广泛了解各种构件产品和技术并精通一种特定领域的架构设计;进一步,还须在系统架构设计实践层面,有自己的认识和理解,同时具有很强的表述能力;所谓多方面,意味着系统架构师在每个知识层面上必须具有技术、管理、心理和艺术等多方面的知识和能力。这和系统架构师的多角色特点是相关的。本书也正是从这个角度来介绍系统架构的知识体系,即从系统构件、模式和规划三个方面的技术基础、原理和方法的角度编写而成的关于软件架构师的基本知识结构和水平的教材。




0 0
原创粉丝点击