我正在对初级(可能是高级)软件工程师的常见错误和不良假设进行一些研究。
你最长期坚持的最终被纠正的假设是什么?
例如,我误解了整数的大小不是标准,而是取决于语言和目标。说起来有点尴尬,但确实如此。
坦率地说,你有什么坚定的信念,你大概坚持了多久?它可以是关于一个算法、一种语言、一个编程概念、测试,或者其他关于编程、编程语言或计算机科学的东西。
- 您可能对doi.acm.org/10.1145/1364782.1364795 doi.acm.org/10.1145/984458.984495 doi.acm.org/10.1145/1142031.1142053感兴趣。
很长一段时间以来,我一直认为其他人都非常精通所有编程概念(设计模式、最新的语言、计算复杂性、lambda表达式,等等)。
阅读博客、栈溢出和编程书籍似乎总是让我觉得我落后于所有程序员凭直觉必须知道的事情。
随着时间的推移,我意识到,我正在有效地将我的知识与许多人的集体知识进行比较,而不是单个人,这对任何人来说都是一个相当高的标准。现实世界中的大多数程序员都有一个知识库,这些知识是他们完成工作所必需的,并且他们有许多薄弱或完全不了解的领域。
- 是真的!这就是这个时代的问题。信息也令人沮丧。几周前,当我觉得自己在研究方面做的每一件事(不是第一次)都是一个彻底的失败者时,我得到了这个启示。那些在IEEETransactions上发表论文的人不一定和那些在谷歌工作、在StackOverflow上夸耀自己、在AR优秀教授中夸耀自己或者写伟大的编程博客的人有同样的技能。当然,最优秀的人比我们更酷,但他们不知道你所知道的一切。所以,保持冷静。
- 这也有助于理解那些博主们也没有把所有的事情都写下来。优秀的博主在写文章时会研究他们的主题并学习新事物。
- 我每天都沉迷于那些我没有时间去阅读和学习的东西。有时我会有一种可怕的内疚感。
- 我知道你的感受。我真的很努力地跟上这些东西,但毕竟我有一天的工作!
- 网址是不言自明的:liveconsiderative.com/toou manyu choices.htm
- 完全地!谢谢你这么说,当我开始阅读这个网站时,我觉得很疏远,我想"妈的,我什么都不知道!".
- 我也做过同样的事,但从未意识到…我很长一段时间对我的技能感到太过讨厌和谦虚,这是基于上面描述的现象…
- @齐鲁佩:阿门。我发表了一些国际会议论文和期刊。在一些人看来,这听起来很酷。直到你意识到发表一篇论文其实并不需要太多的努力。我们不是天才。我们和其他人一样。我们犯了错误,还发表了废纸。嗯,除了少数真正的天才…
- 完全同意!!大多数从事商业项目的开发人员都会在严格的截止日期前交付产品。我想知道有多少遵循OO实践、良好的编码准则、测试驱动的开发等。我见过许多.NET项目不遵循适当的分层架构,主要是由于时间和资源限制。
- 哦,好吧,我想我有点离题了。我想说的并不是所有人都是天才开发者,所以当你看到有人如此看重TDD的重要性时,OO,虽然所有人都很好地给出了良好的意图,但不要因为你不够好而感到不好,因为你没有做到。我们都是在找到自我的情况下工作的,有时是不可能通过良好的实践去做的。
- "[…]我正在有效地将我的知识与许多人的集体知识进行比较"。<完全!!
- 也许正是这种负罪感/悔恨感促使我们更好地掌握自己的技艺。我想这最终是件好事。
- +我读到这封信很好。我以为只有我一个人。
- 这使我的大脑免于煎炸。最近,我一直在思考我不知道的事情,以及似乎每个人都非常了解所有事情,而不是真正地学习一些东西!很高兴看到我不是唯一一个!
- 伙计,我在更好的时候读不到这个……
- 我听到了,兄弟……
- 我同意Johnfx的帖子。但是,fwitw@johnfx…我比你更了解;—)
- @用户279521-哦,是吗?我举起了几根手指?
- @2个月后,约翰克斯……+(该死的,你是个迟钝的家伙)….
人们知道他们想要什么。
在我认为我会和人们交谈的最长时间里,他们会描述一个问题或工作流程,我会将其放入代码中并自动化。事实证明,每次发生这种情况,他们认为他们想要的并不是他们真正想要的。
编辑:我同意大多数意见。这不是一个技术性的答案,也可能不是发问者想要的答案。它不仅适用于编程。我相信这也不是我最长期坚持的假设,但这是我在短短10年里学到的最引人注目的事情。我确信这对我来说是纯粹的幼稚,但是我的大脑是如何连接起来的,在进入商界之前我的教学和经验让我相信我会做我回答的事情;我能够使用代码和计算机来解决人们的问题。
我想这个答案类似于罗宾关于非程序员理解/关心我所说的。它是关于将业务作为一个敏捷、迭代、交互的过程来学习的。它是关于学习成为编程代码猴子和成为软件开发人员之间的区别。这是为了认识到两者之间存在着差异,要想在这个领域表现出色,不仅仅是语法和打字速度。
编辑:这个答案现在是社区维基,以安抚人们对这个答案的不安。
- 或者在看到他们以前想要的东西后改变他们想要的东西。人们喜欢改变主意。我知道,因为我是一个民族。
- 你给了他们他们想要的,而不是他们想要的。
- 为什么无聊的无争议的没有答案的人会被投票的那么多?!
- 我的意思是,伙计,这不是一个可以是"错误"或"错误"的陈述,它不是真正的陈述,更多的是你的看法改变了。它不能满足最初问题的条件,它描述的更多是你对敏金德越来越悲观的看法,而不是你作为科学家的进步。
- 真的。听起来有人需要拥抱。
- @尼科-这是一个很好的答案。即使我投了反对票,我的答案也必须竞争;)
- @布伦特·贝利:更糟糕的是,你给了他们你认为他们要求的东西,而不是他们想要的。
- 是什么让你一开始就做出这样的假设?
- 不是学究式的,但你似乎发现构建系统是一个交互过程。想法,原型(有时是部署),垃圾箱,新想法…或者你可以把它看作是"人是愚蠢的",这也是真的…
- 这就是我喜欢敏捷项目管理的原因。
- @尼科:答案没问题。他从中得到近400个代表的事实是英国广播公司。
- 另一方面,有些人知道自己想要什么,但这绝对是不感性的。例如,我们的一个客户"我认识这个人,我个人知道他有这么多钱,我们想在我们的网页上突出显示他,但我们不能在任何地方存储任何表明这一点的东西,你能做到吗?"嗯。
- "我认为你可以得到你想要的或你需要的,但你不能两者都拥有……通常。"(摘自哈尔哈特利的《简单的人》)
- @丹尼尔:听起来像是软件的不确定性原理……
- 我的天啊@people抱怨,stackoverflow rep不是竞争对手。如果你喜欢这个答案,不要因为嫉妒而投反对票,因为你没有先发表。
- @所有-阐述了我的理由,并停止了代表增益。感谢您的评论,我很惊讶这个答案产生了它所做的一切!
- 这绝对应该是最高的赞成票。幼稚地问用户他们想要什么才能生产出最好的产品的想法很普遍,而且是非常非常错误的。尤其重要的是在构建"收缩包装"或Web软件时要记住:给您反馈的用户只是总用户的一个子集,这将扭曲您的观点。
- 也许我希望它是投票最高的答案。也许我不知道。我不确定。
- 我最喜欢的是当你发现客户要求的东西有问题,并指出问题所在。"当我这样构建它的时候,它会做X,我几乎可以肯定你不想做X"。他们告诉你无论如何都要建立它,然后6个月后当发布被推迟时,你会感到恐慌,因为它做了X,需要"修复"。
- @Jherico这在合同中称为"变更请求"=$$。
- 有时,客户会让您实现一些东西,以帮助他们决定他们想要什么。理想情况下,"概念证明"应该这样做,但这种情况很少发生。
- 该死的……对我来说是这样的。
我不需要分析就知道性能问题在哪里
- 我认为这就是为什么过早优化如此普遍的原因。
- +哇,有人给出了一个不是琐碎或离题的答案。
- 我有一些药片可以帮助提前优化…
我应该只有一个函数/方法的出口点。
- 实现得很好;必要时经常退出。一个人应该在没有理由继续深入某个职能时立即退出。这样做可以减少复杂性并提高可读性,例如,当条件是正确运行方法所需的前提条件时,可以避免深度嵌套的条件。在具有内存管理和资源结构(如using/finally)的现代语言中,教条主义地一直延续到方法的末尾是没有意义的。
- 顺便问一下,是谁想出的?就像一个城市传奇。
- 必须调试其他人的代码的人就是提出这个问题的人。
- 如果您的代码嵌套得太深,以至于您无法尝试创建一个退出点,那么请重构代码。将东西移动到具有描述发生了什么等名称的方法中。当然,您必须遵循每个方法来准确理解每个方法在做什么,但至少您可以通过查看调用了哪些方法、在哪些条件下调用了哪些方法来了解全局。那你就不能放很多出口了,对吗?因此,通过所有的退出点,您必须让某人完全重新组织您的代码,以便他们可以将大量嵌套的条件重构为单独的方法。
- 我的数据结构老师曾经教过。我一直认为这是混乱和不必要的,然而,他的考试是基于这个假设。
- 我认为这个普遍存在但错误的想法是基于误解。退出函数时,应始终返回到同一点。在BASIC等语言中,这是一个重要的规则,它没有强制执行:例如,该规则意味着您应该使用gosub而不是goto。在调用调用方法的C语言或Java语言中,它是自动的。但是因为它是自动的,我认为它从逻辑上的"只有一个返回点"变形为无意义的"只有一个退出点"。
- 在C语言中,您需要手动释放资源。多个出口点是泄漏资源的好机会。在我看来,在语言中没有意义,除了例外,因为你经常不知道你的出口点,或者在陈述的中间。--在这些语言中,剩下的只是"可读性结构"。
- 我认为这条规则是由流程图导向的人(就像我大学里的一些愚蠢的导师):-P组成的。
- - 1。单一的出口点是执行POST条件的唯一明智方法。
- @Adrian McCarthy——只有当你使用C语言的时候。大多数其他语言都有类似Try/Finally的功能,有些语言/平台内置了对后置条件的支持。
- 我从来没有遇到过多个出口的问题,只要它们是负责任地使用。在函数的顶部使用它们可以提前返回意外的参数(通常为空),或者在逻辑中的if/switch/try catch语句中使用它们。别把它们藏得到处都是。
- "return"、"continue"和"exit"是我最喜欢的关键字。
- 人们常常把不好的编程和不遵守规则混为一谈。因此,他们试图在全球范围内实施"一个退出点"之类的规则,因为他们认为这样可以消除糟糕的编程。当您需要您的方法进行清理时,OEP是有意义的。在其他95%的情况下,它会导致可怕的嵌套和不可读的代码。关键是要为工作使用正确的工具。对于某些语言中的某些函数,OEP是一个非常好的主意。
- @阿德里安:如果你有一些足够复杂的东西,以至于你在提前退出时遇到了真正的问题,你最好把这个功能分成两部分,一部分是外部的,用来处理资源和前/后的条件,另一部分是内部的,用来完成真正的工作,必要时可以使用提前退出。不过,大多数时候你不需要那种复杂。
- @唐纳·费罗斯:我想说的恰恰相反。如果您发现自己需要多个出口点,那么您可能没有正确地分解问题。
- @阿德里安:这听起来像是其中一个论点,不同的方面认为另一个是完全错误的。
- 如果您需要在非普通代码中有多个出口点,您需要考虑重构您的函数。
那些非编程人员明白我在说什么。
- 理解/关心……
- 我有时还有这个…我想至少到现在我妻子已经开始明白了:p
- 哦,天哪,恐怕我还没学会呢!
- 是啊,有时候我会忘记我的观众,最后会看到一群人,脸上一副茫然的表情,呆呆地看着我,但当人们表现出兴趣的时候,这很好
- 这是我对这个职业最大的挫折。
- 我仍在为此苦苦挣扎;至少现在,当我和技术人员交谈时,我能从我妻子那呆板的表情中辨认出来!
- 事实上,"那个程序员理解我所说的。"
那个无bug软件是可能的。
- +1,虽然美国宇航局几乎成功了
- 是的,但是"几乎"要花几百万美元:)
- 它还没有实现,但绝对有可能(只要我们继续使用确定性数字硬件)。我们必须从头开始设计一个全新的、经过精心设计的操作系统和硬件,没有严重的设计错误。
- 什么是确定性数字硬件?
- 更具体一点说,"正常预算下可以实现无缺陷软件"
- 你永远不会有没有bug的软件,只是还没有发现bug的软件。
- +对帕特里克来说,这几乎是一个乌托邦,但我想每个人都知道它不是无缺陷软件,它几乎是无缺陷软件。
- 我不想要没有bug的程序,这不好玩,而且会把开发者的就业率降低10!
- 哇,这个答案有-1票。人们真的认为无缺陷软件是可能的吗?
- @triynko你的"可能"和@jaredpar的"可能"不一样。理论和实践在理论上可能是相同的,但在实践中却截然不同。
- 取决于您是指算法正确性还是"做用户希望它做的"。前者当然是可能的。
- @只有当你不知道"理论"是什么意思时,理论和实践才是不同的。人们似乎把它与"猜想"混淆了。@杰瑞德:是的,我一直在想,如果我能变得更聪明,更努力,学习更多,我就能做到。这也是我们制定这么多法律、接受这么多年的教育、吸食这么多毒品等的原因:也许通过一点控制,我们可以使一切变得完美,对吧?(主题外太多?)
- @Jaredpar我看过很多Hello World应用程序,它们完全没有bug=p事实上,我挑选的很多编程书籍中都有这样或那样的小家伙,我想不出哪本书中有bug=p
- @约瑟夫,部分问题是人们认为Hello World程序没有漏洞。它们不是。大多数情况下不检查printf中的错误,例如,也不检查其他IO尝试失败的帐户。
- @Jaredpar是对的——最普通的软件有缺陷。所有不平凡的软件都有缺陷。用今天的工具编写有趣的、没有bug的软件是完全不可能的,而且在大多数情况下,我们似乎很酷。考虑到软件有多复杂,它确实做了一件了不起的工作。即使是臭名昭著的办公室也似乎总能找到我未保存的文件,如果我把它划掉的话:)。十年来,我们在更好地处理不可避免的错误方面取得了长足进展。
- 带有自动着陆系统的飞机自动驾驶仪必须能够在不发生事故的情况下着陆100万次以上。大多数使用三台并行工作的计算机,一台驾驶飞机,二台检查第一台是否有错误。这几乎是免费的,因为你会得到。为了记录我在这些系统上工作,但我没有对它们进行编程,
- 我必须投反对票。有可能拥有无缺陷的软件,并且有一门不断发展的科学来实现这一点。让自己相信没有无缺陷的软件只是一个借口,这样你就不必担心了。这有助于停滞软件工程中一个重要的研究课题。
- 我知道一个特克斯。阿法克每只虫子都有一个价钱。
- 这个C程序没有错误吗?void main()-)
- @Russellh,不。您未能指定返回值,结果进程将返回随机垃圾内存。
- @Jaredpar:无缺陷软件是完全可能的。然而,它需要耐心和非常熟练的程序员,两者都供不应求。这使得无缺陷软件成为可能,只是不太可能。
- "无缺陷"软件必须考虑到每一个可能性。包括糟糕的设计和用户界面,错误的组件,并把它带到极端,甚至可能是电源故障?
- 我还是不明白什么是bug?:)
- 请不要去剖析"可能"这个词含义的文献,我们是计算机程序员。编写无缺陷软件是完全不可能的。:)
- @jaredpar--"生成的进程将返回随机垃圾内存"。这是一个功能,而不是一个bug。:-)
私有成员变量对实例是私有的,而不是类。
- 这是很常见的。在人们相信我之前,我通常必须提供测试用例。
- 有些人认为他们应该是。参见gbracha.blogspot.com/2009/03/&hellip;中的"案例4"。
- 我坚持这个假设直到…刚才。
- 您可以在scala中完成;private[this]val foo=42
- 这个对我来说是新的!虽然我想不出一个案例,在过去这对我会有用。
- @ebrown我通常只在编写equals()方法时才发现它有用
- 它们是红宝石的。
- 我最近在创建克隆函数时发现了这一点。我很惊讶它起作用了。
- 迈克·库塞拉,谢谢,我不知道鲁比的事。更糟的是,它还没有出现。)
- 我在3到4年的硬编程之后就知道了
- 这对我来说是很正常的,以至于在我第一次读到这个答案的时候,它就没有意义了。现在我想学红宝石,这样它会把我搞糊涂。:)
- vb6仅对private使用实例。它实际上没有"仅此类"的范围。
- 真的。。。我不知道
- 对我来说也是新的!谢谢)
- 我想我的大脑刚断了…我现在要去修理它
- 有一段时间,我认为这是"值",而不是"变量",这让我想知道我迄今为止写的任何代码在世界上是如何工作的。
- 这取决于语言。在C中,这是正确的,但我不确定每种支持封装的语言都是正确的。
- 你在说什么?有人举个例子吗?P
- @kiewic如果你的类中有一个名为myvar的私有成员变量,如果other是这个类的实例,你可以直接在代码中引用other.myvar。我假设是因为它是"私有的",所以即使在类内也必须使用其他的.getmyvar()。
- @戴夫·韦伯,现在一切都有意义了,谢谢!
- 关于这个答案的讨论可以在这里找到:stackoverflow.com/questions/1357496/&hellip;
- 我从来没有被这个迷惑过。否则,您将如何重载比较运算符?
- @戴夫·韦伯,你的错误假设不应该是"私有成员变量对实例和类是私有的"。换句话说,如果对象和我是同一个类,我可以直接访问另一个对象上的私有变量。我搞糊涂了。
- 我学会了,然后忘记了…然后学习,然后忘记它…
- 哇,这真的让我的世界有点震惊。
- @迈克·库塞拉:那就像是说"没人能跳10米高——上帝能跳"。
我以为静态打字在你的键盘前很安静。
- 不管真诚与否,这让我在漫长的一天工作结束后苦笑。P
- ++为了开怀大笑。听起来像是我(非技术)丈夫会想出的主意。
- + 1!我认为鸭子打字也包括打字。或者鸭子。或者两者兼而有之。
- 1笑!
- 我以为打鸭子…
在开始开发之前,您可以完全理解一个问题。
- 我的朋友,这应该是:"你能完全理解一个问题。"但这是真的。这是一个很难理解甚至接受的概念。
- 你不能"完全"理解问题,但在开始开发之前,你必须(在某种程度上)理解问题。BY.LY/KLXGL
- 有时你必须开始发展来理解这个问题。而且/或者,问题越变越严重。
聪明人总是比我聪明。
当我犯错误的时候,我真的可以痛打自己,而且经常因为自嘲而被训斥。我曾经敬畏地看着很多开发人员,并且经常假设,因为他们在X上比我了解得多,所以他们比我了解得多。
随着我不断积累经验和结识更多的人,我开始意识到,虽然他们在某个特定主题上比我了解得更多,但他们并不一定比我/你聪明。
故事的寓意:不要低估你能带来什么。
- 好的!我现在和一个非常了解.NET开发的同事一起工作。我花了一些时间才意识到我更善于理解客户的需求。
- 另一方面,我比其他人了解得更多。结果发现他们只知道不同的东西。另一个寓意是:永远不要低估别人能带来什么。
- 这是一个古老的"对他人做"的事情…我创造了一个新的短语:科技膨胀~感觉优越的状态,因为你知道一些东西,而且犯了让别人知道的错误。@另见:聪明人。
- 很好的观察——我的说法更为消极,"每个人都会时不时地犯傻"。有点与"不要翻转大家伙"有关。
- 你只需要担心当愚蠢的人,比你聪明的时候。
- 我们相信自己的力量,而不自夸;我们尊重别人的力量,而不害怕别人--托马斯·杰斐逊
很长一段时间以来,我认为糟糕的编程是发生在边缘地带的事情。做正确的事是正常的。我这几天没那么天真。
- 我曾经认为糟糕的编程只能由其他程序员完成,直到我被我的一个坏程序完成。现在我做对了!(这次你相信我,对吧?)
- 天哪,我会一次又一次地投反对票,直到我的clickfinger和我的代码复查眼睛一样疲劳…
- 完全地。我已经从"从未发生过"到"从未发生过",除了这份工作之外,"每个地方都有坏代码"。
- 我还是抱着这个信念。我想我对代码在现实世界(典型的公司)中的编写方式还没有太多了解。
- 黑客是一种常态。工程是真正竞争对手的职责。如果遇到软件工程师,我会告诉你的。
- @科莱特克:你的意思是猴子编码是正常的,不是吗?黑客技术是一门艺术,是一门高水平的艺术,请记住,我离实现还很远。
- @哈森:不,砍是一个比喻,不熟练地把斧头砍到一棵树上,疯狂地在没有真正计划的情况下凿下微小的碎片,然后制造血腥的大混乱,直到树最终落到你的头上。"黑客"是指"为了获得商业成功而进行平庸平庸工作的人"。为什么计算机领域把"黑客"改成"熟练",我永远不知道。
我认为我应该朝着尽可能抽象的方向前进。我被这门主修课击中了,因为太多的功能交织在一起了。
现在我试着让事情尽可能简单和分离。重构使某个东西变得抽象要比预测我需要如何抽象某个东西容易得多。
因此,我从开发一个管理它们的框架,转向完成工作的功能片段。永远不要回头,除非当我想到我天真地以为自己会成为下一件大事的时候。
- 去耦=真实抽象。抽象本身就是…过早优化。
- 这与我发现的性能调优是一致的。可以有一个具有多个抽象层的可爱程序。然后工作量就变得很重了,你猜怎么一直在花费时间…所有的抽象。计算机执行指令,而不是抽象。
- 抽象和泛化是强大的工具,可悲的是,它们用于将抽象用例泛化为一个实现。有趣的是,每当需要更改实现时,抽象和泛化也必须更改…
- 我完全同意贾里德的观点…如果你设法做到了"简单和分离",你就实现了真正的抽象。如果你还没有把事情抽象成接口和工厂等,事情怎么能脱钩呢?除非删除所有"if type=this then do this,or if the type is that then do something code",否则该怎么做才简单呢?
- 彼此彼此。我想我在做大量意大利面代码之前就已经学会了抽象。他们应该教我们如何完成工作,即使代码是意大利面,然后教我们关于OO和抽象的知识。
- 如果将来您可以使用抽象,即使它现在效率很低,那么抽象又如何呢?
- 安德鲁,我试图表达的观点是,当您确实需要代码时,您可以重构代码。我知道这是一个笼统的概括陈述,但这是一个很好的经验法则。
- 这是在咬我!我想我在设计我的软件的时候就进入了"建筑宇航员"模式,现在我正在实现它,我发现我浪费了很多时间使它比必要的更灵活。我仍然支持抽象,但你要付出很大的努力。我认为我应该把重点放在制造出一个运行良好的系统上,而不是"一个真正的系统"。
- "重构使事物抽象比预测我需要如何抽象事物容易得多。"<--
- 这很好。
- 我从来没有真正理解抽象类的重要性。当然,有一个1/100的例子,它是有意义的模板的子类,但imho,抽象基类是wayyyy过度使用。它必须是假设理论=实践的大学式教学的反冲。
女人觉得电脑程序员很性感…
- 等一下????
- 他他他他……好吧,我想找点东西让我的笑容保持一整天。我想我找到了!!!!:)
- 我只是不知道他们觉得我们不性感。我以为我们和其他人一样。
- 平均来说,也许不是。极客的耻辱正在消失,但还远远没有完全消失。尽管如此,仍然有很多女性喜欢极客/工程师/程序员类型。它们很难被发现,而且可能不会让它们的吸引力变得明显。
- 我女朋友不太懂技术,她觉得我的节目很性感:)
- "噢,宝贝!是的,说"如果",给我一些例外。是的,你知道我有多想要它":p
- @美国,有时,是的
- 什么?程序员很富有?这是什么时候发生的?
- 还有一个极客。
- 这绝对是真的。女人觉得你不性感,而不是我们其他人,:p
- 一些女人(合适的类型)被富有洞察力的聪明男人所吸引。除了典型的颈胡须和香肠肠,这些都是程序员的常见特征。稍微关注一下自己的形象/卫生,偶尔享受一下极限运动带来的刺激/兴奋,你就可以顺利上路了。
- 女人觉得薪水稳定的男人很性感。这个组的一个重要子集是"程序员"
- 是真的…我喜欢一个能编程的人。
软件的质量将带来更大的销售量。有时会,但并非总是如此。
- 销售软件?那是1999。
- 现在有很多基于订阅的网站…
- 微软肯定会大发雷霆。
- 一定要喜欢这个,真的。
- 不幸的是,音乐也是如此。
- 我希望提高我们软件的质量/性能被视为一项功能
- @比尔:微软什么时候开始提供高质量的软件?
所有的语言(大部分)都是平等的。
很长一段时间以来,我认为选择的语言在开发过程的困难和项目成功的潜力上并没有太大的区别。这绝对不是真的。
为工作选择正确的语言与任何其他单个项目决策一样重要/关键。
- 我觉得选择正确的库是什么问题。它只是使它经常发生的1到1之间的通信语言和库……
- 但如果是两个完整的编程语言都是图灵然后差别吗?你可以在任何语言写的任何程序!);
- 我不同意,决定使用什么语言是不重要的人要比单是实施项目。作为一个例子,只是许多其他更重要的决定。
- 一个为在(或沉默)是项目管理的书"人件"结束了,尽管有强烈的意见engenders语言选择,不是一个强大的生产力之间的差异的语言(除了组装,这notably表现不佳的高阶语言)。然而,这一研究在什么时间在什么语言Ada热新街区,所以它可以搜索的学习时间重做。
- 而完整的语言做着让它可能的应用实施相同的语法和语言metaphors经常自己做一些特定的问题类型的优点。
- brainfu * AS AS是图灵完整的Python。
- 考虑与C&vb.net进行COM集成。可选参数…这与C 4.0无关,但在这一点上,它是/是真的。
- 通常的智慧是,在每单位时间内,每行调试代码的效率在不同语言中大致相同,而给定数量的功能所需的行数可能会有很大的差异。
- 图灵完整语言在某种程度上同样适用是一种常见的误解。一个图灵完备的语言可以计算图灵机器所能计算的一切(通常也暗示着相反的方式)。对于性能绝对没有任何影响。在一种语言中需要线性时间的操作在另一种语言上可能需要指数时间,而且它们都可能是图灵完备的。理论上可计算的和实际中可行的有很大的区别。
- @Trayman,我只是觉得Bill The Lizard的评论是个笑话。
大的注释/代码比率是一件好事。
我花了一段时间才意识到代码应该是自记录的。当然,如果代码不能更清晰地表达,或者有一个重要的原因需要做一些事情,那么这里和这里的注释是很有帮助的。但是,总的来说,最好将注释时间花在重命名变量上。它更干净、更清晰,并且注释不会与代码"不同步"。
- 我同意实际代码…不包括JavaDoc注释(或等效注释)。
- +1,不要让我开始写我以前写的10行函数的论文。
- 此外,assert()语句比记录前置条件/后置条件要好。.NET 4代码合同也可以自动转换为文档!
那个程序是不可能的。
不是开玩笑,我一直认为编程是不可能学的东西,我总是远离它。当我接近代码时,我永远无法理解它。
然后有一天,我坐下来,读了一些初级教程,并从那里开始工作。今天我作为一个程序员工作,我喜欢它的每一分钟。
另外,我认为编程并不容易,这是一个挑战,我更喜欢学习,没有什么比解决一些编程问题更有趣的了。
- 感谢您添加背景信息。+ 1
- 阿门!但是,嘿,不要在屋顶上宣布这一观点。我们不想让每个人都知道编程很有趣,是吗?;)
- 大师彼得:当他们来这里问问题的时候,这会给我们更多的饲料来增加我们的代表。
- 我会说编程很难做对。然而,这是可能的,这似乎是你的观点。
- 好的,史蒂夫,我已经更新了答案。
- @Thetxi-也很有道理:)
- 我还投票决定重新打开它,因为它被改成了CW。
- @奥拉福尔:谢谢你的投票和回答。
- @奥拉福尔:你为什么希望这个问题是维基,而不是你的答案?
- 这正好反映了我的经验。我希望我能早点开始:p
- 嘿,我也有这个假设。当你是一个什么都不知道的初学者时,看代码是很吓人的。
"on error resume next"是一种错误处理
- 我觉得你……但在vbscript(特别是ASP)中,它是唯一可用的"错误处理"选项,加上明智地检查是否确实发生了错误,以及大量的祈祷。
- 是啊。。。这是某种…只是一种我们很高兴能摆脱的
- 好?但确实如此。在错误处理块开始时,请尝试下一步,然后如果(err.number<>0),则
- 这不是唯一一个等同于try catch的vbscript吗?
- -1:这是一种错误处理。只是不够优雅。
- 简历下一件事很棒:)忽略任何事情,说"当然可以,我写的!"(我以前做过。)
- 我知道选择这个构造很有趣,但公平地说,它是用于内联错误处理if(err.code=12…)
- 还有一个原因,为什么vb会死于快速而痛苦的死亡。@jpinto3912在死亡/快速/痛苦列表中也添加了"<>"。
- @埃文,是的,我还在打字!=在前30分钟,我开始进行vba-ing。但如果希望vba在try-catch语义上很快消失,那么奇怪的<>就有点太多了,嗯?
- @显然,我不喜欢vb。这种语言有着笨拙的语义和许多对VB来说特别的笨拙的实践。imho,这是一种MS Word宏语言,它已经发展到了前所未有的程度。大多数情况下,很难找到关于goog的c信息,这让我很恼火,因为关于.net的所有内容都充斥着非常古老的vb示例,在这种情况下,goog将年龄优先于有用性。我承认。我有宗教反VB的观点。因此,整个"异教徒的死亡"都在说;)
- @jpinto3912"<>"实际上并不是一个特定于VB的东西。因为"x<>y"字面意思是"x小于y"。因此,当涉及到y时,x变得无所不在;)。我喜欢!=因为它是一个简单的"不相等"
- 但是出错了,去吧!
这种编程软件需要在高等数学中有很强的基础。
在我开始编写代码之前的几年里,人们总是告诉我,要成为一名优秀的程序员,你必须擅长高等代数、几何、微积分、三角函数等。
十年后,我只做过一次八年级学生做不到的事情。
- 非常正确。在大多数情况下,你不需要成为数学专家。唯一一次我真正需要知道任何高等数学是当我做三维编程作为一个爱好。事实上,正是高中时的3D编程激发了我在三角和学前课程中的注意力。除此之外,你通常只需要非常基础的数学。
- 我想你被误传了。当然,要成为一个好的程序员,你不需要使用更高层次的数学,但要真正理解和应用某些计算机科学概念,你需要的不仅仅是八年级的数学。
- 我想说,对于一个好的程序员来说,熟悉二进制逻辑(这不是什么数学知识)以及CPU实际的工作方式(内存分配、设备通信、ALU以及与平台上所有寄存器的交互)远比全面理解高等数学重要得多。
- 我认为数学的重点是教授批判性思维技能和解决问题的能力,而不是像你每天在计算机编程中使用的那样。
- 理解高等数学所需的抽象与创建软件所需的抽象非常相似。
- @扎克,@oscar-我认为这就是它背后的想法,也是学者(包括我的教授)希望相信的。然而,高等数学的抽象实际上与创建实际软件所需的抽象非常不同。事实上,很少有人同时表现出色。
- 我认为函数编程概念更容易理解,如果你在数学上有一个更坚实的基础,仅仅因为你不会被语法吓到那么多。看起来很熟悉。我犯了一个错误,用简单的数学函数来演示C所不熟悉的函数编程概念。一些人立即宣称这太复杂了。
- 我也不得不在某种程度上不同意。在高等数学中,我不需要一个好的基础,但是很多模式和概念是基于数学技术的,并且创建更复杂的数学软件,在编写你的逻辑和算法时是很有用的。
- 在良好的编程中,你是对的。在计算机科学中,需要有一个牢固的数学基础来真正理解一些主题的深度。
- 我认为只是一些关联,而不是因果关系。如果你喜欢数学,你可能更喜欢编程的某些方面。
- 一旦我开始研究关系理论和数据管理,我发现我的许多迭代计算可以通过更好地理解数学概念和算法得到更好的处理。微积分II?也许不是。但是微积分和三角,绝对是。
- 在我的编程生涯中,我唯一遗憾的是没有做更多的数学。每天都有许多高级编程概念让我困惑。(也就是说,它主要与功能编程和类型系统有关)
- 他们在大学给我们这么多数学的唯一原因是为了确保不是所有的学生都能通过前两年的考试。测试一个学生的数学技能肯定比测试编程更简单。
- 我完全不同意这个答案。
- 我一直在使用基于mod函数的算法(通常是基于索引的条件函数),在八年级的时候我从来没有学过。
优化==用汇编语言重写。
当我第一次真正理解程序集(来自基本)时,似乎唯一能使代码运行更快的方法就是在程序集中重写它。花了好几年时间才意识到编译器可以很好地进行优化,特别是使用具有分支预测等功能的CPU时,它们可能比人类在合理时间内所做的工作做得更好。另外,花时间优化算法可能比花时间从高级语言转换为低级语言更能让您赢得胜利。同时,过早的优化也是万恶之源…
- 窥视和戳是你的朋友:)
- 败坏!告诉法官!
- 这就是复杂性理论的由来。装配通常是微观优化。使算法的时间复杂度更小是获得速度的关键。
- @斯卡迈尔:真想见你在这儿,我从来没想到会在这儿见到你;—)
- @马修-"偷看和戳是你的朋友:)":**非常嫉妒我没有先写。
- 他们确实关心,但你必须把艺术家的技能和工人的技能结合起来。每一个算法都不可能是一件艺术品。其中一些将是下垂,所以重用"少用"。记住旧的80/20规则。80%的程序使用20%的时间。所以把80%的注意力集中在20%的代码上,让它成为真正的艺术品!OP
- 越少的线越好!我不喜欢Java作为一种语言的一部分原因是,做任何事情占用了这么多代码。更少的代码行意味着更容易更改代码。
- 这取决于你要删除什么,以获得更少的线路。如果代码仍然可以用更少的行阅读,那么它是好的。但是,有很多方法可以减少代码行数,从而使代码变得更糟。
- 除了当人们采用"少一行更好"的心态时,使用链式方法调用7 deep,这样当其中一个抛出空指针时,您就不知道它是什么。或者,它们将如此多的操作浓缩成一行,长度为150个字符,执行4个操作。这使得读取和调试都变得更困难,但不会更快,并且在执行期间使用的内存也不会更少。
- 真正的杀手是PHB。当经理不读你的同事们的10万行,而把它与你的1千行进行比较时,他很可能认为你每天只工作1小时。
- 我认为我们需要区分"更少的行"和"更少的代码"。
- 如果你的行以))))结尾,而你不是在写Lisp,那么你的行太少了。
- 它不应该(!)像那样-但是你怎么期望一家公司的"X(随意添加任何类型的)经理"理解/关心代码的质量,如果唯一的事情(至少从我自己的经验)他们理解(遗憾的是):更多的美元,更多的美元,等等。
我会说,将日期的年份元素存储为2位数是一个困扰着整整一代开发人员的假设。在千年虫上爆炸的钱是相当可怕的。
- 这是唯一一个我会投反对票的答案,虽然这是一个连续波,所以没关系…
- 幸好我只是为了孩子们。-)
- iIRC有些系统在60年代,也许70年代只使用一个数字,因为它使用的内存更少。我甚至看到了预印"196"和"197"的纸质表格。
- 我仍然看到200英尺的表格,大概现在有一些打印了201英尺的表格。
- 可悲的是…Unix将在2038年进行第二轮测试
- @埃文:如果,也就是说,他们在2038年仍在使用32位机器。
- @比利只是因为机器架构的改变并不意味着数据格式会改变。以in t格式存储2位分辨率将形成字节(8bit)日期格式,但它影响了2K中大量32位硬件体系结构计算机。这只是为什么不让低级硬件人员指定数据格式的又一个例子。他们知道在遥远的将来会有一个计划中的恶果,于是一文不值。
- @埃文:说得好。
- 谢谢你的编辑。
- 在许多情况下,指定两位数年份是完全合理的,而在今天,两位数年份在许多情况下作为输入或报告格式是完全合理的。由于1753年之前的任何一个日期在没有上下文的情况下都是毫无意义的(1-1-1600是指1-1-2000年之前的14650天还是其他什么东西),因此声称能够容纳第一年之前的日期的计算机格式是愚蠢的。Unix风格的时代在2038年会有一些困难,但是到那时,迁移到带有新数据的"实时"系统的64位不应该是一个问题;历史数据将是明确的。
除了插入/气泡排序之外的任何东西都是非常简单的黑暗魔法。
- 哈哈,我喜欢这一个,因为它击中附近的一个家庭。sort快比在N平方的时间??不可能的!
- 令人吃惊的最简单的和明显的,一旦你有一个排序算法分为递归和强烈的感觉&;征服。直到那时,大多数人觉得黑色魔术。
- 我是一个研究员在排序算法。黑暗魔法和他们的安静感觉。
- NO的量,我grok递归排序网络,如双调。
- 我曾经在我的程序的代码行(这是一个漫长而复杂的,我不想打破它或解释它(这是一些复杂的照明方程式),所以我把它放在一个#定义所有的线和它的_黑暗魔法,和我是一只警告反对试图unravel黑暗魔法的奥秘
- 阿诺,我想这是一个预期。它是通过我们的世界-物业给你看的东西,它会crazier。原子数人,……你的名字。(作为一个边注,我意识到如果我在乎的是我的东西,搜索是为基地的存在a a proof of God)。
- bogosort是最神秘的人所有。
该XML将是一种真正的可互操作和人类可读的数据格式。
- XML不是万能的,但我不想回到我经常看到应用程序试图将关系数据压缩成单个csv文件的时代。
- 毫无疑问,这是一种互操作的语法。只是语法通常是任何解决方案中最不重要的方面。
- +1,你也可以在心愿单上添加小而快的内容。
- 是的,但这是对csv和固定长度的改进,如果没有文档,您将被拧紧。
- 我喜欢XML,因为它将XML标准化为数据格式,并且能够正确处理字符编码。然而,我讨厌有时使用XML所做的事情。
C++在某种程度上本质上优于所有其他语言。
这是我大学几年前从一个朋友那里收到的。我把它随身带了很长时间(我现在脸红了)。只有在用了2年左右的时间之后,我才能看到它们的裂缝。
没有人——也没有什么——是完美的,总是有改进的空间。
- 不是吗?喔…
- "更好"会给你带来很多不那么可恨的评论。但我想说,它是最快的执行,灵活,没有障碍的一个。这也是一个需要你的年轻人去正确地学习它,只会发现你可以做多少相同的应用程序。(虽然需要额外的吨位或两个发电煤)用爪哇或C。
- @JP:我很高兴我的选择。)
- 在业务应用程序的世界中,生产力更重要。当然,有一些需要C++的小生境,也是唯一的选择。
- @ Shaw:最近,对于一个PET项目,我选择了在管理C++中编写一个特定组件,纯粹是出于性能原因。只是我不再相信它"本质上优于"所有其他语言。
- 我一直认为C++比直的ANSI C更糟糕,只是因为我看到C++程序员遇到的麻烦比C程序员所遇到的麻烦要复杂得多。
- @诺斯雷德纳:这是一个假设吗?:)
- 实际上,比其他语言更好的语言是常见的Lisp。不过C++并不坏。
我相信创建程序就像课堂上教的一样……你和一群人坐下来,讨论一个问题,提出一个解决方案等等。相反,现实世界是"这是我的问题,我需要它解决,走",十分钟后你得到另一个,让你没有时间有效地计划你的解决方案。
- 我觉得这就是生活。
- 六羟甲基三聚氰胺六甲醚。。该是你拯救那家公司的时候了。…
- @jpinto3912:没有,因为下一家公司也将是生活的一部分(见前面的评论)。
- 嗯,这就是我们的工作方式:(
当主流设计模式被引入到一个CS类中时,我认为它们很棒。在那之前,我有8年的编程作为业余爱好,我对如何创建好的抽象没有很好的理解。
设计模式就像魔术一样,你可以做一些非常整洁的事情。后来,我发现了函数式编程(通过mozart/oz、ocaml、后来的scala、haskell和clojure),然后我明白了许多模式只是样板,或者说是额外的复杂性,因为语言表达能力不够。
当然,几乎总有一些模式,但在表达语言中,它们的层次更高。现在我在Java中做了一些专业编码,当我不得不使用一个约定,如访问者或命令模式,而不是模式匹配和高阶函数时,我真的感到痛苦。
- "许多模式只是样板文件,或者说是额外的复杂性,因为语言没有足够的表现力。"表现力只是硬连接到语言中的样板文件代码。
- 不是这样的,它是如何样板有一流的东西,而不是限制程序员的能力,如在高阶函数的情况下。Lisp就是一个很好的例子。
在我开始编程的前几年里,我没有注意到1千字节在技术上是1024字节,而不是1000字节。我总是有点困惑的事实,我的数据文件的大小似乎有点偏离我的预期。
- 硬盘制造商仍然没有注意到…
- @嗯,我认为你是指硬盘市场营销人员,对吧?或者驱动器是这样建造的?
- 好吧,他们将制造一个3000亿字节的硬盘,称之为300GB,而300GB(最重要的是)是300 x 2^30。(有7.3%的差异!)
- 有一个愚蠢的(很少使用的)1024的"正式"定义:"kibi-"。就像"64号准将有64千字节的记忆"。呃。在某些情况下,这是令人困惑的。某些特定的计算领域使用k=1000,如网络比特率(kbit/s),而其他领域则使用k=1000是出于营销原因(主要是HD)。内存和文件大小通常以k=1024/etc表示。
- 我可以用这句话来跟自己约会,但每次我看到或听到"kibibytes"这个词,我都会想起"fat albert"(我想是mushmouth)中的那个角色,他把b加在了他说的每一句话中。可能是再坏了。"
- 嘿,别再恨基比了。Mebi和Kibi至少不含糊。
- 千表示1000,兆表示1000000,千兆表示100000000。是RAM和OS制造商搞错了,而不是驱动器制造商。
- @马克·兰索姆:事实上,并不是RAM/OS制造商弄错了。在二进制文件中,1024是10位,全部设置为1,这是一个很好的整数[1000000000],因为所有数据都存储在二进制文件中,所以使用kb作为1024是有意义的。弱智的是每个人都使用不同的标准。他们都应该使用其中的一个或另一个,不管他们选择哪一个,不要把每个人都搞混了……
- 在有人试图使这些前缀适应二进制数字之前,它们就已经有了定义的含义。你不需要知道上下文来破译前缀的含义。我知道这是怎么发生的,但我认为这是一个错误,已经造成了太长时间的混乱。
- 哇,看来我是无意中挑起了这场纷争。=)
- 没人会这么做?真的吗?好吧,我会的…XKCD.COM/9004
- 也许我们应该回到二进制编码的十进制…数学函数会减少错误…当然,他们会更慢,使用更多的内存,但谁在乎呢:(第四次是魅力)
- 是埃里克·FTW!
- 等待。。。不是吗?
- iircIBM在60年代使用了2K48和4K96(大约是他们主机的内存大小),在非正式的谈话中,它只是"4K"。在开始的时候,只有很少的数字被使用,而且差别如此之小,以至于没有人关心,或者如果1K表示1000或1024,上下文中的"每个人"都知道。
- @贝那巴斯特:实际上1024(1kib)是2^10或二进制1000000000,这肯定不是10位都设置为1。马克是非常正确的,基洛和梅加的定义在工程界出现并被定义,早在计算机人把它们借来自己(不精确)使用之前。是时候让像我们这样的电脑极客放手了,承认是错的,开始用正确的符号来表示正确的事情了。
这种情况检查如下:
1
| if (condition1 && condition2 && condition3) |
以未指定的顺序执行…
- 在什么语言?语言如C / C + +,Java,和Python的担保,这是被左条件和正确评价站在第一状态,返回FALSE。它的langauge规格的一部分。我认为最让其他语言相同的担保。
- "是的,"这是从一个不被淘汰"。
- 是的,这是一个很酷的。它使wrint if(指定的东西!=零&;&;指定计数>=0)();} {做的东西很多容易
- 实际上,这一依赖于语言和&;想评估所有条件(需要的快捷方式)。我见过很多人使用与(&;),VB中(而不是andalso &;&;)
- 等等,这怎么#工作在C?if I do if(对象!=零&;&;object.property == true)我肯定是是在零的碰撞……
- 达米安:@ C #它不会尝试它,你的自我。这是在VB。NET中的预碰撞。
- 学到新的东西,你是在正确的顺序。
- 。。。。。。。…………………实际上它会崩溃,除非你使用VB.NET太重andalso卢卡斯的评论
- 在一阶语言没有指定。这是你的语言,他们都在炫耀他们的"短电路知识"的逻辑。
- 在VB。NET前,有点不那么短电路运营商&;&;不会编译。
- 哈哈,和精密的,二进制表示为,没有&;&;或急症室。
- 在C + +,他们可能是在unspecified订单的事。
- 在C + +,它是左到右。这允许你检查,如果对象是在第一leftmost点零。if(!对象=零&;&;object.getitem()==5)
- 我记得我读这是告诉我,我是CS类,我不能信托的执行命令的WHERE告诉我们写if(x=>!如果(= 0)x.getx()==5)<=所以它是我的工作。我完全忘了吗,直到现在:)
- 注意,在C / C + +,函数的参数是在命令行中unspecified。例如:printf("%d, %d
", i++, i);
如果我单独执行它,我的编程会更快更好。
- 但是除了你的代码之外,它不会变得像对编程那样难看。
- 这完全取决于另一个人。=)
"项目将在2周内完成"
和
"这需要2个小时才能实现"
- 现在我总是花时间x2或x3。如果我"按时"交货,那么我会因交货速度之快而受到表扬。
- 是的,然后你花3个小时和一只愚蠢的虫子战斗,他们认为你什么都没做。告诉我吧。
- @埃里克:是的,我做这个已经有一段时间了,而且效果很好。我甚至可以休假(我是个体经营者,不是旷工!).
- +1因为"两周内完成!"每次我认真地给出一个估计,也就是说,两个星期,我都得在心里狠狠地扇自己一巴掌。
我可以不加评论地理解我自己的代码!!!!
我想我需要它。
- 笑话解释:这条线与雅格尼相反(你不需要它)。本质上,我认为在完成我的程序之前,我需要一个类/模块/功能等。
- 我明白了。
- 我早就认为应该有一个相反的原则:bwiidni?
当我还是新手的时候,有一个假设是,在这个领域工作多年的人会自动成为更好的开发人员。
- 为什么?
- 我的客户想要一份关于失败测试的书面报告。只要说"我已经测试过了,而且效果很好",他们就会吓得魂飞魄散。
像python或ruby这样的动态类型语言在某种程度上不适合用于大型项目。
- 大约在2000年我也有过同样的觉醒。我在原来的wiki网站www.c2.com上读了一些东西,最后开始了这个页面:c2.com/cgi/wiki?统一的静态类型和单元测试,即将得出结论,我不合理地依附于静态类型。但是我已经开始使用一种环境(C),在这种环境中,静态类型确实在编辑期间使IDE活跃起来,我现在非常确信静态类型语言更好,因为它们更容易使用。没有哪种动态类型的语言不能被某些静态类型信息改进!:)
- 静态类型可以使IDE无限好,而动态类型可以使代码无限短。弯曲静态类型的语言打破边界需要黑色魔法,而动态类型的语言往往没有足够的或清晰定义的边界。选择你的毒药。
- 在静态类型语言中有很好的短代码是可能的;参见haskell和boo。
这很尴尬,但很长一段时间以来,我并没有真正理解引用类型和值类型之间的区别。我想你必须使用ref关键字来改变一个不同方法中的对象。
这是我应该知道的最基本的概念之一。
- 有多少开发人员不知道这两者之间的区别,你会感到惊讶。
- 当我打电话面试的时候,我总是会问应聘者一个关于这方面的问题,因为这很容易被误解。
- …大多数人都错过了。它们可以解释值类型的传递值和传递引用之间的区别,但很少有人将其用于引用类型。
- 如果我错了(不是100%确定)值类型=int/bool/decimal等,引用类型=classes,请更正我的错误?
- @你对错了。类基本上是引用类型,但是值类型(int、bool、decimal)也可以使用ref关键字通过引用传递。
这真的很尴尬,但当我开始学习如何编程时,没有什么能让我满意。我想写电子游戏。不是所有这些书都要我写的那些小程序。所以我决定我可以很容易地跳过10章而忽略基础知识。
所以我基本上忽略了变量!
问题是,我无法从约定中识别关键字:
1 2 3 4 5
| Car car = new Car(); //good
Car test = new Car(); //wrong must be lowercase car!
for (int i = 0; i < 10; i++) //good
for (int test = 0; test < 10; test++)//wrong must be i |
我这样做了一年多,甚至做了一个井字游戏,游戏3000行!当时我对自己的惊人感到兴奋,直到我在网上找到了150行的井字游戏。然后意识到我是个白痴,又重新开始了。
Unix和Linux操作系统设计得很好…我应该把这个限定为!!)
首先,这种观点被如下反真理重新灌输:
- 随后开发的每一个操作系统最终都对Unix进行了糟糕的重新设计(据说Lisp也是如此,在这里它更为真实)。
- 构成"Unix哲学"的规则列表。这并不是说它们是错误的,这意味着Unix本身密切关注它们。
也许更确切的说法是,它们设计得很好/做得很好,而且它们的某些部分确实是,但即使这只是一个相对的判断,相对于一些糟糕的Windows版本而言。以下是一些做得不好的例子:
- 配置混乱,临时平面文件配置不好
- C编程语言早就应该被(像D)所取代了。
- shell脚本是精神分裂症。它不适合开发,因为它是为快速打字而设计的速记。
- 目录结构的名称不正确
- GNU工具链是不必要的奥术
- 一般目的总是胜过特殊目的的信念
总的来说,他们需要不必要的专业知识来操作。或者更确切地说,很多知识中只有适度的理解。
这并不都是坏事。Linux在政治上更好,并且没有被业务需求破坏,但遗憾的是,在很大程度上,许多技术高地已经丧失了。
- 它的设计比窗户好…
- 我仍然认为平面文件配置更好,但即席配置是一个灾难。在我看来,macos x plist机制是一个很好的折衷方案
- 我认为一般的观点是:Linux和Windows有点相似,它携带了很多东西。但是您的具体观点并不能让我信服,配置对大多数事情都很好(取决于配置文件是如何实现的),shell脚本现在已经用python做了很多,目录结构已经过时了,…真的有点虚弱
- 可能有一些"更好"的负面观点——我有一段时间没有经常使用它了,但是你认为你在这方面有没有低标准?conf可以工作,但不太好——但实际上应该有一个标准(带有类型信息),它可以使上下文相关的帮助和体面的GUI工具(例如,可以处理conf文件的所有版本)成为可能。我知道你的POV对此缺乏远见。
- 它不仅仅是shell脚本。与人机界面(交互shell)和工程界面(程序)完全没有分离。Shell已经扭曲了程序的API,破坏了Unix的目标之一(一切都是小程序)。输出为人类可读文本,输入为键入单字符开关时保存。以rm(一个玩具例子)为例,这对于专家来说是可以的,命令行rm-f在脚本中应该是这样的,remove force=true,人类层应该是一个单独的层。
- 我不会对dir命名大喊大叫,但我认为完全主观的想法是错误的。
- 我们中的一些人认为Unix很难重新设计Multics。Unix被有意设计成避免成为multics的一切,然后其余的部分被黑客入侵,而不是被设计成。
- 我认为*nix总体上更安全,一些品牌(在我的例子中是linux mint)更稳定。把诺顿扔到窗户上,我的尼克斯在表演的任何一天都会烧窗户。设计得更好?不一定。总体上更好?是的。旁注:我很少接触过Mint中的配置文件。几乎所有的事情都可以用图形用户界面来完成。
- Linux没有被业务需求破坏?太多优秀的想法被低等的想法所拒绝了。Linux现在主要与政治有关:我的前同事为了让他的补丁被Linux内核接受(对TCP协议的一个小小的改进)。他可以讲述许多"有趣"的故事,关于人们试图以非常可疑的、有时是不正确的技术理由和假设来阻止/破坏补丁接受。
编程很简单。
- 更具体地说,编程怎么样?
- 编程很容易。编程好或编程正确,这些都不是那么容易。
- 真的?我从没注意到…我只是觉得,适应良好编程的思想是罕见的……
好吧,我很早就学会了编程。我14岁左右。我有各种疯狂的信仰,但不要问我确切的时间安排,因为那是很久以前的事了。
好的,我相信,如果你使用Java中的术语同步,那么Java为你解决了这个nas-同步的事情。
我相信至少半年,更可能的是,静态输入可以提高性能。
我相信释放一些东西会将内存返回到操作系统。
我相信malloc调用可以归结为检查操作系统上是否有足够的可用空间,所以malloc是便宜的。
我认为Java是用其他语言的所有优点和缺点建立起来的,成为一种"完美的混合",它将采用其他语言的最佳属性并拒绝错误。
我大大高估了LinkedList优于ArrayList的案例数量。
我认为NP硬度是一个证明,在一段时间内,没有一个实例能有效地解决,这是非常错误的。
我以为在旅行社网站上找到最好的飞行计划要花很长时间,因为"旅行推销员问题",我骄傲地轻声笑着对我的亲戚们说(我小的时候,好吗?!)
可能会想出更多。不知道我贴了多久。对不起的。
PS:啊,好吧,这一个清理得不那么慢,但我看到新手不时这样做,所以我认为你可能感兴趣:我还认为,要存储不确定数量的东西,你需要为每个都声明一个新的变量。所以我会创建变量a1,a2,a3,…,而不是使用一个变量a,我会把它声明为一个向量。
- 不,不-你应该创建A1,A2,A3等等,但它们都应该是向量。
- 那个旅行推销员使我高兴极了。D
- 等等,半年后,静态类型的程序运行速度会变慢?当你释放记忆时,它会变长?操作系统上的可用空间?……?!
当我从大学毕业后第一次开始工作时,我希望更多的高级开发人员会知道他们在做什么。我错了吗?
- 为什么我不能投你两次反对票?
- +1,但是,相反地,我比高级开发人员更好地理解这个问题,并能提出更好的解决方案。
那是一个9-5的工作
我曾经认为,应用程序的大部分工作实际上是编程。我相信在某些情况下这是真的,但在我的经验中,我花更多的时间研究、记录、讨论和分析,而不是实际的编码。(我在操作激光传感器的软件上工作,确定如何最好地控制硬件比编写代码更具挑战性。)
我也曾认为,开放的环境,程序员可以越过他们的肩膀,问他们(通常)旁边的人一个问题,是最好的环境,一个程序员团队制定出一个解决方案。事实证明,一个黑暗的孤独的房间更有效率,团队或没有团队。
当我毕业时,我假设专业编程就像大学里的编程,这意味着我将得到输入和预期输出,并被要求填写完成转换的黑匣子。实际上,我必须计算出输入、输出和黑盒。
我以前不认为营销和销售人员是人类的祸害,太天真了。
- 有人投了票,我就投了这个票。
- 我个人最喜欢的是这种对话:ba:"系统需要这些输出。||我:好的,我们需要这些输入。|| BA:但是数据输入要花费数百万!||我:是的,您希望系统从哪里获得这些数据?|| BA:你不能弥补吗?"
- 你的最后一点是错过了一个律师和一个算账的人来应对整个人类部分的灾难。
代码审查是浪费时间。
我已经从一家完全可以选择的公司转移到一家强制(甚至是审计)的公司,我开始理解他们的有用性。在代码上有第二组眼睛,即使是最琐碎的部分,也能:
a)当你把一些琐碎的事情搞砸的时候,省去你的尴尬(例如,一个琐碎的代码审查就可以阻止我们在我以前的工作中向我们的客户发送数百封电子邮件)。
b)可以教你一些你一开始不知道的东西(我在目前的工作中学习过新的图书馆——不可避免的是,在一家大公司里,有人已经偶然发现了你遇到的问题,并且做了更好的工作来解决它——这只是知道该往哪里看的问题)
c)至少要确保你以外的人知道事情是如何运作的。
最后,我在这里提交的代码比我以前的工作中提交的代码更快乐,尽管那时我认为我什么都知道。)
- 我对代码评审的第一个介绍是在一个实际上不相信代码评审的组织中进行的,但我想说他们确实相信代码评审。当我第一次体验RAAL诚实的代码审查时,有点震惊。
在投入使用之前,没有缺陷是可能的。
这绝对不是真的,即使是p2缺陷有时也会被打开。
- 假设您的优先级别的内部名称是我的优先级别的内部名称,该怎么办?在这里,你们所说的TPS报告称为SRP报告!;)
与UNIX相比,NT操作系统的设计存在缺陷。结果表明,NT内核和设计决策与任何现代类Unix系统都非常相似,您在内核中遇到的大多数问题都是由Buggy公司编写的第三方Buggy驱动程序造成的。
- 我抗议。有一件基本的事情就是拒绝Windows对Unix的任何操作。内存管理。Windows检测到有人试图闯入。Unix检测到有人试图中断…因此,Windows程序可以也确实使用未分配的内存。哎呀!
- @科莱特克-你有什么参考资料来解释你的意思吗?
- 无论如何,这是错误的。相关的Windows机制是页表。他建议Windows virtuaalloc()具备所有功能,您只需要virtualProtect就可以请求权限。对virtuaalloc()的整个需求几乎证明了他是错的。
- Windows出于"安全原因"阻止原始数据包。如果安全是阻止某件事的借口,他们不应该阻止整个互联网吗?努夫说…
如果每行都对条件进行了评估,并且编写了这样的代码:
1 2 3 4 5 6 7 8
| Dim a as Boolean = True
If a Then
Console.WriteLine("1")
a = False
Console.WriteLine("2")
Else
Console.WriteLine("3")
End If |
那么输出将是:
- 这是我从未听说过的一个误解。
- 我的一些朋友曾经玩过这个机器人编程游戏,事实上这是你用半认可的语言编写的"机器人程序"。
- 这太棒了。这是我唯一赞成的答案,除了我反对的另一个答案。当您遍历数组并尝试从数组中删除元素时,会发生类似的情况…
- 天哪,那不是个表演的拦路虎吗?
- 当你第一次使用调试器时,你会发现这不是真的吗?
- 这大致是关于ARM的条件指令如何工作的。它们都有一个"if (a) then ..."模式(或NOT a模式),其中a是CPU标志之一。因为条件跳转不是很快,所以在一行中有多个条件指令具有相同的条件是有意义的。但是,如果在中途更改了该条件标志,后续说明将使用新的标志值。
- 我想知道,在某些情况下,这种逻辑真的有用吗?
字节和字符实际上是一样的-"ASCII"只是一种将字节值映射到屏幕上的字形的方法。
读到Unicode真的让我大开眼界(尽管我还不完全理解)。
- 好文章:joelonsoftware.com/articles/unicode.html
- 事实上,在您找到单个字体文件中的转码表之前,事情不会变得复杂。
- 这种常见的误解慢慢被"Unicode字符是2字节"的误解所取代。整个标准是为扩展定义的,字符的长度总是可变的——尤其是当Unicode规范化进入图片时。
我是个好程序员!
NET结构(C和VB.NET)和类一样,都是引用类型。
我在.NET 1.0出现之前或之后不久的某个时候"收到"了这句智慧(我不知道从哪里来的,它可能从我的头脑中突然出现了,就像宙斯额头上的雅典娜一样),并且一直保留着它,直到大约4个月前乔恩·斯基特(Jon Skeet)对这一概念的理解失效。
谢谢乔恩。
P.S.与编程无关,但我也相信(直到大约5分钟前)"阿波罗从宙斯的眉毛上跳了出来"。
- 雅典娜来自宙斯的额头。阿波罗出生的方式很老套
- 这表明我没有上过大学,我从来没有好好学习过名著。…哦,真丢脸。…
- 如果你使用vb.net,你每天都在学习经典。
- 对第一句评论和最后一句话投反对票。
- 在C++中,结构和类是一样的,所以大多数来到C语言的人假设这里是相同的。
总有一天我会有一个现实的想法,那就是构建一些非平凡的代码/系统/任何东西需要多长时间。
- 还有一种:C不是字节码解释语言。在IL中有一个"字节码"模拟,但是在程序开始运行之前,C IL被预先编译成完全本地的代码。
- 这只是我意思的一部分。我认为JIT远不如直接编译的代码,这是错误的。
我曾经假设它足以编程Win32应用程序。
而且,每个程序都必须有一个GUI,因为命令行"过时了"。
我能读懂它并完成任何工作。
我认为提高数据库性能所需要做的就是将数据库置于第三种正常形式。
对象方向始终是设计源代码的最佳方式,并且永远是。
这就是:
1
| SomeClass object(initialValue); |
而这:
1
| SomeClass object = initialValue; |
保证在C++中是等价的。我以为第二种形式一定会被解释成第一种形式。不是这样:参见C++初始化语法。
有些事情我仍然有困难,是以下的误解-我仍然尝试和坚持他们,即使我知道得更好:
- 所有利益相关者都将客观地做出软件设计决策。那些没有参与编写代码的人做出各种决策完全基于对我们开发人员来说并不总是有意义的情感。
- 项目预算总是有意义的——我见过很多公司很乐意(例如)多年来每月减少50000美元,而不是支付250000美元在6个月内完成一个项目。政府一个人如果不花掉他们的年度预算,他们就会损失掉——所以他们会花掉的,不管是地狱还是高水位。有多少项目资金浪费在这样的事情上让我吃惊。
- 你应该总是为正确的工作使用正确的工具-有时这个决定不在你的手中。有时,从高处下来,"你应该使用X技术"这个项目,让你想到"wtf!谁想出了那个可笑的主意?"…付你薪水的那个人,就是那个人,现在把事情办好。
- 编程思想首先出现,其他一切都是次要的。事实上,为了拿到你的工资支票,最后期限和业务目标都需要得到满足。有时你做最坏的决定是因为你没有时间做正确的决定…就像有时这个词会出现在你的舌尖上,但回忆起来的每一分钟都会让你选择一个不同的、不那么理想的词。不总是有时间去做正确的事情,有时候只有时间去做,不管怎样。因此,所谓有经验的开发人员经常使用反模式,他们必须在软件明天交付给最佳客户的演示截止日期前10分钟找出解决问题的方法。
当我在TI-83上编程时,我以为你不能给它自己分配一个变量。所以(忽略这是C代码,而不是TI-BASIC)而不是编写
我会写
当我了解到+=和++的时候,我的脑子里都乱了。
- 然后你知道有些语言没有这些,时钟就会被调回来。
- 我至少理解,如果我写"C++",它相当于"c= c++ 1",所以它没有被设置得很远。
- 我在Firsst(6-7年级的第一个程序)的VisualBasic上长大,所以我是用迭代器长大的。
- 我梦想着用这种大脑损伤来构建一个基本的解释程序。
IDES会更快。
- 与2010年相比,这一趋势仍在继续:(
- 至少你能得到一些东西。最近的IDE比前一段时间做得更好。
我应该总是优化我的代码。这并不是说我在写之前不应该仔细考虑它,而是我应该认真考虑如何从每个语句中挤出每一点性能,甚至牺牲可读性。
我的错误假设是:虽然总有改进的空间,但在我的情况下,我是一个非常好的程序员。
当我刚从大学毕业的时候,我已经用了6年的时间编写了C语言,对"结构化编程"了如指掌,认为"oo"只是一种时尚,认为"伙计,我很好!"
10年后,我在想:"好吧,那时候我还没有像我想象的那样好……现在我了解了多态性的概念以及如何编写干净的OO程序…现在我真的很好了"。
所以不知何故,我一直都很好,但也总是比以前好得多。
在那之后不久,硬币就掉了,我终于有了"一些"的谦逊。总是有更多的东西需要学习(还没有用像haskell这样的纯功能语言编写一个合适的程序)。
- 我赞成这项动议。没有人比他们想象的好一半,但这似乎并不能阻止聪明人学习。愚蠢的人在那里坚持着充分性的幻想,尽管所有的证据都相反;拒绝学习或被教导。
我想我10岁的时候,有人说服我有一台计算机能够在3秒内运行一个无限循环。
- stackoverflow.com/questions/888224/&hellip;
- 嗯,你提到了这个问题,这个回答者的回答几乎完美无瑕。你忘了加点别的吗?
- 同时,大多数表达式(包括if语句中的表达式)的计算通常是特定于编译器的。JamesNorris的if表达式包含三个运算符。三个中的两个没有强加任何命令。
- 是的,我没有注意到前一点,谢谢!如果您在ansi c规范中查找条件运算符:std.dkuug.dk/jtc1/sc22/wg14/www/docs/n843.pdf 6.5.13逻辑和运算符…与按位二进制运算符不同,&;运算符保证从左到右的计算;第一个操作数的计算后有一个序列点。如果第一个操作数比较等于0,则不计算第二个操作数。此外,我发现很难相信,在C规范不遵循这个规则的情况下,构建了类似C++语言的Java语言。
- 我不知道有什么语言不使用短路和/或逻辑。好吧,好吧,vb。但我似乎每天都依赖于短路和/或逻辑。如果我不知道这个基本原则,很难想象我的代码会是什么样子。
XML名称空间(或者更糟的是,格式良好)在某种程度上比试图不使用它们更困难。
一个非常常见的错误,即使在W3C!
- 不是他们更糟。他们采用了一种已经非常难看/冗长的语言,使其变得更加难看/冗长。
我确信,至少6年来,每个问题都有1个解决方案。
完全不了解具有不同复杂性的多个算法、空间/时间权衡、OOP与功能性与命令性、抽象层次和不可判定问题。当幸福的幼稚被打破时,它打开了一个充满可能性的世界,砰地关上了门,仅仅是坐下来建造一些东西。我花了很长时间才弄明白如何挑选一个,然后带着它跑。
在C++中,在很长一段时间里,我在编译一个纯虚方法的定义时拒绝编译器。
当我意识到自己错了的时候,我很惊讶。
很多时候,当我告诉别人为抽象类提供其纯虚拟析构函数的默认实现时,他/她都会用大眼睛看着我。从这里我知道接下来会有一个很长的讨论…这似乎是一个普遍的信念有点在C++初学者中传播(我也认为我自己)。我现在还在学习!)
维基百科链接到C++的纯虚方法
- 废话!我要测试我所有朋友的C++经验,看看他们当中有没有人知道这一点,因为我肯定没有。
- 大多数情况下,这是没有意义的——如果您无论如何都被迫重写一个方法,为什么要在实现上浪费时间?析构函数是一种特殊情况,因为它们总是被调用,即使它们被重写。
- HE::)我花了太多时间调试由于忘记向基类添加虚拟析构函数而导致的问题。
- 标记:它允许您提供"默认"实现,同时仍然要求派生类的作者考虑是否应该使用默认实现。真的很少有用。但这就是你想要的风格。
- 我的同事因为他们很差劲而产生了被认为是坏代码。我花了一段时间才知道我应该先看看到底发生了什么。大多数时候,糟糕的代码是由于缺乏管理、客户不想检查他们真正想要的东西并开始改变他们的想法,就像没有明天一样,或是其他任何人都无法控制的循环,比如经济崩溃。
- 客户要求"昨天"的功能,因为他们很愚蠢:不是真的。是关于沟通。如果有人告诉他们一切都能在一周内完成,你猜怎么着?他们一周后就要了。
- "永远不要更改有效的代码"。在我看来,这不是件好事。你显然不需要改变真正有效的东西。然而,如果你从来没有改变过一段代码,因为它被认为是有效的,而且它太复杂而无法改变,那么你可能最终会发现代码并不是真的在做它应该做的事情。我看到一个销售佣金计算软件做了两年的错误计算,因为没人想维护这个软件。没人知道这件事。这个公式太复杂了,他们不知道怎么核对数字。
- 呵呵,说说看。这些天我讨厌OOP
- 鲁比会是一个没有OOP的地狱。
G'Day.
我只是在设计和编写代码。
无需收集、记录或支持需求。
干杯,
作为一个老的程序程序员,当我第一次在Java中为一个爱好项目开始编程时,我并没有真正理解OO。编写了大量代码而不真正理解接口的要点,试图通过强制所有东西进入继承层次来最大化代码重用,希望当事物不适合于一个层次结构时,Java具有多重继承性。我的代码运行正常,但我现在对那些早期的东西退缩了。
当我开始阅读动态语言,并试图找到一个好的学习方法时,阅读关于Python重要的空白区的内容让我感到厌烦——我确信我会讨厌这一点。但当我最终学会了Python时,它成了我真正喜欢的东西。我们通常用任何语言努力保持一致的缩进级别,但没有得到任何回报(除了视觉可读性)。在python中,我发现在缩进级别方面,我没有像以前那样做更多的工作,而python处理了我在其他语言中必须使用大括号之类的东西。它现在让我觉得Python更干净了。
我曾经认为InternetExplorer6盒子模型是微软想出的一个邪恶的愚蠢想法,只是为了打破与其他浏览器的兼容性。
很多CSsing让我相信它更符合逻辑,并且可以使页面设计维护(更改块填充/边框/页边距)更加容易。
想想物理世界:改变A4页面的填充或边框宽度不会改变页面宽度,只会减少内容的空间。
- 托瓦尔兹有一个关于Linux的类似引述-只有他的数字是"5秒以下"
C++是最酷的语言!
- 当然是。你不知道吗?
- 是的,我以前也这么认为,我甚至曾经为它争论过。
- C++有什么问题?我的意思是,我知道它有问题,但它很酷。我会为之辩护。
- 这绝对不是最酷的
- 不是最酷的?你可以用一种有效的方式进行OOP和元编程!
- 很酷…可悲的是,现在它又老又不穿衣服了:(。当然,对于高效的代码仍然是最好的,但不是那么酷。元编程?你是说阻止编译器的模板黑魔法?Python是新来的酷小子…当然,这是个有点慢的孩子…但很酷。不管怎样,C++正在经历一些手术,作为新的C++ 0x…哎呀,C++ 1X小子。然后又会很酷,就像一个60岁的男人穿得像一个15岁的少年!
- - 1。C++中的模板元编程是最酷的东西。
我是一个年轻的开发人员,希望能专业地完成这项工作,因为这是我喜欢的,这是一份我曾经认为通过我短暂的经历所学到的观点的清单,是错误的。
当你根本不把用户界面和逻辑分开时,你最终会遇到的可怕的混乱是可以接受的,也是每个人编写软件的方式。
没有太复杂或抽象的东西
一级责任感-我从来没有真正有过这个概念,这对我来说非常强大。
测试是我在卧室里编码时不需要做的事情。
我不需要源代码管理,因为它对我做的项目来说是多余的。
开发人员做每件事,我们应该知道如何设计图标和制作好看的布局。
处置并不总是需要决赛选手
每当发生任何类型的错误时都应引发异常
异常是针对错误情况的,并且很多时候只返回一个指示失败的值是可以的。我最近才明白这一点,我一直在说这句话,而且还在抛出异常的时间更长。
我可以编写一个完全没有错误的应用程序
不要使用高级实现特定的功能,因为您可能希望"某个时间"切换实现。我一次又一次地这样做,几乎总是没有发生过这种转变。
我最近才发现,在一个你好的世界里,有超过一百万条指令被执行!我写的C++程序。我从来没有想到会有这么简单的一句话
- 真的。。。你在哪里找到的?
- 哇,哎呀!你在哪里发现的?有链接吗?
- 我正在为一个项目做一些研究,并使用pin(pintool.org)。我输入了一个hello world程序,用他们预先制作的指令计数工具进行测试,结果让我惊讶不已。
- 隐马尔可夫模型。。。我刚刚编译了一个基本的Hello World程序C++,它是5974行汇编。
- 试试看跌期权。少于20条指令。至少在动态链接的情况下。:)
以前从未见过整数提升…并认为"z"在代码中可以容纳255个字符:
1 2 3
| unsigned char x = 1;
unsigned char y = 2;
unsigned char z = abs(x - y); |
Z的正确值为1
- 真的。那是邪恶的
- 根据实现的不同,z可以是65535。或各种其他值。
- 不,不行。所描述的行为符合标准。你知道一个像你描述的那样工作的编译器吗?
- 该标准允许一致的实现将无符号字符(以及纯字符和有符号字符)定义为16位,并将int(和无符号整数)定义为16位。如果我知道一个编译器将char定义为16位,那就不重要了。如果我使用的编译器将int定义为16位,这无关紧要。标准允许。
- sizeof(char)在本例中并不重要,因为由于提升,作为参数传递给abs的给定表达式变为(int)x-(int)y,abs(-1)始终为1。
- 当然,sizeof(char)并不重要。sizeof(char)始终为1。同时,该标准允许一致的实现将无符号char定义为16位,无符号int定义为16位。在这个实现中,完全合法地,x是1,y是2,因为减法x提升到值为1的无符号int,y提升到值为2的无符号int,减法的结果是65535,abs(65535)是65535。在该实现中,标准要求无符号字符升级为无符号整数,因为普通(有符号)in t不能保存无符号字符可以保存的所有值。
- 我刚刚发现Andrey不知道char-bit是实现定义的。16是允许的。
- 我明白你的意思,但为什么在什么情况下,unsigned char会被提升为unsigned int呢?只有当int不能保存无符号char的值时,才会发生这种情况。如果是这种情况,则abs((int)65535)将返回1,因为65535将表示int的-1。如果不是这种情况(int可以保存无符号char值),则提升将为int,而不是unsigned int。z仍然为1。
- "只有在int不能保存无符号char的值的情况下才可能发生这种情况"-bingo,正如我在上面写的那样。16位中的16位。谢谢你最后的理解。……"Z仍然是1"——哦,再看看你之前写的东西。
- 好吧,我明白安德烈几乎说了什么。我们需要知道使用的是哪种编程语言。如果是c,那么abs就不会过载,参数将从unsigned int降级为int。
- 好的,如果C++?在C++中不会发生同样的事情吗?abs有int和long的重载(对于无符号类型使用abs重载是没有意义的)
- 在我的例子中,16位char和16位int,当C++选择一个从未签名int中进行内置升级的重载时,内置的升迁将不长。int It会丢失一些未签名int值,但PrimeLoad不能。(再次记住,在我的例子中,这是16位char和16位int的例子。在另一个例子中,char_位是64,int和long都是64位,long也会丢失一些无符号int的值。)
OO并不一定比非OO好。
我认为OO总是更好的。然后我发现了其他技术,比如函数式编程,并认识到OO并不总是更好的。
- 你假设"OO不一定比非OO好",结果证明你的假设是错误的,即OO必然比非OO好?或者你假设OO必然比非OO更好,然后你知道它不一定更好?
- 对不起,那是模棱两可的。我认为OO总是更好的。然后我发现了其他技术,比如函数式编程,并认识到OO并不总是更好的。
- 谢谢你的澄清-这是我的想象,但我想让你有准确的想法!
评论越多越好。我一直在努力使我的代码尽可能的可读——主要是因为我几乎可以肯定,我会修复我让它溜走的bug。所以在过去的几年里,我常常有一段又一段的评论。
最终,我明白了,有一点,更多的评论——不管结构多么整齐——毫无价值,实际上变成了维护的麻烦。这些天,我采用目录+脚注的方法,每个人都为此感到高兴。
- 这些课程不错,但是……这些假设中哪一个是错误的?
- 最近,我学到了:Git很神奇,我也这么想。我也在学习测试(除了手动测试…耗时)。可能缺少一件事——使用调试程序进行调试,而不是在不同的执行时间打印出来。(如果可能的话)。编码时不要出错,永远不要试图编写依赖外部源的可靠程序。我对一个超级简单的CMS唯一的问题是我依赖于雅虎和开放式主机禁用,雅虎改变了端点…
- 如果您谈论的是.NET,Dispose并不总是需要一个终结器——这不是一个误解。事实上,由于在.NET 2.0中添加了safehandle,因此终结器应该非常罕见。
我们作为软件工程师可以理解用户真正想要什么。
- 如果你有一个很好的估计,那是因为你已经达到了这样一个高度,这样的项目对你来说是微不足道的:—)
唯一的本地化/国际化问题是翻译消息。
我曾经认为,除了单词和语法之外,所有其他语言(而且我没有语言环境的概念)在所有方面都像英语。因此,要本地化/国际化一个软件,您只需要让一个转换器翻译显示给用户的字符串。然后我开始意识到:
- 有些语言是从右向左写的。
- 一些脚本使用上下文格式。
- 日期、时间、数字等格式的变化很大。
- 程序图标和图形对某些人来说可能毫无意义或具有攻击性。
- 有些语言有不止一种"复数形式"。
- …
甚至在今天,我有时读到一些令我吃惊的国际化问题。
那是有害的。
现在我们要么继续要么中断。
- 因为我们已经停止使用它们了,所以这不再是真的了!
- 一切都取决于它们的使用方式。编译器不使用其他任何东西。
- 这就像是说用机器代码编写程序很好,因为所有的计算机都使用机器代码。Goto是有害的,因为它们鼓励程序员创建难以读取和调试的代码。
- @扎克,所以goto不是有害的-程序员是有害的。
- @U62 goto并不有害,使用goto的程序员是有害的。
我的学校教育能使我为从事这一领域的工作做好准备。
- 谢天谢地,这一切都是我在大学里学到的!否则我的生活会受到冲击的;—)
- 啊…我拿到文凭的第一个原因是,然后直接在执法部门签字。(具有讽刺意味的是,我现在是一个分配给IT项目的警察,负责需求收集、文档和用户供应商联络。)
"这次会成功的"
- LOL,就像管道胶带打字。
- 等等,这不是鸭子胶带?我也可以在鹅身上自由使用?
- 有点让我想知道为什么不是管道打字-似乎很合适!
- @埃文·普拉斯·埃多克斯(Evan Plaice EDOCX1)(0)
像JAVA和.NET这样的虚拟机架构,除了性能问题外,基本上是没有价值的,除了玩具项目。
(好吧,公平地说,也许在某一点上是真的。)
- 这个神话一直延续到今天。计数器参数:CPLU.A.O.COM/OD/编程挑战/A/CaseNe:12HTM Java 0.02688359274秒;C 0.166秒SEC;C++ 429.46秒;Fuun.Sun.COM/thRead .jSPA?MexAdID=10435068×10435068,第一和第二都是VM,所以不要说C++是固有的更快或更慢。一个坏工匠埋怨他的工具。最好的小提琴,在我们知道如何精确测量任何东西来复制它们之前制造的。旁白:鲍勃威尔逊量子物理学:videosift.com/video/&hellip;
- 只是吹毛求疵,但.NET不是虚拟机。它是一个实时编译器,这样每次部署IL都会编译成本机代码。
- 确实,它使用JIT,但是使用.NET"感觉"与Java风格的VM设计相同(当然Java也有JIT)。
这是理解语言的字节码(C或F #样#)是比那些将复位按钮,直接编译到机器代码的猪。
好的,当我开始相信有个(80),这是真的。然而,甚至在我有时想C #时报"如果穿成一个内部回路。CPP文件会让我更快的CRP应用程序")。
的NO。
是的,我只是意识到,几年前。
我想我对编程中的某种语言/主题了如指掌。只是不可能。
我以前认为我是个很好的程序员。担任该职位2年。
当你在真空中工作时,很容易填满房间-d
现在流行的$标志作为Java/JavaScript标识符的一部分是非法的。
- 看看Perl和PHP,你真希望它是非法的;)
- @弗兰克,我希望Perl和PHP是非法的。按法律规定。
订阅许多RSS源、阅读许多博客和参与开源项目是很重要的。
我意识到,真正重要的是我花了更多的时间进行编码。我有阅读和跟踪许多博客的习惯,虽然它们是丰富的信息来源,但要吸收所有的东西是不可能的。平衡阅读,更加注重实践是非常重要的。
规则。开源,恐怕我不会受欢迎。我尝试过参与开源,其中大部分都在.NET中。看到许多开源项目甚至没有遵循正确的体系结构,我感到很震惊。我在.NET中看到一个系统没有使用分层体系结构,数据库连接代码到处都是,包括代码,我放弃了。
- 它可能有一个逻辑基础,但它仍然违反CSS规范,因此是一个bug。
- 编程语言==编译器/解释器
- 编程语言==ide
- 编程语言==标准库
经理们知道他们在谈论什么。
学习语言只是学习语法,也是标准库中最常见的部分。
假设我将使程序100%完成并且没有错误,并将其报告为"已完成"。有时,当有许多漏洞需要首先获得市场份额时,公司希望发布这个程序。
在早期,大多数个人电脑都有一个盒式磁带接口来装载和存储程序。我现在没有电脑,但我可以阅读所有我能接触到的与电脑有关的东西(主要是杂志)(这是70年代后期,我没有互联网)。出于某种原因,我觉得程序是直接从盒式磁带上执行的,计算机有任何RAM的唯一原因是在程序运行时存储变量。我认为当代码必须执行跳转指令时,它会以某种方式将磁带倒带或前进到正确的位置,然后从那里继续。
- 直到今天,我仍然无法向母亲充分解释易失性存储器(RAM)和非易失性存储器(硬盘等)之间的区别。
- 一定要喜欢它…令人惊奇的是事情发生了怎样的变化…那是磁带上的字节码吗?那里没有高级语言。
当我完成了CS学校的学习后,我就可以开始一份工作,并将我在学校学到的知识用于实际应用。(我真希望我不要浪费4年的时间来学习操作系统和Prolog)
- 可悲的是(至少对我来说)操作系统、Prolog和类似的主题(特别是人工智能和3D图形)都很有趣。如果我知道"现实世界"更平凡的话,我可能会选择不同的职业。
- 同意。在研究了一些硬核C/C++开发后,我们中的大多数人似乎陷入了Web应用程序和相当简单的数据库工作中。
- 另一方面,情况正好相反:"我可以在不了解操作系统和prolog等基础知识的情况下构建现实世界中的应用程序"(好吧)——我发现这在我遇到的不好的程序员中很常见……
ASCII以不同的方式存储到二进制
- 什么?这是…ASCII是一种字符代码,二进制是一种写数字的方式…
- 我的意思是,我认为图像和文本文件在磁盘上的存储方式不同。图像是二进制的,文本是另一回事。
- 这里面有一点道理。一些文件系统,特别是网络文件系统,根据它们认为文件是文本还是非文本,处理换行符对应的字节是不同的。特别是,有些人在这个问题发生时很难解决。很少有新技术能做到这一点,因为这是一个可怕的想法。
- 例如,vms就是这样做的,所以技术上并不是完全错误的。以及为什么C支持这两种文件模式。
- 实际上,当我开始编程C时,我认为不同的模式是因为DOS被延迟了。嗯,10岁的时候,你有各种疯狂的想法;)
在查询性能方面,SQL WHERE子句中整数的位比较实际上是免费的。
事实上,前50万行左右的情况是这样的。在那之后,它被证明是非常不自由的。
- 不免费==贵吗?这是关于联合国的隐藏政治声明吗?真棒。
- 拜托,这适用于哪个RDBMS?我从来没有在access、sequal、ingres、postgres、informix或mysql中遇到过问题…尽管我只是(有意地)在Ingres和Informix中处理了数百万个行表。
- 在我的例子中是SQL Server,但我认为它可以应用于任何RDBMS。问题是位操作不可解析,并且不能有效地使用索引。不过,即使扫描了一张桌子,手术速度也很快,直到手术变得非常大,我才注意到。
- 数据库在前50万转得很快,然后又变慢了?
- 只是说性能配置类似于O(N)
这是一个程序开发人员/程序员unfamiliar SQL和关系数据库不需要任何正式训练或理解如何与和或使用一个快速的SQL和SQL读什么样傻瓜足够是足以在与工作的关系数据库SQL Server,Oracle和样条。
远太多的错误处理在一个应用程序的所有数据存储在关系数据库Oracle和SQL Server样是由涂料造成的理解和如何使用关系数据库SQL langauge大学;.
我过去工作的一个软件供应商,谁的心理都是开发者需要SQL傻瓜书或东西similiar和他们将配备到任何关系数据库句柄的问题。现在的客户和供应商有计量在这本学习SQL的知识缺乏是一个字节来围绕在负反馈的方式。它不只是坏的表演查找和插入或更新和问题,但实际是A本身的数据库设计这是一个真正的障碍。
所有的,它已经avoided和进入成本,如果她现在正经受铅处理的发展与关系数据库SQL会在同样的水平,尊重他们,他们是一个langauge与内置的应用程序。
不要因为它的解散sql为不重要。你最终要回到。你也许可以离开它一会儿,但你不想最终击中年破点,在那里你可以的"T的进度没有完全重新设计您的数据库,这是当成本是最高的。
很长一段时间(大约5年),我认为PHP很受欢迎。
我想我知道算法。然后我加入了topcoder.com
- 是的,我去过那里。有趣的是,一旦你了解到一个叫做名称空间的小东西,这个错误就会变得多么明显。
- PHP岩石。红宝石纸。纸胜过石头。
总是有一种"正确"的做事方式。大学毕业后,我坚持这个假设太久了。
当然,我开始意识到,完成一项任务的方法总是很多的。每种方法都有优点和缺点。查看可用的信息,做出决定,然后确保你可以向你的老板证明这一点。
我需要定义函数开始时将使用的所有变量(pascal样式)。
我曾经认为我需要考虑到我的函数要使用的所有资源,并在开始编码之前对它们进行定义,这可能是因为我的第一种语言是Pascal,而这正是我的需求所在。然后,当我移到C时,我将定义仅在那些循环外部的循环中使用的临时变量,而不考虑循环范围,这样"所有的东西都将在开始时定义"。
我花了几年的时间才明白,提前定义所有资源并不是一头冬青树,范围界定本身对代码可读性极其重要。
当我第一次听说"鸭子打字"时,我以为"鸭子打字"实际上是"管道打字",就像人们常说的"鸭子胶带"。"duck-typing"听起来有点不对,"duct-typing"有点奇怪(拼凑在一起)。
这个程序是为年轻人设计的,最好的项目经理是那些不能编程的人。
我可以花上几天的时间来减少我的业务层使用的内存量,只是后来才意识到我的项目的WinForms(GUI)使用的内存是应用程序其余部分的4倍。
作为我所写代码的所有者,我是唯一应该理解或触摸它的人。
人们会关心最佳实践,甚至是一致性。
你从来没有完成你没有开始的项目。
看起来真的很愚蠢,但我推迟了这么多项目,因为规模太大了。刚完成一个庞大的项目,我意识到如果我意识到它的范围,我就永远不会开始。然而,在现实中,即使是最复杂的系统,当分解成离散的、定义明确的部分时也是相当简单的。然而,从宏观层面来看,它很快就会压倒一切。
alt text http://images.destrop.com/products/demotivators/teamwork.jpg
每个人都想为一个问题生成最好的最可行的代码…
其他人都在使用最新最伟大的技术,而我的团队是唯一一个坚持使用劣质过时工具的团队。(除了神秘的科博恐龙)
回到我的C++时代(很多头发之前),我被Java学者包围着。当被问到C++优于Java的时候(通常是一个我试图忽略的问题,但你要去的话),我会在我的答案中包含C++给你的引用和指针。Java的人看起来不相信,建议引用是指针,然后把我从房间里嘲笑出来。我坚持C++中的引用和指针是不同的。
公平地说,我是对的。引用和指针在语义和语法上是不同的。不幸的是,我用一个谬论来支持我的主张:底层实现是不同的。
我坚信,通过标准化,引用在语法中是名称别名,就像typedef是没有存储的类型别名一样。
我确信引用不是对象,也没有存储空间,它们只是提供了从"name"到"object"的多个顶级映射。在这方面,我认为它们就像文件系统中的软链接:
1 2 3 4 5 6 7 8 9 10 11
| Code: int a = 3; int& b = a;
Names Objects Memory
+-----+ +-------------+ +-------+
| a |---->| | | |
+-----+ | | | |
| int |---->| 3 |
+-----+ | | | |
| b |---->| | | |
+-----+ +-------------+ +-------+ |
当然,尽管优化可能会导致这种情况,但引用确实有存储空间。它们是不同的对象,即使语法尽最大努力从程序员那里抽象出来。
可以这么说,我很失望地知道,关闭优化的编译器可能实现一个指针引用,需要一个取消引用操作:我实际上创建了一个文件系统中硬链接的类比:
1 2 3 4 5 6 7 8 9 10 11
| Code: int a = 3; int& b = a;
Names Objects Memory
+-----+ +-------------+ +-------+
| a |---->| int |---->| |
+-----+ +-------------+ | |
| 3 |
+-----+ +-------------+ | |
| b |---->| int& |---->| |
+-----+ +-------------+ +-------+ |
标准C++实际上并不指定如何实现引用,所以我的理论对于某些工具链可能成立,但它不在任何主流编译器中。标准中当然没有规定。
在学校里,你被教导编程是"读输入,处理数据,写输出"。实际上,很少有处理步骤——大多数编码只是"读取输入,输出"
一般来说,它要么是"从用户读取,写入数据库",要么是"从数据库读取,显示在屏幕上"。这两个案例涵盖了你将要做的95%的工作。
在不浪费一个字节或一个CPU周期的情况下制作高效的程序是如此重要。
但是有了更多的经验,它不是关于字节或CPU周期的,而是关于思想流的,连续的,不间断的,很像一首诗。
基本上,不要太用力。
- >别让这些小东西出汗!~~
- 我也这么做!"好吧,很可能,为什么我不能优化/组合这个SQL查询…(对于一个每月有5个页面视图的测试:)。
上大学时(90年代中期),他们在计算机实验室里只有Windows3.11机器(我知道,怪学院)。
有一段时间,我认为作为一个专业的程序员,只有Windows平台才与我相关,从历史的学术角度来看,所有其他平台都是有趣的。
从学校毕业后,我学习了现代的Unix和Linux环境,我不禁对我的跛脚学校感到愤怒和失望。
我还不敢相信我毕业于一个计算机工程学位,从未见过bash shell,甚至没有听说过emacs或vim。
- 那是。。。令人印象深刻,是我唯一能想到的词。
- 我很幸运…我们在我的TAFE学院有一个Xenix(早期的微软Unix到英特尔的端口)系统。我去玩了,我的一个同伴被雇回来当系统管理员…我们一起解决了。当我开始在Solaris上工作时,我比我的同胞们早了很多。是的,一个只有窗户的大学环境是非常糟糕的。
- 不管怎样,谁使用Unix?至少当我被迫在uni中只学习unix时,我是这么想的,基本上把非unix环境视为家用(windows)或不存在的遗产(大型机等)。
从大学时代起,我就认为自己是编程大师。因为我可以编码,但其他人不能。但当我加入一家公司时,我对基础知识的无知让我震惊。我对自己的所有假设都是错误的!现在我知道我需要知道什么和不知道什么了!
C/C++中IF语句的评价顺序是编译器特定的。所以写作:
如果(指针!=空)&;(指针->dosomething())
不安全,因为评估顺序可以交换。我最近发现(经过多年的胡言乱语之后)它是ANSI-C规范的一部分,您可以保证订单及其完全安全。
詹姆斯
通过暗示顾客想要什么来满足他-不幸的是,这意味着顾客知道他想要什么。
其他人会像我一样被已知的bug困扰,并且会把修复它们作为项目工作的优先事项。
- @马克,那些告诉你"什么是正确的"的人不会只是"说些什么",因为他们实际上不知道答案。(-)
- 有趣的是,当我成为一名高级开发人员时,我最大的误解是我希望大学毕业生知道他们在做什么。-)
- @mark:lol@tnyfst:lol再次;-)
代码越少越好。现在我知道,如果代码行更易于阅读/理解,那么有时候就有更多的代码行是值得的。
- 哇,那是你绝对不想要的。我花了很多时间清理代码。线条越少越好。(语法更清晰)。
OOP的好处是可以重用对象,而实际上,它是通过创建一个具有相同接口的新对象来重新启动其余代码。
实际上,对象可能是代码的2%,所以重用只会给您带来2%的好处。真正的好处是通过创建一个新的对象来重用其他98%的代码,该对象允许所有其他代码完全不同。现在您可以重用98%的代码。很值得花3倍的时间来写一个物体。
例如,如果您有一个绘图程序,突然有了一个新的形状,您希望能够绘制,只需更改shapeobject(同时保持接口不变)。程序中没有其他内容需要更改。
这些测试只是拖延的另一种方法。
Python是一个不切实际的、令人讨厌的语言(我仍然可以读一些关于我早期代码的评论,抱怨它),C++是唯一真正的面向对象语言。
我错得太厉害了,还是觉得很羞愧。
- 事实上,营销人员了解什么是可能的,什么是不可能的,所以他们不会试图向世界各地的饥荒推销解决方案。
我将永远成为其他人富有的编程软件
我不需要快速重构面向对象的代码。马丁·福勒终于睁开了我的眼睛。
- 我会投赞成票,但从技术上讲是不正确的。我明白你的意思,但实际上仍然有大量的处理发生。
- 嗯,我的代码不断地处理数据,以多种方式…
我教我自己通过阅读C K R &;不幸的是,我没有读它和Word for Word是错过了一些事情。我写我自己的版本的malloc和calloc(我和我周围的人,从工作到工作,因为我不明白,你只是在一个现有的库链接。我做的这几年,有人问我这是什么东西,为什么我carting亩左右,"以……你知道你只是在现有的链接库,对吗?"
我最长的(也是最昂贵的)错误假设是:"企业的需求是健全和合理的,我只是还不理解它们。"
100 green assumptions sitting on the wall,
and if one green assumption should accidently fall,
there'd be 99 green assumptions sitting on wall.
交替地:
Humpty dumpty sat on the wall.
Humpty dumpty had a great fall,
and all kings horses and all the kings men,
said Effim, he's only a tech.
在卡诺地图的编程中,我永远也找不到一个实际的用途。我在计算机科学课程中学习过。
我总是假设任何为任何语言编写代码的人都使用编辑程序。
我正在和我的一个客户合作,他让我主要作为支持,并为他写一些更复杂的东西。好吧,有一天他把文件弄乱了,太棒了。他不小心把自己的工作省了三个多小时,当我问他为什么不经常存钱时,他回答说:"因为我没有完成。"当然,这不是一个可以接受的答案,我戳了戳,再戳了戳。我终于发现他从来没有用过任何编辑程序!甚至连notepad.exe都没有!他一直在使用一个在线的CPanel文件编辑器!它甚至没有"查找"功能。他无法保存,直到他完成,因为他正在编辑现场文件!
不用说我被吓了一跳,他至今仍在使用CPanel编辑器…
- CPanel的编辑!CPanel是一个很好的管理者,但说真的…我只在路上用它…永远不要信任远程服务器,有时我只是将一个长注释复制到剪贴板,这样我就不必担心它是否会发布…(对于许多在线的事情,比如当你有一个好的、长的评论或帖子时的杀戮会话等)
- 为了快速修补,我承认我已经做过了。
结果表明,在Linux下检查内存分配是否返回引用并不重要,因为它实际上是在欺骗您,将来某个时候实际分配内存,或者在没有所需内存的情况下完全中止程序。
通过学习一门精确的科学,我不需要提高我有限的社交技能。
该PHP的mysql_fetch_行是从执行的SQL查询中检索数据的唯一方法。
老实说,我编写了一个完整的Web应用程序,没有使用mysql-fetch-u数组,每次我想更改函数以添加额外的列时,都必须更改一组数字。
学习正则表达式会节省你的时间
- 真的?他们没有为你节省时间?他们每天为我节省大量的工作。
- lol.只有两种类型的regex/complex/&;&;/far-king complex/。
- lol@that,这让我想起了一句话:有些人在遇到问题时会想:"我知道,我会使用正则表达式。"现在他们有两个问题。谢谢杰夫:D
- 如果你不过度使用它们,它们会的。了解基本知识为我节省了大量时间!(尝试在一行中执行4个链接str_replace…)。
我摸索着编程。通过研究SICP的书,我发现我什么都不知道。至少现在我正在深入研究编程。
我以前认为我永远不会像MS开发人员那样像顶级开发人员那样编程,但现在我认为我可以编写相同的干净代码,甚至更好。
- 去看看WDK(Windows驱动程序工具包)中的示例代码,其中大部分都是Windows构建的一部分,在我看来非常可怕。
这种优雅的编程和自动化相结合,是一种很好的老式测试的替代品。
如果你看不懂我的代码,你就是不懂语言。我做了一些代码审查,试图反驳这一点。
花了几年多的时间来了解你的代码有一个神奇的时间和地点,它在库中,而不是在应用程序中。这个应用程序是为了清晰易读。当隐藏在扩展方法和框架之后时,最好使用magic。
- 事实上,你永远不应该是有魔力的。编写代码来做你想做的事情很简单。我可以想象6-7种做同样事情的方法。只有一两本书对其他人或你自己在6个月内就能读懂。这才是真正的挑战。这是编程的真正目标——让其他人更容易阅读。即使在库中,其他人也需要扩展或修改它。始终保持可读性。
- 嗯-我想这里经常有一些折衷办法。有时,较低层的一点魔力可以使较高层的许多代码既小又可读。这不是说你永远不应该是魔法的-但你应该明智地运用魔法。
假设我写的代码非常好,并且尽可能没有错误,这是我能做的最好的事情。事实证明,有时候经理们更喜欢那些努力成为自己最喜欢的人,而不是那些做得好的人。
- 好的程序员是最受欢迎的,代码也很好!D
- Slashene:很好的评论:—)。但显然,那些试图取悦经理的人并不是工作中更认真的人(你呢?-)…大多数时候,当你试图做一件更好的工作(减少错误)时,你会花更多的时间去做:一些你的经理总是不同意的事情(即使你知道你必须做)。
- 如果你的经理总是发出奇怪的声音,对所有在公司工作的朋友都很放松,对你要求很严格,对你的期望最高,那该怎么办?他的朋友不必回答你,因为他们知道他们不会被解雇。另一方面,当经理有问题时,他会打电话给你,希望你能立即回复。甚至对你大喊大叫,因为他认为他付钱给你,而且可以对你大喊大叫。
所有OOP语言都有相同的面向对象的概念。
- 一个Java EDCOX1 0!=方法的接口。
- Java接口是需要多重继承的特定语言解决方案。Ruby的Mixins试图解决相同的问题。
- JavaScript中框中继承的继承与Java如何实现继承非常不同。
如果您已经彻底测试了代码,则不需要进行错误处理。
您可以在它的构造函数中使用MeSt集(这个,0,sieOf(对象)),没有负面的后果。
适合系统编程的语言必须支持[可变]变量。
- 你就是这么说的!我不想知道我有多少个工作区还在四处游荡…
- 是的,这就是为什么我说的不对,是吗?我的观点是解决办法是永远的,世界根本不完美…
只有程序员才能轻松地创建成功的应用程序。软件还涉及易用性、美观、文档和适当的营销。软件开发是多学科的,一门学科的失败很可能导致应用失败。
- 你可能误解了这个问题。根据标题,这听起来像是简单的信仰被证明是错误的?
- 我真的同意。世界上最好和最快的软件是极其复杂的,它之所以能成功是有原因的。
- 对不起,我一定是看了太多的回信才把问题弄丢了。但是你的权利,我应该说复杂性比简单好。这意味着在编程时,简单性通常是最好的方法。它更容易维护,更容易调试,有时甚至运行得更快。
营销人员关心你的工作。
- 哈哈,我喜欢那个:)
- Tica Tac Toe in 3000线,劳尔
- 这让我想起了我第一次做基础测试的时候,我没有意识到"input$str"中的$str可以被命名为任何东西。
- 无知和白痴是不同的。好像你从中吸取了教训。我们都是从某个地方开始的!
您需要一个客户机规范来完成一个项目。从销售会议和记事本开始的次数比没有多。当然,在会议结束时,他们希望有一个最后期限,"只是胡说八道"。
我从来没想过我会成为一名专业的程序员,我以为我会和电子产品一起工作。但最终,程序设计变得容易多了,而且报酬也高了很多,所以从一份兼职开始的工作就成了我的主要工作。
- 欢迎来到俱乐部!
- 在我最初的几份工作中,我是这个部门唯一的程序员,我认为我是个很热门的人。然后我在一个团队里找到了一份和其他程序员一起工作的工作。这让人大开眼界。
这些变量实际上只是内存中特定区域的名称。
WTF总是一个糟糕的专业人士的证据。
事实上,我最近已经意识到在我的职业生涯中,我投入了多少WTF,但当StackOverflow向我展示它们只是另一个软件度量标准时,我感到欣慰。
总是没有足够的时间在最后期限前完成。
代码行越多,软件就越好。
我最大的先入之见是,我可以按照自己的意愿进行编程。当然,后来我离开了大学,受雇于一家有着荒谬框架、规则和程序的公司,这不仅意味着我没有按我想的方式编程,而且意味着我的编程很糟糕。
常见的错误假设:"代码质量是次要的"。更糟糕的假设是:"代码质量一点也不重要。"
代码质量可以是一个非常广泛的概念。我在这里把它讲得很彻底。
- + 1。我有一次被卷入了多重复数问题。完全出乎意料。
我以为Windows3.1只是一个玩纸牌的平台。DOS是basica的平台。
我可以说服传统的程序程序员为什么OOP经常提供更好的解决方案。
也就是说,描述世界的语言需要能够描述复杂对象及其关系。
争论通常包括关于抽象类的无稽之谈,对此我的回应是"并非所有的OOP程序员都刚从uni毕业,仍然对抽象着迷"。或者经典的"在OOP中没有什么是我不能用严格的过程编程做的",我通常这样回答,"这不是你能做的,而是如果你有一个更广泛的工具集,你是否会做"。
我已经学会接受他们并不是通过我的镜头来看待世界。
- 当你意识到你不能理解它时,它会很痛!
- 那时候你知道你写得不好;)但那很伤人:(
- 在一个类似的注释上:"我能理解我的评论"
这是临时的解决方案是不是永久性的解决方案
或者换句话说:它们是不是永远:))。
这是....who JUnit测试是有效的,当需要设置断点?当测试应用程序在调试模式)。后来我意识到为什么…
这种简单性几乎总是胜过复杂性。吻——保持简单愚蠢的规则。
编辑:正如乔治在下面说的,我把这个颠倒了。我一定是在回答中迷失了方向。如果正确使用,简单性几乎总是使代码更好。
我以为我会连续8小时编码。事实上,我每天有4个小时的编码时间,1个小时的午餐时间,1个小时的咖啡休息时间,2个小时的闲聊时间/闲聊时间/翻来覆去。
在工作之前,我以为所有的客户都是白痴,对电脑一无所知。那个男孩是我错了。有时候,我们得到的项目是那些比我们做得更好的人,他们只是没有时间去做。
我觉得小隔间不好,现在我喜欢它们:我真的从一个有门的办公室搬到了一个小隔间。我喜欢开放。
所有的程序员都不是运动员。我以为我是唯一一个去健身房的人。在我工作的地方,每天早上5点至少有10个人去健身房。
我以为不会有女程序员。我们的几条线索是女士。
- 你将把vtable调零!如果有vtable,我认为它只能在有派生类(它在构造函数启动时覆盖vtable指针)的情况下工作。
一家经营大量高知名度/高流量网站的公司实际上知道他们在做什么。结果,他们大多数时候都是一无所知,而且非常幸运地处在他们所处的位置上。所以我想道德应该是,
扎实的软件工程和最佳实践!=业务成功
或者…
最关键的软件系统==crap
- 实例并不总是代表整体。我想有关公司一定很幸运能在目前的职位上…或者他们实际上是美国银行的前线。
- 枯树新闻怎么样?;)
我一直认为,要成为一个好的程序员,必须了解系统的所有内部工作。我为我不知道关于语言的一切而感到羞愧,比如在你开始编码之前它的库、模式、代码片段。嗯,我不再那么天真了。
这是令人尴尬的,但我一直认为嵌套方法调用或进行多个方法调用比创建一个变量来将每个方法调用的值存储在C_中更节省内存。
- 你的意思是,更有效地不把中间结果存储在临时变量中?在.NET中,与中间值相比,临时变量确实有一点点开销,但是编译器通常会创建临时变量,而不管怎样,您都不会要求它们,如果反汇编到CIL中,就会经常看到这些临时变量。通常不需要创建"对象"来存储方法的结果;我假设您的意思是"变量"。
- @Qwertie:谢谢。我更新了答案以便更清楚地阅读。
- 编译器是否对此进行了优化?
不是最长举行时间,但在某个时间点和几年内,我:
- 认为微软Windows是世界上唯一的操作系统(1992年)
- 了解DOS已经足够拥有"高级"操作系统知识。
这就是为什么我高中没有选择"计算机课程"的原因。我以为我对电脑已经了解得够多了。
后来在大学,出于我的错误:
- 我认为Unix操作系统/程序是完美的,DOS/Windows永远不会接近它(当时它看起来是如此的真实,我猜在Al的Linus也是这样想的,这就是为什么Linux与Unix非常相似而不是……其他操作系统)
最后,在很长一段时间里,我认为:
- 只有我的软件烂透了,商业软件也完美无缺,因为…它是"商业"软件
- 美国的软件/工程师/产品是卓越的代名词,任何外部的东西都只是拙劣的尝试。
- 哦,现在你伤害了我的感情。(我是瑞典开发商。开玩笑吧!)
Java将对象的副本传递给函数,而不是引用。
换句话说,我认为如果您将一个对象传递到一个方法中,然后以某种方式更改该对象,它不会更改调用范围中的对象。我总是将对象传递到方法中,操纵它们,然后返回它们!
软件工程师总是诚实地知道他们现在在做什么,或者在过去对你的软件做了什么。
我以为这会是一次坐过山车的旅行,有快车、散漫的女人、私人飞机和大胆的越轨行为。等我找到那个职业顾问……
80年代初,当我开始玩电脑时(zx81有1K的内存),我花了几个小时从杂志上输入大量的机器代码(字节,不是人类可读的汇编语言),基本上使用poke指令。
我相信如果我输入了一条错误的指令,那么我就必须回到开始,从一开始就重新开始输入机器代码。
规格齐全、齐全
- 哎哟。我从未有过这样的经历(除了在互动游戏机上写课以取乐…只是因为Mac机有现成的Ruby)。
640K应该足够任何人使用(DOS)。多年来,许多人都普遍相信这一点。
我第一次拥有一个内存为8MB的系统时,我认为这远远超出了我的需要。运行操作系统(Mac)和我使用的所有应用程序(Word、电子邮件、火狐等)。
- 你在8MB的机器上运行了火狐?这是什么十年?你是怎么得到这么早的一本书的;(原意是《萨卡》)
- 这个假设编程是如何相关的?你用过单词、电子邮件吗(这是实际应用程序吗?)和火狐一起编程?
- 他的陈述是从程序设计到内存使用…而IS的例子则不然。我不明白为什么投了反对票。
- 伙计,那时候没有火狐。可能是记事本,哈哈。
- 你说得对,是马赛克(NCSA?)我的意思是说FoxBase,而不是火狐。还有一个叫做"邮件"的程序,是微软买的。他们还收购了福克斯软件,福克斯基地的制造商。
- @布伦特:那你为什么不编辑你的答案呢?
人们实际上关心正在使用的技术(开源/闭源)。
线程进程
可以互换的HTML元素id和name属性。
结果显示,具有'name'属性的元素是相关的/使用的。posts等引用了'id'属性,dom引用了'id'属性。
- 我希望我能只找一个女程序员!,我来自哪里,我认为这是一个禁忌,我不知道:(
- 我想找个女程序员结婚。
理解指针和递归性将非常困难。
vb6中的整数的大小与.NET不同。
VB6可以进行位级操作。
专业的程序员制作的软件很少出错。
运行时性能至关重要。总的解决时间通常是最重要的。
自从学习了python之后,我已经摆脱了对静态输入的依赖。
- 我以前尝试过Python,但是,信不信由你,我在Python中写的bug比C++多(而且我没有很多C++经验)。静态类型只是更有效率而已。
- @齐弗雷:这是有道理的,但它也关系到你能多快地修复它们,以及你能多快地编写整个程序。我有一些由动态输入引起的错误,但是由于它们很容易修复,所以它们不会给我太多的麻烦。
在可预见的将来,我写的每一篇文章都会在某个时刻失败。
不是说所有的事情最终都不会崩溃,而是在我的编程教育早期,当我发现尝试的时候……抓住障碍……我把所有的东西都包在其中……如果失败了,会比我的程序处理的问题要严重得多(例如,北极和南极已经换了位置)。
- 我最喜欢的虫子:显然,第一次一架F111飞机以"地形跟随模式"(500英尺高,大约1马赫)飞越赤道时,它翻了个身……这是软件在负纬度上理解"左"和"右"的唯一方法。哎呀!
我不知道javascript中被0除的东西是无穷大的(IEEE754算术)。最近很难学会。
- 在任何事物中被零除的东西都是无穷大的。
- 不,在大多数编程语言中,这是一个错误。对大多数数学家来说,它是未定义的(它与无穷大的完全不同)。
- 是啊,有一段时间我以为楠是一位年长的女性亲戚…
- 太奇怪了,结果不是Nan吗?
- 在我见过的大多数库中,0/0==nan,正数/0==+无穷大,负数/0==-无穷大。对于浮点数,不管怎样——整数0/0通常被不同地处理。
窗户上的线很便宜。
结果证明这只是有点真实。一个线程有一定的开销,需要自己的地址空间,在那里它可以生存并快乐。因此,如果我发现自己在一个应用程序中处理几十个线程,我会问自己如何简化并将所有内容合并为更少的线程。
分析和性能分析是一样的。
然后我发现,虽然分析人员比什么都没有要好,但包含错误的假设,例如:
- 只有聚合才重要,而不是细节
- 在定位性能问题时,统计精度是必要的。
- 测量时间和定位不必要的耗时操作是一样的。
- 探查器是一种通用的解决方案,它只打算把你放在"球场"里。不要费心优化配置文件没有证明是性能瓶颈的代码。我同意这可能会产生误导。从前,我发现自己在优化一个平等的方法,这被称为几万亿次…直到我对自己说:"等一下,百万是的,万亿不是。为什么等于万亿次?"这个故事的寓意是一个剖析者不能代替智商。干杯。基思。
- @Corlettk:我现在要做的是等待程序变慢,然后使用"暂停"按钮对调用堆栈进行采样。然后我查找出现在多个示例上的调用站点。任何这样的调用站点都是一个点,如果我能优化它,将大大加快我的程序。这违背了所有公认的关于仿形的智慧。
标识列不能包含重复值:SQL Server中的标识列
我认为编写足够好的软件是一项简单的任务
- 你到底在和谁说话?如果您在@kyralessa的答案下对此进行了评论,而不是单独的答案,那么我们可能会更好地遵循这个思路。
- @罗伯特·哈维:我的错。我不小心打了"答案"而不是"评论"。我会设法找到合适的发帖地点。
您无法诊断生产中的"间歇性错误"。重新启动服务器是修复它的唯一方法。
也许在我早期的ASP编码中更真实。但是有很多很好的分析工具可以发现内存泄漏和其他奇怪的问题。Perfmon还提供了许多良好的诊断数据。另外,您应该将诊断日志编码到应用程序中。
我们的开发方法之所以被选择和使用是因为它们是最好的品种。
然后我发现我们使用的工具对我们做了什么、什么时候做以及我们是如何做的影响比我想象的要大得多。
那个OOP已经过时了:(我仍然后悔直到今天。
- 是的,AOP完全取代了OOP,你没有收到备忘录吗;-)
学习一门全新的语言真的很难。
如果我有一个强大的静态类型系统,比如ml或haskell中的系统,我应该使用它来编码尽可能多的不变量。只有有了经验,我才知道有时候让不变量是动态的更好。
- 传统的程序程序员对生活有不同的看法。对他们来说,计算机使用程序来处理数据。输入->程序->输出。将数据与程序缠绕在一起不会增加任何价值。换句话说,在传统程序员的思维模式中,程序甚至没有试图描述复杂的对象及其关系。它不是任何东西的模型。它使用的是读取输入和写入输出的算法。
我知道要写一个合适的网络应用程序,当我必须设计出能在所有浏览器中工作的东西时,我很清楚这一点。
完整的Unicode支持是成功地将软件部署到亚洲地区的先决条件。
因为我在我的"标准"环境中构建了软件,它可以在每个人的机器/服务器上工作。结果发现我安装了一些不知名的库和服务,它们实际上正在被使用。然后发现我利用了一个bug,这个bug后来被修补了。
是:
1
| for (int i = 0; i < myObj.variable; i = i + 1) |
得到了优化:
1 2
| int j = myObj.variable;
for (int i = 0; i < j; i = i + 1) |
哇,我停在函数调用放在地方的时候,我意识到,他们正在运行的每一次!
原因:
1 2 3 4 5 6 7
| for (int i = 0; i < myObj.variable; i = i + 1){
if (function_argument == NULL){
myObj.variable++;
} else {
printf("%d", myObj.variable);
}
} |
不一样的是:
1 2 3 4 5 6 7 8
| int j = myObj.variable;
for (int i = 0; i < j; i = i + 1){
if (function_argument == NULL){
myObj.variable++;
} else {
printf("%d", myObj.variable);
}
} |
任意的例子,但你可以看到我们如何优化变更执行。
销售人员实际地管理客户期望。(接受承诺不足和交付过度的培训)
软件需求通常来自市场调查。
他说他懂编程,一定是真的!
维度n是维度(n+1)的一个实例,当它们相等时。
一个程序最终可以解决所有的问题。
当然,你可以看看FindBugs和PMD,但这些是我最喜欢的Gojas和Tokes(所有Java):
字段不被覆盖,它们被隐藏。
没有明确的super.super访问。
没有定义构造函数的类具有隐式零参数构造函数。今年我犯了一个实际错误。
要获取对内部类父类的引用,可以使用语法"outer.this"来消除方法调用或同步的歧义。
类是C++中的"自己的朋友",该类的任何实例的私有方法和字段都可以引用同一类的任何方法,甚至静态方法。这将使我早期的clone()和copy构造函数变得更简单。
受保护的方法和字段可以在扩展类的静态上下文中访问,但前提是该类位于同一个包中。我很高兴flex.messaging.io.amf不是一个密封的包。
- 好吧,这是哪种语言?我敢肯定它不是C或C++。
- 爪哇。FindBugs和PMD是Java静态分析工具。
当我在初中学习算法的时候,我认为npc只是一个非多项式问题,这意味着这个问题的复杂性不比多项式简单。直到我在大学里学习了计算理论,我才意识到我错了。
以为我是唯一一个能写代码的人…当我需要这个程序时,我记不起我做了什么,只需复制/粘贴我自己的代码。
现在,我知道每个人都这么做。
"kyralessa:值得一个处理器是在组装/机器语言中,它可能是一个比其他的函数返回的来电,而在离开堆栈状态良好。事实上,有各种情况,这可以是有用的。我看到一个变化,第一个6502甚至更好,但它是一个Z80,打印消息的文本是在常规的印刷后立即调用指令执行后,会恢复终结者(或零,当作为一个轻微的优化使用Z80的终结者,在零位置,让零。作为一个没有执行字节P是更便宜比试图避免它)。
它是有趣注意,在许多现代语言,函数有一个正常的退出点(这将恢复执行的呼叫,但以下)可以在通过改变异常退出。甚至在C,可以使用setjmp和longjmp的搜索/模拟行为。
我将永远用VB编程,现在我是C。
Java是慢的。那么多Perl Fan Bois on Slashdot Revurgate(SP???)这,它的悲伤。