有争议的编程意见

2020-12-05 00:04:51

我们对于此博客的最初想法之一是将网站早期(未受限制的时期)的一些奇妙宝石转换为博客文章。社区曾经热情地收到了问题,但不再适合程序员的范围。

我选择的第一个被删除的问题是乔恩·斯基特(Jon Skeet)的“您最有争议的编程观点是什么?”问题(仅适用于10K +用户,对不起),最初是2009年1月2日在Stack Overflow上问了一个得分为+391的问题。以下是随机投票的20个投票最高的答案...

那些不会在业余时间编写代码的程序员将永远不会像那些程序员那样优秀。

我认为,即使最聪明,最有才能的人也永远不会成为真正的优秀程序员,除非他们将其视为一项工作。这意味着他们一边做一些小项目,要么在业余时间就搞混了许多不同的语言和想法。

进行单元测试的唯一原因是确保已经运行的代码不会中断。首先编写测试,或为测试编写代码是荒谬的。如果您在代码之前写测试,您甚至都不知道边缘情况是什么。您可能拥有通过测试的代码,但在无法预料的情况下仍然失败,此外,优秀的开发人员将保持较低的凝聚力,这将使添加新代码不太可能导致现有内容出现问题。

您应该一直使用的唯一“最佳实践”是“使用大脑”。

太多的人跳上了很多潮流,试图将方法,模式,框架等逼入不需要的地方。仅仅因为有些新事物,或者因为某个受人尊敬的人有见解,并不意味着它适合所有人。

我们大部分时间都在维护其他人(或我们自己)编写的代码,而糟糕,错误,过时,误导性的注释必须位于代码中最令人讨厌的工件列表的顶部。我认为最终很多人会把它们排除掉,尤其是更好地集中精力使代码更具可读性,必要时进行重构并尽量减少成语和古怪。另一方面,许多课程都指出注释比代码本身更重要,这将导致下一行在invoiceTotal注释样式中添加一个。

是的,我知道这让某些人感到不快,因为他们多年的沉思和/或光荣的编程书籍正逐渐被任何人都可以在几秒钟内访问的资源所困扰,但是您不应该对他人不利我经常听到关于批评的问题对谷歌的搜索,这确实是没有道理的。首先,必须承认每个人都需要参考材料。您一无所知,因此需要查找所有内容。考虑到这一点,从哪里获得信息真的很重要吗?您是在书中查找,在Google上查找还是从幻觉的青蛙那里听到它,这有关系吗?否。正确的答案就是正确的答案。重要的是您理解材料,将其用作结束成功编程解决方案的手段,并且客户/您的雇主对结果感到满意。

经理经常认为开发人员A ==开发人员B只是因为他们具有相同的经验水平等等。实际上,一个开发人员的性能可能是另一个开发人员的10倍甚至100倍,谈论它在政治上是冒险的,但有时我想指出的是,即使几个团队成员看起来具有同等技能,这是并非总是如此。我什至看到过这样的情况,主要开发人员“超出了希望”,初级开发人员完成了所有实际工作–不过,我确保他们得到了认可。

我不明白为什么人们认为Java绝对是大学中教授的最好的“第一”编程语言。

首先,我相信第一种编程语言应该强调学习控制流和变量,而不是对象和语法。另一方面,我认为没有调试C / C ++内存泄漏经验的人不能完全理解Java带来的好处。自然的发展应该是从“我该怎么做”到“我如何找到可以做到这一点的库”,而不是相反。

如果您只会一种语言,那么无论您多么了解它,您都不是一个优秀的程序员。

似乎有一种态度表明,一旦您真正精通C#或Java或其他任何您开始学习的语言,便已足够。我不相信-我所学的每种语言都使我学到了一些有关编程的新知识,使我能够与其他所有语言重新结合起来。我认为任何限制自己使用一种语言的人永远都不会像以前那样优秀。这也向我表明了某种缺乏探究性和实验性的意愿,并不一定与我期望的一种语言相符。真的很好的程序员。

有时,完成特定任务只需要快速而又肮脏的一段垃圾代码。模式,ORM,SRP,等等……抛出一个控制台或Web应用程序,编写一些内联SQL(感觉不错),并超出要求。

我相信通过用System.out.println(或任何适用于您的语言的打印语句)乱码来调试代码非常好。通常,这比调试要快,并且可以将打印输出与应用程序的其他运行进行比较。只需确保在生产时删除打印语句(或者最好将它们转换为日志记录语句)。

当您为雇主编写软件时,所创建的任何软件都应以任何开发人员都可以选择和理解的方式编写。它经过精心设计,清晰一致地编写,格式化,记录需要的位置,按预期每日生成,检入存储库并进行适当的版本控制。如果遇到公交车撞伤,下岗,开火或下车的情况在工作中,您的雇主应该能够在短时间内通知您,而下一个人可能会担任您的角色,拿起您的代码,并在一周之内启动并运作。如果他或她不能做到这一点,那么您就惨败了。有趣的是,我发现实现这一目标使我对雇主更有价值。我越努力成为可抛弃型产品,我对他们就越有价值。

我见过成千上万的人声称公共场所是邪恶的,因此它们将其私有化,并为所有人提供吸气剂和吸气剂。我相信这几乎与公开字段相同,如果您使用线程(但通常不是这种情况)或您的访问器具有业务/表示逻辑(至少有些``奇怪''),则可能有点不同。我不是赞成公共领域,而是反对为每个人都做一个吸气剂/设置器(或财产),然后声称这样做是封装或信息隐藏……哈!

也就是说,就像您的C#,Java或其他常用的对象/过程语言一样,开发一种可读且可维护的格式化样式。我讨厌看到草率的自由格式SQL代码。如果您在页面上看到两种样式的大括号时都尖叫,为什么或为什么在看到自由格式的SQL或模糊或混淆JOIN条件的SQL时不尖叫?

当然,有一些有用的图表,例如复合模式的类图,但是许多UML图绝对没有价值。

甚至比正确性还重要。如果可读性强,则很容易修复。它还易于优化,易于更改,易于理解。希望其他开发人员也可以从中学到一些东西。

我认为有太多人在动脑子之前就跳入XML潮流了……XML用于Web东西很棒,因为它是专为XML而设计的。否则,我认为一些问题定义和设计思想应优先考虑使用它的任何决定。

我非常喜欢软件开发。过去几年,我已经写了一个关于该主题的博客。我在这里花费了足够的时间,拥有超过5000点的声望。我在一家初创公司工作通常每周工作60个小时,而我的薪水却比承包商少得多,因为团队很棒,工作很有趣,但是从总体上看,这只是一份工作。在很多事情上,例如家庭,我的女朋友,朋友,幸福等等,以及如果我有无限量的现金,例如骑摩托车,帆船或单板滑雪,我宁愿做的其他事情都排在下面。有时,许多开发人员忘记了开发只是使我们能够拥有生活中更重要的事物(并通过做自己喜欢的事情来拥有它们)而不是最终的目标。

去年,我做了很多采访,在采访中,我应该测试人们的思维方式,以及他们如何在白板上实现简单到中等的算法。最初,我会遇到以下问题:假设可以使用函数4 *(1 – 1/3 + 1/5 – 1/7 +…)来估计Pi,并且给出更多的术语以提供更高的准确性,请编写一个函数来计算Pi精确到小数点后5位。

这个问题应该引起您的思考,但对经验丰富的开发人员来说也不应该超出这个范围(可以用大约10行C#回答)。但是,我们的许多候选人(据说是由代理商预先筛选的)甚至都无法开始回答,甚至无法解释他们可能如何回答。所以过了一会儿,我开始问更简单的问题,例如:给定圆的面积是Pi乘以半径平方的平方,编写一个函数来计算圆的面积。

令人惊讶的是,超过一半的候选人无法用任何语言编写此功能(我可以阅读大多数流行的语言,因此我可以让他们使用他们选择的任何语言,包括伪代码)。我们有无法使用C#编写此功能的“ C#开发人员”。对此我感到惊讶。我一直认为开发人员应该能够编写代码。如今看来,这是一个有争议的观点。当然,这是面试候选人之一!

软件设计,尤其是优秀的软件设计,千差万别,无法在模式中进行有意义的捕捉,尤其是在人们实际上可以记住的少数模式中,而且它们过于抽象,以至于人们无法真正记住很多东西。因此,它们并没有太大帮助。另一方面,太多的人迷恋该概念并尝试将模式应用于任何地方–通常,在结果代码中,您无法在所有代码之间找到实际的设计(完全没有意义)。 )单身人士和抽象工厂。

如果用户说“是吗?”,而您的工作仍然不可见,则说明操作正确。荣耀可以在其他地方找到。

你怎么看?更重要的是,您最有争议的编程观点是什么?

例如单元测试和TDD。这是您可以写的最好的文档。本文只是linkbait恕我直言

这样,您实际上不必删除打印语句。您甚至可以将其设置为命令行开关以将其关闭/打开

.toString(XML)中的昂贵代码通过抛出xml对象来运行,这使我非常恼火。如果您确定要使用DEBUG模式,则只需要考虑对象的字符串表示形式

如果您可以使用编译时间常数,则最好使用这些时间常数,这样您的打印件甚至都不会被编译。有些人是如此坚信整个世界将在发布代码的那一刻对它们进行反编译。

“……优秀的开发商将保持较低的凝聚力……”。嗯……您的意思肯定是“内聚力高”或“内聚力低”。该评论的其余部分绝对是可笑的。这甚至不是意见,而是纯粹的废话。 “好的程序员会做正确的事。”对。他们肯定会的。他们如何成为优秀的程序员?

RE:关于评论的第4点;是的,写得不好的注释很难阅读,只能被“否”注释打败,您可以根据需要使代码可读性强,但是,如果其长度足够长,则需要注释。结束。

我非常不同意任何意见总比没有意见要好。 (至少,我认为这就是您的意思。)不良或误导性的评论可能会混淆或延迟对代码的理解。

对我来说,注释的要求暗示着该代码不够清晰。 (当然,您所需要的当然不包括API文档注释,因为通常读者实际上并没有源代码。)

我使用的是Visual Studio,您可以右键单击一个断点,然后将其转换为“点击时打印此内容”,并将其记录到输出窗口中。通常,这是我调试大量长期运行或复杂问题的技术的第二到第三步。

老实说,我不认为创建一个复杂的数学函数可以使您成为一个优秀的程序员,他关心的是已经使用您所使用的语言完成过的数学函数,我记得自己上大学时就曾做过,但是我从来不需要做任何事情就像在任何网络项目上一样。

我认为问题并不重要,而是这样做是对编码能力的基本测试。您应该能够在几分钟内生成解决方案。

Spolsky和Atwood过去曾抱怨说,许多申请人的实际编程能力不高,甚至无法通过简单的FizzBu​​zz测试,因此,这是一个完美的第一道障碍,用以证明您并没有虚张声势参加面试。

我同意,卡洛斯。问一个写代码而不是解决数学问题的人,这是一个荒谬的问题。一个显而易见的更好的问题是要求受访者准确地对问题进行建模。提出特定领域问题(例如数学问题)的唯一有效理由是,该问题是否直接涉及您所申请的领域。例如:如果您编写加密算法或编写音频编解码器,那么您应该期望在面试中看到数学问题。但是,如果在进行Web开发人员工作的面试过程中遇到数学问题,则您的面试官可能正在抚摸自己的自我,并且偏离了基础。我曾经采访过无数的程序员,如果我问这样一个愚蠢的数学问题,我会想念许多才华横溢,志趣相投的候选人。

难怪您没有得到有关计算Pi的许多很好的答案。没有一点数学就无法回答。关于这个问题的每条评论都是错误的。我希望我不是。

有人在这里说过,您需要知道常数Pi才能检查您正确计算了多少个小数。当然是错的。但这指出了困难所在。

假设您要在该点后一位。您的代码计算出Pi〜3.14。如果您的硬度(e)小于0.04(AKA 4 10 ^ -2),这是否足够精确,因为3.10<皮< 3.18。因此,所需的不确定性取决于所计算的数字。如果需要4位数字,则仅在确定度小于0.000007(AKA 710 ^ -6)时,计算值3.141593才是正确的。

因此,我们必须知道序列S_k = 4 * Sum((-1)^ k /(2 * k + 1))的收敛速度,如果我没记错(太懒得拿笔检查一下),| | Pi-S_k | < 2 * k。这就是我开始对所需功能进行编码所需要的。

但是请记住,我们在这里谈论的是IEE754。它们本质上是不准确的。

因此,您可能还必须考虑数字表示形式中固有的不准确性。

基本上,注释应该描述为什么以这种方式编写代码,而不是这样做的方式。如果由于某个错误或边缘情况而导致代码“不需要”以某种非显而易见的方式出现,直到出现一些严重的崩溃或更糟的,中间的间歇性故障,这种情况才变得明显,那么请将其放入代码中!如果不这样做,则意味着人们将不愿进行重构,您基本上是在为重构工程师制造很少的地雷。

重构工程师! 您从哪里获得其中之一? 还是您只是说那个工作的人接下来要与您合作编写代码并决定重新安排它? 这是不正确的。 长度相等的部分和为负数。 它也不止于小数点后五个位。 foo = let xs = map(4 /)$ zipWith(*)(cycle [1,-1])[1,3 ..] in Data.List.find(\ x-> 3.14159< = x& & x< 3.1416)$ scanl(+)0 xs 您的左折数有点问题–尝试使用300002而不是300001。我希望: 每个意见旁边确实需要有一个投票按钮。 看到每个人获得多少票会真的很有趣。 自1983年开始编程,现在使用Java和Ruby进行编码。 我可以确认:以上所有都是正确的。 4.0 *(1 –和[如果x等于-1.0 / z,否则1.0 / z |(z,x)<-b])

我花了大约30行C ++,并且对精度的限制更大!

我在业余时间停止编码,学会弹奏班卓琴。这些天,我通常会播放音乐大约一个小时,与家人共度时光,睡个好觉。

我可能不再是一个优秀的程序员,但至少我不觉得自己的心脏病即将来临🙂

当程序网站无法在流行的浏览器(例如Opera)中读取时,我发现这很有趣。

具有未初始化变量的编程语言要好于所有变量始终具有定义值的编程语言。至少在这方面。

通常,在首次使用变量之前,必须先声明变量,然后才对其进行有意义的分配。 (例如,在构造函数中初始化的类成员)最好不对其进行初始化,而不要给它们提供默认值(例如0)。

初始化这些值可能会隐藏程序逻辑中的错误,并且造成的危害大于帮助。

在变量中具有潜在的随机值如何改善?我可以看到效率收益,这是一个值得关注的问题,但是会为变量保留潜在的无效值。

考虑一下一个指针,如果它初始化为null,则显然不是有效地址。否则,它可能至少是四分之一(假设是32位对齐值)。

当今大多数语言都允许在首次使用时声明变量。在无法应用的情况下,请尽早初始化。例如:

可以接受,如果该变量距离该变量较远,则将其初始化为默认值可能更安全。

Rob,访问未初始化的值是valgrind容易发现的错误。无需担心它们。

对于某些变量,所有可能的值都是有意义的。例如,NULL指针可能意味着在特定的计算中没有对它进行置疑。

请考虑以下情况,这种情况经常发生:您有一个指针ptr,应该将其设置为NULL或函数中对象的地址。由于代码中存在逻辑错误,因此未调用该函数。

那么将很难找到该错误。另一方面,如果根本不初始化指针,则崩溃或valgrind会告诉您您访问未初始化的内存。

崩溃的bug总是比安静地改变程序行为的bug更好。

8,“如果您只会一种语言,那么无论您多么了解它,您都不是一个优秀的程序员。”

语言按1)强制性2)面向对象3)功能等分类。最好从每个类中学习至少一种语言。

当然,您只需要编写一个循环,即可一次添加一个项,然后继续执行,直到前6个小数位不再更改为止(避免舍入错误为6个)。在每个步骤中,将修订后的估算值与先前的估算值进行比较(以获得匹配的最高有效位数)。我很确定我可以在几分钟内用Java,C ++或C#做到这一点,但是那时我只是一个失业的业余程序员,所以我知道什么?问题是,候选人在紧张时很难思考。最难的部分是阅读必须克服的艰巨,听不清和难以理解的挑战

......