软件工程

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

7
提供源代码是否会影响您的创收能力?
我们正在开发.Net框架,该框架最终相当于一个DLL。我们打算对框架的商业使用收费,但对开源/非商业使用免费。目前的粗略计划是通过某种形式的相当简单的许可证来进行管理,无论您是免费使用还是付费使用,都将颁发该许可证。 我们正在讨论是否使源代码可用。我们的看法(也是我们自己的偏好)认为,在可以访问源代码的地方使用某些东西会更具吸引力。 我对人们是否认为使源代码可用会损害我们从框架中赚钱的能力,或者是否会鼓励更多使用以及是否有足够的“好”人愿意为商业使用正确的许可证付费而感到兴趣。 我的感觉是,通常来说,商业运营不会在许可方面造成麻烦,因此使源代码可用只会鼓励使用,因此最终会产生更多收入,但是我会对其他观点/经验感兴趣。

6
没有用例的松耦合是否是反模式?
对于某些开发人员而言,松散耦合是精心设计的软件的圣杯。当它使代码在可预见的将来可能发生的变化面前更加灵活,或者避免代码重复时,这无疑是一件好事。 另一方面,松散耦合组件的努力增加了程序中的间接访问量,从而增加了程序的复杂性,常常使程序难以理解,并常常使效率降低。 您是否认为在没有任何松散耦合用例的情况下专注于松散耦合(例如避免代码重复或计划在可预见的将来可能发生的更改)是一种反模式?松散的联轴器能否落入YAGNI的保护伞下?

3
是否有关于函数式编程概念的规范教程或书籍?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 5年前关闭。 来自过程/ OO编程的背景,我倾向于以过程的方式编写Scheme程序。我将以一种功能性的方式从头开始学习Scheme或Lisp,从而重新设置程序员的思维。 是否有教程或书籍是事实上的标准,用于描述有关函数式编程概念的最佳实践,设计方法和其他有用信息?那本书使它与众不同吗?

8
我应该去学习小语言或小众语言吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 如果在StackExchange上浏览代码高尔夫球问题,则会注意到大量非标准但真实世界的语言,例如F#,Scala,R,J和Clojure。在访问他们的网站时,无论您使用哪种语言,其中一些语言都可以解决有趣的问题。 但是,有空闲时间编码和金钱编码。关于谁使用某种语言,我们最接近事实的是TIOBE Index,该索引在前10-15名中均未列出上述语言。这让我想知道我是否会使用它们。 我是否应该还要学习一些小型利基语言?看来我不会赚钱,但有些人可能还是会失败。

10
如何处理无法复制的错误?
我有一个测试人员,在测试时会发生错误(到目前为止,还可以),但随后他经常立即报告该错误。然后,我们(开发人员)后来发现测试人员没有尝试重现该问题,并且(当被问到)找不到找到使该问题再次发生的方法。 现在这些仍然是错误,我不想忽略它们。但是如果没有复制步骤,我会陷入困境。有时会有堆栈跟踪(尽管通常它没有用,因为它是紧凑的框架,没有行号)。但是,如果有一个,我可以跟踪堆栈并破解代码并开始猜测,但这不会导致可测试的“修复”。 在这种情况下您会做什么?
22 bug  testing 

9
您如何看待“ Planning Poker”?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 规划扑克 摘要,以防您不想阅读维基文章: 获取您要为即将到来的迭代执行的任务列表 对于每个任务: 2.1与小组讨论该任务的含义 2.2每个人写下/选择一项任务所需的工作量 估算 值2.3每个人都透露其估算值2.4最高和最低异常值解释其推理 2.5重复直到达成共识 通常,类似于斐波那契数列中的数字(例如0、1 / 2、1、2、3、5、8、13、20、40、100)是允许的值,因此,对于诸如23与27。 此外,数字表示无单位努力价值,其价值由每个人都同意的基线任务确定,等于1,而其他所有任务都与此相对。 最终,目标是使给定团队的“速度”好起来,这是在给定迭代中可以完成的这些点的数量。这样,就可以对任何给定功能花费多长时间做出合理准确的估计。 我们在我工作过的一家公司的迭代计划会议上做到了这一点,我认为这是关于该特定公司的少数优点之一。所以,我想知道的是,有人使用过吗?您认为这是一个有用的估算工具吗?它在所有情况下都有效,还是适合某些团队,项目等?

14
在处理遗留代码时,如何克服自己的编码偏见?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 作为程序员,我们经常以我们的技能感到无比自豪,并对什么是“好”代码和“坏”代码持有非常强烈的意见。 在职业生涯中的任何时候,我们可能都会遗留下一些遗留系统,并以为“我的天哪,这段代码很烂!” 因为尽管它可能是功能完善,可维护的代码,但它不符合我们对好的代码的看法。 当您试图掌握其他程序员的工作时,如何做好心理准备?

14
大量的框架会使程序员感到沮丧吗?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 如今,有了所有可用的框架,ORM,依赖项注入(DI),控制反转(IoC)等,我发现许多程序员正在迷失或没有解决难题所需的解决问题技能。很多时候,我已经看到意外的行为蔓延到应用程序中,并且开发人员无法真正挖掘和发现问题。在我看来,对引擎盖下正在发生的事情的深刻了解正在丢失。 不要误会我的意思,我并不是在暗示这些框架不是很好,也没有使行业向前发展,只是问开发人员是否没有获得深入了解所需的知识和技能,这是意想不到的结果系统。

3
C#8非空引用和Try模式
在C#类中有一个模式,以Dictionary.TryGetValue和表示int.TryParse:一种方法,该方法返回指示操作成功的布尔值和包含实际结果的out参数;如果操作失败,则将out参数设置为null。 假设我正在使用C#8不可为空的引用,并且想为自己的类编写一个TryParse方法。在正确的签名是这样的: public static bool TryParse(string s, out MyClass? result); 因为在错误情况下结果为null,所以必须将out变量标记为可为空。 但是,通常使用Try模式,如下所示: if (MyClass.TryParse(s, out var result)) { // use result here } 因为我仅在操作成功时才​​进入分支,所以结果在该分支中永远不能为null。但是因为我将其标记为可为空,所以现在我必须检查它或使用它!来覆盖: if (MyClass.TryParse(s, out var result)) { Console.WriteLine("Look: {0}", result.SomeProperty); // compiler warning, could be null Console.WriteLine("Look: {0}", result!.SomeProperty); // need override } 这很丑陋,有点不符合人体工程学。 由于典型的使用模式,我还有另一种选择:关于结果类型: public static …
22 c#  .net  null 

4
微服务架构中的大文件/数据传输
我的公司目前正在努力采用微服务架构,但是在此过程中我们遇到了一些麻烦(令人震惊)。我们面临的主要争论点之一是如何在我们的不同服务之间传递大量数据。 作为背景知识,我们有一个文档存储,可作为我们可能需要在公司范围内处理的任何文档的存储库。与所述商店的交互是通过服务完成的,该服务为客户提供了唯一的ID和流文档的位置。以后可以通过使用提供的ID进行查找来访问文档的位置。 问题是-对于我们所有的微服务而言,是否为了与文档进行交互而接受此唯一ID作为其API的一部分有意义吗?在我看来,这本质上是错误的-服务不再是独立的,而是依赖于文档存储的服务。尽管我确实承认这可能会简化API设计,甚至可能会带来一些性能提升,但所产生的耦合效果远不止于此。 有谁知道彩虹独角兽(Netflix,亚马逊,谷歌等)如何处理服务之间的大文件/数据交换?

5
算法:如何将O(n)和O(nlog(n))求和?
我有以下算法,该算法查找重复项并将其删除: public static int numDuplicatesB(int[] arr) { Sort.mergesort(arr); int numDups = 0; for (int i = 1; i < arr.length; i++) { if (arr[i] == arr[i - 1]) { numDups++; } } return numDups; } 我试图找到这种情况下最坏的情况。我知道mergesort是nlog(n),在我的for循环中,我正在遍历整个数据集,因此算作n。我不确定该如何处理这些数字。我应该把它们加在一起吗?如果要这样做,我将如何做?

4
C ++中安全接口的模式是什么
此问题已从Code Review Stack Exchange 迁移,因为可以在Software Engineering Stack Exchange上回答。 迁移 5年前。 注意:以下是C ++ 03代码,但是我们希望在未来两年内升级到C ++ 11,因此我们必须牢记这一点。 我正在编写有关如何用C ++编写抽象接口的指南(针对新手)。我已经阅读了有关Sutter的两篇文章,在互联网上搜索了示例和答案,并进行了一些测试。 此代码不得编译! void foo(SomeInterface & a, SomeInterface & b) { SomeInterface c ; // must not be default-constructible SomeInterface d(a); // must not be copy-constructible a = b ; // must not be assignable …
22 c++ 

5
私钥存储在哪里?
假设我希望对软件的某些部分进行加密。例如,数据库的凭据等。我需要将这些值存储在某个位置,但是以明文形式存储将使攻击者更容易获得未经授权的访问。 但是,如果我加密了一些明文,那么该密钥存储在哪里?该软件可以访问的任何内容,无论混淆的级别如何,坚定的攻击者都可以访问: 假设密钥受文件系统的安全模型保护;但是(恶意)超级用户或不提供这种保真度的平台又如何呢? 或将密钥硬编码到软件二进制文件中,但始终可以将其反编译,那么开源软件或解释代码又如何呢? 如果生成了密钥,则此类算法将需要确定性(大概),然后将相同的问题应用于种子。 等等 密码学只有其链中最薄弱的一环才有力,这似乎是一个松散的环节!假设这是完成工作的正确工具(请嘲笑我),那么如何才能可靠地保护此类信息呢? 关于适合该工作的工具:例如,在服务访问(数据库,身份验证服务器等)的情况下,您可能会使用服务帐户(可能是某些服务级别)限制对该层的访问审核等),因此不必担心使用明文凭证。 但是,对我而言,这似乎还不够:我不希望任何人在他们不应该去的地方闲逛!

5
筛选前编码测试-多长时间才合理?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 编辑 在对该主题进行了大量思考和自我反思之后,我意识到我在此问题中提出的大多数问题仅来自个人而非专业角度。因此,主持人由于我试图谈论的问题的高度个人化和主观性而搁置了这个问题。我当时正在考虑改写这个问题,但是我真的找不到以更客观的方式来表达这个问题的可能方法,因此它可能成为讨论的主题,其中可以用某种证据或参考来支持答案。 为了那些仍然感兴趣的人,我试图总结一下这个问题引起的讨论: 面试前4个小时,通常不会进行场外编程测试,但是 许多人指出,对于某些公司,您面试的时间要长得多 是否进行测试是我们的个人决定,我们可以根据我们的情况和被公司聘用的可感知收益进行评估 所有公司都不同,就像人一样。如果公司适合他们的需求或情况,则使用更长的面试前异地测试是完全合理的。 我想让我最初的问题是关于期望我有四个小时的合理性,以及提出问题的道德标准,以便可以为公司使用解决方案(不是代码,而是设计)。正如我现在所看到的,只能(最多)在论坛讨论中探讨这两个问题,而不是使用诸如stackexchange之类的问答型社区工具。 但是,我发现您所有的答案都很有价值,并感谢您的分享。 原始邮件 我正在面试几个职位,其中大多数包括预筛选阶段,在此之前,我必须先进行编码测试,然后才能进行电话面试或现场面试。我已经习惯了这个想法,并且发现公司希望我这样做是很合理的,这样他们就可以检查我可以自己生产什么类型的作品。 通常,我的经验是这些类型的编码练习大部分是小型编程任务。做一些逻辑,也许执行一个小的算法,打开一个文件并读/写数据,诸如此类。即使是最简单的任务,也可以通过逻辑,可测试组件等的良好分离来实现,以查看应聘者的编码方式,通常是他对公司要完成的工作类型的准备程度。 最近,我遇到一家公司,该公司向我发送了编码测试,并在整页上详细介绍了他们的工作情况,要求我解决其业务的现实生活中的问题(我不想说具体的内容来保护公司,但该测试差不多是关于他们的工作)。他们描述了一个非常复杂的系统,其中包含真实数据,并且最终得出结论,编码测试不应超过4个小时。 一家公司期望我在业余时间花4个小时来完成他们的虚拟任务,这是合理的吗?(招聘人员向我发送了编码测试) 不要误会我的意思,我有找到新工作和新挑战的动力,但是大多数公司希望我在此类任务上最多花费1-2个小时,而这样的任务向来却不那么复杂。 我得出这家公司的结论是: 1)我的动力不好,可能他们在找别人 2)即使不对他们打招呼,他们也不尊重未来的员工会期望进行如此长时间的编码测试 3)他们只想给出他们正在解决的问题之一,看看是否有一个热情的年轻小伙子会免费为他们解决(再次,不要误会我不是阴谋论者,但我有听过这样的故事...) 您认为一家公司期望应聘者花时间进行虚拟编码测试而不与他们交谈是合理的吗?您一般有什么经验?
22 interview 

6
sizeof样式:sizeof(type)或sizeof变量?
我已经看到了两种sizeof用于与内存相关的操作的样式(例如in memset或malloc): sizeof(type)和 sizeof variable 要么 sizeof(variable) 您希望使用哪种样式,还是将两种样式混合使用?何时使用每种样式?每种样式的优缺点是什么,以及何时使用它们? 作为示例,我可以看到以下两种情况,其中一种样式有帮助,而另一种则无济于事: 当您得到错误的指针间接指示时: type *var; ... memset(var, 0, sizeof var); /* oops */ 当类型更改时: new_type var; /* changed from old_type to new_type */ ... memset(&var, 0, sizeof(old_type)); /* oops */
22 c  coding-style 

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.