为什么Lisp语言如此先进

Python017

为什么Lisp语言如此先进,第1张

一、如果我们把流行的编程语言,以这样的顺序排列:Java、Perl、Python、Ruby。你会发现,排在越后面的语言,越像Lisp。Python模仿Lisp,甚至把许多Lisp黑客认为属于设计错误的功能,也一起模仿了。至于Ruby,如果回到1975年,你声称它是一种Lisp方言,没有人会反对。编程语言现在的发展,不过刚刚赶上1958年Lisp语言的水平。二、1958年,JohnMcCarthy设计了Lisp语言。我认为,当前最新潮的编程语言,只是实现了他在1958年的设想而已。这怎么可能呢?计算机技术的发展,不是日新月异吗?1958年的技术,怎么可能超过今天的水平呢?让我告诉你原因。这是因为JohnMcCarthy本来没打算把Lisp设计成编程语言,至少不是我们现在意义上的编程语言。他的原意只是想做一种理论演算,用更简洁的方式定义图灵机。所以,为什么上个世纪50年代的编程语言,到现在还没有过时?简单说,因为这种语言本质上不是一种技术,而是数学。数学是不会过时的。你不应该把Lisp语言与50年代的硬件联系在一起,而是应该把它与快速排序(Quicksort)算法进行类比。这种算法是1960年提出的,至今仍然是最快的通用排序方法。三、Fortran语言也是上个世纪50年代出现的,并且一直使用至今。它代表了语言设计的一种完全不同的方向。Lisp是无意中从纯理论发展为编程语言,而Fortran从一开始就是作为编程语言设计出来的。但是,今天我们把Lisp看成高级语言,而把Fortran看成一种相当低层次的语言。1956年,Fortran刚诞生的时候,叫做FortranI,与今天的Fortran语言差别极大。FortranI实际上是汇编语言加上数学,在某些方面,还不如今天的汇编语言强大。比如,它不支持子程序,只有分支跳转结构(branch)。Lisp和Fortran代表了编程语言发展的两大方向。前者的基础是数学,后者的基础是硬件架构。从那时起,这两大方向一直在互相靠拢。Lisp刚设计出来的时候,就很强大,接下来的二十年,它提高了自己的运行速度。而那些所谓的主流语言,把更快的运行速度作为设计的出发点,然后再用超过四十年的时间,一步步变得更强大。直到今天,最高级的主流语言,也只是刚刚接近Lisp的水平。虽然已经很接近了,但还是没有Lisp那样强大。四、Lisp语言诞生的时候,就包含了9种新思想。其中一些我们今天已经习以为常,另一些则刚刚在其他高级语言中出现,至今还有2种是Lisp独有的。按照被大众接受的程度,这9种思想依次是:1.条件结构(即"if-then-else"结构)。现在大家都觉得这是理所当然的,但是FortranI就没有这个结构,它只有基于底层机器指令的goto结构。2.函数也是一种数据类型。在Lisp语言中,函数与整数或字符串一样,也属于数据类型的一种。它有自己的字面表示形式(literalrepresentation),能够储存在变量中,也能当作参数传递。一种数据类型应该有的功能,它都有。3.递归。Lisp是第一种支持递归函数的高级语言。4.变量的动态类型。在Lisp语言中,所有变量实际上都是指针,所指向的值有类型之分,而变量本身没有。复制变量就相当于复制指针,而不是复制它们指向的数据。5.垃圾回收机制。6.程序由表达式(expression)组成。Lisp程序是一些表达式区块的集合,每个表达式都返回一个值。这与Fortran和大多数后来的语言都截然不同,它们的程序由表达式和语句(statement)组成。区分表达式和语句,在FortranI中是很自然的,因为它不支持语句嵌套。所以,如果你需要用数学式子计算一个值,那就只有用表达式返回这个值,没有其他语法结构可用,因为否则就无法处理这个值。后来,新的编程语言支持区块结构(block),这种限制当然也就不存在了。但是为时已晚,表达式和语句的区分已经根深蒂固。它从Fortran扩散到Algol语言,接着又扩散到它们两者的后继语言。7.符号(symbol)类型。符号实际上是一种指针,指向储存在哈希表中的字符串。所以,比较两个符号是否相等,只要看它们的指针是否一样就行了,不用逐个字符地比较。8.代码使用符号和常量组成的树形表示法(notation)。9.无论什么时候,整个语言都是可用的。Lisp并不真正区分读取期、编译期和运行期。你可以在读取期编译或运行代码;也可以在编译期读取或运行代码;还可以在运行期读取或者编译代码。在读取期运行代码,使得用户可以重新调整(reprogram)Lisp的语法;在编译期运行代码,则是Lisp宏的工作基础;在运行期编译代码,使得Lisp可以在Emacs这样的程序中,充当扩展语言(extensionlanguage);在运行期读取代码,使得程序之间可以用S-表达式(S-expression)通信,近来XML格式的出现使得这个概念被重新"发明"出来了。五、Lisp语言刚出现的时候,它的思想与其他编程语言大相径庭。后者的设计思想主要由50年代后期的硬件决定。随着时间流逝,流行的编程语言不断更新换代,语言设计思想逐渐向Lisp靠拢。思想1到思想5已经被广泛接受,思想6开始在主流编程语言中出现,思想7在Python语言中有所实现,不过似乎没有专用的语法。思想8可能是最有意思的一点。它与思想9只是由于偶然原因,才成为Lisp语言的一部分,因为它们不属于JohnMcCarthy的原始构想,是由他的学生SteveRussell自行添加的。它们从此使得Lisp看上去很古怪,但也成为了这种语言最独一无二的特点。Lisp古怪的形式,倒不是因为它的语法很古怪,而是因为它根本没有语法,程序直接以解析树(parsetree)的形式表达出来。在其他语言中,这种形式只是经过解析在后台产生,但是Lisp直接采用它作为表达形式。它由列表构成,而列表则是Lisp的基本数据结构。用一门语言自己的数据结构来表达该语言,这被证明是非常强大的功能。思想8和思想9,意味着你可以写出一种能够自己编程的程序。这可能听起来很怪异,但是对于Lisp语言却是再普通不过。最常用的做法就是使用宏。术语"宏"在Lisp语言中,与其他语言中的意思不一样。Lisp宏无所不包,它既可能是某样表达式的缩略形式,也可能是一种新语言的编译器。如果你想真正地理解Lisp语言,或者想拓宽你的编程视野,那么你必须学习宏。就我所知,宏(采用Lisp语言的定义)目前仍然是Lisp独有的。一个原因是为了使用宏,你大概不得不让你的语言看上去像Lisp一样古怪。另一个可能的原因是,如果你想为自己的语言添上这种终极武器,你从此就不能声称自己发明了新语言,只能说发明了一种Lisp的新方言。我把这件事当作笑话说出来,但是事实就是如此。如果你创造了一种新语言,其中有car、cdr、cons、quote、cond、atom、eq这样的功能,还有一种把函数写成列表的表示方法,那么在它们的基础上,你完全可以推导出Lisp语言的所有其他部分。事实上,Lisp语言就是这样定义的,JohnMcCarthy把语言设计成这个样子,就是为了让这种推导成为可能。六、就算Lisp确实代表了目前主流编程语言不断靠近的一个方向,这是否意味着你就应该用它编程呢?如果使用一种不那么强大的语言,你又会有多少损失呢?有时不采用最尖端的技术,不也是一种明智的选择吗?这么多人使用主流编程语言,这本身不也说明那些语言有可取之处吗?另一方面,选择哪一种编程语言,许多项目是无所谓的,反正不同的语言都能完成工作。一般来说,条件越苛刻的项目,强大的编程语言就越能发挥作用。但是,无数的项目根本没有苛刻条件的限制。大多数的编程任务,可能只要写一些很小的程序,然后用胶水语言把这些小程序连起来就行了。你可以用自己熟悉的编程语言,或者用对于特定项目来说有着最强大函数库的语言,来写这些小程序。如果你只是需要在Windows应用程序之间传递数据,使用VisualBasic照样能达到目的。那么,Lisp的编程优势体现在哪里呢?七、语言的编程能力越强大,写出来的程序就越短(当然不是指字符数量,而是指独立的语法单位)。代码的数量很重要,因为开发一个程序耗费的时间,主要取决于程序的长度。如果同一个软件,一种语言写出来的代码比另一种语言长三倍,这意味着你开发它耗费的时间也会多三倍。而且即使你多雇佣人手,也无助于减少开发时间,因为当团队规模超过某个门槛时,再增加人手只会带来净损失。FredBrooks在他的名著《人月神话》(TheMythicalMan-Month)中,描述了这种现象,我的所见所闻印证了他的说法。如果使用Lisp语言,能让程序变得多短?以Lisp和C的比较为例,我听到的大多数说法是C代码的长度是Lisp的7倍到10倍。但是最近,NewArchitect杂志上有一篇介绍ITA软件公司的文章,里面说"一行Lisp代码相当于20行C代码",因为此文都是引用ITA总裁的话,所以我想这个数字来自ITA的编程实践。如果真是这样,那么我们可以相信这句话。ITA的软件,不仅使用Lisp语言,还同时大量使用C和C++,所以这是他们的经验谈。根据上面的这个数字,如果你与ITA竞争,而且你使用C语言开发软件,那么ITA的开发速度将比你快20倍。如果你需要一年时间实现某个功能,它只需要不到三星期。反过来说,如果某个新功能,它开发了三个月,那么你需要五年才能做出来。你知道吗?上面的对比,还只是考虑到最好的情况。当我们只比较代码数量的时候,言下之意就是假设使用功能较弱的语言,也能开发出同样的软件。但是事实上,程序员使用某种语言能做到的事情,是有极限的。如果你想用一种低层次的语言,解决一个很难的问题,那么你将会面临各种情况极其复杂、乃至想不清楚的窘境。所以,当我说假定你与ITA竞争,你用五年时间做出的东西,ITA在Lisp语言的帮助下只用三个月就完成了,我指的五年还是一切顺利、没有犯错误、也没有遇到太大麻烦的五年。事实上,按照大多数公司的实际情况,计划中五年完成的项目,很可能永远都不会完成。我承认,上面的例子太极端。ITA似乎有一批非常聪明的黑客,而C语言又是一种很低层次的语言。但是,在一个高度竞争的市场中,即使开发速度只相差两三倍,也足以使得你永远处在落后的位置。

#include<stdio.h>

#include<stdlib.h>

void BubbleSort(int a[], const int first, const int last)//冒泡排序

void InsertSort(int a[], const int first, const int last)//插入排序

void SelectSort(int a[], const int first, const int last)//选择排序

void MergeSort(int a[], const int p, const int r)//合并排序

void QuickSort(int a[],const int p,const int r)//快速排序

void ShellSort(int a[],const int p,const int r,const int dlta[],const int t)//希尔排序

void HeapSort(int a[],const int p, int r)//堆排序

void StoogeSort(int a[],const int p,const int r)//Stooge排序(不用)算法复杂度没算清楚

void main()

{

//插入排序算法

int a[11] = {6,4,5,3,2,1}

int dlta[]={9,5,3,2,1}

//BubbleSort(a,0,5)

//InsertSort(a,0,5)

//SelectSort(a,0,5)

//MergeSort(a,0,5)

//QuickSort(a,0,5)

//ShellSort(a,0,5,dlta,5)

HeapSort(a,0,5)

//StoogeSort(a,0,5)

for(int i=0i<=5i++)

{

printf("%d ",a[i])

}

}

/************************冒泡排序***********************/

void BubbleSort(int a[], int first, int last)

{

//实现对数组a[]中a[first]到a[last]升序的“冒泡”排序

int i,j,temp

for(i=firsti<=lasti++)

{

for(j=firstj<last-ij++)

{

if(a[j] >a[j+1])

{

temp = a[j]

a[j] = a[j+1]

a[j+1] = temp

}

}

}

}

/************************插入排序***********************/

void InsertSort(int a[], int first, int last)

{

//实现对数组a[]中a[first]到a[last]升序的“插入”排序

//最坏情况为n的平方,,多用于小数组

int i,j,temp

for(i=first+1i<=lasti++)

{

temp = a[i]

j = i - 1

while((j >= 0) &&(a[j] >temp))

{

a[j+1] = a[j]

j--

}

a[j+1] = temp

}

}

/************************选择排序***********************/

void SelectSort(int a[], int first, int last)

{

//实现对数组a[]中a[first]到a[last]升序的“选择”排序

int i, j, temp, num

for(i=firsti<lasti++)

{

num = i

for(j=i+1j<=lastj++)

{

if(a[j] <a[num])

{

num = j

}

}

if(i != num)

{

temp = a[num]

a[num] = a[i]

a[i] = temp

}

}

}

/************************合并排序***********************/

void Merge(int a[],const int p,const int q,const int r)

{

//合并排序算法中的实现合并的子程序

int iLLength,iRLength

int *L, *R, i, j, k

iLLength = q - p + 1

iRLength = r - q

L = (int *)malloc(iLLength*sizeof(int))//或者 C++中 new int[iLLength]

R = (int *)malloc(iRLength*sizeof(int))//或者 C++中 new int[iRLength]

if(L == 0 || R== 0)

{

printf("内存分配失败!!!")

return

}

for(i=0i<iLLengthi++)

{

L[i] = a[p+i]

}

for(j=0j<iRLengthj++)

{

R[j] = a[q+j+1]

}

i = 0

j = 0

for(k=pk<=rk++)

{

if((i<iLLength) &&(j<iRLength) &&(L[i]<=R[j]) || (j == iRLength))

{

a[k] = L[i]

i++

}

else if(j<iRLength)

{

a[k] = R[j]

j++

}

}

free(R)free(L)

}

void MergeSort(int a[],const int p,const int r)

{

//合并排序算法-主程序

//n*lg(n),系数较小

int q

if(p<r)

{

q = (p+r)/2

MergeSort(a,p,q)

MergeSort(a,q+1,r)

Merge(a,p,q,r)

}

}

/************************Stooge排序***********************/

void StoogeSort(int a[],const int p,const int r)

{

//Stooge算法

int temp, k

if(a[p]>a[r])

{

temp= a[p]

a[p]= a[r]

a[r]= temp

}

if((p+1) >= r)

{

return

}

k = (r-p+1)/3

StoogeSort(a,p,r-k)

StoogeSort(a,p+k,r)

StoogeSort(a,p,r-k)

}

/************************快速排序*********************/

int QuickPartition(int a[],const int p,const int r)

{

//快速排序的(关键)分治过程

int temp, x, i, j

x = a[r]

i = p - 1

for(j=pj<rj++)

{

if(a[j] <= x)

{

i = i + 1

temp = a[i]

a[i] = a[j]

a[j] = temp

}

}

temp = a[i+1]

a[i+1] = a[r]

a[r] = temp

return (i+1)

}

/*

void QuickSort(int a[],const int p,const int r)

{

//快速排序算法-主程序

//与下面的“尾递归实现方法”比较,缺点:右边数组的递归不是必须的,增加了运行堆栈深度和调用开销

int q

if(p <r)

{

q = QuickPartition(a, p, r)

QuickSort(a, p, q-1)

QuickSort(a, q+1, r)

}

}

*/

void QuickSort(int a[],int p,const int r)

{

//快速排序算法-主程序

//“尾递归实现方法”是对上面的快速排序主程序实现的一种优化

//系数较小,常用大数组

int q

while(p <r)

{

q = QuickPartition(a, p, r)

QuickSort(a, p, q-1)

p = q + 1

}

}

/************************希尔排序**********************/

void ShellInsert(int a[],const int p,const int r, int dk)

{

//希尔排序算法的关键子程序-插入排序子程序

int i, j, temp

for(i=p+dki<=ri++)

{

if(a[i] <a[i-dk])

{

temp = a[i]

for(j=i-dk((j>=0) &&(temp <a[j]))j -= dk)

{

a[j+dk] = a[j]

}

a[j+dk] = temp

}

}

}

void ShellSort(int a[],const int p,const int r,const int dlta[],const int t)

{

//希尔排序算法-主程序

//按增量序列dlta[]中的前t个增量,实现对数组a[]中a[p]到a[r]的排序

//dlta[]可能取值如:1,2,3,5,9dala[k]=2^(t-k+1)-1 其中0<=k<=t<=ld(b-1)

//增量序列的最后一个值必须是1

//增量序列中的值没有除1以外的因子, 其精确时间复杂度:数学上尚未解决的难题

int k

for(k=0k<tk++)

{

ShellInsert(a,p,r,dlta[k])

}

}

/************************堆排序***********************/

//堆排序,不如快速排序

//但是可用其来实现“优先级队列”

int Parent(int i)

{

return ((i+1)/2-1)

}

int Right(int i)

{

return (2*(i+1)-1)

}

int Left(int i)

{

return (2*(i+1))

}

void Max_Heapify(int a[],const int hplast,const int i)

{

int l, r,largest,temp

l = Left(i)

r = Right(i)

largest = ((l<=hplast) &&(a[l]>a[i])) ? l:i

if((r<=hplast) &&(a[r]>a[largest]))

{

largest = r

}

if(largest != i)

{

temp = a[i]

a[i] = a[largest]

a[largest] = temp

Max_Heapify(a,hplast,largest)

}

}

void Build_Max_Heap(int a[],const int p, const int r)

{

int i

for(i = (p+r)/2i>=pi--)

{

Max_Heapify(a,r,i)

}

}

void HeapSort(int a[],const int p, int r)

{

int i,temp

Build_Max_Heap(a,p,r)

for(i = ri >pi--)

{

temp = a[p]

a[p] = a[i]

a[i] = temp

r -= 1

Max_Heapify(a,r,0)

}

}

首先,你得先成为Java程序员,再到Java工程师,才能到Java高级工程师

不知道你对Java编程知识了解到什么程度,凡事都需要积累,沉淀。

如果是完全没有基础,那就从最基础的开始,参加专业正规的Java培训机构学习基础知道,四个半月毕业后,就业相关Java编程工作。

努力认真工作的过程可以学习很多的知识,给自己制定一个两年计划 ,两年内要实现多少有用的代码,做出多少个有用项目。

而后,根据具体情况,继续制定后两年的计划。

如果按上述程序走五年,Java高级工程师就离你不远了!

高级java工程师需要具备什么能力和技术

宏观方面

一、 JAVA。

要想成为JAVA(高级)工程师肯定要学习JAVA。一般的程序员或许只需知道一些JAVA的语法结构就可以应付了。但要成为JAVA(高级)

工程师,您要对JAVA做比较深入的研究。您应该多研究一下JDBC、IO包、Util包、Text包、JMS、EJB、RMI、线程。如果可能,希望您

对JAVA的所有包都浏览一下,知道大概的API,这样您就发现其实您想实现的很多功能,通过JAVA的API都可以实现了,就不必自己费太多的脑经 了。

二、 设计模式。

其实写代码是很容易的事情,我相信您也有同感。但如何写得好就比较难了。这个“好”字包括代码可重用性,可维护性,可扩展性等。如何写出好的代

码往往要借助一些设计模式。当然长期的代码经验积累,只要您用心,会使您形成自己代码风格。相信您的代码也比较符合代码的可重用性,可维护性,可扩展性。

但既然前人已经给我们总结出了经验,我们何不踩着前人的肩膀前进?

三、 XML。

现在的系统中不使用XML几乎是不可能的。XML的功能非常强大,它可以做数据转换、做系统的配置、甚至可保存您的系统业务数据。因此您必须了解

XML,包括它的语法,结构。您还需要比较熟练的使用解析XML的一些API,比如JDOM,SAX等,因为在我们一般的项目中,XML往往担当系统配置

信息的作用,您需要用这些API解析这些配置信息,开发完美的项目。

四、 精通使用一种或两种框架。

“框架都会有许多可重用的代码,良好的层次关系和业务控制逻辑,基于框架的开

发使你可以省出很多的开发成本”。这里希望您能精通,更多的是希望您能通过框架的使用了解框架的思想。这样您在开发一个项目时思路会开阔一些,比如您

会想到把SQL语句与您的JAVA代码分开,再比如您会考虑把您的业务逻辑配置到XML或者数据库中,这样整个项目就很容易扩张了。

五、 熟悉主流数据库。其实真正比较大的项目都是有人专门做数据库的,但往往很多项目要求作为(高级)工程师的您也参与数据库的设计以及SQL的编写。所以为了

更好的为国家做贡献,建议您还是多了解一些主流数据库,比如SQLSERVER,ORACLE,多连接SQL和存储过程以及触发器。如果您不是“科班”出

身,您还需要补充一些数据库原理方面的知识。

六、 精通一种或两种WEBServer。

因为作为JAVA工程师,特别时

想成为高级JAVA工程师的您,您不可避免地要部署您的项目到WebServer上,而且只有当您精通一种WebServer,您才可能最大限度地使用它

的资源,这往往可以节省很多时间和精力。

七、 UML。

您肯定想成为高级工程师,因此您有必要了解或熟练或精通UML,这取决于您有多大决心想成为高级工程师和项目经理。在比较正规的开发团队

中,UML是讨论项目的交流工具,您要想做一个软件工程师,您至少要能看懂,您要想做高级工程师,您要能通过它来描述您对项目的理解,尽管这不是必须,但

却很重要。

八、 站在高度分析问题:

这不是一个知识点,也不是通过书本就能学得到的。只所以提到这一点,是因为我比您还着急,我希望您更快的成为一个高级的软件工程师,而

不是一个一般的软件工程师。希望您在工作中多向您的系统分析员、需求分析员、系统设计员学习,多站在他们角度上去看您在开发的项目。在最好在项目之初先在

您的脑海里对项目有个大致的分析、设计,然后和他们进行比较,找找差别,想想缺点。

九、 工具。

您在这个阶段可能接触到不同的工具了,尽管您还需要使用JB或者IDEA,但能可能对

ROSE,Together要多了解一些,因为您要画UML了。不要再对Dreamweaver等HTML编辑器情有独钟了,那些JSP页面让初级程序员去写吧

微观方面

1.Core Java部分

这是最基础的,对于一个java高级开发/设计人员,你需要对这一部分达到精通的水平,重点内容如下:

a.面向对象编程思想(封装继承多态接口)

b.字符串处理

c.java.lang包,java.util包等常用包

d.java异常处理

2.Java高级部分

a.Java I/O流

b.Java多线程技术

c.Java网络编程

d.Java Swing

后两项可以了解即可,如果项目需要可以深入研究

3.前端基本技能

* HTML + CSS网页开发

* JavaScript

* Jquery

* 浏览器兼容性 CSS hack(了解)

4.熟练使用JSP + Servlet进行开发

5.MVC设计模式,原理,以及相关框架,如Struts

6.SSH框架

7.缓存技术 session &cookie

8.熟练使用一种以上Java开发工具(Eclipse/MyEclipse/Jbuilder/Jcreator/IntelliJIEDA/NetBeans)

9.熟练使用XML

JDOM w3c.dom SAX

10.Java设计模式

工厂模式,单例模式 ==

11.Java反射机制

反射的各种用法

12.了解或熟悉 C, C++, .NET

13.熟悉JDK的配置,环境变量

14.数据库oracle必学,其他最好了解一种以上(mysql,sql server,access==)

oracle:视图,索引,存储过程,触发器,游标,包,常用函数 ==

15.数据库原理

事务的原理,锁机制,表连接,复杂查询语句(工作经验),性能调优,锁表以及解决方案==

16.JDBC,连接池

17.Ajax,反向Ajax

18.HTTP协议,request 和 response的原理,HTTP status(了解常用的),Https原理

19.熟悉Linux基本命令,使用过Linux/Unix系统,可以编写shell脚本,可以在Linux上部署项目

20.了解windows系统批处理脚本bat

21.了解HTML5,最好学习过

22.熟悉一种JS框架,如Prototype

23.J2EE原理 熟悉一种以上web容器如Tomcat,JBoss,websphere,weblogic==

24.熟悉ant或maven

25.熟悉一门脚本语言,如python ,ruby

26.了解php/ asp

27.了解ftp协议及原理

28.熟练使用Junit测试,熟悉Mockito等测试工具

29,熟悉javac,javadoc,native,native2ascii等常用命令

30.熟悉常用的排序算法,如冒泡排序,快速排序等,最好自己研究过一些的算法。

31.了解Flex(不学也没关系)

32.了解敏捷开发模式

33.工作流workflow至少用过一种,如OSworkflow,了解原理

34.使用过VPN了解其原理

35.熟悉jstl表达式和el表达式

36.熟悉webservice,WSDL,SOAP

37.图片处理,如图片上传,预览,限制大小等

38.版本控制工具,CVS VSS SVN

39,JSON技术,JSON+AJAX

40.分页技术,最好自己实现过不仅仅是用过要知道原理

41.Java Mail

42.Java读写txt,excel,JXL技术

43.JVM原理,JVM内存管理,GC,Java堆栈池

44.熟练使用下面的工具:

office办公软件,word,excel,ppt等

plsql,sqldevelop 数据库开发工具

outlook大公司都用

ue编辑器

浏览器控制台,调试

SHH/PUTTY 远程

45.UML建模工具Rational Rose等

46. 使用log4j

47.使用过开放Api如百度,腾讯街景,新浪微博等

48.页面静态化技术(伪静态页面)

49.报表技术,使用过报表制作工具,如水晶易表。

50.定时任务,如Spring batch ,学会自定义batch任务(不适用第三方工具)

51.了解uuid

52.b/s 和 c/s架构

53.正则表达式

54.了解jndi jms

55.ERP

56.UNICODE编码,乱码解决

57.开源网络编辑器,如ckEditor

58.二进制原理

59.使用过,了解过开源论坛框架,如discuzz

60.GWT,Closure框架

61.了解大数据,云计算

62.搜索引擎搜索技术

63.软件工程,项目管理