先说年薪(单位:美元):东海岸的大部分的公司都可以给到10万,好一点的12万,牛的公司可以给到14万,我心心念念想去的差不多有16-18万,绝大部分都没有超过20万。
8月3日从弗罗里达奥兰多回来以后,就一直在投简历,面试,这段时间都挺忙的。以下是最近找工作的两点体会:
第一,美国Java程序员目前的工作形式非常好。虽然现在还是在疫情期间,但是明显工作机会和岗位非常多,可以说各个公司都在大量的招人。尤其是对有经验的程序员来说,接电话都接不过来。这两个星期,几乎每天找上门的recruiter都有5个+。虽然他们提供的工作岗位,肯定是合适的和不合适的都有,但是总体来说,工作岗位是大大好于5年前的夏天。
第二,现在的技术面试明显要求提高了很多。这里主要体现在3个方面:
难度提升的第1个方面是:对于现场编程的能力要求非常高。在我印象中,也就是大概5年前,大部分普通公司的面试官都喜欢问问之前的项目经验,比如你都做了些什么,用的什么技术实现,工作当中遇到了什么困难,怎么解决之类的,基本没有需要现场写代码。面试官一看, 大部分问题都能答上来,常用的技术都会。加上能回答出工作中才会遇到的问题,基本这个职位就拿下了。
现在完全不是这个情况了,大部分的面试官上来就直接要求面对面写代码。因为都是视频面试,所以一般有两种形式来考察你的编程能力。面对面写代码的第1种情况是,面试官会准备个online的java编译环境,在视频会议要求我开共享桌面,所有的面试官都可以看到你在里面的一举一动,哪怕是一个拼写错误。更恶心的是,他们还要求我打开摄像头,所以很大概率还可以看到我额头上的汗。这种感觉就像是我在工作的时候,老板突然出现在我身后,还带着几个人一起看着你,需要你一个一个字符敲进去,还不能出错。面对面写代码的第二种情况更狠,没有online的那个环境,让我直接在桌面打开一个记事本文件,所有的程序都在脑子里面,各种语法都要自己一点点的写出来。确实是很惊悚。本来我以为这种当面完成的代码题都是考察算法和数据结构,也就是他们最喜欢的排序啊,查找什么的。结果发现完全不是那么回事,现在的要求真的是千奇百怪,写什么的都有。有让写一个设计模式,比如单例模式,工厂模式,或者写一个观察者模式之类的。也有现场写java8的新特性的题,比方说用stream类来实现list到map的转换,也有比方说用stream的filter和map来实现对类中某些属性的过滤。我觉得这些东西其实大家都的是会用,时间充裕又没有压力的条件下,找个例子自己慢慢摸索,怎么样都可以捣鼓出来。但是如果是在面试的时候,需要在10分钟-15分钟,没有任何提示的前提下,还有那么多双眼睛盯着你,还得生啃出来也是要花一番功夫的。
难度提升的第2个方面是:对于Java程序员的知识面的要求提高了很多。也就是大概5年前,在我印象中,大部分普通公司的面试官也就是问问前台用的什么,后来用的什么,考察考察MVC,Spring,Hibernate, 问问数据库Sql也就差不多,最多问问设计模式,web services什么的。
现在的面试是真的恐怖,需要会大量的技术:
1. Java基础,基本是以java8为主,stream,functional interface,lambda表达式都必须会用,而且要熟!最烦的是,有些面试官还要揪着多线程不放,问了一个还不过瘾,就一直问问,直到你不会为止。
2.Spring系列, Spring core是基础,这里的问题回答的不好估计已经被对面判断成傻逼了。然后就是面试官最爱,也是现在最热的Spring boot,我还没有遇到不喜欢在这里展示自己的面试官。Spring mvc 和Spring security 属于清汤挂面,懂的面试官会问几个问题,不懂的就不太问这里的问题。
3. Web service和restful soap这些都是属于基本问题,基本是个人就应该会,就像是每个人都应该会用windows和word一样自然。
4. ORM,基本也就是Hibernate/JPA 和ibatis/mybatis。最重要的点就是主键啊,缓存啊,事务处理啊,多线程啊,各种锁定啊。
5.DB, 数据库方面,sql已经属于垃圾技能,连tester和BA都会的东西就不来考java程序员,现在都是要NOSQL,要求mangoDB,CouchDB, DynamoDB, Hbase,neo4j至少会其一,涉及到microservices的时候还要会 Redis。
6. 微服务 大概80%的公司会问到Microservices,所以现在是大热点,必须会。所以还得学习Docker和Kubernetes。 既然都来问微服务了,当然要通信了,所以Kafka也是跑不了的。
7. 测试。有些有测试背景的面试官,还喜欢问测试方面的问题。对于单元测试jUnit,Mockito这些都是必备的,然后端到端测试的话, Cucumber和 Selenium也是需要能说出一二的。
8. 操作系统。对操作系统熟悉的面试官,还要问Linux和deployment相关的问题。
9.前端技术。最后来说对我最可怕的是要问前端的问题,这里是我最弱最弱的地方,主要是Angular,React JS以及Vue。作为一个所谓的full stack developer我的是真的学不过来。
10. 装逼。 最后的最后,是遇到喜欢装逼的面试官,要问这些我看来没用的问题:SOA(service-oriented architecture), serverless,SPA(single page application), TDD(Test-driven development)。不是说这些理念和技术没用,是在面试的时候问这些根本就是无聊。
难度提升的第3个方面是: certifications。现在目前看来最有用的是AWS。以前作为java程序员我都没有想过这些。现在很多面试的时候都喜欢问这方面的问题。我感觉面试官都觉得java程序员的时间是有无限的,不然哪有这么多时间看这么多各种各样的技术,还要记住他们的那么多概念,想法,和实现,好多好多annotation和方面名要背,要记住!
最后是牢骚。其实真说句实话,真正投入到工作当中,这些技术也好,实现也要,方法也好,根本都不需要记的。只需要知道自己想要查什么,等需要用的时候再google就行,找个例子改一改就能实现了。最重要是思想和查询解决问题的能力。这个才是一个有经验的程序员需要掌握的核心。靠刷题来面试的,真的没意义。哎,既然选择了程序员这个职业就算是再累也要检查学下去。不过最后还是要感谢他们给我这种40岁还在编程第一线的程序员赚钱养家的机会。混口饭吃,在哪都不容易,真的!