程序设计的一些基本原则

标签: 程序设计 基本原则 | 发表时间:2015-07-11 07:09 | 作者:winnerbao
出处:http://www.iteye.com

[介绍]

本文将对本人在程序设计方面的一些思考,逐步罗列在这里。

 

note: 此类文章/书籍,多如牛毛。对比它们,本文并不会出现什么新的概念、思路,都是人家说过的,总结过的。如有侵权,请指出,我将给出引用。

note: 它是我在工作中的一些问题/思考总结,附上一些实际的例子(经历过才更有感触)

note::“想的太多,行动太少” 是大忌. 如果你觉得一些东西对你有帮助,请行动起来,应用到你的code里面去

 

*. 你知道你的程序的运行行为

当写完一段程序的时候,你应该对该程序非常了解,充满信心

-输入,输出 - 这个肯定都知道

-错误情况,会发生什么,如runtime exception, checked expection

-性能咋样

-对其他系统/lib的依赖,即使你不了解那些依赖的系统,请非常清楚接口!

 

看过一个歪果仁写的文章,他要了解系统从上到下的所有细节,才能充满信心。譬如在写web程序时,他会把ngnix,tomcat之类的源码翻一翻。抱歉,忘了他的名字。

非常能体会他的感触,不过他这个是极端的例子。如果我们都能深入最根本/底层最好,但是项目上可没这个时间。起码,我们确信一些基本的东西。

 

note: 本条放在最前面,是因为我见过太多的反面例子!! 如果你见的不多,那么1) 你身边高手如云,约么?:)  OR 2)上面我没有表达清楚 OR 3) 你没深入去想

 

 

* 减少调用层次

a->b->c->d->e->f->g->h->i->j->k->l->m-n

调用层次太深,极大增加程序后期维护成本,以及出问题时trouble shooting将比较困难。

读浅调用层次的代码,会有一种感激代码作者的感觉

 

note: 如果我们引用的第三方的jar包,那么jar包的作者他自己负责其程序的复杂性。我们只要看我们程序到达调用该jar文件的深度就可以了。

 

例子: java NIO中JNI中的调用就减少了调用层次。对于如下IO中的RandomAccessFile.read() 和 NIO 的FileChannel.read. JNI程序在NIO中大大简化,两步就调用的kernel IO.

IO call stack - 5 levels after JNI to reach kernel IO
read() of RandomAccessFile and FileInputSteam
JNI -> readSingle(io_util.c)-> IO_Read(io_util_md.h)->JVM_Read(jvm.cpp) -> os::restartable_read(os_solaris.cpp)->Kernel ::read

NIO call stack - only 2 level under JNI to reach kernal IO
read() of FileChannel
read(ByteBuffer dst) (FileChannelImpl.java) ->  IOUtil.read(IOUtil.java) -> IOUtil.readIntoNativeBuffer -> read(FileDispatcher.java) ->  JNI FileDispatcher.read0/pread0 ->kernel ::read, ::pread64

 

例子:一个反面的例子就是JDK URL.hashcode()最终给出了相当相当深的调用栈

此文http://winnerbao.iteye.com/admin/blogs/2218624中给出了调用栈

http://dl2.iteye.com/upload/attachment/0109/4213/79904add-47c7-3037-853a-ae010764b9d1.png

 

* 减少线程

这已经是一个基本的共识了,这里我给出几个例子

它不仅简化程序,而且提高性能。

 

note: 不要较真:简单,但不能太简单

 

例子: LMAX Discruptor

一个非常牛X的高性能框架,它的核心之一就是单线程。

 

例子: Coral 8

一个CEP(负责事件处理)引擎,它的核心之一,也是单线程。如果你追求高性能,请考虑单线程。

 

* 不要预留扩展接口或者扩展功能,除非真的必要

什么是真的必要? 就是“你觉得必要” 。我又在讲废话了!

工作中,经常听到这样的说法:我这样做一些扩展,以后如果有客户/其他人想使用XX功能,我们就可以非常方便的扩展我们的程序,甚至只要改一下配置就可以了。

这是真的么?这是真的么?这是真的么? 三遍

 

原则:保持程序简洁性,使得其在遇到真正的需求时,容易调整。而不是臆测一些需求。

 

note:我不排斥增加一个可能变化的功能。相反,我经常这样做。但是每次我都觉得自己有充足的理由。我知道:你也是!

note:本条比其他条目更加主观。多做项目,踩更多的坑就会增长这方面的能力 :)

 

[待续]

 

====下面这些内容放在这里并不合适,发现合适的地方以后移走====

1. 几个月以后,回头看你的程序/设计/任何成果,一般会发现自己当时做的好烂

好消息,你成长了

如果你发现自己当时已经做的很好了,大神,认识一下?我的QQ: 35=131=698

 

2. "慢慢干,比较快"

体会吧

 

 

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [程序设计 基本原则] 推荐:

程序设计的一些基本原则

- - 编程语言 - ITeye博客
本文将对本人在程序设计方面的一些思考,逐步罗列在这里. note: 此类文章/书籍,多如牛毛. 对比它们,本文并不会出现什么新的概念、思路,都是人家说过的,总结过的. 如有侵权,请指出,我将给出引用. note: 它是我在工作中的一些问题/思考总结,附上一些实际的例子(经历过才更有感触). note::“想的太多,行动太少” 是大忌.

面试基本原则

- mazhechao - Reborn
到了这个阶段,很多本科申请者都要接受面试考验了. 以下向同学们分享一下几个重要的面试基本原则. 无论是谁,都会告诉你第一印象很重要. 然后紧接下来的建议就是“衣着得体”. 但,我一直觉得“衣着得体”是个很含混的要求. 在每个人的眼里,“得体”的标准是不一样的. 不过,倒是有一个小的建议很重要:全身上下颜色越少越好.

着陆页优化基本原则

- 章明 - 互联网的那点事
坚持基本原则,能让你把一个糟糕的着陆页,变成人们很难指指点点的着陆页. 在你起步时就有力地应用它们,然后再通过钻研后面讨论的内容,改进你的页面. 把人送往一个相关而且定向的页面. 你的首页是一种面向目标传播的混合——通常以好的理由来说. 了解了这一点,就要阻止把人们送往那里的欲望,因为首页更好地定向于好奇的浏览类型,而不是人们从一个横幅和AdWords链接的点击进入.

做人四项基本原则

- Alfred.zhang - 新企业家网
①不要盘算太多,要顺其自然,该是你的终会得到. ②压抑自己没必要,奉承巴结也没必要,保持应有的人格力量将赢得更多机会和尊重. ③不要对谁特别好,也不要对谁特别不好,永远不要被少数人所利用. ④相信自己比依赖别人重要,用尽心机不如静心做事. 还想再多看几篇可能感兴趣的文章:. 有时一个人为不花钱得到的东西付出的代价最高.

类设计的5个基本原则

- - CSDN博客编程语言推荐文章
我们常说啥面向对象三大特性:封装,继承,多态.另一种说法是:抽象,继承,动态绑定. 然后就是面向对象五大设计原则,面向对象的设计其实说到底就是类的设计嘛,没有了类就自然不能叫面向对象了.当然了像C#中还有所谓的接口(interface),把它理解成一个特殊的类好了.. 我觉得 面向对象的应用中最难的就是类的设计,怎么设计好一些类没有固定标准,只有一些参考原则.所以设计类不只是技术活,而且是个艺术活..

问题解决型沟通(肆):基本原则

- Tim - 透明思考 - Thoughts
一次通常的多人参加的沟通,有一些基本的原则,我把它叫做“SOFT原则”:. Subject:每次沟通应该有且仅有一个主题. 如果有多个主题,也许需要不同的人、不同的时间、不同的方式. One conversation:任何时间仅有一个人在说话,其他人应该听这个人说. Facilitator:应该有一个主持人.

着陆页优化101招-第1章基本原则

- Dynamic - 所有文章 - UCD大社区
坚持基本原则,能让你把一个糟糕的着陆页,变成人们很难指指点点的着陆页. 在你起步时就有力地应用它们,然后再通过钻研后面讨论的内容,改进你的页面. 把人送往一个相关而且定向的页面. 你的首页是一种面向目标传播的混合——通常以好的理由来说. 了解了这一点,就要阻止把人们送往那里的欲望,因为首页更好地定向于好奇的浏览类型,而不是人们从一个横幅和AdWords链接的点击进入.

Linux性能分析和调整的基本原则 --zt

- flychen50 - DBA eyes
优化linux系统需要考虑多方面的因素,因为各个因素之间相互关联,因此遇到性能问题以及性能的调节需要综合考虑,基本要素考虑与分析:. 3)对磁盘进行优化(包括文件系统),提高I/O吞吐量;. 2,影响系统性能的一般因素:. 一般来说,现在的网络服务器针对提供的服务,其CPU速度是足够提供处理能力的;所以.

Josh Berkus谈软件咨询行业的基本原则

- - InfoQ cn
Josh Berkus是关系型开源数据库PostgreSQL的核心开发成员,同时担任一家PostgreSQL咨询服务公司的总裁,他最近 分享了自己在软件咨询行业的经验,列举了一些基本法则. 技术层面的问题只是管理方面问题的一种表现形式,如果某个公司在生产的软件中存在长期无法解决的问题,那么可以预见到,这个公司在管理管理业一定存在长期没有解决的问题.

表单验证设计的用户体验基本原则

- - 博客 - 伯乐在线
英文原文: The Ultimate UX Design of Form Validation  来源 oschina. 几年前当我第一次看到Twitter的表单验证时很惊讶. 对用户界面呆板厌烦的你应该知道我在说什么. Twitter精心设计的分离式表单验证相当引人注意.当我输入错误时右侧弹出错误提示信息, 立即就能让我消除错误.”在线验证”帮助我明白什么是正确的方向.