自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(14)
  • 收藏
  • 关注

原创 如何防御CSRF攻击

http://tommwq.tech/blog/2020/12/28/2941会话和cookie会话(session)这一术语通常有两重含义。首先,会话表示客户端和服务器端之间的一系列交互。一次交互可以理解为一次请求-应答过程。在这一系列交互过程中,往往需要保存一些和交互有关的信息(比如登录信息),这些信息有时叫做通讯上下文(context)。会话也可以用来指代通讯上下文。出于安全性和性能的考虑,通讯上下文通常保存在服务器端。为了让服务器可以同时服务多个客户端,区分不同客户端的上下文,服务器为每个.

2020-12-28 01:43:39 847

原创 一种变更存储过程的方法

http://tommwq.tech/blog/2020/12/24/291存储过程难以使用版本管理,更新和回滚较为复杂。可以为存储过程在数据库中建立多个版本,然后封装一个facade存储过程。这样比对变更、更新、回滚等工作将变得更加简单。假设要新建存储过程foo。首先建立一个存储过程foo_20201224,执行具体的操作。然后建立存储过程foo,调用foo_20201224。create procedure foo (a int, b int)begincall foo_202012

2020-12-24 20:55:47 156

原创 如何对待技术债务

http://tommwq.tech/blog/2020/12/23/289现代软件系统都是采用分层式开发和模块式开发,每一层次的程序都是在更低层次模块的基础上构建的。比如Java程序在读写文件的时候,不会直接操作磁盘硬件,而是使用文件相关的类,这些类又调用操作系统提供的API接口。我们在开发的过程中,很少有从底层模块直接开始开发的,大部分时间是在已经存在的模块上进行修改,在历史代码的基础上工作。1历史代码:优质资产还是历史包袱?事物总是有两面的,一面是好的,一面就不那么好了。历史代码也是如此.

2020-12-23 21:01:25 122

原创 存储过程的使用场景

http://tommwq.tech/blog/2020/12/22/284决定是否使用存储过程,其实是在权衡:应当将计算移动到数据,还是将数据移动到计算。计算过程可以抽象为以下3个步骤:读数据,计算,写数据。或者说,操作=存取数据+计算。如果需要的数据量较大,存取数据容易成为瓶颈,这时应当将计算移动到数据。反之,如果需要的数据较少,但是计算较为复杂,应当将数据移动到计算。现在来看存储过程。存储过程运行在数据库中,数据移动距离短,但计算能力有限。因此适合于需要读取大量的记录,而计算规则相对简单的

2020-12-22 19:59:47 753

原创 自解释性

http://tommwq.tech/blog/2020/12/21/282程序源代码、配置、脚本等任何可能发生变化的东西,都应当具备一定的自解释性。自解释性让这些东西更容易被理解,因而更容易被修改,同时降低了在修改过程中引入错误的概率。有人觉得,我可以查文档,可以上网搜索。但在实际工作中,文档常常不能及时更新,而且未必有足够的时间和权限上网搜索。自解释性就是要求程序代码、配置、脚本能够充分清晰的表明自己的业务意图、业务步骤、参数类型、参数值范围、约束、修改方法等信息。对于程序代码,类和对象名字要反

2020-12-21 21:33:49 822 1

原创 领域驱动设计笔记

http://tommwq.tech/blog/2020/12/13/275这篇文章是阅读Thought Works中国知乎专栏DDD-领域驱动设计时记录的笔记。架构设计是以组件化为手段,实现关注点分离,从而降低局部性复杂度的一项软件设计工作。设计首先是要解决问题的复杂度,其次是要建立团队协作沟通的共识。达成这两点,根本目的在于让系统能够更快地响应外界业务的变化,并且使得系统能够持续演进。类似工业总线(ESB)这样的组件化其实是面向技术的,希望通过技术平台的灵活性来解决业务变化的多样性。虽然..

2020-12-13 18:53:32 158 1

原创 幂等性和实现方法

幂等性和实现方法 – tommwq.tech/blog如果一个操作重复执行多次,其效果(不考虑操作时间)和只执行一次是一样的,那么这个操作就叫做是幂等(idempotent)的。乍看起来,幂等操作似乎没什么用处,毕竟只有第一次执行有效。但如果在系统设计中考虑到“失败”场景的话,幂等操作是非常重要的。因为失败发生和感知失败发生是两件不同的事情。想象两个服务器进行通过网络进行通信。服务器A发送请求到服务器B,服务器B执行并将结果发送给A。在理想的情况下,一切执行顺利。我们从服务器A的角度来看看发生了什么。首

2020-12-09 11:38:16 311

原创 业务规则变更的三个层次

业务规则变更的三个层次 - tommwq.tech/blog业务规则按照变更的周期,可以分为三个层次:法律、法规和行业标准、市场变化产生的机会、产品设计人员对上述两项的理解。软件必须如何法律、法规和行业标准,否则可能受到严厉的惩罚,或者导致兼容性、互操作性上成本的增加。法律、法规和行业标准的变化频率较低,通常以年为单位。法律通常以5-10年为周期进行修改。法规和行业标准通常是3-5年修订一次。在法律、法规和行业标准不变的情况下,随着市场的变化,业务线的重心可能发生调整。比如在信用扩张周期,银行可

2020-12-07 11:53:49 333

原创 软件复杂度的来源

软件复杂度的来源 - tommwq.tech/blog软件复杂度的来源:业务逻辑、用户规模、性能要求。软件是为了承载业务而创建的。复杂的业务逻辑必然导致复杂的软件。但是除了业务逻辑之外,用户规模和性能要求,也会导致软件复杂度的增加。如果不考虑执行效率,单纯从逻辑上看,软件能够做的事情,人也可以完成。我们可以把人在执行业务流程时的状态作为参考。比如一个客户到银行申请开立账户,服务人员是如何执行业务流程的呢?他首先会查看客户的身份证件,确认客户的身份。接着检查客户是否在黑名单上。然后检查客户提交的资料是

2020-12-07 11:53:14 423 1

原创 在Spring JPA中配置多数据源

http://tommwq.tech/blog/2020/12/04/262在Spring JPA中配置多个数据源并不复杂,只需要为每个数据源声明一个@EnableJpaRepositories。如果程序只使用一个数据源,通常在入口类添加注解@EnableJpaRepositories,不需要任何参数。然后写好配置spring.datasource.*就可以了。但是如果需要多个数据源,就要为每个数据源声明一个@EnableJpaRepositories。@EnableJpaRepositoreis根

2020-12-04 23:17:33 1258

原创 伪技术变更

伪技术变更 – tommwq.tech/blog业务变更和技术变更的区别是:业务变更会改变项目相关方的利益,而技术变更不会。如果开发团队收到业务变更后,直接安排开发,软件将不断收到缺陷反馈。因为相关方的利益在他们不知情的情况下发生了变化。最近就看到了一个伪技术变更。为了推广App,公司做了扫码下载功能。老用户生成一个二维码推荐给新用户。新用户扫码并下载软件后,老用户可以获得一些积分。需求变更是这样的:新用户扫码之后,增加一个手动输入老用户ID的步骤。如果ID有效,积分将根据ID分配给用户,而不是分配

2020-12-04 15:52:34 79

原创 Git Flow简介

Git Flow简介 – tommwq.tech/blog1分支git工作流使用多个分支来完成版本管理工作。这些分支包括master分支、develop分支、feature分支、release分支和hotfix分支。1.1master分支master分支是一个长周期分支。1.2develop分支develope分支是一个长周期分支。develop分支维护正在开发中的代码。develop分支从master分支创建。当开发新功能时,开发者从develop分支创建feature分支进...

2020-12-02 11:50:47 198

原创 火星人敏捷开发手册笔记

http://tommwq.tech/blog/2020/12/01/254Scrum敏捷开发方法Scrum敏捷开发过程由多个冲刺(sprint)组成,每个冲刺表示一次迭代,周期通常是2-4周。在进入冲刺之前,产品负责人(product owner)需要提供一个产品待开发项(product backlog),这是一份从客户价值理解和描述的产品功能条目。开始冲刺后,第一天要召开冲刺计划会议(sprint planning meeting)。产品负责人按照优先级逐一对功能进行讲解,开发团队就需求细节和完

2020-12-01 22:37:50 250

原创 编写有效用例笔记-第十四-二十二章

编写有效用例笔记-第十四-二十二章 – tommwq.tech/blog第十四章 CRUD和参数化用例基于数据库操作的、关于实体创建、检索、修改、删除的小用例叫做CRUD用例。CRUD用例可以作为独立的用例,也可以组合成一个概要级别的实体管理用例。采用哪种方式需要根据具体情况分析。对于大多数情况,使用实体管理用例的方式更好,更有利于管理用例。在捕获用例时,有时会发现一些用例是对不同对象执行相同的操作,比如“搜索客户”和“搜索商品”。这样的用例可以一般化为参数化用例。第十五章 业务过程建模

2020-12-01 11:42:29 128

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除