外包平台上的项目很可能会很紧急

两个多月前的某个晚上,在某某外包平台上,我收到了一条消息,对方说他们有个电商项目急需人手进行技术攻关,需要驻点开发。我想着闲着也是闲着,就去碰碰面,看看有什么机会。

对方在滨江,距离有20公里,说远不远,说近不近。到了地点之后,对方大致地介绍了项目的设想、计划、投资方和技术栈等等。我觉得还行,就跟对方商量了价钱,大概需要两周时间。接下来就去跟团队成员一起过一下产品细节。

过了一会发现不太对劲儿,项目的细节非常之多,画了一黑板。有常见的商品、下单、支付、会员等功能,我自己分析了下,十来天的时间肯定是不够的。我提了出来,对方说,每人一小部分,赶一赶还是可以的(团队里还有两个全职开发)。

(更多…)

继续阅读 →

开始尝试技术图书翻译

一个月前,我在“图灵教育”的微博上看到《Java Performance, 2nd》这本书正在招募译者,所以我就咨询了下是否可以参与试译,很快小编给了我责编的联系方式,我马上发邮件要来了试译章节,开始动手。

这本书第一版4年前就由图灵出版了,书名是《Java性能权威指南》,如果你是Java老手,大概率看过这本书,Java群体比较大,而且讲性能的书本来就不多。第二版新增了很多Java 11相关的特性和工具等,在这里我当然要建议你在出版后读一读,性能调优在Java进阶的路上必不可少。

(更多…)

继续阅读 →

Spring Boot教程(29) – RabbitMQ必备基础

RabbitMQ是使用最广泛的开源消息队列中间件之一,它是用Erlang写的,并实现了高级消息队列协议AMQP。消息队列可以在应用间交换消息,实现解耦、异步处理、削峰、缓冲等目的,应用场景还是比较丰富的。除了RabbitMQ,还有其他的消息队列可用,比如Kafka、Java写的ActiveMQ和阿里出品的RocketMQ等,现在网上有很多他们的对比,你可以具体分析分析那种可能更适合你。

RabbitMQ现在属于Pivotal公司,而Spring框架也是Pivotal出品,所以两者搭配使用也是顺理成章,Spring Boot也有AMQP Starter以提供支持。在打开IDE演示代码如何编写之前,先说说消息队列以及RabbitMQ具体是怎么工作的。

(更多…)

继续阅读 →

Spring Boot教程(28) – 简单读写Redis

Redis是最流行的key-value数据库,它最常用的功能就是缓存。就算你不是搞后端的,也会不断看到Redis相关的新闻和技术文章等,因为它性能强劲、功能丰富、生态完备,各种“吊打面试”的系列文章肯定少不了它。

如果仅仅是CRUD工程师来使用Redis的话,那需要掌握的东西寥寥几句话就可以概括,简单说就是80%的情况下你只需要用到20%的知识。我想更复杂的地方就是如何针对不同的业务进行数据结构的设计,这个就需要实践和经验了。如果你是在大厂,数据足够多,访问量足够大,可能会需要搭建Redis集群,这也是有现成工具和方案的。

可惜作为一个toB项目的CRUD的工程师,还没有机会将Redis的作用充分发挥出来,只能在这里啰嗦下它的基本使用。轮子丰富的Java生态和Spring全家桶,老早已经为你准备好了工具,Spring Data Redis可以帮你高效使用Redis,而且Spring Boot也提供了starter可以一键接入Redis,“0配置”就可以写代码。在介绍它之前,先复习下Redis的基本概念和命令,然后再来说说它的API的使用。

(更多…)

继续阅读 →

最近股市波动大,入场须谨慎

前两天有个大学同学C,问我有没有兼职项目可以做,我好奇他是不是工作不饱和,他说不是的,炒股亏光了,把买房钱亏进去了。

众所周知,最近美股市场遇到了罕见的大跌,S&P 500指数在一个月内大跌了30%+,直接跌到了2017年的水平。连巴菲特也得感叹自己“太年轻”,见证了短时间内的四次熔断。

要说我也挺惨的,我在2月19号美股历史最高点的时候,入金买股票,然而第二天立马就开始跌跌不休。我不禁感叹,是什么力量让我如此精准把控股市的走向,“我一买入就大跌,我一卖出就大涨”绝对不是什么传说,是昏暗灯光下每个吃面人的真实内心写照。我有时候会想,跌了这么多,要不我清仓试试,看看能不能挽救全世界股民。后来我控制住了自己,没有卖出任何一支股票,因为当时入场时就打算长期持有3到5年,现在清仓我干点啥呢。好在下跌的过程中我慢慢补仓降低了成本,到现在浮亏已经降到了10%以内,还可以接受。

(更多…)

继续阅读 →

Spring Boot教程(27) – 优雅地实现重试逻辑

Spring家族中有一个小项目是Spring Retry,他用来方便地实现重试机制。你的程序在调用远程API的时候,可能因为网络抖动等原因,导致调用失败,这种失败是偶发的,出现了多试几下就行。如果你遇到需要重试多次的情况,倘若只是朴素地写个for循环N次,请求成功就跳出循环返回结果,未免也太粗糙了。Spring已经为这一通用需求造好了轮子。

Spring Retry现在被Spring BatchSpring Integration等项目引用,在Spring Boot项目中,我一般直接引入spring-boot-start-batch来间接引入Spring Retry(Spring Batch是个批处理工具库,你也许会用得到其中的类,我们有机会再具体研究下),另外它还要配合AOP Starter才能使用,后者你的项目里一般都有。引入Spring Retry后,可以用加注解声明的方式,或者编码的方式来使用。

(更多…)

继续阅读 →

大家最近还好么

最近新型冠状病毒肺炎已经影响了所有人的生活,大家都憋在家里。我当然也不例外,每天醒来第一件事就是打开丁香园看看现在各种数据增加了多少,再刷刷微博,看看武汉和各地的防疫工作都有哪些进展。说实话,消极信息实在是太多,尤其是肺炎患者求助超话,看了一些求助的文字,整个人都不好了。网上的信息真假混杂,仅凭一个手机获取消息的我无法去验证真假,也帮不上什么忙。

(更多…)

继续阅读 →

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

(更多…)

继续阅读 →