简介
本文是对如何学习一门编程语言的具体实践-Java语言第一篇。
前面说了基础语法是很简单的,如果有语言基础,比较好的方法是过一遍Learn X in Y minutes。
下文是在公司给毕业生做培训时的PPT,可做参考!
Java环境搭建
得到如下信息,则表示搭建成功!
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)
Java中需要理解两个路径:
- path是系统查找程序的路径
- classpath是Java查找类的路径
第一个程序
//例子代码
public class Hello{
public static void main(String[] args){
int a = 1 + 1;
int b = 1 + 2;
System.out.println("(1 + 1) * 3 + (1 + 2) = " + (a * 3 + b));
}
}
- 打开命令行,切换到文件所在路径
- 输入javac Hello.java
- 输入java Hello
简介
未来的应用必然是异构的,绝对不会限定在一门语言上,这就要求我们能根据需要快速的掌握一门语言。
本文就个人经历谈一谈如何快速的学习一门编程语言。主要面向已经掌握了一门语言的人。
学习目的
当你决定要学习一门语言的时候,请先问问自己为什么要学习这门语言?
如果答案是这门语言现在很火,那么可以洗洗睡了。生命苦短,好好玩乐吧,少年!
个人认为需要学习一门语言的动机有如下几个:
- 工作需要:工作需要使用这门语言,而且你还得靠这份工作养活,那么无论你怎么不情愿,硬着头皮学吧!
- 提高效率:目前你使用的语言效率不高,而另一门语言能显著的提高效率(公司对语言的使用没有限制)。或者能作为工具语言提高你的工作效率。
- 拓宽思路:你使用的面向过程语言,想了解了解被吹得天花乱坠的面向对象语言。或者你使用的面向对象语言,想看看函数式编程语言是什么鬼!
而第一种目的和第二,三中目的所要学习的程度则有差别。工作需要当然是越深入越好。提高效率则更偏向实用。拓宽思路则理解其思想即可。
确立了目标后才能更好的学习语言,比如你只是想拓宽思路,那么没必要死抠语法,理解其思想即可,语法忘了就忘了。如果是使用,那么后期需要频繁的使用,在使用的过程中反馈学习,才能有更好的效果。编程嘛,无他,唯手熟尔!
无论什么目的,都需要从基础开始!
环境与语法
首先是要摸清你要学习的语言的环境和基本语法。这个耗时不会很长,一般半天左右即可。
目前大部分语言都提供了傻瓜式的安装包,所以环境基本不是问题了。
语法的话,基本语法其实很简单。只要你有一门编程语言的基础,基本语法的学习也就是分分钟的事。无外乎:
等等,这些最基本的东西,只是各个语言在语法表达层面上的差异罢了!
语言的思想
基本语法只能说达到了Hello World的级别。而语言的思想则是核心重点。
当然,如果你会过程式语言,再学一门过程式语言,这个坎就比较小了(只涉及到一些小的语法层面的学习,
比如Java使用接口来实现多重继承,而ruby使用的是mixin)。但是如果你学过过程式语言,现在要学面向对象语言,
或者你会面向对象语言,要学习函数式语言,则需要重点越过这个坎。
Docker的用途
在程序的生命周期中,主要有开发,测试,发布环节。每个环节都需要部署相应的环境。
简单来说,Java使得程序能够一次编译到处运行,但是需要部署的每台机器都要部署jdk,server等,而每次部署都会是个耗时的过程,可能jdk版本不同,机器系统不同等导致部署环境不一致,进而导致无法发布应用的情况。
Docker的作用就是将整个应用连带部署环境一起打包。就是说开发时配置好的环境,可以一起打包,拷贝到测试,发布机器上直接去发布即可。
Docker的安装
windows下从下面的连接下载安装包!
https://github.com/boot2docker/windows-installer/releases
下载最新版本的:docker-install.exe即可。一路next,没什么好说的。
启动Docker
直接双击Boot2Docker Start即可启动。启动后会将c:/Users/{username}目录挂载过去,可以作为本地与docker的文件交互目录
SSH连接
可以通过SSH工具连接到Docker上进行操作!在Docker界面上通过
boot2docker ip
可以获取Docker的IP。默认的用户名和密码是: docker/tcuser
简介
Java模块化一拖再拖,目前jdk9发布了包含jigsaw的先行版。本文为Project Jigsaw: Module System Quick-Start Guide的简译,及使用感受总结。
翻译正文
本文提供了一些简单的例子方便开发者熟悉模块化。
例子中的文件路径使用反斜杠和冒号分隔。Windows用户请修改为反斜杠和分号。
Greetings
第一个例子是个叫com.greetings的模块,它只是简单的打印"Greetings!"。这个模块包含两个源文件:模块定义文件(mmodule-info.java)和主类。
按规定,源文件需要在一个目录下,这个目录表示模块,目录名即模块名。
src/com.greetings/com/greetings/Main.java
src/com.greetings/module-info.java
$ cat src/com.greetings/module-info.java
$ cat src/com.greetings/com/greetings/Main.java
package com.greetings;
public class Main {
public static void main(String[] args) {
System.out.println("Greetings!");
}
}
简介
使用Clojure封装了Graphviz的使用,目前主要实现了UML的绘制
使用
以命令模式的UML为例,演示cdraw的使用
安装Graphviz
cdraw是对Graphviz的简单封装,请先安装Graphviz
添加依赖
- 使用leiningen新建一个Clojure项目uml
- 在project.clj中添加如下依赖
[com.ivaneye/cdraw "0.2.0"]
定义类
(ns uml.core
(:require [cdraw.uml :refer :all]))
(defclass Client)
(defclass Inboker)
(defclass Receiver {:m ["Action()"]})
(defclass Command {:m ["Execute()"]})
(defclass ConcreteCommand {:f ["state"] :m ["Execute()"]})
- 第一,二行,引入了cdraw
- defclass定义了类,及其字段(:f)和方法(:m),效果图如下:
什么是ClassLoader?
Java程序都是由若干个.class文件组成,程序的运行过程即是对class文件的调用。
程序在启动的时候,并不会一次性加载程序所要用的所有class文件,而是根据程序的需要,
通过Java的类加载机制(ClassLoader)来动态加载某个class文件到内存当中的,
只有class文件被载入到了内存之后,才能被其它class所引用。
所以ClassLoader就是用来动态加载class文件到内存当中用的。
Java默认提供的三个ClassLoader
- BootStrap ClassLoader:称为启动类加载器,是Java类加载层次中最顶层的类加载器,负责加载JDK中的核心类库,如:rt.jar、resources.jar、charsets.jar等
- Extension ClassLoader:称为扩展类加载器,负责加载Java的扩展类库,默认加载JAVA_HOME/jre/lib/ext/目下的所有jar。
- App ClassLoader:称为系统类加载器,负责加载应用程序classpath目录下的所有jar和class文件。
示例:
import com.sun.nio.zipfs.ZipFileStore;
public class Test {
public static void main(String[] args) {
System.out.println("1".getClass().getClassLoader());
System.out.println(ZipFileStore.class.getClassLoader());
System.out.println(A.class.getClassLoader());
}
}
class A{}
输出结果:
null //BootStrap ClassLoader输出为null
sun.misc.Launcher$ExtClassLoader@3e10c986
sun.misc.Launcher$AppClassLoader@610f7612
简介
一致性协议主要是为了解决分布式环境下的数据一致性问题。
对于单节点应用来说,数据的同步相对较简单。例如数据库的事务,多线程中的锁,都是为了保证数据的一致性。
而对于分布式环境来说,没有完善的强一致性解决方案。
在2000年,加州大学伯克利分校Eric Brewer教授提出了CAP猜想(后被证明可行):一个分布式系统不可能同时满足一致性(C:Consistency),
可用性(A:Abailability)和分区容错性(P:Partition tolerance)这三个基本需求,最多只能同时满足其中的两项。
后eBay架构师Dan Pritchett提出了BASE理论,即Basically Available(基本可用),Soft state(软状态)和Eventually consisent(最终一致性)。
其核心思想即无法做到强一致性,但系统可以根据自身做到最终一致性。
故对于分布式系统设计,目前的做法是保证可用性和分区容错性的基础上去实现最终一致性。
而对于最终一致性处理,比较著名的协议和算法便是:二阶段提交协议(2PC),三阶段提交协议(3PC)以及Paxos算法。