程序常用的设计技巧

一、背景

程序的定义:程序=数据+算法+接口

二、常用技巧

技巧1 - 按目标设计接口做幂等设计

场景

背景:做任务赚积分。前端发出增加积分请求,如果收不到响应会重试。

后台开发人员:怎么判断是重试还是另一次请求?

解决方案:接口定义中需要传入原来积分是多少,增加到多少。开发人员直接将目标结果入库。

疑问:那实际生产环境发现了原来积分一样,增加到多少不一样的结果怎么办?

答疑:这说明上线的产品中肯定有漏洞或bug。怎么办?改bug呗!

- 解析

幂等性设计的定义:一次和多次请求某一个资源应该具有相同的副作用。直白点讲就是多次重试可以多次查询,但是修改更新应该只进行一次。

作为开发正确的观念应该是外部调用失败是常态,并且失败之后必然有重试。

不要靠巧合编程  --《程序员修炼之道》

技巧2 - 多版本并发控制解决并发问题

- 场景

背景:上文中的做任务赚积分,后台收到了增加积分请求。

开发人员:为了避免重试,我该怎么写代码呢?

解决方案:update XXX set score=XX where score=X

- 解析

多版本并发控制MVCC(MultiVersion Concurrency Control)的定义:该策略主要使用update with condition(更新带条件来防止)来保证多次外部请求调用对系统的影响是一致的。这也是「乐观锁」的主要思想。

乐观锁的定义:假设最好的情况,数据在变更的时候不会被别人更新,如果更新了,某个值就会改变。所以就用这个值来作为判断条件,只有条件为真才更新成功。

总是为并发进行设计  --《程序员修炼之道》

技巧3 - 预判断准入控制避免「箭头型」代码

- 场景

背景:上文中后台收到了增加积分请求,传入了一个负数的积分。

开发人员:我就if 正数 才往下执行就好了呀?

结果:一层层的判断下来,代码变成这个样子。

疑问:怎么解决这种复杂的「箭头型」代码问题呢?

答疑:「卫语句」在预判断时做准入控制。

- 解析

卫语句(guard clause)的定义:先对异常情况做检查,异常则直接返回。

最终一个请求被完美的分成预判断检查和正式执行两个部分,逻辑清晰,简单明了。

早重构,常重构  --《程序员修炼之道》

技巧4 - 异步设计分离响应和执行

- 场景

背景:上文的增加积分,并发量太大,因此采用了队列设计,大量请求排队等待数据库变更。

开发人员:这样后台接口部分很容易都在等着响应,服务被拖死。

解决方案:准入校验做充分,请求放到队列里后直接给用户返回操作成功。

疑问:万一最后失败了呢?

答疑:知道失败了还不修数据吗?数据补偿保证最终与对用户承诺一致撒。

- 解析

1/3/5秒原则:在1s以内得到响应,用户会觉得系统响应很快,体验非常好;1-3秒得到响应,用户可以接受,体验还不错;3-5秒才响应,用户就感觉慢了,体验有点糟糕;一旦响应超过5秒,用户就会认为是个失败的体验,选择离开或重新发起请求。

三、总结

思考!你的工作!  --《程序员修炼之道》

相关阅读:

相关阅读:

《程序员修炼之道》解读

到底多大才算高并发?

美团分布式服务通信框架及服务治理系统OCTO

原文地址:https://www.cnblogs.com/xiexj/p/10436254.html

时间: 2024-11-09 06:35:44

程序常用的设计技巧的相关文章

关于程序常用功能小技巧 - 配置

序 这位同事在哭爹骂娘啊...以前的代码,一个ConnectionString竟然配置也那么多次,而且设置代码里面还有,my god把数据库连接池搞死了... 文 估计大多数人也都如此,入门的时候都喜欢用“很硬”公司AppSetting,的确很方便&Easy.些许时间后得用点“牛逼”的实现Section...,或者整个xml... 大约大概我就那么过去,直到做游戏的时候. ——一个游戏(譬如说捕鱼机)一会儿一个人,一会儿6个人,甚至其他的搞不清楚多少人,写代码也烦人,弄个集合算了,读文件读到好多

五种常用的算法设计技巧之二:分治算法

一,介绍 分治算法主要包含两个步骤:分.治.分,就是递归地将原问题分解成小问题:治则是:在解决了各个小问题之后(各个击破之后)合并小问题的解,从而得到整个问题的解 二,分治递归表达式 分治算法一般都可以写出一个递归表达式:比如经典的归并排序的递归表达式:T(N)=2T(N/2)+O(N) T(N)代表整个原问题,采用了分治解决方案后,它可以表示成: ①分解成了两个规模只有原来一半(N/2)的子问题:T(N/2) ②当解决完这两个子问题T(N/2)之后,再合并这两个子问题需要的代价是 O(N) 递

DevExpress Report 其他常用设计技巧

原文:DevExpress Report 其他常用设计技巧 1 设置默认的打印纸张及页边距 选择Report-打开属性窗口,设置默认边距(Margins)和默认纸张(PaperKind). 2 修改Report Preview的默认工具栏(WinForm) 一般情况下,Report 的Preview视图中的工具栏不用修改就可满足使用.但是当想修改或添加新的按钮执行自己的方法时就需要修改Preview工具栏了. 2.1 获取默认工具栏 DevExpress.XtraBars.Bar bar = R

【转】 FPGA设计的四种常用思想与技巧

本文讨论的四种常用FPGA/CPLD设计思想与技巧:乒乓操作.串并转换.流水线操作.数据接口同步化,都是FPGA/CPLD逻辑设计的内在规律的体现,合理地采用这些设计思想能在FPGA/CPLD设计工作种取得事半功倍的效果. FPGA/CPLD的设计思想与技巧是一个非常大的话题,由于篇幅所限,本文仅介绍一些常用的设计思想与技巧,包括乒乓球操作.串并转换.流水线操作和数据接口的同步方法.希望本文能引起工程师们的注意,如果能有意识地利用这些原则指导日后的设计工作,将取得事半功倍的效果! 乒乓操作“乒乓

【转载】算法设计之五大常用算法设计方法总结

转载自http://blog.csdn.net/zolalad/article/details/11393915 算法设计之五大常用算法设计方法总结 一.[分治法]  在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)--等.任

硬件工程师需要知道的8个软件设计技巧

嵌入式系统设计不仅要了解硬件还应该了解它与软件之间的相互影响和作用.硬件设计需要一定的设计范例,这点对于软件设计却不那么适用.如何从单纯的硬件设计过渡到硬软结合的设计,在你着手开发软件时需注意以下八个软件设计技巧. ??1.设计控制流程图 ? ? ? ??工程师进行到开发软件这一步时会情不自禁地开始书写代码.这种思维定势就像在原理图还未完成之前就开始尝试画PCB.当着手开发软件时,克制写代码的冲动,取而代之的应该是软件流程结构图表的设计,这点非常重要.流程图能清晰地呈现给开发人员软件的各个需要的

Swing程序最佳架构设计—以业务对象为中心的MVC模式(转)

前言: 我打算写一系列关于Swing程序开发的文章.这是由于最近我在做一个Swing产品的开发.长期做JavaEE程序,让我有些麻木了.Swing是设计模式的典范,是一件优雅的艺术品,是一件超越时代的产品! 有机会作Swing软件的开发,让我非常有感觉! 呵呵,希望有机会能够用Java3D编写软件,那种感觉一定更棒! Java和Swing都是杰作.我这个人对别人一向很挑剔的,能够得到我由衷地赞誉,可想而知它们有多优秀了.奇怪的是,它们居然一直都无法占领桌面市场.有人说这是技术的原因.我认为这应该

用户界面设计经验分享:界面设计技巧分享

如此有用的文章我已记不得是什么时候发现的了,但在看完的那一刻便想将之翻译,分享给大家自己也受用. 时间过了很久,来到了2014年,终于静下心来花了大把时间连同图片一起译成了中文.像我这样业余的翻译六级分数只够及格的程序员,不敢说做到信雅达,但求意思到位. 1 尽量使用单列而不是多列布局 单列布局能够让对全局有更好的掌控.同时用户也可以一目了然内容.而多列而已则会有分散用户注意力的风险使你的主旨无法很好表达.最好的做法是用一个有逻辑的叙述来引导用户并且在文末给出你的操作按钮. 2 放出礼品往往更具

Google和Baidu常用的搜索技巧--转

原文链接:http://mp.weixin.qq.com/s?__biz=MjM5NTY0MTY1OQ==&mid=2654509772&idx=1&sn=754454e3740070236fa7b05fb474010b&chksm=bd395a988a4ed38e436eade5d7ac7bdafa8aa4062b5ea1cc0cb28cfeb18b228a992ae518f65c&scene=0#wechat_redirect 学计算机的,在学习的过程中,肯定会