https://juejin.im/post/5a29d52cf265da43333e4da7 http://hawstein.com/2013/03/26/dp-novice-to-advanced/