zoukankan      html  css  js  c++  java
  • 什么是系统,什么是算法 -- lemon OA 系统学习总结

    一、对于模块划分的理解

      对于一个大型(这里还只是一个中型系统)系统来说,代码的编写不是一日而就的,层次的明细也不是一眼就能看清楚的。

      在这种情况下,需要想好,最好是由上而下地想好。

      能够模块式地划分最好,这样在开发时,也能够很好地进行任务分配(这对于做项目经理比较有用)。还有一个好处,进行功能隔离,这样可以单独进行测试,把某一个模块做得很细。

      操作系统的编写,也是各个模块进行划分,虽然各个模块间的关联特别严重,但是通过中间层,通过接口,最终依然能够实现模块编写。

      为什么?我有一个公式:

    系统 = 算法的组合
    模块 = 算法

    为什么得出上面的公式呢?

    算法的特征:
        1. 为解决某一特定问题而设计;
        2. 输入数据较为单一;
        3. 操作模式较为单一。

    模块的特征是什么?

    模块的特征:
        1. 为解决某一特定问题而设计;
        2. 输入数据较为单一;
        3. 操作模式较为单一。

    所以,设计系统就想好各个模块如何进行组合。

    设计系统 = 理清+设计 各个模块的组合调用关系

    设计模块的思路就是要完成某一特定功能而做的工作

    模块设计:
        1. 明确特定问题的逻辑;
        2.设计输入接口;
        3.设计输出接口;
        4.设计内部算法逻辑。

    写代码,不是写伪代码,伪代码是没有上下文的,可是写代码需要考虑上下文之间的关系。

    做一个系统的几个步骤:
        
        1. 理清并设计 各个模块之间的组合和调用关系。
        2. 第二步其实不是编码,因为第一部还是伪代码,不过伪代码的粒度是各个模块。
        紧接着第一步的是继续技术选型,选择代码的运行环境(linux,windows,mac),模块之间的调用组合,是通过spring这样的中间层框架,配置文件,还是操作系统服务,或者通过网络rpc进行调用。
        并且每一个模块应该用什么成型的技术组件来做,还是自己从零开始设计算法。都是需要在这一步进行考虑的。
        
        并且在这一步,就是把系统架构好。
        如何进行架构,就是特定的操作系统,特定的IDE,利用特定的编程语言把这些模块给创建好。

    写到这里,我在想变量是用来干什么的,

    在大型系统中,从较高的维度(对!我说的就是进行升维),

    变量的作用永远只有两个:
        一、存储;
        二、传递。
    
    模块之间相互调用的数据,虽然数据结构复杂,数据量庞大。
    但是如果抽象成变量,也是一样的道理,就是这两个功能,从来没变过。

    问题又来了,对于设计软件系统,我还是觉得有点乱,该怎么做呢?

    我想起了维特根斯坦的一句话,关于语言的,

     人与人之间之所以不能相互理解,其实是由于语言的差异。而一个人所说的语言,反映了这个人的大脑里装的内容。

    回到软件设计上来,就是(这是我自己的话),

     我们能不能设计出一个软件,其实就是我们能不能充分理解我们的问题,充分了解它的需求。当我们和问题,合而为一体的时候,我们便可以和问题进行沟通。虽然问题是死的,人是活的。但是,我们和问题,在精神上已经有了共同的语言。

     模块是我们在较高维度思考用的语言,算法(模块内)是我们在较低维度思考用的语言。

    所以,在这里我想到了一个结论,对算法下个定义:

        

    算法是一种语言
    一种解决特定问题的,领域特定语言。
    
    当我们无法设计良好的算法时,
    其实是由于我们还没有对问题有良好的理解。
    
    当我们能够描述问题的解决步骤时,
    我们可以开始编码了,编代码的逻辑基础就是问题步骤可描述。
    
    当我们充分理解问题的本质时,
    我们就可以用“更精妙的算法,甚至于数学公式”来解决问题。
    
    算法不是万能的
    算法就是为了解决特定问题而存在,这就是算法的宿命。

    所以,通过我这么一扯淡,《算法导论》上的精妙绝伦的算法到底什么呢?

    就是在充分理解某一问题之后,的一种新的描述语言。
    对,算法不高深,算法只是一种描述方式。
    算法是一种新的语言。
    了解问题,思考问题。
    和问题进行对话,我们就可以设计自己的算法了。

    哦,原来我是在讲算法。

    我真的懂了吗,现在的我,就是用这种眼光来看世界的。

  • 相关阅读:
    .NET程序内存分析工具CLRProfiler的使用
    Hudson、Jenkins的node节点设置(分布式处理自动化测试用例)
    Ruby+watir不能定位新打开的窗口解决办法
    L邮政挂号信查询
    ruby读写txt文件
    Jenkins、Hudson安装、配置详细记录
    nagios原理(二)
    存储过程例子
    存储过程 插入明细表
    nagios原理(一)
  • 原文地址:https://www.cnblogs.com/haore147/p/4745747.html
Copyright © 2011-2022 走看看