规避软件架构风险之反模式

在QCON大会上,Michael Nygard,以及 李伟专家都提到了一个概念,容错能力。

衡量软件架构最佳的一个很重要的因素就是看软件的容错能力。没有容错能力的软件,哪怕你QA都非常优秀,但一发生故障就出现集联失效,如同雪崩般,整个系统瘫痪,那么这样的一个系统也是个失败的架构。

那么如何做到能将错误降低到比较能接受的程度呢。其中有提到将各个服务components解耦合,这是个相当笼统的原则。那么作为一个开发者,在开发软件的过程中,怎么能做到更好的规避这方面的风险呢,设计模式就是用来解决这方面的问题,但系统的错误总是不可避免的,于是在与会者与Michael Nygard提问的过程中,引出另一个概念,那就是反模式。

上网查了下,反模式的概念在国外十年前就提出来了。在1998年出版的《反模式——危机中软件、架构和项目的重构》(AntiPatterns——Refactoring Software, Architectures, and Projects in Crisis。一书中的作者这样定义反模式:

反模式是描述对产生绝对负面结果的问题的一种常用解决方案的字面形式。

由于我们在软件开发过程中,利用反模式可以帮我们总结一些经常犯的规律性错误,研究这些错误,能让我们规避风险。

Bitter Java》里面提到对我们很有用的东西,关于反模式的步骤:

识别问题。在java编程中,问题可能是错误、性能问题、难于维护的类、不断增大的内存占用量。

建立模式。随着不断深入开发周期,修正一个错误的开销将成指数级上升。当你建立问题的模式时,你就给了自己在开发周期的更早阶段识别和修正更多问题的机会,你的获得也将数以倍计。使这个价值链向上移动的关键就在于建立模式,然后尽可能广泛地根据反模式操作。

重构代码。在这一步中,你将重构导致问题的代码。这一步是一个简单的错误修正,它适用于你迄今为止识别出所有问题实例。你应该花时间去做一个完整的修正,而不是仅仅打一个补丁了事。

宣传解决方案。你在这里确保碰到的问题的其他人懂得如何修正问题,并确保可能碰到陷阱的其他人知道要避开它。

修正过程。修正可以采用很多不同的方式。改进测试案例可以快速地识别衰退,修正每日过程或通信渠道可以在问题发生之前预防它们。补充编码标准几乎能够消除某些类型的编码错误,如关于放置花括号或注释的错误。

书中还这样总结:这些步骤采用的方法是从特定到一般。你找到错误,然后建立模式、修正错误,最后修正过程。将其中某些步骤与你的日常例行工作相结合可以使你成为更好的程序员。但是,请不要再这里停下来。请利用你的反模式知识来修正过程,继续使价值链向上移动,并让你整个公司的程序员都变得更棒,你还能可以发布反模式帮助你甚至不认识的程序员。

在这里,我还想补充下我自己的观点:

1.关于反模式的建立,是以经验为铺垫的。在经验不足的情况下,我们要做的是,能多善于总结我们开发所遇到的问题,形成自己的反模式。

2.前面提到的一个步骤建立模式,很有敏捷开发的味道。

3.反模式还传递给我们这样一个思想,简单设计,不为明天而设计的思想。

4.沟通也是反模式的一个旋律。敏捷开发的核心也是沟通。

5..反模式不仅仅是单纯为了解决问题,而是传递一种深入思考BUG,优化预防BUG渠道的思想。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用DC

timer里面尽量避免使用DC,不然会非常慢

wxPython做界面的适用性

wxpython 优点: 1. 提高了程序的可维护性 2. 界面布局可由专业人员设计 3. 更好的支持GUI布局设计工具 4. 作为wxWidgets的规范,XRC资源可通用于C、Python等语言 5. PYTHON脚本语言上手很快。 6. 分离界面布局和程序逻辑 7. 跨平台 缺点&…

ODBG常用快捷键总结

CtrlN 输入表查看。一般在没加壳的程序中能够解析出来。实践过程中&#xff0c;可快速定位到一些常用API&#xff0c;然后将其作为突破口。 AltM 内存查看。能快速定位不同模块的区段&#xff0c;能够设置某个模块的访问断点。 Alt<- 看见高手操作&#xff0c;能直接恢…

wPython环境安装

http://laochake.javaeye.com/blog/438667 关于版本问题&#xff0c;还是用最新最稳定就行。

__declspec(naked)和__asm编写实践总结

__cdecl 和 __stdcall 压栈参数顺序是一致的&#xff0c;但平衡堆栈方式不一样。 __cdecl调用函数方式是调用者&#xff0c;即函数外部平衡堆栈&#xff0c;一般是在函数外部调用add esp, xxxx&#xff0c;函数内部只需要ret返回就行 __stdcall调用函数方式是被调用&#xff…

逆向调试雷电思路总结

1.首先根据内存变化&#xff0c;能迅速找到飞机的生命&#xff0c;炸弹&#xff0c;分数&#xff0c;能够基本确认飞机结构。 2.找飞机位置有点困难&#xff0c;但可以查找飞机结构属性周围的内存变化找到飞机变化的坐标&#xff0c;这里有个小技巧&#xff0c;可以将内存十六进…

共享内存实践总结

经过实验得之&#xff0c;共享内存只有在两个进程同时存在的情况下映射才会成功 。 当共享内存在一个进程映射的情况下&#xff0c;此进程一旦销毁&#xff0c;共享内存即刻销毁,当第二个进程创建共享内存&#xff0c;会有新的共享内存空间。 另外console进程&#xff0c;在mai…

调试总结

1.调试程序之前不要放过每个细节&#xff0c;包括资源配置文件的所有东西都必须过一道两道或者三道&#xff0c;在这里发现的线索往往能让你调试事半功倍。 2.解析收包发包是基础&#xff0c;往往能跟到比较有价值的线索。 3.找结构体指针地址&#xff0c;想通过内存搜索来找…

sizeof

对于new出来的array sizeof()得到的只是指针大小 对于直接赋值的array sizeof()得到的就是整个数组的大小 memcpy的时候特别注意

关于栈实践总结

今天发了个帖&#xff0c;问栈位于进程空间的哪个位置&#xff0c;居然很多人都不清楚。本人用OD看了下就一目了然 进程结构示意图&#xff1a; 主线程堆栈 --临时变量都在里面主线程pe --GetModuleHandle(NULL)通过API得到的进程首地址在这个位置&#xff…

中文路径

混合编码编译选项不能读中文路径 需要设置为unicode编译选项wifstream ifs; ifs.read(参数1&#xff0c;参数2) 参数2传的是个数&#xff0c;跟Unnicode无关将参数1转化成ansic过后得到的string.size()跟参数2不一样。 所以取读取的长度还是用参数2PS: string.size()跟string.l…

通过VirtualQuery获取当前模块的句柄

HMODULE ModuleFromAddress( PVOID pv ){MEMORY_BASIC_INFORMATION mbi;if(::VirtualQuery(pv, &mbi, sizeof(mbi)) ! 0){return (HMODULE)mbi.AllocationBase;}else{return NULL;}} 得到的模块基地址HMOUDULE handle ModuleFromAddress((PBYTE)ModuleFromAddress)就是模块…

D3DLOCK写纹理遇到的问题

现象&#xff1a;以D3D_DISCARD方式来LockRect写入的显存数据在UnLock过后拷贝出来就崩溃&#xff0c;在一些机器出现而在某些机器就不会出现。 解决&#xff1a;判断游戏写纹理数据LockRect方式是D3D_DISCARD的话&#xff0c;在UnLockRect写完数据过后&#xff0c;就不对原来显…

去除ring3层的Debug标志

_asm{mov eax, fs:[0x18]mov eax, [eax0x30]mov dword ptr ds:[eax],0}

2011工作总结

1、编码能力 代码实践中&#xff0c;开始注重模型的概念。所谓模型打个比方&#xff1a;要做一台电视机&#xff0c;首先搞清楚你想怎么使用它&#xff0c;目的是让它看起来更方便易用。根据常规经验判断&#xff0c;电器需要电源、需要信号&#xff0c;这两点是必不可少。OK&a…

逆向调试完成端口回包实践总结

大概描述下完成端口的原理 一个套接字可以对应多个overlapped, 每个overlapped都由相应的一个线程来处理。而WSARecv绑定好了一个OVERLAPPED&#xff0c;WSARecv的调用会通知数据即将到来&#xff0c;同时将会触发某线程中的GetQueuedCompletionStatus函数调用完成&#xff0c;…

编码问题

从XML读进来的UTF8编码需要转一次到宽字符&#xff0c;宽字符再转化成窄字符。 在中文系统下面读中文&#xff0c;没问题。 但读韩文的时候&#xff0c;第二步就会出现丢失现象。 所以在国际化中&#xff0c;最好都统一用宽字符编码

zeromq

使用zeromq注意context是多个socket的集合。 频繁删除创建context会产生异常&#xff0c;估计是zeromq的bug&#xff0c;待分析

静态添加DLL

LordPE 这个工具能够直接静态添加DLL,这下更方便了具体步骤&#xff1a;1. 点击PE编辑器&#xff0c;打开要添加的exe2. 进入目录表&#xff0c;选择输入表一项&#xff0c;点击省略号3..进入添加DLL界面。选择要添加的DLL。dll必须有一个导出函数添加即可,最后保存

区块链读书笔记一

区块链的本质就是交易各方信任机制建设的一个完美方案。 为什么是完美方案&#xff0c;原因 其一&#xff1a;是用纯数学方法来解决信任机制。 其二&#xff1a;不需要借助任何第三方结构。 其三&#xff1a;建立信任关系的成本几乎降到了零。 关于区块链问题&#xff0c;这…