• 让你提前认识软件开发(46):首先是为人编敲代码,其次才是计算机


    第3部分 软件研发工作总结

    首先是为人编敲代码。其次才是计算机

     

           “首先是为人编敲代码,其次才是计算机”,这是软件开发的基本要点。软件的生命周期贯穿于产品的开发、測试、生产、公布、用户使用、版本号升级和后期维护等长期过程中。仅仅有易读、易维护的软件代码才具有生命力。

            在实际的软件开发过程中,可能是由于工作非常忙的原因,非常多开发者仅仅注重实现程序的基本功能。而忘记了编程规范。因此写出来的代码仅仅能让计算机看懂。人要看懂非常不easy。更有甚者,有些项目组为了赶进度。明白要求组员以实现产品功能为主。代码可以运行起来就行了。低要求产生低质量的代码,既然“上头”都这样要求了。那还有必要写出“让人可以读懂”的代码吗?

            进度是赶上了,产品也交付出去了,一切看来是OK的,但问题也就来了。前方频发产品故障的消息,后方开发者不停地扑火。这个时候。他们才发现之前别人写的代码非常难读懂,甚至连阅读自己写的代码都十分的困难。真是悔不当初。假设当时可以将代码写规范一点,文档配备齐全一点,何至于此?

           大家先来看以下这段代码:

    #include <stdio.h>

    void main()

    {

       float fun(int n);

       int n;

       float y;

       printf("input an integer number: ");

       scanf("%d", &n);

       y = fun(n);

       printf("%d!=%10.0f ", n, y);

    }

     

    float fun(int n)

    {

       float y;

     

       if(n<0)

         {

       printf("n<0, dataerror!")。

    }

           else

                 if(n == 0 || n == 1)

                 f=1;

           else

                 f= fun(n-1)*n;

           return(f);

    }

     

            大家发现了哪几处问题?

            对于以上程序。至少存在以下问题:

            第一,变量命令不规范,并且没有初始化。对于该程序。main函数里的变量nyfun函数里面的变量f的命名均不规范,不能让人一眼就看出它是什么意思、要做什么操作。

    这对于一小段程序来说,影响还不是非常大。但假设代码行数达到数千行,那么阅读起来就比較的费力。

    另外,以上说的三个变量仅仅是定义了,并没有初始化。这在实际项目中也是不同意的。

            第二,函数的命名不规范。且没有在主函数開始之前进行声明。本程序中的fun函数表示什么意思?假设你没有看程序開始之前的文字,那么仅仅有通过阅读函数里面的代码才干知道。

    在实际项目中。函数命名非常的重要,由于一般涉及到函数个数较多,假设不能通过函数名称来了解其作用。而必须通过阅读代码才干获悉。那么工作效率是非常低的(并且让你有打人的冲动)。此外,我们一般不在调用该函数的函数的内部来对被调函数进行声明,而是应该将声明放在外部,最好新建一个头文件来对程序里面出现的函数进行声明。

            第三,程序代码排版不工整,“ifelse”语句书写不规范。在fac函数中,存在排版不工整的情况。第一个if语句以下的大括号应该与“if”的“i”保持在同一列上,第二个“else”应该与第二个“if”保持在同一列上。“f=1;”和“f=fac(n-1)*n;”应该再缩进4个空格。

    另外,“if”和“else”以下的运行语句无论有多少行,都应该用“{}”括起来,以方便阅读。

    第四,程序凝视过少,函数开头没有凝视。一般说来。在程序的关键语句的前面或右边。都应该加入适当的凝视,这对程序的理解有辅助的作用。函数fac的前面应该加凝视,说明此函数的功能、输入/输出參数、返回值、改动记录等。在整个程序的开头处,也要加入版本号信息、改动记录等凝视信息,以方便日后查阅。

            第五,“main”函数的返回值类型不规范且无输入參数。

    在《C陷阱与缺陷》一书中,作者建议为main函数提供返回值。因此。最好将“void”改动为“int”,以提供返回值。满足编程规范的要求。

    此外,对于无输入參数的函数,尽量用“void”来表示输入參数。

            第六。程序中出现了“printf”、“scanf”和“main”函数。这是大家都习以为常的,但在实际的项目中,差点儿不可能出现这三个函数。由于公司都有自己的开发平台,并且代码都达到数千行,甚至上万行,非常多都不是基于VC开发的,你在哪里去输入,又在哪里去看输出呢?我一进公司,最開始看到程序。就想去找“printf”、“scanf”和“main”,但这是徒劳无功的,由于根本就没有。关于输入/输出。开发中会有专门的消息处理流程来处理,大家须要知道的就是一个完整的程序不一定非要有上面的三个函数。

     

            短短几十行代码,就有如此多的问题。

    如此书写代码,仅仅能让计算机看懂,“人”是非常难看懂的。

     

            那么。我们怎样写出让“人”可以看懂的代码呢?这个过程不能一蹴而就,要循序渐进,要从我做起。从身边做起,不断地提升个人编程的境地。

            可以考虑从以下几个方面入手:

            第一,对新入职的员工进行软件编程规范的培训。在刚開始工作中的时候。让他们严格參照编程规范来编写代码。越是早地开展编程规范的训练,越是可以早地养成编写规范代码的习惯。写出的代码也就越清晰。顺便说句题外话。非常多IT公司没有这方面的意识,仅仅顾对企业文化进行培训。以为这样就行让员工的忠诚度添加。

    实际上,这仅仅是个异想天开的做法。

            第二,定期在项目组开展编程规范方面的主题讨论,强化大家的意识。

    老员工写出的代码对新员工有示范的作用,假设老员工写出的程序都是可读性非常差的。那么新员工会怎么想呢?他们又会怎么做呢?非常多开发者每天仅仅顾埋头苦干,却忽略了一些最主要的东西。因此能力非常难再次得到提升。

    在编写完代码之后,不要就以为事情做完了,还要编写一些项目文档,如版本号具体设计文档等。

    在这些文档里面,把自己的思路写清晰,方便以后自己或他人查阅起来可以非常快理解程序思路。

            第三,开发者严格依照公司制定的编程规范来书写代码。变量怎样命名?函数怎样命名?凝视怎样写?代码怎样排版?这些都有严格的要求。作为一个合格的软件开发project师,编写规范的代码是主要的要求。当我们阅读到书写优美的代码的时候,是不是心里面会认为非常爽?从某种程度上来说,代码编写的规范程度可以体现一个程序猿的态度和专业素质。

            第四,项目组要严格运行同行评审流程。

    大部分IT公司为了提高产品的质量,都有一个叫做“同行评审”的流程,也就是让项目组成员相互检查各自的成果。大家相互学习、取长补短、共同提高。

    可是,可能是中国文化的影响,大家都比較顾及面子,因此不愿意将对他人真实的想法表达出来,也使得“同行评审”流于形式。当然,或许你对别人的程序确实没有意见。那就另当别论了。

    对他人开诚布公地提意见并非冒犯,而是大家相互学习的一种非常好的方式。

            第五,最重要的是,个人要有编写规范代码的意识,要不断地学习各种提高编程能力的技术。无论别人对你怎么说。假设你本人不想把程序写好,那么纵使万般外力。又怎样?程序猿尽管工作非常忙,但也要抽时间来学习新的技术。这样才不会被新技术淘汰掉。“活到老。学到老”,这句话尤其适用于如今这个大数据时代。

     

           “长风破浪会有时。直挂云帆济沧海”。对于非常多人来说,编写出可以让计算机读懂的程序就已经足够了。但假设想要成为一位优秀的软件开发project师,那么就要力求写出让“人”可以非常easy看懂并领会的代码。这是一个长期的过程。大家要有“万里长征”的准备,要有“愚公移山”的精神。

     

            最后。附上之前代码规范化后的样式:

     

    /***************************************************************

    *版权全部 (C)2014, company name

    *

    *文件名:example.c

    *内容摘要:用于示范怎样给变量和函数做规范的命名

    *其他说明:无

    *当前版本号:V1.0

    *    者:周兆熊

    *完毕日期:20140813

    *

    *改动记录1  // 改动历史记录,包含改动日期、版本号号、改动人及改动内容等

    *   改动日期:

    *   版本号号:

    *   改动人:

    *   改动内容:

    ***************************************************************/

     

    #include <stdio.h>

     

    typedef signed int INT32;                   // 重定义数据类型

     

    float ProcessFactorial(INT32 iInputValue);     // 函数声明

     

    /****************************************************************

    *功能描写叙述:主函数

    *输入參数:无

    *输出參数:无

    *返 回 值:无

    *其他说明:无

    *改动日期            版本号号          改动人         改动内容

    * --------------------------------------------------------------------------------------------

    * 20140813         V1.0            周兆熊           创建

    ***************************************************************/

    INT32 main(void)

    {

      INT32 iInputValue = 0;

       float  fResult    = 0.0;

     

       printf("input an integer number: ");

       scanf("%d", &iInputValue);

     

       fResult = ProcessFactorial(iInputValue);     // 调用求阶乘的函数

     

       printf("%d!=%10.0f ", iInputValue, fResult);

     

       return 0;                      // 注意有返回值

    }

     

     

    /****************************************************************

    *功能描写叙述:求一个数的阶乘

    *输入參数: iInputValue-输入值

    *输出參数:无

    *返  回 值:求阶乘后的结果

    *其他说明:无

    *改动日期            版本号号           改动人         改动内容

    * ---------------------------------------------------------------------------------------------

    * 20140813         V1.0            周兆熊           创建

    ***************************************************************/

    float ProcessFactorial(INT32 iInputValue)

    {

       float  fResult     = 0.0;

     

      // 先推断输入值是否小于0

       if (iInputValue < 0)

       {

           printf("iInputValue < 0, dataerror!");

     

           return -1;

       }

       else

      {

           if (iInputValue == 0 || iInputValue == 1)  // 0和1的阶乘是1

           {

               fResult = 1;

           }

           else

           {

               // 运行递归调用

               fResult = ProcessFactorial(iInputValue-1)*iInputValue;

           }

     

           return(fResult);

       }

    }

     

     

    (本人微博:http://weibo.com/zhouzxi?topnav=1&wvr=5,微信号:245924426。欢迎关注!

    )

  • 相关阅读:
    python面试的100题(12)
    python面试的100题(11)
    python面试的100题(10)
    python面试的100题(9)
    python面试的100题(8)
    python面试的100题(7)
    纯js做鼠标拖拽物体并记录鼠标位置的效果(附pageX clientX offsetX screenX的区别图)
    利用function函数做一个简易计算器(getElementById)
    JavaScript中的函数function
    初识JavaScript
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6807814.html
Copyright © 2020-2023  润新知