• [供给侧]一个开源项目(xserver)18年前的一次重构

    (1) 这个项目的简要信息(参考)

    =================================

    维毒百科:

    ** Graphical User Interface **

    The graphical user interface (GUI jee-you-eye or) is a form of user interface that allows users to interact with electronic devices through graphical icons and audio indicator such as primary notation, instead of text-based user interfaces, typed command labels or text navigation. GUIs were introduced in reaction to the perceived steep learning curve of command-line interfaces (CLIs), which require commands to be typed on a computer keyboard.

    ** X.Org Server **

    X.Org Server is the free and open-source implementation of the X Window System display server stewarded by the X.Org Foundation. Implementations of the client side of the protocol are available e.g. in the form of Xlib and XCB.

    简单来说, xserver 是开源业界广泛使用的一套图形用户界面解决方案,特别的,是一种广泛使用、历史悠久的基础设施级别的一个跨硬件、跨硬件体系架构、跨操作系统平台、面向不同的图形化用户应用程序的整体解决方式。

    (2) 这次重构的相关代码

    =========================

    这里只讨论一点,即 mi/miinitext.c 中的 InitExtensions 函数的实现。

    这次重构并没有改变 InitExtensions 的在C语言中的“声明”,仍然是:

    void

    InitExtensions(argc, argv)

    int        argc;

    char    *argv[];

    但是他们具体的实现方式改变了。在重构之前:

    https://gitlab.freedesktop.org/xorg/xserver/-/blob/9508a382f8a9f241dab097d921b6d290c1c3a776/mi/miinitext.c#L153

    在重构之后:

    https://gitlab.freedesktop.org/xorg/xserver/-/blob/d568221710959cf7d783e6ff0fb80fb43a231124/mi/miinitext.c#L507

    具体是这样子的:

    ① 在重构之前, void InitExtensions(argc, argv) 的函数本体主要大概是这个样子的:

    ```

    InitExtensions(argc, argv) {

    #ifdef Extension_A_MACRO

    Extension_A_Init();

    #endif

    #ifdef Extension_B_MACRO

    Extension_B_Init();

    #endif

    ...

    }

    ```

    这是“指令序列”(A series of Order)

    ② 重构之后:

    重构引入了一个静态化的结构体数组 staticExtensions :

    ```

    static ExtensionModule staticExtensions[] = {

    #ifdef Extension_A_MACRO

    { Extension_A_Init_FUNPTR, "Extension_A_Named",  Extension_A_settings... },

    #endif

    #ifdef Extension_B_MACRO

    { Extension_B_Init_FUNPTR, "Extension_B_Named",  Extension_A_settings... },

    #endif

    ...

    }

    ```

    并且通过迭代这个数组来具体调用 Extension_α_Init 了:

    ```

    void

    InitExtensions(argc, argv)

    int        argc;

    char    *argv[];

    {

    int i;

    ExtensionModule *ext;

    static Bool listInitialised = FALSE;

    if (!listInitialised) {

    /* Add built-in extensions to the list. */

    for (i = 0; staticExtensions[i].name; i++)

    LoadExtension(&staticExtensions[i], TRUE);

    /* Sort the extensions according the init dependencies. */

    LoaderSortExtensions();

    listInitialised = TRUE;

    }

    for (i = 0; ExtensionModuleList[i].name != NULL; i++) {

    ext = &ExtensionModuleList[i];

    if (ext->initFunc != NULL &&

    (ext->disablePtr == NULL ||

    (ext->disablePtr != NULL && !*ext->disablePtr))) {

    (ext->initFunc)();

    }

    }

    }

    ```

    是不是有点“多态”、“封装”的感觉?

    这种实现方式实际上是通过定义一个声明式的链表,然后通过将这个链表作为数据结构,然后建立算法。

    (3) 一些结论

    ==============

    -- 这次重构将指令序列改成了声明式链表及相关函数

    -- 这次重构之后代码更长了,但可读性提高了,而且函数中的“过程”被转化为了“数据结构”

    我认为这个重构非常切合 xserver 这样子的软件,极大地提高了其可维护性。

    堪称一次史诗级的重构!

    08月29日
  • Re: [管理侧] 构建复杂度(Construction Complexity)理论:类

    不失一般性的,似乎

    构建复杂度 = 依赖复杂度 + 职能性复杂度

    还没想清楚,可能有问题 @_@

    感觉这个如果能够说清楚,好像还挺漂亮的一个 formula 。。谢谢大家的启发!。。

    08月22日
  • Re: 妖猫传有无床戏等大尺度,是否适合小孩子看?

    有一段床戏……整个故事其实怪怪的。。

    小孩子不是要去《大头儿子小头爸爸》的么 = =

    08月14日
  • Re: [建议] 待审核文章队列

    你说的“我的-我的文章”是手机APP看的到的意思?。。没怎么用手机app不太知道……

    我主要是发言了然后要审核,然后不知道下文了,感觉流程上好像被吞了怪怪的……跟反悔还是发言的性质没有什么关系……

    【 在 NianMa 的大作中提到: 】

    : 收到您的建议。咱们在网络上发言之前都得考虑清楚,一旦发布了,就相当于允许平台方正式审核了。那如果有不当言论,站务就会直接处理。没有反悔的中间状态。除非作者自行删除。在“我的-我的文章”中可以操作。所以在发言之前如果没想清楚,可以先“存草稿”,每个用户的草稿箱都可以保留10篇待发表的文章。

    : - 来自 水木社区APP v3.4.4

    : ...................

    08月11日
  • [建议] 待审核文章队列

    能不能把自己发的需要审核才能发布的文章,有个页面可以显示出来……

    主要是,方便追溯。。例如发了啥要审核了,如果发出去了,也方便知道有个下文;如果没发出去,也知道没发出去……

    08月10日
  • [管理侧] 构建复杂度(Construction Complexity)理论:类型,
    loading ...

    构建复杂度(Construction Complexity)理论:类型,组成和实例

    (2021/8/7, 首发于水木社区 SoftEng 版)

    1.编程复杂度和构建复杂度

    ========================

    如果说时间复杂度(Time Complexity)和空间复杂度(Space Complexity)体现了软件的运行,是对软件的运行(Running)的一种尺度,那么构建复杂度(Construction Complexity)则强调软件的生成(Generating)的尺度。

    在许多大公司里,一种衡量构建复杂度的变更的方法是“代码行数”。在这过去又通常被称为“软件复杂度”,但我们现在其实也知道,“软件复杂度”是多种方面的。在这个意义上,从概念来说,我们似乎有理由把构建复杂度、时间复杂度、空间复杂度都看为软件复杂度的某种实例,但构建复杂度更趋向于软件的存在,而时间复杂度、空间复杂度更趋向于软件的存在方式。

    从直观来看,“代码行数”是深受认可反映构建复杂度的一个有意义的指标。显然,代码的行数越多,一个软件的构建(The Construction Of A Software)似乎就越复杂。但不要忘了,在今天,复制粘贴已经成为软件构建的重要方式。而更深层面的问题则在于,很多代码很精简,却需要付出很艰苦的思想。“代码行数”似乎可以反应某种体力劳动,却难以反应脑力劳动。

    一个好的事情在于:完成构建了的软件,我们可以视为版本内不变的。这就意味着,我们不必研究构建复杂度的动态特性。我们不必用O(1),O(N^2),O(Nlogn)这些东西来研究,软件如何随着业务的增长,自己的构建、代码行数等等也增长。当然,这种研究或许也足以成为问题,但我们暂时不在这里讨论。

    我们不妨把构建复杂度(Construction Complexity)分为静态复杂度(Static Complexity)和动态复杂度(Dynamic Complexity)。前者更关注软件的度量,而把软件的规模和构成视为不变的;后者更关注软件在时空中随着各种因素和条件的改变的动态过程,研究软件的规模和构成和各种因素的数理关系。

    2.静态复杂度的四种类型:Type 0, Type 1, Type 2, Type 3

    =======================================================

    这里提出一个静态复杂度的模型,它来自我们的经验。这个模型主要从已有的技术实例,尚未解决的技术问题,需要满足的需求的程度,这四个类型来综合考虑构建复杂度——

    ◆ Type 0: 已经有相关的按钮、窗口、屏幕、产品、界面、服务、解决方案等等,没有任何代价和费用,不需要做任何事情,或者只需要点击鼠标,发发信息,下载安装包安装之类的操作,既可以满足所有的需求。

    ◆ Type 1: 已经有实例,只需要修改或者建立分支版本,或者基本上所有的技术已经有成熟的指导文档或成熟方式,明确已经有相关的需求的满足方式或代替品。

    ◆ Type 2: 已经没有数据交换、编码、解码的障碍(跟网络有关系),不存在算法的困难或者未能确定的部门,已经完成大部分组件或者缺少某一两个组件,没有能把各种组件和功能组合、继承起来的(可靠的)实例,或者有实例但难以根本地适用,关键的需要是否能满足也尚未验证。

    ◆ Type 3: 除了名字(甚至名字也不知道),什么可以复用的都没有,或者有但是不开放,或者开放但是实际上没几个人掌握,要求满足需要的程度非常高。

    (图解/构建复杂度)

    容易看到, Type 0 已经趋近于使用问题已经解决,相关工程已经实现。

    随着从 Type 1 到 Type 2, Type 3,我们面临的未知更多,我们面临的不确定更大,某种程度上这样子的构建也就越困难。在不考虑工程实施主体的条件下,构建复杂度随着从 Type 1 到 Type 2, Type 3,越来越困难。

    但我们也有一些启示。例如,软件公司可以通过渐进地了解不同的领域,逐渐把某种项目的构建复杂度从 Type 3 降解到 Type 1,进而实现生产力的自主掌握以及全业态发展。反过来说,软件公司也可以从Type 1出发,通过向 Type 3 前进,构建相关的生态,逐步实现可持续的开发能力的升级和进化。

    3. 进一步的探讨

    ===============

    这里似乎可以回到“软件成熟度”的问题,但我们实际上把“构建复杂度”提到了主题的地位。

    构建我们可以从双层的意义上去理解:一方面,构建是成果,构建复杂度是对这种构建了的成果的复杂性的尺度;一方面,构建是过程,构建复杂度在研究完成构建目标所需要的费用和投入。

    可以一些结论并不是在这里首次提出,也欢迎补充其他观点和要点。

    08月07日
  • [管理侧] 构建复杂度(Construction Complexity)理论:类型,
    loading ...

    构建复杂度(Construction Complexity)理论:类型,组成和实例

    (2021/8/7, 首发于水木社区 SoftEng 版)

    1.编程复杂度和构建复杂度

    ========================

    如果说时间复杂度(Time Complexity)和空间复杂度(Space Complexity)体现了软件的运行,是对软件的运行(Running)的一种尺度,那么构建复杂度(Construction Complexity)则强调软件的生成(Generating)的尺度。

    在许多大公司里,一种衡量构建复杂度的变更的方法是“代码行数”。在这过去又通常被称为“软件复杂度”,但我们现在其实也知道,“软件复杂度”是多种方面的。在这个意义上,从概念来说,我们似乎有理由把构建复杂度、时间复杂度、空间复杂度都看为软件复杂度的某种实例,但构建复杂度更趋向于软件的存在,而时间复杂度、空间复杂度更趋向于软件的存在方式。

    从直观来看,“代码行数”是深受认可反映构建复杂度的一个有意义的指标。显然,代码的行数越多,一个软件的构建(The Construction Of A Software)似乎就越复杂。但不要忘了,在今天,复制粘贴已经成为软件构建的重要方式。而更深层面的问题则在于,很多代码很精简,却需要付出很艰苦的思想。“代码行数”似乎可以反应某种体力劳动,却难以反应脑力劳动。

    一个好的事情在于:完成构建了的软件,我们可以视为版本内不变的。这就意味着,我们不必研究构建复杂度的动态特性。我们不必用O(1),O(N^2),O(Nlogn)这些东西来研究,软件如何随着业务的增长,自己的构建、代码行数等等也增长。当然,这种研究或许也足以成为问题,但我们暂时不在这里讨论。

    我们不妨把构建复杂度(Construction Complexity)分为静态复杂度(Static Complexity)和动态复杂度(Dynamic Complexity)。前者更关注软件的度量,而把软件的规模和构成视为不变的;后者更关注软件在时空中随着各种因素和条件的改变的动态过程,研究软件的规模和构成和各种因素的数理关系。

    2.静态复杂度的四种类型:Type 0, Type 1, Type 2, Type 3

    =======================================================

    这里提出一个静态复杂度的模型,它来自我们的经验。这个模型主要从已有的技术实例,尚未解决的技术问题,需要满足的需求的程度,这四个类型来综合考虑构建复杂度——

    ◆ Type 0: 已经有相关的按钮、窗口、屏幕、产品、界面、服务、解决方案等等,没有任何代价和费用,不需要做任何事情,或者只需要点击鼠标,发发信息,下载安装包安装之类的操作,既可以满足所有的需求。

    ◆ Type 1: 已经有实例,只需要修改或者建立分支版本,或者基本上所有的技术已经有成熟的指导文档或成熟方式,明确已经有相关的需求的满足方式或代替品。

    ◆ Type 2: 已经没有数据交换、编码、解码的障碍(跟网络有关系),不存在算法的困难或者未能确定的部门,已经完成大部分组件或者缺少某一两个组件,没有能把各种组件和功能组合、继承起来的(可靠的)实例,或者有实例但难以根本地适用,关键的需要是否能满足也尚未验证。

    ◆ Type 3: 除了名字(甚至名字也不知道),什么可以复用的都没有,或者有但是不开放,或者开放但是实际上没几个人掌握,要求满足需要的程度非常高。

    (图解/构建复杂度)

    容易看到, Type 0 已经趋近于使用问题已经解决,相关工程已经实现。

    随着从 Type 1 到 Type 2, Type 3,我们面临的未知更多,我们面临的不确定更大,某种程度上这样子的构建也就越困难。在不考虑工程实施主体的条件下,构建复杂度随着从 Type 1 到 Type 2, Type 3,越来越困难。

    但我们也有一些启示。例如,软件公司可以通过渐进地了解不同的领域,逐渐把某种项目的构建复杂度从 Type 3 降解到 Type 1,进而实现生产力的自主掌握以及全业态发展。反过来说,软件公司也可以从Type 1出发,通过向 Type 3 前进,构建相关的生态,逐步实现可持续的开发能力的升级和进化。

    3. 进一步的探讨

    ===============

    这里似乎可以回到“软件成熟度”的问题,但我们实际上把“构建复杂度”提到了主题的地位。

    构建我们可以从双层的意义上去理解:一方面,构建是成果,构建复杂度是对这种构建了的成果的复杂性的尺度;一方面,构建是过程,构建复杂度在研究完成构建目标所需要的费用和投入。

    可能一些结论并不是在这里首次提出,也欢迎补充其他观点和要点。

    08月07日
  • Re: [版面建设] 发展规范性的、可重塑性的、可欲的软件工程理论
    loading ...

    做成了一张图

    【 在 darkk 的大作中提到: 】

    : 先感谢版友们对我的支持 :-) 有点意外,总投票人数竟然不多……但我还是有点受到鼓舞,谢谢水木,谢谢网友,谢谢大家~

    : 笔力不够,一时不知道怎么写……大致的思路:

    : 规范性 —— 连接着“方法学”,侧重于“工程一般”,“软件一般”,“方法一般”,等等。

    : ...................

    08月05日
  • [版面建设] 发展规范性的、可重塑性的、可欲的软件工程理论研究

    先感谢版友们对我的支持 :-) 有点意外,总投票人数竟然不多……但我还是有点受到鼓舞,谢谢水木,谢谢网友,谢谢大家~

    笔力不够,一时不知道怎么写……大致的思路:

    规范性 —— 连接着“方法学”,侧重于“工程一般”,“软件一般”,“方法一般”,等等。

    可重塑性 —— 连接着“变更”,侧重于动态的软件工程,以及通过系统的维护和升级带来价值。

    典型的规范性的软件工程理论和相关研究,比如面向对象。但面向对象的理论很多时候其实的确没有太多可重塑的具体内容。

    敏捷,测试驱动开发之类的,则为软件工程带来某种可重塑性的契机,他们是动态的。于是就和面向对象那一套形成了一种关系。

    这两种意义上的研究和理论,版主认为是平等的,而不能狭隘地认为一种比另外一种绝对优越,并且应当恰当地、恰如其分的使用或开展。在这个意义上,“澄清”就是一种重要的工作,“澄清”就是批判,就是认识的深化,就是学术的发展。

    在这双重的规定性,我们还指出“可欲的”软件工程很重要,例如,我们不希望软件工程只是把软件开发变得越来越像地狱,越来越内卷。

    事实、分析、猜想和结论都是很重要的,而作为集体智慧的方法,将会慢慢来临。

    08月05日
  • [版面建设] 发展规范性的、可重塑性的、可欲的软件工程理论研究

    先感谢版友们对我的支持 :-) 有点意外,总投票人数竟然不多……但我还是有点受到鼓舞,谢谢水木,谢谢网友,谢谢大家~

    笔力不够,一时不知道怎么写……大致的思路:

    规范性 —— 连接着“方法学”,侧重于“工程一般”,“软件一般”,“方法一般”,等等。

    可重塑性 —— 连接着“变更”,侧重于动态的软件工程,以及通过系统的维护和升级带来价值。

    典型的规范性的软件工程理论和相关研究,比如面向对象。但面向对象的理论很多时候其实的确没有太多可重塑的具体内容。

    敏捷,测试驱动开发之类的,则为软件工程带来某种可重塑性的契机,他们是动态的。于是就和面向对象那一套形成了一种关系。

    这两种意义上的研究和理论,版主认为是平等的,而不能狭隘地认为一种比另外一种绝对优越,并且应当恰当地、恰如其分的使用或开展。在这个意义上,“澄清”就是一种重要的工作,“澄清”就是批判,就是认识的深化,就是学术的发展。

    在这双重的规定性,我们还指出“可欲的”软件工程很重要,例如,我们不希望软件工程只是把软件开发变得越来越像地狱,越来越内卷。

    事实、分析、猜想和结论都是很重要的,而作为集体智慧的方法,将会慢慢来临。

    08月05日
  • [版面建设] 发展规范性的、可重塑性的、可欲的软件工程理论研究

    先感谢版友们对我的支持 :-) 有点意外,总投票人数竟然不多……但我还是有点受到鼓舞,谢谢水木,谢谢网友,谢谢大家~

    笔力不够,一时不知道怎么写……大致的思路:

    规范性 —— 连接着“方法学”,侧重于“工程一般”,“软件一般”,“方法一般”,等等。

    可重塑性 —— 连接着“变更”,侧重于动态的软件工程,以及通过系统的维护和升级带来价值。

    典型的规范性的软件工程理论和相关研究,比如面向对象。但面向对象的理论很多时候其实的确没有太多可重塑的具体内容。

    敏捷,测试驱动开发之类的,则为软件工程带来某种可重塑性的契机,他们是动态的。于是就和面向对象那一套形成了一种关系。

    这两种意义上的研究和理论,版主认为是平等的,而不能狭隘地认为一种比另外一种绝对优越,并且应当恰当地、恰如其分的使用或开展。在这个意义上,“澄清”就是一种重要的工作,“澄清”就是批判,就是认识的深化,就是学术的发展。

    在这双重的规定性,我们还指出“可欲的”软件工程很重要,例如,我们不希望软件工程只是把软件开发变得越来越像地狱,越来越内卷。

    事实、分析、猜想和结论都是很重要的,而作为集体智慧的方法,将会慢慢来临。

    08月05日
  • Re: 怎么能看到已经投出的投票结果的……

    刚好这几天结束投票了……

    【 在 shen 的大作中提到: 】

    : 投票结束前不能看结果

    : 版主可以提前结束投票

    08月05日
  • Re: 高亮五:2020-2025 年征文——软件工程与容忍

    结合种种情况,征文时间延长到 2025 年

    【 在 darkk 的大作中提到: 】

    : 这位版友读者你好啊~

    : 为促进学术的繁荣、思想的进步、工程的先进,本版特向版友、站友及全社会公开征稿。

    : 征文标题:软件工程与容忍

    : ...................

    08月04日
  • 怎么能看到已经投出的投票结果的……

    红宝书好像没写……

    版主也没权力在投票结束之前看到的?

    07月29日
  • Re: 请教高人破解监控

    建议报警

    【 在 rainsky 的大作中提到: 】

    : 手机被监控了,可以同屏页面,知道你读什么文章。微信也是被扩散的状态,和家里人聊什么周围人直接说原话,分组发的朋友圈组外能看到议论,电话、短信、甚至淘宝聊天也是如此。

    : 知道这里牛人多,请问这是怎么做到的,有没有办法可以取证?我总不能抢过别人的手机取证吧。

    : 试过恢复手机出厂设置、找手机服务站刷机、换手机号、换手机,均无效。

    : ...................

    07月21日
  • Re: 各种编程语言有没有什么水平资质认证考试的? (转载)

    也觉得这种东西很好。。但不知道为啥好像没有?(linux,红帽还是卡西欧啥的好像是啥认证的?)

    或者说,各种OJ上面刷题已经起了一定的类似的认证作用?(但是好像不太对……)

    【 在 ZhangShao 的大作中提到: 】

    : 发信人: ZhangShao (张稍), 信区: Programming

    : 标  题: 各种编程语言有没有什么水平资质认证考试的?

    : 发信站: 水木社区 (Wed Jul 14 17:51:07 2021), 站内

    : ...................

    07月14日
  • 请不要在本版张贴“王垠”的相关帖子

    本版的讨论范围:

    1,软件工程相关的技术文章。比如:设计模式、UML、QA、软件体系结构、概要设

    计、详细设计、软件工程方法论、软件开发过程等;

    2,软件工程相关的人文管理文章。比如:开发团队的组织、上下级关系协调、IT项

    目管理等;

    3,软件工程相关的工具的使用。比如:配置管理工具的使用、Bugzilla的安装使用

    等。

    本版的版面宗旨:

    ……本版主题是软件工程,网友可以在平等的宗旨下交流软件工程相关的各种技术和知

    识。……

    从“主题”的角度来说,我们原则上不反对任何在“本版的讨论范围”的文章。但是

    请注意,这些文章应该体现了“软件工程”、“人文管理”、“相关的工具的使用”

    这些方面,但这些方面,并不包括难以被科学和实验所验证的那种纯粹的“信仰”、

    “意见”、“见解”这类的东西,而且缺少基本的数学形式的那些东西。

    本版的“宗旨”中所谓的“各种技术和知识”,其含义可以参考理解为“客观”和

    “主观”。在客观的方面,是“技术”;在主观的方面,是“知识”;这就是说,

    看上去是“技术”,但实际上并不具有“知识性”,不应该被认为符合本版的宗旨。

    我们不能把别人的成果说成是自己的,这有违学术诚信和基本的社会人伦;我们不能

    把已经发明了的东西再说成是自己的独创的、首次的发明,这与当初的发明人的重视

    程度无关,而在于对于历史和科学的发展的尊重。

    最后,我们承认即使在科学的领域、工程的领域,人的精神、信仰、信念等等,

    完全可能具有重大的意义,但他们被讨论的方式,应该恰当,用着类似的词汇

    但实际上与科学意义上的软件工程、学理意义上的软件工程并无必然关系,

    而是一种学术欺诈,这类的内容或许同样在某种程度上具有真实性,

    但其在本版的发表不被版规保护。

    07月14日
  • Re: 征女友

    天啊!这个世界怎么了,这颜值还要征女友。。

    07月10日
  • Re: 非确定字符串的一般设想

    解决 N=NP? 问题

    【 在 a0123456789q 的大作中提到: 】

    : 把小学的东西重新换个名词推导一遍?

    07月09日
  • Re: 就“编译中的原理”不是“编译原理”的提纲

    半年过去了。

    【 在 LTaoist 的大作中提到: 】

    : 就“编译中的原理”不是“编译原理”的提纲

    : 1. 编译器是历史性的存在,是一种具体的经济学、一种具体的科学技术、一种具体的生产力形态,“编译中的原理”已经看到了这种历史性的方面,但“编译中的原理”不把这些历史性的东西看成能动的发展的东西作为他的观点,于是编译原理中最有活力的地方政治性地失踪了。

    : 2. 如果无助于编译或其实践,所有的“编译中的原理”都可以付之一炬。是否有助于编译,却并不取决于“编译中的原理”,全部的编译原理以及事实上的“编译中的原理”,在根本上是是实践的。“编译中的原理”关心的是指令的有效性和等效性,却没有担心编译器的生产和使用具有其本身的特定的价值和要然。

    : ...................

    07月09日