后台开发技能树
通用技能
品质
- 一个品德不正的人,最终将受到命运的惩罚
- 品质正,这个人一般不会差到哪里去,在同类中一般是更受人欢迎和更容易成功的人
沟通、反馈、责任
- 一个无沟通能力的人,要么是天才,要么是不可爱的人
- 及时反馈,不要等到问题很严重了才反馈出来
- #今日工作#、周报,它的意义在于你反馈出你的状态
- 工作有大小,责任心无大小
成长、态度
- 小事心态
- 千里之堤,毁于蚁穴,所有基础的细节都需要注意。
- 所有能做高级事情的人,基本上都能把小事干得漂亮
- 基础不牢、地动山摇
- 只有把小事干得漂亮,才能赢得勋章,勋章积累信任,信任赢取机会,机会获取成就
- 提问的艺术
- 不要遇到问题就提,先思考,再提问
- 任务拆分
- 成长过程会经历:能力越大、责任越大、事情越多
- 思路(凡事要做好计划推动自己)
- 拆分细化为多个点
- 排好优先级
- 加入时间维度:何时能完成
- 是否需要寻求帮助,谁能帮你,自己单干?
- 任务是否可以切换/并发
- 自己欠缺什么,立马发现
专业技能
HTTP
- http抓包调试
- PC
- chrome开发者工具
- firebug
- IE
- fiddler
- 手机(怎么抓取自己的手机出来的http)
- PC
- http api 模拟工具
- chrome 插件DHC
- http常见状态码含义,甚至更复杂的状态。
- 301
- 302
- e-tag、last-modified,keep-alived
- http权威指南(不一定要全部看完,可以带着疑问看,了解越多自然是越好)
- p3p头有什么用
前端
- 原则上是鼓励全栈工程师,对于后台工程有时候自己想玩个小东西,不会搞页面也挺苦恼的。
- 常见的前端框架应该要玩过一些东西,jquery、angularjs、jquery-mobile、bootstrap等等
- jQuery
- ECharts
- Angular JS
- Bootstrap
- 常见的模板实践过一两个(smartAdmin\INSPINIA)(做一些小工具没有问题)
- 前端里依然会有设计,比如MVC,分层设计等。什么方案更优雅?这个问题应该好好思考。
JAVA
- java集合能相当熟练
- java并发包运用得当,知其原理
- apache-commons各种常用api了然于心
- java io熟练
- 网络通信,http、websocket、tcp。使用场景、常规使用熟练
- dubbo
- 消息队列 metaq、aliyun ONS、aliyun MQS
- ray-task
- ibatis/mybatis
- cobar-client、分表分库思想
- netty
- spring玩得转,各种细节与机制需要清楚
- jvm基础理论知识:内存管理、gc、线程分析、bin目录下的工具。要能用这些基础理论解决实际问题
- jvm 高级工具 btrace,知其一二更是甚好
LINUX
- 常用命令
- top (top -H)
- netstat
- iostat
- 操作系统的基本了解
并发
- 生产者消费者
- master-slave模式
- 线程池
- disruptor
- http://ifeve.com/ (并发编程网) 不错的学习资源
调度
- ray-task
- spring quartz
3. ScheduledExecutorService
- timer
- crontab
- 分布式调度的核心思想,值得好好思考
数据结构序列化
- json
- protobuf
- rmi
- jdk serializable
- hessian
- 还有很多,这些方式各有哪些优缺点,使用于哪些情况?不要过度优化,够用,知道怎么优化就可以了
DB
- 数据库事务概念
- mysql binlog 机制
- mysql常用的数据架构模式,比如MS,多master。不同的模式有哪些优缺点。(目前我们使用的aliyun的RDS,需要了解一下aliyun DRDS,aliyun已经为我们封装了很多模式)
- mysql常用分析命令 desc、explain,了解sql的执行计划,并能进行优化
- redis
算法
- 常见的经典算法
- 不断问自己有没有更优解?
架构设计
- 架构设计并不是一件很难的事情,人人都可以做到,需要保持设计思维。
- 理解计算机,以及计算机各个部件,再复杂的架构设计都是围绕这些部件展开的,推荐阅读:http://book.douban.com/subject/5333562/
- 永远不要过度设计
- 经典设计思想
- 低耦合、高内聚
- 生产者与消费者(master、slave)
- 怎么设计
- 计算机各部件资源:
- CPU
- 多线程
- 线程并不是加得越多越好,那么加到多少合适?
- 串行调用、并行调用
- 内存
- 缓存加速
- 硬盘
- SSD增加读写能力
- 集中式文件管理
- java怎么读写,更快,更适合你的应用场景
- 带宽
- 传输对象大小
- 哪种序列化方式更适合
- 网络
- 长连接还是短连接
- http拉还是websocket推
- CPU
- 分布式
- 无状态
- 存储
- 集中式文件系统
- 集中式session
- 集中式cache
- 计算
- SOA(dubbo)
- restful api
- 任务调度
- 用监控和测试数据验证自己的设计
- 好的设计一定是优雅的
- 计算机各部件资源:
好的工具
- IntelliJ IDEA
- sublime text
- webstorm
- 印象笔记
优质资源
- GOOGLE 所有开发人员都应该学会怎么使用google
- 码农周刊 http://weekly.manong.io/
- 并发编程网 http://ifeve.com/
- GitHub https://github.com/
- Stack Overflow http://stackoverflow.com/
- csdn iteye oschina
好的书籍
- 深入理解计算机系统 http://book.douban.com/subject/5333562/
- 深入理解java虚拟机 http://book.douban.com/subject/6522893/
- 待续...
最重要的能力
以上的内容都很重要,但是我认这还不是最重要的,上面的东西更像工具或外功,真正重要的是你能根据实际的场景使用合理的工具配合上内功(设计能力?算法?业务逻辑规则?)解决问题。可能了解一大堆工具,心法但是面对实际问题,你不知道该出哪一招,你不知道哪招更适合迎战对手,我经常会用做数学题来打比方,上面提到的东西更像数学公式,在不同的阶段我们都会学习和了解很多数学公式,但是真正考试的时候,每道题目不会提示你应该用哪个公式来解答此题。很多时候往往看了答案后才捶胸顿足原来这么简单我怎么没有想到。真正需要很高技术含量的大题也许的确是只有小部分人才能做得出,但是如果你能把前面的正常题目一道道做好,我想应该也可以考一个超过觉大多数人的分数。所以真正最重要的是能对上面提到的内容融汇贯通,什么时候应该用什么样的公式解题。要达到这种阶段,需要很多的练习和实践,需要付诸很多的精力,多折腾多磨练,我想并不会很困难。
部分内容参考:http://blog.knownsec.com/Knownsec_RD_Checklist/v2.2.html