2017年高频率的互联网校园招聘面试题

 

前言

参加了2017年校招,面试了阿里、百度、腾讯、滴滴、美团、网易、去哪儿等公司,个人是客户端 Android 方向,总结了面试过程中频率出现较高的题目,希望对大家有所帮助。

2017年高频率的互联网校园招聘面试题

Java 一些知识点

Object 有哪些方法

  • public 方法:getClass、equals、hashCode、toString、wait、notify
  • protected 方法:clone、finalize
  • private 方法:registerNatives,该方法作用是将不同平台C/C++实现的方法映射到Java中的native方法
public class Object {
    private static native void registerNatives();
    // 声明后有紧接静态代码块
    static {
        registerNatives();
    }
}

自动装箱

public static void main(String[] args) {
    int i = 0;
    Integer j = new Integer(0);
    System.out.println(j == i);
    System.out.println(j.equals(i));
}

上述代码的输出是

true 
true

Java 虚拟机 GC 根节点的选择

Java通过可达性分析来判断对象是否存活。基本思想是通过一系列称为”GC roots”的对象作为起始点,可以作为根节点的是:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象
  • 本地方法栈中 JNI(即一般说的 Native 方法)引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象

笔者这么理解,作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中。
虚拟机栈、本地方法栈这都是局部变量,某个方法执行完,某些局部使用的对象可以被回收。

类加载机制

  • 启动类加载器( Bootstrap ClassLoader)启动类加载器无法被 Java 程序员直接引用, 这个类加载器负责把存放在<Java_HOME>/lib目录中的, 或者被-Xbootclasspath参数指定路径中的, 并且是被虚拟机识别的类库加载到虚拟机内存中.
  • 扩展类加载器(Extension ClassLoader)负责加载在<Java_HOME>/lib/ext目录中的, 或者被Java.ext.dirs系统变量所指定的路径中的所有类库。
  • 应用程序类加载器( Application ClassLoader )这个类加载器是ClassLoader 中的 getSystemClassLoader()方法的返回值, 一般称其为系统类加载器, 它负责加载用户类路径( ClassPath )上所指定的类库

Java 虚拟机的角度而降, 只存在两种不同的类加载器:

  • 一个是启动类加载器( Bootstrap ClassLoader ), 这个类加载使用 C++ 语言实现, 是虚拟机自身的一部分;
  • 另一种是其他所有的类加载器, 他们由 Java 语言实现, 独立于虚拟机之外, 并且全部继承自Java.lang.ClassLoader

加载类的寻找范围就是 JVM 默认路径加上Classpath, 类具体是使用哪个类加载器不确定。

类加载主要步骤

  • 加载 把 class 文件的二进制字节流加载到 jvm 里面
  • 验证 确保 class 文件的字节流包含的信息符合当前 jvm 的要求 有文件格式验证, 元数据验证, 字节码验证, 符号引用验证等
  • 准备 正式为类变量分配内存并设置类变量初始值的阶段, 初始化为各数据类型的零值
  • 解析 把常量值内的符号引用替换为直接引用的过程
  • 初始化 执行类构造器<clinit>()方法
  • 使用 根据相应的业务逻辑代码使用该类
  • 卸载 类从方法区移除

双亲委派模型

除了顶层的启动类加载器之外, 其余的类加载器都应当有自己的父类加载器, 父子关系这儿一般都是以组合来实现。

工作过程: 如果一个类加载器收到了类加载的请求, 它首先不会自己去尝试加载这个类, 而是把这个请求委派给父类加载器去完成, 最终所有的加载请求都会传送到顶层的启动类加载器中, 只有当父类加载器反馈自己无法完成这个请求时候, 才由子加载器来加载。

例如类Object,它放在rt.jar中,无论哪一个类加载器要加载这个类,最终都是委派给启动类加载器进行加载,因此Object类在程序的各种类加载器环境中都是同一个类。

对于任何一个类, 都需要由加载它的类加载器和这个类本身一同确定其在 Java 虚拟机中的唯一性。

ClassLoader.loadClass()的代码如下,先检查是否已经被加载过,如果没有则parent.loadClass()调用父加载器的loadClass()方法,如果父加载器为空则默认使用启动类加载器作为父加载器。如果父类加载器加载失败,抛出ClassNotFoundException,再调用自己的findClass()方法进行加载。

另外,如果我们自己实现类加载器,一般是Override复写 findClass方法,而不是loadClass方法。

protected Class<?> loadClass(String name, boolean resolve) 
throws ClassNotFoundException {
    synchronized (getClassLoadingLock(name)) {
        // First, check if the class has already been loaded
        Class c = findLoadedClass(name);
        if (c == null) {
            long t0 = System.nanoTime();
            try {
                if (parent != null) {
                    c = parent.loadClass(name, false);
                } else {
                    c = findBootstrapClassOrNull(name);
                }
            } catch (ClassNotFoundException e) {
                // ClassNotFoundException thrown if class not found
                // from the non-null parent class loader
            }

            if (c == null) {
                // If still not found, then invoke findClass in order
                // to find the class.
                long t1 = System.nanoTime();
                c = findClass(name); //可以Override该方法
            }
        }
        if (resolve) {
            resolveClass(c);
        }
        return c;
    }
}

Java 后台的一点知识

JSP 与 Servlet 的关系

  • Tomcat 等 Web 容器最终会把 JSP转化为 Servlet
  • Jsp更擅长表现于页面显示, Servlet更擅长于逻辑控制
  • Servlet是利用 System.out.println()来输出 html 代码,由于包括大量的HTML标签、大量的静态文本及格式等,导致Servlet的开发效率低下
  • JSP通过在标准的HTML页面中嵌入Java代码,其静态的部分无须Java程序控制,Java 代码只控制那些动态生成的信息
  • 最终 JSP 被容器解释为 Servlet,其中Html 代码也是用System.out.println()等拼接输出的
  • JSP 第一次访问的时候,要转化为 Java 文件,然后编译为 class 文件,所以第一次访问 JSP 速度会比较慢,后面会快很多

Servlet 生命周期

主要是Java.servlet.Servlet接口中的init() 、service() 、和destroy() 3个方法。

  • 初始化阶段,web容器通过调用init()方法来初始化Servlet实例,在Servlet的整个生命周期类,init()方法只被调用一次
  • 客户请求到来时,容器会开始一个新线程,并调用servlet的 service()方法,service() 方法根据请求的http方法来调用 doget() 或dopost()
  • 终止阶段调用destroy()方法,销毁一些资源

GET 请求 vs POST 请求

  • GET用于信息获取,是安全的和幂等的,GET一般是对后台数据库的信息进行查询
  • POST表示可能修改变服务器上的资源的请求,一般是对后台数据库进行增、删、改的操作
  • GET请求的参数会跟在URL后进行传递,请求的数据会附在URL之后,以?分割URL和传输数据,参数之间以&相连,一般浏览器对 URL 的长度会有限制
  • POST请求,提交的数据则放置在是HTTP包的包体中,用类似Key-Value的格式发送一些数据,相对来说,GET请求会把请求的参数暴露在 URL 中,安全性比POST差一些

HTTP 请求的基本格式

  • <request line> 请求行
  • <headers> 请求头(参数头)
  • <blank line> 空白行
  • [<request-body>] 请求实体(GET没有, POST有)

数据库

索引的分类

主要分为聚集索引和非聚集索引:

  • 聚集索引存储记录物理上连续,而非聚集索引是逻辑上的连续,物理存储并不连续
  • 聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个

ResultSet 统计记录数目

Java 中使用JDBC连接数据库,最后都会得到一个 ResultSet,比如如下的代码

Connection con = DriverManager.getConnection(url, username, password);
 Statement sta = con.createStatement();
 String sql = "select * from student";
 ResultSet resultSet = sta.executeQuery(sql);

那么如何根据得到的ResultSet统计一共有多少条记录呢?注意:ResultSet没有提供类似size()、length的 API 来直接获取总记录数。

方法1:利用循环

int sum = 0;      
while(resultSet.next()){      
    sum++;      
}

方法2:利用ResultSet的getRow方法来获得ResultSet的总行数

resultSet.last(); //移到最后一行     
int rowCount = resultSet.getRow(); //得到当前行号,也就是记录数

设计模式

单例模式

单例模式中必须保证只有一个实例存在。有时候单例是为了避免重复创建多个实例造成资源浪费,有时候也是为了避免多个不同的实例导致系统不一致的行为。

Android 中,App启动时系统会创建一个Application对象,用来存储系统的一些信息,这儿的Application 就是是单例模式的应用。可以通过Context.getApplicationContext()获取唯一的Application实例。

class Singleton {   
    private volatile static Singleton instance;   

    private Singleton() { }   

    public static Singleton getInstance() {   
        //第一重判断  
        if (instance == null) {  
            //锁定代码块  
            synchronized (Singleton.class) {  
                //第二重判断  
                if (instance == null) {  
                    instance = new Singleton(); //创建单例实例  
                }  
            }  
        }  
        return instance;   
    }  
}

为什么synchronized里面需要加一次判断if (instance == null),是考虑这样的特殊情形:比如线程A、B都到达第一个if (instance == null),线程A进入synchronized代码中创建实例,线程B排队等待。但当A执行完毕时,线程B进入synchronized锁定代码,它并不知道实例已经创建,将继续创建新的实例,导致产生多个单例对象。

也可以用内部类的方式创建,

public class Singleton(){
    private static class Inner {
        private static Singleton instance = new Singleton();
    }
    private Singleton() {
    }
    public static Singleton getInstance(){
        return Inner.instance;
    }
}

模板方法模式

在父类中实现一个算法不变的部分,并将可变的行为留给子类来实现。

比如AsyncTask 里面的四个方法onPreExecute、doInBackground、onProgressUpdate、onPostExecute

还有Activity也应用了模板方法模式
onCreate、onStart、onResume、onPause、onStop、onDestroy、onRestart

适配器模式

分为两种:类的适配器模式、对象的适配器模式

Android 里的 ListView 和 RecyclerView的setAdapter()方法就是使用了适配器模式。

观察者模式

在 GUI 中,不管是 Windows 桌面应用、或者 Android、iOS,都会给某个按钮 Button 设置监听事件,这儿就是使用了观察者模式。Android 中设置 Button 的监听事件代码如下:

final Button button = (Button) findViewById(R.id.button_id);
button.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        // Perform action on click
    }
});

笔试编程题

线程 VS 进程

关于线程和进程,不正确的描述是__。(选 D 栈是线程私有, 保存其运行状态和局部变量 )

A. 进程的隔离性要好于线程
B. 线程在资源消耗上通常要比进程轻量
C. 不同进程间不会共享逻辑地址空间
D. 同一个进程的线程之间共享内存,包括堆和栈
E. 进程间有途径共享大量内存中的数据
F. 线程间通讯可以通过直接访问全局变量,或者使用进程间通讯的机制(IPC)

找出未打卡的员工

题目:输入两行数据,第一行为全部员工的 id,第二行为某一天打卡的员工 id,已知只有一个员工没有打卡,求出未打卡员工的 id。(员工 id 不重复,每行输入的 id 未排序)
输入:
1001 1003 1002 1005 1004
1002 1003 1001 1004
输出:
1005

分析:可以用两个 List,第一个 List 保存所有员工的 id,第二个 List 保存打卡员工的 id,从第一个List 中把第二个 List 的数据都删除,最终剩下的就是未打卡员工的 id。

更好的方法:异或,两行数据中未打卡员工的 id 出现了一次,其余员工的 id 都出现了2次,两个相同的数异或为0。

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    while (scan.hasNext()) {

        String[] ids = scan.nextLine().split(" ");
        String[] marks = scan.nextLine().split(" ");
        int result = 0;
        for (int i = 0; i < ids.length; i++) {
            result ^= Integer.parseInt(ids[i]);
        }
        for (int i = 0; i < marks.length; i++) {
            result ^= Integer.parseInt(marks[i]);
        }
        System.out.println(result);
    }
}

手写代码题

快速排序

排序是经典面试题,公司也希望通过手写快排来考察面试者的编程习惯和基本功。

// 排序范围 [start, end], 包含 end
public void sort(int[] arr, int start, int end) {
    if (start < end) {
        int p = partition(arr, start, end);
        quickSort(arr, start, p - 1);
        quickSort(arr, p + 1, end);
    }
}
// 一次划分代码,返回被划分后的基准位置
public static int partition(int[] arr, int left, int right) {
    int pivot = arr[left]; 
    while (left < right) {
        while (left < right && arr[right] >= pivot)
            right--;
        if (left < right)
            arr[left++] = arr[right];
        while (left < right && arr[left] <= pivot)
            left++;
        if (left < right)
            arr[right--] = arr[left];
    }
    arr[left] = pivot;
    return left;
}

Note:快排是不稳定的,常见的稳定排序是:冒泡、插入、归并

括号字符串是否合法

某个字符串只包括(和),判断其中的括号是否匹配正确,比如(()())正确,((())()错误,不允许使用栈。

这种类似题的常见思路是栈,对于左括号入栈,如果遇到右括号,判断此时栈顶是不是左括号,是则将其出栈,不是则该括号序列不合法。

面试官要求不能使用栈,可以使用计数器,利用int count字段。

public static boolean checkBrackets(String str) {
    char[] cs = str.toCharArray();
    int count = 0;
    for (int i = 0; i < cs.length; i++) {
        if (cs[i] == '(')
            count++;
        else {
            count--;
            if (count < 0) {
                return false;
            }
        }
    }

    return count == 0;
}

扑克牌随机发牌

对于52张牌,实现一个随机打算扑克牌顺序的程序。52张牌使用 int 数组模拟。

该算法的难点是如何保证随机性?有个经典算法shuffle,思路就是遍历数组,在剩下的元素里再随机取一个元素,然后再在剩下的元素里再随机取一个元素。每次取完元素后,我们就不会让这个元素参与下一次的选取。

To shuffle an array a of n elements (indices 0..n-1):
  for i from n − 1 downto 1 do
       j ← random integer with 0 ≤ j ≤ i
       exchange a[j] and a[i]

注意这儿是0 ≤ j ≤ i,包括j=i的情况,因为可能洗牌后某个牌未发生交换,比如第51张牌还是原来的第51张牌。

public void randomCards() {
    int[] data = new int[52];
    Random random= new Random();
    for (int i = 0; i < data.length; i++)
        data[i] = i;

    for (int i = data.length - 1; i > 0; i--) {
        int temp = random.nextInt(i+1); //产生 [0,i] 之间的随机数
        swap(data,i,temp);
    }
}

智力题

金条付费

你让工人为你工作7天,回报是一根金条,这个金条平分成相连的7段,你必须在每天结束的时候给他们一段金条,如果只允许你两次把金条弄断,你如何给你的工人付费?

答案:切成一段,两段,和四段.

第1天: 给出1.
第2天: 给出2,还回1.
第3天: 给出1.
第4天: 给出4,还回1+2.
第5天: 给出1.
第6天: 给出2,还回1.
第7天: 给出1.

赛马

25匹马,速度都不同,但每匹马的速度都是定值。现在只有5条赛道,无法计时,即每赛一场最多只能知道5匹马的相对快慢。问最少赛几场可以找出25匹马中速度最快的前3名?

答案:

  • 25匹马分成5组,先进行5场比赛
  • 再将刚才5场的冠军进行第6场比赛,得到第一名。按照第6场比赛的名词把前面5场比赛所在的组命名为 A、B、C、D、E 组,即 A 组的冠军是第6场第一名,B 组的冠军是第二名 …
  • 分析第2名和第3名的可能性,如果确定有多于3匹马比某匹马快,那它可以被淘汰了。因为 D 组是第6场的第四名,整个D 组被淘汰了,同意整个 E 组被淘汰。剩下可能是整体的第2、3名的就是C组的第1名、B组的1、2名、A组的第2、3名。取这5匹马进行第7场比赛
    -所以,一共需要7场比赛

原文链接

一个五年 Android 开发者百度、阿里、聚美、映客的面试心经

花絮

也许会有人感叹某些人的运气比较好,但是他们不曾知道对方吃过多少苦,受过多少委屈。某些时候就是需要我们用心去发现突破点,然后顺势而上,抓住机遇,那么你将会走向另外一条大道,成就另外一个全新的自我。

先简单说说我最近的面试经历吧。面试的公司很多,其中有让我心血沸腾的经历,也有让我感到失望到无助的经历,我将这些体会都记录下来,细想之后很值得,面了这么多公司,要是最后什么也没有留下来,那就太浪费了。至少对于我来说有些东西在整理总结之后才能得到一个肯定的答案。希望这些能对即将换工作或者打算看看机会的你有一些帮助。文末有面试和必备的技能点总结哦。

下文真的很长,你可以把这篇文章当做看小说一样,快速浏览一下,但是希望你能将文中提到的那些技能掌握。那也就不枉费我花了一两天时间专门整理这些。我的这些经验仅供参考,希望你能做的比我好,同时希望你在以后的面试中能轻松应对。

为何离职?

先从我的换工作的动机开始说吧。

公司裁员的时候老大说:『你就留下好好干吧,以后不管公司怎么分股票、期权,肯定少不了你。』我非常信任我的老大,跟着老大一起工作,感觉是一种享受。

但是没想到裁员后,公司内部大动荡,主业务线从客户端A 业务线转移到另外的B 业务线上。我主要负责A客户端的架构,这下可真闲下来了。B 业务线那边的业务量还是很忙的,没时间配合我做一些架构上的事情。于是我每天就看看资料,补充点能量。

呆了几天后,就后悔当初没有拿 N+1 走,有一种被老大忽悠的感觉。 因为公司接下来的操作让我很是不爽,先是晚上打车不能超过30,然后福利大减,瞬间没有工作的心情了。再过了一两周后公司宣布新一轮融资成功,可惜只融到了 2千多万美元(按照预期应会更高),然后接着招新人。

我特么无语了,站在公司的角度是没有任何问题的,可以节省开销,也可以容纳新鲜血液。但是我作为一个老员工,心寒,走的员工都拿到了 N+1,我们这些老员工什么也没有得到,反而福利大减,伤人啊! 现在即使我想走,什么也得不到,一种莫名的恼火涌上心头(只怪本人经历尚浅,看不清一些大的趋势,还是老鸟们聪明,拿钱走人,然后换一个新工作,好不自在啊)。

不过理智分析一些这样确实有好处,可以给自己留很多的时间来选择更好的公司。就如此刻的我一样,在公司悠闲的上着班,骑驴找马,遇到合适的,可以立刻走。其实细想一下,如果我当时拿了 N+1 走了后,可能会迫切的需要一份合适的工作,然后迅速入职。至于新公司怎么样,还真不敢确定。

已经动了想走的心,意味着再也不可能在这里很安分的待下去了。

面试分级

于是我决定开始投递简历(世界那么大,我想去外面的世界看看)。这次看机会与往常不同,我决定好好准备一番,然后开始投递简历,主要渠道是 “X钩”,辅助渠道是猎头。

这次看机会我将所有公司分为三类:
1. A类: BAT公司,非常靠谱,各项待遇都是很优厚的
2. B类:一些知名的互联网公司(基本都在C轮以上),基本很靠谱,该有的都少不了
3. C类:就是那些正在招聘的公司,没啥名气,虽然钱多但是事也多。靠不靠谱真还不知道,只能碰运气

基础知识不可少

以前我基本都是直接去面试,总以为Android工作好几年了,出去面试基本没啥问题,因此带着那份傲娇的自信 总是碰壁,尤其遇到很多基础性的问题,一时真不知道怎么回答?还有一些问题之前都记得很准确,但是在面试官问的时候,就一个大写的懵逼表情。

在我出去面试之前,我已经把 《大话数据结构》 基本看完了(想想我之前的生活,每天早上七点多起床,然后看几页,洗漱完就去公司)。因为有了以前的教训,而且这次我很认真的准备了好久,打算把Java基础巩固下,但是手头没啥合适的书籍和资料。

还好民间有很多厉害的开发者,他们不以盈利为目的,只为完成某种需求,开发一款 app,然后发布到应用市场,给需要的人。于是我就找到一个 “Java面试训练” 的App,下载量还可以,就安装到手机上,开启刷题模式,应该刷了10来天吧(都是在上班,下班时间看一点,虽然时间比较零散,但是这样记得最深刻)。

在之后的面试中,基本很少遇见一些奇葩的Java基础。

刚踏入架构师之路的经历

这次我给自己的规划是做一个架构师,但是我深知架构师可不是闹着玩的,必须要有很强的一面,因此我在简历里面写的只是“架构师方向”。我在K 公司 做得是架构师方向,因此我觉得有必要朝着这个方向发力,虽然现在不是很厉害,但是坚持一两年后,即使不是非常厉害,但是也距离非常厉害很近(这里使用了《孙子兵法》的一句:“求其上,得其中;求其中,得其下,求其下,必败。” )。

这个想法来源于在K 公司我第一任leader曾经跟我说过的话:『对于新东西,如果你觉得掌握了,但是不应用到项目里面来,是没有什么意义的,时间长了还是会忘记的。』我很庆幸我有一个好老大(我是属于双领导型的,K 公司 A项目的负责人是我的leader,但是我的直接汇报对象是 K 公司的副技术总监,下文就成为老大),用他的话来说就是经常踢着我的屁股走。当我在网上了解到很多实用的新技术时,跟他随意吐露一句话,他就能非常用心的倾听我的想法,并鼓励我将这些东西带入到项目中来。从那以后我就开始看很多新技术,感觉合适的会引进到我们的项目中。从之后的证明中来看,是非常有价值的。

曾经我的情况是这样的:当我刚进入K 公司后,打杂一个多月,就被关到了 小黑屋(呜呜呜,好可怕的小黑屋,996的制度)。然后才开始正常的架构师之路,第一步就是统一开发环境,在我来公司后,我发现公司的Android同事用的开发工具种类真是繁多啊,神马 Eclipse、IntelliJ IDEA、Android Studio、Windows、Ubuntu、Mac。刚进公司的时候我曾经用鄙夷的眼神看过那些 Eclipse 的童鞋,真是无力吐槽了。于是我给 老大说:『咱们的开发环境最好统一起来,现在各式各样的工具,弄个东西真费劲。』于是老大二话不说,就在群里跟大家吼,都务必切换到 Android Studio(以下简称 AS),由我来监督并执行。于是我拿着鸡毛当令箭,给大伙把地址什么的都找好,发到群里去,让他们自己下载(后期我们就搭建了 ftp服务器将这些常用的工具都放在里面,省的再去下载了)。

翻墙工具我使用 goagent(不怎么稳定, 之后直接买了一年的shadowsocks),给其他人分享也太费劲了,因此让他们自己搞定。老大自己有一个 VPS,于是给大伙共享后,环境基本就统一了。

期间有一个小插曲:
一个年龄 比我大的同事在用 Eclipse,在我推广我的 AS 时,他说比较忙,没时间弄。我就急了,因为我刚到公司不久,老大分配给我的任务,推行不下去,这可不行啊,没说几句吵起来了。最后我也知道不能太着急,但是已经吵了,关系肯定不咋样,老大当时开会去了,我知道自己太心虚了,因此主动给老大承认错误,说我和那谁谁吵架了,因为他不用AS。最后在老大的劝说下,这个人就勉强切换到 AS了。
其实这个人就是我之后的新Leader,每每想到这里我就全身发冷汗,Leader要虐你,你还能有好活路么?还好这个Leader人比较好,人也比较大气会处事,不怎么跟我计较。我已经对着佛祖忏悔了N多次。

第一天面试

我用 “X钩” 开始捡一些不怎么有名的C 类公司投递,很快就收到了很多的 面试邀请。

首次面试——国外输入法

记得当时去的第一家公司是做国外做输入法的,做的还不错。从外面能看见一栋略微有点老的大厦,办公环境很一般。

进去后很巧的是遇见了一个熟人,第一位面试官竟然认识我之前在X游的一个同事,然后我们就聊开了,他也没怎么难为我,就问了我几个很简单的问题,例如:handler的原理,多线程。我按照记忆中的样子说给他听,然后就第一关就轻松过了。

等了一会,另外一个面试官进来了,问了一长串问题,基本就是 Android的相关的基础,然后第二个又轻松过了。

等到第三关的时候,一个年龄稍微大的人进来了,很容易能看出,这个人应是该技术团队的负责人,问了一些工作经历后,然后问了一个最让我印象深刻的问题是:『你了解过Android上的黑科技么?比如Android 5.0 之上有一个辅助功能,如果用户开启后,就能像豌豆荚那样自动安装app,等同于拥有了root权限,但是手机重启后,这个就自动关闭了,有没有办法可以自动打开呢?』据他了解,有很多不知名的小App 都实现了,但是很多大公司都没用。

我想了好一会,说可能这些app 被厂商列入了白名单,因此重启手机后还能自动打开那个辅助功能。我实在想不出如何能实现这样的效果。最后他告诉我,其实他们也是分析了好久,才发现,那些小App, 都是开启了一个进程(或者是service,具体记不清了,有兴趣的童鞋可以试试)来守护,因此能够开启。这么一说,我也瞬间明白了。

但同时我提到这样做会可能会导致耗电量增加啊,对方的一句话把我真雷住了。“那能费多少电。。。” ,我瞬间无语了。但是他们可能因为某些需求必须如此做,因此要实现这样的功能,相对于电量来说应该也能接受,不至于比什么都玩不了的强,体验也确实提升了很多。不用用户每次去开启那个开关,虽然有点风险,但是相对于Android上的风险来说,确实低很多。

等第三轮面试完成后,然后HR 小妹妹带我到一个很大的会议室,见到一个很年轻的人,听HR说,这个人应是CEO之类的,反正职称很高。他就问了些职业规划,平时有什么兴趣爱好,以后有什么打算,薪资要多少?我说到公司后可以先接触一些业务层面的东西,然后慢慢再走架构路线,之后可以负责主要核心模块。平时就看看书,参加沙龙活动,没事打打游戏。以后还是要像架构师方向进发的,一个合理的期望薪资。他也简单回答我一些问题。之后就是让我先走,等通知。

傻傻的我还就这样高兴的走了,因为我总体感觉还是很棒的,毕竟连过4轮哈。从最后的结果中能明白,其实应该是要的薪资太高了。为什么这么说呢?因为一般情况下,最后一轮就是简单看看你这个人怎么样,技术关肯定没问题,否则前三关就 pass 了。可能对方觉得你要的薪资和你的实力不符合,也可能他们想再对比看看,选择一个更合适的人选。

58到家

第一轮面试我的是一个小伙,问了一些基本的Android基础,然后问了一下 Android的绘图原理,我说: onMeasure, onLayout, onDraw。 然后他说每一个什么作用? 那个onMeasuer主要做什么的?并举了一个例子:一个自定义的滚动View A里面如何放另外一个滚动的View B?我说把 View B将 onMeasure 里面的高设置成最大,这样就能解决冲突问题。最后他简单说了一些 onMeasure 里面的几个参数,我对此加深了解了。

第一关也就这样过去了,等到第二关的时候看起来一个挺帅气的男人带着一个很显眼的婚戒跟我说一些项目流程上的东西,因为我在K 公司这块跟老大接触的比较多,因此一般问题难不住我,轻松就过了。

等到第三关的时候,问我一些工作经历,然后问问职业发展规划,平时的兴趣爱好,以及你觉得你和其他人有什么优势。我挺好奇的,为什么最后的这些面试官都要问类似的问题,之后从一个关系还不错的猎头那里了解到,其实他们也就是了解下以后的动向,以及看看这个人的人品。关于优势我是这么说的:我说到公司后可以先接触一些业务层面的东西,然后慢慢再走架构路线,之后可以负责主要核心模块。

其实和上面的回答一样,这基本就是所说的套路。他们可以用套路,我们为何不可呢? 嘿嘿,别学我,自己根据实际情况来。

本以为就结束了,没想到他们说 CTO不在,可能还有复试,先让HR大美女跟我谈谈。HR慢条斯理的跟我说了一些待遇什么的,了解了下我的状况,问我要多少。我基本和上一个公司说的一个样。

之后再来复试的时候,这个大美女HR给我了一些建议,说这个CTO是阿里出来的,喜欢会说话的人,想到什么就说什么,别紧张。在这面的时候,我就很放松,该怎么说就怎说,他也问了一些职业发展规划,已经我的经历,基本10来分钟就结束。我只想说大美女 HR 真真是体贴入微,感觉很 Nice, 这轮基本也顺利过了。之后这个HR直接说我被评为T5,达不到架构师的标准,但是以后可以努力,我也欣然接受了。不管怎么样,反正拿到offer再说,之后慢慢对比。

楚楚街

首先过来第一位面试官,看样子应该是 Android 技术 leader,开始问了我一些基础的面试题,比如:View 的事件分发机制,View的绘图,ListView 的实现原理(这个应该是几年前面试的时候经常问题,没想到现在也能遇见)。

聊了好一会,然后他拿出他们的客户端给我演示了一个页面,说这个界面比较卡顿,让我分析下原因。我看过后,提出了几个有效的检测卡顿的方案,他们的这个界面主要是Listview 的 item 里面包含了一个 ViewPager,然后 viewpager 的 item 里面有一个大view, 上面有N 多图片 + 动画效果,因此实现起来很麻烦,最后导致性能卡顿(不得不说产品同学,你的想象力真丰富啊,有没有考虑过研发同学的心情)。然后,他感觉得到了共鸣,因此接下来说话就比较放松了,他说和我年龄差不多,感觉我还是很厉害的。

我不禁惶恐不安,我感觉还行,但是应该不是他说的很厉害,可能只是工作时间长了,该积累下来的东西大部分都有了。互留微信,方便以后的交流(事实是没有啥交流的,只是当你面试通过后,可以有一个拉你入伙的渠道,嘿嘿,不晓得对不)。

第二个进来的面试官长得挺帅气的,手上戴着戒指(之所以提到这个,是因为在我在我的印象中这个最亮眼,很多次在和他交流的过程中,我都比较紧张,我就盯着这块看用来放松,说真的如果看着对方的眼睛,双方可能都不会自在,当然除非你很有自信的时候是可以的)。开始简单问了下工作经历,然后就开始聊技术,第一个就是问我知道不知道 二分法,我当时楞了一下,猛然间反应不过来,最后专门确认问了下是不是 二分查找。然后我说在一个数组里面每次查找的时候从中间点开始对比,大于就右边找,小于就左边找,顺带提了一句这要在一个顺序的数组里面。然后面试官就说,二分查找还得每次先排一次序?我当时说是的,结果就感觉很2,可能没理解清楚面试官表达的是什么或者说我的表达有问题,其实我想说最开始的数组就是一个有序数组,但是面试官可能误解了我的意思,以为每次查到后,都要先排一次序(只能说悲催啊)。

这个问题过了后就再问了我一个问题:『你来说说 Java 的内存管理。』这个问题在一两年前上就栽过跟头,所以当时专门看过相关文章。但是当我回答的时候,由于长时间没怎么看过了,记忆有点松动,大体的说出来了,但是不够准确(回去后就好好补充了下,在之后的面试过程中遇到的概率还是非常大的,尤其在第二面的时候)。然后他问我要多少薪资,我当时说 给到期望就可以,然后他就问我是不是可以低一些呢?我开始说可以低一点,但是当他问低多少的时候,我心想上面两个公司的 offer 基本感觉到手了,这个可以适当的要高点,能给就来,给不了那就算了(我事后想想才明白,这种2B 的想法绝对不能有,要时刻保持低调,把握住任何一次机会)。最后他说,我得对得起兄弟们(怎么说呢?估计是刚回答的时候不是特别的满意,还有感觉我要的太高了),你这个薪资我没法跟上面谈。然后可想而知,当然肯定没有结果了。

因此奉劝各位,要时刻保持低调,谦虚谨慎,莫要装B,否则肯定遭雷劈,我这就是一个活生生的例子。

第二轮B 类公司面试:

面试有很多,说起来可能会长篇大论,以下就总结性的说说,不再说明具体细节,只说我们之后在面试的时候应该注意的地方,以及他们对应聘者的要求。

映客 && 蘑菇街

映客直播在望京soho,很高大上的地方,t1,t2,t3分别对应从低到高的大楼。到公司后,感觉还可以,第一个面我的人是一个技术,基本就问到一些Android 的面试题,没有任何悬念就过了,第二面的时候,感觉那个人还是比较随和的,问了 Java 内存管理的东西,以及一些其他的问题,最后还都聊得挺开心,第三面的时候直接就是 HR谈薪资,很容易就过了。

在望京 soho 还去过 蘑菇街,里面的人技术比较好,我当时过去的时候已经6点了。那个面试官就跟我聊人生理想,提到一些 Android系统原理性的东西,但是感觉回答的不是很好。面试官感觉还是很不错的,然后给我说你以后要多看看例如 handler 原理,windowManager 的东西,并且从源码上去分析,网络上的理论知识还是要结合实践的,真是受教了。这部分我有点弱,虽然知道原理,但是看过源码的东西还是很少的,以后需要注重补充。他说他才是高级,我要应聘的这个 架构师肯定是不行的,问我是否愿意做其他的,我当然表示愿意了,现在要综合提升能力,才能往更高层走。

最后的最后,他很搞笑的跟我说:『我这人真不骗人。』我还纳闷啥意思,最后他说:『今天已经很晚了,第二轮的面试官不在,我明天给你向上反馈下(从之后的一个同事的口中才明白,一般说第二轮的面试官不在,基本就是说你没戏,很委婉的一种说法而已)。』

结束后我看了一下表,我晕,一面就面试我了一个半小时,真特么无语了。不过收获还是很大的,知道自己的不足后,就知道需要补充哪些东西了。

乐视

去了一趟姚家园的乐视,只能说看着挺风光的,但是进去后,特么的真虐人。

电梯分区,还只能在一边的乘坐,很不赶巧的是我去的时间刚好是10点,对于他们公司来说这就是高峰期,电梯根本排不上队,而且乱糟糟的(之前在X游的时候,大家都是排队的,这边没有,可能地方太小了,排不开吧)。电梯上不去了,看来只能跟其他人一起爬楼梯,一直爬到9层,感觉都喘不过气了。

上去后一个很美的 HR(长腿姐)带我找面试官,然后表示没有会议室,原来的会议室都变成工位了,所以让我先在一个小角落呆着(保洁阿姨的专属位置),过了好一会面试官姗姗来迟,也是一些非常基础性的东西,最主要的是他们提到了推送,怎么实现,已经存活情况说了一些。

第二个面试官也是特么来得晚,等了 N 久,闲的无聊就和保洁阿姨聊天,顺带看看他们的办公环境,只能说真心挤得慌。第二位面试官来了后就看看我的经历,因为第一轮的技术面都过了,因此简单聊了下,就说说他们的发展前景,要做海外产品。听我的兴致勃勃,很开心,然后让我等会。

他们基本都去吃饭了,留下了我在那里干等。然后来了一个HR 的小妹妹,跟我谈薪资以及经历,貌似对我一两年换工作有很大意见,哥就好好给她普及了一番互联网界的基础知识。没想到就在快要搞定的时候,这个小妹妹的老大过来了,然后就看见一个身材超棒,腿很长的漂亮姐姐 HR(长腿姐),坐在我的对面(小妹妹示意我这是她的老大)。瞬间不爽了,都马上谈完了,结果换人再来,真无语了。只能将刚刚的辉煌时刻再来装 B一次,然后谈薪资神马的,给的也不是很多,只能给我薪资范围最低的一个档次。好吧,就接着吧,然后非要我先填写一份背景调查表,如果没有问题后,才给我发 offer,我看到美女拿着那份很大的 纸张,瞬间无语了。

我当时就不怎么开心,然后长腿姐毕竟很老练,问到:『说你是不是有事?』我说是的,待会1点还有其他地方的面试,然后她说:『那你先回去吧,这个表格发你邮箱,你写好后发给我。』然后长腿姐就送我出去,我又特么的一路爬楼梯下去(9层啊),电梯等了 N 久都下不去。

接下来说说几个有意思的公司

新浪

新浪位于理想国际大厦,记得几年前去新浪面试的时候,傻傻的都没准备就去了,结果第一关就挂了。

这次是下午去,外面还飘着毛毛细雨。去了后竟然特么的让我做面试题,哥已经不做面试题很多年。但是想起了之前的经历,还是老老实实写写,据我估计面试的哥们应该会问上面的东西。还好这次做了万全的准备,刷了 N 多面试题,补充了基础的数据结构理论知识。写起来如行云流水,嗖嗖嗖的没几分钟就完了。

第一个面试的哥们看看卷子,没啥意见,然后问最后一道纠错编程题有没有什么问题,我虽然指出了几个错误,但是感觉他还不是特别满意。因此我仔细看了下,原来是一个静态变量引用了 Activity 的上下文,然后指出,他再问了一些偏底层的东西以及性能优化的地方,轻轻松松就过了。

等到第二面的时候,这个人一看就是技术大牛,问了很多 Java 层面的东西,多态,抽象类,多线程,内存管理等等。我感觉回答的不是太好,多态那有点问题,其他的应该还可以。

然后就进入了第三面,第三面的面试官应该是部门负责人,问了工作经历上的事情以及兴趣爱好,之后的发展方向,想做什么层面的。最后很不幸的是在等待第四面的时候,最开始给我题的美眉告诉我时间很晚了,让我先回去,之后等消息。

至少这次来比第一次高级了很多,不至于第一轮就被刷下去。最后分析了下原因,还是薪资要的太高了,尤其是这类公司。

滴滴

滴滴位于西二旗,应该有两个办公地点,其实我一直很想去滴滴,福利待遇很不错。一年前去过一次,很可惜在第一轮的时候,因为在某些适配方面回答的不是太好,因此失去了机会。

这次已经准备很多了,进来后还是在去年的位置上坐下等面试官。说实话感觉滴滴成长的很快,办公环境都变的更漂亮了,哈哈哈。

这个面试官一看就是一个技术宅,开始对我各种炮轰。面试题一个接一个的,在我连续回答十来个题后,看见他还在问,记得在提及到 Volatile 的作用的时候,我就开始不爽了,这个东西记得之前在源码里面见过,但是具体的一时说不上来,看着他那样子,埋头在纸上给我出题,我就不怎么配合了。面试了那么多家,就你问了 N 多问题,还有完没完了(其实这也算是抗压的一种面试方式)?我直接说不知道,然后他再问了几个基础性的东西,我想都不想直接说不知道,他貌似已经看出来我已经很不爽了,然后说,那你说说你项目中有没有比较 NB 或者比较有亮点的地方。我的回答直接是:没有。然后他也就不怎么问了,说那先这样。我说:好,就这样,我先走了。 然后潇洒的离开滴滴。

现在想想真特么的很2B,应该低调低调再低调。也可能是那天下午太累了,上午面试了两家,而且已经拿到两家的 offer 了,还都不错,在这特么憋屈,才表现的如此差劲。其实对于问题,知道的话就好好说,不知道的话,可以说说思路和想法,然后说说以后会怎么做,利用迂回包抄策略去应答,准没错。至少给面试官知道你还是可以动脑子的人。

在此我真心后悔当时的冲动,向滴滴那位面试官表示歉意。其实不用那样的,我们只需在面试的时候尽力表现自我就可以,以后切莫带着情绪去看待或者回答问题。

对于人生中的很多问题也是这样的,这次栽倒坑里去了(用我老大的话来说,你不在这里踩坑,总有一天也会在另外一个地方踩到,到时候的损失就不可估计,趁着年轻多多历练自己),总结之后才能更近一步。

百度外卖

百度外卖现在已经不属于百度了,而是单独分出来。

我是被同事推荐过去面试的,去了以后,上了一个很长的台阶(感觉很庄重的样子),需要刷卡才能进去。等了好长时间,面试官把我领到楼下的公共办公桌,就是那种中间空地,周围都是楼层,能看见其他人在楼层间走动。一个年龄见长的面试官,开始感觉挺随和的,然后说跟我聊聊 Android 基础。

第一个问就是:『咱们先来谈谈 Android 的四大组件。』我彻底懵逼了,尼玛,跟我谈四大组件,有意思么? 没想到一直到最后都跟我谈这些,一个接一个的问。说到广播那块,关于一个 app 被杀掉进程后,是否还能收到广播的问题纠结了好久。

然后让我画我之前设计的架构图,我就随便画了画,但是没想到这个看起来很好的面试官让我大跌眼镜,他用鄙夷的笑容告诉我:『你这也太初级了。』我当时心里有几万只草泥马在崩腾,你都30+了,就不知道鼓励新人啊,我都说过我刚做架构的时间不长,而且鄙视我,有本事你也弄一个架构给我看看啊,一点不尊重我们年轻一辈的劳动成果。也许就怪我当时我真就按照他说的草草画几笔吧,没怎么认真对待。我去其他公司面试的时候,虽然这个图不怎么样,但是至少能解决 某些领域的问题,其他面试官都很谦虚。这个百度外卖的面试官,真不是我喜欢的领导,如果以后真让他来带我,那就真完蛋了,很多时候我们都是因为某些人扼杀了我们最初美好的萌芽,而从此失去了创新的意识。

很庆幸的是我在K 公司的时候,老大一直鼓励我创新,遇到想做的就去做,所以一路下来,虽然很累,但是干的很开心。

所以每当有人问当初为什么选择K 公司的时候,我都会自豪的说:『我的老大很不错,我在那里很很舒服,很开心』。记得在我离开的时候老大给我最后劝告就是:『你要时刻反思自己此刻是不是已经被别人洗脑了。』

第三轮:

1.百度

百度位于海淀区上地十街附近,有很多大厦。 我去的是一个做国外工具的部门,去了后,被百度的环境和氛围震惊到了,在一个很大的技术园区,有网易,百度,腾讯公司,对面还有一个大楼正在修建,估计会是另外一个互联网公司的场地。

进入百度的大楼后,两个入口都设有刷卡机。在空闲区等了好一会,然后一个人带我进入大厦。在进去之前,到前台那块面试官输入自己的邮箱账号,然后让我填写其他登记信息,我印象最深的是显示器上边贴着一个纸条,说:请离开的时候在此登记,否则会进入百度的黑名单(意思就这样,具体记不清了)。当时震惊了半天,没想到竟然这个严格。和面试官进入大楼里面后,只记得的印象是:很整洁,高大。出楼梯后,脚踩着厚厚的地毯,稍微走快点,都感觉很松弛,脚下如踩棉花一样。

为什么有地毯,而不是地板砖————到了夏天很多漂亮的长腿美女穿着高跟鞋踩在地板砖上是一个怎么样的体验呢?噔噔噔……

我在等候区等到第一个面试官,然后我们简单聊了下 Android技术,其中有两点有必要提下:

  • 其中一点是:说说 View 的事件分发机制。然后我就说了好多,从 WindowManager->window->Decorview->子 view。最后我说当所有的 view 都不处理事件,事件会最后会传递到 Activity 的 onTouchEvent 上。然后面试官立刻说:『哈?你这是颠覆我的三观啊?』 然后我意识到可能有问题,但是记得 《Android 艺术开发探索》上确实写过到 Activity,但是不是到 onTouchEvent还真没底。面试官很自信的样子,让我颤抖了。但是随着我的坚信,面试官说:『不行,我不能冤枉你是不!』立刻在手边的 MBP 上看了一下,自言自语感叹道:『还真有啊!』 我顿时无语了。
  • 另外一点是:问我 Service 上能不能弹出对话框。对于这个问题,我印象最深刻了,记得一年前的时候,在另外一个公司就因为这个问题让我尴尬万分,回去后专门对这块进行补充。我的回答是可以的,但是面试官面带差异的表情告诉我这是不行的,Dialog 必须要依附于 Window 才能显示出来。然后我的解释会让面试官郁闷一会:我说这个是可以弹出的,我之前也专门试过,不过他弹出是有条件的。 条件是:
    • 必须在 Manifest 里面注册系统权限
    • 在显示 dialog 的时候必须要加一个 flag. 我的理由是:系统对话框可以在低电量的时候弹出对话框,我们同样也可以采用该方式来实现。

面试官语塞,然后给我说 Dialog 是必须要依附在 Window 上,Toast 其实也是一个 Window。我听着这些话,就想起以前看过的一篇文章上也确实是这么说的。估计该面试官回去要好好补充下一些知识了哦。 然后该面试官让我不能用 Arraylist,用数组 写一个队列。这块刚好我在之前项目中特意用了一下,写的时候,主要有三个方法: put(), get(),peek(). 然后考虑下队列的特性,一端进入,一端出去。我当时遇到了盲点,没怎么写完,最后给面试官说了下思路,大体是对的。但是关于选择位置那块没怎么想好。不过这不阻碍我进入第二轮。

第二轮面试的时候,面试官带了很多纸张,我瞬间压力山大,知道不太妙。不出所料,这个面试官,从动画实现原理,到 handler 实现原理,一步步深入各种原理,当我感觉回答的不错的时候,然后他就顺着我的问题继续深入。我只能说我尽力了,有些东西,平时开发的时候真心不注意,但是就因为没有留意,所以就没法继续回答他的问题。

面试官把我带出大厦的那一刻,我心情很不好,很可惜没进入百度,之后应该需要准备很多东西。我要说,我还会再来的,哈哈哈! 最后也归还身上的一个牌子到前台后,省的被拉入到黑名单(好吓人的样子)。

以后有时间多看看原理性的东西,最好整理一个自己的博客,写上自己的一些看法和感悟,这样记得最深刻。即使几年后也不会遗忘,如果只是看看别人总结的东西,也许有一天你就会模糊。

关于博客可以使用 Hexo, 我的博客也是如此,可以整理一些自己的东西与心得。

2.阿里

这次去的是一个阿里的高德部门,在望京 Soho 附近的 首开广场。去了以后首先找厕所,你们知道么?厕所竟然从大厦楼层的的一个角转了一大半圈才找到,回来后进入找不到前台了…… 瞬间无语了。问了好一个美女才回到前台,然后接待我的 HR美女貌似等得不太耐烦了(宝宝心里苦,厕所好远,都找不到回来的路了)。在一个小型会议室等待面试官,看了下布置氛围和环境,感觉太棒了,很多东西都体贴入微。

回顾上次阿里的悲痛遭遇
其实这是我第二次来这边面试了,上一次过来的时候,是刚过完年。提到这里我就苦不堪言,为何如此说呢?当时是2016年2月15日,因为我参加好朋友的婚礼(不得不说,我这个年纪的人都开始结婚了,这次回去有4个好朋友都结婚,可想而知,一场完了以后还有另一场,虽然累,但是值得)推迟了好几天才回北京,在参加同学婚礼的时候接收到阿里高德部门的面试邀请。回到北京的当天是12点多,然后回家,一个关系非常好的朋友说今天她们要宴请公司的人吃饭,因为她们结婚了,让我帮忙弄个 MTV。我想这是朋友的终身大事,因此必须要好好干。
我下午4点是阿里高德的面试,因此时间很紧促。我凭借我大学的技能在两个小时内搞定这个 MTV,总体来说还不错,就迅速发给朋友,弄完已经3点了,然后打车立刻去首开广场。
高德的面试是4点钟,匆匆赶到后,就等待面试官。面试很不理想,因为什么都没有准备,而且心力憔悴。面试官问的是一些基础的 Java 问题,很可惜我没怎么回答好。于是就深深的浪费了一次机会,之后和朋友提起此事,无比后悔,当时其实是可以和 HR 电话再约一个时间的。这次对我的打击很大很大,因为这是我这么多年第一次面试 BAT 的职位,一上来就受挫,很不是滋味。我在这里失利后我就各种准备资料,增强自己的能力,面试前必须要刷题,虽然简单,但是不失为一种方法,虽然不一定有用,但是会加深印象,尤其是去 BAT 这些公司,一定要准备好,否则就别浪费机会,这就是我的教训和经验。为了6月份的这次面试策划了很久。以前对什么可能都不是很上心,但是这个事件深深的刺激我了。

第一个面试官来了后问了一些基本问题,很顺利就进入到第二轮面试。

第二轮也基本是技术面试,问了一些 Android 基础和 Java 基础以及内存管理。

第三轮的面试官应是部门负责人,看起来很好说话的,问了一些经历和基本情况后,问我薪资要多少以及之后的发展方向。我说要合适的薪资,之后希望在架构方面发展,但是也可以从业务开始。貌似这里回答的不怎么好。然后让我留了他的联系方式,我知道很有戏哦。

因为我在进入K 公司的时候也是这样的,老大感觉我很不错,于是留了微信后,我基本就顺利入职。回去后的一两天还是很焦虑的,但是我知道大公司都是有流程的,因此我告诉自己不要焦急。过了一两天后他主动加我微信,然后问了些基本情况后,就说他要做最后的总结,让我等着,最迟一周后就有消息。我感觉希望超大的,开心了好久,本以为就可以这样过去。

但是一周时间过去了,没人通知我,我开始焦急了,于是我开始主动和他说话,反思自己是否有什么地方做的不好。经过很多面试后我总结出了结论就是要薪资太高了,于是我在微信里面给他说,只要能过去,薪资低点也是可以的。但是问了他好几次,他都没有回话,看着微信消息记录,都是我发给他,而他没有回复,已经过去好多天了,我知道没希望了,他说不管怎么样都会给我回复的,但是我真绝望了。

就像相亲一样,遇到一个不错的美女,开始都一起聊得很不错,她开始加你好友,并且和你说看好你,不管能不能做女朋友,她之后一定会回复,但是苦苦等待一段时间后,不管你怎么给她说话,但是她就是不理你。可能她真的忙,但是也不可能连续一两天都这么忙吧。于是你知道没结果,因为无言等同于没有希望。为了避免一些幻想的存在,你会将她删除掉,不想留下任何关于他的信息。同样我也是把这个阿里高德的老大的联系方式删掉,微信也删掉。

在我失去希望的几天后,看见他要主动加我微信,但是我想可能只是安慰的话语,最多告诉我,我不适合他们的职位,因此我为了避免尴尬,直接删除那个加我好友的请求(如果说真的合适的话,应该会很重视你的,不可能好几天都回复,怎么有一种备胎的感觉,呜呜呜,我不想被发好人卡,宁愿做高傲的兔子,也不想做纸老虎,虽然尽管只是纸老虎,但是也会拥有属于它的一片森林)。可能我的做法太极端了,以后希望大家不要这样想,或许多了一条人脉。

于是阿里的这次机会就失去了。总结后的结论就是:去大公司要的薪资不要太高,否则对方只能感谢你的到来,因为比你优秀的人太多了。

聚美优品

聚美优品 位于东四十条地铁站附近。路过一个竹亭子后,进入大厦里面需要用身份证在前台那块登记后给我一个纸条,上面写着我的身份证信息,然后在门禁卡附近刷二维码进入(真担心个人信息泄露哦,当然一般情况下没人会关注你是谁的,千万别干坏事哦,会被查出来的,哈哈哈)。

推荐我去聚美优品的同事接我上去后,带我到前台填写基本信息。我只写了最基本的信息,然后她说:『你就写这么点啊。』我说其实这些信息够用了,写那么不仅多没用,还会暴露你的个人信息。面试成功后,如果有需要可以写详细些,但是一般去面试最好别写身份证信息。工作经历基本也只是最近两个,之前的就不用写了,简历中都会有的。记得刚工作那会,傻傻的全写了,真耽误了不少时间。

过了一会,她把我交给 漂亮的HR 温柔姐,然后就先忙去了。温柔姐告诉我一般情况下有两轮基本就过了,先让架构师老大直接面我,让我先等候。

过了一会温柔姐不好意思的跟我说架构老大先让一个技术面我,问我是否有意见,我当然没意见了,这是很标准的面试流程(如果你有意见,建议还是别说太多的话,基本都这样的,要淡定)。

一面技术给我一种很成熟的感觉,开始问了我一些基础技术问题,外加 Java 内存管理知识。后给我出了一道算法题,说有一个数组最多存储6个数,如果有普通用户的话,存储四个 vip的客户,另外两个是普通用户(留出一定的空间给普通用户),让考虑全面点(一般都是结合实际场景,让你写出一个算法,要具备的能力就是抽象,处理问题的思路与细节,还有最基本的编码功底)。

然后我就考虑各种情况,第一种是非空情况,然后下面就是几个大的 if else, 至少四个条件,基本涵盖了全部情况,然后每个条件里面写上对应的存储数据的过程。由于我的四个大条件都把距离占的差不多了,在写里面细节的时候,用中文描述。过了一会他回来后,看了下说:『你这个还有中文啊!』 我尴尬的笑着说:『我先写条件的,最后发现没有空位了,只能用文字代替了,你看我正在另外一个纸上写全部的完整算法。』指了指纸上刚写一小半的代码。他也会心一笑,并指出算法上应该改进的地方,基本 ok 啦。

然后等第二轮的面试,看起来更成熟,但是说话有一种很亲近的感觉。问了基本情况,然后拿出他们的 app 让我看看首页的实现效果,说说怎么实现的。对于这种情况,基本就是考察你的抽象能力,以及分析问题的能力。我先说出使用 ListView 的 header,footview,然后使用 ListView 的 type 来实现。然后简单说了一些性能优化的东西,该面试官提出我的做法可能会存在性能瓶颈。

其实他说出这块是在指导我说这块会有问题,我当然明白他的意思,于是说这块采用 RecyclerView + Fresco 来实现,可以有效的改善问题(其实提到这些,就说明你看过很多新技术了,有时间最好还是要自己练练这些东西,毕竟孰能生巧)。

他也没深究,基本就感觉不错,开始谈了谈他们的目前状况,以及即将遇到的问题。他在只言片语中都把我当做内部人看,我也心里感觉很舒服。最后告诉我如果我愿意,他就向上报备了,意思是可以继续下一轮。当时他问到我的薪资的时候,因为之前已经说了 N 多次,太高了进不去, 太少了对自己很亏,于是这次我并没有说,只是笑笑。而对方说:『那就按照年薪算吧,你打算要多少呢?』我当时什么也没有多想,然后就说:『我希望在我现有的薪资基础上,能上涨15% – 20%。』他经过在手机上一阵比划后,告诉我可以达到我的预期效果,整个过程感觉很愉悦。

因为面过了一些,并有offer,但是还是想多看看,结果把自己搞的疲惫不堪。最后的最后,温柔姐给我打电话说面试通过。

最终结果

最终我辞职后在家休息几天,没事的时候去咖啡馆看看书,上上网,好好过几天轻松的日子,然后再说定去哪里工作。

总结:面试和必备的技能

这里只简单列举一些东西,可能不是特别全,但是却特别适用,也不一定按照下面的流程,有可能是穿插的,也有可能都有,根据公司的规模以及面试官的心情而定(哈哈哈 ,你们就自求多福吧)。建议大家还是要将下面的东西全部掌握,没事写写代码,练练手,在项目中能用到的地方一定要用,有可能会遇到很多坑,一定要自己想办法填坑,之后回忆起这段经历,肯定可以敢理直气壮的跟别人讨论。如果你说的头头是道,那么对方会先输一层,然后在心里对你佩服。

一般情况下第一轮都是基础面试,需要扎实的基础

  • 最常用的Android 基础知识
  • Java 基础知识
  • 了解一些 常用东西的原理,例如:handler, tHRead 等
  • 项目中的技术点

第二轮的时候需要了解更深层次的东西

  • Android 事件分发机制原理
  • Android 绘图机制原理
  • WindowManager 的相关知识
  • 进程间传输方式
  • Java 内存管理机制
  • 一些常用的 list,map 原理,以及子类之间的差别

能进入第三轮基本没什么问题,但是要注意以下问题

  • 该轮一般是 老大或者部门负责人,问的问题一般都看 深度与广度
  • 当问及薪水的时候,要说一个合适的,小公司随意,大公司一定要慎重,当心里没底的时候,可以告诉对方,让对方给一个合理的薪资。一般都是在原工资基础之上增长,听猎头说一般涨幅都在15%-30%,超 NB 的可以要30%及以上,如果感觉自己还不错的,挺厉害的,建议最高20%,一般人就定在15% 左右最靠谱。公司内部一般有一套机制,根据公司情况而定。
  • 我们的面试原则就是拿到合理薪资,得到 offer
  • 个人发展情况,这个问题很难回答,如果和公司方向不符合,极有可能和公司无缘。建议多试探性的问问公司缺少什么,你能否给予公司对应的东西。当然对于有自我追求的人,那可以放心大胆的提。我的方向就是架构师,哈哈哈,挺极端的,别学我哦。我感觉选择都是双向的,因此我知道自己需要的是什么。
  • 你最擅长什么UI 还是其他什么?这个问题更不好回答。你要说你擅长 UI,是不是意味着你其他能力就不行?虽然我不知道面试官的用意,但是我能感觉到,这个问题不是那么好回答,我会回答说自己都行,来什么业务接什么需求。可能回答不太好,总之和公司的职位吻合就行,这样总不至于出错吧。

阅读原文