透视软件开发过程中的难点

 更新时间:2016年11月25日 15:18  点击:1293
作者:田占海

1 引言
如果你是一个程序员,可能常常为不能按时完成任务而苦恼。如果你是一个项目经理,可能会觉得开发符合预算和进度要求的软件简直难于上青天。实际上,软件项目常常严重超期或超出预算仍是困扰着绝大多数软件机构的难题。据美国一份评估报告显示,17个主要的国防部软件合同中,平均28个月的进度计划推迟了20个月才完成。一个4年应该完成的任务,7年还未提交,其中没有一个项目按时完成。由于存在软件问题,B1轰炸机的部署被推迟了,同样的原因,580亿美元的A12飞机计划也被部分取消了。持续了二三十年的软件危机为什么愈演愈烈?软件开发为什么如此之难?本文试结合作者的体会对软件开发的困难之处做一剖析,并提出一些建议。
2 困难所在
2.1 极大的复杂性
大多数大型软件软件产品由几十甚至几百万行源代码构成,例如:Windows95操作系统由大约1100万行代码组成。每一行代码都可能影响到程序的其它部分,并且各个部分之间都可能互相影响。这样一个错综复杂的巨大系统当中,每一个小小的错误都可能导致整个系统崩溃。有些大型软件,例如Windows,可能是人类曾经建造过的最复杂的事物之一,从古至今最复杂的建筑都无法与之相比。
2.2 高度的不确定性
一个软件项目从一开始就存在许多不确定性因素。其一:用户需求很难确定。这是因为软件开发者很难详细了解用户的需求,甚至用户在看到产品之前也不清楚自己到底需要什么,所以从项目开发的自始至终都可能会有新的需求提出,致使系统结构不断修改,最终面目全非。其二:设计不完全可以预测。有时,一个设计时认为可行的方案,在实现时可能行不通,或者最初的设计方案存在很大的缺陷而没有及时发现,或者突然一个设计时没有料到的技术难点阻挡了项目的进度。从设计到实现实际上有着很大的不可预测性。其三:用户需求不断变化,如果最初的用户需求没有了解的很清楚,可能整个项目很快就会陷在不断变化的需求之中不能自拔。其四:客观条件的不确定性。在项目的进展过程中,可能会有人员的流动,可能会有资源的调整,可能会有这样或那样的客观条件的限制而阻挡了项目的正常进行。在这样高度的不确定之中,在较早阶段精确估计一个项目不只是很难地,甚至是不可能的。
3 造成工期延误的原因
3.1 开发人员的过分乐观
许多开发人员倾向于一切都会进展顺利,这种盲目的自信对于项目开发来说是不对的。如果按照最乐观的估计,可能绝大多数任务都不能按时完成,因为在软件开发中不确定因素实在太多了。对于任务的复杂性和难度,对于自己能支配的时间,对于可能的突发事件的干扰等没有清楚的认识和估计,即使对自己的时间表作出保证,也可能常常无法按时交货。
4.5 mod_cgi 模组
这个模组包含在 mod_cgi.c 文件里,而且依预设会编译进来。它提供
CGI 指令稿的执行能力。任何 mime 型态为 application/x-httpd-cgi
的文件都将由这个模组处理。
4.5.1 摘要
任何拥有 application/x-httpd-cgi 之 mime 型态的文件都会被当作
CGI 指令稿,而且由服务器执行,并把输出传回客户端。文件可以藉由
使用 AddType 指令所定义的副文件名,或是藉由放在 ScriptAlias 所
设定的目录来成为这种型态。
当服务器启动一个 CGI 指令稿时,它将加上一个称为 DOCUMENT_ROOT
的环境参数。这个参数将会包含 DocumentRoot 配置的内容。
4.5.2 CGI 环境参数
这个服务器将会设立定义在 CGI 规格中的 CGI 环境参数,配合下列
的但书:
REMOTE_HOST
这只有在服务器没有配合 MINIMAL_DNS 编译的时候才会设定。
REMOTE_IDENT
这只有在 IdentityCheck 设为 on 的时候才会设定。
REMOTE_USER
这只有在 CGI 指令稿需要验认的时候才会设定。
4.6 mod_dir 模组
这个模组包含在 mod_dir.c 文件里,而且依预设会编译进来。它提供
作为目录索引之用。
4.6.1 摘要
这个模组控制目录索引。目录的索引可以有两种来源:
。一个由使用者所撰写的文件,典型是称为 index.html 的文件
。DrectoryIndex 指令设定这个文件的名称。
。另一种是由服务器所产生的列表。其它的指令控制这个列表的
格式。AddIcon, AddIconByEncoding and AddIconByType 都
是用来设定显示不同文件型态所使用的图示列表;对於每种列
出的文件型态,显示列出的第一个符合的图示。
4.6.2 AddDescription
语法: AddDescription 字串 文件 文件 ...
用於: server config, virtual host, directory, .htaccess
需求: Indexes
状态: 基础
模组: mod_dir
这是设定某文件所要显示的描述,供象徵索引(FancyIndexing) 使用。
文件是指所要描述之文件的副文件名,部份文件名称,替代字元表示式或
完整文件名称。
 字串以双引号(") 括起。例如:
AddDescription "The planet Mars" /web/pics/mars.gif
4.6.3 AddIcon
语法: AddIcon 图示 名称 名称 ...
用於: server config, virtual host, directory, .htaccess
许多机构已经采用了Apach和PHP作为他们的Web应用环境。在Web services模式中采用PHP可能看上去可能会比较难。但是事实上,搭配NuSoap,你可以轻松的应用PHP构建SOAP的客户端和服务器端。

一个例子便能说明一切,让我们先看一个例子

为了说明如何应用NuSoap和PHP来构建Web services,我们将举一个简单的例子。这个例子应用程序由一个PHP Web services的服务器端和客户端组成。他将实现两个功能:颠倒一个字符串字符的顺序,求两个数的和。

PHP SOAP服务器
用PHP和NuSoap来建立SOAP服务器非常容易。基本上,你只要写出你想要暴露给你的Web services的函数,然后用NuSoap去注册它们就可以了。

OK,另外还需要两步才能完成PHP SOAP服务器的建立。首先你还要在你的PHP代码中创建NuSoap对象的一个实例,然后用HTTP POST方法将原始数据传给NuSoap进行处理。听起来简单吧。先看看清单1。

清单1:soapfunc.php
<?
require_once('nusoap.php');
function reverse($str){
    $retval = "";
     if(strlen($str) < 1) {
    return new soap_fault('Client','','Invalid string');
     }
     for ($i = 1; $i <= strlen($str); $i++) {
        $retval .= $str[(strlen($str) - $i)];
     }
    return $retval;
}
function add2numbers($num1, $num2) {
     if (trim($num1) != intval($num1)) {
        return new soap_fault('Client', '', 'The     first number is invalid');
    }
    if (trim($num2) != intval($num2)) {
    return new soap_fault('Client', '', 'The second number is invalid');
    }
    return ($num1 + $num2);
}
?>
清单1给出了soapfunc.php的源文件。这个文件包含了我们想通过SOAP协议暴露给Web services的两个函数:reverse和add2numbers,它们是我们这个Web services 应用的核心。函数reverse带一个参数,颠倒字符串中的字符的顺序,然后返回。
转载自eNet(http://www.etechnic.com.cn/document/20010111/2001011111291801.shtml)
时间:2001/01/11 11:29 作者:dodo OSO奥索
 PHP 4.04 用了已经一段时间了,感觉很好,特别是这个 3M 多的完整版本自带了很多好东东。但是看到有不少朋友还在用老的版本,特此推荐。
地址:http://www.php.net/downloads.php
PHP 4.0.4 - 19 December 2000
(3.79 Mb CGI binary and ISAPI module included, MySQL support built-in, many
extensions included, packaged as zip)
(3.79 Mb 已经包含了 CGI 和 ISAPI 模块,内建对 MySQL 的支持,包含了许多扩展模块,Zip 格式)
  本地下载
附带的说明 E 文太长了,现在只说一下在 Apache 下的安装(大多数人都用 Apache 的吧?):
先假设 Apache 安装在 c:Apache 下,PHP 解压到 c:PHP 下,windows 目录是
c:windows (win98) 或者 c:winnt (win2000)。
1. 关闭 Apache.
编辑 c:Apacheconfhttpd.conf ,根据你的情况加入这几行:
2. 把 c:PHPphp4ts.dll 拷到 c:windowssystem (win98) 或者
c:winntsystem32 (win2000) 下,覆盖任何原有文件。
# 以 Apache 模块方式安装,在 httpd.conf 中加入如下几行:
LoadModule php4_module c:/php/sapi/php4apache.dll
AddType application/x-httpd-php .php
(是不是比用那个 mod_php4-4.x.zip 方便多了)
# 以 CGI 方式安装,在 httpd.conf 中加入如下几行:
ScriptAlias /php/ "C:/php/"
Action application/x-httpd-php4 "/php/php.exe"
AddType application/x-httpd-php4 .php
3. 把 c:php.ini-dist 拷到 c:windows (win98) 或者 c:winnt (win2000), 改
名为 php.ini, 根据你的需要编辑它。
必须要改的是 extension_dir = c:/php
4. 重起 Apache.

一、安装Apache    
到发布Apache的官方站点htp://www.apache.org/dist,将apache_1_3_x.win32.exe下载到你的本机上并将其运行安装到c:Apache。如果安装没出什么错的话,安装完毕之后,Apache就可以开始使用了。其中在Apache的安装目录下面有很多readme文件可供参考,但仅有一个文件是讲Win32平台的,包括Window 9x和Windows NT。
 
二、安装PHP    
到PHP的官方发布站点上,选择一个镜像,找到下载区域,选择“Source code and Windows distribution”,下载“Windows Binary”。你只须要将当下来的文件解压到你喜欢的目录中,如C:PHP4B3.我推荐用版本号作为目录名,这样将来你试用更新版本时,无须删掉老的版本。在Windows 95/97下安装PHP4 Beta,需要有DCOM的支持。如果你的机器上未装, 到这里去下载一份。
 
三、配置PHP    
与PHP一起分发的文件包里有一个PHP的主要配置文件PHP.INI-dist。将它拷贝到你的Windows系统目录(Windows 9x的Windows或Windows NT的WinNT目录),并且改名为PHP.INI。需要对此文件作适当的修改,最主要的事情是加入一些可能要用到的模块,象加入MySQL的支持等。在PHP.INI文件中找到“Dynamic Extensions”一栏:
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;    
修改 ;extension=php_mysql.dll    
除去前边的";"号    
在特定情况下,如果你想要用的DLL文件不在这个列表中,只需要简单地加上一行,如: “extension=mydll.dll”。这样,PHP就配置好了。
 
四、让Apache与PHP一起工作    
找到第一节里你安装Apache的目录,用你喜欢的文件编辑器打开.confhttpd.conf文件,在本例中是c:Apacheconfhttpd.conf(这个是APACHE的最主要的配置文件)。要让Apache与PHP一起工作,你只要加入几行即可,如下:    
ScriptAlias /php4b3/ "C:/PHP4B3/"    
AddType application/x-httpd-php3 .php3    
AddType application/x-httpd-php3 .php    
AddType application/x-httpd-php3 .phtml    
Action application/x-httpd-php3 "/php4b3/php.exe"    
[!--infotagslink--]

相关文章

  • vscode搭建STM32开发环境的详细过程

    这篇文章主要介绍了vscode搭建STM32开发环境的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-02
  • 安卓开发之Intent传递Object与List教程

    下面我们一起来看一篇关于 安卓开发之Intent传递Object与List的例子,希望这个例子能够为各位同学带来帮助。 Intent 不仅可以传单个的值,也可以传对象与数据集合...2016-09-20
  • php微信公众账号开发之五个坑(二)

    这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
  • 微信开发生成带参数的二维码的讲解

    在微信公众号平台开发者那里,在“账号管理”那里,有一项功能是“生成带参数的二维码”,通过这儿生成的二维码,只要通过微信扫一扫之后,会把事件自动推送到微...2016-05-19
  • 如何设计一个安全的API接口详解

    在日常开发中,总会接触到各种接口,前后端数据传输接口,第三方业务平台接口,下面这篇文章主要给大家介绍了关于如何设计一个安全的API接口的相关资料,需要的朋友可以参考下...2021-08-12
  • 分享我对JS插件开发的一些感想和心得

    这篇文章主要给大家分享我对JS插件开发的一些感想和心得的相关资料,需要的朋友可以参考下...2016-02-09
  • Chrome插件开发系列一:弹窗终结者开发实战

    从这一节开始,我们将从零开始打造我们的chrome插件工具库,第一节我们将讲一下插件开发的基础知识并构建一个简单但却很实用的插件,在构建之前,我们先简单的了解一下插件以及插件开发的基础知识...2020-10-03
  • Cocos2d-x UI开发之CCControlColourPicker控件类使用实例

    这篇文章主要介绍了Cocos2d-x UI开发之CCControlColourPicker控件类使用实例,本文代码中包含大量注释来讲解CCControlColourPicker控件类的使用,需要的朋友可以参考下...2020-04-25
  • 详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现

    这篇文章主要介绍了详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现的相关资料,需要的朋友可以参考下...2017-03-13
  • Java开发SpringBoot集成接口文档实现示例

    这篇文章主要为大家介绍了Java开发SpringBoot如何集成接口文档的实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步...2021-10-28
  • C#定时每天00点00分00秒自动重启软件

    这篇文章主要为大家详细介绍了C#定时每天00点00分00秒自动重启软件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-11-03
  • 24个ES6方法解决JS实际开发问题(小结)

    这篇文章主要介绍了24个ES6方法解决JS实际开发问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-01
  • Drupal8模块开发之区块和表单教程

    前页我们讲了 Drupal8模块开发之路由、控制器和菜单链接教程 ,现在我们将学习进一步开发Drupal8模块,区块和表单。 上一教程:Drupal8模块开发之路由、控制器和菜单链...2016-11-25
  • 详解软件系统稳定性的三大秘密

    随着软件复杂性越来越高,稳定性的保障越来越难,随着服务规模越来越大,稳定性的重要性越来越高。工程师在设计和开发软件的时候,要坚持底板思维。...2021-05-20
  • Unity3D游戏开发数据持久化PlayerPrefs的用法详解

    在本篇文章里小编给大家整理了关于Unity3D游戏开发之数据持久化PlayerPrefs的使用的相关知识点内容,需要的朋友们参考下。...2020-06-25
  • Android 组件开发之带label的文本输入框(EditText)

    文章给大家介绍Android 组件开发之带label的文本输入框(EditText),有需要了解的朋友可参考,希望此教程对各位有所帮助。 在Android开发中,我们的Activity都不免要用...2016-09-20
  • 基于React-Dropzone开发上传组件功能(实例演示)

    这篇文章主要介绍了基于React-Dropzone开发上传组件,主要讲述的是在React-Flask框架上开发上传组件的技巧,需要的朋友可以参考下...2021-08-16
  • 比较简单的虚拟主机管理软件MyIIS 1.0.0

    MyIIS 做了部分,程序只写了些函数(带数据库),具体调用各位写逻辑程序实现...2016-01-27
  • .Net WInform开发笔记(二)Winform程序运行结构图及TCP协议在Winform中的应用

    中午没事,把去年刚毕业那会画的几张图翻出来了,大概介绍Winform应用程序运行的过程,以及TCP协议在Winform中的应用。感兴趣的朋友可以了解下;如果有Windows消息机制等基础,很好理解这两张...2020-06-25
  • PHP开发中实用的两条SQL

    这两天项目开发中,需要实现一些比较实用的功能,用了两个使用的sql,总结一下,怕下次忘记了。 1. 检索数据库中跟提交的内容相匹配的内容 比如:提交的数据是“游...2016-11-25