我开通这个说说空间的意义是什么?
分析:写说说,维护博客,是会增加我的工作量,虽然都是我平时的总结,但还是经过深入思考,甚至反复斟酌和提炼字句,所以还是花了不少时间,有时候半年没更新,就是因为平时太累了,照顾不过来。
既然投入了精力,就要考虑这个事情的意义。我想到如下:
但是,有些自己的私人想法,不一定得说出来,说出来也没多少意义,所以有以下原则:
原则一:以“利他”为导向,传递成熟的思想和正能量,不提没有意义或者太私人的事情。
原则二:节省时间,不花长篇大论去讲道理,只言片语,能get到点就行了。
快速判断方法:
1.不做评价、不写感受,避免一切纯主观的东西。
2.不单纯的批判,除非有一些靠谱的经验可以分享,或者是一些很有实际意义、能引起反思的事情。
今天搭一个项目,要创建个MySQL数据库,我居然想不起来创建数据库的SQL语法了,是create database ‘xxxx’吗,如果我要指定字符集该怎么做呢,想不起来了。
这又让我想起了面试时的场景,有两次,我都没面试上,只因为有些问题没回答上(或者说,没回答到“点”上,就是面试官想听到的那个“点”)。至今我都不服气,,我的工作能力和业绩,都明摆着强过很多人,可就是在面试时不如别人,是面试官出了问题,还是自己的问题?
先从自己身上找问题,面试嘛,有套路、有政策就有应策,见招拆招就行,只要有充分准备,我相信我能成为面霸。上面所说的两次面试失利,主要原因还是自己一点儿都没准备,记得其中一次我在写代码,突然接到面试电话,就开始面试了,事前一点准备都没有,另外一次也一样,问到一些经典面试题,但我却一无所知,如果我稍微看一下网上那些经典面试题,也不会这样子。
我当面试官时,我就在想,要怎样考察对方才合理,才能不埋没人才、快速淘汰不合适的人。
我认为,很多不常用的知识,记不住很正常嘛,毕竟我们要掌握的知识太多了,谁能每一方面、每个细节都记得住,记不住没关系,只要有印象,可以快速查资料嘛。
所以,我不倾向于问应聘者一些死记硬背的知识,或者是网上的那些经典面试题。你死记硬背那些没用,我根本就不问那些。
我会看他 做过哪些东西,掌握哪些知识,然后重点关注 我需要的那些能力,看他是否掌握以及掌握得如何。
比如,我要招一个开发工程师,我首先关注广度,因为我需要他掌握的知识非常多,如果他都掌握了,那自然是非常好。但是某些知识他不会也没关系,广度只要不是 欠缺太多,都没关系。
然后看某几项关键技术,他掌握的深浅。我倾向于问那些项目中经常用到的,或者他这个岗位很可能会遇到的一些知识。如果是Java工程师,我不会问他JVM原理、GC算法,因为这些不属于常用知识。——注意,即便是对于资深开发工程师,我也不会问他这些,因为按正常工作情况,即便是遇到JVM方面的问题,也是需要查资料再研究解决的,与其要求他熟悉这个不常用的理论知识,不如要求他有很强的学习能力和trouble-shooting(故障排查)能力。总之,我不建议面试时,问那些不经常用到且网上一搜就能出来的知识。(反过来说,我会问基础知识——对他那个岗位很常用的那种,还有就是试探他的工作经验是否丰富,解决问题的能力是否突出)
发现一个很有趣的事情,论面试水平,很多应届毕业生,比工作很多年的高级工程师都牛!
为什么?我经历了很多面试和被面试才发现,哦,原来面试基本都是套路!!学生完全可以拿出准备高考的精神去学习、记忆那些套路,而工作几年的工程师 通常都没时间 也没兴趣去研究那些东西。
另外,必须得指出,套路只占60%,剩下40%是非常规的,但是掌握了60%已经足够通过一般面试。
程序员,工作能力强,不代表面试能力强,反之亦然。举个例子吧,牛客网上很多刚毕业的学生就能吹架构,吹分布式,吹jvm,吹各种原理,背书能力很强,然而呢,大多数没实战经验。反过来,有实战经验的人呢,又忙于工作,背书能力很差。在我见过的程序员中,很多是不太善于言谈和交际的。我提出一种观点,分享给大家:面试能力和工作能力没有必然联系,对于工作不是很稳定的程序员而言,一定要多提高自己的面试能力,平时多搜集面试题,做成自己的面试题库,对各种常见面试题能理解、记忆,对答如流。
2013年我说“在重庆,月薪9000差不多就算小康”,现在改正一下:在重庆,如果要达到现代生活的小康水平,家庭年净收入“正常情况”下要达到10万,也就是说家庭每个月都正常开支的情况下,每年能剩下10万块钱。否则的话,算上额外开支、特殊开支,很难说还有剩余……按我家的情况估计要8万,总计要28万家庭总收入才能达到小康。我家收入没这么多,也很显然,我家没有达到小康,与小康还有很大差距。虽说不求富贵,但小康还是要的,加油啊!
思考职业发展之前,务必先清楚行业发展现状和趋势,以及自己身处的区域环境状况。
热门行业、领域分布特征:
电子商务是持久不衰的老大哥,其次占比很大的是:文化娱乐、互联网金融、交通出行、大健康行业。另外,互联网教育、云服务、智能硬件、大数据、人工智能、企业服务等领域占比也很高。
IT信息行业的区域特征,繁荣度排名:
(数据来源于《2016中国独角兽企业发展报告》)
“北上深杭”占了公司总数的88%,其他城市竞争力太低,根本不值一提,包括广州、南京、成都等。
另外,据招聘网站前程无忧的统计: 北京、上海、深圳、广州、杭州,这5个城市的招聘总量占全国超过65%,其次是成都、武汉、南京、苏州。
上面这些都是比较正规的统计数据,接下来说一说我个人的统计和经验,据我找工作的经历,我对比后发现,成都IT市场规模是重庆的10倍以上,如果重庆有10个高级Java的招聘岗位,成都有100个,这个差距蛮大的。但成都和“北上深杭”的差距也很大,而且成都的IT行业比较低端,创新能力很弱,成都本土很少有独角兽型创业公司。
针对于重庆地区的程序员发展,我有以下一些看法:
在重庆,JAVA技术人的天花板——架构师/JAVA资深或专家。为什么是这样?因为在重庆对这种高端技术岗位的需求很小。 先看看各个层级的技术人员在重庆的需求:
重庆的it公司少,而且几乎都是创业小公司,人数规模在50人左右,公司流动资金在100万以内。这些公司,负担不起太高的研发开销,所以他们倾向于 招一些初、中级水平的工程师,基本能干活,而且又廉价,公司的高级工程师或架构师通常只有那么一两个,包括技术负责人在内。
在重庆,稍微大一点,研发人数超过100人的公司,屈指可数:
上面6个公司,是目前(2017年)我知道的重庆研发队伍规模最大的公司,也就这样了。
然后,说一说腾讯、爱奇艺、完美世界,在重庆几乎没什么研发团队,直接忽略。
然后易极付,其实很虚的,业务和团队没办法扩大。除去这些,我所熟悉的,还有正大华日、微赢互动、海云数据、易宠科技、博拉网络、淘会场、中科云从、万年历(优路科技一系列)等,研发规模都不大(200人以下,甚至几十个人)。
在重庆,JAVA工程师,到了高级、资深以后就不好混了。市场上需求的高级,也就是“高级码农”。再高端的一些技术架构和管理职位,都是内部提拔或者空降。空降兵一般都是有相似管理背景或者名企背景,内部提拔则有很多不确定性。没有名企背景的工程师,进步得比较快的,按重庆的市场标准,一年到中级,三年到高级,发展5年之后,如果在原公司没有升上去,就很难跳槽找到更高级的工作了。
说了这么多实际情况,最终的建议是:
1、技术好点的,建议工作一到三年之后,就去北上深杭的一线大公司发展、镀金,然后在回重庆发展,则可以比较顺利的拿到一些很稀少的技术架构和管理职位。退一步讲,工作3~5年,也可以考虑去北上深杭去发展几年再回重庆。如果是工作5年以上,在重庆混得也比较好了,那就没必要去北上深杭了,因为去了回来也不会有太大的提升。
2、如果没能去一线大公司发展,在重庆做了3年之后,就要找一个比较靠谱的公司一直待着,等待内部提拔的机会,不建议跳槽,因为跳槽也很难跳好,在重庆比较高端的技术岗位很多都是内部提拔或者聘请一些资历老、背景好的人,对于一个一没资历、二没背景的架构师,在重庆还是很难被认可的。
3、另辟蹊径,成为自由职业者、野生程序员,兼职或者创业。同时,等待时机,因为机会少,所以更要嗅觉敏锐、谈吐犀利,这样才可能碰上且拿下高端职位。
记一次被面试官坑的经历:
面试官看完我的项目经验,让我抽一个记忆深刻的项目给他讲讲。
我回答,这几个项目都是我亲自负责的项目,我都记忆深刻,这样吧,就拿第一个给你讲讲吧……。
我简单介绍到,这个项目,大量使用了分布式的定时任务时,面试官问,你定时任务是怎么做的?
我跟他说了集群是负载均衡的且高可用的,然后单台服务器上实际上用的Java Scheduler的API,面试官就问你知道Scheduler的底层原理吗?
我回答,我没有看过它的源码,所以具体说不出来,但是,根据我的经验,可以来分析一下:它底层应该是用的while循环,不停地去检测是否到了时间,如果时间到了,就执行……面试官打断我,一脸鄙视,说不是这样的,然后我说:如果不是用while循环,那可能用的类似于sleep或者wait的技术……面试官不耐烦了,说他想问的不是这个意思,他强调底层实现原理是什么,我说,就是类似于sleep和wait啊,至于更底层的原理,那是C语言写的,可能和操作系统有关,我就不清楚了。他很不耐烦的提醒我,调度器里面的任务是保存在什么地方的?我回答,你问的是这个啊!应该是保存在一个队列里面,比如List,面试官问,确定是List?我说我不确定,也可能是其他的队列,比如Queue。
(具体的谈话,记得不是很清楚了,大概是这样)
另外,当时介绍项目时,吞吞吐吐的,感觉有些吃力,我也跟他说明,这个项目做了3年,主要功能都有上百个,里面的技术细节也比较复杂,比如负载均衡和高可用问题,做的是各个节点均等的集群模式,另外,还比如Java Class的热加载技术等。
后面,我去看了一下Java Scheduler的源码,它是用DelayQueue队列存放任务线程的,计算时间,表面上看,确实是用的while循环,每次循环检查一下到期时间,但仔细分析源码,其实while循环只是一个方面,另一个方面,while循环时,还执行了sun.misc.Unsafe.park(false, time)方法,类似于sleep,是在native代码层面做的线程等待,实际上跟我猜测的一致,只是面试官想要的回答是DelayQueue,而我却没catch到这个点,我认为重点不在于task队列存放在哪里,而在于怎么实现定时调度的,实际上底层原理就是while循环 + 类似于sleep的Unsafe.park等待。
总结,阿里的面试也有几轮了,4年前就面过,那时候太天真的,一点准备都没有,什么JVM啊,把我问蒙了————我自学Java,一切以实用为主,可以说,我对JVM细节不甚了解,我也没空去研究一个对我没多少用的东西,但是这并不妨碍我出色的完成各种工作、解决项目中的难题,我虽然没有研究JVM,但是却研究了Struts、Spring等框架及其设计思想,研究工程算法,研究模板引擎,并形成了自己的作品:ZolltyMVC框架,jretty-log库,zollty-tmpl.js模板引擎等。(后来,也有不少同事去了阿里,现在基本都是P7以上,他们应该知道我的技术能力)
其实在我看来,JVM不过只是一个工具而已,会用就OK,需要深入一点的时候,再去搜索一下资料,这种资料非常丰富,足以应对绝大多数问题。
如果非要研究JVM,那得深入到JVM的C语言源码、深入编译原理,这不是JAVA工程师该干的事情,应该找C语言工程师来看看源码,也不是什么难事。
什么是坚持? 坚持就是为了达到某个目标,在这个过程中,付出大力度的、持续不断的努力。
做任何事情,都要有目标和规划,而且最好是不要中途变更。如果中途变更,那说明目标和计划有误,要反思。就像,你决定玩一个游戏时,你有目标和计划吗?没有!!那最终的结果和中途的付出就没有什么意义了。
1.The best preparation for tomorrow is doing your best today.
2.Whatever is worth doing is worth doing well.
3.You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.
4.Don’t aim for success if you want it; just do what you love and believe in, and it will come naturally.
5.Knowledge makes humble, ignorance makes proud.
6.Life without a friend is death.