软件工程

针对在系统开发生命周期中工作的专业人士,学者和学生的问答

7
在JavaScript中使用==是否有意义?
Douglas Crockford 在JavaScript中的Good Parts中写道: JavaScript有两套相等运算符:===和!==,以及它们的邪恶孪生子==和!=。优秀的产品以您期望的方式工作。如果两个操作数具有相同的类型并具有相同的值,则===产生true和!==产生false。当操作数是相同类型时,邪恶双胞胎会做正确的事情,但是如果操作数是不同类型,则它们会试图强制值。他们所依据的规则是复杂而难忘的。这些是一些有趣的情况: '' == '0' // false 0 == '' // true 0 == '0' // true false == 'false' // false false == '0' // true false == undefined // false false == null // false null == undefined // true ' \t\r\n ' == 0 …

30
大括号应该出现在自己的行上吗?[关闭]
大括号应该放在自己的行上吗?你怎么看待这件事? if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); } 还是应该 if (you.hasAnswer()) { you.postAnswer(); } else { you.doSomething(); } 甚至 if (you.hasAnswer()) you.postAnswer(); else you.doSomething(); 请建设性!解释为什么,分享经验,并以事实和参考作为支持。

8
人们为什么要用div制作桌子?
在现代Web开发中,我越来越经常遇到这种模式。看起来像这样: <div class="table"> <div class="row"> <div class="cell"></div> <div class="cell"></div> <div class="cell"></div> </div> </div> 在CSS中,类似: .table { display: table; } .row { display: table-row; } .cell { display: table-cell; } *(类名仅是说明性的;在现实生活中,这些是反映元素含义的普通类名) 我什至最近都尝试自己做这个,因为……每个人都在做。 但是我还是不明白。我们为什么要这样做呢?如果您需要一张桌子,那么只需将其炸毁<table>并完成即可。是的,即使是用于布局。那就是表格的用途-以表格形式放置内容。 我最好的解释是,到现在为止,每个人都听过“不要使用表格进行布局”的口号,因此他们盲目地遵循它。但是他们仍然需要一个表格进行布局(因为其他任何东西都不具有表格的扩展功能),所以他们制作了一个表格<div>(因为它不是表格!),然后添加了使其成为表格的CSS。 对我来说,这就像在世界上摆出任意不必要的障碍,然后做额外的工作来规避它们。 离开表格进行布局的原始论点是,之后很难修改表格布局。但是出于同样的原因,修改“仿表”布局也同样困难。实际上,实际上,修改布局总是很困难,而且如果您想做一些比细微调整更严肃的事情,仅更改CSS几乎是远远不够的。您将需要了解和更改HTML结构,以进行认真的设计更改。表格不会比div更难或更容易。 事实上,我看到桌子可以做一个布局很难修改,唯一的办法是,如果你从头使用他们,创造了一个不敬虔的混乱。您也可以使用div来做到这一点。 所以...为了将这个问题从咆哮变成一个连贯的问题:我想念的是什么?使用“人造桌子”而不是真正的桌子有什么实际好处? 关于重复链接:这并不是建议使用其他标签或其他东西。这是关于使用<table>vs 的问题display:table。
269 html  css 

21
在代码中留下故意的错误以供测试人员查找
我们在公司没有这样做,但是我的一位朋友说他的项目经理要求每个开发人员在产品进行质量检查之前添加故意的错误。它是这样工作的: 在产品进行质量检查之前,开发团队在代码中的随机位置添加了一些故意的错误。他们适当地备份了原始的有效代码,以确保最终产品没有附带这些错误。 测试人员也将被告知这一点。因此,他们将进行艰苦的测试,因为他们知道存在错误,并且未找到它们可能被认为是能力不足的标志。 如果发现错误(故意的或其他),则将报告它们,以供开发团队修复。然后,在产品进入第二级质量保证之前,开发团队会在代码的相关部分中添加另一个故意的错误。项目经理说,测试人员应该像开发人员那样思考,并且他/她应该在进行更改的部分中期待新的错误。 好吧,这是怎么回事。他们说这种方法具有以下优点。 测试人员将始终保持警惕,他们将疯狂地进行测试。这可以帮助他们发现隐藏的(非故意的)错误,以便开发人员可以对其进行修复。 测试人员以错误为食。找不到任何错误会影响他们的士气。因此,给他们一个容易找到的人会帮助他们的士气。 如果您忽略了最终产品附带这些故意错误之一的情况,那么在考虑采用这种方法之前,我们还应考虑哪些其他缺陷? 一些说明: 他们在源代码管理中正确备份了原始代码。 当测试人员发现故意的错误时,开发团队将忽略它。如果测试人员发现了非故意(原始)错误,则开发团队首先检查该错误是否由任何故意的错误引起。也就是说,开发团队首先尝试在原始工作代码上重现该代码,并尝试对其进行修复。 只需忽略质量检查和开发团队之间的关系问题。我是在程序员而不是在工作场所上专门问这个问题的。考虑到质量保证和开发团队之间的融洽关系,他们在下班后聚会。项目经理是一位很好的老绅士,他随时准备支持两个团队(Godsend)。

30
您如何判断高级开发人员的建议是否不好?[关闭]
最近,我以初级开发人员的身份开始了我的第一份工作,我还有一个高级开发人员负责在这家小公司中指导我。但是,有几次他会给我一些我无法同意的建议(这与我在专家撰写的有关该主题的几本好书中学到的东西背道而驰,我在一些问答网站上提出的问题也同意了和我一起),并且由于我们的日程安排很忙,我们可能没有时间进行长时间辩论。 到目前为止,我一直在通过听取他的意见来努力避免这一问题,并根据我所学到的当前良好做法提出一个对策。他再次提出了自己的观点(大多数时候,他会说最好的做法,更易于维护,但没有走得更远),我记下了笔记(因为他没有提出新观点来反驳我的观点)它并在家里进行研究,但不要进行任何更改(我仍然不相信)。但是最近,他再次与我联系,看到了我的代码,并问我为什么我没有将其更改为他的建议。这是2--3周内的第三次。 作为一名初级开发人员,我知道我应该尊重他,但与此同时,我只是不同意他的一些建议。但是,我承受着进行更改的压力,我认为这些更改会使项目变得更糟。当然,作为一个没有经验的开发人员,我可能会错,他的方法可能会更好,这可能是其中一种例外情况。 我的问题是:我该怎么做才能更好地判断高级开发人员的建议是好是坏,或者是好的,但是在今天的情况下已经过时了?而且,如果情况不好/已经过时,那么尽管他有“压力”,我仍然可以使用什么策略不按他的方式执行它,同时又要保持我尊重他作为长者的事实呢?

7
为什么HTML表单上没有PUT和DELETE方法?
HTML4 / XHTML1仅允许以表格形式进行GET和POST,现在看来HTML5会做同样的事情。有提议将这两个添加,但似乎并没有获得吸引力。在HTML5规范草案中不包含PUT和DELETE的技术或政治原因是什么?
265 html  html5 

17
为什么有私有字段,保护不够?
private类字段/属性/属性的可见性有用吗?在OOP中,迟早要创建一个类的子类,在这种情况下,最好能够理解并能够完全修改实现。 当我对一个类进行子类化时,我要做的第一件事就是将一堆private方法更改为protected。但是,对外部世界隐藏细节很重要-因此我们需要protected而不仅仅是public。 我的问题是:您是否知道一个重要的用例,private而不是protected一个好的工具,或者两个选项“ protected&public”对于OOP语言是否足够?

19
#region是反模式或代码气味吗?
C#允许使用#region/ #endregion关键字使代码区域在编辑器中可折叠。每当我这样做时,我都会隐藏可能会重构为其他类或方法的大量代码。例如,我见过一些方法,其中包含500行代码以及3或4个区域,只是为了使其易于管理。 那么明智地使用区域是否会带来麻烦呢?对我来说似乎是这样。
264 c#  code-smell 

5
是否有任何理由在ES6中使用“ var”关键字?
Babel ES6指南说: let是新的var。 显然,唯一的区别是var将作用域限定为当前函数,而let将作用域限定为当前块。这个答案有一些很好的例子 。 我看不出有任何理由var在ES6代码中使用。即使您希望将给定变量的作用域限定在整个函数中,也可以let通过将声明放在功能块的顶部来实现,这是您应该执行var的操作以指示实际作用域。而且,如果您想在某个for块或某个范围内更精细地确定范围,则也可以这样做。 所以我的直觉是var在编写ES6代码时完全停止使用。 我的问题是,我对此有误吗?有什么合理的情况比它var更可取let吗?
260 javascript  es6 

30
我该如何处理对货物狂热的编程态度?
我在必修的入门编程课程中有一些计算机科学专业的学生,​​他们将编程语言视为一组魔术,必须对其进行浇铸才能达到某种效果(而不是将其视为表达解决方案思想的灵活媒介) 。 他们倾向于从以前看起来相似的作业中复制粘贴代码,而不考虑问题的实质。 是否有一些练习或类比使这些学生更加自信,他们可以并且应该理解他们编写的每段代码的结构和含义?
257 teaching 

30
新程序员的福利
我打算在大学毕业后立即雇用2-3名初级程序员。除了现金,对于年轻的程序员来说,最重要的福利是什么?是在玩游戏吗?我要有创造力...我要一些好主意

22
全局变量与数据库有何不同?
我只是碰到了这个老问题,问全局状态有什么弊端,最受好评的答案断言您不能信任任何与全局变量一起使用的代码,因为其他地方可能会出现其他代码并对其进行修改值,然后您将不知道代码的行为,因为数据不同! 但是,当我看到这一点时,我不禁会认为这是一个很弱的解释,因为与使用数据库中存储的数据有何不同? 当您的程序正在使用来自数据库的数据时,您不必担心系统中的其他代码是否正在更改它,或者即使是完全不同的程序正在更改它。您不在乎数据是什么。这就是重点。重要的是您的代码可以正确处理它遇到的数据。(显然,我正在解决这里经常遇到的棘手的缓存问题,但是暂时让我们忽略它。) 但是,如果您正在使用的数据来自您的代码无法控制的外部来源,例如数据库(或用户输入,网络套接字或文件等),则没有任何问题这样一来,那么代码本身内的全局数据(程序对它具有更大程度的控制)又如何呢?当它显然远比没有人认为是问题的完全正常的东西坏得多时,这又是一件坏事呢?
250 state  globals 

23
如果不可变的对象很好,那么人们为什么继续创建可变的对象?[关闭]
如果不变的对象¹很好,简单并且可以在并发编程中受益,那么为什么程序员会继续创建可变的对象²? 我有4年的Java编程经验,正如我所看到的,创建类之后,人们要做的第一件事就是在IDE中生成getter和setter(因此使其可变)。是否缺乏意识,或者在大多数情况下我们能否摆脱使用可变对象的困扰? ¹ 不可变对象是创建后状态无法修改的对象。 ² 可变对象是创建后可以修改的对象。

30
每个程序员应该知道什么?
无论使用哪种编程语言或操作系统,或使用何种操作系统开发,每个程序员都应该知道什么? 一些背景: 我有兴趣成为最好的程序员。作为此过程的一部分,我试图了解我不知道的内容,如果这样做的话,我会受益匪浅。尽管有很多列表围绕着“每个[插入编程语言]开发人员都应该知道的n件事”,但我还没有找到类似的东西,但不仅限于特定的语言。 我也希望这些信息对其他人有好处并从中受益。

16
项目已接近完成,但程序上有意粉代码。我要重写还是继续尝试发送?[关闭]
我是一名初学者Web开发人员(一年的经验)。 毕业几周后,我得到了一份工作,为一家所有者不是很多技术人员的公司构建Web应用程序。他招募我是为了避免他的想法失窃,服务公司收取高昂的开发成本,并希望他有一个年轻的人来长期维护该项目(我被录用后很久才得出这些结论)。 当时我还是Cocky,拥有计算机科学文凭,我接受了这个提议,认为我可以构建任何东西。 我在做主。经过一些研究,我选择了PHP,并从纯PHP开始,没有对象,只有丑陋的过程代码。两个月后,一切都变得混乱了,很难取得任何进展。Web应用程序非常庞大。因此,我决定检查一个MVC框架,这将使我的生活更轻松。那就是我偶然发现PHP社区中一个很酷的孩子的地方:Laravel。我喜欢它,它很容易学习,因此我立即开始编码。我的代码看起来更简洁,更有条理。看起来很好。 但是同样,Web应用程序非常庞大。该公司迫使我交付第一个版本,显然他们希望部署该版本并开始寻找客户。 因为Laravel很有趣,所以让我想起了为什么我首先选择了这个行业-在陷入糟糕的教育体系时我忘记了这一点。 因此,我从晚上开始从事小型项目,了解方法和最佳实践。我回顾了OOP,然后进行了面向对象的设计和分析,并阅读了Bob叔叔的书Clean Code。 这使我意识到我真的一无所知。我不知道如何正确地构建软件。但是到现在为止为时已晚,现在我快完成了。我的代码根本不是干净的,仅仅是意大利面条式的代码,是修复错误的真正痛苦,所有逻辑都在控制器中,并且几乎没有面向对象的设计。 我一直坚持认为我必须重写整个项目。但是,我做不到……他们一直在问什么时候才能完成。 我无法想象此代码部署在服务器上。另外,我仍然对代码效率和Web应用程序的性能一无所知。 一方面,公司正在等待产品,不能再等待了。另一方面,我看不到实际代码会更进一步。我可以完成,总结并部署,但是上帝只知道人们开始使用它时会发生什么。 我要重写还是继续尝试发送,还是错过了另一个选择?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.