软件工程

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

15
为需要重复两次的函数编写函数始终是最佳实践吗?
我自己,当我需要做两次以上的事情时,我迫不及待地想编写一个函数。但是,当涉及到仅出现两次的事情时,就会有些棘手。 对于需要两行以上的代码,我将编写一个函数。但是当面对这样的事情时: print "Hi, Tom" print "Hi, Mary" 我很犹豫地写: def greeting(name): print "Hi, " + name greeting('Tom') greeting('Mary') 第二个似乎太多了,不是吗? 但是,如果我们有: for name in vip_list: print name for name in guest_list: print name 这是替代方法: def print_name(name_list): for name in name_list: print name print_name(vip_list) print_name(guest_list) 事情变得棘手,不是吗?现在很难决定。 您对此有何看法?

1
了解差异:传统解释器,JIT编译器,JIT解释器和AOT编译器
我试图了解传统解释器,JIT编译器,JIT解释器和AOT编译器之间的区别。 解释器只是一台以某种计算机语言执行指令的机器(虚拟或物理)。从这个意义上讲,JVM是解释器,物理CPU是解释器。 提前编译只是意味着在执行(解释)代码之前将代码编译为某种语言。 但是我不确定JIT编译器和JIT解释器的确切定义。 根据我所读的定义,JIT编译只是在解释代码之前就对其进行编译。 因此,基本上,JIT编译是AOT编译,是在执行(解释)之前完成的吗? 还有一个JIT解释器,是一个既包含JIT编译器又包含解释器并在解释它之前对其进行编译(JIT)的程序? 请说明差异。

6
Java 8为什么不包含不可变的集合?
Java团队做了很多出色的工作,消除了Java 8中函数编程的障碍。特别是,对java.util集合的更改在将转换链接到非常快速的流式操作方面做得很好。考虑到他们在集合上添加一流的函数和函数方法做得多么出色,为什么他们完全无法提供不可变的集合甚至不可变的集合接口呢? 在不更改任何现有代码的情况下,Java团队可以随时添加与可变接口相同的不可变接口,减去“ set”方法并使现有接口从其扩展,如下所示: ImmutableIterable ____________/ | / | Iterable ImmutableCollection | _______/ / \ \___________ | / / \ \ Collection ImmutableList ImmutableSet ImmutableMap ... \ \ \_________|______________|__________ | \ \___________|____________ | \ | \___________ | \ | \ | List Set Map ... 当然,诸如List.add()和Map.put()之类的操作当前会返回给定键的布尔值或先前值,以指示该操作是成功还是失败。不可变集合必须将此类方法视为工厂,并返回包含添加元素的新集合-该集合与当前签名不兼容。但这可以通过使用其他方法名称(例如ImmutableList.append()或.addAt()和ImmutableMap.putEntry())来解决。由此产生的冗长性将远远超过使用不可变集合的好处所抵消,并且类型系统将防止调用错误方法的错误。随着时间的流逝,旧的方法可能会被弃用。 永恒收藏的胜利: 简单性-当基础数据不变时,关于代码的推理就更简单了。 文档-如果某个方法采用不可变的集合接口,则您将知道它不会修改该集合。如果某个方法返回一个不可变的集合,则说明您无法对其进行修改。 并发-不可变集合可以在线程之间安全地共享。 …


16
在审查过程中,我该如何在技巧上建议改进其他人设计不良的代码?
我是干净代码和代码技巧的忠实拥护者,尽管我目前从事的工作不被视为重中之重。我有时会发现自己的处境是,同位人的代码充满混乱的设计,并且很少担心将来的维护,尽管它功能正常且几乎没有bug。 当您认为需要进行大量更改并且有最后期限时,您将如何在代码审查中提出改进建议?请记住,建议在截止日期之后进行改进可能意味着,随着新功能和错误修复的到来,它们将被完全取消优先级。

30
给开发人员较慢的开发机器会导致更快/更有效的代码吗?[关闭]
假设我给开发人员一个尖叫的快速机器。基于WPF的VS2010加载非常快。然后,开发人员创建一个WPF或WPF / e应用程序,该应用程序可以在其盒子上正常运行,但在现实世界中运行得慢得多。 这个问题分为两个部分... 1)如果我给开发人员提供较慢的计算机,这是否意味着生成的代码可能更快或更高效? 2)我该如何给开发人员以快速的IDE体验,同时又提供“典型”的运行时体验? 更新: 作为记录,我正在准备对管理层的公正回应。这不是我的主意,你们正在帮助我纠正客户的错误要求。感谢您给我更多的弹药,并提及在何时何地使用这种弹药。我为+1的有效用例进行了+1,例如: -特定的服务器端编程优化 -测试实验室 -可能会购买更好的服务器,而不是顶级显卡
130 ide  testing  performance 

9
作为控制流的例外是否被认为是严重的反模式?如果是这样,为什么?
上世纪90年代后期,我在使用例外作为流控制的代码库中做了很多工作。它实现了一个有限状态机来驱动电话应用程序。最近,我想起那些日子,因为我一直在做MVC Web应用程序。 它们都具有Controllers,该s确定下一个下一步并将数据提供给目标逻辑。来自老式电话域的用户操作(例如DTMF音调)成为操作方法的参数,但是他们没有返回类似a的内容ViewResult,而是抛出了a StateTransitionException。 我认为主要区别在于动作方法是void功能。我不记得我对这个事实所做的所有事情,但是我一直犹豫要记住多少东西,因为自从15年前从事这项工作以来,我再也没有在生产代码中见过任何其他工作。我以为这是一个所谓的反模式迹象。 是这样吗?如果是,为什么? 更新:当我问这个问题时,我已经想到了@MasonWheeler的答案,所以我选择了最能增加我的知识的答案。我认为他也是一个正确的答案。

14
向客户展示错误代码?
一位客户要求我重新设计他们的网站,这是另一位顾问开发的ASP.NET Webforms应用程序。这似乎是一个相对简单的工作,但是在查看了代码之后,显然并非如此。 该应用程序编写得不好。完全没有 它极易受到SQL注入攻击的影响,业务逻辑散布在整个应用程序中,重复很多,无用的代码无所作为。最重要的是,它不断抛出令人窒息的异常,因此站点看起来运行平稳。 我的工作是简单地更新HTML和CSS,但是许多HTML都是在业务逻辑中生成的,这将是一场噩梦。我对重新设计的估计比客户期望的时间更长。他们问为什么这么久。 我如何向客户解释这段代码有多糟糕?在他们看来,应用程序运行得很好,重新设计应该是一次性的。这是我对前任顾问的反对。我如何给出非技术客户会理解的简单而具体的示例? 更新资料 感谢您的所有回复。SQL注入攻击演示很有意义,我将在测试环境中进行演示。那只是该应用程序中许多问题的一部分。我一直在寻找方法来解释为什么其他部分(例如,在数据层中生成的html)需要用更好的实践来替换,以便进行html和css更新。这里有很多很好的建议,当我与客户交谈时,我会综合考虑。

16
有什么方法可以更快地解决错误吗?我刚刚受到老板的警告[关闭]
我的老板刚刚告诉我,我将在星期一收到负面的绩效评估。他想和我谈谈为什么我这么慢,为什么我的错误修复率这么低。 我喜欢编程和解决问题,但实际上确实发现我的工作真的很辛苦。 实际上,我已经当了10年程序员。但这是我的第一个多线程嵌入式linux工作-我已经在这里工作了2年,对每个人来说,我仍然在努力挣扎。而且我认为我已经变得如此沮丧和边缘化,以至于我失去了工作之初的很多热情。 有没有人遇到过类似的情况?如何提高错误修复率? 更新:我进行了审查。我参加了一个为期3个月的“员工发展计划”(Dunk提到的那种)。不知道我是否可以解决这个问题。但是,即使我必须继续前进,我也从这次经历中学到了很多东西。 另一个更新 自第一次审核以来,大约有6周。我对面临同样情况的任何人的建议是要谦虚接受批评并从错误中吸取教训。并且不要害怕看起来愚蠢。提出很多问题。让人们知道您正在尝试学习,并不断询问直到您理解为止。但是要做好准备,使其不起作用。我正在构建代码组合……并尽力而为。 另一个更新 我很犹豫,在这里,因为我担心我无法将未来的雇主介绍给我的stackoverflow个人资料...但是,无论如何,有人读这个问题可能很有趣,但是我却真的迷失了我几周前的工作。我正在重新学习所需的所有技能-我从这里提供的建议中学到了很多。

7
私有的,不可猜测的URL是否等于基于密码的身份验证?
我想在网络上公开资源。我想保护此资源:确保只有某些个人可以访问它。 我可以设置某种基于密码的身份验证。例如,我只能允许在提供文件之前通过Web服务器访问资源,该Web服务器检查传入的请求以获取正确的凭据(可能针对用户的某些后备数据库)。 或者,我可以只使用私有URL。就是说,我可以简单地将资源托管在一些无法猜到的路径上,例如https://example.com/23idcojj20ijf...,它将访问权限限制为知道确切字符串的用户。 从想访问此资源的邪恶者的角度来看,这些方法是否等效?如果没有,是什么使它们与众不同?就可维护性而言,在实施一种或另一种方法之前,我应该意识到这两种方法的优缺点吗?

16
错误修正何时会变得过大,如果有的话?
假设您正在使用JavaScript创建视频播放器。该视频播放器使用递归功能反复循环播放用户的视频,因此,浏览器too much recursion RangeError有时会触发。 可能没有人会那么多地使用循环功能。您的应用程序将永远不会抛出此错误,即使用户将应用程序循环了一周也不会出现此错误,但是它仍然存在。解决该问题将需要您重新设计应用程序中循环的工作方式,这将花费大量时间。你是做什么?为什么? 修正错误 留下错误 您不应该只解决人们会偶然发现的错误吗?修正错误何时会变得矫kill过正? 编辑: 如果您担心递归方法不会导致实际的错误,请假设播放器每次播放视频时,变量都会增加1。在2 53循环之后,此变量将溢出,您的程序将无法处理它,并引发异常。

15
单字符常量比文字常量好吗?
最近,我遇到了一个类,该类几乎将每个单个字符都提供为常量。从COMMA到的一切BRACKET_OPEN。想知道这是否必要;我读了一篇“文章”,它暗示将单字符文字转换为常量可能会有所帮助。所以,我对此表示怀疑。 使用常量的主要吸引力在于,当需要更改时,它们可以最小化维护。但是,什么时候开始使用不同于','的符号来表示逗号呢? 我看到使用常量而不是文字的唯一原因是使代码更具可读性。但是city + CharacterClass.COMMA + state(例如)真的比city + ',' + state吗? 对我而言,弊大于利,主要是因为您介绍了另一类和另一项内容。而且我相信尽可能减少代码。因此,我想知道这里的普遍共识是什么。

10
我应该如何测试随机性?
考虑一种随机调整数组元素的方法。您将如何编写一个简单而健壮的单元测试以确保其正常工作? 我提出了两个想法,两个都有明显的缺陷: 随机排列数组,然后确保其顺序与以前不同。这听起来不错,但是如果随机播放以相同顺序随机播放,则失败。(不可能,但可能。) 用恒定的种子对数组进行混洗,并根据预定的输出进行检查。这依赖于随机函数始终在给定相同种子的情况下始终返回相同的值。但是,有时这是一个无效的假设。 考虑第二个函数,该函数模拟掷骰子并返回随机数。您将如何测试此功能?您将如何测试该功能... 永远不会返回给定范围之外的数字? 返回有效分布中的数字?(一个骰子统一,大量骰子正常。) 我正在寻找答案,以提供不仅可以测试这些示例,而且可以测试常规代码的随机元素。这里的单元测试甚至是正确的解决方案吗?如果没有,那是什么样的测试? 只是为了让大家放心,我没有编写自己的随机数生成器。

11
系统复杂性的增加如何影响连续几代程序员?
作为一名“新”程序员(我于2009年首次写了一行代码),我注意到创建一个程序时相对容易,该程序现在可以显示诸如.NET框架之类的非常复杂的元素。现在,只需很少的命令即可创建可视界面或对列表进行排序。 在学习编程的同时,我也在并行学习计算理论。诸如排序算法,硬件如何协同工作的原理,布尔代数和有限状态机之类的东西。但是我注意到,如果我想测试我从理论上学到的一些非常基本的原理,那么入门总是要困难得多,因为很多技术被诸如库,框架和操作系统之类的东西所遮盖。 40/50年前就需要制作一个内存有效的程序,因为内存不足,而且价格昂贵,因此大多数程序员都密切关注数据类型以及处理器如何处理指令。如今,有些人可能会争辩说,由于处理能力和可用内存的增加,这些问题已不再是重点。 我的问题是,年长的程序员是否将此类创新视为天赐之物或抽象的附加层,为什么他们会这样认为?在探索扩展库领域之前,年轻的程序员是否会从学习低级编程中受益?如果是这样,那为什么呢?

3
Apache 2许可证对现实生活有什么影响?[关闭]
我想对项目使用SVG Edit。该软件根据Apache 2许可分发。 我看到了: 所有副本(已修改或未修改)均附有许可副本 所有修改都明确标记为修改器的工作 版权,商标和专利权的所有声明均以分发副本的形式准确复制 被许可人不使用属于许可人的任何商标 这些与代码有关吗?还是应该在GUI中的某个位置显示许可证?在原有的软件显示“本站由SVG编辑”,是确定的,如果我删除此?最重要的是:这样做的正确礼节是什么?我不想成为一个混蛋,但与此同时,我想尽可能简化UI,并且如果不认为rude,则删除链接将是其中的一部分。

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.