学习IT技术要从什么方面入手

学习IT技术要从什么方面入手,第1张

字符串、变量、入栈出栈、堆、库函数、递归、循环、声明语句、预编译、编译器、解释执行、测试、运行、头文件、进程、多线程、客户-服务器、源代码、算法、数据结构、协议、套接字、提交表单、页面、文档说明、进程间通信、系统调用、标准库、控件、文件系统、环境变量、终端、空指针、分配内存空间、文件锁、信号量、消息队列、调度策略、前端、后台、数据库、好多好多哦。。。。。

一、Java核心

这是学习Java的基础,掌握程度的深浅甚至直接影响后面的整个学习进程。Java的核心主要包括3个部分:

1、初级的有语法基础、面向对象思想。

学习任何一门语言语法都是必须的,因为Java的接近自然语言,也是一种相对比较容易学的语言。同时面向对象编程更是其核心思想,要理解其实只要记住一句话就行了,那就是:一切皆是对象。

2、中级的IO流、多线程、反射及注解等。

IO流程、多线程等是相对比较高级一点的了,通过学习我们会发现这些都很有用而且很有趣。例如我们可以读取一个Excel文件、将一个文件分离,做一个时钟、使用多个线程发送邮件等等很多有意思的事。另外反射及注解更是后面流行框架SSH等的基础,在使用中你便会慢慢感受到它的无穷魅力。

3、高级一点的就是设计模式和框架之类了。

要学习好一门语言,仅仅会使用还是不够的,我们不仅要深入研究其原理,而且还要找到其一些共性的东西,从而减少反复的劳动,让代码可重用、更可靠且更容易被别人理解。

二、前端Web

现在来说Java最流行的应用还是Web开发。那么作为Web开发,对于前台的知识的学习也是必须的,当然并不是一定要按照前端工程师的标准去要求。但是一些基础的知识也是必须要掌握的,毕竟Web应用是前台和后台的一个交互的过程。像HTML、CSS、JavaScript等都是基础的知识,另外作为开发人员对目前最流行的JavaScript框架jQuery更是必学不可的。

三、数据库

有人说,所有的应用无非就是数据的输入、处理到输出的过程。期间同时可能还会涉及到数据的存储问题。对于结构化的数据,我们常用的还是像Oracle、MySQL和PostgreSQL之类的关系型数据库。同时针对数据库编程还是PL/SQL需要学习。使用Java访问数据库的话还有JDBC。那么对于非结构化的数据以及大数据该如何处理呢?其实这里也已经有了非常成熟的解决方案了,那便是Hadoop。就Hadoop而言他并不是一种思想,更多是一个实现了Mapreduce模式的框架。

四、J2EE

好了,前面这么多准备的工作。下面我们进入正题。作为Java开发,CoreJava是核心,而作为JavaWeb开发,我认为Servlet才是核心。IT培训发现Servlet是服务器端的Java应用程序,但是与普通的Java应用程序不同的是,它是由web服务器来加载启动,即我们常说的Servlet,如Tomcat便是servlet容器。另外谈到J2EE开发,这里有一个重要的模型不得不提一下,很多人其实已经想到了,那便是MVC(模型-视图-控制器)模型。在传统的web开发中,往往是JavaBean充当模型、JSP做视图而Servlet作为控制器。

学习IT技术要从以下几个方面入手:

1多看书

看书不是一扫而过, 编程需要大量实践, 练习也得慢慢过, 别人看技术书快,是因为人家都是科班出身,或者从业很多年。你是从零学, 只能恶补基础,恶补基础的意思是, 你得像科班一样花费大量时间, 而不是跟看小说一样速战速决,那样没用的。人家给你推荐的CSAPP那些书, 对于科班的人当课外书看还得看个1个月, 你如果跟着学,每本书都至少半年。

2多逛IT相关的论坛和社区

有些技术是靠经验堆积的,比如整个框架的设计,设计模式的运用。我倒觉得这个能力只要你平时留心,掌握它们只是个时间的问题。

而有些技术,是要去实打实钻研的,不看透几本英文原版书,不逛遍几个论坛,你永远不能明白。越是难的东西,越能拉开你跟别人的距离。

3多看大V的文章

大V都是过来人,很多你没听说过的问题或者不能解决的难题,他们可能早就遇到过了。现在人人手机不离手,不过有的人是用来学习,有的人却是用来打游戏或者刷剧!

4多上课或者多进社群

现在网上的课有很多很多关于IT技术的,只要你想学,总是会找到相关的课程来学习的。关键就在于你是怎么想的,仅仅是为了业余爱好学习还是为了找一份工作。在社群中除了能学习一些知识以外,还可以跟一些志同道合的朋友相互交流。

以上这些经验足以让你入门,如果想系统地学习,是需要专门去培训机构学习的,不然你的个人实力还不足以支撑你直接去就业、找工作,你可以去知乎课工场看一下!

IT工程技术是指信息技术产品构建实现的工程化方法和实用技术。它涉及的方面非常广泛,主要包括软件工程(需求分析、系统设计、构建实现、产品测试、部署实施、运营维护),项目管理(目标范围、资源配置、进度控制、质量管理、风险管理、绩效评估),技能知识(数据结构、程序算法、数据库、面向对象、分析建模、设计模式),编程语言等。目前国内专注于研究IT工程技术网站有>

现在最流行的应该是Java吧,Struts 的MVC设计模式可以使我们的逻辑变得很清晰。

Spring 的IOC和AOP可以使我们的产品在最大限度上解藕。 hibernate的当然就是实体对象的持久化了

典型的J2EE三层结构,分为表现层、中间层(业务逻辑层)和数据服务层。三层体系将业务规则、数据访问及合法性校验等工作放在中间层处理。客户端不直接与数据库交互,而是通过组件与中间层建立连接,再由中间层与数据库交互。

作者:oec2003

公众号:不止dotNET

本文继续来介绍接口隔离原则(ISP)和依赖倒置原则(DIP),这两个原则都和接口和继承有关。文章最后会简单介绍几个除了 SOLID 原则之外的原则。

提起接口,开发人员的第一反应可能是面向对象编程语言中的 interface ,但接口更广义的理解会包含:

不管是上面的哪一种,要想设计好,就需要用到接口隔离原则了。

接口隔离原则的定义是:

接口被设计出来后,就会有地方对接口进行调用,调用的地方希望接口中提供的方法都是他需要的,所以在接口设计的时候,需要考虑应该将哪些方法放入其中,让调用者使用,这就是对定义的解释。

相反,如果不精心设计,接口就会变得越来越庞大,会带来两个问题:

1、在一个更高层的接口中添加一个方法只是为了某一个子类使用,所有的子类都必须对其实现,或提供一个默认实现;

2、接口中包罗万象,调用者可能会误用其中的方法。

举个例子:我们现在正在开发 SaaS 产品,里面会涉及到对租户的 *** 作,比如租户需要注册、登录等,抽象成接口代码如下:

上面的 *** 作是针对租户这个角色的,现在有新的需求来了,对于 SaaS 厂商的管理员来说,希望能禁用租户,一种偷懒的做法就是直接在 ITenant 接口中添加禁用的方法,如下:

上面的代码就违反了接口隔离原则,因为在普通租户的使用场景下,并不希望能调用到 Diabled 方法,正确的做法是将这个方法抽象到一个新的接口中,如下:

可以看出来,改造之后,每个接口的职责更加单一了,好像跟单一职责有点类似,仔细想想,还是有些区别,单一职责原则针对的是方法、类和接口的设计。而接口隔离原则更侧重于接口的设计,另一方面就是思考的角度不同,在上面例子中,按照普通租户和管理员两种不同角色的维度来思考并进行拆分。

这个原则的名字中有两个关键词「依赖」和「倒置」,先来看看这两个词是什么意思?

依赖:在面向对象的语言中,所说的依赖通常指类与类之间的关系,比如有个用户类 User 和日志类 Log , 在 User 类中需要记录日志,就需要引入日志类 Log,这样 User 类就对 Log 类产生了依赖,代码如下:

倒置:有依赖的倒置,那肯定就有正常的依赖,我们正常的编程思维都是从上而下来编写业务逻辑的,遇到分支就写 if ,遇到循环就写 for ,需要创建对象就 new 一个,就像上面的代码,上面的代码就是一种正常的依赖。User 类依赖了 Log 类,如果倒置了,那就是 User 类不再依赖 Log 类了,下面会进一步来解释。

正常的依赖会带来的问题是:User 类和 Log 类高度耦合,当有一天我们想使用 NLog 或者 Serilog 替换 Log 类时,就需要改动 User 类,说明日志类的实现是不稳定的,而依赖一个不稳定的东西,从架构设计的角度来看,不是一个好的做法。解决此问题就需要用到依赖倒置原则。

先来看看依赖倒置原则的定义:

什么是高层模块?什么是低层模块?按照上面的代码示例,User 类是高层模块,Log 类是低层模块,二者都要依赖于抽象,就需要提取接口了:

调整后的代码 User 类中依赖变成了 ILog 接口,日志的实现类 Log 也依赖 ILog 接口,即从 ILog 接口继承而来,现在都是依赖 ILog 接口,这就是依赖倒置。

当想要将日志组件替换为 NLog 时,只需要创建一个新的类 NLogAdapter 类继承 ILog 接口,在 NLogAdapter 类中引入 NLog 组件。

这样,当日志组件替换的时候,User 类就不用修改了,因为 User 类的构造函数中使用的是 ILog 接口来接收的日志组件的对象,那到底是谁决定传递 Log 对象还是 NLogAdapter 对象呢?这就要引入一个新的概念叫「依赖注入」。

关于依赖注入可以看我之前写的两篇文章:

依赖倒置是一种架构设计思想,指导架构层面的设计,依赖注入则是一种具体的编码技巧,用来实现这种设计思想。

除了 SOLID 五大原则之外,还有一些原则也在指引我们设计好的代码架构方面发挥着作用:

KISS 的全称是:Simple and Stupid ,该原则就是告诉我们,在设计时要尽量保持简单,大道至简嘛。这里的简单不完全是指代码的简洁。现在已经不是单打独斗的时代,大部分情况下开发人员都是在一个团队中协同工作,所以我认为对简单的理解可以分为:

将复杂的东西能够深入浅出,做到简单、简洁,这是能力的体现。

YAGNI 的全称是:You Ain’t Gonna Need It。直译就是:你不会需要它。核心思想就是指导我们不要做过度设计。

1、当我们能识别到代码的变化点的时候,可以预留扩展点,但不要提前做复杂的实现;

2、持续重构来优化代码,而不是一开始就提取各种通用方法,例如一个私有函数只有一个调用的时候,就放在类里面,离调用者最近的地方,当有不止一处都会使用时,再考虑重构来进行通用方法的抽取。

过度设计会浪费资源,让代码复杂度变大,难以阅读和维护。

DRY 的全称是:Don’t Repeat Yourself ,就是不要重复自己,提升代码的复用性,告别 CV 大法。

很多初级程序员都喜欢面向 Ctrl+C、Ctrl+V 编程,当需求变化的时候,很容易就遗漏一些场景,但即便是复制粘贴也不完全都是违反 DRY 。

代码的重复有两种情况:

1、代码的逻辑重复,语义也重复:这种违反了 DRY ,需要进行重构;

2、代码的逻辑重复,语义不重复:在某个阶段,两段代码逻辑是相同的,但其实是两种不同的应用场景,语义不一样,就没有违反 DRY。如果对这种代码进行重构提取成公共方法,随着业务发展,两种不同的场景独立演化了,稍不注意,代码中就会出现各种 if 判断,影响可读性和可维护性。

LOD 全称是:The Least Knowledge Principle ,也被称之为迪米特法则。该法则有两条指导原则:

1、不该有直接依赖关系的类之间,不要有依赖;

2、有依赖关系的类之间,尽量只依赖必要的接口。

其实就是一直流传的代码要高内聚、低耦合,单一职责和接口隔离想要表达的也是这个意思,区别只是侧重点有所不同:

各种原则之间相辅相成,有很多只是有些细微的差别,慢慢理解原理,才能以不变应万变。

JDK为程序员提供了大量的类库 而为了保持类库的可重用性 可扩展性和灵活性 其中使用到了大量的设计模式 本文将介绍JDK的I/O包中使用到的Decorator模式 并运用此模式 实现一个新的输出流类

Decorator模式简介

Decorator模式又名包装器(Wrapper) 它的主要用途在于给一个对象动态的添加一些额外的职责 与生成子类相比 它更具有灵活性

有时候 我们需要为一个对象而不是整个类添加一些新的功能 比如 给一个文本区添加一个滚动条的功能 我们可以使用继承机制来实现这一功能 但是这种方法不够灵活 我们无法控制文本区加滚动条的方式和时机 而且当文本区需要添加更多的功能时 比如边框等 需要创建新的类 而当需要组合使用这些功能时无疑将会引起类的爆炸

我们可以使用一种更为灵活的方法 就是把文本区嵌入到滚动条中 而这个滚动条的类就相当于对文本区的一个装饰 这个装饰(滚动条)必须与被装饰的组件(文本区)继承自同一个接口 这样 用户就不必关心装饰的实现 因为这对他们来说是透明的 装饰会将用户的请求转发给相应的组件(即调用相关的方法) 并可能在转发的前后做一些额外的动作(如添加滚动条) 通过这种方法 我们可以根据组合对文本区嵌套不同的装饰 从而添加任意多的功能 这种动态的对对象添加功能的方法不会引起类的爆炸 也具有了更多的灵活性

以上的方法就是Decorator模式 它通过给对象添加装饰来动态的添加新的功能 如下是Decorator模式的UML图

Component为组件和装饰的公共父类 它定义了子类必须实现的方法

ConcreteComponent是一个具体的组件类 可以通过给它添加装饰来增加新的功能

Decorator是所有装饰的公共父类 它定义了所有装饰必须实现的方法 同时 它还保存了一个对于Component的引用 以便将用户的请求转发给Component 并可能在转发请求前后执行一些附加的动作

ConcreteDecoratorA和ConcreteDecoratorB是具体的装饰 可以使用它们来装饰具体的Component

Java IO包中的Decorator模式

JDK提供的java io包中使用了Decorator模式来实现对各种输入输出流的封装 以下将以java io OutputStream及其子类为例 讨论一下Decorator模式在IO中的使用

首先来看一段用来创建IO流的代码

以下是代码片段

try {

DataOutputStream out = new DataOutputStream(new FileOutputStream(

test txt ));

} catch (FileNotFoundException e) {

e printStackTrace();

}

这段代码对于使用过JAVA输入输出流的人来说再熟悉不过了 我们使用DataOutputStream封装了一个FileOutputStream 这是一个典型的Decorator模式的使用 FileOutputStream相当于Component DataOutputStream就是一个Decorator 将代码改成如下 将会更容易理解

以下是代码片段

try {

OutputStream out = new FileOutputStream( test txt );

out = new DataOutputStream(out);

} catch(FileNotFoundException e) {

e printStatckTrace();

}

由于FileOutputStream和DataOutputStream有公共的父类OutputStream 因此对对象的装饰对于用户来说几乎是透明的 下面就来看看OutputStream及其子类是如何构成Decorator模式的

OutputStream是一个抽象类 它是所有输出流的公共父类 其源代码如下

以下是代码片段

public abstract class OutputStream implements Closeable Flushable {

public abstract void write(int b) throws IOException;

}

它定义了write(int b)的抽象方法 这相当于Decorator模式中的Component类

ByteArrayOutputStream FileOutputStream 和 PipedOutputStream 三个类都直接从OutputStream继承 以ByteArrayOutputStream为例

以下是代码片段

public class ByteArrayOutputStream extends OutputStream {

protected byte buf[];

protected int count;

public ByteArrayOutputStream() {

this( );

}

public ByteArrayOutputStream(int size) {

if (size 〈 ) {

throw new IllegalArgumentException( Negative initial size: + size);

}

buf = new byte[size];

}

public synchronized void write(int b) {

int newcount = count + ;

if (newcount 〉 buf length) {

byte newbuf[] = new byte[Math max(buf length 〈〈 newcount)];

System arraycopy(buf newbuf count);

buf = newbuf;

}

buf[count] = (byte)b;

count = newcount;

}

}

它实现了OutputStream中的write(int b)方法 因此我们可以用来创建输出流的对象 并完成特定格式的输出 它相当于Decorator模式中的ConcreteComponent类

接着来看一下FilterOutputStream 代码如下

以下是代码片段

public class FilterOutputStream extends OutputStream {

protected OutputStream out;

public FilterOutputStream(OutputStream out) {

this out = out;

}

public void write(int b) throws IOException {

out write(b);

}

}

同样 它也是从OutputStream继承 但是 它的构造函数很特别 需要传递一个OutputStream的引用给它 并且它将保存对此对象的引用 而如果没有具体的OutputStream对象存在 我们将无法创建FilterOutputStream 由于out既可以是指向FilterOutputStream类型的引用 也可以是指向ByteArrayOutputStream等具体输出流类的引用 因此使用多层嵌套的方式 我们可以为ByteArrayOutputStream添加多种装饰 这个FilterOutputStream类相当于Decorator模式中的Decorator类 它的write(int b)方法只是简单的调用了传入的流的write(int b)方法 而没有做更多的处理 因此它本质上没有对流进行装饰 所以继承它的子类必须覆盖此方法 以达到装饰的目的

BufferedOutputStream 和 DataOutputStream是FilterOutputStream的两个子类 它们相当于Decorator模式中的ConcreteDecorator 并对传入的输出流做了不同的装饰 以BufferedOutputStream类为例

以下是代码片段

public class BufferedOutputStream extends FilterOutputStream {

private void flushBuffer() throws IOException {

if (count 〉 ) {

out write(buf count);

count = ;

}

}

public synchronized void write(int b) throws IOException {

if (count 〉= buf length) {

flushBuffer();

}

buf[count++] = (byte)b;

}

}

这个类提供了一个缓存机制 等到缓存的容量达到一定的字节数时才写入输出流 首先它继承了FilterOutputStream 并且覆盖了父类的write(int b)方法 在调用输出流写出数据前都会检查缓存是否已满 如果未满 则不写 这样就实现了对输出流对象动态的添加新功能的目的

下面 将使用Decorator模式 为IO写一个新的输出流

自己写一个新的输出流

了解了OutputStream及其子类的结构原理后 我们可以写一个新的输出流 来添加新的功能 这部分中将给出一个新的输出流的例子 它将过滤待输出语句中的空格符号 比如需要输出 java io OutputStream 则过滤后的输出为 javaioOutputStream 以下为SkipSpaceOutputStream类的代码

以下是代码片段

import java io FilterOutputStream;

import java io IOException;

import java io OutputStream;

/

A new output stream which will check the space character

and won t write it to the output stream

@author Magic

/

public class SkipSpaceOutputStream extends FilterOutputStream {

public SkipSpaceOutputStream(OutputStream out) {

super(out);

}

/

Rewrite the method in the parent class and

skip the space character

/

public void write(int b) throws IOException{

if(b!= ){

super write(b);

}

}

}

它从FilterOutputStream继承 并且重写了它的write(int b)方法 在write(int b)方法中首先对输入字符进行了检查 如果不是空格 则输出

以下是一个测试程序

以下是代码片段

import java io BufferedInputStream;

import java io DataInputStream;

import java io DataOutputStream;

import java io IOException;

import java io InputStream;

import java io OutputStream;

/

Test the SkipSpaceOutputStream

@author Magic

/

public class Test {

public static void main(String[] args){

byte[] buffer = new byte[ ];

/

Create input stream from the standard input

/

InputStream in = new BufferedInputStream(new DataInputStream(System in));

/

write to the standard output

/

OutputStream out = new SkipSpaceOutputStream(new DataOutputStream(System out));

try {

System out println( Please input your words: );

int n = in read(buffer buffer length);

for(int i= ;i〈n;i++){

out write(buffer[i]);

}

} catch (IOException e) {

e printStackTrace();

}

}

}

执行以上测试程序 将要求用户在console窗口中输入信息 程序将过滤掉信息中的空格 并将最后的结果输出到console窗口 比如

以下是引用片段

Please input your words:

a b c d e f

abcdef

总 结

lishixinzhi/Article/program/Java/gj/201311/27433

以上就是关于从事IT行业,或者简单的说是编程,常用的术语有哪些呢全部的内容,包括:从事IT行业,或者简单的说是编程,常用的术语有哪些呢、IT培训分享JavaEE学习路线图、学习IT技术要从什么方面入手等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/8858337.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-22
下一篇 2023-04-22

发表评论

登录后才能评论

评论列表(0条)

保存