软件工程

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

8
如果多个操作以不同的状态结束,该返回什么HTTP状态代码?
我正在构建一个API,用户可以在其中请求服务器在一个HTTP请求中执行多项操作。结果以JSON数组的形式返回,每个动作一个条目。 这些操作中的每一个都可能彼此独立失败或成功。例如,第一个操作可能会成功,第二个操作的输入格式可能不正确,无法验证,第三个操作可能会导致意外错误。 如果每个动作有一个请求,我将分别返回状态码200、422和500。但是,现在只有一个请求时,我应该返回什么状态码? 一些选项: 始终返回200,并在正文中提供更多详细信息。 也许仅在请求中有多个动作时才遵循上述规则? 如果所有请求成功,也许返回200,否则返回500(或其他代码)? 每个动作只使用一个请求,并接受额外的开销。 完全不同吗?
72 api  http 

7
使用Python文件作为配置文件有多么糟糕的主意?
我一直使用JSON文件配置应用程序。我从编写大量Java时就开始使用它们,现在我主要从事服务器端和数据科学Python开发,并且不确定JSON是否是正确的选择。 我已经看到Celery使用实际的Python文件进行配置。最初我对此持怀疑态度。但是,使用简单的Python数据结构进行配置的想法开始对我产生影响。一些优点: 数据结构将与我通常在其中进行编码的结构相同。因此,我无需改变心态。 我的IDE(PyCharm)了解配置和代码之间的联系。Ctrl+ B使您可以轻松地在配置和代码之间跳转。 我不需要使用IMO不必要的严格JSON。我在看你双引号,没有结尾的逗号,也没有评论。 我可以在正在使用的应用程序中编写测试配置,然后轻松将它们移植到配置文件,而无需进行任何转换和JSON解析。 如果确实需要,可以在配置文件中执行非常简单的脚本。(尽管这应该非常非常有限。) 所以,我的问题是:如果我换了脚,我该如何射击自己的脚? 没有技能的最终用户将不会使用配置文件。对配置文件的任何更改当前都提交给Git,并作为连续部署的一部分部署到我们的服务器中。除非有紧急情况或正在开发中,否则无需进行手动配置更改。 (我考虑过YAML,但有关它的一些问题令我感到不适。因此,目前它不在美国的餐桌上。)

7
微服务系统架构如何避免网络瓶颈?
我已经阅读了很多有关服务器应用程序的微服务架构的信息,并且一直想知道与整体式架构相比,内部网络的使用是不是瓶颈或明显的劣势。 为了精确起见,以下是我对这两个术语的解释: Monolith体系结构:一个用一种语言处理所有功能,数据等的应用程序。负载平衡器将最终用户的请求分布在多台计算机上,每台计算机都运行我们应用程序的一个实例。 微服务体系结构:许多应用程序(微服务)处理一小部分功能和数据。每个微服务都公开通过网络访问的公共API(与同一机器上的进程间通信或共享内存相反)。API调用主要在服务器上进行搜索以生成页面,尽管其中一些工作可能是由客户端查询各个微服务来完成的。 用我天真的想象力,似乎微服务体系结构使用的网络通信速度较慢,而不是同一台计算机(内存和磁盘)上的资源更快。如何确保通过内部网络进行API查询不会减慢整体响应时间?

5
为什么C编译器这么少?
C是世界上使用最广泛的语言之一。它占现有代码的很大一部分,并继续用于大量的新代码。它受到用户的喜爱,它的广泛移植使能够运行C对许多平台的非正式定义而言,并因其是一种具有相对简洁功能的“小型”语言而受到其粉丝的称赞。 那么所有的编译器在哪里? 在桌面上,(实际上)有两个:GCC和Clang。考虑了几秒钟,您可能会记得英特尔也存在。还有很多其他的东西,对于普通人来说实在太晦涩难懂了,几乎没有普遍地去支持最新的语言版本(甚至常常是定义明确的语言子集,只是“子集”)。此列表的一半成员是历史脚注;其余大多数都是非常专业的,实际上还没有实现完整的语言。实际上很少有开源的。 Scheme和Forth-其他深受其迷们喜爱的小语言-可能比实际用户拥有更多的编译器。甚至像SML之类的东西,也要比C有更多“严肃”的实现方式可供选择。而针对验证的新的(未完成的)C编译器的发布实际上看到了一些相当负面的回应,而资深的实现则努力争取足够的贡献者甚至赶上C99。 为什么?实现C这么难吗?不是C ++。用户是否只是对其所属的复杂度组有一个非常歪斜的想法(即实际上它比Scheme更接近C ++)?


17
我怎样才能礼貌地请老板评论他的代码?
我的老板正在教我(我刚上完学,他想找一个有一点编程经验的人,所以他选择我来培训我该公司的专业知识),并开始使用ASP.NET MVC应用程序,一些HTML和CSS 。我对他给我的网页设计资料感到满意(无需弄清楚,就很容易理解)。 但是例如,他给我一个与ASP.NET MVC有关的任务,他的解释很好。但是他没有在他给我的代码中解释任何内容。(我们在Visual Studio 2013中使用源代码管理),因此它实际上是几百行代码,而对它应该做什么没有任何背景知识。我所看到的那种代码是我从未见过的代码,因此很难弄清楚。 我会尝试问他更多的问题,但是他一直在工作(这是他自己的事),我觉得他可能会被我遇到的所有这些问题烦恼。 因此,只有在我对事物有所了解之前,可以帮助我解决问题的方法,如何才能要求老板在他给我的代码中添加注释,但要礼貌些?
72 comments 

10
没有时间进行完整重构时,为遗留代码编写测试是否有意义?
我通常会尝试遵循《与Legacy Cod e 一起有效工作》一书的建议。我打破了依赖关系,将部分代码移到@VisibleForTesting public static方法和新类上,以使代码(或至少部分代码)可测试。并且我编写测试以确保在修改或添加新功能时我不会破坏任何东西。 一位同事说我不应该这样做。他的推理: 最初,原始代码可能无法正常工作。并且为它编写测试使将来的修复和修改变得更加困难,因为开发人员也必须理解和修改测试。 如果它是具有某些逻辑的GUI代码(例如〜12行,例如2-3 if / else块),则由于代码太琐碎而无法开始,因此测试不值得这样做。 类似的不良模式也可能存在于代码库的其他部分中(我还没有看到,我还很新)。一次大的重构就更容易清理它们了。提取逻辑可能会破坏这种未来的可能性。 如果我们没有时间进行完整的重构,是否应该避免提取可测试的部分并编写测试?我应该考虑这样做的不利之处吗?

14
我应该如何记起自己在做什么,以及为什么要在三个月前进行一个项目?
三个月前,我正在做一个项目,然后突然出现了另一个紧急项目,我被要求转移我的注意力。 从明天开始,我将回到旧项目。我意识到我不记得自己在做什么。我不知道从哪里开始。 我该如何记录一个项目,这样无论何时回头,离我离开任何地方都不会花费我几分钟的时间。有最佳做法吗?

5
项目规模和语言的严格程度之间是否存在关联?
我向我的一位同事解释了语言严格性和范式之间的区别,最后我断言: 诸如动​​态语言和解释语言之类的宽容语言最适合用于原型和小型项目或中型Web应用程序。当选择带有Node.js的优雅动态语言(例如Python或JavaScript)时,其好处是: 快速发展, 减少样板代码, 能够吸引年轻的,有创造力的程序员,他们逃离 Java之类的“企业语言”。 静态类型化/编译语言最适合要求更高严格性的应用程序,例如业务关键型应用程序或中型到大型应用程序。 数十年来发展起来的著名范例和模式, 易于进行静态检查, 能够找到许多具有数十年经验的专业开发人员。 严格的语言(例如Haskell,Ada)或技术(例如C#中的代码合同)更适合于优先考虑安全性而不是灵活性(即使Haskell可以非常灵活)的系统,例如生命攸关的系统和预计非常稳定的系统。好处是: 能够在编译时捕获尽可能多的错误, 易于进行静态检查, 易于形式证明。 但是,通过查看大型公司用于大型项目的语言和技术,看来我的主张是错误的。例如,Python已成功用于大型系统,例如YouTube或其他需要大量严格性的Google应用程序。 项目规模与应使用的语言/范例的严格程度之间是否仍然存在关联? 我忘记了要考虑的第三个因素吗? 我哪里错了?

8
使用分支维护同一软件的不同版本是否是一个好习惯?
我们的产品有几个不同的版本。区别是微小的:这里和那里的字符串不同,一个字符串中几乎没有其他逻辑,另一个字符串中几乎没有逻辑差异。开发软件时,大多数更改都需要添加到每个版本中。但是,有一些不需要,有一些需要有所不同。如果我有release-editionA和release-editionB(..etc)分支,是否可以有效使用分支?有陷阱吗?好的做法? 更新:感谢大家的见解,在这里有很多好的答案。普遍的共识似乎是为此目的使用分支是一个坏主意。对于任何想知道的人,我对该问题的最终解决方案是将字符串外部化为配置,并将不同的逻辑外部化为插件或脚本。
72 git  branching 

9
为什么要使用局部类?
以我的理解,该partial关键字什么也没有做,只是允许在几个源文件之间拆分一个类。除了代码组织之外,还有其他理由吗?我已经在生成的UI类中看到了它的用法。 似乎没有理由创建整个关键字。如果一个类足够大而需要多个文件,那么它可能做得太多。我以为您也许可以用它部分地定义一个类,供其他程序员在某个地方完成,但是最好创建一个抽象类。

12
SQL:空字串与NULL值
我知道这个话题有点争议,互联网上有很多各种各样的文章/观点。不幸的是,他们中的大多数人都假设该人不知道NULL和空字符串之间的区别是什么。因此,他们通过联接/聚集讲述令人惊讶的结果的故事,并且通常会做一些更高级的SQL课程。这样,他们绝对会遗漏所有要点,因此对我毫无用处。因此,希望这个问题和所有答案将使话题向前发展。 假设我有一个包含个人信息(姓名,出生等)的表,其中的一列是具有varchar类型的电子邮件地址。我们假设由于某些原因,某些人可能不想提供电子邮件地址。将此类数据(不带电子邮件)插入表时,有两个可用的选择:将单元格设置为NULL或将其设置为空字符串('')。让我们假设我知道选择一个解决方案而不是另一个解决方案的所有技术含义,并且可以为任何一种情况创建正确的SQL查询。问题是,即使两个值在技术层面上都不同,但在逻辑层面上却完全相同。看完NULL和”之后,我得出一个结论:我不知道那个人的电子邮件地址。也不管我怎么努力 我无法使用NULL或空字符串发送电子邮件,因此显然大多数SMTP服务器都同意我的逻辑。所以我倾向于在不知道该值的地方使用NULL,并认为空字符串是一件坏事。 经过与同事的激烈讨论,我提出了两个问题: 我是否假设使用空字符串作为未知值会导致数据库对事实“撒谎”,对吗?更准确地说:使用SQL关于什么是价值和什么不是价值的想法,我可能得出结论:我们拥有电子邮件地址,只是发现它不为空。但是后来,当尝试发送电子邮件时,我会得出一个矛盾的结论:不,我们没有电子邮件地址,@!#$数据库一定在撒谎! 是否有逻辑上的情况,其中空字符串”可以很好地承载重要信息(除了值和没有值),而通过其他任何方式(如附加列)进行存储都会很麻烦/效率低下。我见过很多帖子声称有时将空字符串与实数值和NULL一起使用是很好的,但是到目前为止,还没有看到一种合乎逻辑的方案(就SQL / DB设计而言)。 PS有些人会很想回答,这只是个人品味的问题。我不同意 对我来说,这是一个具有重大后果的设计决策。因此,我希望看到一些出于逻辑和/或技术原因而对此表示反对的答案。
72 design  database  sql  strings  null 


29
认证值得吗?
我即将完成编程专业的大学学位,并且正在探索进一步发展职业的下一步。我一直在考虑的一个选择是获得我想要从事的开发领域的认证或一系列认证。 这些认证值得时间和金钱吗?雇主在他们身上有很多价值吗?
72 skills 

30
指针有什么好的解释?[关闭]
在您自己的学习中(无论是自己学习还是上课),当您最终真正理解指针时,您是否有一个“啊哈”时刻?您对初学者使用的解释是否似乎特别有效? 例如,当初学者第一次在C语言中遇到指针时,他们可能只添加&s和*s,直到它编译为止(就像我自己曾经做的那样)。也许是一张图片,或者是一个动机很好的例子,使指针为您或您的学生“点击”。那是什么,在那之前您尝试了什么却似乎没有用?是否有任何主题的前提条件(例如结构或数组)? 换句话说,当您可以放心使用&s和时*,要理解它们的含义是什么?仅学习语法和术语或用例还不够,有时需要将想法内在化。 更新:到目前为止,我真的很喜欢答案。请让他们来。这里有很多不错的观点,但是我认为在我们将概念内部化之后,许多都是对自己的很好的解释/口号。我正在寻找黎明时分的详细情况和情况。 例如: 我在语法上只稍微了解了C指针。我听到我的两个朋友向另一个朋友解释了指针,后者问为什么将a struct与指针一起传递。第一个朋友谈论了如何引用和修改它,但这只是另一个朋友的简短评论,它打动了我:“它也更有效率。” 我需要的最后一个概念上的转变是传递4个字节而不是16个字节。

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.