1)没有单纯意义上的好坏,一定要具体情况具体分析,满足了客户,老板,团队,大家共赢的,或者该赢的架构才是好的架构。
2)客户应该不会关注产品架构,满足它的需求,好用就行。老板会关注架构,重点在怎么减少投入,而最大化产出。团队是架构的直接受益者或受害者
3)能应付了需求变更的架构是极品架构
4)程序模块和网络服务的设计尽量功能单一,简单,利用脚本语言编织较为复杂的架构逻辑,架构可以随时改,模块一旦做成,就不要动。
5)好的架构可以成为一种平台,提供了一些常用的基础服务,且可以容易扩展功能,容易维护,容易修改和配置各个功能模块的基础平台。
6)因为软件就是现实世界的数字化表达,软件的艺术和生活的艺术是一样的。优雅,简洁,谦逊,宽容 ,人的品质会融入软件,所以,要做好一个软件工作者,先做好人。
7)好的架构是以最简单的方式满足现实的需求。变化是未知的,一般很难将一个架构设计好得足以满足未来未知的需求
变化,过分追求这种架构会另到系统过度设计(over
design)和复杂,复杂的系统相对于简单的系统更难变化。需求变化是驱动架构演进的重要原因之一。令我印象最深刻的是敏捷开发里的一句话:Fool
me once, shame on you. Fool me twice, shame on me.
相关推荐
用Pixhawk 2.4.8和PX4 1.13,从零搭建你的第一支无人机编队(附避坑清单)
本文详细介绍了如何使用Pixhawk 2.4.8飞控和PX4 1.13固件从零搭建低成本无人机编队系统。涵盖硬件选型、固件配置、多机通信和编队飞行逻辑开发的全流程,特别针对学生和爱好者提供实战验证的避坑方案,帮助实现多机协同飞行。
程序员不要总想着四两拨千斤
1. 程序员只是一个普通的职业 大概程序员选择入行时,都想着自己要从事的是一份高科技工作,所以从意识上就有意无意赋予了自身一些特殊的象征,但很多时候这种强加的意义让自己焦虑不已。 我经常在想,当李鸿章第一次面对美国的高楼大厦时,他心理是什么样的冲击感。 那些在清朝能建高楼大厦的人算不算高科技人才? 那些能建立现代船舶、火车、汽车的人算不算高科技人才? 我想在当时肯定算的,那么现在呢? 应该不算。 就如同之前大家会问:蚂蚁算是科技公司还是金融公司? 如果是金融公司,那么所有蚂蚁员工其实和传统的行业员工没有什么
Cocos Creator 3.x 实战:用脚本动态加载Spine动画,告别resources硬编码
本文详细介绍了Cocos Creator 3.x中Spine动画的动态加载与挂点系统实战技巧。通过Asset Bundle替代传统resources硬编码方式,实现资源的高效管理和热更新支持,同时结合TypeScript强类型和单例模式优化加载流程。文章还深入探讨了跨平台适配、挂点编程方案及性能优化策略,帮助开发者提升游戏开发效率与灵活性。
本地生活服务系统:试单和正式开业的单为什么会进同一本账
本地生活服务系统应将试营业与正式运营的订单统一记入同一账本,通过“试单标记”区分,而非分设两本账。单号连续、信息唯一,避免重复或遗漏。正式账单仅提取“非试单且已付款”的记录,确保财务核算准确。过程查询则可查所有单据,便于客服追溯。关键在写入时即标注试单状态,开业日调整取出条件,不修改历史标记,保障数据可审计、可复原。
VisionMaster图像源模块的5个隐藏功能:从自动切换到二次开发接口
本文深入解析了VisionMaster图像源模块的5个隐藏功能,从基础的自动切换与字符触发过滤,到高级的脚本扩展与基于COM组件的二次开发接口。这些功能能显著提升工业视觉项目的自动化水平、灵活性与系统集成能力,帮助开发者实现更高效的离线测试流水线和外部精确控制。
【CQUT】从零开始龙芯杯-开始前的准备
不同级别的Cpu对于vivado综合的时间有较大影响,其中Cpu的单核、多核性能以及cache性能影响权重较高。因此,为了保证学习进度和效率,我们建议在Cpu不低于I5 12400的环境下进行学习。Vivado2023.2安装包约100GB,为了保证成功安装建议留出300GB硬盘空间。龙芯杯的许多资料被托管在gitee,你需要git指令将资料克隆到本地。指定用书:CPU设计实战 Loongarch版 作者:汪文祥、邢金璋。Cpu性能对比网站:https://www.cpu114.com/
设计模式与生活⑰:空腹体检,单子领着人走
一年一度的体检,约在了周二。早上打完卡,没开电脑,先去体检机构——公司指定的那家。空腹,早饭留着查完再吃。前台登记,递身份证,领回一张指引单:姓名、条码,今天要查的项目按房间号排成一列。抽血、心电图、视力……单子一到手,人就被单子领着走了。先查哪项看哪边排队人少,但单子上的项目,一项落不下。去年也是这套流程。单子上的项目换了几样,走的科室还是那几个。身体还是这副身体,单子年年换。这事儿跟代码里的一种结构,是一回事。单子一到手,人就被单子领着走了今天聊的:元素稳定,操作多变;
耶鲁大学《博弈论》课程——逆向归纳
耶鲁大学《博弈论》课程——逆向归纳
从零开始的C++生活——第八讲——01
这个和之前学的二叉树的层序遍历区别在于,这个要求将二叉树每一层的数据分别插入最后返回的数组中,这就需要进行一个思考,之前常规思路实现层序遍历时是队列出一个进来他的孩子,但是这种方式必然会造成不同层元素之间的混淆,我采用的方法是再用一个队列,专门用来存储本层元素,当每次出原队列元素时都需要在新队列中记录一份,此外,还需要一个变量计算此时原数列中本层元素个数,其实就是当前的元素个数,因为是一层一层进去的。相信在写完这三道题后,你一定对栈和队列的基本使用有了了解,下一节就是栈和队列的模拟实现。
超详细!新手必看STM32-DMA配置与实验(串口使用DMA发送数据)
DMA就是:直接存储器访问。DMA传输数据从一个地址空间复制到另一个地址空间,提供在外设和存储器或者存储器和存储器之间的高速数据传输。
Allegro如何导出和导入器件模型Signal_Model操作指导
在用Allegro做PCB设计的时候,通常需要给器件加上Signal_Model,在做等长的时候用到的非常频繁。如下图,需要把R7002的Signal_Model导入到另外一块没有给R7002加好模型的BRD中。Allegro除了可以给器件添加模型,还支持从一块加好模型的BRD导入到另外一块BRD中,如何导出和导入器件模型Signal_Model操作指导。
第38章:ResNet+CBAM改进模型实战生活垃圾12分类
本文基于PyTorch实现ResNet+CBAM注意力模型,针对复杂场景下垃圾分类图像的遮挡、光照变化等问题,通过在ResNet各残差层后嵌入CBAM模块,实现通道与空间双重注意力增强,提升特征聚焦能力。项目包含数据预处理、迁移学习冻结策略、余弦退火优化、批量推理等全流程代码,支持12类垃圾识别,4600+图像数据集,开箱即用,完整记录训练日志与评估指标,显著提升模型在真实环境下的分类精度与鲁棒性。
生信分析进阶14 - 从GTF文件提取基因、转录本、TSS和TSE
从GTF文件提取基因、转录本、TSS和TSE
从零开始的C++生活——第八讲——02
当你想要获取第i个元素的时候,你需要拿到两个下标,一个是中控数组的下标,你需要知道它存放在哪个数组中,另一个是当前数组的下标,ptr[x][y]即是该元素,x的计算其实是用i/N,其中N是每个数组的大小,每个数组大小必须都是N,不然你计算会混乱。y的计算则是i%N。针对vector,它解决了扩容频繁以及空间浪费的问题,你一个数组存不下了,紧接着扩下一个数组就好,不会一下扩很多,而且vector在扩容时是需要大规模的拷贝数据的,deque也解决了这个问题,至于第二个缺点我一会再说。
win10 跳过U8环境检测的IE WebControls.rar
win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。
jdk-8u144-linux-x64.tar.gz.
该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包
从零开始的C++生活——第七讲——02
关于迭代器,由于你要进行操作符重载,所以我选择封装一个迭代器类,从底层的角度思考,你拿到任意一个类型的迭代器一般都是要访问迭代器所指向的空间的成员,所以我们其实应该拿到迭代器所指向节点的值,因此这也是一个模板类,而且,我们要对迭代器的解引用操作符和->操作符进行重载,重载即是分别拿到对应的值以及对应值的地址,除此之外,在遍历过程中我们需要对迭代器进行比较,因此需要重载==!增加的模板参数一个传T的引用,一个传T的地址,而const类型的迭代器则是传const T&和const T*。
android 蓝牙通讯demo
android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。
生活服务小程序开发案例:按行业接单、虚拟拨号与原服务人员复购
一次生活服务完成后,用户再次产生需求时,可能希望由熟悉情况的服务人员继续提供服务。平台需要处理的,不只是“再次下单”,还包括原服务人员是否愿意接单、拒绝后订单如何继续流转,以及服务完成后的评价和收益结算。围绕某公司的生活服务业务需求,海拔网络开展了一套微信小程序的定制开发,将服务预约、人员认证、行业接单、虚拟拨号、用户确认开始服务、评价和复购连接起来。本项目同时考虑首次预约与再次预约。普通订单进入接单大厅,由对应行业的服务人员承接;
豆包工作接入抖音生活服务经营等官方插件,AI从给建议到深入经营
商户完成相应账户授权后,无需在多个后台之间切换,通过自然语言对话即可查询数据、对比经营表现,并获得复盘报告与投放调整建议,部分场景还可由豆包工作直接创建广告、调整投放,不用再拿着建议回到后台逐项操作。此次三款插件的接入,让 AI 不再只停留在给建议,而是能跟着商家走完看数据、做复盘、调投放的完整经营流程。在门店经营环节,通过抖音生活服务经营插件授权登录后,通过读取成交、曝光等经营数据,豆包工作可以辅助商家按门店和时间周期进行同口径对比,并可生成含图表的复盘报告和行动建议。抖音生活服务经营插件页面。
设计模式与生活⑬:你坐几号线,谁来运营是另一回事
一到周五,小王的心情就会好一点。倒不是工作少了,而是想到这一天忙完,后面接着双休,心里就有盼头。地铁上,他抬头看标识,发现一件平时没留意的事:5 号线、10 号线常见的是“北京地铁”,4 号线却写着“京港地铁”。再想想,北京的机场也各有各的名字:首都机场、大兴机场。可在成都坐地铁,日常看到的统一称谓就是“成都地铁”。都是出行,名称和背后的主体并不完全一样。对乘客来说,常做的事还是那几样:查线路、进站、上车、到站下车。坐几号线是一条信息,谁来运营是另一条信息,不必揉成一团。同样是在北京坐地铁,线路和运营方并不
设计模式与生活⑭:一栋楼,共用一份热
今天是立冬。天气预报说夜里有暴雪,白天最高也就 4 度。早上起来,屋里比外面强不了多少。窗玻璃上蒙着一层水汽,摸一把暖气片,凉的。物业群里发了通知:今天开始试供暖,暖气片会慢慢热起来,顶层记得排气,边户留意自家热不热。隔了会儿再摸,暖气片上热下凉,温温的,不烫手。再晚一点,整间屋子总算有了点热乎气。一天里最踏实的一件事,是知道这栋楼里不只自己一户在等热。热力站烧的是一锅水,顺着管网送到每家,各家只管拧自己那个阀门。试供暖第一天,暖气片温而不烫今天聊的。
从零开始的C++生活——第六讲——02
看这个测试函数,由于我们初始化空间是4,那么再放第五个元素的时候会触发扩容,由于扩容,原先的迭代器就失效了,但是我们仍对*p的值进行修改,可能对你当前的程序没啥影响,但这是很恐怖的事情,因为你根本不知道*p到底操作了谁。我们把例子中的10u换成10,就会报这么一个错误,直接报到两个迭代器的构造函数上了,这里是因为类型最匹配,我们知道,当类型完全符合时优先不调用模板函数,但是10进来size_t会做一个隐式类型转换,编译器认为两个int这种情况刚好符合两个迭代器的版本,因此会直接匹配迭代器构造。
2000-2020-全球500米分辨率-三生用地(生产-生活-生态)空间分布数据
该数据集为2000–2020年全球500m分辨率生产-生活-生态空间分布图,基于GlobeLand30与NASA人口密度数据融合生成,经Google Earth验证,精度达83.94%以上(卡帕系数≥0.81)。数据涵盖农业生产、工业生产、城市/农村生活及森林、草地、水域等七类生态空间,以GeoTIFF格式存储,支持ArcGIS、ENVI等工具读取,填补了全球三生空间数据库空白,助力可持续发展目标评估。
从潮玩到宠物,情绪消费正在重塑6种生活方式
韧性生长——2025中国青年生活全景报告》在2026年1月的公开报道中显示,近九成受访青年有过为情绪价值付费的经历,其中46.8%将缓解压力焦虑列为相关消费动机,43.1%提到了被需要、被看见的心理满足。2026年艾媒咨询的《新生代市场消费者需求调研报告》显示,在其调查样本中,52.74%的受访者愿为盲盒、潮玩、二次元周边付费,43.23%经常购买零食、奶茶和咖啡等产品。消费者嘴上说喜欢,不代表一定会买。香薰的气味,饮料的口感,玩偶的触感,宠物用品的便利程度,旅行中的实际服务,都可能影响下一次选择。
消费返物业费小程序本地生活商家联盟社区商城本地同城多商户商城app源码
基于UniApp+ThinkPHP搭建的消费返物业费系统,支持社区、物业、商家、管家多方协同。业主消费可返抵物业费,提升满意度;物业增收增效,实现精细化管理。流程透明,模式可持续,构建智慧社区生态闭环。
从零开始的C++生活——第七讲——01
因为前边说过,list的迭代器是双向迭代器,不支持+-,而sort底层是快排,不论是挖坑法还是前后指针法还是霍尔,都是需要在两边区间找大找小的,少不了+-,所以list自己实现了一个。对于list的迭代器,它并不支持+-运算,因为内存空间不连续,所以你加减其实是没有意义的,但是它支持++--,虽然从语义理解这也是没有意义的,但显然是通过运算符重载使得自增自减达到我们想要的效果。然后remove其实就是删除,和erase不同的是,remove是删除值,erase则是删除对应位置。
纯血鸿蒙个人生活工具三件套实测:混合计算、睡眠记录与本地证件照
日常手机里总要装一堆小工具:算个账、看个睡眠、存张证件照。之前手机里装了好几个 App 凑合用,纯血鸿蒙出来后一直在找原生的替代方案。纯血鸿蒙原生开发、数据完全本地存储、不联网不收集隐私。用下来感觉刚好覆盖生活里最常见的三个小场景。
从零开始的C++生活——第九讲
我们知道,底层并没有头文件这个概念,预处理阶段头文件会展开,展开后你在头文件中进行的模板声明就会在主函数中被调用,程序此时并不报错,它认为你调用参数没问题,声明没问题,就是缺少了函数地址,后续补上即可,但是在后续链接阶段,由于你并没有将模板实例化,因此找不到地址,会导致报错。其实并不是,有两种情况还是需要手动实现仿函数的,第一:假如当前的类类型不支持比较大小,就需要实现仿函数进行比较,第二:比较的结果不尽如人意,比如你本来想比较指针所指向的空间,但默认比较的则是指针,这时候就需要仿函数进行比较。
402



被折叠的 条评论
为什么被折叠?



