Eleven's blog


  • 首页

  • 归档

  • 关于

  • 遗愿

有效的单元测试

发表于 2017-08-30

实践了一段时间的单元测试,碰到了不少疑惑。有些疑惑已经被解了,比如单元测试走不走DB,测试替身等。还剩下一些疑惑,单元测试粒度的把握(目前我的粒度是一个类一个用例),测试用例的维护问题。
于是就抱着疑惑看了一本书《有效的单元测试》。然而这本书是一本小白的入门书,并没有解开我的疑惑,或许我的疑惑应该去看看架构和建模相关的书籍。
不过这本书中提到了一些关于可测试性代码设计的问题,还是非常有价值的,比如

  1. 创建对象尽量不要用new,用注入会更加容易替换成测试替身。
  2. 避免使用final修饰方法(因为无法被测试替身替换)。
  3. 避免使用复杂的私有方法(想想是否应该封装到另一个对象中,成为一个public方法)。
  4. 不是单纯的计算逻辑,最好不要用static方法。
  5. 组合优于继承。

BootStrap全局CSS样式与组件

发表于 2017-07-25

这几天看了一下全局 CSS 样式和 组件 的部分。看完之后的感觉就是Bootstrap真的是一个非常牛逼的框架。它不单单适合响应式开发,对于不熟悉前端的同学快速开发一个功能简单网站真的不是问题。Bootstrap内置了很多有用的控件,而且样式也非常漂亮。这几天一边看bootstrap一边将它用在Hurcan项目上,Hurcan项目在UI上比之前漂亮了很多。
今天碰到一个问题:IDEA自带的Coverage在跑测试用例的时候无法统计Dao层的测试代码覆盖率。为此我还专门在github上给Coerage项目提了Issue。

BootStrap栅格系统

发表于 2017-07-21

虽然Bootstrap之前一直在用,不过每次都是边查边用。从来没有系统学过。今天重新看了一下Bootstrap的文档。发现自己大部分用法都是不规范的。

今天主要是看了一下bootstrap的基本布局,栅格系统。bootstrap的诞生主要是为了解决响应式问题,它将屏幕设备分成四种,.col-xs-,.col-sm-(750px),.col-md-(970px),.col-lg-(1170px)。默认份12列。容器分别是.container -> .row -> .col -> .row -> .col(支持嵌套)。
技术实现上主要是用了padding: 15px;和margin: -15px;。通过对一个html标签设置多个col类别的属性,来适应屏幕尺寸的变化。

昨天虎哥微信上找我,他告诉我他去了菜鸟网络。虎哥还是屌屌的,恭喜虎哥。

抛弃Jekyll,转移到Hexo

发表于 2017-07-15

今天重新整理了一下博客,之前因为mac上ruby版本的问题,导致jekyll的使用异常蛋疼,就一直荒废着。这几天又来兴致整理博客了,索性就把我的博客从jekyll迁移到了hexo。hexo的文档和使用给我的感觉比jekyll要好。

关于杭州的房子

这几天想重新整理博客的一个原因可能就是忙着买房子的事情吧。其实对于我自己来说,房子真的不算是什么需求,毕竟单身狗当了快三十年了,到哪都是一个狗窝。不过房子确实是一个不错的保值品,尽管杭州的房子不会涨价太多。以前我总是不知道,千万富翁是如何理财的,博士告诉我他们是把钱放在私人银行,但是我身边更多的有钱人是通过买房子用来保存他们的财富的。其实我的目标是独栋别墅,但是远远买不起,现在如果买了房子,我也是会把房子做成一个小工作室,一个属于自己的小工作室对我来说吸引力还是非常大的。

关于数字货币

近段时间大家都在疯狂地投资数字货币,但是数字货币的红利期已经过去了,现在入场基本只能当接盘侠。从数字货币的事情当中我明白了一个事情,对于一个新鲜事物,我们不能排斥,也不能鄙视,而是要有一颗敬畏之心,学习它。想起大二的时候,端端邀请我和他一起去挖比特币,结果当时我看不起虚拟货币,错过了一次开兰博基尼的机会。这次投资数字货币,还算幸运,赶上了最后一波红利,在暴跌之前离了场。不过我坚信“区块链”技术以后必定颠覆当前的互联网。

关于工作

上周我的“hurcan”项目终于上线了,在给运营的妹纸们做简单的培训之后,她们基本也都会用了。hurcan是兰博基尼的一款车型,之所以这个项目叫hurcan,是因为前段时间领悟到一个道理:程序员也是工程师,就跟造兰博基尼的工程师是一样的。如果把写代码的工作当作是制造兰博基尼,那么工作就会变得十分有意义。认认真真做一款产品的人都很有魅力,这可能就是所谓的工匠精神吧。因为目前我在公司定位主要是运营活动和信用卡还款方面的东西,所以我希望我的这个项目能跟兰博基尼一样是一件艺术品。
我喜欢做东西,我享受做东西的过程,所以我想学前端,hurcan项目的UI是用bootstrap + avalon.js写的,UI和体验真的是好差。尤其是Jquery那些异步回调的方法,代码布局乱七八糟,css命名也是乱七八糟,毕竟我还只是个业余爱好者。所以我想在工作之余好好学学前端知识,毕竟公司有这么多前端老司机带,解决问题就方便很多了。先从bootstrap和react.js开始吧。

一个合格的程序员

发表于 2017-04-19 | 分类于 思考

我心目中的一个合格的程序员的品质

提测前的check list:

  • 单元测试覆盖度是否达到80%。
  • 每个变量的命名是否合理,是否需要重构。
  • 测试和线上的配置文件是否准备好了。
  • 线上环境和测试环境的不一致性,多台机器,微服务的健康检查,url和域名是否需要修改。
  • 检查线上数据库,新增状态是否原本就存在。
  • 是否所有sql都命中索引。
  • 数据库建表语句的每个字段类型和注释是否都合理。
  • Sonarqube上代码的可靠性,安全性,可维护性是否达到A标准。

思想觉悟

  • 代码大部分时候是用来维护的,而不是用来实现功能的。
  • 绝对清晰,是风格上唯一的美。
  • 当你真正想要完成一件事情的时候,你是不会在意你是产品,还是开发,还是设计。
  • 当你在做一个项目的时候,你要把自己想象成是在造一台兰博基尼。
  • 认真对待每一个error日志。

经验

  • 没事千万不要写void函数,一个方法体没有任何反馈信息会增加测试难度。

spring中的环境Enviroment

发表于 2017-04-05 | 分类于 spring源码

上周清明节在家没事看了一会spring的源码。主要是spring-core中的env模块。

spring运行的环境主要包含两个方面,一个是环境中设置的属性信息,一个是profile。

属性信息就是通过application.properties或者通过命令行启动时候用–attr=value启动的一些参数。

profile表示环境中哪些bean是当前进程加载的。(我一般用profile来配置测试/开发/预发/生产环境)。

这个模块中最基本的一个抽象类是PropertySource,一个嘴基本的接口是PropertyResolver。

PropertySource是属性的载体,而PropertyResolver是对PropertySource使用工具。两者组合完成了所有对属性的解析,包括对${}占位符的自动解析。

Enviroment在继承PropertyResolver的同时,还增加了对Profile的管理。Enviroment是ApplicationContext中很重要的一部分。

一下是我对这几个类或借口的理解

  • PropertySource:属性集合。比如可以代表名称为systemProperties 的系统自带属性集合。

  • EnumerablePropertySource:封装了PropertySource的使用,通过一个getPropertyNames方法获取所有的属性名的方式来使用。

  • MapPropertySource:一个真实可用的PropertySource,只不过规定PropertySource的source必须是Map类型。
  • PropertiesPropertySource:继承MapPropertySource,规定source必须是Properties类型。
  • SystemEnvironmentPropertySource:这是MapPropertySource的一种特殊实现,专门用于配置Enviroment,这个类增加了shell环境中对一些特殊符号的兼容。
  • CommandLinePropertySource:比较普通,抽象了通过命令行设置的属性源,包含了option arguments和non-option arguments。
  • SimpleCommandLinePropertySource:CommandLinePropertySource的一个简单实现。
  • CommandLineArgs:命令行参数的抽象。
  • SimpleCommandLineArgsParser:命令行参数解析器。
  • CompositePropertySource:组合属性源,可以把多个propertySource组合成一个属性源来使用。
  • PropertySources:多个PropertySource组合在一起,但不是PropertySource。
  • MutablePropertySources:PropertySources的默认实现。
  • PropertyResolver:属性解析器借口。包括属性的获取和占位符的解析。
  • ConfigurablePropertyResolver:可配置的属性解析器,允许配置属性占位符的分隔符和前缀后缀,也能配置属性类型转换器。
  • AbstractPropertyResolver:属性解析器的抽象实现,没什么特殊的。
  • MissingRequiredPropertiesException:必要属性的不存在时抛的异常。
  • PropertyPlaceholderHelper:解析属性占位符的具体算法。
  • PropertySourcesPropertyResolver:PropertyResolver的唯一一个实现。
  • Environment:在PropertyResolver的基础上加上了获取profile相关的操作。
  • ConfigurableEnvironment:增加了设置profile的操作。
  • AbstractEnvironment:Enviroment的抽象基类。实现了一些简单的操作profile和propertySource的接口。
  • StandardEnvironment:标准环境类,在抽象基类的基础上修改了增加MapPropertySource和SystemEnvironmentPropertySource的行为。
  • EnvironmentCapable:只定义了一个接口用于获取环境对象。
  • ReadOnlySystemAttributesMap:只读属性。其实只是个readonly的map。

让我们一起加入这万米云端的历险!!

发表于 2017-01-19 | 分类于 总结

标题是在李鼎大大博客中看到的《准备一个安全可靠的发布流程》文章中的一句话,挺适合用来形容一次大版本发布这个情形的。昨天是2017年最后一次大版本发布,可谓是障碍重重。发布的项目比较多,而且整个项目的开发时间很赶,作为项目开发者的自己底气都不是很足。包含大量配置,无法线上回归,发布流程整整写了两页。

发布流程梳理:

起飞前的准备

  • 申请线上的机器和域名。
  • 确定项目线上机器的ip,确保有登录权限。
  • 确定线上的域名。
  • 创建数据库表。修改数据库表结构。(尽量不要涉及删除字段这种情况)
  • 创建对应的kafka topic,以及influxdb对应的数据库。
  • 初始化表数据(分部有依赖的情况需要留到发布中)。
  • 打正式包,发布到线上仓库,将依赖项目的版本号升级。
  • 代码合并到发布分支。保存当前线上代码的分支用于回滚。
  • 整理每个项目需要修改的发布配置项,创建线上superDiamon的配置。
  • 配置好线上环境goodjob。
  • 写好发布流程。
  • 想好回滚策略。

起飞中

  • 严格按照发布流程执行。
  • 检查项目是否启动。
  • 查看错误日志。

到达目的地

  • 整体回归。

你好,2017

发表于 2017-01-01 | 分类于 思考

今天又是元旦了,今天是July结婚的日子,很开心他能找到自己的幸福。

2016年做了很多尝试。

  • 知乎上发帖找简历赚内推奖金(虽然至今还没有成功,但是感觉自己运用了互联网思维,还是帅帅的)。

  • 网站mreleven.com,收获了大概四十几个用户,上千条签到。

  • 给券吧App,应该没有什么收获。

  • 股票/基金亏了点钱,不过至少学到了很多股票和基金相关的知识。

  • 基因测序/IOS自动打包平台/ipa包下载平台/斗图输入法等一大堆乱七八糟的尝试。

2016年,我第一次带一个完全陌生的妹纸看了一场电影,不怕尴尬去参加了一场没有熟人的婚礼,为了一个财宝宝储蓄罐去报名参加了公司的基金访谈,第一次玩真人CS。。。

2016年,碰见了很多有意思的人,一个玩得很High的海龟,一个通过各种渠道想办法进入丁香园的毕业生,一个很能忽悠但很有意思的产品经理,一个副业比主业收入高的运营。

2016年,提出过一次辞职,下定决心,但最后还是选择留下,留下是因为自己还不够优秀。去自己曾经很向往的公司经历了一次面试,收获挺大。

2016年的尾巴想明白一些道理,我很憧憬本杰明巴顿先生的人生,我们来这个世界上走一趟,真的不要患得患失,不要让那些你追求不到的东西,困扰你的睡眠。人活着就是为了开心,难得来一趟世上,多去看看这个世界。2016年我学会了接受一些我们无法改变的东西,变得更加自信。

2016年的自己真的不够优秀,走了很多弯路。我要学会更加open,任何事情都要学会沟通,以一颗谦虚的心多向前辈学习。2016年,作为一个子女,我觉得我做得还不错,尽到了一份义务。2016年跟老爸的一次聊天很开心,老爸是我生命中最帅的男人。

2017年,努力让自己变得更优秀。

  • 体重控制在110以内吧。
  • 努力寻找自己喜欢的妹纸。
  • 好好学习Java,争取把spring ioc的源码看完。
  • 热爱工作,赢得大家的尊敬,对自己写的每一行代码负责。
  • 赚更多的钱,争取实现财富翻倍。

在九月结束的时候叫醒我

发表于 2016-10-02 | 分类于 吐槽

自从大一第一次听到Green Day的Wake Me Up When Spetember Ends,每当九月结束的时候我都会听这首歌,写一段计划与总结。

从毕业到现在已经两年多了,如果算上实习的时间,工作已经三年了。在这三年的工作时间内让我看清很多事情。当初从宁波来到杭州只是为了互联网的无限可能,谁知道在前几个月得知,最早宁波实习的那一家公司已经上市了,如果当初留在那边30个人左右的小团队,到现在估计已经能够小赚一笔了。说来可笑,当初为了追求互联网的无限可能,选择了python进入了第一家公司,然后去年9月中旬,第一家公司被收购了,并没有想象中的一夜暴富。我现在也成了当初最鄙视的Java程序员,人生总是充满各种意外。

年纪不小了,做很多事情不可以再任性,做一件事情之前一定要想清楚你付出的跟你收获的。上个月回家跟父亲大人聊天,父亲大人作为前辈给了我不少建议,他告诉我不要每天加班,因为那是给老板创造财富。不要太在意薪资,因为薪资改变不了现状。公司只是一个平台,要注意积累公司中的资源,要多注意身边的机会。而之前也总有小伙伴抱怨老板不给加工资,而我也总是把自己的理解跟他们分享:与其等待老板升职加薪,不如跳槽。与其跳槽,不如搞点副业。跳槽能给自己的工资涨不少,但是这改变不了太多东西,仅仅只是给了你一点满足感。或许半年之后你可能还是会抱怨工资低。增加收入的方式有很多,稍微靠谱一点的就是做点副业,就像我的室友。目前我尝试了几种增加自己收入的方式。

1.炒股,花钱买可能性,几万块钱,买不了吃亏,买不了上当,年轻人给自己一次机会。目前还亏35%左右。虽然有可能投入40万,每次买中热门板块能成为亿万富翁,但是毕竟可能性太小,股市根本无法预测,所以这条路不是很靠谱。不过那些钱就放里面吧,给自己一点希望。

2.内推。目前公司推荐人才能拿奖金,还挺高的,普通的1500,资深3000,架构师8888。于是乎,我就发动互联网思维,去网上发帖招人,效果还挺不错,到目前为止至少收到了40封简历,不过我推荐的所有人都没有入职成功。内推这种事情,不需要成本,只是往内推系统放一下简历就好了,虽然通过的可能性小,不过还是可以尝试。

3.ipa包托管。我室友让我做的,他负责签名ipa包,我负责托管,让其他人来下载。目前为止赚了一百多块钱。

4.给空壳公司开发app。当初深刻意识到这是一个伪需求,产品肯定不会活,但是为了熟悉Java我还是做了。目前为止没有赚到钱,倒是学到不少经验。首先千万不要去开发一个伪需求的产品。第二,投资人不是傻子,用户不是傻子,钱不是那么好赚的。

5.公众号自动回复开发,目前开发好一套,但是没人用。更别说是做平台了。

6.开发自己的app,自己开发,自己运营,自己推广。目前正在进行中。从大搜车的芋头君那边得知,他自己开发的一个app已经有60W用户,然后在今年年初卖掉了自己的产品,赚到了人生第一桶金。所以我也想学一下他,即使失败了,至少能知道自己离一个成功的产品还有多少距离。

最近有一件事情很让我有感触,我们的竞争对手51信用卡C轮融资3.1亿美元,CEO孙海涛正式加入独角兽俱乐部。这个事情让我觉得,一夜暴富离我们又不是那么遥远。

scheme牛顿迭代

发表于 2016-03-16 | 分类于 scheme
  • 求平方根
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
(define (square x) (* x x))

(square 2)

(define (abs x)
(if (< x 0) (- x) x)
)

(abs -1)

;;(define (goodenough guess x)
;; (< (abs (- (square guess) x)) 0.0001))

(define (goodenough guess x)
(< (abs (- (/ guess (average guess (/ x guess))) 1)) 0.01))

(goodenough 3 9)

(define (average a b)
(/ (+ a b) 2))

(average 9 3)

(define (sqrt-iter guess x)
(if (goodenough guess x) guess (sqrt-iter (average guess (/ x guess)) x))
)

(sqrt-iter 1.0 9)

(define (sqrt x) (sqrt-iter 1.0 x))

(sqrt 9)
  • 求立方根
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
(define (square x) (* x x))

(square 2)

(define (cube x) (* x x x))

(cubert 2)

(define (abs x)
(if (< x 0) (- x) x)
)

(abs -1)
(abs 1)

(define (goodenough guess x)
(< (abs (- (/ guess (improve guess x)) 1)) 0.01))

(goodenough 3 9)

(define (improve guess x)
(/ (+ (/ x (square guess)) (* 2 guess)) 3))

(improve 1.0 9)

(define (average a b)
(/ (+ a b) 2))

(average 9 3)

(define (cubert-iter guess x)
(if (goodenough guess x) guess (cubert-iter (improve guess x) x))
)

(cubert-iter 2.0 27)

(define (cubert x) (cubert-iter 1.0 x))

(cubert 27)

推荐一首好听个歌给大家,希望大家都能成为自己的Best Of Me

123…5
© 2019 Mr.Eleven
由 Hexo 强力驱动
主题 - 由 Mr.Eleven 修改自 NexT.Muse