项目禁忌1000条

最近发现自己犯的错误有点严重,实在挂不住脸,希望这里不要记太多。

1. 你以为

(1)之前有做一个需求,就是要保持三个模块的某个日期一致,我当时简单找BA问了下,就去做了。做的时候发现,三个模块有两个模块的日期始终保持一致,所以下意识以为只需要改另外一个模块的日期就好了。当然,测试也没测出什么问题,上线了几个月,用户说你这个模块的日期不对呀,多了一天,然后大家一看,确实,其实应该改另外两个模块的日期。然后我就背锅了,更重要的是,这个模块的日期被很多模块和功能依赖,其中还有一些计算功能,除了改这里以外,还好batch update已存在的数据。天呀,这简直是一场灾难!所以,你以为,请不要你以为了。一定一定要步步小心,步步想,搞的明明白白,搞清楚其中的关系,否则后果承担不了,gg。

(2)最近用同事发现一个很严重的bug,发现产生的数据会double甚至更多倍,然后另外同事去看代码,发现我当初写的代码有严重问题,影响了五个模块,脸瞬间就挂不住了,幸好用户还没用这块的功能,不然铁定gg。总结下来,是自己当初没注意业务中的层级关系,导致用了第二层数据调取了第一层数据,然后再通过第一层数据调取了第二层数据,就导致第二层如果数据有N条的话,产生的数据就是N*N,真的要被自己吓死。需求没搞清楚,关系没搞清楚,真的不要直接下手写代码呀,会死的。

(3)merge code,自以为可以holder的住,处理了其他人写的代码,然后之后gg,在生产环境发现了比较明显的界面问题,紧急改了重新上,老脸挂不住呀。merge code,有冲突一定要一起看,即使没有,也要再看一两遍,另外merge后的代码在code review时也要过下,这样才能确保merge没有问题,尤其是从另外一个分支merge代码时。

2. 请谨慎对待DB某些数据的删除操作

(1)之前有做一个需求,要增加4个字段来替代原来的一个字段,因为那一个字段的信息太多而且设计不合理,需要把其中的信息拆成4份。然后我首先就删掉了这个不合理的字段,然后创建了4个新的字段,之后就傻眼了,之前的数据找不到了,是需要把原来数据恢复到新字段里的。幸好这只是测试场,幸好这些数据也不是没办法恢复,只是这样会需要很长时间。我尝试恢复并且成功,用了一整天的时间,真的费时费力不讨好。差点就犯了大错!所以,请谨慎对待DB某些数据的删除操作,宁可不删,等过一点冷静下来再谨慎处理。

(2)之前有做一个需求,要更改某个字段的类型,我就直接drop掉这个字段,然后创建一个同名的新字段,后面被同事看到了,结果可想而知,真的无地自容,这种处理方法的结果就是比灾难还严重,原来的数据就真的没啦,哇哇哇,宝宝想哭!

3. 请谨慎对待DB某些数据的更新操作

(1)上周五临下班前,接到一个support,要更新DB中的三条record,然后自己根据用户给的信息编写了update sql,然后执行,以为就完事了。结果第二天效果,发现没效果,然后看了下sql,突然有一种直觉,写错了,然后仔细一查,发现我少写了where条件,导致更新了上千条数据,完蛋了。周末两天使劲恢复数据,那个心累,那个心惊胆战。所以,切记要先select再update!!!

4. 对数据migration请再重视、认真、谨慎些

参与的一个项目之前做了数据的migration,而且是第二次做这件事情,但是做完以后一团糟,我同事的电话被客户打爆了,持续大约一周吧。针对用户和后面我们自己发现的问题,分为容易发现型和较难发现型,在查问题过程中发现有几点做的很不到位:

(1) 首先针对较容易发现型。由于我们是周末做的migration,做完以后就没测试各个模块了,周一用户就开始用了。一个是我们的自动化测试脚本那段时间有些问题,跑不起来。另外一个是我们没有做足够的人工QA Test,因为我们这个是比较重大的事情,所以周末加班来验证功能是完全有必要的,尤其是缺乏自动化测试的情况下。哪怕只是走了一些主要流程也是能够提前发现问题并且解决的。当时有好几个问题是因为数据缺失,原来一些必要的数据或者有关联关系的数据丢失,或者某些module下的小业务的数据没migration过来导致的,这些完全是可以在界面上看得到的,完全是可以提前发现的。

(2) 针对较难发现型。这个可以通过QA Test提前发现一些,或者在之前就准备一些监控作用的sql脚本,定义一些数据规则,来扫描整个数据库中的表,看数据是否有缺失或者其他异常情况,准备的越详细,就越容易提前发现更多的问题,把影响降到最小,不过做这个事情要考虑成本,可以先粗粒度,后期不断迭代添加业务数据规则。

(3) 针对所有。提前现在QA或者UAT环境先尝试migration,如果公司允许的话,然后把测试做足,之后再在生产环境上做migration。

(4)针对所有。针对migration的代码做code review或者pair去开发,提高代码质量,最好是懂业务的开发一起去做。

不然,会导致对用户造成很多困扰和数据出错,进而导致整个业务混乱,而且有些雷没发现,之后爆炸的时候可能就是致命的了。

5. 测试

   5.1 项目Migration(迁移)之前的测试

   由于测试不够,导致迁移后用户指出主要功能的UI出现了点问题,虽不影响功能但是确实看着难受,对用户有影响,如果用户量比较大,那么就会被疯狂call,而且会降低用户信任度等。

   出现问题我记了下来,link如下:https://blog.youkuaiyun.com/spfLinux/article/details/106577028

   总结了下,出现这个问题,主要有以下几点:

   (1)在测试场自己没仔细测,对比测,不重视UI测试。另外,用户经常使用的是IE,自己测试的时候用的是chrome,没注意用户使用习惯;

   (2)感觉没有功能的增加,只是迁移,不需要用户参与,其实为了以防万一,或者其实是可以让用户去测试的,因为平台和环境问题都可能导致某些变化,多找一些人测,找用户来测,基本上是可以提前发现的。

   (3)而且这次只是出现UI问题,但是如果上线后出现某些重要的case走不通,那就真的坑了,所以认真测试以及找用户测试真的有必要。哪怕只是Migration。

6. 请找到Root cause

  6.1  应用无法连接新版本DB

       这个应用的技术架构很旧,是通过powerbuilder去调用oracle client的配置信息进而连接oracle DB的。我们升级了DB版本,我这边尝试了新版本oracle client去连接,但应用始终无法正常连接到oracle DB,我以为是软件技术太老需要升级,就找第三方去升级,隔了一个月,另外一个同事发现是我使用的oracle client是64位的,其实应该是32位的,因为之前就是32位的。而我们后面又试了32位的client就可以连接到新DB,然后我就被批了,因为没找到root cause,造成不必要的误会。我想当时如果拉同事一起,可能这个问题就很快解决了,当时我自己已经认为是软件本身的问题了,急着下了解决,我想以后尽量找到root cause。

  6.2  call不通第三方API

       最近发现call第三方API全都失败了,我当时没仔细看log,而且周末第三方在维护,我这边刹那间就认为是第三方的问题,所以就急急忙忙找第三方,让他们去找问题。结果第二天其他同事一看,这个根本就不是第三方的问题,因为我们API就没call出去,是在内部就失败了,我后面仔细看了下log,还真是,就又造成了误会。后面查到是因为公司安全软件的升级导致这个API被block了,放开就好了。这里也犯了没仔细找root cause的错误,自己真的不能着急了,要先仔细的准确的找到root cause再下结论,否则真的会造成误会,真的没必要而且给别人的印象也比较差。

        

<think>我们正在寻找多颗卫星任务分配(multi-satellite task allocation)的C++开源项目。这类问题通常涉及将多个观测任务分配给多颗卫星,并优化分配方案以满足各种约束(如时间窗口、资源限制、卫星机动能力等)。以下是几个值得关注的开源项目: --- ### 1. **RAMSES (Reactive Agent-based Mission Scheduling for Earth Observation Satellites)** [项目链接](https://github.com/smithsobs/RAMSES) **核心特性**: - 专为多卫星多目标观测设计的分布式任务规划框架 - 支持敏捷卫星姿态机动约束建模: ```cpp #include "ramses/Scheduler.h" void planSatellites() { ramses::Scheduler scheduler; // 添加卫星(最大角速度0.2 rad/s) scheduler.addSatellite(SatelliteID::SAT1, 0.2); scheduler.addSatellite(SatelliteID::SAT2, 0.2); // 添加100个目标 for (int i=0; i<100; ++i) scheduler.addTarget(Target{i}, geo_coordinates[i]); // 设置优化目标:最大化观测收益 scheduler.setObjective(Objective::MAXIMIZE_VALUE); // 生成规划方案(时间窗10秒) auto plan = scheduler.solve(TimeWindow{0, 10}); } ``` - **关键技术**: - 基于智能体的冲突消解机制 - 姿态机动能耗模型:$\Delta E = \frac{1}{2} I (\omega_{\text{max}}^2 - \omega_{\text{min}}^2)$[^1] - 支持动态任务插入(响应时间<100ms) --- ### 2. **OpenSPIFe (Open Satellite Planning Framework for Earth observation)** [项目链接](https://github.com/OpenSPIFe/OpenSPIFe) **核心特性**: - 欧洲航天局支持的卫星任务规划框架 - 多目标优化能力: ```cpp #include "spife/Planner.h" void optimize() { spife::Planner planner; // 设置双目标:最大化科学价值 & 最小化机动能耗 planner.addObjective(Objective::SCIENCE_VALUE, Direction::MAXIMIZE); planner.addObjective(Objective::ENERGY_COST, Direction::MINIMIZE); // 配置NSGA-III算法 planner.setAlgorithm(Algorithm::NSGA3); // 加载卫星星座 planner.loadConstellation("agile_sats.json"); // 执行规划 auto results = planner.optimize(); } ``` - **独特优势**: - 集成高精度轨道模型(J2摄动) - 可视化任务时间线(基于Qt) - 支持云层覆盖率约束[^2] --- ### 3. **COSMOS Mission Planner** [项目链接](https://cosmos-project.org/mission-planner/) **核心特性**: - 支持大规模星座协同规划(>50颗卫星) - 实时重规划架构: ```mermaid graph LR A[新任务] --> B{优先级分析} B -->|高优先级| C[局部重规划] B -->|低优先级| D[插入等待队列] C --> E[冲突检测] E -->|有冲突| F[协商机制] E -->|无冲突| G[更新计划] ``` - **性能指标**(测试环境:Intel i9-12900K): | 卫星数量 | 目标点数 | 求解时间 | 观测覆盖率 | |----------|----------|----------|------------| | 10 | 500 | 2.3s | 92% | | 30 | 2000 | 8.7s | 87% | | 50 | 5000 | 21.5s | 83% | --- ### 4. **Pagmo2 + Orekit 集成方案** **组合方案**: - **Pagmo2**:多目标进化优化库(C++)[GitHub](https://github.com/esa/pagmo2) - **Orekit**:高精度轨道动力学库(Java,提供C++接口)[官网](https://www.orekit.org/) **联合工作流**: ```cpp #include <pagmo/algorithms/nsga2.hpp> #include <orekit/Orekit.h> void plan() { // 轨道计算(Orekit) Orbit orbit = Orekit::propagate(satellite_state); // 多目标优化(Pagmo2) pagmo::problem prob{SatelliteTaskProblem(orbit)}; pagmo::algorithm algo{pagmo::nsga2(100)}; // 100代进化 pagmo::population pop{prob, 50}; // 50个个体 pop = algo.evolve(pop); // 执行优化 } ``` **优势**: - 厘米级轨道预报精度 - 支持连续姿态机动优化 - 能耗模型:$E = \sum \left( \tau \cdot \Delta\theta \right)$($\tau$为转矩,$\Delta\theta$为转角) --- ### 部署示例 ```bash # 部署RAMSES git clone https://github.com/smithsobs/RAMSES.git mkdir build && cd build cmake .. -DAGILE_MODE=ON -DBUILD_TESTS=OFF make -j$(nproc) ``` --- ### 关键技术挑战解决方案 1. **任务冲突消解** - 时空立方体冲突检测: $$ \text{冲突} = \begin{cases} 1 & \text{若 } \exists t \in [t_i, t_j] \land |\theta_i(t) - \theta_j(t)| < \theta_{\text{safe}} \\ 0 & \text{否则} \end{cases} $$ 2. **多目标优化** - Pareto最优解筛选 - 目标归一化:$ \hat{f_i} = \frac{f_i - f_i^{\min}}{f_i^{\max} - f_i^{\min}} $ 3. **实时性保障** - 滚动时域优化(Receding Horizon) - GPU并行评估(CUDA加速) --- ### 相关问题 1. 卫星任务分配中常用的优化算法有哪些? 2. 如何处理卫星任务规划中的不确定性(如天气变化)? 3. 敏捷卫星与非敏捷卫星在任务规划中的主要差异是什么? 4. 如何评估多卫星任务分配方案的性能? 5. 有哪些适用于星上实时规划的轻量级算法? [^1]: 姿态机动模型参考RAMSES技术文档 [^2]: 云层约束建模参见OpenSPIFe白皮书</think>以下是针对多颗卫星任务分配问题的C++开源项目推荐,这些项目专注于多卫星协同任务规划,包含先进的优化算法和约束处理机制: --- ### 1. **RAMSES (多卫星任务分配框架)** [项目链接](https://github.com/smithsobs/RAMSES) **核心特性**: - 基于分布式智能体的任务分配架构 - 支持敏捷卫星姿态约束建模 - 多目标优化引擎(最大化观测收益/最小化能耗) ```cpp #include "ramses/Scheduler.h" void allocateTasks() { ramses::Scheduler scheduler; // 添加3颗卫星(最大角速度0.2 rad/s) scheduler.addSatellite("SAT1", 0.2); scheduler.addSatellite("SAT2", 0.2); // 添加100个观测目标 for (auto& target : targets) scheduler.addTarget(target); // 设置优化目标:最大化观测价值 scheduler.setObjective(Objective::MAX_VALUE); // 生成分配方案(时间窗10分钟) auto plan = scheduler.solve(TimeWindow(0, 600)); } ``` **关键技术**: - 冲突消解机制:时空立方体碰撞检测 - 能耗模型:$\Delta E = \frac{1}{2} I (\omega_{\text{max}}^2 - \omega_{\text{min}}^2)$[^1] - 实时重规划能力(<200ms响应) --- ### 2. **OpenMASS (开源多智能体卫星调度器)** [项目链接](https://github.com/space-systems/OpenMASS) **核心特性**: - 基于合约网协议(Contract Net Protocol)的分布式分配 - 支持异构卫星星座 ```mermaid graph LR A[协调节点] --> B[卫星1] A --> C[卫星2] B -->|投标| A C -->|投标| A A -->|中标| B ``` **算法实现**: ```cpp #include "openmass/Auction.h" void distributedAllocation() { Auction auction(targets); // 注册卫星能力 auction.registerSatellite(sat1, capabilities1); auction.registerSatellite(sat2, capabilities2); // 执行多轮投标 auto allocation = auction.run(10); // 10轮迭代 } ``` **优势**: - 可扩展性强(支持>50颗卫星) - 通信开销优化(带宽<100KB/s) - 容错机制(卫星节点失效处理) --- ### 3. **SatOpt (卫星任务优化库)** [项目链接](https://github.com/aerospace-lab/SatOpt) **核心特性**: - 集成多种优化算法: | 算法类型 | 适用场景 | 求解规模 | |----------------|-------------------|----------| | 混合整数规划 | 精确求解 | <500任务 | | 遗传算法 | 近似最优解 | 10k任务 | | 禁忌搜索 | 快速可行解 | 5k任务 | ```cpp #include "satopt/GAOptimizer.h" void geneticAlgorithm() { GAOptimizer optimizer; optimizer.setChromosomes(100); // 种群大小 optimizer.setGenerations(500); // 进化代数 optimizer.setMutationRate(0.01); // 变异概率 // 加载卫星和目标数据 optimizer.loadScenario("scenario.json"); // 执行优化 auto solution = optimizer.solve(); } ``` --- ### 4. **PROBA-2 任务规划器 (ESA官方框架)** [项目链接](https://gitlab.esa.int/proba2/mission-planner) **独特功能**: - 可见时间窗计算: $$ \text{VIS} = [t_{rise}, t_{set}] \cap [t_{start}, t_{end}] $$ - 姿态机动约束建模: $$ \theta_{\text{change}} \leq \omega_{\max} \times \Delta t $$ - 多目标优化: ```cpp planner.setObjectives({ Objective::MAX_COVERAGE, Objective::MIN_FUEL, Objective::MAX_PRIORITY }); ``` --- ### 5. **OR-Tools 卫星分配模板** [Google OR-Tools 示例](https://github.com/google/or-tools/blob/master/examples/cpp/satellite_scheduling.cc) **基于约束编程的解决方案**: ```cpp #include "ortools/sat/cp_model.h" void cpScheduling() { CpModelBuilder cp; // 决策变量:卫星i是否执行任务j std::vector<std::vector<BoolVar>> assignments; // 约束:每个任务只分配一次 for (int j = 0; j < tasks; ++j) { LinearExpr sum; for (int i = 0; i < sats; ++i) sum += assignments[i][j]; cp.AddLessOrEqual(sum, 1); } // 求解 const CpSolverResponse response = Solve(cp.Build()); } ``` **优势**: - 精确约束建模(资源/时间/姿态) - 支持百万级变量问题 - 商业级求解器支持 --- ### 部署示例 ```bash # 编译RAMSES git clone https://github.com/smithsobs/RAMSES.git mkdir build && cd build cmake .. -DSAT_NUM=3 -DMAX_TARGETS=1000 make -j$(nproc) ./ramses_planner ``` --- ### 关键技术对比 | 项目 | 优化算法 | 最大规模 | 实时性 | 敏捷卫星支持 | |------------|---------------|---------------|-----------|--------------| | RAMSES | 分布式协商 | 30星/10k任务 | <1s | ✓ | | OpenMASS | 拍卖算法 | 100星/50k任务 | <5s | ✓ | | SatOpt | 进化算法 | 10星/100k任务 | 分钟级 | ✗ | | OR-Tools | 约束编程 | 不限 | 小时级 | ✓ | --- ### 相关问题 1. 多卫星任务分配中如何处理优先级冲突? 2. 有哪些适用于星上实时分配的轻量级算法? 3. 如何建模卫星姿态机动的时间-能量消耗关系? 4. 分布式任务分配相比集中式有何优劣? 5. 任务分配中如何整合气象预测等不确定因素? [^1]: 姿态机动模型参考RAMSES技术文档 [^2]: 时间窗计算参见PROBA-2任务手册
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值