精华内容
下载资源
问答
  • 这样计划任务就显得尤为方便。下面将介绍如何在Linux系统中添加计划任务。 一、什么是Crontab 简而言之,Crontab提供了允许给定的任务以一定的间隔在后台运行的机制。需要注意的是,并不是所有的系统都支持Crontab...
    

    在服务器中添加定期执行的任务,在很多情况下是非常必要的。比如,每天清理一次/tmp目录下的文件;没几分钟检查某一守护进程是否正常等等。这样计划任务就显得尤为方便。下面将介绍如何在Linux系统中添加计划任务。

    一、什么是Crontab
    简而言之,Crontab提供了允许给定的任务以一定的间隔在后台运行的机制。需要注意的是,并不是所有的系统都支持Crontab,需要和系统管理员联系,但是至少大部分应该是支持的。

    二、Crontab如何工作
    一个Cron计划就是一个文本文件,系统以及每一个用户都有他们自己的Cron计划。
    对于用户的Cron计划,都会存放到/var/spool/cron/crontabs目录中,但是系统不允许用户直接对该文件进行修改,而是必须通过以下命令修改:

    crontab -e

    使用命令crontab -u user -e命令编辑用户user的cron(c)作业。用户通过编辑文件来增加或修改任何作业请求。
    有的系统可以允许用户选择使用哪种文本编辑器对该文件进行修改,也有的只允许默认使用vi编辑器。
    cron计划文件中的每一行只可能是以下三种中的任意一种:注释(以#开头)、空行和任务。
    每一条计划任务至少包含六个部分,每一个部分之间以一个(必须是一个,不多不少)空格隔开,但是最后一个部分中允许包含空格。
    前五个部分规定了该任务运行的时间。

    需要注意的是,这个时间是采用了系统时间,而不是太平洋标准时间

    每一个部分的意义如下:

    field allowed values
    ----- --------------
    minute 0-59
    hour 0-23
    day of month 1-31
    month 1-12 (or names, see below)
    day of week 0-7 (0 or 7 is Sun, or use names)

    前五个部分的语法参考下边的例子,最后一个部分时间到达的时候要执行的命令。

    crontab的用户手册中推荐每一个命令使用绝对路径,例如调用rm命令时写作:/bin/rm,这是为了防止由于每一个用户的PATH环境变量不同而导致命令无法找到的错误

    三、一些例子
    (1) 手册中的例子

    # 在每天的00:05AM执行
    5 0 * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
    # 在每月1日的02:15PM执行
    15 14 1 * * $HOME/bin/monthly
    # 在工作日(周一到周五)的10:00PM执行
    0 22 * * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?%
    # 在0-23小时区间内,每两小时执行一次,即0点,2点,...,22点,在这些时间之后的23分钟执行
    23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"
    # 每周日的04:05AM执行
    5 4 * * sun echo "run at 5 after 4 every sunday"
    # 在每个月的第二个周六的04:00AM执行
    0 4 8-15 * 6 test $(date +u) -eq 6 && echo "2nd Saturday"
    (2) 预定义任务的前五个部分可以由以下左边字符串代替,右边为其解释:
    string meaning
    ------ -------
    @reboot Run once, at startup.
    @yearly Run once a year, "0 0 1 1 *".
    @annually (same as @yearly)
    @monthly Run once a month, "0 0 1 * *".
    @weekly Run once a week, "0 0 * * 0".
    @daily Run once a day, "0 0 * * *".
    @midnight (same as @daily)
    @hourly Run once an hour, "0 * * * *".
    四、系统的Cron计划
    系 统的Cron计划文件存放在/etc/crontab路径下。与用户的crontab文件不同,root用户可以直接对该文件进行修改,而不用使用 crontab -e命令。除此之外,系统crontab文件中任务的定义也有所不同,在前五个部分之后插入了一个“用户”部分。以下是我的/etc/crontab文 件:
    # /etc/crontab: system-wide crontab
    # Unlike any other crontab you don't have to run the `crontab'
    # command to install the new version when you edit this file
    # and files in /etc/cron.d. These files also have username fields,
    # that none of the other crontabs do.

    SHELL=/bin/sh
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

    # m h dom mon dow user command
    17 * * * * root cd / && run-parts --report /etc/cron.hourly
    25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
    47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
    52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
    #

    五、使设置生效
    设置完成后,重启cron即可使设置的计划任务定时执行了,重启命令如下:

    service crond restart
     
    展开全文
  • PMP项目管理13个计划

    千次阅读 2019-06-14 09:57:50
    1、变更管理计划 所属过程:制定项目管理计划 含义:定义管理项目变更的过程,用来明确如何对变更进行监控。为管理变更控制过程提供指导,记录变更控制委员会的情况。 内容:当项目需要变更的时候,如何进行变更。 2...

    1、变更管理计划

    • 所属过程:制定项目管理计划
    • 含义:定义管理项目变更的过程,用来明确如何对变更进行监控。为管理变更控制过程提供指导,记录变更控制委员会的情况。
    • 内容:当项目需要变更的时候,如何进行变更。

    2、配置管理计划

    • 所属过程:制定项目管理计划
    • 含义:定义配置项,定义需要正式变更控制的内容,并为这些配置项和内容规定变更控制过程,用来明确如何开展配置管理。
    • 内容:
      • 如何管理配置。
      • 配置管理系统:
        • 整个项目管理系统的一个子系统,它由一系列正式的书面程序组成,用于识别并记录产品、成果、服务或部件的功能特性和物理特征;
        • 控制对上述特征的任何变更;
        • 记录并报告每一项变更及其实施情况;
        • 支持产品、成果或部件的审查,以确保其符合要求。
        • 该系统包括文件和跟踪系统,并明确了为核准和控制变更所需的批准层次。

    3、范围管理计划

    • 所属过程:制定项目管理计划
    • 含义:在进行项目范围管理的5个过程之前,项目管理团队应先进行规划工作,是制定项目管理计划过程的一部分,产生一份范围管理计划,可以是正式或非正式的,非常详细或高度概括的。
    • 内容:用来指导项目范围的定义、记录、核实、管理和控制。

    4、进度管理计划

    • 所属过程:制定项目管理计划
    • 含义:在进行项目时间管理的6个过程之前,项目管理团队应先进行规划工作,是制定项目管理计划过程的一部分,编制进度管理计划,进度计划的编制方法旨在对进度计划编制过程中所用的规则和方法进行定义。一些耳熟能详的方法包括关键路径CPM法和关键链法。
    • 内容:在进度管理计划中,确定进度计划的编制方法和工具,并为编制进度计划,控制项目进度设定格式和准则,记录项目时间管理所需的各个过程及其工具与技术,应包括合适的控制临界值。

    5、需求管理计划

    • 所属过程:收集需求
    • 含义:描述在整个项目生命周期内如何分析、记录和管理需求。生命周期各阶段间的关系,并记录在需求管理计划中。
    • 内容:
      • 如何规划、跟踪和汇报各种需求活动。
      • 配置管理活动:如何启动产品、服务或成果的变更,如何分析其影响,如何进行跟踪和汇报,以及谁有权批准变更。
      • 配置识别:选择与识别配置项,为定义与核实产品配置、标志产品和文件管理变更和明确责任提供基础。
      • 配置状态记录:为能及时提供关于配置项的适当数据,应记录和报告相关信息,包括已批准的配置识别清单、配置变更请求的状态和已批准的变更的实施状态。
      • 配置核实与审计:能保证项目配置项组合的正确性,保证相应的变更都被登记、评估、批准、跟踪和正确实施,确保配置文件所规定的功能要求都已实现。
      • 需求排序过程。
      • 产品测量指标及使用这些指标的理由。
      • 需求跟踪结构:哪些需求属性将列入跟踪矩阵,并可在其他哪些项目文件中追踪到这些需求。

    6、成本管理计划

    • 所属过程:制定项目管理计划
    • 含义:在开始成本管理的3个过程前,项目管理团队需先行规划,是制定项目管理计划过程的一部分,形成一份成本管理计划,为规划、组织、估算、预算和控制项目成本统一格式,建立准则。项目所需的成本管理过程及其相关工具与技术,通常在定义项目生命周期时即已选定,并记录与成本管理计划中,成本管理计划可以是正式非正式的、非常详细或高度概括的。
    • 内容:
      • 精确程度:应根据活动范围和项目规模,设定活动成本估算所需达到的精确程度(如:精确至100美元或1000美元),并可在估算中预留一定的储备金。
      • 计量单位:对不同的资源设定不同的计量单位。
      • 组织程序链接:WBS为成本管理计划提供了框架,使成本估算、预算和控制之间能保持协调。用做项目成本账户的WBS组成部分被称为控制账户,每个控制账户都有唯一的编码或账号,并用此编码或账号直接链接到执行组织的会计系统。
      • 控制临界值:为监督成本绩效明确偏差临界值,通常用偏离基准计划的百分数表示。
      • 绩效测量规则:制定绩效测量所用的挣值管理规则:定义WBS中用于绩效测量的控制账户;
        • 选择所用挣值测量技术(加权里程牌法、固定公式法、完成百分比法);
        • 规定完工估算(EAC)的计算公式及其他跟踪方法。
      • 报告格式:定义各种成本报告的格式与频率。
      • 过程描述:对3个成本管理过程分别进行书面描述。

    7、质量管理计划

    • 所属过程:规划质量
    • 含义:说明项目管理团队将如何实施执行组织的质量政策,它是项目管理计划的组成部分或子计划,为整体项目管理计划提供输入,可以是正式或非正式的,非常详细或高度概括的。风格与详细程度取决于项目的具体需要,应该在项目早期就对质量管理计划进行评审,以确保决策是基于准确信息的,这样做的好处是减少因返工而造成的成本超支和进度延误。
    • 内容:质量控制、质量保证、持续过程改进方法。
    过程改进计划
    • 所属过程:规划质量
    • 含义:是项目管理计划的子计划,详细说明进行过程分析的各个步骤,以便识别增值活动。
    • 内容:
      • 过程边界:描述过程目的、过程的开始与结束、过程的输入输出、所需数据、责任人和干系人。
      • 过程配置:过程的图形表示,其中会标明界面,用于辅助分析。
      • 过程测量指标:与控制界限一起,用于分析过程的效率。
      • 绩效改进目标:用于指导过程改进活动。

    8、沟通管理计划

    • 所属过程:规划沟通
    • 含义:是项目管理计划的一部分或子计划,基于项目的需要沟通管理计划可以是正式或非正式的、非常详细或高度概括的。
    • 内容:
      • 干系人的沟通需求;
        • 需要沟通的信息,包括语言、格式、内容、详细程度;
        • 发布相关信息的原因;
        • 发布所需信息的时限和频率;
        • 负责沟通相关信息的人员;
        • 有权发布机密信息的个人或小组;
        • 将要接收信息的个人或小组;
        • 传递信息的技术或方法:备忘录、电子邮件和/或新闻稿等;
        • 为沟通活动分配资源:时间和预算;
        • 在下层员工无法解决问题时的问题升级流程,用于规定问题上报时限和上报路径;
        • 随项目进展,对沟通管理计划进行更新与优化的方法;
        • 通用术语表;
          • 项目信息流向图、工作流程(兼有授权顺序)、报告清单、会议计划等;
          • 沟通制约因素,通常来自特定的法律法规、技术要求和组织政策等。

    9、人力资源计划

    • 所属过程:制定人力资源计划
    • 含义:是关于如何定义、配备、管理、控制以及最终遣散项目人力资源的指南。
    • 内容:
      • 角色和职责:
        • 角色:说明某人负责项目某部分工作的一个名词,如土木工程师、现场联络员、商务分析师和测试协调员。应该清楚地界定和记录各角色的职权、职责和边界;
        • 职权:使用项目资源、做出决策以及签字批准的权力,如下列事项都需要由具有明确职权的人来做决策;选择活动的实施方法、质量验收以及如何应对项目偏差等。当个人的职权与职责相匹配时,团队成员就能最好地开展工作
        • 职责:为完成项目活动,项目团队成员应该履行的工作
        • 能力:为完成项目活动,项目团队成员所需具备的技能和才干。如果项目团队成员不具备所需的能力,就不能有效地履行职责。一旦发现成员的能力与职责不匹配,就应主动采取措施,如安排培训、招募新成员、调整进度计划或工作范围。
        • 项目组织机构图:
          • 以图形方式展示项目团队成员及其报告关系。基于项目的需要,项目组织结构图可以是正式或非正式的,非常详细或高度概括的,如一个3000人的灾害应急团队的项目组织机构图,要比仅有20人的内部项目的组织机构图详尽得多。

    10、人员配备管理计划:

    作为项目管理计划中的人力资源计划的一部分,人员配备管理计划描述何时以及如何满足项目对人力资源的需求,基于项目的需要,人员配备计划可以是正式或非正式的,非常详细或高度概括的。应该在项目起见不断更新人员配备管理计划,以指导持续进行的团队成员招募和发展活动。人员配备管理计划的内容因应用领域和项目规模而异,但都用包括:

    • 人员招募:
      在规划项目团队成员招募工作时,需要考虑一系列问题,如组织内部招募还是从组织外部的签约供应商招募?团队成员必须集中在一起工作,还是可以远距离分散办公?项目所需各级技术人员的成本分别是多少?组织的人力资源部门和职能经理们能为项目管理团队提供多少帮助?
    • 资源日历:
      - 人员配备管理计划需要按个人或小组来描述项目团队成员的工作时间框架,并说明着魔活动何时开始。
      - 可用于人力资源管理的一种绘图工具是资源直方图这种柱形图显示,在整个项目期间每周(或每月)需要某人、某部门或整个项目团队的工作小时数。
      - 可在资源直方图中画一条水平线,代表某特定资源最多可用的小时数。
      - 如果柱形图超过该水平线,就表明需要采用资源平衡策略,如增加资源或修改进度计划。

    11、人员遣散计划:

    事先确定遣散团队成员的方法与时间,对项目和团队成员都有好处。一旦把团队成员从项目中遣散出去,项目就不再负担与这些成员相关的成本,从而节约项目成本,如果已经为员工安排好向新项目的平滑过渡,则可以提高士气,人员遣散计划也有助于减轻项目过程中或项目结束时可能发生的人力资源风险。

    • 培训需要:
      如果预计到团队成员不具备所要求的能力,则要制定一个培训计划,并将其作为项目的组成部分。培训计划中也可说明应该如何帮助团队成员获得相关证书,以提高他们的工作能力,从而使项目从中受益。
    • 认可与奖励:
      需要用明确的奖励标准和事先确定的奖励制度,来促进并加强团队成员的优良行为。应该针对团队成员可以控制的活动和绩效进行认可与奖励,如,因实现成本目标而获奖的团队成员,就应该对费用开支有适当的决定权。在奖励计划中规定发放奖励的时间,可以确保奖励能适时兑现而不被遗忘,认可与奖励是建设项目团队过程的一部分。
    • 合规性:
      人员配备管理计划中包含一些策略,以遵循适用的政府法规、工会合同和其他现行的人力资源政策。
    • 安全:
      应该在人员配备管理计划和风险登记册中规定一些政策和程序,来包含团队提前与滞后离安全隐患。

    12、风险管理计划

    • 所属过程:规划风险应对
      • 含义:描述如何安排与实施项目风险管理,是项目管理计划的子计划。
      • 内容:
      • 方法论:
        确定项目风险管理将使用的方法、工具及数据来源。
      • 角色与职责:
        确定风险管理计划中每项活动的领导者和支持者,以及风险管理团队的成员,并明确其职责。
      • 预算:
        分配资源,估算风险管理所需的资金,将其纳入成本绩效基准,并建立应急储备的使用方案。
      • 时间安排:
        确定在项目生命周期中实施风险管理过程的时间和频率,建立进度应急储备的使用方案,确定应纳入进度计划的风险管理活动。
      • 风险类别:
        提供一个框架,确保在同一细节水平上全面、系统的识别各种风险,并提高识别风险过程的效果和质量。组织可使用预先准备好的分类框架,它可能是一个简易分类清单或风险分解结构(RBS),RBS是按风险类别和子类别来排列已识别的项目风险的一种层级结构,用来显示潜在风险的所属领域和产生原因。
      • 风险概率和影响的定义:
        需要对风险的概率和影响划分层次,来确保实施定性风险分析过程的质量和可信度。在规划风险管理过程中,应该根据具体项目的需要来“剪裁”通用的风险概率和影响定义,供实施定性风险分析过程使用。
      • 概率影响矩阵:
        应该根据风险可能对项目目标产生的影响,对风险进行优先排序,进行风险优先排序的典型方法是,使用查询表或概率影响矩阵,根据概率和影响的各种组合,把风险划分成高、中、低级别,以便进行相应的风险应对规划,通常由组织来设定概率影响矩阵。
      • 修订的干系人承受力:
        可在规划风险管理过程中对干系人的承受力进行修订,以适应具体项目的情况
      • 报告格式:
        包括风险登记册的内容和格式,以及所需的其他风险报告的内容和格式,用于规定将如何对风险管理过程的结果进行记录、分析和沟通。
      • 跟踪:
        应该规定将如何记录风险活动,这些记录可用于本项目或未来项目,可用于总结经验教训,还要规定是否需要以及应该如何对风险管理过程进行审计。

    13、采购管理计划

    • 所属过程:规划采购
      • 含义:描述如何管理从编制采购文件直到合同收尾的各个采购过程,根据每个项目的需要,采购管理计划可以是正式或非正式的,非常详细或高度概括的,它是项目管理计划的子计划。
    • 内容:
      • 拟采用的合同类型;
      • 风险管理事项;
      • 是否需要编制独立估算,以及是否应把独立估算作为评价标准;
      • 如果执行组织设有采购、发包或采办部门,项目管理团队可独自采取的行动;
      • 标准化的采购文件;
      • 如何管理多个供应商;
      • 如何协调采购工作与项目的其他工作:制定进度计划与报告项目绩效;
      • 可能影响采购工作的制约因素和假设条件;
      • 如何确定采购工作所需的提前时间,以便与项目进度计划相协调;
      • 如何进行自制或外购决策,并把该决策与估算活动资源和制定进度计划等过程联系在一起;
      • 如何在每个合同中规定合同可交付成果的进度日期,以便与进度计划编制和进度控制过程相协调;
      • 如何识别对履约担保或保险合同的需求,以减轻某些项目风险;
      • 如何指导卖方编制和维护工作分解结构;
      • 如何确定采购/合同的形式和格式;
      • 如何识别预审合格的卖方;
      • 用于管理合同和评价卖方的采购测量指标。

    14、干系人管理计划

    • 所属过程:规划干系人管理
      • 含义:干系人管理计划是项目管理计划的组成部分,为有效调动干系人参与而规定所需的管理策略。根据项目的需要,干系人管理计划可以是正式或非正式的,非常详细或高度概括的。
      • 内容:
        • 干系人登记册中的资料
        • 关键干系人的所需参与程度和当前参与程度;
        • 干系人变更的范围和影响;
        • 干系人之间的相互关系和潜在交叉;
        • 项目现阶段的干系人沟通需求;
        • 需要分发给干系人的信息,包括语言、格式、内容和详细程度;
        • 分发相关信息的理由,以及可能对干系人参与所产生的影响;
        • 向干系人分发所需信息的时限和频率;
        • 随着项目的进展,更新和优化干系人管理计划的方法。
    展开全文
  • 敏捷方法

    千次阅读 2012-08-18 23:39:54
    敏捷方法是从20世纪90年代开始逐渐引起广泛关注的一些新型软件开发方法,以应对快速变化的需求。虽然它们的具体名称、理念、过程、术语都不尽相同,但相对于“非敏捷”而言,它们更强调开发团队与用户之间的紧密协作...

    敏捷方法是从20世纪90年代开始逐渐引起广泛关注的一些新型软件开发方法,以应对快速变化的需求。虽然它们的具体名称、理念、过程、术语都不尽相同,但相对于“非敏捷”而言,它们更强调开发团队与用户之间的紧密协作、面对面的沟通、频繁交付新的软件版本、紧凑而自我组织型的团队等,也更注重人的作用。

    1、敏捷宣言

    2001年,Kent Beck等人组织了敏捷联盟,阐述了敏捷开发的原则,试图强调灵活性在快速且有效地开发软件中所发挥的作用,他们共同签署了敏捷软件开发宣言,该宣言认为,个体和交互胜过过程和工具;可工作的软件胜过大量的文档;客户合作胜过合同谈判;响应变化胜过遵循计划。

    敏捷方法强调,让客户满意和软件尽早增量发布;小而高度自主的项目团队;非正式的方法;最小化软件工程工作产品以及整体精简开发。产生这种情况的原因是,在绝大多数软件开发过程中,提前预测哪些需求是稳定的和哪些需求会变化非常困难;对于软件项目构建来说,设计和实现是交错的;从指定计划的角度来看,分析、设计、实现和测试并不容易预测;可执行原型和部分实现的可运行系统是了解用户需求和反馈的有效媒介。

    目前,主要的敏捷方法有极限编程、自适应软件开发、水晶方法、特性驱动开发、动态系统开发方法、测试驱动开发、敏捷数据库技术和精益软件开发等。虽然这些过程模型在实践上有差异,但都是遵循了敏捷宣言或者是敏捷联盟所定义的基本原则。这些原则包括客户参与、增量式移交、简单性、接受变更、强调开发人员的作用和及时反馈等。

    2、敏捷方法的特点

    敏捷方法是一种以人为核心、迭代、循序渐进的开发方法。在敏捷方法中,软件项目的构建被切分成多个子项目,各个子项目成果都经过测试,具备集成和可运行的特征。在敏捷方法中,从开发者的角度来看,主要的关注点有短平快的会议、小版本发布、较少的文档、合作为重、客户直接参与、自动化测试、适应性计划调整和结对编程;从管理者的角度来看,主要的关注点有测试驱动开发、持续集成和重构。

    近年来,虽然敏捷方法发展的较快,但在实施的过程中,也暴露出来很多问题,一些敏捷方法的基本原则很难实施,主要体现在以下4个方面:

    1)客户参与往往依赖于客户参与的意愿和客户自身的代表性。

    2)团队成员的性格可能不适合激烈的投入,可能无法做到与其它成员之间的良好沟通。

    3)对系统的变更作出优先级排序可能是极端困难的。

    4)维护系统的简洁性往往需要额外的工作,但迫于时间表的压力,可能没有时间执行系统简化过程。

    与RUP相比,敏捷方法的周期可能更短。敏捷方法在几周或几个月的时间内完成相对较小的功能,强调的是能尽早将尽量小的可用的功能交付使用,并在整个项目周期中持续改善和增强,并且更加强调团队中的高度协作。相对而言,敏捷方法主要适用于以下场合:

    1)项目团队的人数不能太多,适合于规模较小的项目。

    2)项目经常发生变更。敏捷方法适用于需求萌动并且快速改变的情况,如果系统有比较高的关键性、可靠性、安全性方法要求,则可能不完全适合。

    3)高风险项目的实施。

    4)从组织结构的角度看,组织结构的文化、人员、沟通性决定了敏捷方法是否适用。与这些相关联的关键成功因素有组织文化必须支持谈判、人员彼此信任、人少但是精干、开发人员所作的决定得到认可、环境设施满足团队成员之间快速沟通的需要。

    3、XP方法

    敏捷方法中最著名的就是XP,XP是一种轻量、高效、低风险、柔性、可预测、科学且充满乐趣的软件开发方式,适用于小型或中型软件开发团队,并且客户的需求模糊或需求多变。与其它方法相比,其最大的不同如下:

    1)在更短的周期内、更早地提供具体、持续的反馈信息。

    2)迭代地进行计划编制,首先在最开发迅速生成一个总体计划,然后在整个项目开发过程中不断地发展它。

    3)依赖于自动测试程序来监控开发进度,并及早地捕获缺陷。

    4)依赖于口头交流,测试盒源程序进行沟通。

    5)倡导持续的演化式的设计。

    6)依赖于开发团队内部的紧密协作。

    7)尽可能达到程序员短期利益和项目长期利益的平衡。

    XP由价值观、原则、实践和行为4个部分组成,它们彼此相互依赖、关联、并通过行为贯穿于整个生命周期。XP的核心是其总结的四大价值观,即沟通、简单、反馈和勇气。它们是XP的基础,也是XP的灵魂。XP的5个原则快速反馈、简单性假设、逐步修改和优质工作。而在XP方法中,贯彻的是“小步快走”的开发原则,因此工作质量决不可打折扣,通常采用测试先行的编码方式来提供支持。

    在XP中,集成了12个最佳实践,分别是计划游戏、小型发布、隐喻、简单设计、测试先行、重构、结对编程、集体代码所有制、持续集成、每周工作40小时、现场客户和编码标准。当然,这些所谓的“最佳实践”并非对每个项目都是最佳的,需要项目团队根据实际情况决定。而且,XP方法的有些原则在应用中不一定能得到贯彻和执行。因此,在实际工作中,应该“取其精华,去其糟粕”,把XP方法和其它方法结合起来。

    展开全文
  • 【精品计划0】蓝桥杯 摔手机

    万次阅读 多人点赞 2018-12-04 18:07:32
    x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机。 各大厂商也就纷纷推出各种耐摔型手机。x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后才允许上市流通。 x星球...

    原题描述:

            x星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机。
    各大厂商也就纷纷推出各种耐摔型手机。x星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后才允许上市流通。
            x星球有很多高耸入云的高塔,刚好可以用来做耐摔测试。塔的每一层高度都是一样的,与地球上稍有不同的是,他们的第一层不是地面,而是相当于我们的2楼。
            如果手机从第7层扔下去没摔坏,但第8层摔坏了,则手机耐摔指数=7。

    特别地,如果手机从第1层扔下去就坏了,则耐摔指数=0。如果到了塔的最高层第n层扔没摔坏,则耐摔指数=n

            为了减少测试次数,从每个厂家抽样3部手机参加测试。
            某次测试的塔高为1000层,如果我们总是采用最佳策略,在最坏的运气下最多需要测试多少次才能确定手机的耐摔指数呢?
            请填写这个最多测试次数。

            注意:需要填写的是一个整数,不要填写任何多余内容

    答案19

     

    文章目的

     

    读完题后,我们追求的不是要写出得数(至少对于本博客是不够的),而是用代码实现方法,并思考是否可以优化。

    其实本题的方法是非常多种多样的。非常适合锻炼思维。

    我们把问题扩展到n个手机来思考。

    手机k个,楼n层,最终结果M次。

    时空复杂度目录

    暴力:                        O(N!)

    DP:                            O(N*N*K)  O(N*K)

    压空间:                    O(N*N*K)  O(N)

    四边形不等式优化     O(N*N)       

    换思路:                    O(K*M)

    最优:                         O(K*M)    O(N)

    文末有测试,大家可以去直观感受一下各方法运行的效率

    二分

     

    容易想到二分思路:不断二分范围,取中点,测验是否会摔坏,然后缩小一半范围,继续尝试,很显然,答案为logN(2为底)

    但是,二分得出的答案是不对的。注意:我们要保证在都手机摔完之前,能确定耐摔指数到底是多少。

    举例:

    我们在500楼摔坏了,在250楼摔,又坏了。接下来,我们只能从1楼开始一层一层试

    因为如果我们在125层摔坏了,就没有手机可以用,也就是永远都测不出来,而这是不被允许的。其实我们连测第2层都不敢测,因为在第2层摔坏了,我们就无法知道手机在第一层能否被摔坏。所以只有一部手机时,我们只敢从第一层开始摔。

     

    尝试较优的策略

     

    既然二分是不对的,我们继续分析:摔手机的最优策略到底是如何的。

    只有一部手机时,我们只敢从第一层开始摔。

    有两部手机的时候,我们就敢隔层摔了,因为一部手机坏了,我们还有另一部来继续试。

    这时就有点意思了,我们分析情况:

    情况1)假设我们第一部手机在i层摔坏了,然后最坏情况还要试多少次?这时我们还剩一部手机,所以只敢一层一层试,最坏情况要试到i-1层,共试了i次。

    情况2)假设我们第一部手机在i层试了,但是没摔坏,然后最坏情况还要试多少次?(这时发现算情况2时依旧是相似的问题,确定了可以用递归来解。)

     

    最优解(最小值)是决策后两种情况的最差情况(最大值),我们的本能感觉应该就是让最差情况好一点,让最好情况差一点,这样比较接近正确答案。比如两部手机,一百层,我们可以在50层摔,没坏,这一次就很赚,我们没摔坏手机还把范围缩小了50层。如果坏了,就比较坑了,我们要从1试到50。虽然可能缩小一半,但是最坏情况次数太多,所以肯定要从某个低于五十的层开始尝试。

    (以上几行是为了让读者理解决策,下面正文分析)

     

    归纳表达式

     

    假设我们的楼一共n层,我们的i可以取1-n任意值,有很多种可能的决策,我们的最小值设为f(n,k),n代表楼高(范围为1-100或101-200其实都一样),k代表手机数.

    我们假设的决策是在第i楼扔

    对于情况一,手机少了一部,并且我们确定了范围,一定在第i楼以下,所以手机-1,层数为i-1,这时f(n,k)=f(i-1,k-1).+1

    对于情况二,手机没少,并且我们确定了范围,一定在第i楼之上,所以手机数不变,而层数-i层,这时f(n,k)=f(n-i,k).+1

    归纳出

    f(n,k)=min(  max(f(i-1,k-1) ,f(n-i,k) ) i取1-n任意数    )+1

    简单总结:怎么确定第一个手机在哪扔?每层都试试,哪层的最坏情况(max)最好(min),就去哪层扔。

     

    写出暴力递归

    按照分析出来的表达式,我们可以写出暴力递归:

    	public static int solution1(int nLevel, int kChess) {
    		if (nLevel == 0) {
    			return 0;
    		}//范围缩小至0
    		if (kChess == 1) {
    			return nLevel;
    		}//每层依次试
    		int min = Integer.MAX_VALUE;//取不影响结果的数
    		for (int i = 1; i != nLevel + 1; i++) {
                          //尝试所有决策,取最优
    			min = Math.min(
    					min,
    					Math.max(Process1(i - 1, kChess - 1),Process1(nLevel - i, kChess)));
    		}
    		return min + 1;//别忘了加上本次
    	}

     

    改为动态规划

     

    具体思路如下

    https://blog.csdn.net/hebtu666/article/details/79912328

    	public static int solution2(int nLevel, int kChess) {
    		if (kChess == 1) {
    			return nLevel;
    		}
    		int[][] dp = new int[nLevel + 1][kChess + 1];
    		for (int i = 1; i != dp.length; i++) {
    			dp[i][1] = i;
    		}
    		for (int i = 1; i != dp.length; i++) {
    			for (int j = 2; j != dp[0].length; j++) {
    				int min = Integer.MAX_VALUE;
    				for (int k = 1; k != i + 1; k++) {
    					min = Math.min(min,
    							Math.max(dp[k - 1][j - 1], dp[i - k][j]));
    				}
    				dp[i][j] = min + 1;
    			}
    		}
    		return dp[nLevel][kChess];
    	}

     

    压缩空间

     

    我们发现,对于状态转移方程,只和上一盘排的dp表和左边的dp表有关,所以我们不需要把值全部记录,用两个长度为n的数组不断更新即可(具体对dp压缩空间的思路,也是很重要的,我在其它文章中有提过,在这里就不写了)

    	public static int solution3(int nLevel, int kChess) {
    		if (kChess == 1) {
    			return nLevel;
    		}
    		int[] preArr = new int[nLevel + 1];
    		int[] curArr = new int[nLevel + 1];
    		for (int i = 1; i != curArr.length; i++) {
    			curArr[i] = i;
    		}//初始化
    		for (int i = 1; i != kChess; i++) {
                      //先交换
    			int[] tmp = preArr;
    			preArr = curArr;
    			curArr = tmp;
                      //然后打新的一行
    			for (int j = 1; j != curArr.length; j++) {
    				int min = Integer.MAX_VALUE;
    				for (int k = 1; k != j + 1; k++) {
    					min = Math.min(min, Math.max(preArr[k - 1], curArr[j - k]));
    				}
    				curArr[j] = min + 1;
    			}
    		}
    		return curArr[curArr.length - 1];
    	}

     

    四边形不等式优化

     

    四边形不等式是一种比较常见的优化动态规划的方法

    定义:如果对于任意的a1≤a2<b1≤b2,有m[a1,b1]+m[a2,b2]≤m[a1,b2]+m[a2,b1],那么m[i,j]满足四边形不等式。

    对s[i,j-1]≤s[i,j]≤s[i+1,j]的证明:

    设mk[i,j]=m[i,k]+m[k,j],s[i,j]=d

    对于任意k<d,有mk[i,j]≥md[i,j](这里以m[i,j]=min{m[i,k]+m[k,j]}为例,max的类似),接下来只要证明mk[i+1,j]≥md[i+1,j],那么只有当s[i+1,j]≥s[i,j]时才有可能有mk[i+1,j]≥md[i+1,j]

    (mk[i+1,j]-md[i+1,j])-(mk[i,j]-md[i,j])

    =(mk[i+1,j]+md[i,j])-(md[i+1,j]+mk[i,j])

    =(m[i+1,k]+m[k,j]+m[i,d]+m[d,j])-(m[i+1,d]+m[d,j]+m[i,k]+m[k,j])

    =(m[i+1,k]+m[i,d])-(m[i+1,d]+m[i,k])

    ∵m满足四边形不等式,∴对于i<i+1≤k<d有m[i+1,k]+m[i,d]≥m[i+1,d]+m[i,k]

    ∴(mk[i+1,j]-md[i+1,j])≥(mk[i,j]-md[i,j])≥0

    ∴s[i,j]≤s[i+1,j],同理可证s[i,j-1]≤s[i,j]

    证毕

     

    通俗来说,

    优化策略1)我们在求k+1手机n层楼时,最后发现,第一个手机在m层扔导致了最优解的产生。那我们在求k个手机n层楼时,第一个手机的策略就不用尝试m层以上的楼了。

    优化策略2)我们在求k个手机n层楼时,最后发现,第一个手机在m层扔导致了最优解的产生。那我们在求k个手机n+1层楼时,就不用尝试m层以下的楼了。

    	public static int solution4(int nLevel, int kChess) {
    		if (kChess == 1) {
    			return nLevel;
    		}
    		int[][] dp = new int[nLevel + 1][kChess + 1];
    		for (int i = 1; i != dp.length; i++) {
    			dp[i][1] = i;
    		}
    		int[] cands = new int[kChess + 1];
    		for (int i = 1; i != dp[0].length; i++) {
    			dp[1][i] = 1;
    			cands[i] = 1;
    		}
    		for (int i = 2; i < nLevel + 1; i++) {
    			for (int j = kChess; j > 1; j--) {
    				int min = Integer.MAX_VALUE;
    				int minEnum = cands[j];
    				int maxEnum = j == kChess ? i / 2 + 1 : cands[j + 1];
                                  //优化策略
    				for (int k = minEnum; k < maxEnum + 1; k++) {
    					int cur = Math.max(dp[k - 1][j - 1], dp[i - k][j]);
    					if (cur <= min) {
    						min = cur;
    						cands[j] = k;//最优解记录层数
    					}
    				}
    				dp[i][j] = min + 1;
    			}
    		}
    		return dp[nLevel][kChess];
    	}

    注:对于四边形不等式的题目,比赛时不需要严格证明

    通常的做法是打表出来之后找规律,然后大胆猜测,显然可得。(手动滑稽)

     

    换一种思路

     

    有时,最优解并不是优化来的。

    当你对着某个题冥思苦想了好久,无论如何也不知道怎么把时间优化到合理范围,可能这个题的最优解就不是这种思路,这时,试着换一种思路思考,可能会有奇效。

    (比如训练时一道贪心我死活往dp想,肝了两个小时以后,不主攻这个方向的队友三分钟就有贪心思路了,泪目,不要把简单问题复杂化

     

    我们换一种思路想问题:

    原问题:n层楼,k个手机,最多测试次数

    反过来看问题:k个手机,扔m次,最多能确定多少层楼?

    我们定义dp[i][j]:i个手机扔j次能确定的楼数。

    分析情况:依旧是看第一部手机在哪层扔的决策,同样,我们的决策首先要保证能确定从1层某一段,而不能出现次数用完了还没确定好的情况。以这个为前提,保证了每次扔的楼层都是最优的,就能求出结果。

    依旧是取最坏情况:min(情况1,情况2)

    情况1)第一个手机碎了,我们就需要用剩下的i-1个手机和j-1次测试次数往下去测,dp[i-1][j-1]。那我们能确定的层数是无限的,因为本层以上的无限层楼都不会被摔坏。dp[i-1][j-1]+无穷=无穷

    情况2)第一个手机没碎,那我们就看i个手机扔j-1次能确定的楼数(向上试)+当前楼高h

    归纳表达式,要取最差情况,所以就是只有情况2:dp[i][j]=dp[i-1][j-1]+h

    那这个h到底是什么呢?取决于我敢从哪层扔。因为次数减了一次,我们还是要考虑i个球和j-1次的最坏情况能确定多少层,我才敢在层数+1的地方扔。(这是重点)

    也就是dp[i][j-1]的向上一层:h=dp[i][j-1]+1

     

    总:min(情况1,情况2)=min(无穷,dp[i-1][j-1]+dp[i][j-1]+1)=dp[i-1][j-1]+dp[i][j-1]+1

    这是解决k个手机,扔m次,最多能确定多少层楼?

    原问题是n层楼,k个手机,最多测试次数。

    所以我们在求的过程中,何时能确定的层数大于n,输出扔的次数即可

     

    最优解

    我们知道完全用二分扔需要logN+1次,这也绝对是手机足够情况下的最优解,我们做的这么多努力都是因为手机不够摔啊。。。。所以当我们的手机足够用二分来摔时,直接求出logN+1即可。

     

    当然,我们求dp需要左边的值和左上的值:

    依旧可以压缩空间,从左往右更新,previous记录左上的值。

    求自己时也要注意记录,否则更新过后,后面的要用没更新过的值(左上方)就找不到了。

    记录之后,求出当前数值,把记录的temp值给了previous即可。

    	public static int solution5(int nLevel, int kChess) {
    		int bsTimes = log2N(nLevel) + 1;
    		if (kChess >= bsTimes) {
    			return bsTimes;
    		}
    		int[] dp = new int[kChess];
    		int res = 0;
    		while (true) {
    			res++;//压缩空间记得记录次数
    			int previous = 0;
    			for (int i = 0; i < dp.length; i++) {
    				int tmp = dp[i];
    				dp[i] = dp[i] + previous + 1;
    				previous = tmp;
    				if (dp[i] >= nLevel) {
    					return res;
    				}
    			}
    		}
    	}
    
    	public static int log2N(int n) {
    		int res = -1;
    		while (n != 0) {
    			res++;
    			n >>>= 1;
    		}
    		return res;
    	}

     

     

     

     

    本题只是填空题,第一种方法就完全能算出来,就是为了追求最优解,追求思维的锻炼。写下了本文。

     

     

    测试:

    暴力:                        O(N!)

    DP:                            O(N*N*K)  O(N*K)

    压空间:                    O(N*N*K)  O(N)

    四边形不等式优化     O(N*N)       

    最优:                         O(K*M)    O(N)

    		long start = System.currentTimeMillis();
    		solution1(30, 2);
    		long end = System.currentTimeMillis();
    		System.out.println("cost time: " + (end - start) + " ms");
    		start = System.currentTimeMillis();
    		solution2(30, 2);
    		end = System.currentTimeMillis();
    		System.out.println("cost time: " + (end - start) + " ms");
    		start = System.currentTimeMillis();
    		solution3(30, 2);
    		end = System.currentTimeMillis();
    		System.out.println("cost time: " + (end - start) + " ms");
    		start = System.currentTimeMillis();
    		solution4(30, 2);
    		end = System.currentTimeMillis();
    		System.out.println("cost time: " + (end - start) + " ms");
    		start = System.currentTimeMillis();
    		solution5(30, 2);
    		end = System.currentTimeMillis();
    		System.out.println("cost time: " + (end - start) + " ms");
    /*
    结果:
    cost time: 7043 ms
    cost time: 0 ms
    cost time: 0 ms
    cost time: 0 ms
    cost time: 0 ms
    */

    暴力时间实在是太久了,只测一个30,2

     

    后四种方法测的大一些(差点把电脑测炸了,cpu100内存100):

    solution(100000, 10):

    solution2 cost time: 202525 ms
    solution3 cost time: 38131 ms
    solution4 cost time: 11295 ms
    solution5 cost time: 0 ms

     

    感受最优解的强大:

    solution5(1000 000 000,100):0 ms

    solution5(1000 000 000,10):0 ms

    最优解永远都是0 ms,我也是服了。。

     

    对比方法,在时间复杂度相同的条件下,空间复杂度一样会影响时间,因为空间太大的话,申请空间是相当浪费时间的。并且空间太大电脑会炸,所以不要认为空间不重要。

     

    展开全文
  • Flink运行时之批处理程序生成计划

    千次阅读 2017-02-15 22:11:08
    批处理程序生成计划DataSet API所编写的批处理程序跟DataStream API所编写的流处理程序在生成作业图(JobGraph)之前的实现差别很大。流处理程序是生成流图(StreamGraph),而批处理程序是生成计划(Plan)并由优化...
  • 我们经常被问到这个问题:什么是敏捷方法论 (Methodologies)?很简单,敏捷是IT行业用来描述项目管理的替代方法的炒作词。 敏捷是一个过程,可以帮助团队快速,不可预测地响应他们在项目中收到的反馈。它为在开发...
  • 项目计划书编写说明

    千次阅读 2010-07-30 14:20:00
    关键词 项目、计划书、格式、编写说明 正文 一、项目计划书格式 根据《GB8567-88计算机软件产品开发文件编制指南》中项目开发计划的要求,结合实际情况调整后的《项目计划书》内容索引...
  •  PERT(Program Evaluation and Review Technique)即计划评审技术,最早是由美国海军在计划和控制北极星导弹的研制时发展起来的。PERT技术使原先估计的、研制北极星潜艇的时间缩短了两年。  简单地说,PERT是利用...
  • PMPBOK6项目管理计划及其子计划

    千次阅读 2018-11-12 10:12:34
    项目管理计划 子管理计划 范围管理计划。见 5.1.3.1 节。确立如何定义、制定、监督、控制和确认项目范围。 需求管理计划。见 5.1.3.2 节。确定如何分析、记录和管理项目和产品需求。 进度管理计划。见 6.1.3.1 ...
  • 产品读书《麦肯锡方法

    千次阅读 2018-12-10 21:06:49
    作者简介  埃森・M・拉塞尔,1989年进入麦肯锡公司纽约办事处、工作至 1992年。在公司期间,他的客户包括金融、电信、计算机和消费品部门的大... 《麦肯锡方法》主要从思考问题的方法、解决问题的方法、推介方案...
  • 测试计划和测试方案区别

    万次阅读 多人点赞 2018-07-05 20:25:10
    关于测试计划和测试方案的区别,这里主要从编写目的、定义和层次、编写时间和依据、软件过程、文档内容这五方面来说明,具体内容如下: 一、编写目的 制定测试计划目的:按照所制定的测试计划可以有效的计划、执行...
  • 解决问题最简单的方法

    千次阅读 2016-08-20 07:09:45
    这是一本小书,只有145页,7万字左右,花2个小时就能读完,但你会学到立马提高你解决问题能力的10多种方法
  • 制定项目管理计划:定义、准备和协调项目计划的所有组成部分,并把他们整合成一份综合项目管理计划的过程。项目管理计划包括经过整合的项目基准和子计划。 输入 工具和技术 输出 1.项目章程;2.其他过程的...
  • 详解sqlserver 执行计划

    万次阅读 2017-12-05 15:52:18
    对于SQL Server的优化来说,优化查询可能是很常见的事情。由于数据库的优化,本身也是...因此本文只谈优化查询时如何看懂SQL Server查询计划。毕竟我对SQL Server的认识有限,如有错误,也恳请您在发现后及时批评指正
  • Python爬虫突破封禁的6种常见方法

    万次阅读 多人点赞 2016-08-17 22:36:59
    最常用的方法是写一个自动化程序向网络服务器请求数据(通常是用HTML表单或其他网页文件),然后对数据进行解析,提取需要的信息。本文假定读者已经了解如何用代码来抓取一个远程的URL,并具备表单如何提交及...
  • 软件界面设计思想方法

    万次阅读 2015-03-04 10:16:28
    这种环境熏陶出来的人,他们带的队伍,他们做的东西,都是世界一流的。这就是系统性教育产生的价值。 不要认为软件开发就是编程,仅仅懂编程的人,绝对做不出优秀的软件系统。要想成为优秀的软件人才,仅仅学会...
  • 产品读书《用户故事与敏捷方法

    千次阅读 2018-12-12 11:10:11
     前段时间连着看了许多有关提高工作效率的书籍(我管它叫工具书),比如说《金字塔原理》《刻意练习》《番茄工作法图解》《麦肯锡方法》《麦肯锡工作法:麦肯锡精英的39个工作习惯》《麦肯锡工作法:个人竞争力提升...
  • 网站推广经典方法

    千次阅读 2007-05-08 10:15:00
    以下是你可以考虑采用29个方法。其中,你或许已经采用了一些,有的方法你可能忘了采用,还有一些是你从来没有听说过的。总之,在这里你可以了结到当前各种有效的网站推广方法。首先你要了解,网站推广是一个长期而且...
  • 德尔菲法——意见可靠预测方法

    千次阅读 2019-07-09 08:59:14
    首次用这种方法用来进行预测,后来该方法被迅速广泛采用。  德尔菲法也称专家调查法,是一种采用通讯方式分别将所需解决的问题单独发送到各个专家手中,征询意见,然后回收汇总全部专家的意见,并整理出综合意见...
  • 软件项目计划

    千次阅读 2013-05-27 13:16:03
    软件项目计划(Software Project Planning)是一个软件项目进入系统实施的启动阶段,主要进行的工作包括:确定详细的项目实施范围、定义递交的工作成果、评估实施过程中主要的风险、制定项目实施的时间计划、成本和...
  • 软件项目估算与计划

    千次阅读 2014-07-15 15:25:55
    本文将会让你全面学习项目估算、计划计划跟踪的知识,体验实际项目管理的难度,学到提高项目管理水平的一些方法。 大纲: 1. 从建筑工程说起 2.估算要估啥? 3.估算如何做出来? 4.计划有什么内容? 5....
  • 软件测试方法

    万次阅读 多人点赞 2019-04-16 14:49:22
    ...软件测试方法是指测试软件的方法。随着软件测试技术的不断发展,测试方法也越来越多样化,针对性更强;选择合适的软件测试方法可以让我们事半功倍。 用户界面...
  • 制定测试计划

    千次阅读 2011-12-10 14:54:53
    http://ir.hit.edu.cn/~car/programming/rup/process/activity/ac_...活动: 制定测试计划 目的 收集和组织测试计划信息。创建测试计划。 步骤 确定测试需求评估风险制定测试策略确定资源创
  • 读S计划- C方向项目详细计划

    万次阅读 热门讨论 2009-10-27 01:08:00
    一位网友的建议,写的非常好:对《C方向项目详细计划》的一点建议 特别声明:下面的群满了,加入78306952,或者CSDN群组 如果要加入此计划:1、方式1:加入QQ群:93684322。2、方式2:加入CSDN群组:DS计划。 前言
  • 开发方法---敏捷方法

    千次阅读 2018-08-28 21:24:22
    敏捷方法  2001 年 2 月,在美国的犹他州,17 位“无政府主义者”共同发表了《敏捷软件开发宣言》,在宣言中指出: 尽早地、持续地向客户交付有价值的软件对开发人员来说是最重要的。 拥抱变化,即使...
  • 测试计划概述

    千次阅读 2007-08-28 11:00:00
     什么是测试计划.... 31.1. 测试计划的定义... 31.2. 为什么要编写测试计划... 31.3. 什么时间做测试计划... 41.4. 由谁来做测试计划... 41.5. 制定原则... 41.6. 面对的问题... 42. 测试计划的内容.... 52.
  • explain执行计划详解

    万次阅读 2018-05-24 14:12:41
    explain执行计划详解1. Explain表的读取顺序,数据读取操作的类型,哪些索引可以使用,哪些索引实际使用了,表之间的引用,每张表有多少行被优化器查询等信息。下面是使用explain 的例子: 1.1. explain执行计划...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 113,016
精华内容 45,206
关键字:

他们计划采用方法是