透视软件开发过程中的难点
作者:田占海 1 引言 如果你是一个程序员,可能常常为不能按时完成任务而苦恼。如果你是一个项目经理,可能会觉得开发符合预算和进度要求的软件简直难于上青天。实际上,软件项目常常严重超期或超出预算仍是困扰着绝大多数软件机构的难题。据美国一份评估报告显示,17个主要的国防部软件合同中,平均28个月的进度计划推迟了20个月才完成。一个4年应该完成的任务,7年还未提交,其中没有一个项目按时完成。由于存在软件问题,B1轰炸机的部署被推迟了,同样的原因,580亿美元的A12飞机计划也被部分取消了。持续了二三十年的软件危机为什么愈演愈烈?软件开发为什么如此之难?本文试结合作者的体会对软件开发的困难之处做一剖析,并提出一些建议。 2 困难所在 2.1 极大的复杂性 大多数大型软件软件产品由几十甚至几百万行源代码构成,例如:Windows95操作系统由大约1100万行代码组成。每一行代码都可能影响到程序的其它部分,并且各个部分之间都可能互相影响。这样一个错综复杂的巨大系统当中,每一个小小的错误都可能导致整个系统崩溃。有些大型软件,例如Windows,可能是人类曾经建造过的最复杂的事物之一,从古至今最复杂的建筑都无法与之相比。 2.2 高度的不确定性 一个软件项目从一开始就存在许多不确定性因素。其一:用户需求很难确定。这是因为软件开发者很难详细了解用户的需求,甚至用户在看到产品之前也不清楚自己到底需要什么,所以从项目开发的自始至终都可能会有新的需求提出,致使系统结构不断修改,最终面目全非。其二:设计不完全可以预测。有时,一个设计时认为可行的方案,在实现时可能行不通,或者最初的设计方案存在很大的缺陷而没有及时发现,或者突然一个设计时没有料到的技术难点阻挡了项目的进度。从设计到实现实际上有着很大的不可预测性。其三:用户需求不断变化,如果最初的用户需求没有了解的很清楚,可能整个项目很快就会陷在不断变化的需求之中不能自拔。其四:客观条件的不确定性。在项目的进展过程中,可能会有人员的流动,可能会有资源的调整,可能会有这样或那样的客观条件的限制而阻挡了项目的正常进行。在这样高度的不确定之中,在较早阶段精确估计一个项目不只是很难地,甚至是不可能的。 3 造成工期延误的原因 3.1 开发人员的过分乐观 许多开发人员倾向于一切都会进展顺利,这种盲目的自信对于项目开发来说是不对的。如果按照最乐观的估计,可能绝大多数任务都不能按时完成,因为在软件开发中不确定因素实在太多了。对于任务的复杂性和难度,对于自己能支配的时间,对于可能的突发事件的干扰等没有清楚的认识和估计,即使对自己的时间表作出保证,也可能常常无法按时交货。 3.2 来自外部的压力 作为项目的管理者或者客户都希望项目早日结束,因而为项目设置了一个个时间节点。 这些时间节点可能设置的根本就不可能实现或者实现起来会有很大难度,但是开发人员为了按时完工只好加班加点,以最快的速度完成要求的功能,而对于系统结构的考虑就会放到次要的位置上去,这样就为今后程序的维护埋下了隐患。更可怕的是一个个bug会随着压力的增大而产生,最后造成更大量的返工。程序就象程序员的孩子一样,每个人都希望自己的孩子茁壮成长,但是没有办法,多生快生就不能优生。 3.3 项目以外事情的干扰 如果一个项目的开发人员经常被项目以外的事情所干扰、牵制,不能全身心地投入到项目开发之中,常常会因此而影响了进度。这种现象在规模较小的软件企业中比较多见,一个开发人员经常身兼多职,甚至同时参与多个项目的开发。如果其它项目急于完工,则该项目只好被拖延。 3.4 项目管理的混乱 软件企业内部项目管理的混乱似乎是一个世界性的通病。卡耐基梅隆大学软件工程研究所(SEI)建立了一套标准,用来衡量软件企业从混乱到持续发展的这种状态,这就是就是CMM五级标准。第一级最为混乱,每升高一级情况都有所好转,第五级状况最好。 到2001年1月底,全世界只有1654家软件公司和机构通过了不同级别的认证。从下图可以看出,这是一个金字塔型的分布状态,图上只显示了二级和二级以上的企业,而处在 金字塔最低层的那些一级企业的数目不知有多少个1654家!所以从世界范围来看,软件管理的总体水平还是很低的。 3.5 开发人员的不足 全世界对于人才的竞争可能在IT界表现的最为激烈。一方面人才的绝对数量不足导致了许多企业不能招到自己急需的人才;另一方面人才的流动也导致了企业很容易失去自己的员工。一个项目如果缺少人手或人才频繁流动,将不能保证项目的正常进展。 4 如何避免工期延误 4.1 对不确定性做好充分准备 中国人都对《三国演示》中的赤壁之战非常熟悉,诸葛亮在赤壁埋伏了数路伏兵对曹操进行围追堵截,一招不行,还有下一招,对整个过程做了非常周密的准备和部署,所以大获全胜。软件开发亦是如此,在项目展开的初期就应该对过程中可能会出现各种的情况有所准备,才不至于车到山前无路可走。 4.2 立足于产品的灵活性 设计的灵活性是一个软件产品的灵魂。好的设计总是容易维护和升级,而不好的设计却会为今后的维护带来很大的麻烦,甚至整个产品都可能被废弃重来。因此在软件开发的的初期应花很大力气致力于整体设计,而不是急于编码,磨刀不误砍柴工,前期的投入会获得高额回报的。 4.1 提高软件管理水平 ISO9000质量管理系统的标准系列是建立在这样一个前提上:如果生产和管理系统没有问题,那么其产品和提供的服务也就没有问题,这说明管理水平如何于产品的质量有至关重要的影响。 我认为一个软件企业提高管理水平的最好途径就是为自己制定一个目标,比如实现CMM的级别认证或者ISO9000质量体系认证,在对这些目标努力的过程中会逐渐提高自己的管理水平。 1 结束语 本文对软件开发过程中的困难之处和常常造成工期拖延的因素做了一些粗浅的分析,并不是很系统、全面。对于如何避免工期延误也提出了几点建议,恳请读者批评指正。 2 参考文献 1.卡耐基梅隆大学软件工程研究所. 软件能力成熟度模型(CMM):软件过程改进指南. 电子工业出版社,2001.07。 2.[德] 霍克,勒丁,帕克特,林德纳,米勒. 软件业的成功奥秘. 上海远东出版社,2000 3.龚键雅. 当代GIS的若干理论与技术. 武汉测绘科技大学出版社,1999.03 4.廖斌. CMM介绍1. 2001.09

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











세계 최초의 AI 프로그래머 데빈(Devin)이 태어난 지 한 달도 채 안 된 2022년 3월 3일, 프린스턴 대학의 NLP팀은 오픈소스 AI 프로그래머 SWE-에이전트를 개발했습니다. GPT-4 모델을 활용하여 GitHub 리포지토리의 문제를 자동으로 해결합니다. SWE-bench 테스트 세트에서 SWE-agent의 성능은 Devin과 유사하며 평균 93초가 걸리고 문제의 12.29%를 해결합니다. SWE-agent는 전용 터미널과 상호 작용하여 파일 내용을 열고 검색하고, 자동 구문 검사를 사용하고, 특정 줄을 편집하고, 테스트를 작성 및 실행할 수 있습니다. (참고: 위 내용은 원문 내용을 약간 조정한 것이지만 원문의 핵심 정보는 그대로 유지되며 지정된 단어 수 제한을 초과하지 않습니다.) SWE-A

Python 패키지 관리자는 Python 패키지를 관리하고 설치하기 위한 강력하고 편리한 도구입니다. 하지만, 사용 시 주의하지 않으면 다양한 함정에 빠질 수 있습니다. 이 문서에서는 개발자가 이러한 위험을 방지하는 데 도움이 되는 함정과 전략을 설명합니다. 함정 1: 설치 충돌 문제: 여러 패키지가 이름은 같지만 버전이 다른 함수나 클래스를 제공하는 경우 설치 충돌이 발생할 수 있습니다. 응답: 설치하기 전에 종속성을 확인하여 패키지 간에 충돌이 없는지 확인하십시오. 종속 항목의 자동 설치를 방지하려면 pip의 --no-deps 옵션을 사용하세요. 함정 2: 이전 버전 패키지 문제: 버전이 지정되지 않은 경우 더 안정적이거나 사용자 요구에 적합한 이전 버전이 있더라도 패키지 관리자가 최신 버전을 설치할 수 있습니다. 응답: p와 같이 설치할 때 필요한 버전을 명시적으로 지정하십시오.

JavaServerPages(jsP)는 동적 웹 애플리케이션을 만드는 데 사용되는 Java 기술입니다. JSP 스크립트는 서버 측에서 실행되고 클라이언트 측에서 html로 렌더링됩니다. 그러나 JSP 애플리케이션은 데이터 유출, 코드 실행 또는 서비스 거부로 이어질 수 있는 다양한 보안 취약성에 취약합니다. 일반적인 보안 취약점 1. XSS(교차 사이트 스크립팅) XSS 취약점을 통해 공격자는 웹 애플리케이션에 악성 스크립트를 주입할 수 있으며, 이는 피해자가 페이지에 액세스할 때 실행됩니다. 공격자는 이러한 스크립트를 사용하여 민감한 정보(예: 쿠키 및 세션 ID)를 도용하거나 사용자를 리디렉션하거나 페이지를 손상시킬 수 있습니다. 2. 주입 취약점 주입 취약점을 통해 공격자는 웹 애플리케이션의 데이터베이스에 쿼리할 수 있습니다.

버전 제어 시스템(VCS)은 개발자가 코드 변경 사항을 추적하고 관리할 수 있도록 하는 소프트웨어 개발에 없어서는 안 될 도구입니다. git은 Java 개발에 널리 사용되는 인기 있고 강력한 VCS입니다. 이 가이드에서는 Git의 기본 개념과 작업을 소개하여 Java 개발자에게 버전 제어의 기본 사항을 제공합니다. Git Repository의 기본 개념: 코드와 버전 기록이 저장되는 곳입니다. Branch: 개발자가 주요 개발 라인에 영향을 주지 않고 변경할 수 있도록 하는 코드 기반의 독립적인 개발 라인입니다. 커밋: 코드 베이스의 코드 변경입니다. 롤백: 코드 베이스를 이전 커밋으로 되돌립니다. 병합: 둘 이상의 분기의 변경 사항을 단일 분기로 병합합니다. Git 시작하기 1. Git 설치 공식 홈페이지에서 다운로드 및 다운로드

분산 시스템과 멀티 코어 프로세서가 등장하면서 동시 컬렉션은 현대 소프트웨어 개발에서 매우 중요해졌습니다. Java 동시 컬렉션은 동시 액세스의 복잡성을 관리하면서 효율적이고 스레드로부터 안전한 컬렉션 구현을 제공합니다. 이 기사에서는 새로운 기능과 추세에 초점을 맞춰 Java 동시 컬렉션의 미래를 살펴봅니다. 새로운 기능 JSR354: 탄력적인 동시 컬렉션 jsR354는 극단적인 동시성 조건에서도 성능과 안정성을 보장하기 위해 탄력적인 동작을 갖춘 새로운 동시 컬렉션 인터페이스를 정의합니다. 이러한 인터페이스는 변경 가능한 불변성 및 비차단 반복 지원과 같은 추가 원자성 기능을 제공합니다. RxJava3.0: 반응형 동시 컬렉션 RxJava3.0은 반응형 프로그래밍 개념을 도입하여 동시 컬렉션을 반응형 데이터 흐름과 쉽게 통합할 수 있도록 합니다.

파일은 컴퓨터 시스템의 정보 저장 및 관리의 기본 단위이며 Java 파일 작업의 핵심이기도 합니다. 파일을 효과적으로 운영하고 관리하려면 파일의 특성을 이해하는 것이 중요합니다. 추상화 및 계층 구조 파일은 기본적으로 디스크나 메모리와 같은 영구 매체에 저장된 데이터 집합을 나타내는 추상화입니다. 파일의 논리적 구조는 일반적으로 운영 체제에 의해 정의되며 데이터 구성 및 액세스를 위한 메커니즘을 제공합니다. Java에서 파일은 파일 시스템에 대한 추상적 액세스를 제공하는 File 클래스로 표시됩니다. 데이터 지속성 파일의 주요 특징 중 하나는 데이터 지속성입니다. 메모리의 데이터와 달리 파일의 데이터는 애플리케이션이 종료된 후에도 유지됩니다. 이러한 지속성은 파일을 장기간 저장하고 정보를 공유하는 데 유용하게 만듭니다.

PHPPhar 확장은 PHP 개발자에게 스크립트, 라이브러리 및 리소스를 패키지하는 강력하고 유연한 방법을 제공합니다. Phar 아카이브를 생성함으로써 개발자는 파일 시스템 권한이나 종속성에 대한 걱정 없이 복잡한 애플리케이션을 쉽게 배포하고 배포할 수 있습니다. Phar 파일의 장점 단일 파일 배포: Phar 아카이브는 간편한 배포 및 배포를 위해 애플리케이션의 모든 구성 요소를 단일 파일로 패키지화합니다. 독립성: Phar 파일은 파일 시스템과 독립적이므로 PHP 인터프리터가 있는 모든 시스템에서 애플리케이션을 실행할 수 있습니다. 코드 보호: Phar 파일을 암호화하여 무단 액세스로부터 콘텐츠를 보호할 수 있습니다. 버전 제어: Phar 확장은 Phar 파일에 대한 버전 제어 지원을 제공하여 개발자가

여러 운영 체제에서 동시에 원활하게 실행될 수 있는 애플리케이션을 구축하려면 크로스 플랫폼 개발이 중요합니다. 선도적인 프로그래밍 언어인 Python과 Jython은 크로스 플랫폼 개발을 위한 강력한 솔루션을 제공하고 그 잠재력을 발휘합니다. Python의 크로스 플랫폼 호환성 Python은 가상 머신을 사용하여 코드를 실행하는 해석 언어입니다. 이 아키텍처를 사용하면 Python 코드를 Windows, Linux, MacOS 및 모바일 장치를 포함한 여러 플랫폼에서 실행할 수 있습니다. Python의 광범위한 플랫폼 지원은 크로스 플랫폼 애플리케이션 구축에 이상적입니다. 또한 Python에는 데이터 처리 및 WEB 개발부터 기계 학습 및 데이터에 이르기까지 광범위한 기능을 제공하는 풍부한 타사 라이브러리 생태계가 있습니다.
