Warning:
警告:
1. LICENSE: BSD License
1、许可证:BSD许可
2、NOTICE: Under Freebsd/Linux, this document maybe including unreadable and blank area
2. 注意:本文章使用中文,可能在freebsd/linux下有乱码和空白
背景: Background
做了一段时间的FREEBSD的开发工作,以FREEBSD为开发平台和开发对象都有。拥有了一些经验和弯路,一并写出,希望大家有所获益。
主要内容: Main Content
简要介绍FREEBSD系统的一些开发经验和设计实现模式,希望有所反馈。
如何参与发展本文档? Join us
根据BSD许可证,您可以自由的修改和发布本文档,也欢迎将意见传递给lwen@freebsdchina.org
To-Do List:
1、以几个实际的项目为例,实例说明FREEBSD环境下开发的技术细节和解决方式。
2、编写本文章的续节:代码分析,编写代码,代码排错的一般过程。
A、开发环境
1、FREEBSD平台
1.1 FreeBSD 最小安装 + 所有的[url=http://www.pccode.net].net" class="wordstyle"源码
1.2 安装ports目录环境
1.3 选择sh作为基本的shell,这样符合GNU编码标准
2、准备开发环境
2.1 cvsd;
2.2 apache;
2.3 postgresql;
2.4 autoconf;
2.5 automake;
2.6 emacs / vi.
3、启动开发环境,设置相应的CLIENT用户
B、开发初始化
第一步:建立开发项目环境
1、建立project目录;
2、建立research目录;用来记录项目进程的问题分析、解决文档
3、建立doc目录;用来记录已经成型的系统设计文本;
4、建立GNU目录;用来存放基本的GNU文件、许可、README;
5、建立src0目录;用来编写最为原始的程序和实现测试程序;
6、建立src1目录;用来存放比较完整的库程序和程序;
7、建立src2目录;用来存放最终的产品程序。
第二步:实现系统分析
1、推荐选择首先设计开发系统的库文件:MySoftware API,这样开发软件比较容易,并且容易扩展;也容易让第三方开发自己的系统;
2、推荐设计测试程序,这样软件可以通过比较容易的方式进行测试,包括测试环境、测试负载、功能测试(宏测试),程序最好留出测试接口;
3、采用GNU的编码标准,并且建立自己的编码标准,并且尽量进行提高;
第三步:协同开发(同步开发/异步开发)
1、采用local的cvs服务控制自己的开发进程,并且拥有私有记录,便于回溯;
2、利用网络的cvs服务器进行比较完整的程序的版本控制,并且可以协作;
第四步:项目测试
1、测试程序测试、宏测试;
2、测试环境测试;
3、实际环境测试;
4、压力环境测试。
第五步:项目打包、发布
1、采用*.tar.gz,可以包含[url=http://www.pccode.net].net" class="wordstyle"源码,让更多的了解和参与;
2、写出可以顺利使用的交互式方式,例如:电子邮件;
3、指出你的项目帮助文档所在的位置。
C、项目开发模版:
1、分析自己的项目;
2、寻找可以借鉴的开源项目[url=http://www.pccode.net].net" class="wordstyle"源码;
3、寻找合适的开发工具;
4、充分利用win界面环境;
5、快速反馈的渠道;
6、充足的时间面对屏幕。
现在进行逐条的解释:
-1:对于项目进行分析,评价可行性和可用性,这样可以坚定信心,并且让项目拥有一个持续扩展的潜力;
-2:借鉴[url=http://www.pccode.net].net" class="wordstyle"源码,可以让系统一开始就拥有一个比较成熟的结构,特别是可测试性,这个非常关键,往往成为下一阶段开发的灵感源泉和动力;
-3:合适的开发工具:对于开源项目来说,其实拥有非常多的开发工具可以使用(tons of ...),但是,选择是非常关键的,例如:cflow,sourcesight等等,需要开发者进行专业的选择;
-4:充分利用win界面:现阶段,很多的资源、联系方式,都通过win界面来进行,开发者也可以利用这些资源。通过ssh登陆,CVS提交,可以轻松的解决编码、编译、协作的问题,而不必处于一个不断变化的系统中;
-5:现阶段的反馈渠道经常变化,例如:电子信箱、论坛、IRC,聊天工具,开发者需要提供稳定而多样的反馈方式,否则导致反馈渠道不畅。
-6:进行开发,一定要拥有充足的时间面对屏幕,才能实现稳定的设计。一天耗费5-10个小时左右似乎比较普遍。
D、开发的一些技巧
1、宏功能和微功能( Macro Function and Micro Function )
在很多的情况下,我们的设计是基于宏功能的,而计算机的提供是微功能的,我们需要利用LIB的方式,将微功能组。合起来,实现宏功能,将宏功能组合起来,则形成我们所需要的软件。
2、多进程并发操作
操作缓冲是非常重要的,可以显著的提高效率,可能需要设计几个缓冲层(越多越复杂);对于高负载的进程并发操作,我们可能需要利用汇编来保证原子级操作,并且具有最好的速度。
3、分布式负载
算法非常重要
4、过于复杂的系统
对于庞大的系统,分割成为清晰、简单的层次结构非常重要。此时,简单似乎占据上风(这是我们愿意看到的:) )。使用分层(layer)的方式,是最好的解决方案。甚至系统的成败取决于分层设计是否正确。
5、关于开发语言的选择
当然是C——允许有不同的观点。
以下仅仅是一些仅供参考的观点:
1、C++是不推荐的,主要是基于内存使用和运行的考虑;
2、对于CGI来说,使用C也是最好的选择。(也许不同的意见更多)。
6、程序设计,需要支持配置脚本
这样程序运行时,适用范围更广。
6.1拥有一个脚本库直接获得配置脚本的支持。
6.2如果是GUI界面,则需要对于这个脚本配置的工具程序
7、失落的档案:这是一个提醒
这是一个程序员常犯的错误。立刻准备一套光盘刻录设备,经常备份自己的成果(一次备份2张光碟,并且做好标记)。否则,xxMB的数据不见了,可来不及的。
8、无论如何,立刻标记上软件版本号,从0.0.1v开始
使用0.0.1v开始开发的程序具有一个有趣的特性,可能在你不知不觉中发展到0.7v,甚至v1.x,这是一个令人兴奋的过程,也许,这就是开发的乐趣所在。
9、编程与程序设计的矛盾如何解决?
一般来说,我们都在不改变软件宏功能的情况下,让我们的程序结构更好、更清晰、容易编写。这些细节的编程设计,常常拥有很多的设计方案,我们需要进行编程实践,让各式各样的设计,在程序代码中获得统一。
E、系统开发的知识准备:
首先大致描述一下,细节待续
1、熟悉FREEBSD的系统数据结构。包括系统数据结构和网络相关的数据结构。
1.1 进程相关
1.2 I/O相关
1.3 Net相关
1.4 编程语言相关:编译器、语言库
2、调整MAKE参数,支持相关的函数库,并且打开调试选项,可以更好的支持调试,并且简单通过make可以编译程序
3、参照系统设计,建立与系统进行I/O的LIB。
4、完善程序以构件模块为主,实现程序的更多扩展功能。
5、编译系统的选择:
5.1 对于大多数的项目,编译器系统几乎是任意的,但是选择一个稳定的编译器,对于项目也是非常重要的;
5.2 相信对于编译器、调试器的熟悉,也是一个成功项目的基础。
6、项目中间测试:
5.1 寻找典型的测试环境。这是非常重要的。在系统设计中,就需要这样的准备工作,并且保持这个测试环境的稳定,才能获得第一手的数据;
5.2 利用CVS进行测试版本的控制工作,防止测试版本的混乱;
5.3 虚拟测试环境(这是一个前卫的项目)
7、项目开发环境选择
7.1 推荐字符界面,相信大家喜欢一个干净的环境;
7.2 开发采用client/server的方式,也是一种较好的方案。Client采用win或bsd,在server上进行编译,在单机进行测试或者在server进行测试;
7.3 推荐开发者不要维护一个GUI界面,这样会浪费大量的时间。最好拥有一个独立的GUI测试平台;
7.4 相信一个reference目录是非常重要的。里面拥有的文档、书籍、例程在缺乏灵感的时候可以助你一臂之力,并且保持你的项目的标准。
F、软件项目快速分析
1、密集度分析模型
相信大家一定使用了某种软件项目分析技术来分析我们需要从事的编程项目。下面介绍一种快速、实用的分析模型:密集度分析模型。
实际上,对于编程人员来说,不需要掌握非常精确的分析方式,使用密集度模型,可以轻松的定义软件的特性,并且安排好一个项目的任务分配和开发进度。
密集度分析模型,可以用来快速分析软件项目,也可以分析软件的不同的模块,以下为软件项目为例:
首先,我们将软件项目分类为如下的类别:
类别名称
特征
实例
开发特性
界面密集类
繁多的界面反馈
GUI应用程序、终端前端
需要良好的用户设计以及界面功能的支持。
功能密集类
对于各种功能要求齐备和多样
数字编辑软件
需要编写大量的功能函数以及插件,对于界面要求相对低
理论密集类
要求程序体现很多编程理论
概念程序、C++复写程序、软件的第一实现版、B/S、C/S软件、算法程序
要求理论基础扎实,并且对于各种理论的实现具有经验。这类项目,非常依赖文档。
工作密集类
需要大量的工作时间和效率
成熟的应用软件
设计一般比较成熟,功能比较简单,需要花费时间去完善。可能依赖项目管理。
执行密集类
要求短时间执行的软件
网络响应、高速算法
需要优化和代码短小,往往是为了解决某些速度瓶颈问题。
I/O密集类
在短时间拥有大量的I/O操作
大规模数据传输、索引、数据存储处理
需要更多的缓冲,并且处理好多线程的问题
异常处理密集类
防止各种错误出现,并且试图从错误中恢复
硬件驱动、控制、系统软件
对于异常的捕捉、处理、恢复,以及对于新的异常的处理补丁。测试的成本相当高。
我们拿到一个软件项目(模块),只需要进行简单的判断,我们就可以确定个人需要作的主要的工作,确定工作的计划。
2、清晰度分析模型
清晰度分析模型,就是看相关的开发人员,对于需要开发的项目的清晰程序。一般来说,清晰度越高,包括设计、编程、经验,则项目的成功率越高。项目的进展速度也会更快。清晰度,实际上也反映了项目的难易度。
这样,利用一个简单的清晰度分析,就可以大致的清晰开发组成员的能力和发展方向。对于新加入的成员,也会产生良好的效果。
更多的,如果有些成员的清晰度不高,则需要重新的测试技术和培养能力,则可能需要一段时间进行适应。
3、确立高级的最终产品设计
对于开发产品而言,我们需要借鉴各种国际上的开源产品的代码。我们往往会发现很多产品,哪怕是非常简单的编辑软件,都可能使用了高级的编程技术。例如:CORBA、C/S、XML、嵌入式汇编、编译器适应、非公开的调用、多进程文件锁、多CPU总线锁、分布式构件以及独特的C++设计视角等等。
我们需要借鉴和利用这些流行的技术,不一定非要在项目的0.0.1版上应用,但是我们需要清晰软件项目的发展方向。
这样做,将会让我们从一个简单的0.0.1版开始,最终实现最好的软件系统。
4、确定整体项目的开发模型。
实际上,开发一般分为两种模式:
1、从一开始就设计和实现一个合格的系统;(以3.0版进行发布)
2、首先建立一个系统(0.0.1版),然后找一批人完善和升级这个系统。