透视软件开发过程中的难点
作者:田占海 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

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Pada 3 Mac 2022, kurang daripada sebulan selepas kelahiran pengaturcara AI pertama di dunia, Devin, pasukan NLP Universiti Princeton membangunkan pengaturcara AI sumber terbuka ejen SWE. Ia memanfaatkan model GPT-4 untuk menyelesaikan isu secara automatik dalam repositori GitHub. Prestasi ejen SWE pada set ujian bangku SWE adalah serupa dengan Devin, mengambil purata 93 saat dan menyelesaikan 12.29% masalah. Dengan berinteraksi dengan terminal khusus, ejen SWE boleh membuka dan mencari kandungan fail, menggunakan semakan sintaks automatik, mengedit baris tertentu dan menulis serta melaksanakan ujian. (Nota: Kandungan di atas adalah sedikit pelarasan bagi kandungan asal, tetapi maklumat utama dalam teks asal dikekalkan dan tidak melebihi had perkataan yang ditentukan.) SWE-A

Pengurus pakej python ialah alat yang berkuasa dan mudah untuk mengurus dan memasang pakej Python. Walau bagaimanapun, jika anda tidak berhati-hati semasa menggunakannya, anda mungkin terjebak dalam pelbagai perangkap. Artikel ini menerangkan perangkap dan strategi ini untuk membantu pembangun mengelakkannya. Perangkap 1: Masalah konflik pemasangan: Apabila berbilang pakej menyediakan fungsi atau kelas dengan nama yang sama tetapi versi berbeza, konflik pemasangan mungkin berlaku. Respons: Semak kebergantungan sebelum pemasangan untuk memastikan tiada konflik antara pakej. Gunakan pilihan --no-deps pip untuk mengelakkan pemasangan automatik kebergantungan. Kesalahan 2: Isu pakej versi lama: Jika versi tidak dinyatakan, pengurus pakej boleh memasang versi terkini walaupun terdapat versi lama yang lebih stabil atau sesuai untuk keperluan anda. Respons: Nyatakan versi yang diperlukan secara eksplisit semasa memasang, seperti p

JavaServerPages (jsP) ialah teknologi Java yang digunakan untuk mencipta aplikasi WEB dinamik. Skrip JSP dilaksanakan pada bahagian pelayan dan diberikan kepada html pada bahagian klien. Walau bagaimanapun, aplikasi JSP terdedah kepada pelbagai kelemahan keselamatan yang boleh menyebabkan kebocoran data, pelaksanaan kod atau penafian perkhidmatan. Kerentanan keselamatan biasa 1. Penskripan silang tapak (XSS) Kerentanan XSS membenarkan penyerang menyuntik skrip berniat jahat ke dalam aplikasi web, yang akan dilaksanakan apabila mangsa mengakses halaman tersebut. Penyerang boleh menggunakan skrip ini untuk mencuri maklumat sensitif (seperti kuki dan ID sesi), mengubah hala pengguna atau halaman berkompromi. 2. Kerentanan Suntikan Kerentanan suntikan membolehkan penyerang menanyakan pangkalan data aplikasi web

Sambungan PHPPhar menyediakan pembangun PHP dengan cara yang berkuasa dan fleksibel untuk membungkus skrip, perpustakaan dan sumber. Dengan mencipta arkib Phar, pembangun boleh menggunakan dan mengedarkan aplikasi kompleks dengan mudah tanpa perlu risau tentang kebenaran atau kebergantungan sistem fail. Kelebihan fail Phar Penggunaan fail tunggal: Phar mengarkibkan membungkus semua komponen aplikasi ke dalam satu fail untuk pengedaran dan penggunaan yang mudah. Kebebasan: Fail Phar adalah bebas daripada sistem fail, jadi aplikasi boleh dijalankan pada mana-mana mesin dengan penterjemah PHP. Perlindungan Kod: Fail Phar boleh disulitkan untuk melindungi kandungannya daripada akses tanpa kebenaran. Kawalan Versi: Sambungan Phar menyediakan sokongan kawalan versi untuk fail Phar, membenarkan pembangun menjejak

Pembangunan merentas platform adalah penting untuk membina aplikasi yang berjalan lancar pada berbilang sistem pengendalian secara serentak. Python dan Jython, sebagai bahasa pengaturcaraan terkemuka, menyediakan penyelesaian yang berkuasa untuk pembangunan merentas platform dan melancarkan potensi mereka. Keserasian merentas platform Python Python ialah bahasa yang ditafsirkan yang menggunakan mesin maya untuk melaksanakan kod. Seni bina ini membolehkan kod Python dijalankan pada berbilang platform, termasuk Windows, Linux, MacOS dan peranti mudah alih. Sokongan platform luas Python menjadikannya sesuai untuk membina aplikasi merentas platform. Selain itu, Python mempunyai ekosistem yang kaya dengan perpustakaan pihak ketiga yang menyediakan pelbagai fungsi, daripada pemprosesan data dan pembangunan WEB kepada pembelajaran mesin dan data

Dengan peningkatan sistem teragih dan pemproses berbilang teras, koleksi serentak telah menjadi kritikal dalam pembangunan perisian moden. Koleksi serentak Java menyediakan pelaksanaan koleksi yang cekap dan selamat benang sambil menguruskan kerumitan akses serentak. Artikel ini meneroka masa depan koleksi serentak di Jawa, memfokuskan pada ciri dan aliran baharu. Ciri baharu JSR354: Koleksi serentak berdaya tahan jsR354 mentakrifkan antara muka koleksi serentak baharu dengan gelagat anjal untuk memastikan prestasi dan kebolehpercayaan walaupun dalam keadaan serentak yang melampau. Antara muka ini menyediakan ciri tambahan atomicity, seperti sokongan untuk invarian boleh ubah dan lelaran tidak menyekat. RxJava3.0: Koleksi Serentak Reaktif RxJava3.0 memperkenalkan konsep pengaturcaraan reaktif, membolehkan koleksi serentak disepadukan dengan mudah dengan aliran data reaktif.

Fail ialah unit asas penyimpanan dan pengurusan maklumat dalam sistem komputer, dan juga merupakan fokus teras operasi fail Java. Memahami sifat fail adalah penting untuk mengendalikan dan mengurusnya dengan berkesan. Abstraksi dan Hierarki Fail pada asasnya adalah abstraksi yang mewakili satu set data yang disimpan dalam medium berterusan seperti cakera atau memori. Struktur logik fail biasanya ditakrifkan oleh sistem pengendalian dan menyediakan mekanisme untuk mengatur dan mengakses data. Di Java, fail diwakili oleh kelas Fail, yang menyediakan akses abstrak kepada sistem fail. Kegigihan Data Salah satu ciri utama fail ialah kegigihan datanya. Tidak seperti data dalam ingatan, data dalam fail kekal walaupun selepas aplikasi keluar. Kegigihan ini menjadikan fail berguna untuk penyimpanan jangka panjang dan perkongsian maklumat.

Sistem kawalan versi (VCS) ialah alat yang sangat diperlukan dalam pembangunan perisian yang membolehkan pembangun menjejak dan mengurus perubahan kod. git ialah VCS yang popular dan berkuasa yang digunakan secara meluas dalam pembangunan Java. Panduan ini akan memperkenalkan konsep asas dan operasi Git, menyediakan pembangun Java dengan asas kawalan versi. Konsep asas Repositori Git: tempat kod dan sejarah versi disimpan. Cawangan: Barisan pembangunan bebas dalam pangkalan kod yang membolehkan pembangun membuat perubahan tanpa menjejaskan baris pembangunan utama. Komit: Perubahan kepada kod dalam pangkalan kod. Rollback: Kembalikan asas kod kepada komit sebelumnya. Gabung: Gabungkan perubahan daripada dua atau lebih cawangan menjadi satu cawangan. Bermula dengan Git 1. Pasang Git Muat turun dan muat turun dari tapak web rasmi
