软件工程

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

4
使用C ++和MySQL构建Web应用程序是否存在任何概念上的弊端?
我继承了一个非常有趣的项目,在这里有一个很好的机会将现有软件移植到SaaS Web应用程序中。随着项目的继承,代码库/框架已经定义为C ++和MySQL。该应用程序本身已编译并在Windows Server上作为EXE运行。UI是基于Web的,该应用程序可作为一种服务器使用。根据我对现代Web应用程序的了解,这也许是一个不寻常的选择。如今,大多数人似乎选择使用PHP框架或Ruby on Rails。当然,这是我从阅读有关该主题的博客中获得的印象。因此,我非常想知道MySQL支持的C ++ EXE是否是Web应用程序的坚实基础,还是我们是否应该以其他方式构建?

4
如何避免抽象类的通用名称?
通常,最好避免将诸如“ handle”或“ process”之类的单词作为例程名称和类名称的一部分,除非您要处理(例如)文件句柄或(例如)unix进程。但是,抽象类通常并不真正知道它们除了处理之外还打算做什么。在当前情况下,我有一个“ EmailProcessor”,它可以登录到用户的收件箱并处理来自该收件箱的消息。尽管我注意到出现了以下样式问题,但我仍然不清楚如何给它一个更精确的名称: 更好地将派生类视为客户端,并通过其实现的功能的一部分来命名基类?给它更多的含义,但会违反is-a。例如,EmailAcquirer是一个合理的名称,因为它是为派生类获取的,但是派生类将不会为任何人获取。 或只是名字含糊不清,因为谁知道派生类将做什么。但是,“处理器”仍然过于笼统,因为它正在执行许多相关的操作,例如登录和使用IMAP。 摆脱这种困境有什么办法吗? 对于抽象方法,问题更加明显,在抽象方法中,您不能真正回答“这是做什么的”问题。因为答案仅仅是“客户想要的任何东西”。

5
五个新的初级开发人员和许多复杂的任务。现在做什么?
我们公司已经雇用了五名新的初级开发人员来帮助我开发我们的产品。不幸的是,与新近毕业的开发人员相比,新功能和即将到来的错误修复通常需要更深入的知识(线程/并发,调试复杂系统中的性能瓶颈等)。 委派(和计划)他们(可能)可以解决的任务,回答他们的问题,指导/管理他们,检查他们的代码用尽了我的全部时间,而且我常常觉得我可以比整个委派过程花费更少的时间来解决问题(仅计算我的时间)。另外,我没有时间解决需要更深入的系统知识/更高级技能的任务,而且似乎在不久的将来它不会改变。 那么,现在是什么?我应该怎么做才能有效地利用他们和我的时间?

5
如何对重构为策略模式的功能进行单元测试?
如果我的代码中有一个像这样的函数: class Employee{ public string calculateTax(string name, int salary) { switch (name) { case "Chris": doSomething($salary); case "David": doSomethingDifferent($salary); case "Scott": doOtherThing($salary); } } 通常,我会使用工厂类和策略模式将其重构为使用多态性: public string calculateTax(string name) { InameHandler nameHandler = NameHandlerFactory::getHandler(name); nameHandler->calculateTax($salary); } 现在,如果我正在使用TDD,那么calculateTax()在重构之前,我将对原始版本进行一些测试。 例如: calculateTax_givenChrisSalaryBelowThreshold_Expect111(){} calculateTax_givenChrisSalaryAboveThreshold_Expect111(){} calculateTax_givenDavidSalaryBelowThreshold_Expect222(){} calculateTax_givenDavidSalaryAboveThreshold_Expect222(){} calculateTax_givenScottSalaryBelowThreshold_Expect333(){} calculateTax_givenScottSalaryAboveThreshold_Expect333(){} 重构后,我将具有Factory类NameHandlerFactory和的至少3个实现InameHandler。 我应该如何重构我的测试?我应该claculateTax()从中删除单元测试,EmployeeTests并为的每个实现创建一个Test类InameHandler吗? 我也应该测试工厂课程吗?

1
使用Bit Torrent进行内部发布管理
我们目前正在滥用我们的版本控制系统并使用它...几乎就像一个FTP,用于存储较大的发行版二进制文件(4+ GB)。 我们正在寻求摆脱这种可怕的做法,这种做法已经并且继续发展,并在破坏集成和发布流程的同时占用了越来越多的IT资源。 一种解决方案是使用P2P文件共享来分发这些发行映像/二进制文件,将文件服务器和一些关键的用户计算机混合为种子。 所以我的问题分为两个部分: 你们有没有人在内部网中设置BitTorrent来发布发行映像/二进制文件?如果没有,您对此想法有何看法(实际上不是我的BTW,但我认为这很棒) 是否存在用于处理BitTorrent跟踪器发布的基于Web的开源软件,以便在有新版本发布时可以对其进行搜索并显示其在种子和水方面的可用性?(...你知道我的意思) 编辑:Intranet是全球性的(例如,美国,中国,德国,墨西哥)。常规的FTP可以工作,但是并不划算。

2
使用未经修改的GPL(v2 +)程序作为核心依赖项运行软件即服务:是否必须发布SaaS源代码?
我正在设计一个软件即服务项目,该项目只能在线访问。我可能对GNU GPL(v2或更高版本)所涵盖的可执行文件有严格的依赖性。 我了解我的代码(如果要分发的话)也必须按照GPL条款进行分发。我非常确定,通过网络运行服务不会传递/分发代码。因此,我是否认为可以使用GPL依赖关系而不必披露我的所有代码是否正确? 为此,我可以提供一个具体的示例:假设我在在线文档处理系统上进行设计,就像Google Docs。我希望能够基本上将任何文件类型上传到系统中,并将其转换为任何内部格式。与其尝试创建一个转换器,不如使用一个我知道的可以进行转换的现有程序。该程序是具有GNU GPL v2(或更高版本)许可的可执行文件。我可以在不提供源代码的情况下合法拥有软件即服务吗?



4
弗雷德·布鲁克斯(Fred Brooks)的“外科团队”是否有效处理公交因素?
我的团队由4名经验丰富的开发人员组成,致力于大型模块化Windows应用程序(约200 KLoC)。自从项目开始(3年前)以来,我一直专注于核心代码库,尽管我不是团队经理,但已经逐渐转移到半领导开发人员的职位。 我们当前的迭代是高层管理人员要求的高优先级UI刷新,其中涉及对核心代码库的约15项更改。当经理询问时,我估计15项更改中的每项更改都需要不到4个小时来完成,总共不到7个工作日。然后,我自愿参加了这项工作。相反,经理决定将所有15个任务平均分配给所有四个开发人员。 从开始工作的三天里,我观察到两件事: 其他经验不足的团队成员每人完成大约1个或更少的任务。 布鲁克定律的实际应用:我花了大约一半的时间提供帮助(试图指导他们如何使用组件)。结果,我自己只完成了2个任务,而不是预期的5或6个任务。 我担心上班时间太晚,向经理咨询,并再次建议我完成剩余的任务。我的请求被拒绝,并且所述平均分配负载的原因有两个: 限制卡车/公共汽车的因素 -现在提高其他开发人员的技能,以便将来可以将任何工作提供给任何人,而不仅仅是我。 消除“瓶颈”(我)并更快地完成工作。 明确地说,我在以下方面没有问题:a)花时间进行教学,b)接触我的代码的人员,或c)工作安全。实际上,我经常向团队负责人建议,我会在核心代码库的某些方面对其他开发人员进行培训,以降低风险。 在此迭代中,我们还针对了许多高优先级的错误修复程序,因此,如果重新分配工作负载,似乎可以取得更大的进步。 在《神话人月》中,布鲁克斯建议建立一个“ 外科团队 ”,其中每个团队都由领导+副领导(经理和我)以及一些次要角色组成。我觉得我们很自然地会加入这个组织,但我的经理正在与之抗衡。我觉得总线因素已经得到解决(经理在核心代码中很精通),并且瓶颈实际上并不存在(让更多开发人员参与进来不会使工作进展更快)。在这方面,我认为手术团队是件好事。 这些是我的感受,但我不是经验丰富的经理,我们也不必处理公车因素(敲木头)。布鲁克斯说的对吗?您是否曾在公交因素发挥作用的“外科团队”中工作?是否有更好的技术来管理分销专业知识? 类似问题: 如何同时增加总线系数和专业性? /software/103718/always-keeping-2-people-expert-on-any-one-chunk-of-code

8
急于开发Web的客户端
在过去的几个月中,我意识到Web开发中的客户端脚本令人兴奋。但是,尽管服务器端技术已经成熟,稳定并且为后端开发人员所接受,但是客户端技术还不成熟(即与大型服务器端框架相比),并且被许多历史悠久的开发人员所讨厌。然而,如今,每个人都在进行客户端开发。我个人希望大型服务器端框架在2-5年内消失,并关注当前趋势。 为什么会这样?用HTML5 / JS开发的新的和“分散的”客户端怎么可能优于大型且经过深思熟虑的服务器端解决方案?

5
TDD:模拟出紧密耦合的对象
有时只需要紧密耦合对象即可。例如,一个CsvFile类可能需要与CsvRecord该类(或ICsvRecord接口)紧密配合。 但是,从我过去的经验中学到,测试驱动开发的主要宗旨之一是“永远不要一次测试一个以上的类”。表示您应该使用ICsvRecord模拟或存根,而不是的实际实例CsvRecord。 但是,在尝试这种方法之后,我注意到嘲笑CsvRecord该类可能会变得有些毛茸茸。这使我得出以下两个结论之一: 编写单元测试很困难!那是代码的味道!重构! 模拟每个依赖项是不合理的。 当我用实际CsvRecord实例替换模拟对象时,事情进行得更加顺利。当寻找其他人的想法时,我偶然发现了这篇博客文章,该文章似乎支持上面的第二点。对于自然紧密耦合的对象,我们不必太担心模拟。 我会偏离轨道吗?以上假设2有不利之处吗?我是否真的应该考虑重构设计?
10 tdd  coupling  mocking 

5
测试大型应用程序的方法
我有一个很大的PHP应用程序。通常有2-3个开发人员全职从事这项工作,而现在我们正在进行更改并创建错误(咳嗽功能!)。每个人说的软件并不复杂,只是发生了很多事情(35个控制器,大约相同的型号,等等)。 即使小心,更改此视图(更改元素上的id)也很容易破坏在某些特殊条件下(单脚站立时注销)发生的ajax查询。 首先想到的是单元测试,但是我们在另一个应用程序上进行了尝试,很容易忘记它们/或花更多的时间编写测试然后进行测试。我们确实有一个临时环境,可以在上线之前检查代码。 也许我们需要兼职Q / A人员? 任何人都有任何建议/想法。

3
OAuth2流程-服务器是否可以通过Auth服务器进行验证?
我已经阅读了很多有关OAuth2的文章,试图弄清楚它,但是我仍然对某些事情感到困惑。 我了解到客户端已向OAuth提供者(例如Google)授权,并允许资源服务器访问用户的个人资料数据。然后,客户端可以将访问令牌发送到资源服务器,并获得资源。 但是,在任何文档中似乎都没有涵盖的内容是,当客户端应用向资源服务器请求资源并向其传递访问令牌时,会发生什么。到目前为止,我阅读的所有内容都指出资源服务器只是以请求的资源作为响应。 但这似乎是一个巨大的漏洞,资源服务器肯定必须以某种方式验证访问令牌,否则我可以伪造任何旧请求并传递旧的,被盗的,伪造的或随机生成的令牌,它只会接受它。 谁能指出我对OAuth2的简单理解,因为到目前为止,我阅读的内容仍不完整。
10 security  oauth2 

1
一个人可以编辑一个内置的Python模块吗?
我目前正在学习Python,并且在本书中谈到使用数学库。我浏览了Python网站,发现该库有点稀缺,正在编写一些更有用的函数。例如,我继续写了一个函数来获取系数并返回方程的根。本质上是二次公式函数。我想知道是否可以将其添加到python Math库中。如果不是,如何保存它,以便可以通过调用它在其他编写的Python程序中使用该函数?

5
如何处理代码重用的哲学?
在开始新项目时,我经常发现自己在考虑代码重用。 我应该在多大程度上使代码可重用? 我应该将其限制在应用范围内还是应该使其在项目外部可重用? 有时候,我觉得代码的可重用性可能会妨碍简单的设计。请分享您对代码可重用性的理解和方法。

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.