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,利用特定的编程语言把这些模块给创建好。

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

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

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

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

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

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

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

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

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

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

        

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

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

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

    哦,原来我是在讲算法。

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

  • 相关阅读:
    HAProxy、Keepalived 在 Ocatvia 的应用实现与分析
    Octavia 的 HTTPS 与自建、签发 CA 证书
    Octavia 创建 loadbalancer 的实现与分析
    OpenStack Rally 质量评估与自动化测试利器
    自建 CA 中心并签发 CA 证书
    Failed building wheel for netifaces
    通过 vSphere WS API 获取 vCenter Datastore Provisioned Space 置备空间
    OpenStack Placement Project
    我们建了一个 Golang 硬核技术交流群(内含视频福利)
    没有图形界面的软件有什么用?
  • 原文地址:https://www.cnblogs.com/haore147/p/4745747.html
Copyright © 2011-2022 走看看