透视软件开发过程中的难点
作者:田占海 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ヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









世界初の AI プログラマー Devin の誕生から 1 か月も経たない 2022 年 3 月 3 日、プリンストン大学の NLP チームはオープンソース AI プログラマー SWE-agent を開発しました。 GPT-4 モデルを利用して、GitHub リポジトリの問題を自動的に解決します。 SWE ベンチ テスト セットにおける SWE エージェントのパフォーマンスは Devin と同様で、平均 93 秒かかり、問題の 12.29% を解決しました。専用端末と対話することで、SWE エージェントはファイルの内容を開いて検索したり、自動構文チェックを使用したり、特定の行を編集したり、テストを作成して実行したりできます。 (注: 上記の内容は元の内容を若干調整したものですが、原文の重要な情報は保持されており、指定された文字数制限を超えていません。) SWE-A

Python パッケージ マネージャーは、Python パッケージを管理およびインストールするための強力で便利なツールです。しかし、使い方に注意しないと、さまざまな罠に陥る可能性があります。この記事では、これらの落とし穴と、開発者がそれらを回避するための戦略について説明します。トラップ 1: インストールの競合の問題: 複数のパッケージが同じ名前でバージョンの異なる関数またはクラスを提供すると、インストールの競合が発生する可能性があります。応答: インストール前に依存関係をチェックして、パッケージ間に競合がないことを確認してください。依存関係の自動インストールを回避するには、pip の --no-deps オプションを使用します。落とし穴 2: 古いバージョンのパッケージの問題: バージョンが指定されていない場合、より安定した、またはニーズに合った古いバージョンがある場合でも、パッケージ マネージャーは最新バージョンをインストールすることがあります。応答: インストール時に必要なバージョンを明示的に指定します (例: p)

JavaServerPages (jsP) は、動的な WEB アプリケーションの作成に使用される Java テクノロジです。 JSP スクリプトはサーバー側で実行され、クライアント側で HTML にレンダリングされます。ただし、JSP アプリケーションは、データ漏洩、コード実行、またはサービス妨害につながる可能性のあるさまざまなセキュリティ脆弱性の影響を受けやすくなります。一般的なセキュリティの脆弱性 1. クロスサイト スクリプティング (XSS) XSS の脆弱性により、攻撃者は悪意のあるスクリプトを Web アプリケーションに挿入することができ、被害者がページにアクセスしたときにスクリプトが実行されます。攻撃者はこれらのスクリプトを使用して、機密情報 (Cookie やセッション ID など) を盗んだり、ユーザーをリダイレクトしたり、ページを侵害したりする可能性があります。 2. インジェクションの脆弱性 インジェクションの脆弱性により、攻撃者は Web アプリケーションのデータベースにクエリを実行できます。

バージョン管理システム (VCS) は、開発者がコードの変更を追跡および管理できるようにする、ソフトウェア開発に不可欠なツールです。 git は、Java 開発で広く使用されている、人気のある強力な VCS です。このガイドでは、Git の基本概念と操作を紹介し、Java 開発者にバージョン管理の基本を提供します。 Git リポジトリの基本概念: コードとバージョン履歴が保存される場所。ブランチ: コード ベース内の独立した開発ライン。開発者は、開発の主要ラインに影響を与えることなく変更を加えることができます。コミット: コードベース内のコードへの変更。ロールバック: コードベースを以前のコミットに戻します。マージ: 2 つ以上のブランチの変更を 1 つのブランチにマージします。 Git 入門 1. Git をインストールする 公式 Web サイトからダウンロードしてダウンロードします

分散システムとマルチコア プロセッサの台頭により、最新のソフトウェア開発では同時コレクションが重要になっています。 Java 同時コレクションは、同時アクセスの複雑さを管理しながら、効率的でスレッドセーフなコレクション実装を提供します。この記事では、新機能とトレンドに焦点を当てて、Java での同時コレクションの将来について探ります。新機能 JSR354: 復元力のある同時コレクション jsR354 は、極端な同時実行条件下でもパフォーマンスと信頼性を確保するための、柔軟な動作を備えた新しい同時コレクション インターフェイスを定義します。これらのインターフェイスは、変更可能な不変式やノンブロッキング反復のサポートなど、アトミック性の追加機能を提供します。 RxJava3.0: リアクティブな同時コレクション RxJava3.0 では、リアクティブ プログラミングの概念が導入され、同時コレクションをリアクティブ データ フローと簡単に統合できるようになります。

ファイルは、コンピュータ システムにおける情報の保存と管理の基本単位であり、Java ファイル操作の中核でもあります。ファイルを効果的に操作および管理するには、ファイルの性質を理解することが重要です。抽象化と階層 ファイルは本質的に、ディスクやメモリなどの永続的な媒体に格納されているデータのセットを表す抽象化です。ファイルの論理構造は通常、オペレーティング システムによって定義され、データを整理してアクセスするためのメカニズムを提供します。 Java では、ファイルは File クラスによって表され、ファイル システムへの抽象アクセスを提供します。データの永続性 ファイルの重要な特性の 1 つは、データの永続性です。メモリ内のデータとは異なり、ファイル内のデータはアプリケーションが終了した後も保持されます。この永続性により、ファイルは情報の長期保存や共有に役立ちます。

PHPPhar 拡張機能は、PHP 開発者にスクリプト、ライブラリ、リソースをパッケージ化する強力かつ柔軟な方法を提供します。 Phar アーカイブを作成すると、開発者はファイル システムのアクセス許可や依存関係を気にすることなく、複雑なアプリケーションを簡単にデプロイおよび配布できます。 Phar ファイルの利点 単一ファイルのデプロイメント: Phar アーカイブは、アプリケーションのすべてのコンポーネントを単一のファイルにパッケージ化し、配布とデプロイメントを容易にします。独立性: Phar ファイルはファイル システムから独立しているため、アプリケーションは PHP インタープリターを備えた任意のマシン上で実行できます。コード保護: Phar ファイルを暗号化して、コンテンツを不正アクセスから保護できます。バージョン管理: Phar 拡張機能は Phar ファイルのバージョン管理サポートを提供し、開発者が Phar ファイルを追跡できるようにします。

クロスプラットフォーム開発は、複数のオペレーティング システム上で同時にシームレスに実行されるアプリケーションを構築するために重要です。 Python と Jython は、主要なプログラミング言語として、クロスプラットフォーム開発のための強力なソリューションを提供し、その可能性を解き放ちます。 Python のクロスプラットフォーム互換性 Python は、仮想マシンを使用してコードを実行するインタープリタ言語です。このアーキテクチャにより、Python コードを Windows、Linux、MacOS、モバイル デバイスなどの複数のプラットフォームで実行できます。 Python は幅広いプラットフォームをサポートしているため、クロスプラットフォーム アプリケーションの構築に最適です。さらに、Python には、データ処理や WEB 開発から機械学習やデータに至るまで、幅広い機能を提供するサードパーティ ライブラリの豊富なエコシステムがあります。
