软件工程

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

4
创建api时,我应该坚持使用小函数和多次调用,还是几次调用和大函数?
我有一个需要维护的Rails平台。它基于其构建了许多不同的Web应用程序。但是,现在客户正在请求一个API,以便他们可以将用户保留在其站点上,但可以利用我们拥有的一些自动化任务。 该平台用于构建保险应用程序,并允许其在线购买,以及提供下载与您的保单相关的文档的方式。 所以我在构建API时的问题是: 当我必须做很多事情,比如validate,创建user,user profile和policy,几乎在同一时间。我应该进行4个单独的API调用,并让客户端在其端进行4个调用。还是我应该打一个电话,该电话除了很多参数之外,可以验证客户端并同时创建所有这三个对象,从而简化客户端的操作? 在这种情况下,客户端可以同时获取所有必需的信息,因此它不像在其应用程序中有自然的流程那样暂停,它们可以对我的平台进行API调用。 在客户端上使用过许多API之前,我的直觉是尽可能简化客户端,让他们只进行一次调用。但是,这会导致functionsAPI 变得相当庞大,我也不喜欢这两者。 您如何建议我解决这个问题? 需要注意的是,我对客户端能否实现复杂的API并不十分有信心。

7
当构建几乎总是被破坏时如何保持效率
我在一个中型团队中工作,该团队共享相同的源代码,并且有持续的集成,但是由于我们所有人都必须在同一个分支中工作,因此构建几乎总是被破坏。 我们还有一条规则,该规则最近被引入以减轻损坏的构建,该规则指出在构建为红色时不允许任何人签入。 话虽这么说,一天中每个人都只有几个10-15分钟的窗口,我们可以在那里办理登机手续。 并且随着团队的成长,签到机会的窗口会进一步缩小。这迫使开发人员在本地积累他们的更改,从而导致更大的更改集,这甚至更加难以确保更改不会破坏任何内容。您可以看到恶性循环。 您能推荐什么使我在这样的环境中保持有效的工作。另外,请记住,我是开发人员,而不是经理,并且不能改变流程或其他人的行为。

1
交付Clojure桌面应用程序是否现实?
我目前正在运送桌面Java应用程序。这是一个普通的旧的Java 5 Java / Swing应用程序,到目前为止,一切正常。定位Java 5是因为某些用户使用的OS X版本/计算机永远都不会安装Java 6(我们可能很快会取消此限制,而改用较新的Java,而只是放弃使用Java 5的用户)。 我很快就开始了解Clojure,但我还没有真正做过很多Clojure-to-Java和Java-to-Clojure,我想知道是否交付Cloclore桌面应用程序而不是Java应用程序是否现实? 我正在运送的应用程序当前带有所有.jar约12 MB,因此添加Clojure似乎没有太大问题。 我的计划是使用Clojure调用Java API:我的应用程序已经划分为几个独立的jar。 如果我了解正确地从Java调用Clojure比从Clojure调用Java代码难,这就是为什么我基本上要重写所有UI(部分UI,混合Swing组件和自制BufferedImages的原因,无论如何都要重写)视网膜显示),并完成Clojure的所有“布线”。 这就是我面临的问题:交付Clojure桌面应用程序是否现实?(它当然似乎并不广泛,但是随后交付普通的Java桌面应用程序也不是那么普遍,而且我还是这样做了) 从技术上讲,需要做什么?(与交付Java应用程序相比)


4
该XOR值交换算法是否仍在使用或有用
当我刚开始工作时,大型机组装程序程序员向我展示了如何在不使用传统算法的情况下将它们交换为值: a = 0xBABE b = 0xFADE temp = a a = b b = temp 他们用来交换两个值(从一点到一个大的缓冲区)的是: a = 0xBABE b = 0xFADE a = a XOR b b = b XOR a a = a XOR b 现在 b == 0xBABE a == 0xFADE 它交换了2个对象的内容,而无需第三个临时存储空间。 我的问题是:这个XOR交换算法是否仍在使用,它仍然在哪里适用。
25 algorithms 


5
多个数据库访问还是一个大规模访问?
关于性能和最佳资源利用的更好方法是:通过AJAX多次访问数据库以仅在需要时获取所需的确切信息,或者执行一次访问以检索包含所有可能需要的信息的对象。,很有可能实际上并不需要全部吗? 我知道如何对实际查询进行基准测试,但是当成千上万的用户同时访问数据库时,我不知道如何测试数据库性能方面的最佳选择,以及连接池如何发挥作用。
25 performance  sql 

5
设计文档作为敏捷的一部分
在我的工作场所,我们面临的挑战是“敏捷”常常意味着“含糊的要求,不良的接受标准,好运!” 我们正在努力解决这一问题,作为一项总体改进工作。 因此,作为其中的一部分,我建议我们生成设计文档,这些文档要超出用户故事级别,并且能准确反映对系统中给定功能的效果进行初步调查的结果,并包括对我们所遇到问题的解答问生意。 有没有有效的标准呢? 我们目前面临的情况是,一项新功能可能会影响我们的“大泥巴”系统中的多个区域,并且由于这种技术债务,估计开始上升。希望更多周到的设计过程可以提供帮助。

6
如何修复基本上没有结构的项目?
我从事一个软件项目(主要是单独工作)已有5年以上。首先是一团糟(我是从事此工作的第三或第四位开发人员),尽管现在已不再是一团糟,但它仍然杂乱无章。使它得到控制的进展速度令人不寒而栗,我开始对它所处的状态感到沮丧。我如何真正开始修复它? 项目细节:这是一个销售程序,几乎完全用Visual Basic Classic(VB6)编写,带有MySQL后端和用C#编写的报表引擎。C#报表模块非常有趣,它只是在过去的几年中编写的,而在此之前所有报表都是在Crystal Reports 9中完成的(是的,我们仍然有一些报表依赖于此)。 但是,实际程序本身就是一场彻底的灾难。总的LOC数不足9万,注释约有1万行(大多数不是文档,而是注释掉的旧代码)。158个表单文件和80个模块文件。我不知道实际使用了多少个,因为程序的某些功能被简单地弃用了(有时是这样),而没有从程序中删除相关的代码。我猜想只有50%的代码可以实际用于生产。 我害怕触碰很多代码,只是因为我不确定我是否正在破坏一个晦涩的客户所依赖的东西,这种情况发生的次数超出了我的估计。就像整个代码中散布着地雷一样。 该项目实际上没有任何结构。到目前为止,除了在我耐心改革的几个地方之外,它不是面向对象的。如果需要在表单上获取数据,则可以实例化数据库对象,然后在函数中声明查询,然后执行查询并对数据集执行操作。 当我开始从事该项目时,没有使用任何源代码控制。我试图鼓励其他正在使用它的人使用它,但是我是新手,试图让人们使用Subversion的尝试全部失败了。该公司的首席开发人员在过去的几年中终于发现了一个软错误,并且他确保所有开发人员现在确实在所有项目上使用了源代码控制,因此至少可以取得一些进展。 我认为,如果我能够全职进行该项目的改革,我将能够取得不错的进展,甚至可以估算出我完成整个项目所需的时间,但是该项目正在积极使用中,我经常被要求扑灭火灾,修复错误,添加功能等。 那么,我如何开始真正解决这个问题呢?尝试使用其他语言来工具VB6吗?尝试在业余时间重写程序吗?还是这完全没有希望? 更新资料 这篇文章发表后,我怀着新的热情回到了这个项目,但是在看到如此缓慢的进展之后,在几个月内又陷入了绝望。然后,在接下来的一年左右的时间里,我又重复了此循环2到3次。 从那以后,我转到了另一份工作。尽管经过了很多年的vb6,并且只有其他技术的外围经验,但是搜索仍然很困难,而且我在此过程中遇到了很多拒绝(一年中约十二次采访)。在这种情况下,我对他人的建议是考虑单独考虑这一因素。考虑保持这样的死胡同对您的职业可能造成的损害。

1
C ++。Net是否被广泛使用?
我传统上是C ++编码器。在过去的12个月左右的时间里,我一直在进行许多C#编码,并为C#的务实方法感到惊讶(一旦我停止尝试对其进行编码,就好像它是“带有垃圾回收的C ++”一样)。 我们最近有一些毕业生,当帮助其中一名毕业生时,我意识到她正在C ++中使用.Net。在问了她为什么之后,她说她“被经理告知要使用C ++”。除了明显的通信问题外,我认为她正在使用.Net,因为这是她接触过的唯一框架。 然后,我遇到了一个高级开发人员的旧项目,该人员还使用C ++驱动Forms前端。现在,这应该是在.Net首次出现时写的,所以我认为这是他学习.Net的学习练习。这只是一个小型实用程序。 在这个应用程序中必须做一些小的修改,在我看来,使用C ++来驱动.Net会让您两全其美。没有垃圾收集或内存安全性,但是由于您正在管理托管框架,因此同样没有真正的速度/优化机会。 因此,我的问题是,人们是否确实将C ++ .Net用于任何大型独立(即非管道式)生产代码,如果是的话,您这样做的原因是什么?我自由地承认,我从未深入研究过C ++ .Net扩展,因此可能对我不利。
25 c++  .net 

8
对于初学者来说,最好的C ++源代码是什么?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 我正在尝试通过阅读c ++源代码来改进我的c ++编码技术。您会推荐哪个开源项目?Boost C ++库的代码是否不错?
25 c++  open-source 

6
依赖注入; 减少样板代码的良好做法
我有一个简单的问题,我甚至不确定它是否有答案,但让我们尝试。我使用C ++进行编码,并使用依赖注入来避免全局状态。这工作得很好,而且我不会经常出现意外/未定义的行为。 但是我意识到,随着项目的发展,我正在编写许多我认为很简单的代码。更糟糕的是:事实上,比起实际的代码,样板代码更多,因此有时很难理解。 没有什么比一个好的例子更好了,让我们开始吧: 我有一个名为TimeFactory的类,它创建Time对象。 有关更多详细信息(不确定是否相关):时间对象非常复杂,因为时间可以具有不同的格式,并且它们之间的转换既不是线性的也不是简单的。每个“时间”都包含一个同步器来处理转换,并确保它们具有相同的,正确初始化的同步器,我使用TimeFactory。TimeFactory只有一个实例,并且在应用程序范围内,因此它可以容纳单例,但是由于它是可变的,因此我不想将其设置为单例。 在我的应用中,很多类都需要创建Time对象。有时,这些类是深层嵌套的。 假设我有一个类A,其中包含类B的实例,依此类推,直到类D。类D需要创建Time对象。 在我的幼稚实现中,我将TimeFactory传递给类A的构造函数,然后将其传递给类B的构造函数,依此类推,直到类D。 现在,假设我有几个类(如TimeFactory)和几个类层次结构(如上一个类):我失去了使用依赖注入获得的所有灵活性和可读性。 我开始怀疑我的应用程序中是否没有主要的设计缺陷……或者这是使用依赖注入的必要弊端? 你怎么看 ?

5
确定算法是否为O(log n)
我正在刷新我的CS理论,我想知道如何识别算法O(log n)的复杂性。具体来说,有一种简单的方法可以识别它吗? 我知道O(n)通常是一个循环;O(n ^ 2)是一个双循环;O(n ^ 3)是一个三重循环,以此类推。O(log n)怎么样?

1
盒子模型:Internet Explorer与W3C
如今,Internet Explorer的“盒子模型”问题基本上已不再存在。大多数Web开发人员都放置一个<!DOCTYPE>标签来强制遵守标准,并且没有人真正在乎不再支持Internet Explorer 5.5。 但是,一些开发人员提出了主观的,概念性的观点来捍卫IE盒模型。他们声称IE盒子模型比W3C模型更“直观”,因为W3C模型可以测量盒子的内容,而IE模型可以测量盒子本身: 我可以看到他们的观点,但这基本上是一个主观论点,最重要的是符合标准。 但是,由于严重的实际原因,最近我更喜欢IE盒模型。W3C盒模型使将元素动态调整为另一个元素的确切屏幕上像素宽度变得困难。原因是style.width元素的属性未考虑元素在屏幕上的总大小:您还需要考虑任何其他边框和填充。如果两个元素都使用相同的CSS类,这不是问题-但是,如果它们具有不同的 CSS类,这将变得非常困难。 假设我们有两个div:A和B。A在html中硬编码为400px div,而B使用Javascript动态创建。在视觉上,我们希望B为A的确切宽度。在旧的IE Box模型下,这是微不足道的。我们简单地说:B.style.width = A.style.width甚至B.style.width = A.offsetWidth + "px"。 但是对于W3C盒式模型,这并不是那么简单。现在,我们还必须担心样式表。如果B与A具有相同的CSS类,我们可以说B.style.width = A.style.width。但是,如果不这样做,并且出于审美原因,我们可能不希望这样做,那么我们就有麻烦了。现在我们必须考虑A和B的边框和填充中的总像素。如果边框和填充以不一致的单位指定(由于边框通常为1px线,而边框通常是1px线,则这是常见的情况)可能在ems中指定)。然后,我们面临着转换为通用单位(em到px或px到em)的准不可能完成的任务。所有这些只是为了使两个div完全在屏幕上对齐。 因此,基本上,W3C盒子模型迫使我们在设置元素大小时考虑CSS边框和填充问题,而IE盒子模型则没有,因为宽度测量的是整个盒子的大小(尾到-end),而不是包装盒中的内容。这使得相对于元素动态调整大小变得容易得多。 所有这些似乎是一个非常有力的理由,而不是W3C模型来支持IE盒模型(至少从概念上讲-当然,实际上IE盒模型已经失效)。 问题:W3C为什么选择此盒型?我根本没有看到W3C盒模型的一些优点吗?还是我只是在这里夸大问题?

3
REST端点为预见的更改进行规划的建议模式是什么
尝试为具有变更前瞻性的外部应用程序设计API并非易事,但预先考虑可以使以后的生活变得更轻松。我正在尝试建立一个方案,以支持将来的更改,同时通过保留先前的版本处理程序来保持向后兼容。 本文的主要关注点是对于给定产品/公司,所有定义的端点应遵循哪种模式。 基本方案 鉴于基本URL模板https://rest.product.com/我设计,所有的服务都位于下/api沿/auth和其他基于非休息终点如/doc。因此,我可以如下建立基本端点: https://rest.product.com/api/... https://rest.product.com/auth/login https://rest.product.com/auth/logout https://rest.product.com/doc/... 服务端点 现在是端点本身。关注度POST,GET,DELETE不是本文的主要目的,是对这些行为本身的关注。 端点可以分为名称空间和动作。每个动作还必须以支持返回类型或所需参数的基本更改的方式显示自己。 在注册用户可以发送消息的假设聊天服务中,我们可能具有以下端点: https://rest.product.com/api/messages/list/{user} https://rest.product.com/api/messages/send 现在添加版本支持,以支持将来可能会中断的API更改。之后我们既可以添加版本签名/api/或之后/messages/。给定send端点,我们可以为v1提供以下内容。 https://rest.product.com/api/v1/messages/send https://rest.product.com/api/messages/v1/send 所以我的第一个问题是,版本标识符的推荐位置是什么? 管理控制器代码 因此,现在我们已经确定需要支持以前的版本,因此需要以某种方式处理可能随着时间而弃用的每个新版本的代码。假设我们正在用Java编写端点,则可以通过包来管理它。 package com.product.messages.v1; public interface MessageController { void send(); Message[] list(); } 这样做的好处是,所有代码已通过命名空间分隔开,其中的任何重大更改都将意味着服务端点的新副本。这样做的不利之处在于,需要复制所有代码,并且希望对每个副本都应用/测试希望应用于新版本和先前版本的错误修正。 另一种方法是为每个端点创建处理程序。 package com.product.messages; public class MessageServiceImpl { public void send(String version) { getMessageSender(version).send(); } // Assume we have …

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.