分类:博客

  • 【博客】基于行为驱动开发(BDD)结合Web UI自动化工具(Taiko)

    Gauge不强调协作,可以作为自动测试工具独立存在,同时支持高效的协作和BDD实施。 这是一个更灵活的框架。 它的秘密武器Taiko是出色的Web UI自动化工具。 两者的完美结合,真正实现了需求规格说明,自动化测试和活动文档的有机结合。 BDD是什么 BDD,Behavior Driven Development,行为驱动开发。 如果你不是很了解BDD,可以参考我四年前的一篇文章《说起BDD,你会想到什么》,其中介绍过BDD的理论和应用。 我们可以这样来概括BDD: BDD采用统一的领域特定语言(DSL)来描述业务场景和用户行为,让团队各个不同角色对业 ...

    阅读全文

  • 【博客】JVM源码分析之Java对象的内存分配

    新建一个对象时,由对应的instanceKlass对象计算出需要多大的内存,并调用CollectedHeap的common_mem_allocate_noinit方法分配指定大小的内存,实现如下:   从线程的局部缓冲区分配临时内存 TLAB技术是每个线程在Java堆中预先分配了一小块内存,当有对象创建请求内存分配时,就会在该块内存上进行分配,而不需要在Java堆通过同步控制进行内存分配。如果UseTLAB为真,则使用TLAB技术(Thread-Local Allocation Buffers),将分配工作交由线程自行完成,实现如下: 1、如果线程的局部 ...

    阅读全文

  • 【博客】捕捉异常请先考虑使用 try-with-resources,而不是 try–catch-finally

    这是读者爱丽丝(Alice)上周特别向我发送的消息,这确实让我感动。 已经复制了几个大尺寸的内容,包括CSDN,同一天​​阅读了15,000。 但是,诸如“我以为您有任何新的特殊效果,但我没想到要使用Java 13”之类的批评也很多。 自从我写第一篇文章以来,喷的次数就像头顶上的密发,而计数却无数。 这次无需进行远程审查,因为我们公司也已恢复工作。 这篇评论的代码仍然是小王的。 他编写的大多数代码都很漂亮,严谨和注释良好,这让我感到非常满意。 但是当我看到他对尝试资源一无所获时,我忍不住大喊:“小王,我擦了,你最终还是在尝试捕获!” 来看看小王写的代码吧 ...

    阅读全文

  • 【博客】微服务时代的DDD反思

    有一段时间DDD还很新。当初Eric Evans首次发表他的开创性著作《领域驱动设计:软件核心复杂性应对之道》时,书里的灵感让我们感到像找寻到了一个个治愈创伤的良药。Evans创造的是一种更好的方法用来构造复杂逻辑,因此不仅是我们的代码,甚至我们的整个应用也更容易理解,并且更少的逻辑分散和无尽无休的面条式代码、重复行为。 那是过去的事了,从那时起,我们用DDD获得了各种各样的成功,无论是在你的上下文地图中拆分限界上下文, 实现领域服务或者基础设施逻辑,甚至(这是对我来说最主要的)教育老开发新招数:反思并教育开发者去思考DDD,不是像我过去那样只复制粘贴代 ...

    阅读全文

  • 【博客】疫情当下,如何做好一场线上培训

    引言 受疫情影响,现在很多企业都选择让员工在家办公,而一些相关的服务也不得不从线下转到线上。对于ThoughtWorks这种专业服务公司,也开始为部分客户提供远程线上技术培训,在这里总结了一些相关的技巧与经验,与大家分享。 现场培训流程 首先,我们做的是技术培训,通常现场的技术培训流程是这样的: 通过PPT或者白板讲解技术知识点 引导学员对相关技术知识进行讨论或者分享 讲师现场演示技术细节 学员现场做练习 讲师根据练习结果进行反馈和总结 布置作业 知道了培训流程,那么把这样的技术培训迁移到线上,会有哪些变化呢? 首先,线上培训会有一部分新增的现场培训没有 ...

    阅读全文

  • 【博客】更好的开卡,来聊聊非功能性需求

    工作这么几年来,见得最多的场景是 QA 小伙伴满办公室追着开发报 bug,有时候开发会不乐意,“当时可没说要 XXX,要做 XXX。” 好像 QA 小伙伴永远比开发多一点心眼,即使单元测试覆盖率达到 80%,QA 还是变着法都能找出问题。 这其中很大一部分原因都来自于“需求背后的需求”,BA、QA 小伙伴以为你考虑到了,或者默认开发需要考虑到。 比如 CMS 系统中一个新建文章的需求,不太可能写出需要防止表单二次提交的 AC(Acceptance Criteria,验收条件),然而如果没人提出来谁会知道呢? 最终 QA 或者线上的用户会通过报 bug 告 ...

    阅读全文

  • 【博客】日志中的用户隐私安全

    与“中国人愿意用隐私交换便利性”的心态完全不同,欧美国家在个人隐私保护方面明显走得更早也更远一些。在2018年5月GDPR发布前后的一段时间里,保护个人隐私相关的需求被迅速提高了优先级,而像我这样一个开发涉及欧美产品的普通程序员,日常工作也因此受到影响,我们放下手中的业务需求卡(Story),转而去做GDPR相关的安全需求。 一般在医疗保健或金融行业中,限制访问客户的敏感数据有着非常严格的规定,尤其欧洲GDPR颁布之后,公司泄露个人数据的后果也非常严重。在个人隐私保护方面,国内目前在法律和意识方面处于滞后的状态,但是许多人或多或少都感受到个人信息泄露给自 ...

    阅读全文

  • 【博客】从项目分层开始,让Java代码更优秀

    1.背景 什么样的代码才是优秀代码?或者说让代码看起来优秀什么方式? 本文讲得就是从项目分层开始,让Java代码更优秀。 说起应用分层,大部分人都会认为这个不是很简单嘛 就controller,service, mapper三层。 看起来简单,很多人其实并没有把他们职责划分开,在很多代码中,controller做的逻辑比service还多,service往往当成透传了。 这其实是很多人开发代码都没有注意到的地方,反正功能也能用,至于放哪无所谓呗。 这样往往造成后面代码无法复用,层级关系混乱,对后续代码的维护非常麻烦。 的确在这些人眼中分层只是一个形式,前 ...

    阅读全文

  • 【博客】如何优雅处理代码中 Null 值引起的 Bug?告别 Null 恐惧症!

    写在前面  在笔者几年的开发经验中,经常看到项目中存在到处空值判断的情况,这些判断,会让人觉得摸不着头绪,它的出现很有可能和当前的业务逻辑并没有关系。但它会让你很头疼。 有时候,更可怕的是系统因为这些空值的情况,会抛出空指针异常,导致业务系统发生问题。 此篇文章,总结了几种关于空值的处理手法,希望对读者有帮助。  业务中的空值  场景 存在一个 UserSearchService用来提供用户查询的功能: public interface UserSearchService{ List<User> listUser(); User get(In ...

    阅读全文