2015年4 月月 发布的文章

Java程序员进化为架构师掌握的知识

一:Java知识
1、进制转换
2、Java基本数据类型
面向对象相关知识
3、类、接口、抽象类
this关键字、static关键字、final关键字
方法的参数传递机制
Java垃圾回收机制
四种内部类的实现方式
方法重写(override)与重载(overload)的联系与区别通过多态实现程序代码的松耦合
Java 异常体系详解(checked exception 与 unchecked exception)
JDK 5.0 新特性(泛型、枚举、可变参数、增强的 for 循环、静态导入等)
Java Annotation(使用系统内置 Annotation、自定义Annotation、Annotation的继承等)
Java多线程机制详解(锁、synchronized关键字、sleep()方法、wait()方法、notify()
、notifyAll()方法的意义与联系)
Java线程池的内部实现
Java定时任务内部实现
Java I/O编程(装饰模式详解)
Java网络编程基础知识(Socket、URL、URLConnection、ServerSocket等)
TCP与 UDP的联系与区别
Java Collection API(Collection、List、Set、Map、ArrayList、LinkedList、 Vector、 HashSet、
TreeSet、 HashMap与TreeMap等)区别,适用场景
常用设计模式(工厂方法模式、观察者模式、策略模式、装饰模式、模板方法模式、命令模式等的原理与
应用)
Java NIO详解
java.util.concurrent 并发包的应用(ConcurrentHashMap核心源代码分析、ThreadPoolExecutor、Future
Task、Semaphore、Condition、ReentrantReadWriteLock等接口与类的深度分析)
基于 JDK 1.4 锁的并发机制与基于 JDK 5.0并发包的同步与并发机制的比较与分析
序列化与反序列化
正则表达式的应用
Java动态代理与反射机制
Java代码的执行机制
源代码编译机制
类加载与执行机制
JVM内存管理(内存空间、内存分配、内存回收)
使用 JConsole、JVisualVM及 JMap等查看内存的使用状况
分析程序执行的过程
JVM线程资源同步及交互机制
线程交互机制与状态分析
Java文件操作相关,递归删除,递归读取
JDBC相关知识,步骤,连接操作,数据库连接池(详解 Apache DBCP数据库连接池)
移位操作 (左移n位==乘以2的n次幂) (右移n位==除以2的n次幂)
二、算法
各种排序算法:快速排序、归并排序、插入排序等等
斐波切纳函数
二分查找
全排列
二叉树的遍历
定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时
间复杂度都是O(1)
字符串反转
前缀树
最大堆,最小堆
Hash算法及HashMap算法
ConcurrentLinkedHashMap(LRU)
BloomFilter
LIRS算法 LIRS的基本思想是对访问的数据块进行分类,一部分为hot数据块,一部分为cold数据块。对于
hot数据块我们可以分配90%以上的cache给它们。而对于cold数据块给它们分配10%。
从LIRS算法的描述来看,可以理解为两个LRU队列的组合,利用cold缓冲区来保护Hot缓冲区,提高了进
入hot缓冲区的门槛,阻止hot缓冲区频繁地变化。
三、数据库
mysql存储引擎
mysql优化
mysql HA解决方案
sql语句优化
NoSQL相关
四、文件系统
Linux主流文件系统
EXT3与EXT4文件系统
主流分布式文件系统分析与对比
分布式文件系统
五、系统相关
共享内存实现机制
mmap的实现原理与机制
copy on write技术
zero copy技术
六、网络相关
OSI七层网络模型
TCP/IP交互流程
HTTP访问流程
七、大型网站架构
负载均衡技术及其原理
智能DNS解析,原理,实现方案
squid web加速及缓存技术
网页静态化
 

即使别人是码农,你却不该是

好几天前,在微信里,有个童鞋给我留了这么一段话:
「程序君,昨日知乎日报上出现的那篇《为啥中国的程序员都被称为码农》(以下简称「码农」),看完实在心酸,作为一名还在大学校园即将走向“码农”大军的愣头青,想请教您,你对那篇文章有啥看法?上面的说法属实吗?中国程序员的现状大体是怎样?麻烦指点」
我大概看了一下那篇文章,说的有些道理。但程序君认为:别人是不是码农与你无关,你不该成为那篇文章作者眼中的码农。作者说码农一词强调程序员「地位低下、枯燥和劳累」。作为一个程序员,我也来随便说说。
收入和地位
一般而言,程序员的收入水平不低。我没有具体的数据,但在一线城市,程序员的平均收入应该都能达到该市的中上水平 —— 我猜top 30%左右。2012年,我们在校园招聘的时候,很多面试后非常心仪的同学(清华,北大,中科院等)最终都拿着十几到二十万的薪资去了B,T等公司,有一个我们特别中意的iOS工程师,被我们追了很久,但后来最终还是被某著名游戏公司招安,拿了二十好几万的薪水 —— 这可是程序君工作了好几年后才能拿到的package啊。
所以你说程序员的收入低么?为什么你的收入会低?为什么你怕你未来的收入会低?
程序君有个朋友,也是途客圈的前员工,本科来实习前已经有很多独立的项目经验,掌握了python/django和iOS的开发能力。他聪明好学,上手能力非常快,稍加指点就能从事重要功能的开发,勤奋程度又不输于程序君,所以进步神速。后来途客圈的很多核心功能都交由他来负责,某些功能程序君都自认为无法做得比他好。一年半后他从途客圈「毕业」时,已经是各大公司争相想招致麾下的「面霸」,同时拿到了好几份offer,最终去了某搜索公司,现在前途一片光明。
我想这是一个很有借鉴意义的例子,尤其对于在校学生。就像之前的『软件开发升级打怪之路』所讲的那样,我们身边有那么多很有意思的问题可以通过软件来解决,你愿意放弃一部分打dota的时间和精力去解决么?你愿意在解决的过程中排除万难,啃下一个个硬骨头么?
如果你在学生时代就有很多拿得出手的项目,那么在现在互联网热火朝天,人才缺口很大的时代,找一份薪水不低的工作还是难事么?
程序员可能是世界上唯一一份不用太靠学历,不用太靠爹娘,甚至都不用太靠熬日子出头的工种。有人杜撰了这么个故事:
说Python之父Guido van Rossum有天跑去google面试,说了三个词:”I wrote python”,就被录用了。
当然像Guido这样的大牛犯不着主动去找工作的,就像球场上的超级明星,给猎头打个电话,说我想挪个窝了,工作机会就会像雪片一样飞来。这个故事虽为杜撰,但不失一个很好的例子说明程序员「不靠天,不靠地,就靠自己一双手」的本质。你的薪水取决于你能做出什么来。
至于地位,我觉得除了权贵阶层,其他人的地位都差不多。如果不做公务员,没事别老琢磨地位,那玩意说来就来,说走就走。我倒觉得程序员应该多提高自己的品味 —— 至少多学学打扮自己,别拿着中产的收入过得像无产阶级。
另外,建议妹子们也多关注关注程序员这个群体 —— 毕竟能够改变世界的几类人中,程序员算是最好接近,在比较年轻的时候就能看出潜力,也最好玩弄于股掌中的。^_^
工作枯燥
工作枯燥这事真心和你自己的感受有关。首先不是所有人都适合做程序员的,如果你换了不少团队或公司,做什么都觉得枯燥,自己又没兴趣做pet project,那你要好好考虑下自己是否适合这条路。否则走下去,就真成了「码农」一文中的码农了。
有人曾经给我留言说自己不想做业务相关的事,没意思,想做「真正的程序员」做的事情。拜托,我们做的是产品,哪个产品不是和业务相关的呢?脱离了业务的软件,要么是纯粹个人爱好,要么只能在象牙塔里生存。
有人说工作特么没劲,每天干的都是琐碎边缘的活儿,枯燥死了。好吧,你以为程序君做得总是高大上的事情么?程序君最近两周干的活也琐碎得要命,其中一个任务类似于「从linux kernel的源代码里,把所有.c引用的.h文件摘一摘,只留下真正有用的(但系统还能正常编译运行)」。
工作中这样的活不少,枯燥是有点枯燥,遇到了与其怨天尤人,不如想办法快点将它完成。程序君花了大半天时间,在走了很多弯路写了两个程序后,终于找到一个巧妙的办法,仅仅写了五十多行python代码就将其完成。效果从最初的方案减少了25%的.h文件一直到减少了95%的.h文件。
我比较不理解有程序员说自己总不得不做重复劳动,所以感觉工作异常枯燥。想想「程序员」这顶帽子带在头上意味着什么?它意味着全世界任何群体都有理由说自己的劳动是重复劳动,唯独程序员这个群体不能。为何?程序员坚守的信条是DRY(Don’t Repeat Yourself),一件事当你发现你需要重复第二次时,就要考虑将其自动化。做不到这一点的请努力,因为这决定了你的效率和效能。
还举我自己的例子吧。前些日子我要测试几个开发环境,流程大概是下载代码,编译,运行UT。因为开发环境有点问题,所以在下载完代码后我需要对代码打个patch。这活第一遍我是手工做的,为了验证整个流程的正确性,调整patch等等。第二遍以后我就写了个脚本将其自动化。虽然在我写这个脚本的时间里,我完全可以对所有的开发环境都一一验证,但脚本化的好处是,我可以让别人用这个脚本也进行独立验证,我也可以在今后几天的工作中反复使用。
枯燥是你看待任务的主观情绪。很多看起来外表光鲜的互联网公司或者软件公司,真正分到你手上的任务就不见得光鲜靓丽。大数据?那是对外美好的商业表述。你真正做的事情也许是对海量日志进行或手动或半自动分析,枯燥不?操作系统?好吧,你去了以后发现主要做的是本地化,枯燥不?虚拟化?好吧,那里很大的团队在做驱动开发,枯燥不?
没那么多枯燥。软件就是一个个实现起来非常枯燥的功能有机地组合在一起,为用户(客户)提供价值。无法认清这一点,总认为自己干的就是最枯燥的,那你只能继续枯燥下去,也只能成为「码农」作者眼中的码农。
辛苦劳累
辛苦劳累倒是真的。不过要看你怎么个辛苦法。
如果你在一家各种限制你自由发挥,还以你工作时长为工作态度和工作能力的评定标准,那么,除非你有其它想法,否则应该选择离开。记得我毕业后工作的第一家公司,有天晚上吃饭,老板问我对team里两个女孩有什么评价,我说她们工作得挺好,合作愉快啊(潜台词是男女搭配,干活不累^_^)。老板努了努嘴,说:可她们一下班就回家,工作态度不积极啊。我听着不是滋味,心里就萌生了离开的念头。
程序员的工作绝对不应该用工作时间,是否加班来衡量。如果你的老板给你的评定是「该员工工作积极努力,主动加班,blablabla」,你还愿意这么呆着,那你就别抱怨辛苦劳累。
不过现状的确是是很多程序员都在加班,包括我在内。
有些人加班是真忙。但其实有很多行业比程序员忙得多,比如四大所在的会计(审计)行业,比如投行,咨询。
也有些人加班是刷存在感。
但更多的人加班是为了有一个清静的环境,能做点什么。
要说辛苦劳累,我觉得一个很重要的原因是:这个工种需要你不断更新夯实自己的技能。
如果被迫接受,那身心俱疲;如果主动出击,身体累了点,心灵上的成就感还是不小的。
http://blog.sae.sina.com.cn/archives/3548