软件工程

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

3
我应该在锁语句中放置多少工作?
我是一名初级开发人员,致力于为从第三方解决方案接收数据,将其存储在数据库中,然后将数据整理以供其他第三方解决方案使用的软件编写更新。我们的软件作为Windows服务运行。 查看以前版本中的代码,我看到以下内容: static Object _workerLocker = new object(); static int _runningWorkers = 0; int MaxSimultaneousThreads = 5; foreach(int SomeObject in ListOfObjects) { lock (_workerLocker) { while (_runningWorkers >= MaxSimultaneousThreads) { Monitor.Wait(_workerLocker); } } // check to see if the service has been stopped. If yes, then exit if (this.IsRunning() == …
27 c#  .net  concurrency  locks 

2
谁应该阅读Exception.Message(如果有的话)?
在设计异常时,我应该编写用户或开发人员应该理解的消息吗?谁真正应该是异常消息的阅读者? 我发现异常消息根本没有用,我总是很难编写它们。按照约定,异常的类型应该已经告诉我们为什么某些事情不起作用,并且自定义属性可能会添加更多信息,例如文件名,索引,键等。那么为什么在消息本身中重复它呢?自动生成的消息也可以执行此操作,它所必须包含的就是带有其他属性列表的异常名称。这和手写文本一样有用。 根本不编写消息,而是使用特殊的异常渲染器来处理可能创建于不同语言中的有意义的消息,而不是用代码对其进行硬编码,这会更好吗? 我被问到这些问题中的任何一个是否都可以回答我的问题: 如何编写好的异常消息 为什么许多异常消息不包含有用的详细信息? 我读过他们两个,但对他们的回答感到不满意。他们通常谈论用户,并着重于消息本身的内容,而不是收件人,事实证明,至少可以有两个用户:最终用户和开发人员。我永远不知道在编写异常消息时应该和哪个人说话。 我什至认为这条著名的消息根本没有任何真正的价值,因为它只是用不同的词来重复异常类型的名称,所以为什么还要费心编写它们呢?我可以完美地自动生成它们。 对我而言,异常消息缺乏读者的区分。一个完美的例外将需要提供至少两个消息版本:一个针对最终用户,一个针对开发人员。仅将其称为消息太笼统了。然后,应该用英语编写开发人员消息,但最终用户的消息可能需要翻译成其他语言。仅用一条消息是不可能实现所有这些的,因此异常将需要为最终用户消息提供一些标识符,正如我刚才所说的,该标识符可能以不同的语言提供。 当我阅读所有其他链接的问题时,我得到的印象是,异常消息的确是由最终用户而非开发人员阅读的……一条消息就像也要吃蛋糕一样。

3
在单页面应用程序中处理浏览器缓存
我试图弄清楚如何正确处理单页应用程序的Web浏览器缓存。 我有一个非常典型的设计:实现SPA的几个HTML,JS和CSS文件,以及SPA消耗的一堆JSON数据。当我要推送更新时会出现问题:我同时更新了网站的静态部分和同时生成JSON的代码,但是客户端浏览器通常缓存了静态部分,因此旧代码尝试处理新数据并可能(取决于所做的更改)遇到问题。(特别是,在使用缓存的JS而无需重新验证的情况下,IE似乎比Chrome或Firefox更具攻击性。) 处理此问题的最佳方法是什么? 确保我的JSON更改向后兼容,并假定浏览器缓存将在合理的时间范围内到期。 在静态JS和JSON中都嵌入某种版本号,然后window.location.reload(true);在它们不匹配时执行。 找出标题的适当组合(must-revalidate或no-cache其他方式;有关执行此操作的方法,来源 会有所不同),以确保浏览器始终在每次加载时重新验证所有资源,即使这意味着要进行几次额外的往返加载网站。 微管理我的缓存控件并使标头过期,以便在我要推送更新时静态内容过期。 还有吗

3
为什么“胖二进制文件”没有更广泛地用于跨平台应用程序?
据我所知,所谓的“胖二进制文件”(包含用于多个系统的机器代码的可执行文件)仅在Apple PC上真正使用过,甚至在那里似乎它们仅使用它们是因为它们需要从PowerPC到x86。 如今,许多软件都是跨平台的,似乎制作单个胖二进制文件比跟踪操作系统和体系结构的每种组合的十几个左右不同的下载要简单得多,更不用说以某种方式传达给客户他们想要哪一个。 关于这种方法为何从未流行的原因,我可以提出很多猜测,例如: 缺乏交叉编译工具使多操作系统二进制文件不可行 无论如何,您都需要在每个操作系统上测试代码,因此您已经必须拥有可以针对每个操作系统进行本地编译的系统 显然,32位程序已经可以在64位计算机上“正常工作” 动态链接在每个OS上的工作方式都不同,因此即使“胖应用程序”可以运行“胖库”也可能不起作用 但是由于我一直在使用一个库或框架来向我隐藏所有这些特定于操作系统和特定于体系结构的详细信息,所以我不知道这些内容到底有多真实,或者是否还有更多我不知道的问题关于。那么,为什么通常不使用胖二进制文件来创建多体系结构和/或多OS软件的实际原因是什么?(Apple以外)

6
将基本类型(如int)实现为类的注意事项是什么?
设计和implenting面向对象的编程语言时,在某些时候你必须做出有关实现基本类型的选择(例如int,float,double或等价物)类或其他什么东西。显然,C系列语言倾向于不将其定义为类(Java具有特殊的原始类型,C#将其实现为不可变的结构,等等)。 当基本类型实现为类时(在具有统一层次结构的类型系统中),我可以想到一个非常重要的优势:这些类型可以是根类型的适当Liskov子类型。因此,我们避免使用装箱/拆箱(显式或隐式),包装器类型,特殊方差规则,特殊行为等使语言复杂化。 当然,我可以部分理解语言设计者为什么要决定他们的工作方式:类实例往往会有一些空间开销(因为实例可能在其内存布局中包含vtable或其他元数据),因此原语/结构不需要拥有(如果语言不允许继承这些语言)。 空间效率(以及改善的空间局部性,尤其是在大型阵列中)是基本类型通常不是类的唯一原因吗? 我通常认为答案是肯定的,但是编译器具有转义分析算法,因此当实例(任何实例,不仅仅是基本类型)被证明是严格的时,它们可以推断出是否可以(有选择地)忽略空间开销本地。 以上是错误的,还是我还缺少其他东西?

13
为什么编程语言不能自动管理同步/异步问题?
我没有找到很多有关此的资源:我想知道是否有可能/以同步方式编写异步代码的好主意。 例如,下面是一些JavaScript代码,该代码检索数据库中存储的用户数(异步操作): getNbOfUsers(function (nbOfUsers) { console.log(nbOfUsers) }); 能写这样的东西会很好: const nbOfUsers = getNbOfUsers(); console.log(getNbOfUsers); 因此,编译器将自动处理等待响应的内容,然后执行 console.log。在必须将结果用于其他任何地方之前,它将始终等待异步操作完成。我们将减少回调承诺,异步/等待或其他方法的使用,并且不必担心操作结果是否立即可用。 nbOfUsers使用try / catch或类似Swift中的可选参数仍然可以管理错误(得到整数还是错误?)语言。 可能吗?这可能是一个可怕的主意/乌托邦……我不知道。

6
方法提取与基本假设
当我将大方法(或过程或函数)拆分为特定于OOP的问题时,但由于我99%的时间都使用OOP语言,这是我最熟悉的术语,所以请分成许多小方法,我经常发现自己对结果不满意。与这些小方法只是大代码中的代码块相比,要推理这些方法变得更加困难,因为当我提取它们时,我失去了很多来自调用者上下文的基础假设。 后来,当我查看这段代码并看到各个方法时,我不立即知道它们从何处调用,而是将它们视为可以从文件中任何位置调用的普通私有方法。例如,想象一下一个初始化方法(构造方法或其他方法)分成一系列小的方法:在方法本身的上下文中,您清楚地知道对象的状态仍然无效,但是在普通的私有方法中,您可能会假设该对象已经初始化并且处于有效状态。 我所看到的唯一解决方案是whereHaskell中的子句,该子句允许您定义仅在“父”函数中使用的小函数。基本上,它看起来像这样: len x y = sqrt $ (sq x) + (sq y) where sq a = a * a 但是我使用的其他语言没有这样的东西-最近的事情是在本地范围内定义lambda,这可能会更加令人困惑。 因此,我的问题是-您是否遇到了这个问题,甚至看到了这个问题吗?如果这样做,通常如何解决,特别是在“主流” OOP语言中,例如Java / C#/ C ++? 编辑重复项:正如其他人所注意到的,已经有讨论拆分方法的问题和只有一线的小问题。我阅读了它们,他们没有讨论可以从调用者的上下文派生出来的基础假设的问题(在上面的示例中,对象已初始化)。这就是我的问题的重点,这就是为什么我的问题与众不同。 更新:如果您关注下面的问题和讨论,您可能会喜欢John Carmack的这篇文章,尤其是: 除了了解正在执行的实际代码外,内联函数还具有无法从其他位置调用该函数的好处。这听起来很荒谬,但是有一点是正确的。随着代码库在多年使用中的增长,将有很多机会采用快捷方式并仅调用仅执行您认为需要完成的工作的函数。可能有一个FullUpdate()函数调用PartialUpdateA()和PartialUpdateB(),但是在某些特定情况下,您可能意识到(或认为)您只需要执行PartialUpdateB(),并且通过避免使用其他方法可以提高效率。工作。大量的错误源于此。大多数错误是由于执行状态不完全符合您的想法而导致的。

1
在软件即服务(SaaS)模型中使用完整GPL库
我已经搜索了该站点,但是我只能找到与人们将要销售/发行的软件中使用GPL库有关的答案。在这种情况下,答案是他们还必须使源代码可用。 SaaS呢?也就是说,我将构建一个应用程序,客户将支付月租费以通过Internet使用,他们将不会下载任何内容或访问代码。 问题: 在这种情况下,我是否可以使用完整的GPL库而不必使我的源代码可用? 即使我的模型是SaaS,我还应该了解GPL的其他限制/要求吗?

3
是什么使BEM优于使用LESS之类的可嵌套样式表语言?
我的一位同事在他主持的项目中大力推动CSS 的BEM(块元素修改器)方法,而我只是无法理解是什么使它比我们多年来编写的LESS CSS更好。 他声称“性能更高”,但是我无法想象性能甚至对我们在此代码店中编写的各种Web应用程序有多重要。我们不在这里制作Twitter或Facebook。如果我们使用率最高的应用程序每月点击量超过10000 ,而大多数都低于1000,我会感到非常惊讶。 他声称具有“可读性”和“重用性”,但我认为LESS已经做得更好。而且我认为BEM会为这些超长类名添加许多额外的专用字符,从而严重破坏了标记,从而从根本上降低了可读性。 他声称“嵌套CSS是一种反模式”。“反模式”到底是什么意思,为什么嵌套CSS不好? 他声称“每个人都在使用BEM,因此我们也应该这样做。” 我的计数器是“如果每个人都从桥上跳下来,您会跟随吗?” 但是他仍然对此完全坚决。 有人可以详细解释什么使BEM优于LESS吗?我的同事完全无法说服我,但是我不知道我是否只能选择跟随。我真的很希望能够欣赏BEM,而不是勉强地接受它。
27 css  less 


3
在服务器端vs客户端vs混合中构建Web应用程序?[关闭]
当前有多种构建Web应用程序的方法: 1.仅服务器端 这是一种经典方法,您可以通过Ruby on Rails,Django,Express,Play等Web框架在服务器上呈现页面。框架等 典型的工作流程:在您选择的框架中,在服务器上构建所有业务逻辑,模型和视图模板。 2.客户端+ REST API 不久之前,整个Web社区开始在Angular,Backbone,Ember和其他几十个JavaScript MV *框架中构建客户端应用程序。现在我们也有React.js参加了聚会。 更新:没有误会。我所说的客户端仅是完全分离关注点。您有REST API服务器和与该服务器通信的客户端应用程序。根据您的用例,您将永远不会有一个真正的仅客户端应用程序,该应用程序既不连接到后端也不进行身份验证或数据持久化。 典型的工作流程:花几个小时来确定Angular,Backbone,Ember和X。然后在客户端上构建路线,模型,视图,控制器。完成后,现在在服务器上构建模型,控制器,路由。从某种意义上说,您正在做两倍的工作。 3.混合动力 我对使用这种方法了解不多,但是如果我猜测的话,您可以在服务器上呈现视图(MVC框架的视图)。结果,您可以获得SEO支持以及更快的页面加载速度。 在Hybrid前端,有Airbnb的rendr,据说它结合了主干并表达在一起。 Eric Florenzo今天在他的博客上发布了:React:最后,一个很棒的服务器/客户端Web堆栈。 构建Web应用程序的方法数量不胜枚举。对于正在学习Web开发的人来说,这可能会成为一个问题。如何决定使用哪种方法来构建其下一个应用程序?

5
此类解析器的名称,或为何不存在
常规解析器消耗其全部输入并生成单个解析树。我正在寻找一个消耗连续流并产生一个解析林的人[ 编辑:请参见注释中有关为什么使用该术语可能不合常规的讨论 ]。我的直觉说我不能成为第一个需要(或认为我需要)这样的解析器的人,但是我已经反复搜索了几个月,无济于事。 我认识到我可能会被XY问题所困扰。我的最终目的是解析文本流,忽略其中的大部分内容,并从识别出的部分中生成解析树流。 所以我的问题是有条件的:如果存在具有这些特征的一类解析器,那叫什么呢? 如果没有,为什么不呢? 有什么选择?也许我缺少使常规解析器执行我想要的方式的某种方式。
27 parsing 

4
什么是CPU寄存器?
这个问题已经困扰了我一段时间,今天我想我会谷歌搜索它。我已经阅读了一些有关它的内容,它看起来与我一直称为处理器缓存的内容非常相似。 两者之间有区别吗?或者当我认为它们相同时我是对的吗?寄存器实际上是否必须位于CPU内部才能正常工作? 根据维基百科,寄存器是CPU中的一个位置,可以在将其发送回RAM之前快速访问和修改内存。我是否理解这是错误的,还是缓存和寄存器实际上相同?

8
作为Scrum Master的开发经理有哪些不利条件?
人们普遍认为,团队经理不应该是Scrum的主人,但是我在努力地寻找原因。对于上下文,我是一个Scrum团队中的4个开发人员的应用程序开发经理。我来自Scrum Master的背景,并向组织介绍了Scrum。我从头开始建立了团队,并明确表示我所做的一切都是为了促进团队的工作,并且他们会做出决定。作为一个团队,我们非常开放-他们甚至在站立时让我沉默了一段时间,以消除我们开始获得的“报告”感觉。缺乏开放性通常是反对经理作为Scrum Master的最大理由,但处理得当,可以通过正确的文化轻松克服。 经验丰富的Scrum教练已警告过我,这是一种危险的情况,并且存在“万一情况不佳”的风险。我认为两个职位不会冲突,在这两个角色中,我对团队和个人的目标都是相同的。Scrum解决了团队内部的冲突,该冲突传统上可以是经理角色。冲刺的自我管理性质消除了经理传统上要做的工作分配。 作为开发经理,我真正剩下的就是确保满足个人需求,职业目标,工作场所等。我每周都会与每个团队成员进行交流,以提出任何问题并处理任何管理任务。其中很多与团队直接相关,或者与我作为Scrum Master的角色直接相关。 我知道在大型组织中这是如何难以管理的,并且是一个单独的角色,但是对于小型组织,我们当然不能为另一个Scrum Master或Development Manager辩护。 请告知我开发经理作为Scrum Master的陷阱,不包括我上面提出的和已经克服的要点。
27 scrum  teamwork  team  roles 

2
什么是ASM.js,对每个人意味着什么?
我开始听到有关这个名为ASM.js的项目的传闻。目前,他们的网站糟糕透顶。这是我在网络上的研究所知道的。 它是可以高度优化的JavaScript的子集。我猜是因为它避免了语言的动态部分。 编译为ASM.js的代码的性能大约是C的一半(不是很轻)。 目的是使编译器使其目标语言为ASM.js。 Firefox将随ASM.js优化一起发布。 Mozilla和Unreal团队通过它将Unreal Engine移植到了Web上,并以接近本地的速度运行在Firefox版本中。 网上似乎没有关于这到底是什么,有用性或最终目的的任何具体信息。是否可以编译本来可以在服务器端运行的代码库,并使其以接近本机的速度在浏览器中运行?对开发人员有什么影响?

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.