我又动了找工作的心了

最近又在考虑找工作了。

虽然这两年不在职场,但是我还是很关注的。经常会打开拉勾和BOSS直聘,看看有哪些公司在大力招人。很可惜,我住在城东,互联网公司洼地,杭州的很多公司都在滨江、城西和余杭,动不动单程十几二十公里让我很有畏惧感,一想到要每天开车穿越杭州城就有点头疼。

当然距离只是一方面原因,另外一个原因是没有找到合适的公司。自从转到Java Web方向之后,在招聘网站搜索职位的时候出现的都是一大串阿里的公司,比如淘宝天猫、蚂蚁金服、菜鸟、盒马,倒不是嫌钱少或者对阿里有什么意见,只是因为之前的工作经历让我少了一丝憧憬。接下来还有一些公司,比如网易、华为、海康威视、滴滴、有赞,都是比较成熟的公司,另外还有一些大厂在杭州有分部的,比如vivo、头条、京东数科等等,剩下的是一些中小型公司和非互联网公司的技术部门。

(更多…)

继续阅读 →

Spring Boot教程(26) – 如何发送邮件

发送邮件的需求很常见,找回密码啦,推广产品啦等等。在演示如何写代码之前,我先来说说,常见的邮件发送方式有哪些,以及我们应该如何做选择。

大体上来说,发送的方式有两种,一种是使用SMTP协议,连上SMTP服务器发送邮件,一种是使用第三方的邮件发送服务,调调API就行。我们先来说说前者。

SMTP是“简单邮件传输协议”的简称,是用来邮件的,与之对应的是用来邮件的IMAP和POP3协议,后俩协议暂且不提。现在各大邮件服务商比如Gmail,网易邮箱,QQ邮箱等都有提供SMTP服务器方便你发送邮件,比如你本地的邮件客户端,在添加你的邮箱的时候就需要提供SMTP服务器的地址和端口。同时还需要提供的,就是你的邮箱和密码,这个密码通常不是你的登陆密码,而是一个授权码,类似于token的东西,你需要在后台生成,在账户出现安全问题的时候这个授权码是有办法revoke的。有了SMTP服务的地址、端口、邮箱和密码,你就能在邮件客户端上或者编写代码来发送邮件了。

(更多…)

继续阅读 →

Spring Boot教程(25) – 状态码和错误码的一种最佳实践

前两天在V2EX上看到一个帖子,有人吐槽公司项目所有的接口请求都返回200状态码,再在body里加入code进行业务区分的做法不合理,帖子引起了程序员们激烈的讨论。左耳朵耗子(陈皓)之前也发微博讨论过这个问题,不同意见的两方人数都挺多的,各有各的道理。

“200一把梭”的人会采用类似如下的JSON响应:

{ 
   "code":123,
   "message":"OK",
   "data":{ ... }
}

即所有的请求状态码都是200,业务根据body中的code字段判断请求的状态,需要时会从data字段中拿出数据。这种方式的使用者,大概理由是,业务的状态码足够多,如果对应成HTTP状态码根本不够用。

而另一堆人对于这种做法十分反对,认为这相当于抛弃了HTTP协议的状态码,抛弃了普遍认可的共识。

(更多…)

继续阅读 →

记一次脚踝修复手术

最近没怎么写文章,除了忙项目之外,还因为最近跑医院做了个脚踝修复手术。住院了一星期,前天刚刚出院,目前只能躺着静等恢复。

我平常喜欢打篮球,因为没有什么保护意识,从小打大没少崴过脚,崴了脚之后,也是等它自然消肿,没有去医院看过,日积月累,有了很多小毛病。三年前,因为雨天总是感觉脚踝不适,就去了医院,检查显示脚踝韧带断裂(不知道啥时候断的),医生说是不要进行剧烈的运动,修养修养再看。后来没有再看过,因为毕竟不影响日常生活,偶尔也能运动运动。

今天6月,勇士输掉总决赛之后,我手痒,想去打球玩一玩,于是跑到了浙大华家池校区。本想着能跟往常一样,打两个小时热热身就回去,没想到在一次抢篮板的过程中,再一次扭到了脚踝。我回去只是喷了喷云南白药,希望过俩星期能跟以前一样自然好转。

(更多…)

继续阅读 →

Spring Boot教程(24) – 用RestTemplate访问外部服务

日常开发中难免会向应用外部发起HTTP请求,比如访问云存储平台的API、调用微信或支付宝的API、抓取网页等等。Spring框架提供了RestTemplate来完成这一需求。RestTemplate提供了很多方法,方便你发起GET和POST等请求。下图是个简单的调用,去获取网页的HTML代码:

getForEntity方法会发起GET请求,然后返回一个ResponseEntity对象,它把HTTP请求的响应抽象成一个对象。通过ResponseEntity,你可以获取到此次响应的状态码、首部(Header)和主体(Body)。有的时候你仅仅需要Body部分,那就可以使用getForObject方法。

(更多…)

继续阅读 →

Spring Boot教程(23) – 容器中对象的命名和查找

Spring容器中的对象(Bean)都有自己的标识符(identifier),多数情况下一个Bean只对应一个标识符,你也可以给Bean指定多个标识符。另外在网上的教程里你可能看到id或者name的概念,其实他们和标识符指的是同一种东西。一个对象如果有多个标识符,还会有一个别名(alias)的概念,它是一种相对的叫法,你挑一个标识符出来,剩下的标识符都叫别名。我通常就把Bean的标识符称为Bean的名字。

(更多…)

继续阅读 →

Spring Boot教程(22) – 容器中对象的生命周期

你可能在学习其他框架的时候,听到过“生命周期”的概念,通常,框架会提供给你回调方法,在生命周期的关键点,框架会调用这些回调方法。比如你给你的小程序或者安卓应用编写页面的时候,会有类似onHide()、onShow()这种方法,分别在显示(show)页面或者离开(hide)页面的时候调用到,他们正属于页面生命周期的一部分。

在Spring容器中的对象(Bean),也有着自己的生命周期,只不过比较简单一点,因为只有两个关键点。第一个关键点是Bean的所有依赖都已经装配好的时候,另一个是容器即将销毁的时候。你可能会问,容器什么时候销毁?如果你不是自己维护ApplicationContext的话,而是框架自动维护的话,比如使用Spring Boot写web运用,那么你程序停止运行的时候,就是容器销毁的时候。这个时候容器中的对象会根据自己的情况,来释放一些资源,比如关闭它跟外部系统的一些连接等。

(更多…)

继续阅读 →

Spring Boot教程(21) – 默认线程池

之前我们简要说过@Async@Scheduled的用法,这俩注解会帮你完成异步任务和定时任务的需求。不知道你有没有想过,这些异步任务和定时任务都是在哪个线程执行的?Spring Boot肯定在背后做了很多工作,本文就来说说框架都为我们做了什么。

首先肯定是有线程池的。Spring Boot已经帮你创建并配置好了,还配了两个,一个供@Async使用,一个供@Scheduled使用。

Spring将异步任务和定时任务的执行,抽象出了两个接口,TaskExecutorTaskScheduler。我们先来说说TaskExecutor

(更多…)

继续阅读 →

这个功能你们谁愿意做?

2013年初,也是就是我大四下学期的时候,我去阿里实习,当时的部门是云OS,产品是手机桌面。我面试的时候方向是linux编程,后来被分配成了Android开发,我倒是很快就接受了这样一个角色。

这么多年过去,回忆那段时间,只有一个场景能让我反复想起。有一次开会,boss说了说接下来一个月的工作计划,但是并没有分配由谁来做。会议结束之前,boss将所有功能都列了出来,其中有一个是“通过下来手势来更换壁纸”,然后他问到:“这个功能你们谁愿意做?”。

那个时候我才学了两个月的Android,目测自己肯定没有这个能力,就没吭声。boss环视一周,发现气氛比较尴尬,好像大家都不太愿意主动把活揽过去。后来一位经验比较丰富的同事说,那我来做吧。剩下的人好像舒了一口气。那种感觉好像是:在课堂上,老师说要找同学来回答问题,直到老师挑中了某个人,剩下的同学才放下心来。

后来我想了想,就算我当时有技术实力完成,我会主动说由我来做么?恐怕不会。“我没这个能力”只是个借口而已,不管这个借口是真是假。因为我当时的想法就是,领导把任务分给我,我来做就行了,没任务就不做。这个思想也对我后来的职业发展产生了负面的影响。

如果换成现如今的我,结果就不一样了。因为这两年,单挑的项目比较多,你不好好做,项目的投入就打水漂,或者客户钱就白花。当我的忙的时候,当我想找个人来分担压力的时候,我时常会想,这个人一定得能主动推进项目的进度,而且能够顺利地完成,就像把文件扔进碎纸机一样,爽快干净不留痕迹。如果以这个想法回到过去,可能我的行为会不一样,更能从boss的角度俩来考虑。

继续阅读 →