转自:http://blog.csdn.net/jinxfei/archive/2009/05/27/4221623.aspx

周一到周三,我的领导亲自操刀,完成了一项小小的功能。

功能虽小,但从构思到实现,再到稳定运行,几乎包含了软件开发的全过程。

这个过程完美的展示了 编写一段优秀的代码 需要考虑多少东西,我记下来给大家分享一下。

需求很简单

分析各类日志文件(如:Oracle的错误日志)的内容,并将其中符合条件的行转发到Syslog。

需求分析

读取日志并过滤内容比较简单,这个需求的关键点在于:必须考虑时效性和性能。

通常日志是不断增长的,

时效性,要求程序尽快分析新增日志。

性能,要求程序能够对日志做增量分析,以免去不必要的I/O开销。

制定方案

根据需求分析得到的功能需求和非功能需求,我们一致认为,需要一种手段来实时获取文件中的新增内容。

在Unix/Linux上,tail指令可以实现这种功能。

我们调查tail指令后发现一个严重的问题:

tail无法处理日志的切换。

这一问题否决了我们使用unix已有指令写shell的想法,于是决定自己编写一个类似tail的小工具。

在实现方案上,可以采用C或者Java两种方式,基于如下考虑:

1、日志在Unix/Linux上的情况占80%以上

2、目标主机上不一定具备java环境

3、要求对目标主机的资源消耗尽量小

因此,决定采用C来做实现,由于项目组人员以JAVA为主,所以领导亲自上阵了。

技术预演

技术预演是为了验证方案的可行性,如果方案的设想因为技术原因无法实现,则需要修改方案。

这个小功能的技术预演主要包括:

1、分析tail源码,了解tail实时获取文件增量的原理。

2、调查C中如何发送Syslog

实现

基本功能:

领导最初认为这个功能很简单,不会超过30行代码,而基本功能也确实很简单。

功能增强:

支持打开多个文件,

支持日志切换,

支持使用正则表达式对行进行过滤,

支持通过命令行参数制定Syslog输出的Severity和Facility

测试

将程序编译后挂到实际环境中测试,很快发现一些问题,

比如:

对参数的异常情况考虑不足

文件切换有两种模式,需要兼容(一种inode变,一种不变)

需要检查目标文件是否存在、是否为普通文本文件(二进制文件无法处理、目录也可以当做文件打开)

程序修正

解决测试中遇到的问题,

增加文件类型判断、兼容文件切换模式、参数错误时输出Usage等

除此之外,程序还进一步考虑了异常情况下(如:进程被kill)对资源的释放等。

再测试

在HP-UX平台上,功能测试基本没发现问题,

但迁移到Linux平台上发现正则表达式解析有问题,不能过滤掉无用的行。

再次修正

这次修正主要解决跨平台兼容性问题。

验收测试和稳定性测试

在个平台上部署,并长时间运行。

打包发布

预编译出常见平台的二进制代码,

编写相关安装和使用说明。

----

软件开发,无论功能大小,其实都需要这些过程,

只是对于小功能,每个阶段的切换很快(有时候只是脑海里的想法而已),

但心里要清楚:

有时候想省事儿,可能反而会更加费事儿,比如需求分析的时候搞不清楚就开始做,只会引起很多的返工。

而另外一些时候,卡在一个地方太久,想不清楚,可能需要先试着向前推进,很多问题就会“迎刃而解”。

山穷水复疑无路,柳暗花明又一村,

这是在软件开发过程中经常能够体会到得心路历程。

转载于:https://www.cnblogs.com/net205/articles/1492569.html

麻雀虽小,五脏俱全:从一个小功能看软件开发过程[转]相关推荐

  1. WPF制作的一个小功能,智能提示(IntelliSense)

    WPF制作的一个小功能,智能提示(IntelliSense) 原文 http://www.cnblogs.com/scheshan/archive/2012/06/30/2570867.html 最近 ...

  2. 给 OpenPOP.Net 加一个小功能,可用于收取邮件时监测数据流量!

    /* 最近写了一个自动收邮件的机器人,原来一开始偷懒"娶"了 COM 组件 JMail: <封装 JMail 4.4 的 POP3 为 .Net 组件 (.dll 程序集), ...

  3. v54.04 鸿蒙内核源码分析(静态链接) | 一个小项目看中间过程 | 百篇博客分析HarmonyOS源码

    子曰:"回也其庶乎,屡空.赐不受命,而货殖焉,亿则屡中." <论语>:先进篇 百篇博客系列篇.本篇为: v54.xx 鸿蒙内核源码分析(静态链接篇) | 一个小项目看中 ...

  4. 从一个小例子看贝叶斯公式的应用(学习简单、基础、入门的例子)

    #从一个小例子看贝叶斯公式的应用 ###应用Bayesian公式考察如下的实例并回答问题. 张某为了解自己患上了X疾病的可能性,去医院作常规血液检查.其结果居然为阳性,他赶忙到网上查询.根据网上的资料 ...

  5. 因为一个小功能,我对微信手机号转账的好感度加了10分

    微信支付上线了"手机号转账"功能,不加好友也能转账,这就意味着再也不能通过微信加好友转账来套路小姐姐微信了,但你可以通过手机号转账功能直接找小姐姐要手机号码. 作为一个稍微有点安全 ...

  6. 假如你能给「微信」增加一个小功能

    张小龙曾经调侃:每天有1亿人教我做产品. 我们都知道,用户提的需求,基本操作是扔进需求池,优先级拉到最低的. 但如果是产品经理提需求呢?会不会有点参考价值呢? 上周小编同学在社群提问: 以下分组整理了 ...

  7. 见微智著 - 从一个小例子看Python中的单元测试

    单元测试 据统计,由于软件缺陷(bug),美国经济每年在浪费生产力.返工和实际毁坏上损失了数十亿美元.近期最严重的案例是波音737 Max飞机的两次重大坠机事故,共造成了346人死亡.经过初步调查,该 ...

  8. 为ZooKeeper增加一个小功能:指定IP进行受限客户端过滤

    原文:http://rdc.taobao.com/team/jm/archives/1334 (所有要下载的文件都在这里:https://issues.apache.org/jira/browse/Z ...

  9. 一个小程序看流的读取

    今天我们开始学习C++的流读取. 流:一个字符序列 #include<iostream>int main() {int sun=0,a=0;while(std::cin>>a) ...

  10. python删除一个文件_Python 实现一个小功能: 删除某路径下文件及文件夹的脚本...

    下面是编程之家 jb51.cc 通过网络收集整理的代码片段. 编程之家小编现在分享给大家,也给大家做个参考. #!/usr/bin/env python import os import shutil ...

最新文章

  1. 2021年大数据常用语言Scala(十一):基础语法学习 方法参数
  2. 【每日一算法】最大子序列和
  3. 基于consul实现微服务的服务发现和负载均衡
  4. Advanced Science|北京大学第一医院肾脏内科杨莉团队与白凡研究组揭示急性肾损伤中始动和放大炎症巨噬细胞新亚群...
  5. MIT发布软体机器鱼,卧底鱼群大计可成
  6. C# DataTable常用方法总结
  7. python post 上传文件_python接口自动化7-post文件上传
  8. DoYourData AppUninser Mac版(Mac应用卸载工具)
  9. k8s traefik 映射外部服务,映射其他域名,映射内网其他服务
  10. 【TWVRP】基于matlab遗传算法求解多车场带时间窗的车辆路径规划问题【含Matlab源码 1035期】
  11. 如何使用华为官方模拟器eNSP的12800为后续SDN实验做好准备
  12. 3dmax学习6——扫描命令
  13. 基于Java的卡诺图化简
  14. Python爬虫实战之爬取饿了么信息
  15. #Geek Point# 八年了,消费级智能眼镜到底该怎么做?
  16. 黄金分割法 ( 三分法 )
  17. actuator--基础--6.1--端点解析--health端点
  18. 【Axure教程】中继器表格自动合计模板
  19. 湖南科技大学学生首夺2011德国红点设计大奖
  20. 前端基础(十一、JS 输出、变量、基本数据类型)

热门文章

  1. 计算机室对计算机网络系统,计算机网络与实验室管理系统建设
  2. 用python设置背景音乐_用Python设置
  3. 佛青云多少输出才能过鸿蒙,细节需慎重 现阶段佛青云多种路线选择
  4. RK3568 Android12 长按power键功能设置
  5. volatile有序性的真正作用
  6. 2019牛客ACM暑期多校第八场
  7. tar的--exclude选项中PATTERN详解
  8. css3中自定义变量
  9. 出现HTTPS证书错误原因
  10. windows命令——taskmgr 1