Unix编程哲学和软件设计方法
Unix编程哲学:
1,模块原则:使用简洁的接口拼合简单的部件。
2,清晰原则:清晰胜于机巧。
3,组合原则:设计时考虑拼接组合。
4,分离原则:策略同机制分离,接口同实现引擎分离。
5,简洁原则:设计要简洁,复杂度能低则低。
6,吝啬原则:除非确无它法,不要编写庞大的程序。
7,透明性原则:设计要可见,以便审查和调试。
8,健壮原则:健壮源于透明与简洁。
9,表示原则:把知识叠入数据以求逻辑质朴而健壮。
10,通俗原则:接口设计避免标新立异。
11,缄默原则:如果一个程序没什么好说的,就沉默。
12,补救原则:出现异常时,马上退出并给出足够的错误信息。
13,经济原则:宁花机器一分,不花程序员一秒。
14,生成原则:避免手工hack,尽量编写程序去生成程序。
15,优化原则:雕琢前先要有原型,跑之前先学会走。
16,多样原则:绝不相信所谓“不二法门”的断言。
17,扩展原则:设计着眼未来,未来总比预想来得快。
另外:
一个程序只做一件事情,并做好。
程序要能协作。
程序要能处理文本流,因为这是最通用的接口。
来自《Unix编程艺术》一书。这些原则在很多软件工程,设计模式,敏捷开发书籍中都有提到。
有时因为设计问题受到同事的挑战。解释起来又挺麻烦的,不是三言两语能说明白的。 以后就把这些原则背出来,再遇到挑战就说是根据**原则设计的,如果不清楚看《Unix编程艺术》这本书或者敏捷开发的书,省得解释了。
一些人喜欢使用二进制协议,觉得文本协议太浪费资源。其实文本协议浪费不多(xml格式除外),能处理的程序多,纠错能力强。最主要的是便于人查看和编辑。
一些人为了提高机器执行效率,到处要求优化。其实很多是废的。甚至因为引入了bug起发作用。至少使代码更难理解。应该优化经测试真正的瓶颈,而不是想当然。
一些人喜欢用一个巨大的程序完成任务,而不是多个小程序。因为觉得线程间交互简单;而进程间交互复杂,而且要使用进程间通讯,效率低。多个小程序的好处是,提供了机制而不是策略。便于重用,具有更大的灵活性,能够满足多种需要。
而且能够积累不少可重用的工具,提高日后的开发效率。 有些公司办了很多年,一点积累都没有,每次来项目都要从头开始写。
如果不愿意或者不能分成多个小程序,至少也应该提供service和GUI层的逻辑上的隔离。这样service层等模块可以打包成动态链接库,jar包等,便于重用。
这样,至少如果有一天你的Web程序要提供openAPI(现在很流行)时,不需要大动干戈,重写很多代码。
另外,Linux等开源代码,之所以质量优秀,就是充分的源代码公开和源代码review。 建议公司在项目内形成开诚布公的源代码review风气,改善代码质量。当然这个在一些公司政治严重的团队很难实现。在程序员间容易产生矛盾。
15,优化原则:雕琢前先要有原型,跑之前先学会走。
<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } A:link { so-language: zxx } -->
一些工程师,喜欢瀑布式的开发方式。一上来设计文档写个几个月,未来描绘得非常美好。代码一行未动。
项目最后是一延再延,最后发现架构设计有根本性的问题,BUG修复很难,项目只能取消,或者彻底重写。
没有深入到问题内部,和它近距离接触,是很难在脑子中凭空想清楚整个技术方案的。
我喜欢先设计原型,搭起架子,找到有风险的技术问题,先予以解决。和问题近身肉搏,然后调整、重构,得到可工作的原型,同时也得到了设计方案。再一步步实施。
我很奇怪,一些工程师对问题还没想透,技术风险还没排除,就敢直接花大量的时间写详尽的设计方案!
如果是概要性质的,还可以理解,毕竟项目总体的设计不会有太大的改变。
Unix编程哲学和软件设计方法相关推荐
- 面向过程的软件设计方法
面向过程的软件设计方法 前面主要是对系统的分析,从而明确我们系统的逻辑模型.也就是说,通过前面几章我们清楚了"系统需要做什么?".而软件设计阶段主要任务则是要实现系统逻辑模型向物流 ...
- 软件工程学习笔记——第六章 软件设计方法
目录 第一章 概述 第二章 过程和活动 第三章 软件过程模型 第四章 问题定义和可行性研究方法 第五章 需求分析方法-1 第五章 需求分析方法-2 第六章 软件设计方法 第七章 软件实施与测试方法 第 ...
- 软考·系统架构师论文——论基于架构的软件设计方法及应用
文章目录 说明 摘要 过渡 项目背景 论点理论+实践 结尾 说明 1.[摘要 300~330字] ① 项目介绍:时间.项目名.项目主要功能简述.作者角色及工作内容 ② 项目技术简介:正文理论/分论点的 ...
- 软件工程——软件设计方法(概要设计)
软件设计方法主要分为两个方面:1.概要设计 2.详细设计 概要设计: 一.软件设计的目标和任务 1.定义 将文字转化为结构图,根据用信息域表示的软件需求,以及功能和性能需求进行数据设计,系统结构设计 ...
- 【软件设计】软件设计方法归纳总结
软件设计方法有:结构化设计(数据流图为依据).面向对象设计(面向对象概念为依据): 结构化设计方法的模块化体现为:过程.函数.子程序: 面向对象设计的模块化体现为:类.对象.构件. 以上为主流的两种, ...
- 软件工程:结构化软件设计方法 VS 面向对象软件设计方法
一.基本概念 1.结构化方法 结构化方法是一种传统的软件开发方法,它是由结构化分析.结构化设计和结构化程序设计三部分有机组合而成的. 基本思想:把一个复杂问题的求解过程分阶段进行,而且这种分解是自顶向 ...
- 《软件工程》-面向过程的软件设计方法
[前言] 软件设计的目标和任务 软件设计基础 模块独立性 结构化设计方法 数据设计和文件设计.过程设计 [内容] 1.软件设计的目标和任务 根据用信息域表示的软件需求,以及功能和性能需求,进行 数据设 ...
- Visio——软件工程实验贰——面向对象软件设计方法
所使用的工具软件及环境: 硬件环境:微机1台. 软件环境:操作系统:Windows:建模工具:Visio或 Rose:数据库:MySQL(可选):开发工具包:JDK(可选):开发环境:MyEclips ...
- mpu6050上位机测试软件设计方法以及源码下载
硬件:MPU6050传感器模块+Ginkgo 2 I2C Adapter软件:Qt(MinGW 4.4)+Qwt(6.0.2) 效果: 2013-5-21 10:44 上传 下载附件 (82.91 K ...
最新文章
- DCN-S4600 telent、http远程登录配置
- typescript ajax,TypeScript的应用方式
- 计算机发展最新趋势素材,计算机方面论文范文素材,与关于计算机科学与技术的趋势探究相关论文网...
- java代码 创建文件夹的方法
- matlab中rgb转hsv,matlab实现RGB与HSV(HSB)、HSL和HSI的色彩空间互转
- Java订单交易_Java实现获取105发卡平台的订单信息
- 使用element-ui中的container布局容器
- python之deque
- Windows Phone 7完整版模拟器
- python按内容分割txt文件_python 读txt文件,按‘,’分割每行数据操作
- 详解 Word2vec 之 Skip-gram 模型
- Find a Mother Vertex in a Graph
- android 百度网盘 播放器,最好用的安卓播放器,支持云盘播放,看电影必备
- 10-特质-Scala
- 我的微信公众号开通了
- 时序图神经网络总结(1)
- 迷惑,不知何去何从。。。。。
- Java的应用领域有哪些
- bugkumsic之图穷匕见
- 23个经过时间考验的应用程序,可以管理您的远程软件开发团队