-
前排声明:以下仅为个人(一枚菜鸡)观点,还请大佬轻喷。对比往届(24、25)年的软挑赛,本次大赛各方面都有不足:赛题设计:开放式的策略博弈退化成了一个确定性的算法题先说一下往届特点:2024年的智慧港口是一个多智能体调度的组合优化问题,具有NP性质,策略空间很多,往届有用贪心、启发式、模拟退火、甚至强化学习等完全不同的方法,而且互有胜负。2025年的分布式对象存储,包含磁头调度和数据放置,同样是开放式的多目标优化问题,策略维度极高。而今年的多边形重叠消除,是一个计算几何中的经典确定性问题,有明确的最优解,算法路线高度收敛。选手之间的差异主要体现在代码实现效率上(系个人愚见),而非策略层面的创新。本质上更接近ACM/OJ题目,而非往届那种"没有标准最优解、比拼策略组合"的工程挑战赛,比赛的区分度和观赏性大幅降低。分数设计:物理时间竟然包含在评分体系,这直接引入了不可控的随机性分数设计其实和赛题有很强的关联,这一点的说明其实还是想说明第一点的赛题设计问题。2024年的得分是游戏结束时累计资金。模拟世界运行15,000帧,每帧15ms决策时限,超时仅跳帧,不影响总分计算方式。关键资源约束是帧数预算(固定15,000帧)与轮船移动时间(泊位间固定500帧),均为逻辑时间,与物理机器性能无关。同一份代码在不同机器上得分一致(原则上,虽然有限时,但考察的是策略调度)。2025年得分比较复杂,好像是时间片和token消耗?但是都是抽象出来的逻辑单位,与物理CPU时钟完全解耦。同一份代码在任何机器上理论得分一致。今年 t 是选手程序的实际物理运行时间,T 是赛事方设定的标准用时。本地开发机与评测服务器的CPU型号、频率、负载状况不同,同一份代码的 t 值不同,导致本地无法准确预估线上得分(虽然数据集也不一样),这也是我觉得大赛今年的本地判题器不输出分数的原因,他好像也没法输出吧,线上的是不是根据评测样例指定的?本地测试自己的数据话,根本没法定T吧。往届的逻辑时间体系下不存在此问题。而且,比较物理时间天然偏向C/C++等编译型语言。往届的逻辑时间体系(帧/时间片/令牌)对所有语言一视同仁——你在一个时间片内能做多少决策取决于算法设计,主办方也说了给的时间限制尽可能满足各种语言的决策需求。今年虽然提供Java/Python等demo,但评分公式的时间项是否对各语言做了补偿?任务书中未说明。代码提交方式:单文件限制与工程实践简直背道而驰啊2024年和2025年支持CMake工程提交,选手可以合理组织多文件工程结构,体现模块化设计、头文件管理等基本软件工程素养。今年限定单文件提交(demo均为单个Solution.c/cpp/java/py),所有逻辑必须塞入一个文件。对于一个涉及计算几何的题目,代码量不会少,单文件约束导致(AI罗列):代码可读性和可维护性急剧下降、迫使选手放弃正常的工程组织方式、实际上鼓励了"用AI生成上千行单文件代码"的做法。赛事奖项中有"软件开发最佳实践奖",单文件怎么体现"最佳实践"?还是华为的软件都是全塞一个代码里的?戴佳伟都知道高内聚低耦合,这些软件工程核心理念难道华为的项目都不用的吗?更感觉像是在打oj了。赛事反馈与沟通:响应滞后,回避核心问题任务书纰漏在所难免,往届的赛事书也有几个版本。今年论坛上,许多有往届参赛经验的选手提出了关于评分公式公平性、物理时间影响、语言差异补偿等结构性问题,但赛事方回复迟缓,倾向于回答新手的基础问题,对核心争议避而不谈。论坛出现了请求重赛的声音,问题已不仅是个别选手的不满了吧。改进建议(AI生成)赛题设计:回归NP/开放式问题传统。若希望引入计算几何方向,可考虑二维排样优化(任务书背景已提及)等本身具备NP性质的问题,既贴合工业场景,又保留策略多样性。评分体系:将物理时间从得分公式中移除,设计抽象资源作为核心约束。如确需考量算法效率,可设置宽松的物理时间上限(超时判0分),而非将其作为线性加权项。分数稳定性:若评分不可避免涉及时间,应采取多次评测取中位数/去极值等方式降低波动,并公开评测环境具体的硬件规格。语言公平性 :若时间项保留,应明确公开各语言的时间补偿系数,或为不同语言设定不同的 T 值。提交方式:恢复CMake等多文件工程提交支持。若出于评测环境限制需要单一入口,可要求选手提交压缩包并指定构建脚本,而非强制单文件。本地可调试性:确保本地判题器能输出与线上一致(或近似)的分数,让选手有明确的优化反馈闭环。最后一点总结2024和2025年的赛题体现了华为软挑"工程思维+算法优化"的传统,而2026年的赛题在各维度上均出现了显著退步,核心原因还是题目设计不佳。往届的题目是真的有意思呀,从背景设定到一步步的策略探索,还有可视化的判题器,边写边调真的是乐在其中。今年不知道怎么说,希望赛事方能主动正面回答下同学们的问题,然后在后续赛季中能回归开放式问题设计理念。
-
经过年复一年的开发积累,企业的代码仓逐渐变得臃肿,甚至变成屎山代码。这些屎山代码,往往经过N个程序员之手,他们水平参差不起,风格不一。如何对这些屎山代码进行统一的管理,让它们可以被监控、评价和批量改造?建立“代码管理系统”的第一个难点在于,如何在庞大的代码仓中,快速的查找出具有某些特征的代码段。由于我们需要查找的是代码段,而不是代码行,用传统的正则表达式难以实现,需要通过语法解析器进行自定义语法配置,然后进行代码查找。 以小实例说明 : ### 实例1: 找出JAVA代码中,入参数量超过4个的函数:# 配置查找规则(Code_manage.syn)如下所示:__DEF_CASE_SENSITIVE__ Y __DEF_FUZZY__ Y __DEF_DEBUG__ N __DEF_LINE_COMMENT__ // __DEF_LINES_COMMENT__ /* */ __DEF_STR__ __NAME__ <1,200> [1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_$?? [0,199]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_?? [NO] import if else for while break continue class return try except finally final static public private __DEF_PATH__ __FUNCTION_DEF__ 0101 : x1 @ | public : x2 @ + private 0 0 : x3 @ CAN_SKIP | static 1 1 : x4 @ | __NAME__ : x5 @ | __NAME__ : x6 @ | ( 1111 : p1 @ CAN_SKIP | final : p11 @ | __NAME__ : p111 @ | __NAME__ : p2 @ | , : p22 @ CAN_SKIP | final : p222 @ | __NAME__ : p2222 @ | __NAME__ : p3 @ | , : p33 @ CAN_SKIP | final : p333 @ | __NAME__ : p3333 @ | __NAME__ NNNN : p4 @ | , : p44 @ CAN_SKIP | final : x444 @ | __NAME__ : x4444 @ | __NAME__ 1111 : xx @ | )# 假设java代码(MyCode.java) 如下所示:private int alreadyBufferedSize = 0; // The index in the byte[] found at buffers.getLast() to be written next private int index = 0; // Is the stream closed? private boolean closed = false; public FastByteArrayOutputStream(int initialBlockSize) { Assert.isTrue(initialBlockSize > 0, "Initial block size must be greater than 0"); this.initialBlockSize = initialBlockSize; this.nextBlockSize = initialBlockSize; } @Override public void applyBeanPropertyValues(Object existingBean, String beanName, int autowireMode, boolean dependencyCheck, int initSize) throws BeansException { markBeanAsCreated(beanName); BeanDefinition bd = getMergedBeanDefinition(beanName); BeanWrapper bw = new BeanWrapperImpl(existingBean); initBeanWrapper(bw); applyPropertyValues(beanName, bd, bw, bd.getPropertyValues()); } @Override public Object initializeBean(Object existingBean, String beanName) { return initializeBean(beanName, existingBean, null); }根据配置规则,执行查找命令: ZGLanguage -e Code_manage.syn -f MyCode.java可以得到结果:C:\>ZGLanguage -e Code_manage.syn -f MyCode.java Run type : Find Syntax file : Code_manage.syn code file : MyCode.java Output file : out.zgl -------------------------------------------------------------------- ### Found code by : __FUNCTION_DEF__ | Lines : 17 ~ 17 : -------------------------------------------------------------------- public void applyBeanPropertyValues(Object existingBean, String beanName, int autowireMode, boolean dependencyCheck, int initSize)可以看出,查找结果只输出了函数 applyBeanPropertyValues,它的入参数量为5个,其他2个函数的入参均不超过4个,因此被忽略。 ### 实例2: 提取SQL代码中的关联(on)和筛选(where)代码段:# 配置查找规则(Code_manage.syn)如下所示:__DEF_DEBUG__ N __DEF_FUZZY__ Y __DEF_CASE_SENSITIVE__ N __DEF_LINE_COMMENT__ -- __DEF_LINES_COMMENT__ /* */ __DEF_PATH__ __WHERE__ 1 : x1 | where : x2 | __PATH_4_EXPR__ __DEF_PATH__ __ON__ 1 : x1 | __\b__ : x2 + __\t__ : x3 + __\n__ : x4 | on : x5 | __PATH_4_EXPR__ __DEF_SUB_PATH__ __PATH_4_EXPR__ 1 : x1 | __SUB_PATH_EXPR__ : x2 + __ONE_PATH_EXPR__ __DEF_SUB_PATH__ __SUB_PATH_EXPR__ 1 : x1 | ( : x2 | __ONE_PATH_EXPR__ : x3 | ) __DEF_SUB_PATH__ __ONE_PATH_EXPR__ NN : @ | __NAME__ : @ + __INT__ : @ + __FLOAT__ : @ + __CASE_WHEN__ : @ + __STRING__ : @ + __CAST_AS__ : @ + __FUNCTION__ : @ + __SUB_PATH_EXPR__ : @ + = : @ + <> : @ + != : @ + > : @ + >= : @ + < : @ + <= : @ + . : @ + , : @ + + : @ + - : @ + * : @ + / : @ + || : @ + null : @ + between : @ + and : @ + or : @ + like : @ + in : @ STRING + not in : @ STRING + is null : @ STRING + is not null __DEF_STR__ __NAME__ <1,100> [1,1]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_?? [0,100]ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_?? [NO] select inner left join on from where group order by having union all with as table date time __DEF_STR__ __FLOAT__ <1,100> [1,50]0123456789 [1,1]. [1,50]0123456789 __DEF_STR__ __INT__ <1,100> [1,100]0123456789 __DEF_SUB_PATH__ __STRING__ 1 : x1 | ' : x2 | __ANY__ : x3 | ' __DEF_SUB_PATH__ __DECIMAL__ 111 : x1 | decimal 0 : x2 | ( 01 : x3 | __INT__ 00 : x4 | , 00 : x5 | __INT__ 01 : x6 | ) __DEF_SUB_PATH__ __VAR_NAME__ 1 : x1 | $ : x2 | { : x3 | __NAME__ : x4 | } __DEF_SUB_PATH__ __CASE_WHEN__ 1 : x1 @ | case N : x2 @ | when : x3 @ | __PATH_4_EXPR__ : x4 @ | then : x5 @ | __PATH_4_EXPR__ 1 : x6 @ CAN_SKIP | else : x7 @ CAN_SKIP | __PATH_4_EXPR__ : x8 @ | end __DEF_SUB_PATH__ __CAST_AS__ 1 : x1 | cast : x2 | ( 1 : x3 | __PATH_4_EXPR__ : x4 | as : x5 | date : x6 + int : n1 + double : n2 + float : n3 + bigint : x8 + __DECIMAL__ 1 : xx | ) __DEF_SUB_PATH__ __FUNCTION__ 1 : x1 @ | __NAME__ : x2 @ | ( N : x3 @ CAN_SKIP | __PATH_4_EXPR__ e : x4 @ CAN_SKIP | , 1 : x5 @ | )# 假设SQL代码(myproc.sql) 如下所示:CREATE OR REPLACE PROCEDURE PROC_F_CWWS_LOAN ( P_AS_OF_DATE IN DATE, RET_FLG OUT VARCHAR2, RET_MSG OUT VARCHAR2 ) IS -- 声明变量并初始化 V_COUNT NUMBER := 0; V_PROC_NAME VARCHAR2(200) := 'PROC_F_CWWS_LOAN'; V_PROC_DESC VARCHAR2(100) := 'xxxx业务数据ETL处理'; V_P_FREQ VARCHAR2(4) := ''; BEGIN --写入初始日志 INSERT INTO M_RUNLOG VALUES (SYSDATE, V_PROC_NAME, 'it is 1'); COMMIT; --设置会话日期格式 EXECUTE IMMEDIATE ' ALTER SESSION SET NLS_DATE_FORMAT = ''YYYY-MM-DD'''; --查询参数表中,该程序对应的频率值 SELECT P_FREQ INTO V_P_FREQ FROM ETL_PROC_STATUS_DEF WHERE PROC_NAME = V_PROC_NAME; --判断是调度频率 ETL.ETL_ADD_PARTITION('MA_F_LOAN', P_AS_OF_DATE, 'ETL'); --从还款计划表中取每笔账户最近一次小于等于数据日期还款日,作为上次还款日 INSERT INTO ETL.TMP_XD_LAST_PAYDATE (OBJECTNO, LAST_PAYDATE) SELECT OBJECTNO, LAST_PAYDATE FROM (SELECT T.OBJECTNO, MAX(TO_DATE(PAYDATE, 'YYYY-MM-DD')) LAST_PAYDATE FROM NYBDP.O_CWWS_ACCT_PAYMENT_SCHEDULE T WHERE T.AS_OF_DATE = P_AS_OF_DATE AND T.SEQID <> '999' AND TO_DATE(T.PAYDATE, 'YYYY-MM-DD') < P_AS_OF_DATE GROUP BY T.OBJECTNO); INSERT INTO M_RUNLOG VALUES (SYSDATE, V_PROC_NAME, 'it is 3'); COMMIT; MERGE INTO ETL.MA_F_LOAN A USING (SELECT /*+PARALLEL(8)*/ T.ACCOUNT_NUMBER, T.GL_ACCOUNT_ID, T.INT_GL_ACCOUNT_ID FROM ETL.MA_F_LOAN T INNER JOIN ETL.MA_D_GL_SUBJECT T1 ON T.INT_GL_ACCOUNT_ID = T1.SUBJECT_NO3 AND T1.SUBJECT_NAME3 LIKE '%已减值%' AND T1.AS_OF_DATE = P_AS_OF_DATE WHERE T.AS_OF_DATE = P_AS_OF_DATE AND T.ACCOUNT_NUMBER IN (SELECT ACCOUNT_NUMBER FROM (SELECT /*+PARALLEL(8)*/ T2.ACCOUNT_NUMBER, COUNT(1) FROM ETL.MA_F_LOAN T2 WHERE T2.AS_OF_DATE = P_AS_OF_DATE GROUP BY T2.ACCOUNT_NUMBER HAVING COUNT(1) > 1))) B ON (A.ACCOUNT_NUMBER = B.ACCOUNT_NUMBER AND A.AS_OF_DATE = P_AS_OF_DATE AND A.GL_ACCOUNT_ID = B.GL_ACCOUNT_ID AND A.INT_GL_ACCOUNT_ID = B.INT_GL_ACCOUNT_ID) WHEN MATCHED THEN UPDATE SET A.CUR_BOOK_BAL = 0, A.OVERDUE_BAL = 0; COMMIT; RET_FLG := '0'; RET_MSG := '执行成功'; EXCEPTION WHEN OTHERS THEN --写入异常日志 ETL.PROC_ETL_LOG(P_AS_OF_DATE,V_PROC_NAME,V_PROC_DESC,V_COUNT,-1,SQLCODE,SQLERRM); RET_MSG := SQLCODE || ':' || SQLERRM; END; /根据配置规则,执行查找命令: ZGLanguage -e Code_manage.syn -f myproc.sql可以得到结果:C:\>ZGLanguage -e Code_manage.syn -f myproc.sql Run type : Find Syntax file : Code_manage.syn code file : myproc.sql Output file : out.zgl -------------------------------------------------------------------- ### Found code by : __WHERE__ | Lines : 27 ~ 27 : -------------------------------------------------------------------- WHERE PROC_NAME = V_PROC_NAME -------------------------------------------------------------------- ### Found code by : __WHERE__ | Lines : 39 ~ 41 : -------------------------------------------------------------------- WHERE T.AS_OF_DATE = P_AS_OF_DATE AND T.SEQID <> '999' AND TO_DATE(T.PAYDATE, 'YYYY-MM-DD') < P_AS_OF_DATE -------------------------------------------------------------------- ### Found code by : __ON__ | Lines : 52 ~ 54 : -------------------------------------------------------------------- ON T.INT_GL_ACCOUNT_ID = T1.SUBJECT_NO3 AND T1.SUBJECT_NAME3 LIKE '%宸插噺鍊?' AND T1.AS_OF_DATE = P_AS_OF_DATE -------------------------------------------------------------------- ### Found code by : __WHERE__ | Lines : 55 ~ 56 : -------------------------------------------------------------------- WHERE T.AS_OF_DATE = P_AS_OF_DATE AND T.ACCOUNT_NUMBER IN -------------------------------------------------------------------- ### Found code by : __WHERE__ | Lines : 61 ~ 61 : -------------------------------------------------------------------- WHERE T2.AS_OF_DATE = P_AS_OF_DATE -------------------------------------------------------------------- ### Found code by : __ON__ | Lines : 64 ~ 66 : -------------------------------------------------------------------- ON (A.ACCOUNT_NUMBER = B.ACCOUNT_NUMBER AND A.AS_OF_DATE = P_AS_OF_DATE AND A.GL_ACCOUNT_ID = B.GL_ACCOUNT_ID AND A.INT_GL_ACCOUNT_ID = B.INT_GL_ACCOUNT_ID) WHEN MATCHED THEN UPDATE SET A.CUR_BOOK_BAL = 0, A.OVERDUE_BAL = 0可以看出,查找结果将 myproc.sql 代码中的 where 和 on 代码块及其所在行号提取出来。
-
import http from '@ohos.net.http';let client = http.createHttp()@Entry@Componentstruct Page { @State httpRequest: string = 'Hello World' private demoUrl = 'https://c4ebde166f0740acbcfcc853f7ecf9d7.apig.cn-north-4.huaweicloudapis.com/API_library_data_12' build() { Row() { Column() { Text(this.httpRequest) .onClick(()=>{ this.onRequestHttp() }) } .width('100%') } } onRequestHttp(){ client.request(this.demoUrl,(error,data:http.HttpResponse)=>{ this.httpRequest=data.result.toString() client.destroy(); }) }}
推荐直播
-
华为云码道-玩转OpenClaw,在线养虾2026/03/11 周三 19:00-21:00
刘昱,华为云高级工程师/谈心,华为云技术专家/李海仑,上海圭卓智能科技有限公司CEO
OpenClaw 火爆开发者圈,华为云码道最新推出 Skill ——开发者只需输入一句口令,即可部署一个功能完整的「小龙虾」智能体。直播带你玩转华为云码道,玩转OpenClaw
回顾中 -
华为云码道-AI时代应用开发利器2026/03/18 周三 19:00-20:00
童得力,华为云开发者生态运营总监/姚圣伟,华为云HCDE开发者专家
本次直播由华为专家带你实战应用开发,看华为云码道(CodeArts)代码智能体如何在AI时代让你的创意应用快速落地。更有华为云HCDE开发者专家带你用码道玩转JiuwenClaw,让小艺成为你的AI助理。
回顾中 -
Skill 构建 × 智能创作:基于华为云码道的 AI 内容生产提效方案2026/03/25 周三 19:00-20:00
余伟,华为云软件研发工程师/万邵业(万少),华为云HCDE开发者专家
本次直播带来两大实战:华为云码道 Skill-Creator 手把手搭建专属知识库 Skill;如何用码道提效 OpenClaw 小说文本,打造从大纲到成稿的 AI 原创小说全链路。技术干货 + OPC创作思路,一次讲透!
回顾中
热门标签