我作为计算机程序员的能力正遭受信心危机。
昨天,我尝试提出自己的图形最短路径算法,几个小时后,我简单地投入毛巾,学习了Dijkstra的算法。
这是一个好的程序员应该能够在几个小时内“重新发明”的东西吗?还是我不切实际?
哦,好吧,至少我能够重塑气泡排序:D
我作为计算机程序员的能力正遭受信心危机。
昨天,我尝试提出自己的图形最短路径算法,几个小时后,我简单地投入毛巾,学习了Dijkstra的算法。
这是一个好的程序员应该能够在几个小时内“重新发明”的东西吗?还是我不切实际?
哦,好吧,至少我能够重塑气泡排序:D
Answers:
优秀的程序员应该意识到,已经编写了一种出色的算法来解决问题,并且不会浪费时间重新发明轮子。
我怀疑Dijkstra在几个小时内提出了最短路径算法,因此这对于确定某人是否是“优秀程序员”似乎是一个很高的标准。
这是一个好的程序员应该能够在几个小时内“重新发明”的东西吗?还是我不切实际?
首先,您可能将编程与理论计算机科学混淆了。出色的程序员需要计算机科学方面的基础知识,但他并不需要出色。Dijkstra在计算机科学领域非常出色。
其次,我希望对图有深刻理解的任何人经过一番思考后都会发展自己的图遍历。但不是最短路径算法。Dijkstra的算法特别复杂。一旦理解,它就非常明显。但是大多数事情都是这样。
在尝试了一些东西并花了一些时间之后,您可能会得出某种最短路径算法。但是,如果要花费几个小时甚至几天的时间,请不要失望。这是完全正常的。
(注意:好吧,您应该能够在几个小时内就将问题强行解决,但这即使在相当小的图形上也不会产生有效的算法。)
这是一个好的程序员应该能够在几个小时内“重新发明”的东西吗?还是我不切实际?
绝对不现实。人们不仅会在几个小时内“浮现”算法。这需要大量的努力和工作。引用此博客:
本特利在《 Programming Pearls》中引用Donald Knuth的话说:“虽然第一次二进制搜索是在1946年发布的,但是直到1962年,才出现了对n的所有值都正确工作的第一次二进制搜索。”
而Bentley的版本在用于大型设备时也存在问题。
此外,优秀的程序员知道他可以使用哪些工具以及何时使用这些工具。您不会因独创性或做不同的事情而获得加分-您希望它能正常工作。
这让我想起了我读到的有关“软件工程”(我称之为编程)与其他工程学科之间的区别的内容。想到它,我认为那是原始的《设计模式》一书。我确定这里有人可以引用他的头。
无论如何,关键是(尽管不完全针对算法设计)是将工程学科进行了编纂。没有任何土木工程师可能会花时间尝试重塑工字梁,但是程序员一直都在这样做。问题(我意识到我只是在回应许多人的观点)是,这种行为是浪费和容易出错的,并且比解决方案更能为我服务。
计算机科学使我开始编程,我俩都爱。但是,我比计算机科学家要好得多。我永远不会指责您没有能力,因为您无法在一个下午重新发明Dijkstra的算法。如果您无法识别可以通过最短路径图算法解决的问题,我会质疑您作为程序员的能力。
就是说,我相信思考算法并尝试设计和实现新算法(可能)很有趣,并且(几乎)总是很有启发性。我只是试图将CS时间与编程时间完全区分开。对于程序员而言,我们(特别是带薪的)时间最好用于解决实际问题,而不是抽象问题。此外,CS时间几乎总是粉碎我的信心。
对于大多数答案,我希望有所不同。虽然我不希望任何级别的程序员都能亲自提出Dijkstra的算法,但我绝对希望他提出解决问题的任何方法(有效或无效)。
例如,您作为附带评论说,您可以自己提出气泡排序。我知道它是最臭的排序算法,但是您找到了解决问题的方法,这就是我所希望的程序员能够做到的:找到解决问题的方法。
当然,研究和寻找其他人提供的解决方案也是可行的,但那一点极端是一个不考虑自己,并且其程序是Google搜索纲要的人。
我认为我听起来比实际想要的要苛刻,但我的意思是:我希望程序员具有足够的创造力,可以提出解决问题的方法,即使该解决方案有故障或混乱。
因此,回到您的情况,我认为您不必提出Dijkstra的算法,但是如果您能够编写一种算法来尝试几种可能性并找到最短路径而又不以无限循环结尾的能力,那你就得到我的认可
(顺便说一句,我的认可与免费洗车优惠券的重要性顺序相同。)
这是一个好的程序员应该能够在几个小时内“重新发明”的东西吗?还是我不切实际?
我要说的是,如果您能够独自发明一个解决诸如最短路径之类的著名问题的算法,那么您将是一个糟糕的程序员。
这意味着您将忽略最短路径问题的悠久历史,从1955年发布的O(| V | ^ 4)算法到1984年发布的O(E + V log V)算法(即Dijkstra的算法)斐波那契树算法)。您几乎可以保证比已设计的算法做得更糟。更糟糕的是,您的算法很可能存在漏洞或错误,从而使其不正确。此外,与重用现有算法相比,您几乎肯定会花更多的时间来思考,实施和测试算法。
将算法设计留给算法设计者。程序员是他们结果的消费者。程序员结合了算法并将其用于实际任务。警务人员不必为了工作或成为一名好警官而重塑法律。
我什至鼓励您使用专家做出的实现,而不是自己为任何中等复杂的算法实现算法。这很可能是正确的,有可能它们使它比您以往更快,并且为您节省了大量时间。这是特别的加密算法真实的,因为你得到安全的额外需求,通常只有专家可以为您提供。