序
男,95年,这个学期就大四了,非计算机专业(数字媒体)。目前在二线城市做Java实习生,待遇一般,应该算一个正常的实习生水平吧:租的一个约10平米的小单间,月房租网水电大概在1600+,每餐饭大概在15~23之间,大概这个水平,勉勉强强能养活自己。
技术的基础大概是这样,从去年4月开始学JavaWeb技术,从jsp开始一直学到Spring MVC、Mybatis这样的技术栈,中间做了几个小项目(CMS、管理系统等)。从去年10月开始转做Android了,水平也就是四大组件+蓝牙/NDK+一些库的技术以及稍微了解了一些什么事件机制、OOM优化。嗯,这样随手列出来感觉自己水平一般般,就是能做一些J2EE和Android项目的水平。
写简历
因为从 去年10月~出校门的7月 这一段时间一直在做Android开发,我自己也一度认为我出来后也只是做Android开发的,所以投了很多Android的简历,简历上除了写Android的技术,还写了一大堆的Web开发中的Spring、Mybatis上去,项目经验也是臃肿的不行,2个Web,2个Android的,看上去内容挺多的,但是两个方面的开发都不突出,于是我就想了一个策略,分简历,做一份Java简历,做一份Android简历。两者各突出其重心,投简历的时候分别投不同的岗位。大概效果可以看下面区别
Java简历
熟练Java开发,良好的代码风格以及IOC/DI、AOP、OOP、高内聚、低耦合等编程思想与设计模式
掌握Tomcat/Apache/Nginx等服务器的基本配置与使用。
掌握Spring/MyBatis/Hibernate/Spring MVC等主流后端开发框架,具备相关经验
熟悉MySQL、SqlServer、SQLite等关系型数据库的使用,熟练编写SQL语句,了解Redis缓存技术
掌握微信公众号开发技术,XML与JSON的解析技术,OAuth2.0技术等
掌握Android App开发技术
掌握HTML5/CSS3/JavaScript/jQuery等前端技术,能够编写PC/移动/响应式页面
掌握Linux的使用与常用shell脚本的编写,掌握Gradle、Maven、Git等工具使用
Android简历
熟练Java开发,良好的代码风格以及IOC/DI、AOP、OOP、高内聚、低耦合等编程思想与设计模式
熟练Android的四大组件、常用与第三方UI控件与布局的使用、了解View机制与自定义控件
了解Android IPC机制、图片缓存、NDK技术、OpenGL es、蓝牙开发技术
熟悉Android SDK的开发,了解xUtils、GreenDao、OkHttp等第三方框架的使用
掌握Spring等Java后台开发框架的使用,与Tomcat服务器的配置
熟悉MySQL、SQLite等关系型数据库的使用,熟练编写SQL语句
掌握微信公众号开发技术,XML与JSON的解析技术,Webservice、OAuth2.0技术等
掌握HTML5/CSS3/JavaScript/jQuery等前端技术,能够编写PC/移动/响应式页面
掌握Linux的使用与常用shell脚本的编写,掌握Gradle、Maven、Git等工具使用
投简历
因为在某三四线城市,当地互联网产业不是很发达,准备去网上投递一些二线城市的公司的简历,我试过的工具有51、智联、拉勾、BOSS直聘。前两个不是纯IT招聘的,上面投的全部没消息了;拉勾上投的比较多,但是最后可以说99%的简历直接被拒绝了,BOSS直聘上面的比较多,性质不同,这里比较推荐的是后面两个。
入职后,发现拉勾上的简历实在是太多了,对于“Java实习生”这个岗位来说,每天HR都能转3~8份简历到技术经理这边,平常工作时间都在敲代码,没时间看,一般都是下班前或者吃饭的时候看几个,不通过的也不和一个个的去跟HR反馈,就丢到邮箱里,所以反馈的速度比较慢的,但一般来说投了简历之后过了一周还没动静的就代表没什么希望了。
BOSS直聘这边聊天的人大多是HR,所以聊技术问题是没有用的,所以大多数都是随便聊一下,然后要简历,给技术VP看看,如果可以的话就安排你的面试时间。
做个比较来说:拉勾的一整套机制很符合公司的招聘流程,在互联网行业也是比较知名的,竞争比较大,安排面试的几率比较低。BOSS直聘这边因为招聘是通过聊天进行的,简历表现的东西有限,通过聊天的方式能快速了解一些个人经历方面的东西,还不错。另外一些大一些的公司自己公司网站上也有招聘入口也可以关注一下。
面试
坐了通宵的火车从学校来到这个城市后,刚到的第一天下午就有一个Android面试,舟车劳顿的我一晚上不仅没睡,而且不敢睡,临时安置在学长家,然后急急忙忙的搜面试资料,毕竟是第一次面试,搜资料的过程中都睡着了1次,然后中午随便找了一家店吃了点东西就去面试了。HR先拿了一张个人信息表给我填,然后找了个技术人员给我面试,记录大概如下:
1、你的项目里用到了SlidingMenu,这个Acitivity是普通的Activity吗?
不是,用的是它封装好了的Activity
2、简单的说一下你知道的设计模式
单例、builder、责任链、观察者、工厂……反正一大堆,看了一本设计模式的书,几十种想不起来了
3、那你说一下Builder模式的最广泛的应用
当然是生成对话框啦
4、Builder模式的链式有什么优点
代码更加优雅
5、除了优雅呢,还有什么优点?
呃。。。(没答上来,应该是根据实际的需求可以builder执行不同的方法,更加灵活。比如说生成的对话框有几个按钮,这些都很好控制的。虽然能理解这个,但是没有答上来)
6、同一个Acitivity中Fragment之间如何进行通信,Fragment什么时候执行getAcitivity会空指针
fragment我在项目里面都是操作同一个service,没有通信过,要我想的话应该可以先从碎片传到activity中,再传到碎片中去;第二种方法应该是可以用AIDL实现的(面试官:一般不这么弄)。
7、简单说一下你知道的有几种BlockQueue以及他们的特点
不知道(我只用过BlockQueue这个类,其他的子类没用过)
8、说一下线程池把
不知道(回去立马学了一遍)
9、说一下Android中的IOC把
是在说注解式把,我一般不用的,用注解开发降低Android运行效率,服务器端开发一般就不需要考虑这个问题
10、为什么用注解会降低效率
因为涉及到类的加载器与反射……效率比较低
11、有没有注解是不降低效率的?
ButterKnife的注解是在编译的时候生成Java文件,仅在编译时需执行,执行后就和普通代码一样了
12、OOM的解决方案?
用更小的图片、压缩图片、使用LruCache、回收。(这个答的特别烂)
水平有限,只能回答成这个样子,他问的问题也是按照我简历写的以及他们公司的项目问的,可能有些也答错了,不过半个小时的聊天和答问还是挺愉快的,技术面试应该算是通过了吧。然后HR来谈待遇,我报了个我现在(写这个文章的时候)实习的工资,她觉得有点高,说他们这边招实习生一般是给3500左右的,不过刚刚面试的人说我技术很成熟,然后要我回去听消息,他们还要对去他们公司的其他实习生面试,对比一下再决定。这是在BOSS直聘上投的,整体感觉还好,但是最后并没有要我:)。
面试这家后出门没几分钟就收到另外一家的面试电话,通知我明天上午11点到公司面试,嗯,对,这次又是Java岗位,面试完后,又回学长家开始搜Java面试题(虽然第二天一个都没问到),通宵的站票加上到处跑,实在是太困了,6点钟就睡了。第二天算好时间出发去面试,有点远,要1个多小时,结果我坐公交车坐反了!!坐反了!!坐反了!!我就说怎么就到终点站了?!!眼看着就赶不上面试了,我掏出了现代文明利器——滴滴打车,然后40分钟跨了2个区就到了。
第二次面试底气足了一点,先去做了一套Java选择题,30道,主要考的是Java 基础部分(多线程、IO、static、计算、集合、泛型)的,以及Hibernate、Spring等框架,大概弄清楚了公司用的技术,然后就开始面试了,先告诉我这笔试题错了5个,还不错。(入职之后发现很多别的来面试的错一大半,20的大有人在,我应该是得益于考了一个Oracle的Java证吧,虽然没什么用,但是的的确确是把Java基础给弄的挺牢固的)后面正式开始面试,结果因为我已经大半年没做JavaWeb开发了,一直在做Android开发,面试官要我举几个开发中碰到的难点问题,我居然一个Web开发的难点都没想起来!!光想着Android开发中碰到的NDK驱动编程与修改安卓系统触摸屏的c代码了……,硬着头皮的和面试官说了一下Android开发中的难点以及一次碰到的金融信用评分系统的软件结构设计问题,然后机智的加了一句
不管是Android开发还是Java开发,虽然他们是不同方向的开发,但是我觉得本质上都是编程的逻辑和业务思维在不同程序中的不同体现而已。
虽然公司用的Hibernate和Struts我都没学过,但是我会Spring MVC和Mybatis,有了这种编程思维从其他框架转用hibernate这些也是很快的。编程最重要的其实也不是这些框架,而是编程的逻辑和思想。
(说的好乱,乱到我自己都不知道我想表达的东西表达出来了没有)
虽然比第一次面试有底气,但是这次10分钟左右就结束了,感觉表现的没上一次的好,然后HR来和我谈待遇,说了一下我的学习经历和项目经历,然后我就把我的“创业”经历拿出来“吹”,然后说了一下自己申请到的创业基金和项目资金什么的,然后按着招聘启事上的报价说了一个价,也是感觉HR觉得我报的略高,但还是说要我回去等,一周内出结果。送我走的时候我,她突然问我要不要先参观一下公司?WHAT??这代表是要了我嘛?虽然内心很激动,但是强行装作很淡定的样子。然后我把公司三层楼参观了个遍,然后我就回来了。
那天很高兴,但是担心是不是因为报价太高了。然后问了一下群里学长,二线城市的实习工资大概什么水平?群里的学长一报价,我就觉得果然是我报价报高了……可是真的很想进今天面试公司,晚上很忐忑,想着第二天和HR询问情况提一下降个500的报价什么的,真的很希望能进那个公司。然后第二天我还再纠结投下家的简历是哪一家的时候HR就直接打电话给我说我通过了……
入职
公司用的开发环境是Ubuntu,嗯,作为一个学习Adobe全家桶的多媒体设计类的专业来说,表示根本用不习惯啊,第一天勉勉强强学了一下什么apt-get之类的命令,把STS\Tomcat\MySQL之类的软件都安装好了,第二天丢了个SSH项目给我,然后花了三天的时间把struts、Hibernate学好了,因为有基础学起来还挺快,(偷偷看imooc的视频学的,用了x2的速度)并把项目看的差不多了,这是一个小项目,大概也就8张表的大小。
第一周就这么过了,然后第二周跟我说了有好多个优化的地方要我优化一下,然后我就一个个模块的改,还有好几个SQL的优化,这个项目虽然不大,但数据量是百万级别的,然后我就打开show_sql慢慢读,发现还真有很多可以优化的地方,然后就把leader提出的问题全部弄好了。嗯,半个月的时间就这样过了,很快,也就两个星期。
第三周就安排了我和PM联系开发一个新的模块,然后给我预估2周的时间开发完,然后我就开始设计程序的流程,和PM确定好了之后,差不多3天就开发完了,就跑去和PM交付,结果测试了一下,使用这个系统的人觉得有些功能设计的不好,要变,然后就又变了需求,就开始新的需求的开发。
第四周这个功能就发布投入使用了。这个一周又接了一个微信扫码对接的接口功能,然后我又开发了2天弄好了。这个系统基本上就比之前要优化不少了。leader看安排给我的项目都做的ok,就拿公司对外的一个项目给我看,拿到SVN后,一看项目我傻眼了,我用搜索统计了一下java文件900+,数据库的表格200+张。先随便看了一下,发现看不懂,然后去看web.xml,根本就没有熟悉的spring的dispacherservlet,用了一个什么见都没见过,搜也搜不到的框架(后来阅读代码发现这个框架居然是公司自己基于Spring写的),然后硬着头皮看xml文件一点一点的看业务逻辑,最后终于看通了。
然后开始让我写一个给Ajax的接口,熟练后差不多1天就写好了,然后第二天和前端一起调试,又接了一个Ajax接口,然后第三天写接口,也写的很快,然后继续和前端调试,嗯感觉很顺利的时候就是出问题的时候,上线后的系统不正常了,因为前端写了一个input,但是没有赋值!因为这个值是后端赋的,然后我不知道应该是我来做的,上线后的系统表单不能提交,因为那个值没有获取到。产品、前端、leader都急的不行,然后我急急忙忙的fix后,新的接口和以前的一个接口在使用的时候又有Bug了,导致页面上什么数据都不显示……然后一行人又的去找问题,发现是另外一个系统的前端的问题。反正就是这类大型网站涉及到多个系统的对接,我刚入职还不了解这些接口分别对应的是什么系统,所以出了Bug,急急忙忙的一周的最后一天就这样结束了……
批评
新人入职不免被批评,虽然不愿意听,但还是要接受,leader批评的再多,也是为我好,为项目好,整理如下:
1. 在linux环境下,你必须要会用vim,不要用那个什么geditor
2. 代码缩进要对齐、对齐,等号前后的空格也很重要,你这样谁看到都烦
3. 注释要简单明了,你这注释自己读一遍试试?
4. commit代码前要检查,每一个修改的地方再看一下,show_sql这种代码还要提交到线上的服务器的吗?!
5. 获取到的值要先自己判断空指针,再使用
6. 开发使用debug模式,不要用什么start server
感受
1. 公司里的项目比在学校做的要复杂的多的多的多,学校里最多做5~8张表的项目,这里这个200个表的涉及到的业务比较宽,但是细细读下来还是能理解的,大项目和小项目都是由一个个板块堆积起来的,更多的是要一颗能静下来的心
2. IT行业加班是常态,但在我在的公司感觉氛围不是很明显,6点就可以走,但是我一般是10点回去的,毕竟没有必要回去那么早。前几周是为了加班补充知识缺陷,后几周稳定下来了就用晚上的时间做做毕业设计了,做完后就好好按15k的标准补充自己知识点
3. 出来之前以为JavaWeb就是ssh或ssm的框架写一些业务逻辑,现在看自己的知识短板真的很多。而且了解到知乎上有很多应届生把 Spring 源码什么的都弄的特别熟,而我只了解Spring的特性和API的调用,任重而道远
4. 在学校我这个非计算机专业其实我技术还算是挺好的,但在公司,不仅每个人的技术都比我好,而且其他的实习生还是纯种的软件工程或计算机专业的,Linux用的比我熟,而且专精JavaWeb开发,不像我野生生长还去学移动端和前端开发,虽然并没有坏处,但是应届生专精一块能找到更好的工作
5. 在公司低调做事,认真完成手头工作,能力范围内帮助他人
6. 人与人的差别,在八小时之外
7. 两年内不理财,用于个人提升
8. 入行后锻炼身体很重要
9. 保持长期的学习心态