Thursday, August 26, 2010
为什么你的时间不够用?
导致你时间不够用,工作效率低下的原因就是你总是等待一个超理想状态来完成你的工作。比如说画国画就一定要有国画颜料,而不能用其他颜料代替,你总是 寻求无数种借口,一直等到别人,或者自己最终把所有的条件都给你准备齐全了以后才开始工作。完美主义者们迟迟不肯去把计划付诸行动,是因为他们总是等待一 个更完美的工作环境,尽管他们马上着手去做也是能够完成他的。所以,请不要一味地否定现在的自己,等待将来,只有现在的积累才有将来的完美~~~
Tuesday, August 24, 2010
Programming and Developer Certifications
BEA Certified Developer
BEA Systems Site
Offers three specializations to choose from: Portal Solutions, Build Solutions, and Integration Solutions. Each specialization requires one exam. Only one specialization is required for the BEA Certified Developer designation. Developer exams cost $150 each.
Brainbench Certified Internet Professional (BCPIP) - Web Developer
Brainbench Website
This online certification requires four online exams that typically cost $49.95. Some exams are free.
Certified Internet Webmaster (CIW) Certifications
CIW Certification Site
- Master CIW Enterprise Developer
An advanced certification, this requires eight exams at $125. - CIW Web Developer
Requires two exams at $125 each.
Macromedia MX Certifications
Macromedia's Site
Each certification listed requires only 1 exam for $150.
- Certified Macromedia Dreamweaver MX Developer
- Certified Macromedia Flash MX Designer
- Certified Macromedia Flash MX Developer
- Certified ColdFusion MX Developer
Microsoft's Website
- MCAD - Microsoft Certified Application Developer
Requires 3 exams at $125 each. - MCSD - Microsoft Certified Solution Developer for Microsoft .NET
Requires 3 core exams and 1 elective at $125 each. - Microsoft Office Specialist - Access
Requires 4 exams for master level, 1 additional exam for expert level, and 1 additional exam for a total of 6 exams for specialist level. Each exam costs around $125.
Learning Tree's Site
Each of the listed certifications consist of four courses that last four days. The four courses cost a total of $1,150.
- .NET Enterprise Application Development Certified Professional
- .NET Web Development Certified Professional
- Access Certified Professional
- C# Programming Certified Professional
- Visual Basic .NET Programming Certified Professional
- SQL Server Application Development Certified Professional
Oracle's Site
- Oracle9i PL/SQL Developer Certified Associate (OCA)
Requires 2 exams at $125 each. - Oracle9i PL/SQL Developer Certified Professional (OCP)
Requires an Associate certification and 1 exam costing $125.
IBM Certifications
IBM Website
- IBM Certified Associate Developer - WebSphere Studio, V5.0
This entry-level cert requires 1 exam for $150. - IBM Certified Developer Associate - IBM WebSphere Studio Family of Products, V4.0.x
Requires 1 exam for $150. - IBM Certified Application Developer – DB2 Universal Database V8.1 Family
Intermediate level cert requires 2 exams for $150 each. - IBM Certified Solution Developer
This intermediate certification is product specific and requires 1 exam for $150. - IBM Certified Enterprise Developer
This advanced certification requires 4 exams that range from $150 to $190.
PeopleSoft Education
Requires one training class (costs vary) and one exam available for $200.
SAS Certifications
SAS Website
- SAS Certified Base Programmer
Requires one exam for $150. - SAS Certified Advanced ProgrammerRequires a Base Programmer Certification and one exam for $150.
Sun Certifications
Sun's Website
- SCJP - Sun Certified Java Programmer
Requires one exam for $150. - SCWCD - Sun Certified Web Component Developer for J2EE Platform
Requires an SCJP certification and one exam for $150. - SCBCD - Sun Certified Business Component Developer for J2EE Platform
Requires an SCJP certification and one exam for $150. - SCJP - Sun Certified Developer for the Java 2 Platform
You must be a Sun Certified Java Programmer and then complete a programming assignment available from Sun for $250 and take one exam, administered by Sun for $150. - Sun Certified Enterprise Architect for Java Technology
This advanced cert requires one exam, a programming assignment, and an essay exam, all available from Sun. - J2ME - Sun Certified Mobile Application Developer
Requires an SCJP certification and one exam for $150.
Sybase Site
Each Sybase certification is considered entry-level and consists of 1 exam. Exams cost $150 each.
- Sybase Certified Professional - Adaptive Server Anywhere Developer
- Sybase Certified SQL Developer
- Sybase Certified PowerBuilder Developer
EC-Council Site
EC-Council offers two programmer certifications:
- EC-Council Certified Secure Programmer (ECSP)
Requires one exam costing $150. - Certified Secure Application Developer (CSAD)
Requires a prior certification from Sun, Microsoft, Linux, Oracle, or IBM (specific certs listed on EC-Council site) and one exam. Exam costs $150.
Monday, August 23, 2010
Java有几项专业认证
软件开发流程浅析
RUP(Rational Unified Process)就是一种业界常用的不成文规矩,在多数软件项目中几乎都会使用的一项语言、方法与工具。 RUP的精神在于反复(iterative)与渐近的(incremental)。
在渐进式的开发过程中,透过不断的提炼(refine),可趁早发现问题且找出解决方法,也确保每一工作项目的进度。不过,在架构(Architecture)方面,RUP确实着墨较少,而架构优劣也是足以影响软件系统成败的关键因素。
QoS(Quality of Service)或是SLR(Service Level Requirement),我想是每个系统最基本的要求,它包含可用性(Availability)、可管理(Manageability)、可信赖 (Reliability)、可扩充(Scalability)和安全性(Security)等条件。
每一个JAVA初学者都应该搞懂的问题
问题一:我声明了什么!
String s = "Hello world!";
许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概会回答错误。
这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指 向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的 引用变量。所以,如果在刚才那句语句后面,如果再运行一句:
String string = s;
我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。
问题二:"=="和equals方法究竟有什么区别?
==操作符专门用来比较变量的值是否相等。比较好理解的一点是:
int a=10;
int b=10;
则a==b将是true。
但不好理解的地方是:
String a=new String("foo");
String b=new String("foo");
则a==b将返回false。
根据前一帖说过,对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b 都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内 存地址的值,所以使用"=="操作符,结果会是false。诚然,a和b所指的对象,它们的内容都是"foo",应该是“相等”,但是==操作符并不涉及 到对象内容的比较。
对象内容的比较,正是equals方法做的事。
看一下Object对象的equals方法是如何实现的:
boolean equals(Object o){
return this==o;
}
Object对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法,那你的类使用 equals和使用==会得到同样的结果。同样也可以看出,Object的equals方法没有达到equals方法应该达到的目标:比较两个对象内容是 否相等。因为答案应该由类的创建者决定,所以Object把这个任务留给了类的创建者。
看一下一个极端的类:
Class Monster{
private String content;
...
boolean equals(Object another){ return true;}
}
我覆盖了equals方法。这个实现会导致无论Monster实例内容如何,它们之间的比较永远返回true。
所以当你是用equals方法判断对象的内容是否相等,请不要想当然。因为可能你认为相等,而这个类的 作者不这样认为,而类的equals方法的实现是由他掌握的。如果你需要使用equals方法,或者使用任何基于散列码的集合 (HashSet,HashMap,HashTable),请察看一下java doc以确认这个类的equals逻辑是如何实现的。
问题三:String到底变了没有?
没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。请看下列代码:
String s = "Hello";
s = s + " world!";
s所指向的对象是否改变了呢?从本系列第一篇的结论很容易导出这个结论。我们来看看发生了什么事情。在 这段代码中,s原先指向一个String对象,内容是"Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。 这时,s不指向原来那个对象了,而指向了另一个String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。
通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的 修改,那么使用String来代表字符串的话会引起很大的内存开销。因为String对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个 String对象来表示。这时,应该考虑使用StringBuffer类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对 象转换十分容易。
同时,我们还可以知道,如果要使用内容相同的字符串,不必每次都new一个String。例如我们要在构造器中对一个名叫s的String引用变量进行初始化,把它设置为初始值,应当这样做:
public class Demo {
private String s;
...
public Demo {
s = "Initial Value";
}
...
}
而非
s = new String("Initial Value");
后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可 改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都 指向同一个对象。
上面的结论还基于这样一个事实:对于字符串常量,如果内容相同,Java认为它们代表同一个String对象。而用关键字new调用构造器,总是会创建一个新的对象,无论内容是否相同。
至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多Java标准类库中的类都是不可变的。在开发 一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。不可变类有一些优点,比如因为它的对象是只读的,所以多 线程并发访问也不会有任何问题。当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以Java标准类库还提供了一个可 变版本,即StringBuffer。
问题四:final关键字到底修饰了什么?
final使得被修饰的变量"不变",但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义:引用本身的不变,和引用指向的对象不变。
引用本身的不变:
final StringBuffer a=new StringBuffer("immutable");
final StringBuffer b=new StringBuffer("not immutable");
a=b;//编译期错误
引用指向的对象不变:
final StringBuffer a=new StringBuffer("immutable");
a.append(" broken!"); //编译通过
可见,final只对引用的“值”(也即它所指向的那个对象的内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致 编译期错误。至于它所指向的对象的变化,final是不负责的。这很类似==操作符:==操作符只负责引用的“值”相等,至于这个地址所指向的对象内容是 否相等,==操作符是不管的。
理解final问题有很重要的含义。许多程序漏洞都基于此----final只能保证引用永远指向固定对象,不能保证那个对象的状态不变。 在多线程的操作中,一个对象会被多个线程共享或修改,一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法就是在此对象 新建的时候把它声明为final,意图使得它“永远不变”。其实那是徒劳的。
问题五:到底要怎么样初始化!
本问题讨论变量的初始化,所以先来看一下Java中有哪些种类的变量。
1. 类的属性,或者叫值域
2. 方法里的局部变量
3. 方法的参数
对于第一种变量,Java虚拟机会自动进行初始化。如果给出了初始值,则初始化为该初始值。如果没有给出,则把它初始化为该类型变量的默认初始值。
int类型变量默认初始值为0
float类型变量默认初始值为0.0f
double类型变量默认初始值为0.0
boolean类型变量默认初始值为false
char类型变量默认初始值为0(ASCII码)
long类型变量默认初始值为0
所有对象引用类型变量默认初始值为null,即不指向任何对象。注意数组本身也是对象,所以没有初始化的数组引用在自动初始化后其值也是null。
对于两种不同的类属性,static属性与instance属性,初始化的时机是不同的。instance属性在创建实例的时候初始 化,static属性在类加载,也就是第一次用到这个类的时候初始化,对于后来的实例的创建,不再次进行初始化。这个问题会在以后的系列中进行详细讨论。
对于第二种变量,必须明确地进行初始化。如果再没有初始化之前就试图使用它,编译器会抗议。如果初始化的语句在 try块中或if块中,也必 须要让它在第一次使用前一定能够得到赋值。也就是说,把初始化语句放在只有if块的条件判断语句中编译器也会抗议,因为执行的时候可能不符合if后面的判 断条件,如此一来初始化语句就不会被执行了,这就违反了局部变量使用前必须初始化的规定。但如果在else块中也有初始化语句,就可以通过编译,因为无论 如何,总有至少一条初始化语句会被执行,不会发生使用前未被初始化的事情。对于try-catch也是一样,如果只有在try块里才有初始化语句,编译部 通过。如果在catch或finally里也有,则可以通过编译。总之,要保证局部变量在使用之前一定被初始化了。所以,一个好的做法是在声明他们的时候 就初始化他们,如果不知道要出事化成什么值好,就用上面的默认值吧!
其实第三种变量和第二种本质上是一样的,都是方法中的局部变量。只不过作为参数,肯定是被初始化过的,传入的值就是初始值,所以不需要初始化。
问题六:instanceof是什么东东?
instanceof是Java的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。举个例子:
String s = "I AM an Object!";
boolean isObject = s instanceof Object;
我们声明了一个String对象引用,指向一个String对象,然后用instancof来测试它所指向的对象是否是Object类的一个实例,显然,这是真的,所以返回true,也就是isObject的值为True。
instanceof有一些用处。比如我们写了一个处理账单的系统,其中有这样三个类:
public class Bill
public class PhoneBill extends Bill
public class GasBill extends Bill
在处理程序里有一个方法,接受一个Bill类型的对象,计算金额。假设两种账单计算方法不同,而传入的Bill对象可能是两种中的任何一种,所以要用instanceof来判断:
public double calculate(Bill bill) {
if (bill instanceof PhoneBill)
if (bill instanceof GasBill)
...
}
这样就可以用一个方法处理两种子类。
然而,这种做法通常被认为是没有好好利用面向对象中的多态性。其实上面的功能要求用方法重载完全可以实现,这是面向对象变成应有的做法,避免回到结构化编程模式。只要提供两个名字和返回值都相同,接受参数类型不同的方法就可以了:
public double calculate(PhoneBill bill)
public double calculate(GasBill bill)
所以,使用instanceof在绝大多数情况下并不是推荐的做法,应当好好利用多态。
常见的敏捷开发流程比较
1 Agile Process -敏捷的开发流程
几乎所有的软体专案都会在起始阶段面临选择开发流程的困难,一种是完备的开发流程,另一种是简易轻便的流程。 虽然我们了解采用完备的开发流程可以提高软体的品质,但是因为欠缺人力、工具与时间,我们常会被迫采用简化的流程,但事与愿违,大部分的情况我们仍然难以 在预算内及时完成专案。
Agile Process (敏捷的开发流程)是一种软体开发流程的泛称,Agile Process具有下列几项共通的特性:
1. 客户与开发人员形成密切合作的团队,因为客户无法于初期定义完整的规格,而开发人员于开发过程中也常常无法知悉外在环境或业务的变动,所以需要两者密切合作方能开发适用的软体。
2. 专案最终的目标是可执行的程式,因此所有的中间产品必须经过审慎评估,确认有助于最终目标,才需要制作中间产品。
3. 采用Iterative与Incremental方式分阶段进行,密集review是否符合需求。
4. 流程可以简单,但规划与执行必须严谨。
5. 强调团队合作,赋予高度的责任,团队有自主权得以因应变化做调整。
2 RUP开发流程- Rational Unify Process
RUP为IBM Rational公司经过多年的研发与经验所提出的软体开发流程,其内容含盖Business modeling, Requirement Modeling, Logical Design, Implementation, Testing, Deployment等软体开发生命周期的直接工作,与Project Management, Change & Configuration Management,Environment support等支援性工作。 RUP的内容非常丰富,不同的专案需要不同调整,IBM Rational提供RUP workbench工具,方便调整RUP,并公布于Web,方便专案成员遵循统一的流程规范进行工作。
RUP的主要精神为:1.专案进行采用Iterative程序分阶段渐进地完成专案功能;2.广泛使用Visual Modeling于商业需求分析、系统分析与系统设计;3.强调架构设计;4.对每项工作所需要的技术、工具、做法、范本、检查项目均有详细的定义,架构 完备且具有可调整的弹性。
因为RUP的流程规范与相关技术较复杂,所以导入时必须注意几个因素:1.主管的支持以确保足够的资源投入;2.分阶段导入;3.适当的训练与密切的顾问 咨询;4 .使用Modeling技术时需要考量Coding的实作环境;5.良好团队的管理,以沟通、耐心与坚持解决变革的人性阻力。
3 XP开发流程- eXtreme Programming
XP亦称为终极流程,是最轻量级的开发流程,其最主要的精神是『在客户有系统需求时,给予及时满意的可执行程式』,所以最适合需求快速变动的专案。 XP经过6年的实作与修改,已演化为精致的开发流程,但仍不失其精简的特性,它强调客户所要的是workable的执行码,所以把与撰写程式无关的工作降 至最低,并要求客户与开发人员最好以side-by-side的方式一起工作。
XP开发流程的基本步骤为:1.开发人员随时可以和客户进行有效沟通,撰写user stories以确认需求。 2.简易快速的系统设计,撰写独立的验证程式以解决特殊困难的问题,找出演算法即可丢弃验证程式。 3.规划多次小型阶段的专案计划,以最快速度完成每一阶段的程式交付客户,客户负责Acceptance tests;4. Coding前必须完成Unit Test与Acceptance tests程序,所有模组整合前都须经过Unit Tests;5.开发人员必须快速回应Bug与需求变更;6.要求二人一组使用一台电脑设计程式,当一人coding时,另一人负责思考与设计;7.程式 必须符合程式规范,并常做程式的重整(Refactoring)。
XP属于较精简的流程,于导入应注意几件事情:1.最好有顾问给予协助;2.持续的Review;3.可适当调整流程,但不可失去其基本精神。
4 SCRUM开发流程
SCRUM开发流程是Agile Process的一种,以英式橄榄球争球队形(Scrum)为名,基本假设是『开发软体就像开发新产品,无法一开始就能定义Final Product的规程,过程中需要研发、创意、尝试错误,所以没有一种固定的流程可以保证专案成功』。 Scrum将软体开发团队比拟成橄榄球队,有明确的最高目标,熟悉开发流程中所需具备的最佳典范与技术,具有高度自主权,紧密地沟通合作,以高度弹性解决 各种挑战,碓保每天、每个阶段都朝向目标有明确的推进,因此SCRUM非常适用于产品开发专案。
SCRUM开发流程通常以30天为一个阶段,由客户提供新产品的需求规格开始,开发团队与客户于每一个阶段开始时挑选该完成的规格部份,开发团队必须尽力于30天后交付成果,团队每天用15分钟开会检视每个成员的进度与计画,了解所遭遇的困难并设法排除。
SCRUM与传统开发流程及专案管理差异较大,于导入时最好有顾问协助。
5 总结
Agile Process的精神已经成为共识,但是没有一种固定的流程可以重复使用在不同的专案上。 而且不管是RUP、XP、SCRUM、或其他的开发流程都允许相当大的弹性,我们必须按专案性质的不同,调整或混合出适合的开发流程,并允许团队于进行中 做必要的弹性修改,方能达成目标。
6 参考资料
RUP: www.rational.com
XP: www.extremeprogramming.org
SCRUM: www.controlchaos.com
AGILE: www.agilealliance.org
JAVA开源项目
Spring Framework 【Java开源 J2EE框架】
Spring 是一个解决了许多在J2EE开发中常见的问题的强大框架。 Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯。Spring的架构基础是基于使用JavaBean 属性的 Inversion of Control容器。然而,这仅仅是完整图景中的一部分:Spring在使用IoC容器作为构建完关注所有架构层的完整解决方案方面是独一无二的。 Spring提供了唯一的数据访问抽象,包括简单和有效率的JDBC框架,极大的改进了效率并且减少了可能的错误。Spring的数据访问架构还集成了 Hibernate和其他O/R mapping解决方案。Spring还提供了唯一的事务管理抽象,它能够在各种底层事务管理技术,例如JTA或者JDBC事务提供一个一致的编程模型。 Spring提供了一个用标准Java语 言编写的AOP框架,它给POJOs提供了声明式的事务管理和其他企业事务--如果你需要--还能实现你自己的 aspects。这个框架足够强大,使得应用程序能够抛开EJB的复杂性,同时享受着和传统EJB相关的关键服务。Spring还提供了可以和IoC容器 集成的强大而灵活的MVC Web框架。【SpringIDE:Eclipse平台下一个辅助开发插件】.
WebWork 【Java开源 Web框架】
WebWork 是由OpenSymphony组织开发的,致力于组件化和代码重用的拉出式MVC模式J2EE Web框架。WebWork目前最新版本是2.1,现在的WebWork2.x前身是Rickard Oberg开发的WebWork,但现在WebWork已经被拆分成了Xwork1和WebWork2两个项目。 Xwork简洁、灵活功能强大,它是一个标准的Command模式实现,并且完全从web层脱离出来。 Xwork提供了很多核心功能:前端拦截机(interceptor),运行时表单属性验证,类型转换,强大的表达式语言(OGNL – the Object Graph Notation Language),IoC(Inversion of Control倒置控制)容器等。 WebWork2建立在Xwork之上,处理HTTP的响应和请求。WebWork2使用ServletDispatcher将HTTP请求的变成 Action(业务层Action类), session(会话)application(应用程序)范围的映射,request请求参数映射。WebWork2支持多视图表示,视图部分可以使用 JSP, Velocity, FreeMarker, JasperReports,XML等。在WebWork2.2中添加了对AJAX的支持,这支持是构建在DWR与Dojo这两个框架的基础之上. 【EclipseWork:用于WebWork辅助开发的一个Eclipse插件】
Struts 【Java开源 Web框架】
Struts 是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的一 年中颇受关注。Struts把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中,开发人员利用其进行开发时不用再自己编码实现全套MVC模式,极大的节省了时间,所以说Struts是一个 非常不错的应用框架。【StrutsIDE:用于Struts辅助开发的一个Eclipse插件】
Hibernate 【Java开源 持久层框架】
Hibernate 是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的 客户端程序实用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代 CMP,完成数据持久化的重任。Eclipse平台下的Hibernate辅助开发工具:【Hibernate Synchronizer】【MiddlegenIDE】
Quartz 【Java开源 Job调度】
Quartz 是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个, 甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或 EJBs。Quartz的最新版本为Quartz 1.5.0。
Velocity 【Java开源 模板引擎】
Velocity 是一个基于Java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由Java代码定义的对象。当Velocity应用于web开发时,界面设计人员可以和Java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只关注页面的显示效果,而由Java程序开发人员关注业务逻辑编码。Velocity将Java代 码从web页面中分离出来,这样为web站点的长期维护提供了便利,同时也为我们在JSP和PHP之外又提供了一种可选的方案。 Velocity的能力远不止web站点开发这个领域,例如,它可以从模板(template)产生SQL和PostScript、XML,它也可以被当 作一个独立工具来产生源代码和报告,或者作为其他系统的集成组件使用。Velocity也可以为Turbine web开发架构提供模板服务(template service)。Velocity+Turbine提供一个模板服务的方式允许一个web应用以一个真正的MVC模型进行开发。 【VeloEclipse :Velocity在Eclipse平台下的一个辅助开发插件】
IBATIS 【Java开源 持久层框架】
使用ibatis 提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对 象, 这一层与通过Hibernate 实现ORM 而言基本一致,而对于具体的数据操作,Hibernate 会自动生成SQL 语句,而ibatis 则要求开发者编写具体的SQL 语句。相对Hibernate等 “全自动”ORM机制而言,ibatis 以SQL开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间。作为“全自动”ORM 实现的一种有益补充,ibatis 的出现显 得别具意义。
Compiere ERP&CRM 【Java开源ERP与CRM系统】
Compiere ERP&CRM为全球范围内的中小型企业提供综合型解决方案,覆盖从客户管理、供应链到财务管理的全部领域,支持多组织、多币种、多会计模式、多 成本计算、多语种、多税制等国际化特性。易于安装、易于实施、易于使用。只需要短短几个小时,您就可以使用申购-采购-发票-付款、报价-订单-发票-收 款、产品与定价、资产管理、客户关系、供应商关系、员工关系、经营业绩分析等强大功能了。
Roller Weblogger 【Java开源 Blog博客】
这个weblogging 设计得比较精巧,源代码是很好的学习资料。它支持weblogging应有的特性如:评论功能,所见即所得HTML编辑,TrackBack,提供页面模 板,RSS syndication,blogroll管理和提供一个XML-RPC 接口。
Eclipse平台是IBM向开发源码社区捐赠的开发框架,它之所以出名并不是因为IBM宣称投入开发的资金总数 —4千万美元,而是因为如此巨大的投入所带来的成果:一个成熟的、精心设计的以及可扩展的体系结构。
XPlanner 一个基于Web的XP团队计划和跟踪工具。XP独特的开发概念如iteration、user stories等,XPlanner都提供了相对应的的管理工具,XPlanner支持XP开发流程,并解决利用XP思想来开发项目所碰到的问题。 XPlanner特点包括:简单的模型规划,虚拟笔记卡(Virtual note cards),iterations、user stories与工作记录的追踪,未完成stories将自动迭代,工作时间追踪,生成团队效率,个人工时报表,SOAP界面支持。
HSQLDB(Hypersonic SQL)是纯Java开发的关系型数据库,并提供JDBC驱动存取数据。支持ANSI-92 标准 SQL语法。而且他占的空间很小。大约只有160K,拥有快速的数据库引擎。
代表了完整的J2EE应用,使用了Web、EJB以及JMS等技术,特别是其前台界面部分使用Struts 框架技术,基于XML的portlet配置文件可以自由地动态扩展,使用了Web Services来支持一些远程信息的获取,使用 Apahce Lucene实现全文检索功能。
主要特点:
1、提供单一登陆接口,多认证模式(LDAP或SQL);
2、管理员能通过用户界面轻松管理用户,组,角色;
3、用户能可以根据需要定制个性化的portal layout;
4、能够在主流的J2EE应用服务器上运行,如JBoss+Jetty/Tomcat,JOnAS;
5、支持主流的数据库,如PostgreSQL,MySQL;
6、使用了第三放的开源项目,如Hibernate, Lucene, Struts;
7、支持包括中文在内的多种语言;
8、采用最先进的技术 Java, EJB, JMS, SOAP, XML;
Jetspeed 是一个开放源代码的企业信息门户(EIP)的实现,使用的技术是Java和XML。用户可以使用浏览器,支持WAP协议的手机或者其它的设备访问Jetspeed架设的信息门户获取信息。Jetspeed扮演着信息集中器的角色,它能够把信息集中起来并且很容易地提供给用户。
Jetspeed具有如下的特征:
* 即将成为标准化的Java Portlet API
* 基于模板的布局, 包括JSP和Velocity
* 通过开放的内容同步技术支持远程XML内容交换
* 定制默认的主页
* 使用数据库进行用户认证
* 内存缓存技术, 加快页面的响应
* 通过Rich Site Summary技术, 支持同步内容
* 和Cocoon, WebMacro, Velocity集成.
* Wireless Markup Language (WML) 支持
* 使用XML格式的配置文件注册portlet.
* 完整的Web Application Archive (WAR) 支持
* Web应用程序开发的基础设施
* 可以在本地缓存远程内容
* 与Avantgo同步
* 可移植到所有支持JDK1.2和Servlet 2.2的平台
* 与Turbine模块和服务集成
* 可以根据用户, 安装媒体类型和语言的不同设定, 产生不同的个性化服务
* 持续化服务使得所由的portlet能够容易的存储每个用户的状态, 页面和portlet
* 使用皮肤技术使得用户可以选择portlet的颜色和显示属性
* 自定义功能是的管理员可以选择portlet以及定义个人页面的布局
* 在数据库中存储PSML
* 通过Jetspeed的安全portlets管理用户, 组,角色和权限
* 基于角色对访问portlet进行控制
JOnAS 是一个开放源代码的J2EE实现,在ObjectWeb协会中开发。整合了Tomcat或Jetty成为它的Web容器,以确保符合Servlet 2.3和JSP 1.2规范。JOnAS服务器依赖或实现以下的Java API:JCA、JDBC、JTA 、JMS、JMX、JNDI、JAAS、JavaMail 。
JFox 是 Open Source Java EE Application Server,致力于提供轻量级的Java EE应用服务器,从3.0开始,JFox提供了一个支持模块化的MVC框架,以简化EJB以及Web应用的开发! 如果您正在寻找一个简单、轻量、高效、完善的Java EE开发平台,那么JFox正是您需要的。
JFox 3.0 拥有以下特性:
1. 重新设计的 IoC 微内核,融入 OSGi 模块化思想
2. 设计成嵌入式架构,能够和任何 Java Web Server集成部署
3. 支持 EJB3,JPA规范,支持容器内和容器外两种方式运行EJB和JPA组件
4. 支持 EJB 发布成Web Service
5. 采用 JOTM(http://jotm.objectweb.org/)提供事务处理,支持两阶段提交(2PC)
6. 采用 XAPool(http://forge.objectweb.org/projects/xapool/) 提供 XA DataSource,支持智能连接池管理
7. 内置 MVC 框架,实现自动Form Mapping,Validator,Uploading等功能,支持JSP/Velocity/Freemarker页面引擎,并支持直接在Action中注入EJB
8. 支持多应用模块部署,让中大型应用充分享受模块化开发带来的优势
9. 提供 Manager 管理模块,可以查看和管理各种运行时参数
10. 提供根据 JFox 特色重写的 Petstore 应用模块
项目过程分析
1)、项目组成立(公司成员、客户成员)
2)、制定项目预期目标
3)、制定项目计划周期
4)、建立好项目组成员沟通机制
2、需求调研
1)、创建调研计划、协调调研时间
2)、收集客户资料,获取客户需求
所有的资料都需要保留一份,资料中存疑的需要及时询问
3)、编写需求文档
重点描述出客户的业务流程和性能要求。
采用Word、Excel、Rose等形式。
4)、需求变更记录
5)、确定开发环境和运行环境
6)、扩展性要求
7)、与旧系统的接驳要求。
8)、估算出项目工作量
本阶段需要一套需求管理系统来进行需求的管理。
本阶段的需求文档也是用户测试的依据。
3、系统设计/详细设计
一个系统可以分为基础平台和应用模块两部分。
1)、选择基础平台,无论是采用第三方平台还是自行开发平台,都需要深入了解,查看是否符合要求。
2)、应用模块设计(针对业务流程)
3)、中间件的采用或自行开发,需要深入了解。
4)、用户界面的设计
如果用户界面设计完毕并确认,即可初步写出用户使用手册、管理员使用手册。
5)、变更记录
本阶段的系统设计是集成测试的依据。
4、程序开发
创建开发任务计划表、开发计划日程表
1)、优先编写测试用例
2)、按照编码规范编写代码
3)、按照文档注释规范注释
以上形成开发文档。
本阶段需要一套版本管理系统。
本阶段的测试用例也是单元测试的依据。
如果能做到,最好每日构建。
5、测试
本阶段需要一套Bug管理系统,形成需求、设计、开发、测试互动。
1)、编写测试计划和测试方案
2)、功能测试
单元测试、集成测试
3)、性能测试
集成测试、压力测试
如果能做到,最好能进行自动化测试。
如果能做到,做分析统计工作。
最后形成测试报告。
6、试用、培训、维护
本阶段需要解决:
1)、解决异地修改和公司修改的同步问题。
2)、用户测试中的Bug修改问题,按照级别分为
a)、程序Bug
b)、设计变更
c)、需求变更
尽量按照a b c的顺序来进行修改,尽量避免b、c级的修改。
最后形成安装手册、维护记录。
项目成员组成
根据以上过程,一个项目组中,需要:
1、需求工程师,其要求
善于与客户沟通,能快速了解客户的需求,对客户所在的行业比较熟悉。
善于学习新知识。
熟悉Word、Excel、Rose等工具的使用。
熟悉开发语言和开发框架
熟悉已积累的产品的功能、性能等。
2、系统分析师/设计师,其要求
精通开发语言和开发框架,部分需要精通数据库
精通已积累的产品的功能、性能等
深入了解客户行业特点
能根据客户的要求分析出其实质
能做出优秀的设计
熟悉Word、Excel、Rose等工具的使用
3、开发工程师,其要求
熟悉开发语言,熟悉开发要求和注释规范,部分需要熟悉数据库。
熟悉单元测试。
能根据设计做出良好的编码,保证功能和性能。
部分需要有一定的设计要求,因为涉及到将来的维护。
4、测试工程师,其要求
熟悉测试工作,能按照测试计划进行测试。
熟悉开发语言,能协助开发工程师找错。
能独立完成黑、白盒测试。
如果是高级测试人员,还要能够对系统能深入进行分析并能制定出优秀的测试方案。
5、管理人员
一般由以上人员兼任,主要有
项目经理:负责整个项目
开发经理:负责系统设计、开发工作
测试经理:负责测试工作
6、其他人员
一些项目涉及到其他人员,如页面设计人员、页面制作人员。
部分大的项目,还有专门的维护人员。
由于目前国内很多公司并没有严格这么区分,如果项目小的话,可以一人兼任多项职位。
Software development lifecycle
软件开发流程(Software development process)
软件设计思路和方法的一般过程,包括设计软件的功能和实现的算法和方法、软件的总体结构设计和模块设计、编程和调试、程序联调和测试以及编写、提交程序。
1 相关系统分析员和用户初步了解需求,然后用WORD列出要开发的系统的大功能模块,每个大功能模块有哪些小功能模块,对于有些需求比较明确相关的界面时,在这一步里面可以初步定义好少量的界面。
2 系统分析员深入了解和分析需求,根据自己的经验和需求用WORD或相关的工具再做出一份文档系统的功能需求文档。这次的文档会清楚例用系统大致的大功能模块,大功能模块有哪些小功能模块,并且还例出相关的界面和界面功能。
3 系统分析员和用户再次确认需求。
4 系统分析员根据确认的需求文档所例用的界面和功能需求,用迭代的方式对每个界面或功能做系统的概要设计。
5 系统分析员把写好的概要设计文档给程序员,程序员根据所例出的功能一个一个的编写。
6 测试编写好的系统。交给用户使用,用户使用后一个一个的确认每个功能,然后验收。
举个例子来看:
1 某公司想找人订做一套人事管理软件,从某种渠道上得知我们有提供这种服务,所以联系上了我们。
2 我们会派专门的软件工程师到他们那里去了解我们要设计一个什么的东西给他们用,然后回来做个方案给他们,其中方案的内容包括:我们开发出来的软件大概的界面是怎样?方便什么人使用?什么人可以使用什么功能?方便到什么程度?大概的硬件要求是怎样等?
3 他们看了方案后,确定他们就是要做一套这样的软件,我就开始开发这套软件。
4 我们把开发出来的软件交用他们使用,其中在使用的过程中哪里使用不方便或哪里达不到要求,我们会第第一时间修改这些功能,直到他们要求的所有功能都能很完美的解决掉。
第一步:找需求(业务需求说明书)
第二步:需求分析(需求分析说明书)
第三步:架构设计(概要设计说明书)
第四步:数据库设计(数据库设计说明书)
第五步:详细设计(详细设计说明书)
第六步:编码实现(可以在第四步前面)
第七步:测试(测试计划、报告)
Friday, August 20, 2010
效率和注意力的培养
例如:
在单个房间内,
- 某个区域是工作和读书专门用的
- 某个区域是娱乐休闲用的
- 某个区域是吃饭用的
或再缩小区域范围到特定设备上,如
- 笔记本是给读书用的,不允许看电影和看新闻聊天
- IPod touch 用来看新闻和聊天
- Mac Air 用来看电影
这样就容易提醒自己在某个特定环境所呆的时间,而不会误认为自己在笔记本上花了很多时间读书,其实看新闻就占据了好几个小时
效率低下的根源——回避困难
为什么有的人好像一直在忙,却总是拿不出成绩,做不出成效?工作中总是可以遇到这样的人,回想一下上学的时候也总是有那种天天笔不离手、眼不离书、 屁股不离板凳,却成绩不是一般地差的学生。这种人的存在往往使人们禁不住怀疑“努力”的可靠。还好,如果仔细观察的话,就会发现他们实际上并不努力,只是 做出了努力的样子,或者显得比较努力而已。
他们的效率很差。根源在于,他们其实只做简单的事情,而回避那些有难度的工作。任何一个任务,都可以被划分为两个部分:相对简单的部分与相对困难的部分。如果这世界的所有任务全都是有简单的部分构成而全无困难之处,那就没有人会遇到挫折或者遭受失败了——可现实的世界明显并非如此。
稍微思考一下就明白,合理的时间安排应该是这样的:简单的部分要迅速做完,而后把节约出来的时间投放在处理困难的部分上。然而,很多人会在潜意识中 回避困难,于是乎他们的时间安排是这样的:几乎全部时间都被用来处理简单的部分,至于困难的部分,干脆“掩耳盗铃”一般地视而不见,暗地里希望困难会自动 消失……
如果不能控制这种逃避倾向,那么再多再巧的时间管理技巧都是无效的,因为本质上来看,任务中相当重要的一部分(通常因为重要而困难,也因为困难而重 要)永远完成不了。所谓效率需要任务完成才能够衡量,这样看来,对于逃避困难的人来讲,无论他们最终花费了多长时间,但因为任务没有完整完成,所以,根本 谈不上效率(相当于分母等于零)。
学习上,比如:准备托福考试,天天只做阅读听力,但不去练习口语和写作;工作上,比如:做项目计划天天讨论WHAT却从不提及HOW;生活上,比如,天天给对恋人说我爱你却从来不花时间想想人家真需要的是什么……都是同样的恶习在背后:专做简单的,回避困难的。
Thursday, August 19, 2010
如何利用“暗时间”
在我没有看到这篇文章之前,有几个困惑:
- 如何用一个词来表示什么叫空闲时间?
- 时间对于每个人都公平吗?
- 为什么有的人可以同事把很多事做得非常优秀?
- 我已经知道专注的力量,那在很多事情之间进行切换,又是怎样的一种状态?
- 如何避免诱惑,训练集中注意力,提高抗干扰能力?
如果你有一台计算机,你装了一个系统之后就整天把它搁置在那里,你觉得这台计算机被实际使用了吗?没有。因为CPU整天运行的就是空闲进程。运行空闲进程也是一天,运行大数据量计算的程序也是一天,对于CPU来说同样的一天,价值却是完全不一样的。
大脑也是如此。
善于利用思维时间的人,可以无形中比别人多出很多时间,从而实际意义上能比别人多活很多年。我们经常听说“心理年龄”这个词,思考得多的人,往往心 理年龄更大。有人用10年才能领悟一个道理,因为他们是被动领悟——只有在现实撞到他脸上的时候才感到疼,疼完了之后还是不记得时时提醒自己,结果很快时 过境迁抛之脑后,等到第二次遇到同一个坑的时候早忘了曾经跌过跟头了,像这样的效率,除非天天摔坑里,否则遗忘的效率总是大过吃亏长的记性。善于利用思维 时间的人则能够在重要的事情上时时主动提醒自己,将临时的记忆变成硬编码的行为习惯。
每个人的手表都走得一样快,但每个人的生命却不是。衡量一个人生活了多少年,应该用思维时间来计算。举一个极端的例子,如果一个人从生下来开始就呆在一个为他特殊建造的无菌保护室里,没有社会交往,没有知识获取,度过了18年,你会不会认为他成年了?
认为时间对每个人是均等的是一个错觉,认为别人有一天,我也有一天,其实根本不是这样。如果你正在学习一门专业,你使用自己所投入的天数来衡量,很 容易会产生一种错觉,认为投入了不少时间,然而其实,“投入时间”这个说法本身就是荒唐的,实际投入的是时间和效率的乘积。你可以“投入”很多时间在一件 事情上面,却发现毫无进展,因为你没有整天把你要做的事情,要学习的东西常驻在你的大脑中,时刻给予它最高的优先级。你走路的时候吃饭的时候,做梦的时候 心心念念想的就是这件事情,你的CPU总是分配给它,这个时候你的思维时间就被利用到了极致,你投入的时间就真正等于了实际流逝的时间,因为你的CPU是 满载的。
如果你有做总结的习惯,你在度过一段时间之后总结自己在某某领域投入了多少时间,建议千万不要粗略地去计算有多少天下班后拿起书来翻看过,因为这样 你也许会发现书倒是常翻,但领悟却不见得多深,表面上花的时间不少,收益却不见得那么大。因为看书并记住书中的东西只是记忆,并没有涉及推理,只有靠推理 才能深入理解一个事物,看到别人看不到的地方,这部分推理的过程就是你的思维时间,也是人一生中占据一个显著比例的“暗时间”,你走路、买菜、洗脸洗手、坐公车、逛街、出游、吃饭、睡觉,所有这些时间都可以成为“暗时间”,你可以充分利用这些时间进行思考,反刍和消化平时看和读的东西,让你的认识能够脱离照本宣科的层面。这段时间看起来微不足道,但日积月累将会产生庞大的效应。
能够充分利用暗时间的人将无形中多出一大块生命,你也许会发现这样的人似乎玩得不比你少,看得不比你多,但不知怎么的就是比你走得更远。比如我就经常发现一些国外的牛人们为什么不仅学习牛逼,连“业余”玩儿的东东也都搞得特牛逼,一点都不业余(上次在《How We Decide》上看到斯坦福的一个牛人,粒子物理教授,同时是世界扑克大赛的前六名保持者,迄今累计奖金拿了六百多万刀),你会奇怪,这些家伙到底哪来的时间,居然可以在不止一个领域做到卓越?
程序员们都知道,任务切换需要耗费许多额外的花销,通俗地来讲,首先需要保存当前上下文以便下次能够顺利切换回来,然后要加载目标任务的上下文。如果一个系统不停地在多个任务之间来回倒腾,就会耗费大量的时间在上下文切换上,无形中浪费很多的时间。
相比之下,如果只做一件任务,就不会有此损失。这就是为什么专注的人比不专注的人时间利用效率高得多的原因。任务切换的暗时间看似非常不明显,甚至很多人认为“多任务”是件很好的事情(有时候的确是),但日积月累起来就会发现,消耗在切换上的时间越来越多。
另外,大脑开始一件任务的时候必须要有一定时间来“热身”,这个时间因人而异,并且可以通过练习来改变。举个例子,你看了一会书之后,忽然感到一阵 无聊,忍不住打开浏览器,十分钟后你想起来还要继续看书,但要回复到当时理想的状态,却需要一段时间来努力去集中精力,把记忆中相关的知识全都激活起来, 从而才能进入“状态”,因为你上了十分钟网之后这些记忆已经被抑制了。如果这个“热身”状态需要一刻钟,那么看似十分钟的上网闲逛其实就花费了二十五分 钟。
如果阅读的例子还不够生动,对于程序员来说其实有更好的例子:你写程序写得正high,忽然被叫去开了一通会,写到一半的代码搁在那儿。等你开完会 回来你需要多久能够重新进入状态?又或者,你正在调试程序,你已经花了二十分钟的时间把与这个bug可能相关的代码前前后后都理解了一遍,心中构建了一个 大致的地图,就在这时,呃,你又被叫去开了个会(:D),开完会回来,可想而知,得花上一些时间来回想一下刚刚弄清的东西了。
迅速进入状态的能力是可以锻炼的,根据我个人的经验,至少可以缩短到3-5分钟。但要想完全进入状态,却是很难在这么短的时间实现的。所谓完全进入 状态,举个例子:你看了3个小时的书,或者调试了半个小时的程序之后,往往满脑子都是相关的东西,所有这些知识都处在活跃状态,换言之你大脑中所有相关的 记忆神经网络都被激活了,要达到这样一种忘记时间流逝的“沉浸”状态(心理学上叫做“流体验”),不是三两分钟的事情。而一旦这种状态被破坏,无形间效率就会大打折扣。这也是为什么我总是倾向于创造大块的时间来阅读重要的东西,因为这样有利于“沉浸”进去,使得新知识可以和大脑中与其相关的各种既有的知识充分融合,关联起来,后者对于深刻的记忆非常有帮助。
要充分利用暗时间,不仅要能够迅速进入状态,另一个很重要的习惯就是能够保持状态多久(思维体力)。《The Psychology of Invention in the Mathematical Field》上有一段关于庞加莱的思考习惯的介绍,很有代表性。庞加莱经常在去海边休假或者在路上走的时候在脑海中思索数学问题,很多时候解答就在这些时候忽然闪现。虽然我和庞加莱是没法比的,但是常常也在路上想出答案,这真是一种愉悦的体验。
能够迅速进入专注状态,以及能够长期保持专注状态,是高效学习的两个最重要习惯。
很多人都有这样的体验(包括我自己),工作了之后,要处理的事情一下多出了很多,不像在校园,环境简单,生活单纯,能够心无旁骛地做一件事情而不被 打扰。工作之后的状况就是,首先需要处理的事情变多,导致时不时需要在多个任务之间切换;另一方面,即便能够把任务的优先级分配得比较合理,也难免在做一 件事情的时候心中忽然想起另一件事还没做的焦虑来,因为没做完的事情会在大脑中留下一个“隐藏的进程”,时不时地发个消息提醒你一下,中断你正在做的事 情。
因此这里就涉及到最后一个高效的习惯:抗干扰。只有具备超强的抗干扰能力,才能有效地利用起前面提到的种种暗时间。抗干扰能力也是可以练习出来的, 上本科那会经常坐车,所以我就常常拿着本大部头在车上看,坐着看或者站着看都可,事实证明在有干扰的环境中看书是非常锻炼专注能力的一个办法:D 另外,经常利用各种碎片时间阅读和思考,对迅速集中注意力和保持注意力都非常有帮助。记得很久以前TopLanguage上大伙曾经有次饶有兴趣地讨论“马桶时间”的利用,包括在卫生间放个小书柜。(估计很多同学心有戚戚焉吧:D)
Tuesday, August 3, 2010
How To Save All Open Websites in Firefox When It’s Time to Call It a Day
That’s an offer you can’t refuse but before shutting down the computer, you would like to save a list of all websites that are currently open in Firefox. Here are some suggestion on how to achieve this?
Option 1. Press Ctrl+Shift+D or go to Bookmarks and select "Bookmark all Tabs". This will save all the open tabs into one folder and you can resume surfing the next day by select "Open All in Tabs" from the bookmark folder.
Bonus Tip: Name this folder something like "Feb25" or "022508" so it becomes easy for you to guess the date from the folder name itself.
Option 2. Send Tab URLs – This extension helps you send URLs of all open tabs to any other email address tabs using your default email program – it could be Gmail, Microsoft Outlook or anything else. Very handy if you are working from home and need to access the same websites from office the next day.
If you don’t want email, use Tab URL Copier to copy URLs of all open tabs to the clipboard and paste them inside any note taking software like Google Notebook.
Related: Don’t Lose Work If IE 7 Browser Crashes
Option 3. Google Browser Sync – If you have a Google Account and work across computers, this Firefox add-in from Google is a perfect way to save your Firefox tabs and open windows. Unfortunately, Google Browser Sync is not supported on Firefox 3.
Option 4. Session Manager – This is probably the most popular solution for save your browser session in Firefox. It will even restore your windows and tabs incase your browser crashes.
Firefox, even without any extensions, will prompt your save the tabs if you decide to quit the browser when multiple tabs are open. This sounds like a good idea but if you are sharing the computer with other family members, you run the risk of losing work if someone else logs in the next day before you do.
Different types of projects that can be created with Visual Studio .NET
1)Console applications
2)Windows Applications
3)Web applications
4)Web services
5)Class library
6)Windows Control Library
7)Web Control Library
1)Console applications are light weight programs run inside the command prompt (DOS) window. They are commonly used for test applications.
2)Windows Applications are form based standard Windows desktop applications for common day to day tasks. (Ex: Microsoft word).
3)Web applications are programs that used to run inside some web server (Ex:IIS) to fulfill the user requests over the http. (Ex: Hotmail and Google).
4)Web services are web applications that provide services to other applications over the internet.
5)Class library contains components and libraries to be used inside other applications. A Class library can not be executed and thus it does not have any entry point.
6)Windows Control Library contains user defined windows controls to be used by Windows applications.
7)Web Control Library contains user defined web controls to be used by web applications.