[人月神话_6] 另外一面 | 一页流程图 | 没有银弹
另外一面(The other face)
计算机程序是人类向机器传递信息的一种方式,为了确保意图能够被无言的机器准确理解,程序采用了严格的语法和精确的定义。(这就需要 我们有严密的逻辑思维)
- 然而,除了作为机器执行指令的载体之外,程序还承载着另一层意义——它向用户讲述一个“故事”。
- 即便是为个人使用而编写的程序,这种沟通也是必不可少的,因为随着时间的流逝,即使是原作者也可能逐渐忘记程序的具体细节。
(所以 测试和 文档编写,在软件工程中和开发一样重要)
对于面向公众的应用程序而言,由于用户与开发者在时间和空间上的距离,文档的重要性尤为突出。
- 良好的文档不仅帮助用户理解软件的功能,还能延长软件的使用寿命,并克服开发者在面对紧迫的时间表时可能产生的惰性。
- 我们都有过这样的经历:面对那些文档简陋的程序,心中不免会埋怨那些远在他方、未曾谋面的作者。
在为什么巴比伦塔会失败?(Why Did the Tower of Babel Fail?)一章中,提到项目工作手册的重要性。
- 在本章“另外一面”(The Other Face)中作者指出,虽然编写代码是软件开发的核心活动,但创建高质量的文档同样至关重要。
- 文档不仅对于用户理解和使用软件很重要,而且对于维护和未来的开发者来说也是必不可少的资源。
与其继续空谈文档的重要性和特性,不如直接展示如何才能创作出优秀的文档。
- 接下来的部分将侧重于具体的操作指南,而不是理论上的讨论。
- 我们将探讨实际步骤和技巧,帮助开发者们写出既实用又吸引人的文档,从而提高软件产品的整体质量和用户体验。
需要什么样的文档
为了满足不同用户的需求,文档应当提供不同程度的详细信息。
对于偶尔使用的用户、依赖程序执行关键任务的用户以及需要根据具体需求调整程序的高级用户,文档都应具备相应的深度和广度。
以下是创建全面且有用文档的关键要素:
1.目标与功能
- 主要功能:明确说明软件的核心作用。
- 开发背景:阐述开发该程序的原因及其解决的问题。
2. 运行环境
- 硬件配置:列出所需的处理器、内存等最低要求。
- 操作系统:指定支持的操作系统版本。
- 其他软件依赖:任何必需的库或框架。
3. 功能范围
- 输入限制:定义可接受的数据类型及范围。
- 输出展示:说明合法的显示结果及其格式。
4. 实现细节
- 算法描述:精确解释程序逻辑和所用算法。
- 技术实现:提供对核心组件的简要说明。
5. 输入输出规范
- 格式定义:给出所有输入/输出的具体格式标准。
- 示例数据:提供实例以帮助理解格式要求。
6. 操作指南
- 基本操作:介绍如何启动程序及基础使用方法。
- 异常处理:说明遇到错误时的应对措施。
7. 用户选项
- 可用设置:列举程序提供的各种选项。
- 选择指导:为用户提供选择适合其需求选项的建议。
8. 性能指标
- 预期时间:基于特定条件下的运行时间预估。
- 性能优化:提出可能的性能瓶颈及改进方向。
9. 精度与验证
- 精度水平:设定结果的精确度目标。
- 测试方法:详述如何验证计算结果的准确性。
测试用例
- 常规测试:覆盖日常使用场景的案例。
- 边界值测试:检验极端情况下的表现。
- 非法输入测试:确保软件能够妥善处理不合规的数据。
修改指南
- 架构图解:提供系统结构或流程图。
- 算法详解:完整描述算法逻辑。
- 文件管理:解释项目中各文件的作用。
- 数据流分析:概述数据处理流程。
- 设计考量:讨论原设计时考虑的修改点及未来扩展性。
- 缺陷记录:记录已知问题及其解决方案。
通过上述内容,不仅能够给予最终用户清晰的操作指引,还能为开发者维护和升级软件提供有力支持。
编写这类文档时,力求简洁明了的同时保证信息的全面性和准确性至关重要。
流程图
流程图在程序文档中经常被过度推崇,但实际上,并非所有程序都需要它们,且很少有程序需要超过一页纸的详细流程图。
- 流程图的主要作用是展示程序的逻辑结构和判断流向
- 但当流程图过于复杂,不得不分页并使用编号出口和连接符时,其整体清晰度就会大打折扣。
( 所以画流程图时,要做到 清晰凝练)
一页纸流程图的价值
一页纸内的流程图能够优雅地展现程序的基本结构和步骤,同时易于绘制。
- 它对于初学者理解算法思维很有帮助,但对于经验丰富的开发者来说,这种详细的流程图往往显得过时且繁琐。
- 随着高级编程语言的发展,很多原本需要通过流程图来表达的细节已经可以直接通过代码实现
因此,流程图中的许多元素变得多余。
流程图的实际应用
- 教育工具:对于初学者,流程图有助于培养逻辑思考能力。
- 设计辅助:在项目初期,简要的流程图可以帮助团队成员快速理解程序架构。
- 沟通媒介:在跨部门或与非技术人员交流时,流程图可以作为直观的说明工具。
实践中,经验丰富的程序员通常不会在编写代码前绘制详尽的流程图。
- 很多时候,这些图表是在开发完成后为了满足文档要求而补做的。
- 一些组织甚至使用自动化工具从现有代码生成流程图,这实际上反映了对流程图实际用途的一种重新评估。
自文档化(self-documenting)的程序
数据处理的基本原则告诉我们,将信息分散在多个文件中并保持同步是一项极其繁琐且容易出错的任务。
- 更合理的方法是让每个数据项包含所有必要的信息,并通过指定的键值进行区分,然后整合到单一文件中。
- 然而,在编写程序文档时,我们却常常违反这一原则,试图维护机器可读的代码和一系列描述性文本及流程图。
- 这种做法导致了文档质量低下以及更新不及时的问题。
(1) //QLTH JOB ...
(2) QLTSRT7: PROCEDURE (V):
(3) /**********************************************************************
/*A SORT SUBROUTINE FOR 2500 6-BYTE FIELDS, PASSED AS THE VECTOR V. A */
/*SEPARATELY COMPILED, NOT-MAIN PROCEDURE, WHICH MUST USE AUTOMATIC CORE*/
/*ALLOCATION. */
/* */
/*THE SORT ALGORITHM FOLLOWS BROOKS AND IVERSON, AUTOMATIC DATA PROCESSING,
/*PROGRAM 7.23, P. 350. THAT ALGORITHM IS REVISED AS FOLLOWS: */
/*STEPS 2-12 ARE SIMPLIFIED FOR N=2. */
/*STEP 18 IS EXPANDED TO HANDLE EXPLICIT INDEXING OF THE OUTPUT VECTOR. */
/*THE WHOLE FIELD IS USED AS THE SORT KEY. */
/*MINUS INFINITY IS REPRESENTED BY ZEROS. */
/*PLUS INFINITY IS REPRESENTED BY ONES. */
/*THE STATEMENT NUMBERS IN PROG. 7.23 ARE REFLECTED IN THE STATEMENT */
/*LABELS OF THIS PROGRAM. */
/*AN IF-THEN-ELSE CONSTRUCTION REQUIRES REPETITION OF A FEW LINES. */
/* */
/*TO CHANGE THE DIMENSION OF THE VECTOR TO BE SORTED, ALWAYS CHANGE THE */
/*INITIALIZATION OF T. IF THE SIZE EXCEEDS 4096, CHANGE THE SIZE OF T, TOO.*/
/*A MORE GENERAL VERSION WOULD PARAMETERIZE THE DIMENSION OF V. */
/* */
/*THE PASSED INPUT VECTOR IS REPLACED BY THE REORDERED OUTPUT VECTOR. */
/**********************************************************************/PROCEDURE (V);
/* A SORT SUBROUTINE FOR 2500 6-0 T FIELDS */
DECLARE CH, IVDEE1;
DIMENSION T(0:8190), V(*);
T(0:8190) INITIALIZED WITH INFINITY; DO L = 0 TO 4095 T(L) = NEHF;
END; DO L = 4095 TO 8190 T(L) = PINT;
END; K1 = 1;
DO WHILE (T(K1) != INFINITY) J = SCAN_BRANCHES_FROM_NODE(K1); IF (T(J) <= T(J+1)) THEN REPLACE_WITH_SMALLER_BRANCH; ELSE HANDLE_HIGHER_LEVEL_NODE; END IF; K1 = NEXT_INDEX;
END DO; OUTPUT_VECTOR = T(STORAGE_INDEX);
为了解决上述问题,建议采用“自文档化”的方法,即将文档直接整合进源代码中。
- 这种方法不仅促进了文档的即时更新,还确保了用户能够方便地获取所需资料。
- 随着高级语言的发展,将文档与代码合并成为了一种更加自然的选择。
自文档化作为一种文档编制的新方法,其核心思想在于减少不必要的文档负担,同时提高文档的质量和可用性。
- 通过充分利用现代编程语言特性,结合良好的编码习惯,自文档化能够在大多数项目中得到广泛应用。
- 这不仅是技术进步的体现,也是以人为本设计理念的具体实践。
- 最终,它有助于创建更加高效、易维护的软件系统。
没有银弹-软件工程中的根本和次要问题
软件开发的核心挑战在于构建一个由复杂的抽象概念组成的结构
这要求开发者不仅能够准确捕捉和表达这些抽象的逻辑实体,而且还需要在现实的物理和技术限制内将它们转换成计算机可以执行的指令。
软件项目中的“人狼”现象与银弹的追寻
在作者国度的民间传说中,最令人胆寒的妖怪莫过于人狼——这些生物能在瞬间从熟悉无害的模样转变为令人畏惧的怪物。
- 软件开发领域同样存在着类似的“人狼”特性,尤其是在非技术背景的管理者眼中:一个看似简单、明了的项目,却可能悄然转变成一个进度滞后、预算超支且布满缺陷的庞然大物。
- 面对这样的挑战,业界内外都响起了寻找“银弹”的呼声——一种能够像计算机硬件成本降低一样,彻底解决软件成本问题的神奇解决方案。
没有银弹
尽管计算机科学和技术在过去几十年有了巨大的进步,但并没有找到一种能够迅速、大幅度提高软件开发生产力的解决方案——即所谓的“银弹”。
- 作者认为,虽然技术的进步可以解决一些附属性问题,但对于本质性问题,我们还没有找到有效的应对办法。
- 因此,在可见的未来,我们不太可能发现一个能显著缩短开发时间或大幅减少成本的“银弹”。
是否一定那么困难呢?
- 软件开发的挑战,并非源于其自身发展的缓慢,而是被计算机硬件快速进步所衬托出的相对滞后。
- 在过去的三十年间,计算机硬件的性价比提高了六个数量级,这样的飞跃在人类历史上任何其他产业中都是前所未有的。
- 硬件从手工装配向流水线生产的转变,带来了成本降低和性能提升的双重红利,而软件却未能复制这一成功模式。
- 软件开发面临的困难可以分为两类:内在的(即固有的复杂性)和次要的(当前生产过程中遇到的问题)。本节将聚焦于前者——那些根植于软件本质中的障碍。
复杂度
软件系统的复杂度是其最显著的特征之一。
- 它不仅体现在规模上,更在于各个组成部分之间的相互作用。
- 每个软件元素都是独一无二的,几乎不存在完全相同的代码片段。
- 与物理世界中的实体不同,软件系统通过添加新的、不同的元素来扩展,而非简单重复已有组件。
- 这些新增加的元素以非线性的方式交互,导致整个系统的复杂度呈几何级数增长。
数学和物理学可以通过简化模型来研究现象,但当复杂度本身成为问题的核心时,这种方法便不再适用。
一致性
与物理学家寻求自然界的统一法则不同,软件工程师面对的是由人为设计的接口和惯例构成的复杂环境。
- 这些接口随着时间演变,给软件的一致性带来了巨大挑战。
- 为了确保兼容性,开发者必须遵守多种多样的标准和协议,而这进一步增加了系统的复杂性。
任何试图简化这些复杂特性的尝试都会受到限制,因为它们本质上是为了维持与其他系统的协调一致。
可变性
软件的生命历程充满了变化的需求。
- 成功的软件产品往往需要不断地适应用户需求的变化和技术环境的演进。
- 相比于工业制造品,软件更容易修改,这既是它的优势也是负担。
- 用户对新功能的渴望以及底层硬件平台的更新换代,都迫使软件持续进行调整。
即使是最基本的功能也可能因为外部因素的影响而发生改变,使得软件始终处于动态之中。
不可见性
最后,软件的无形性构成了另一个重大挑战。
- 不同于建筑图纸或机械制图,软件缺乏直观的表现形式。
- 尽管我们尝试用图表来描绘软件结构,但这些图形往往是多维度且高度抽象的,难以捕捉到所有关键信息。
- 控制流、数据流、依赖关系等多种要素交织在一起,形成了一个复杂的网络。
这种不可见性不仅阻碍了个人的设计思考,也限制了团队成员之间的有效沟通。
软件开发中的三次重大突破及其局限
回顾软件领域最具影响力的三次进步——高级语言、分时系统和统一编程环境,我们可以看到它们如何显著改善了软件构建的效率与质量。
然而,这些改进主要针对的是非本质性的挑战,而非软件固有的复杂性。
1. 高级语言:抽象层次的飞跃
高级语言无疑是软件开发史上的一次革命。它
- 通过提供更高层次的抽象,极大地提升了程序员的工作效率、代码的可靠性和简洁性。
- 具体来说,高级语言使开发者能够专注于业务逻辑,而无需关心底层硬件细节,如寄存器操作或位级指令。
- 这种抽象不仅减少了程序中不必要的复杂度,还提高了代码的理解性和维护性。
但是,高级语言并非适用于所有场景。对于那些不常用到复杂语言特性的用户,反而可能增加学习曲线和思维负担。此外,尽管高级语言简化了许多任务,但并没有根本改变软件的本质复杂性,比如处理大型系统的内在难度。
2. 分时系统:即时反馈的力量
分时系统的引入显著缩短了程序开发周期中的等待时间,使得开发者可以在更短的时间内完成编译、调试和测试等环节。
- 这不仅提高了工作效率,更重要的是保持了开发者的思路连贯性
- 避免因长时间中断而导致的记忆丢失和重新适应成本。
- 不过,分时系统的提升也有其上限。
- 当响应时间接近人类感知的极限(约100毫秒)时,进一步缩短时间所带来的边际效益将变得微乎其微。
因此,分时系统虽然解决了批处理模式下的低效问题,但它并不能触及软件开发的核心难题。
3. 统一编程环境:工具集成的革命
集成开发环境(IDE),如Unix和Interlisp,通过提供统一的文件格式、管道机制以及丰富的库支持,大大简化了不同工具之间的互操作性。
- 这种环境允许开发者轻松地创建、调用和组合各种工具,从而促进了生产力的极大提升。
- 统一编程环境的成功之处在于它消除了共同使用程序时的技术障碍,激发了更多创新工具的诞生。
然而,这些改进仍然属于优化层面,未能直接解决软件开发中的根本性挑战,如复杂系统的管理和不可见性的克服。
银弹的希望
- 现有的所谓“银弹”技术更多的是针对软件开发过程中的一些非核心障碍提供了不同程度的帮助,而未能从根本上解决软件固有的复杂性问题。
- 未来的软件开发仍需探索新的方法和技术,以应对那些深层次的挑战。
相关文章:
[人月神话_6] 另外一面 | 一页流程图 | 没有银弹
另外一面(The other face) 计算机程序是人类向机器传递信息的一种方式,为了确保意图能够被无言的机器准确理解,程序采用了严格的语法和精确的定义。(这就需要 我们有严密的逻辑思维) 然而,除了…...
GO学习指南
GO学习指南 主题一 go语言基础知识讲解 go语言面向对象编程 go语言接口详解 go语言协程 后续内容请大家持续关注,每月一主题,让各位读者能零基础、零成本学习go语言...
【机器学习】逻辑回归
文章目录 一、逻辑回归概述1.定义2.原理 二、Sigmoid函数三、梯度上升算法四、实验1.代码2.运行结果3.实验小结 一、逻辑回归概述 1.定义 Logistic回归是一种广义线性回归(generalized linear model),因此与多重线性回归分析有很多相同之处…...
Nginx配置与命令
Nginx 配置文件基础 全局块(Main Context):配置影响全局的参数,如用户、进程数、日志路径等。 user nginx; # 运行Nginx的用户和组 worker_processes auto; # 工作进程数(通常设为CPU核心数&…...
测试--测试分类 (白盒 黑盒 单元 集成)
一、按照测试目标分类(测试目的是什么) 主类别细分说明1. 界面测试UI内容完整性、一致性、准确性、友好性,布局排版合理性,控件可用性等2. 功能测试检查软件功能是否符合需求说明书,常用黑盒方法:边界值、…...
工作流介绍
了解工作流对大模型进行高质量工作的辅助意义学会复现吴恩达博士的翻译工作流开源项目了解构成大模型工作流系统的关键元素学会搭建一个更复杂的业务场景工作流 一、为什么我们需要工作流? ❓ 什么样的职场打工人是合格的打工人? 反应快,理…...
学习黑客Active Directory 入门指南(五)
Active Directory 入门指南(五):管理工具、安全基础与学习路径 🛠️🛡️📚 大家好!欢迎来到 “Active Directory 入门指南” 系列的最后一篇。在前四篇中,我们已经全面探讨了Active…...
【第三篇】 SpringBoot项目中的属性配置
简介 SpringBoot支持多种配置文件格式,包括application.properties、yml和yaml等。本文章将详细介绍这三种配置文件的内容格式和详细用法,以及在程序中如何对配置文件中的属性进行读取。文章内容若存在错误或需改进的地方,欢迎大家指正&#…...
处理金融数据,特别是股票指数数据,以计算和分析RSRS(相对强度指数)
Python脚本,用于处理金融数据,特别是股票指数数据,以计算和分析RSRS(相对强度指数)指标。以下是代码的逐部分解释: 1. **导入库**: - `pandas`:用于数据处理和CSV文件操作。 - `numpy`:用于数值计算。 - `ElasticNet`:来自`sklearn.linear_model`,用于线性…...
C++面试2——C与C++的关系
C与C++的关系及核心区别的解析 一、哲学与编程范式:代码组织的革命 过程式 vs 多范式混合 C语言是过程式编程的典范,以算法流程为中心,强调“怎么做”(How)。例如,实现链表操作需手动管理节点指针和内存。 C++则是多范式语言,支持面向对象(OOP)、泛型编程(模板)、函…...
Linux云计算训练营笔记day10(MySQL数据库)
Linux云计算训练营笔记day10(MySQL数据库) 目录 Linux云计算训练营笔记day10(MySQL数据库)ifnull别名聚合函数group byHAVING 子查询关联查询 ifnull 在DQL语句中可以使用函数或表达式 函数 IFNULL(arg1,arg2) 如果arg1为NULL,函…...
深度解析:AWS NLB 与 ALB 在 EKS 集群中的最佳选择
前言 AWS 提供多种弹性负载均衡器,包括应用程序负载均衡器 (ALB)、网络负载均衡器 (NLB)、网关负载均衡器 (GWLB) 和经典负载均衡器 (CLB)。本文重点介绍 ALB 和 NLB,因为它们是 EKS 集群最相关的选项。 在确定合适的负载均衡器类型时,需要…...
nginx模块使用、过滤器模块以及handler模块
一、如何使用nginx的模块 1.ngx_code.c: #include "ngx_config.h" #include "ngx_conf_file.h" #include "nginx.h" #include "ngx_core.h" #include "ngx_string.h" #include "ngx_palloc.h" #include "n…...
基于PageHelper的分页查询
基于PageHelper的分页查询 ‘PageHelper是基于java的一个开源框架,用于在MyBatis等持久层框架中方便地进行分页查询操作。它提供了一组简单易用的API和拦截器机制,可以帮助开发者快速集成和使用分页功能。 PageHelper的主要功能包括: 分页…...
Linux518 YUM源仓库回顾(需查)ssh 服务配置回顾 特定任务配置回顾
计划配仓库YUM源 为什么我在/soft文件夹下 使用yum install --downloadonly --downloaddir /soft samba 为什么文件夹下看不到samba文件 exiting because “Download Only” specified 计划过 计划配SSH 参考 ok了 计划配置特定任务解决方案 code: 两端先配好网络 测试好s…...
AI 制作游戏美术素材流程分享(程序员方向粗糙版)
AI 制作游戏美术素材分享(程序员方向粗糙版) 视频讲解: 抖音:https://www.douyin.com/user/self?from_tab_namemain&modal_id7505691614690561295&showTabpost Bilibili: https://www.bilibili.com/video/BV1ojJGzZEve/ 写在最前面: 本方法比较粗糙,只对对美术风…...
山东大学计算机图形学期末复习12——CG13下
CG13下 BSP树 BSP (Binary Space Partition)表示二叉空间分割。 使用这种方法可以使我们在运行时使用一个预先计算好的树来得到多边形从后向前的列表,它的复杂度为O(n)。 它的基本思想是基于这样一个事实:任何平面都可以将空间分…...
Muduo网络库大总结
Muduo网络库大总结 目录 目的知识储备IO模型 阻塞与非阻塞五种IO模型 epoll原理 select/poll的缺点epoll的优势LT与ET模式 Reactor模型muduo核心模块扩展功能 目的 理解阻塞、非阻塞、同步、异步的概念掌握Unix/Linux五种IO模型深入理解epoll原理及优势掌握Reactor模型设计学…...
LLMs:《POE报告:2025年春季人工智能模型使用趋势》解读
LLMs:《POE报告:2025年春季人工智能模型使用趋势》解读 导读:2025年5月13日,该报告基于 Poe 平台的用户数据,分析了 2025 年春季人工智能模型的使用趋势。报告指出,人工智能格局快速演变,通用文…...
机器学习(13)——LGBM(2)
一、LightGBM算法简介 (一)背景 机器学习中的树模型 在机器学习领域,基于树的模型(如决策树、随机森林、梯度提升树等)是非常重要的算法类别。它们具有很强的可解释性,能够很好地处理非线性关系ÿ…...
翻到了一段2005年写的关于需求的文字
那时的俺还很稚嫩,很多东西都不懂。 另外 hfghfghfg其实是俺的一个马甲,早年间在delphibbs时用的。 来自:hfghfghfg, 时间:2005-01-20 13:16, ID:2971188我到客户那里的情况 一边要和他聊天 一边改报表。 一张报表 …...
MCP - Cline 接入 高德地图 Server
文章目录 一、准备1、注册、认证高德开放平台账号2、创建应用、获取 Key3、用量管理2、Cline 配置模型 二、接入三、测试官方测试 - 出行规划专属地图 四、关于 高德 MCP Server - AI时代的出行服务中台1、产品定位2、技术架构亮点3、核心API能力矩阵4、开发者优势5、典型应用场…...
Linux的MySQL头文件和找不到头文件问题解决
头文件 #include <iostream> #include <mysql_driver.h> #include <mysql_connection.h> #include <cppconn/statement.h> #include <cppconn/resultset.h> #include <cppconn/prepared_statement.h> #include <cppconn/exception.h&g…...
进程和线程的区别和联系
二者概念 进程 运行起来一个程序就会在操作系统产生一个或多个进程 进程属于软件资源。 进程是操作系统中资源分配的基本单位。 每个进程拥有独立的 内存空间、文件描述符、系统资源。 进程之间相互隔离,一个进程崩溃不会直接影响其他进程。 操作系统管理进程…...
SHAP分析图的含义
1. 训练集预测结果对比图 表征含义: 展示模型在训练集上的预测值(红色曲线)与真实值(灰色曲线)的对比。通过曲线重合度可直观判断模型的拟合效果。标题中显示的RMSE(均方根误差)量化了预测值与…...
PointNet++:点云处理的升级版算法
在三维计算机视觉和机器学习领域,点云数据的处理一直是一个关键问题。点云是由一系列三维坐标点组成的集合,这些点可以描述物体的形状和结构。然而,由于点云的无序性和不规则性,传统的处理方法往往难以直接应用。PointNet算法的出…...
PostGIS实现矢量数据转栅格数据【ST_AsRaster】
ST_AsRaster函数应用详解:将矢量数据转换为栅格数据 [文章目录] 一、函数概述 二、函数参数与分组说明 三、核心特性与注意事项 四、示例代码 五、应用场景 六、版本依赖 七、总结 一、函数概述 ST_AsRaster是PostGIS中用于将几何对象(如点、线…...
【PyQt5实战】五大对话框控件详解:从文件选择到消息弹窗
对话框是人机交互的重要组件,PyQt5提供了一系列标准对话框满足不同场景需求。本文将深入解析QDialog及其子类的使用方法,助你快速掌握GUI开发核心交互功能。 对话框基础:QDialog QDialog是所有对话框的基类,支持模态/非模态两种…...
机器学习-人与机器生数据的区分模型测试 - 模型选择与微调
内容继续机器学习-人与机器生数据的区分模型测试 整体模型的准确率 X_train_scaled pd.DataFrame(X_train_scaled,columns X_train.columns ) X_test_scaled pd.DataFrame(X_test_scaled,columns X_test.columns)from ngboost.distns import Bernoulli # 模型训练和评估 m…...
学习黑客Active Directory 入门指南(四)
Active Directory 入门指南(四):组策略的威力与操作主机角色 📜👑 大家好!欢迎来到 “Active Directory 入门指南” 系列的第四篇。在前几篇中,我们已经构建了对AD逻辑结构、物理组件、关键服务…...
十一、STM32入门学习之FREERTOS移植
目录 一、FreeRTOS1、源码下载:2、解压源码 二、移植步骤一:在需要移植的项目中新建myFreeRTOS的文件夹,用于存放FREERTOS的相关源码步骤二:keil中包含相关文件夹和文件引用路径步骤三:修改FreeRTOSConfig.h文件的相关…...
Spring ioc和Aop
IOC 在传统Java当中,我们的对象都需要new关键字来生成,这在面对很多对象的情况产生了不必要的麻烦,因为我不需要在一个项目中一直做重复的事情,那怎么办把,自然而然的一些好的框架就诞生了,避免我们去做这…...
动态内存管理2+柔性数组
一、动态内存经典笔试题分析 分析错误并改正 题目1 void GetMemory(char *p) {p (char *)malloc(100); } void Test(void) {char *str NULL;GetMemory(str);strcpy(str, "hello world");printf(str); } int main() {Test();return 0; }错误的原因: …...
USB传输速率 和 RS-232/RS-485串口协议速率 的倍数关系
一、技术背景 RS-232:传统串口标准,典型速率 115.2 kbps(最高约 1 Mbps)。RS-485:工业串口标准,典型速率 10 Mbps(理论最高可达 50 Mbps)。USB:不同版本差异巨大&#x…...
多线程代码案例-4 线程池
1、引入 池是一个非常重要的概念,我们有常量池,数据库连接池,线程池,进程池,内存池…… 池的作用: 1、提前把要用的对象准备好 2、用完的对象也不立即释放,先留着以备下次使用,提…...
JSON Schema 高效校验 JSON 数据格式
在数据交换和API开发中,JSON 已成为最流行的数据格式之一。但你是否遇到过这些困扰? 接收的JSON字段缺失关键数据?数值类型意外变成了字符串?嵌套结构不符合预期? JSON Schema 正是解决这些问题的利器。本文将带你全…...
机器学习09-正规方程
机器学习笔记:正规方程(Normal Equation) 概述 正规方程是线性回归中求解参数的一种解析方法。它基于最小化损失函数(如最小二乘法)来直接计算出参数的最优值。在机器学习中,这种方法尤其适用于特征数量不…...
Java大师成长计划之第26天:Spring生态与微服务架构之消息驱动的微服务
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4-turbo模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 在现代微服务架构中,服务…...
Linux 文件(1)
1. 文件 1.1 文件是什么 一个文件,是由其文件属性与文件内容构成的。文件属性又称为一个文件的元数据,因此如果一个文件,内容为空,这个文件依然要占据磁盘空间。 1.2 文件在哪里 一个文件,如果没有被打开ÿ…...
程序代码篇---python向http界面发送数据
文章目录 前言 前言 本文简单接受了python向http界面发送数据...
【iOS】探索消息流程
探索消息流程 Runtime介绍OC三大核心动态特性动态类型动态绑定动态语言 方法的本质代码转换objc_msgSendSELIMPMethod 父类方法在子类中的实现 消息查找流程开始查找快速查找流程慢速查找流程二分查找方法列表父类缓存查找 动态方法解析动态方法决议实例方法类方法优化 消息转发…...
院校机试刷题第六天:1134矩阵翻转、1052学生成绩管理、1409对称矩阵
一、1134矩阵翻转 1.题目描述 2.解题思路 很简单的模拟题,甚至只是上下翻转,遍历输出的时候先把最下面那一行输出即可。 3.代码 #include <iostream> #include <vector> using namespace std;int main() {int n;cin >> n;vector&l…...
DeepSeek在简历筛选系统中的深度应用
一、多模态解析引擎的技术突破 1.1 复杂格式的精准解析 针对简历格式多样性挑战,DeepSeek采用三级解析架构: 格式标准化层:基于Transformer的DocParser模型支持200+种文档格式转换视觉特征提取:使用改进的YOLOv8进行证书印章识别(mAP@0.5达93.7%)语义重构模块:通过注意…...
c++多线程debug
debug demo 命令行查看 ps -eLf|grep cam_det //查看当前运行的轻量级进程 ps -aux | grep 执行文件 //查看当前运行的进程 ps -aL | grep 执行文件 //查看当前运行的轻量级进程 pstree -p 主线程ID //查看主线程和新线程的关系 查看线程栈结构 pstack 线程ID 步骤&…...
【回溯 剪支 状态压缩】# P10419 [蓝桥杯 2023 国 A] 01 游戏|普及+
本文涉及知识点 C回溯 位运算、状态压缩、枚举子集汇总 P10419 [蓝桥杯 2023 国 A] 01 游戏 题目描述 小蓝最近玩上了 01 01 01 游戏,这是一款带有二进制思想的棋子游戏,具体来说游戏在一个大小为 N N N\times N NN 的棋盘上进行,棋盘…...
CUDA 纹理入门
一、什么是CUDA纹理 CUDA纹理是NVIDIA GPU提供的一种特殊内存访问机制,它允许高效地访问和过滤结构化数据。纹理内存最初是为图形渲染设计的,但在通用计算(GPGPU)中也很有用。 二、纹理内存的优势 缓存优化:纹理内存有专用的缓存,适合空间局部性好的访问模式 硬件过滤:支…...
大模型微调步骤整理
在对深度学习模型进行微调时,我通常会遵循以下几个通用步骤。 第一步是选择一个合适的预训练模型。PyTorch 的 torchvision.models 模块提供了很多经典的预训练模型,比如 ResNet、VGG、EfficientNet 等。我们可以直接使用它们作为模型的基础结构。例如,加载一个预训练的 Re…...
【GPT入门】第39课 OPENAI官方API调用方法
【GPT入门】第39课 OPENAI官方API调用方法 1. OPENAI 免费API2. openai调用最简单的API3.apiKey提取到环境变量 1. OPENAI 免费API 需要科学上网,可以调用 gpt-4o-mini 的 api, 使用其它旧的GPT,反而可能需要收费,例如 gpt-3.5-turbo 2. op…...
【DeepSeek论文精读】11. 洞察 DeepSeek-V3:扩展挑战和对 AI 架构硬件的思考
欢迎关注[【AIGC论文精读】](https://blog.csdn.net/youcans/category_12321605.html)原创作品 【DeepSeek论文精读】1. 从 DeepSeek LLM 到 DeepSeek R1 【DeepSeek论文精读】7. DeepSeek 的发展历程与关键技术 【DeepSeek论文精读】11. 洞察 DeepSeek-V3ÿ…...
MySQL事务的一些奇奇怪怪知识
Gorm事务有error却不返回会发生什么 Gorm包是大家比较高频使用。正常的用法是,如果有失败返回error,整体rollback,如果不返回error则commit。下面是Transaction的源码: // Transaction start a transaction as a block, return …...