软件工程

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

6
应该向用户显示多少有关错误的信息?
应用程序总是会抛出错误。如果发生此类错误,则应通知用户,因为他要求应用程序执行的操作未成功。 但是,应该向用户提供多少信息?我认为我们大多数人都同意不显示堆栈跟踪(堆栈跟踪是否应该出现在向用户显示的错误消息中?),但是我找不到有关其余错误内容或向错误显示的内容的问题。用户。 例如,支持异常的语言(.net,java)具有共享的异常类型(发生异常的位置)以及与异常一起传递的澄清消息。还应该对用户隐藏吗?还是我们应该显示这个?还是应该显示一般性消息?还是应该根据潜在的异常是显示大量消息之一?


14
在紧迫的期限内清理别人的代码有多重要?[关闭]
(我说的是HTML / CSS代码(不是编程语言),但我认为我们也面临与程序员相同的问题。) 我是团队中的高级前端设计师,而且我经常不得不在紧迫的期限内重新处理初级人员的输出。 我面临两个问题: 他们的编码风格有点混乱。 美学不好。 我发现,它们的编码风格是混合的,没有适当的约定/标准。在清理代码或只是处理他们的代码(甚至复制他们的工作方式)之间,我感到很痛苦。 我确实觉得遵循他们的编码风格感到沮丧,因为我觉得我可能会学到坏习惯。但是,那是完成截止日期的最快方法。 对于那些有更多经验的人,哪个更有效?我应该保存清理以备后用吗?还是在进行更改时进行清理? (尽管我不想听起来很自大,但这是现实。要花更多的时间来编写更好的代码。我知道,我刚开始写的是凌乱的代码。)

8
基于作用域的内存管理的缺点
我真的很喜欢基于作用域的内存管理(SBMM)或RAII,因为它在C ++社区中更为常见(令人困惑?)。据我所知,除C ++(和C)外,当今没有其他主流语言使SBMM / RAII成为主要的内存管理机制,相反,他们更喜欢使用垃圾回收(GC)。 我觉得这很令人困惑,因为 SBMM使程序更具确定性(您可以确切地说出销毁对象的时间); 在使用GC的语言中,您通常必须执行手动资源管理(例如,参见关闭Java中的文件),这在一定程度上违背了GC的目的,并且也容易出错。 堆内存还可以(非常优雅地称为imo)是作用域绑定的(请参见std::shared_ptrC ++)。 为什么SBMM没有得到更广泛的使用?它有什么缺点?

11
是否可以在不遵循最佳实践的开源项目上进行编码样式更改?
最近,我在GitHub上遇到了许多开源Ruby(或大多数是Ruby)项目,当使用诸如Rubocop之类的代码分析工具进行检查时,会造成很多冒犯。 现在,大多数此类违法行为包括使用双引号而不是单引号(未插值时),不遵循每级2个空格规则,超过80个字符的行长规则或对多行块使用{和}。 [The Ruby风格指南]推荐了最佳实践,以便现实世界中的Ruby程序员可以编写可由其他现实世界中的Ruby程序员维护的代码。〜资料来源:Ruby样式指南 尽管它们很小且易于修复,但是否适合通过修正违规并提出“拉取请求”来更改开源项目的编码风格?我承认,某些项目(例如Rails)不接受外观更改,而有些项目太大而无法一次“修复”(例如,在运行Rubocop时,Rails会产生80,000多个违规行为-不管它们有自己的一小套编码)贡献时应遵循的惯例)。毕竟,《Ruby样式指南》与诸如Rubocop之类的工具一起存在是有原因的。 人们喜欢一致性,因此对Ruby社区来说,进行此类更改通常是一件好事,对吧? [Ruby样式指南的作者]并非一无所有地提出了所有规则-它们主要是基于我作为专业软件工程师的广泛职业,以及来自Ruby社区成员和各种人的反馈和建议。高度评价的Ruby编程资源,例如“ Programming Ruby 1.9”和“ The Ruby Programming Language”。〜资料来源:Ruby样式指南 难道不是遵循社区编码风格的惯例和最佳实践基本上是在鼓励不良实践吗?

6
为什么“功能与数据之间的紧密耦合”不好?
我在第40页的“ Clojure的喜悦 ”中找到了这句话。32岁,但上周晚饭时有人对我说了同样的话,我在其他地方也听说过: [A]面向对象编程的缺点是函数和数据之间的紧密耦合。 我理解为什么不必要的耦合在应用程序中不好。我也很高兴地说,即使在面向对象的编程中,也应避免避免可变状态和继承。但是我看不到为什么在类上粘贴函数本质上是不好的。 我的意思是,向类添加功能似乎就像在Gmail中标记邮件,或将文件粘贴在文件夹中。这是一种组织技巧,可帮助您再次找到它。您选择一些条件,然后将类似的东西放在一起。在OOP之前,我们的程序几乎是文件中方法的一大包。我的意思是,您必须将函数放在某个地方。为什么不组织它们? 如果这是对类型的公开攻击,为什么他们不只是说将输入和输出的类型限制为一个函数是错误的?我不确定是否可以同意这一点,但是至少我对pro和con类型安全性论点很熟悉。在我看来,这似乎是一个主要的问题。 当然,有时人们会错误地将功能放在错误的类上。但是与其他错误相比,这似乎是一个很小的麻烦。 因此,Clojure具有名称空间。在OOP中将函数粘贴在类上与在Clojure中将函数粘贴在命名空间中有什么不同,为什么这么糟?请记住,类中的函数不一定只在该类的成员上运行。看一下java.lang.StringBuilder-它可以对任何引用类型进行操作,也可以通过自动装箱对任何类型进行操作。 PS此引用引用了一本书,但我没有读过:《Leda中的Multiparadigm编程》:Timothy Budd,1995年。


7
研究生/初级工程师可以期望什么标准?[关闭]
毕业生开发人员可以接受缓冲区溢出吗?我们将标准设置得太高吗?研究生/初级工程师的预期能力是什么? 内容: 我们目前正在招聘主要在Linux上的C语言中工作的初级开发人员职位。 作为该过程的一部分,我们要求应聘者在闲暇时完成C语言的代码测试。 到目前为止,我们已经拒绝了两个候选对象,因为它们的代码虽然可读且在某些情况下是惯用的,但是由于无限制的缓冲区写操作而遭受了缓冲区溢出错误。 [编辑]: 我们明确要求提供经过错误检查的生产质量代码。 我们为候选人提供测试和构建框架 [更新]: 由于这一线索,以及我们与其他开发人员的亲身交谈,我们正在改变执行代码测试的方式以及招聘人员的目标。 我们认为,候选人无法解决或无法理解缓冲区溢出问题,意味着他不适合我们进行的工作,尤其是他所接受的指导比我们所能接受的还要多。因此,我们仍然会拒绝最终无法提交可靠代码示例的候选人。 但是,我们已经采取了一些措施来使招聘过程对我们和候选人都更有效率。 尤其是: 我们使期望更加明确,对生产质量的含义进行了清晰的解释,并警告该代码在输入和错误方面应该是可靠的。 现在,在代码测试的描述中,我们将候选人链接到防御性编程和C标准库的资源。 我们将目标受众从初级开发人员和毕业生转变为具有相关经验的目标人群。 如果提交的代码以某种方式失败但被接受,我们现在提供一个导致错误情况的最小测试用例,并为考生提供改正错误的机会(除非由于其他原因而被拒绝)。如果合适,我们还将指出有问题的行/功能。 现在,测试的目的已经从前端过滤器稍有改变,从而有机会建立更好的候选图片,特别是它将为我们的电话讨论提供信息。也就是说,我们仍然愿意仅基于代码拒绝。 [更新2015-07-09]: Nujob的Andy Davis从应聘者的角度撰写了一篇有趣的相关文章,介绍了如何使用代码测试,并且值得一读。在这里找到它。

8
轮换开发人员是一个好主意还是坏主意?
我正在一个小型团队中工作,该团队将开始与另一个小型团队一起进行一个新的大型项目。另一个团队目前正在研究他们已经使用了多年的遗留系统。 经理已决定,我们团队中的开发人员将每隔几个月轮换一次,以替换在旧系统上工作的开发人员。这样,其他团队将有机会从事新项目并更好地理解新系统。 我想知道每2-3个月从项目中轮换开发人员的利弊(如果有)。 我知道这与“轮换首席开发人员是个好主意还是坏主意?”类似的问题。,但是这个问题集中在主要开发人员上。这个问题是关于整个团队轮流上线和下线的(新项目的技术负责人可能会也可能不会轮换-我还不知道)。

3
为什么`main`不能返回double或String而不是int或void?
在许多语言(例如C,C ++和Java)中,main方法/函数的返回类型为void或int,但不具有double或String。背后的原因可能是什么? 我知道一点我们不能做到这一点,因为它main是由运行时库调用的,它需要某种语法int main(),int main(int,char**)所以我们必须坚持下去。 所以我的问题是:为什么要main具有它所拥有的类型签名,而又没有其他类型签名?

4
记录失败的登录尝试会泄露密码
我开始在网站上记录失败的登录尝试,并显示以下消息 Failed login attempt by qntmfred 我注意到其中一些日志看起来像 Failed login attempt by qntmfredmypassword 我猜有些人登录失败,因为他们在用户名字段中输入了用户名和密码。密码在数据库中进行了哈希处理,但是,如果数据库因某种原因受到损害,这些日志消息可能是攻击者找出密码的方法,无论有多少人最终登录失败,这种密码都是如此。 有没有更好的方法来解决这个问题?我还要担心这种可能性吗?

6
为什么未为HTML选择严格解析?
我经常想知道为什么在创建HTML时没有选择严格的解析。在大多数Internet历史上,浏览器都接受任何形式的标记,并尽力进行解析。该过程会降低性能,使人们书写乱码,并且很难中止过时的功能。 是否有严格解释HTML的特定原因?
38 html  history  parsing 

7
CLI应用程序的开发是否被视为“落后”?[关闭]
我是一名DBA初学者,在编程方面有很多经验。 我开发了几个CLI非交互应用程序,这些应用程序可以解决一些日常重复性任务,或者可以消除更复杂的人为错误,尽管不是日常任务。这些工具现在已成为我们工具箱的一部分。 我发现CLI应用程序很棒,因为您可以将它们包括在自动化的工作流程中。 同样,Unix的哲学是做一件事情但做得好,让一个进程的输出成为另一个进程的输入,这是构建一套工具的一种好方法,而不是巩固其战略优势。 我的老板最近评论说,开发CLI工具是“向后的”,或者构成“回归”。 我告诉他我不同意,因为现在存在的大多数CLI工具不是旧版,而是实时发布具有改进版本的实时项目。 这种发展是否被市场认为是“落后”的? 在简历上看起来不好吗? 我还考虑了所有解决方案,无论是Web还是台式机,都应具有命令行,非交互式选项。有人认为这是浪费编程资源。 这个目标在软件项目中是否值得实现? 我还认为,对于Web或桌面应用程序,具有备用CLI界面是证明业务逻辑与GUI完全脱钩的好方法。
38 skills  cli 

5
为什么C#在case块中没有局部作用域?
我在写这段代码: private static Expression<Func<Binding, bool>> ToExpression(BindingCriterion criterion) { switch (criterion.ChangeAction) { case BindingType.Inherited: var action = (byte)ChangeAction.Inherit; return (x => x.Action == action); case BindingType.ExplicitValue: var action = (byte)ChangeAction.SetValue; return (x => x.Action == action); default: // TODO: Localize errors throw new InvalidOperationException("Invalid criterion."); } } 惊讶地发现一个编译错误: 此范围中已经定义了一个名为“ action”的局部变量 这个问题很容易解决。只是摆脱第二个var就可以了。 …


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.