重谈设计
这个话题比較大,按眼下自己的不入流设计水平来说,的确有些不大合适。就算班门弄斧,抛砖引玉了。
做了10多年开发, 近期才開始感觉自己有点会编程。会设计了。
设计大的层次能够划分为 3层。 系统(模块) 面向对象 面向函数
非常多人认为C比C++弱,由于没有面向对象。 事实上,这是对C的最大误解。
C的精华是面向模块。与面向函数。 面向对象仅仅是一个中间夹层。 并不影响软件的根本成败。
软件的核心是什么? 个人觉得还是系统, 更细化就是模块。
用户之全部用软件, 就是想用软件代表的系统。 来进行信息的加工处理。
系统最核心的就是 输入与输出。 所以。设计最重要的就是3个:
系统功能
输入接口
输出接口
这个在实际软件project中就是需求分析。 用户事实上并不关心你是面向对象还是面向过程。
用户仅仅关心你能给他实现什么功能。
更进一步,就涉及到系统的稳定。 即系统是正反馈,还是负反馈。系统负载是否平衡。
在软件开发上就是经典的时空平衡。 即CPU与内存之间的负载平衡。
关于面向对象。 比較常见的就是设计模式之争。
个人的理解, 设计模式关键在于项目是否有兴许变化。 怎样推断是否有变化,怎么变化。
道法自然, 个人最推荐的是C语言的哲学, 简单就是美。 假设引入某个设计模式。让代码更难理解了,那么还是放弃吧。
市场上关于设计模式的书。 都在讲其优点,非常少见讲坏处的。
毕竟。你要是出一本书。介绍设计模式的,却讲其坏处,读者基本就不会买了。
但,设计模式最重要的是为了重用,为了变化。 变化是为了未来, 这个在人类史上有个经典话题, 短期利益和长远利益。
这两者是要平衡的。 而恰好市场上的书基本不讲这个话题。
C++为什么比C更让人讨厌。 由于派生,虚函数等将问题搞得如雾里看花。这个会有什么代价?
直接的代价就是Debug难度剧烈上升。你不了解总体,基本上没法入手。而实际上,作为一个项目经理, 你又有多少资源
来保障手下的人都了解整个系统?
设计的关键难点就是。 没人能清楚地告诉你未来会怎样变。所以,我们非常多情况下会过度抽象。
抽象是个好东西, 越抽象就越好复用, 但辩证法永远存在, 越抽象就越意味着无用。
第二个话题,就是解耦与高内聚。
这两个事实上是矛盾统一的。
模块之间解耦,必定影响系统的内聚。最直接的就是导致接口膨胀, 通信数据量大增。
这必定导致经典问题。 性能。
提高系统性能过程必定会与设计冲突。
工作10年还没看到哪个项目提高系能系统不须要改设计的。
回过头来。 这便是项目中的经典问题, 瀑布模型返工。
多出来的成本怎么办? 高层领导基本仅仅看CPI。
我们说项目经理难做。 最基本的就是决策难做。
这个市场上又有几部书给大家讲这个问题?
近期互联网流行迭代开发,吹上天了。
问2个基本问题, 有几个公司做到正常每天8小时上班的?
有几个产品没有当用户小白鼠的? 也就天朝人性格好, 换到日本。公司领导24小时电视道歉都来不及。
第三个问题。就是面向函数。
近期10年。 面向对象大热,好像有了面向对象就能飞上天了。没有面向函数, 屁都不是。
面试时,最烦函数都写不好,大谈设计的。真正工作。最基本的就是写好函数。
项目中, 最难的Bug都是死在变量没有初始化。 条件语句写错上。自
己能够想象上几十个模块,上万变量,去找某个错误有多难。
面向函数。是最基础的抽象。 也是一切软件开发的基石。
系统与对象,仅仅是让大家工作更清晰,更方便,但决定不了软件的成败。
函数假设写不好, 整个软件产品基本就是废了。一无是处。