Algorithm 我如何让同行相信算法很重要?

Algorithm 我如何让同行相信算法很重要?,algorithm,peer,Algorithm,Peer,我的一位同事正在写一份报告,显示我们小型咨询公司每位员工每周(周日至周六)的预付款情况。他写了一段代码,显示了与目标周中的天数对应的列。他的算法如下: 获取一周中的哪一天是一个月的第一天。如果是星期天,将国旗设置为零;否则,将其设置为1 迭代一个月的所有日子。如果是星期天,升国旗。然后,如果标志值等于要显示的周,则显示与当前日期对应的列;否则,隐藏该列 当然,该标志指示当前周是什么 我提出了另一种算法: 获取指定周的第一(F)天和最后(L)天是该月的哪几天。例如,2009年10月的第一周从星期二

我的一位同事正在写一份报告,显示我们小型咨询公司每位员工每周(周日至周六)的预付款情况。他写了一段代码,显示了与目标周中的天数对应的列。他的算法如下:

  • 获取一周中的哪一天是一个月的第一天。如果是星期天,将国旗设置为零;否则,将其设置为1
  • 迭代一个月的所有日子。如果是星期天,升国旗。然后,如果标志值等于要显示的周,则显示与当前日期对应的列;否则,隐藏该列
  • 当然,该标志指示当前周是什么

    我提出了另一种算法:

  • 获取指定周的第一(F)天和最后(L)天是该月的哪几天。例如,2009年10月的第一周从星期二1号开始,到星期六3号结束
  • 遍历对应于第1天到F-1天的列,并隐藏它们
  • 遍历对应于F到L天的列,并显示它们
  • 遍历对应于L+1天到DaysOfMonth的列,并隐藏它们
  • 我的算法中的“困难”部分是第1部分。我的意思是“困难”就像“难以理解”一样,因为这样做的算法复杂性是恒定的。我的算法的优点是循环更紧密。我同伴的循环对一个月的每一天进行比较。我的没有

    这是一个小例子,你可能会说这里的过度优化有点过于偏执。但是,当我们编写实际的性能关键代码时,他的编程风格一点也没有改变

    他的代码中也充满了这些测试:

    /* doSomething() doesn't change the state of the relevant variables. */
    if (condition)
    {
        flag++;
        if (flag > test)
            doSomething();
    }
    else
        if (flag >= test)
            doSomething();
    
    当然,可以这样做:

    if (flag >= test);
        doSomething();
    if (condition)
        flag++;
    
    我该怎么办


    编辑:我更正了代码示例中的比较。我认为您的朋友的想法是正确的。以一个明显正确的算法为例,这个算法需要一个小时来解释,但在没有特定性能目标的情况下,速度更快

    如果你有一个特定的性能要求,比如“代码需要能够在接下来的十年内在机器X上200个微秒内给出正确的结果,并且更简单的代码不符合要求,那么你可以考虑使用你的版本。


    (你发布的代码示例显然比你的好,因为它不那么复杂。)

    根据你的描述,我不确定我是否同意你的同事的观点。这里的关键问题是这段代码是否是性能瓶颈

    要说服我切换到您的算法,您必须分析有问题的应用程序,并向我表明这段代码对性能至关重要。然后进行更改并再次配置它。这样你就有了一个客观的比较基础

    如果这两种算法之间存在有意义的差异,那么你们两人可以讨论是否值得进行转换

    如果您担心web应用程序的页面加载时间,请记住的教训和-如何处理CSS、javascript和缓存将比优化服务器上运行的算法产生更大的影响


    提倡无需测量的优化与忽视幼稚算法的性能影响一样危险。

    这是你的任务,还是他的任务?如果是他的,就让他做吧。我是一个靠效率发迹的人,事实上,当一些事情看起来效率低下,超出我的控制时,我会变得非常沮丧

    有超过200人,所以谁可以把我最“有效”的想法,算法和代码羞辱。也许更重要的是,你不能一个人去。如果Linus Torvalds自己报名,他会像我们一样从1开始

    你必须考虑的是,人们需要能够维护他们编写的代码。这意味着,他们必须像生下它一样理解它。即使有人演示了另一种比我自己的算法更有效的算法,我也不会使用它,除非我对它感到满意

    如果这是一个联合项目,按照你的方式写下来,演示加速,然后花一些非常非常耐心的时间与你的同伴一起帮助他真正掌握它


    回顾你5年前写的东西,每个人都必须在实践中学习,每个人都以自己的速度做事,尤其是学习。

    你不应该干预,因为显然你错了。。。这两段代码并不相等。只取条件=1、标志=0和测试=1,我看不出这里有什么问题。。。虽然他的版本有点迂回的方式达到目标,但他确实做到了

    我要说的这句话不应该断章取义:但总会有人这样做——这并不是错的,恰恰相反。。。他可能不知道做某事的好方法,但不管他的方法多么丑陋,他确实知道如何得到结果。
    当没有人知道某件事的正确算法时,这可能是一个真正的救命恩人。。。很可能他会以某种方式躲开它。

    G'day

    我建议你应该偏爱在你的约束范围内执行的算法简单性,而不是智能的、过于复杂的、没有实际收益的算法。根据我的经验,这些过于聪明的把戏很可能成为未来维护的噩梦

    下面的引语更能表达这一观点:

    “有能力的程序员充分意识到自己的头骨大小受到严格限制;因此,他在处理编程任务时非常谦虚,除其他外,他避免使用瘟疫之类的聪明把戏。”-埃德斯格·迪克斯特拉在1972年的ACM图灵演讲中”

    顺便说一句,纸是一个伟大的理由