Skip to content

Instantly share code, notes, and snippets.

View simonwoo's full-sized avatar
💭
I may be slow to respond.

Chong WU simonwoo

💭
I may be slow to respond.
View GitHub Profile

我之前是一个后端工程师,我本质上是看不起前端开发的,这其中有很多原因。众所周知,前端开发主要有三大支柱:HTML,CSS和JS。 作为计算机专业的学生,始终觉得HTML和CSS根本就称不上一门语言,只是由一些标签组成,太简单。相对的,我觉得后端开发比较高大上, 涉及到服务器相关,数据存储,运算都是在这里发生。可是命运就是这么喜欢捉弄人,由于今年公司业务调整,我从一个高大上的后端开发 工程师变成了自己以前鄙视的前端工程师。在这半年多的时间内,重新刷新了我对前端的认识,彻底推翻了前端比较低端的想法。

事实上,这不是我第一次从事前端方面的开发,14年6月实习。

Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
}
Number.method('integer', function (){
return Math[this < 0 ? 'ceil' : 'floor'](this);
});
String.method('trim', function () {
.declaration-order {
/* Positioning */
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
z-index: 100;
/* Box-model */
Primitives are passed by value, Objects are passed by "copy of a reference".
Specifically, when you pass an object (or array) you are (invisibly) passing a reference to that object, and it is possible to modify the contents of that object, but if you attempt to overwrite the reference it will not affect the copy of the reference held by the caller - i.e. the reference itself is passed by value:
function replace(ref) {
ref = {}; // this code does _not_ affect the object passed
}
function update(ref) {
ref.key = 'newvalue'; // this code _does_ affect the _contents_ of the object
function foo(num) {
    console.log( "foo: " + num );

    // keep track of how many times `foo` is called
    this.count++;
}

foo.count = 0;
function getData($timeout,$q){
    var defer=$q.defer();
    $timeout(function(){
         if(Math.round(Math.rondom())){
            defer.solve('data received!')
          }else{
            defer.reject('oh no an error! try again');  
           }
 },2000)

需要工具:

  • Virtual Box - 虚拟机,用来运行Linux
  • docker-machine - 管理虚拟机
  • docker
  • docker-compose - 管理多个docker containers
  • Kitematic - 管理Docker Hub

安装方式

  • 第一个是基础。比如对集合类,并发包,IO/NIO,JVM,内存模型,泛型,异常,反射,等有深入了解,最好是看过源码了解底层的设计。 比如一般面试都会问ConcurrentHashMap,CopyOnWrite,线程池,CAS,AQS,虚拟机优化等知识点,因为这些对互联网的企业是绝对重要的。 而且一般人这关都过不了,还发闹骚说这些没什么用,为什么要面试。举一例子,在使用线程池时,因为使用了无界队列,在远程服务异常情况下导致内层飙升,怎么去解决?你要是连线程池都不清楚,你怎么去玩?再举一例,由于对ThreadLocal理解出错,使用它做线程安全的控制,导致没能实现真的线程安全,你怪我哦?所以作为一个拿两万的JAVA程序员这点基础是必须的。
  • 第二你需要有全面的互联网技术相关知识。从底层说起,你起码得深入了解mysql,redis,mongodb,nginx,tomcat,rpc,jms等方面的知识。你要问需要了解到什么程度,我可以给你说个大慨。首先对于MySQL,你要知道常见的参数设置,存储引擎怎么去选择,还需要了解常见的索引引擎,知道怎么去选择。知道怎么去设计表,怎么优化sql,怎么根据执行计划去调优。高级的你需要去做分库分表的设计和优化,一般互联网企业的数据库都是读写分离,还会垂直与水平拆分,所以这个也有经验的成分在里面。然后redis,mongodb都是需要了解原理,需要会调整参数的,而nginx和tomcat几乎都是JAVA互联网方面必配,其实很阿里的技术栈选择有点关系。至于rpc相关的就多的去,必须各种网络协议,序列化技术,SOA等等,你要有一个深入的理解。现在应用比较广的rpc框架,在国内就是dubbo了,可以自行搜索。至于jms相关的起码得了解原理吧,一般情况下不是专门开发中间件系统和支撑系统的不需要了解太多细节,国内企业常用的主要是activeMQ和kafka。你能对我说的都研究的比较深入,阿里p6我觉得是没问题的,当然这个还需要看你的架构能力方面的面试表现了。
  • 第三就是编程能力,编程思想,算法能力,架构能力的考量。首先2W程序员对算法的要求我觉得还是比较低,再高级也最多红黑树吧,但是排序和查询的基本算法得会。编程思想是必须的,问你个AOP和IOC你起码的清清楚楚,设计模式不说每种都用过,但是也能深入理解个十四五种。编程能力这个我觉得不好去评价,但是拿一个2000W用户根据姓名年龄排序这种题

背景

Java具有跨平台的特性,可以一次编译,到处运行。在一个平台下编写的程序,无需任何改变就可以在另一个平台下运行。跨平台是如何实现的?答案就是通过JVM (Java Virtual Machine)。我们编写.java文件,编译后会生成一种.class文件,称为字节码文件(byte code)。JVM就是负责将字节码文件翻译成特定平台下的机器码然后运行。也就是说,只要在不同平台上安装对应的JVM,就可以运行字节码文件,达到运行我们编写的Java程序的目的。JVM在这个过程中扮演一个中间件的角色。

Java规范包括两部分:Java语言规范和Java虚拟机规范。实现语言无关性的基础是虚拟机和字节码储存格式。Java虚拟机不和包括Java在内的任何语言绑定,它只与Class文件这种特定的二进制文件格式所关联,Class文件中包含了Java虚拟机指令集和符号表以及若干辅助信息。

使用Java编译器可以将Java代码编译成Class文件,使用JRuby等其他语言的编译器也可以将程序编译成Class文件,虚拟机并不关心Class文件的来源是何种语言。

Java语言中的各种变量,关键字和运算符号的语义最终都是由多条字节码命令组合而成。

Java Class文件结构

Adapter

The Adapter pattern allows otherwise incompatible classes to work together by converting the interface of one class into an interface expected by the clients.

Example:

Socket wrenches provide an example of the Adapter. A socket attaches to a ratchet, provided that the size of the drive is the same. Typical drive sizes in the United States are 1/2" and 1/4". Obviously, a 1/2" drive ratchet will not fit into a 1/4" drive socket unless an adapter is used. A 1/2" to 1/4" adapter has a 1/2" female connection to fit on the 1/2" drive ratchet, and a 1/4" male connection to fit in the 1/4" drive socket.

example

Facade

The Facade defines a unified, higher level interface to a subsystem that makes it easier to use.

Example: