软件工程

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

9
我们应该避免在不断变化的项目中使用设计模式吗?
我的一个朋友正在一家小公司工作,每个开发人员都讨厌这个项目:他被迫尽快发布,他是唯一一个关心技术债务,客户没有技术背景的人。 他给我讲了一个故事,使我想到了这样的项目中设计模式的适当性。这是故事。 我们不得不在网站的不同位置展示产品。例如,内容管理者可以通过API查看产品,还可以查看最终用户或合作伙伴。 有时,产品中缺少信息:例如,刚创建产品时,其中一堆没有任何价格,但尚未指定价格。有些没有描述(描述是具有修改历史,本地化内容等的复杂对象)。一些缺乏货运信息。 受到最近关于设计模式的阅读的启发,我认为这是使用神奇的Null Object模式的绝佳机会。所以我做到了,一切都变得顺畅而干净。只需致电product.Price.ToString("c")显示价格或product.Description.Current显示说明即可;不需要有条件的东西。直到一天,涉众要求通过使用nullJSON 来以不同的方式在API中显示它。对于内容管理者,也显示“未指定价格[更改]”,这也有所不同。而且我不得不谋杀我心爱的Null Object模式,因为不再需要它了。 同样,我不得不删除一些抽象工厂和一些建筑商,最终我通过直接和丑陋的调用替换了我美丽的Facade模式,因为底层接口在三个月中每天两次更改,甚至Singleton也离开了我当需求告知相关对象必须根据上下文而不同时。 超过三周的工作包括添加设计模式,然后在一个月后将其撕裂,我的代码最终变得面目全非,甚至包括我自己在内的任何人都无法维护。最好首先不要使用这些模式,这会更好吗? 确实,我必须在那些要求不断变化的项目类型上工作,而这些项目实际上是由那些并不真正考虑产品的凝聚力或一致性的人所决定的。在这种情况下,无论您有多敏捷,都将为问题提供一个优雅的解决方案,当最终实现该问题时,您会发现需求发生了巨大变化,以致于您的优雅解决方案不适合不再。 在这种情况下,解决方案是什么? 是否不使用任何设计模式,停止思考并直接编写代码? 进行一次团队直接编写代码,而另一个团队在打字之前三思而后行的经历会很有趣,这冒着几天后不得不扔掉原始设计的风险:谁知道,也许两个团队都会拥有同样的技术债务。如果没有这样的数据,我只断言,它不觉得不对劲,恕不另行思维上有20人月的项目工作时输入代码。 保留不再有意义的设计模式,并尝试为新创建的情况添加更多模式? 这似乎也不正确。模式用于简化对代码的理解;放置过多的模式,代码将变得一团糟。 开始考虑包含新要求的新设计,然后慢慢将旧设计重构为新设计? 作为一名理论家和偏爱敏捷的人,我完全投入其中。在实践中,当您知道必须每周回到白板并重做以前的设计的大部分内容时,并且客户只是没有足够的资金来支付您的费用,也没有足够的时间等待,这可能行不通。 那么,有什么建议吗?

7
用C语言编写性能?[关闭]
我知道我经常听到C通常比C ++具有性能优势。在我意识到MSVC似乎甚至不支持C的最新标准之前,我并没有真正想到它,但据我所知,最新的版本支持C99。 我打算编写一个包含一些代码的库以在OpenGL中呈现,以便我可以重用它。我打算用C语言编写该库,因为在图形方面,任何性能的提高都是值得欢迎的。 但这真的值得吗?使用该库的代码很可能是用C ++编写的,而我通常更喜欢用C ++编写代码。 但是,如果产生的性能差异很小,我可能会选择C。 可能还需要注意的是,这个库将是我可以在Windows / OS X / Linux上使用的库,并且我很可能会原生编译所有内容(Windows的MSVC,OS X的Clang或GCC以及Linux的GCC。 。或可能是英特尔的所有编译器)。 我环顾四周,并找到了一些基准测试等,但是我所看到的所有内容都是针对GCC而不是MSVC和Clang的。此外,基准测试未提及所用语言的标准。有人对此有任何想法吗? 编辑:经过几年的经验,我只是想分享我对这个问题的观点。我最终用C ++编写了一个问这个问题的项目。我大约在同一时间在C中启动了另一个项目,因为我们希望获得尽可能少的性能,并且需要该项目在C中可链接。几个月前,我到达了真正需要地图和高级界面的地步字符串操作。我知道C ++标准库中的这种功能,并最终得出结论:标准库中的那些结构可能会比在合理的时间内可以在C中实现的映射和字符串更好并且更稳定。通过向C ++代码编写C接口,可以很容易地满足在C中可链接的要求,该接口可以通过不透明类型快速完成。用C ++重写库似乎比用C编写库快得多,而且不容易出现错误,尤其是内存泄漏。我还能够使用标准库线程库,该库比使用特定于平台的实现要容易得多。最后,我相信用C ++编写库可以带来巨大的好处,而性能成本可能很小。我尚未对C ++版本进行基准测试,但是我认为使用标准库数据结构可能会获得比我编写的性能更高的性能。我相信用C ++编写库可以带来巨大的好处,而性能成本可能很小。我尚未对C ++版本进行基准测试,但是我认为使用标准库数据结构可能会获得比我编写的性能更高的性能。我相信用C ++编写库可以带来巨大的好处,而性能成本可能很小。我尚未对C ++版本进行基准测试,但是我认为使用标准库数据结构可能会获得比我编写的性能更高的性能。

11
通过WHERE子句连接的查询与使用实际JOIN的查询之间有什么实质性的区别吗?
在“ 学习SQL的艰辛方法”(练习6)中,作者提出了以下查询: SELECT pet.id, pet.name, pet.age, pet.dead FROM pet, person_pet, person WHERE pet.id = person_pet.pet_id AND person_pet.person_id = person.id AND person.first_name = "Zed"; 然后继续说: 实际上,还有其他一些使这类查询起作用的方法,称为“联接”。我现在避免使用这些概念,因为它们令人困惑。只需现在就采用这种连接表的方式,而忽略尝试告诉[您]这在某种程度上较慢或“低级”的人们。 真的吗?为什么或者为什么不?
32 sql 

1
为什么要使用Bower?[关闭]
我完全理解像Python pip,Node npm或Ruby Gems这样的包管理器的好处,因为它们所做的工作远远不止于将文件添加到应用程序路径中。 也许我错过了重点,或者我很钝,但这是我可以看到的负面影响: 建立项目时的单独步骤 通过另一个软件包管理器单独安装依赖项(yo dawg) 使用bower.json/和/或根目录的项目更加混乱.bowerrc 依靠注册表是最新,正确且可用的 某些导入/引用(如图片)的内容将无法正常工作 与npm有很多重叠,并且通常不清楚何时使用哪个资源 我看到的积极因素是: 我不必手动下载依赖项 根据用户提示或类似情况,可选地将软件包安装为脚手架的一部分 我真的很想知道我没有意识到的任何好处,我应该说,我并不是想真正地想引起挑衅。

4
什么是状态,可变状态和不可变状态?
这是一个新手问题,但我在Google上找不到足够的新手证明答案。 人们说“状态”是什么意思-在一般的编程中,特别是在OO编程中? 另外,什么是可变的和不可变的状态-同样,通常在编程中,尤其是在OOP中?
32 state 

7
如果我没有很好的想法来实现功能该怎么办?[关闭]
我正在开发自己的应用程序,但遇到了麻烦。我必须实现一个功能,但是找不到实现该功能的好方法。我考虑了几天,没有好主意。搜索互联网并没有给我任何启发。 我需要继续前进,但我想知道什么是最好的: 多思考,多等待,然后继续寻找最佳方法 停止浪费时间,从不良的设计开始,用测试覆盖一切 你怎么看?如前所述,我正在开发自己的应用程序。我没有任何截止日期,但我也想尽快完成对应用程序的编码。
32 design 

1
面向单分配ADT的代码在现代CPU上的性能
可以推论,使用单一分配处理不可变数据具有明显的效果,那就是需要更多的内存,因为您一直在创建新的值(尽管在幕后的编译器会做一些指针技巧来解决这一问题)。 但是,我现在已经听到几次,性能方面的损失被CPU(特别是其内存控制器)可以利用内存未发生突变(这种情况不多)这一事实带来的收益所抵消。 我希望有人可以阐明这是如何做到的(或者如果不是的话)。 在另一篇文章的评论中,有人提到抽象数据类型(ADT)与此有关,这使我更加好奇,ADT如何特别影响CPU处理内存的方式?不过,这是一个问题,主要是我只是对语言的纯洁度如何必然影响CPU及其缓存的性能等感兴趣。

1
LGPL 2.1与LGPL 3.0的优缺点
根据我的阅读,LGPL 3.0允许您将许可与其他许可一起使用,对此许可更大(甚至不确定)。从https://www.gnu.org/licenses/gpl-faq.html#AllCompatibility可以看出它与GPLv2不兼容,而LGPL 2.1与之兼容。这与我读过的东西有点相反... 那么,您知道LGPL 3.0相对于LGPL 2.1的真正优缺点是什么吗? 一个缺点是它与GPLv2不兼容。
32 licensing  gpl  lgpl 

8
托管网站(如Sourceforge,github或bitbucket)用于封闭源项目的安全性和可信赖性如何?[关闭]
我正在考虑使用sourceforge,bitbucket或github管理我的业务的源代码控制。我有开放项目,并且参与过gcc等开放项目。但是我也有一家公司,我为自己的生活开发开源软件。 Sourceforge,github或bitbucket在保持软件安全以防窥视方面值得信赖吗?在防止数据丢失方面,主机的稳定性如何?有没有人以这样的服装来建立他们的业务逻辑?有没有人调查过几种托管解决方案?

3
最小惊讶的原理是什么?
在编程中,什么是最小惊讶原理?这个概念与设计好的API有什么关系?这是否仅适用于面向对象的编程,还是也渗透到其他编程技术中?这是否与“在您的方法中做一件事情并做好事”的原则有关?

10
Scrum:如何整合一个超卓成就的开发者完成的工作?
我们有一个“典型的” SCRUM团队,我们致力于冲刺,并保持积压。最近,我们遇到了一个问题,即试图集成/处理一个超能力的开发人员进行带外工作(选择在正常工作时间/冲刺之外工作)的工作。 举个例子,如果团队承担了50个工作点,那么说他们将在sprint结束之前完成SCRUM框架内的所有工作,并且他们和公司都很高兴。团队成员之一决定自己在空闲时间上处理积压项目。他们不签入此工作,而是保存它(我们使用TFS,它在架子集中)。 如何处理呢?一些问题.. 在下一次冲刺期间,该团队成员说,编程工作已完成99%,仅需要代码审查和测试。您如何在SCRUM和敏捷方法中处理此问题? 其他开发人员抱怨说,由于工作是在带外完成的,因此没有参与与这些故事相关的设计决策。 我们的产品负责人很想参加这项“免费”的工作,而过分追求成就的成员可能会故意这样做,以便使产品获得更多功能,否则团队将无法在冲刺中完成这些功能。有观点认为这正在打破“进程”。显然,质量检查,UI和文档工作仍需要完成。 我看到了很多关于不强迫SCRUM团队加班的讨论,但是团队成员的工作超出了Sprint计划和执行过程中提出的期望又超出了预期吗?我会犹豫要与这个人打交道,并说你不能做更多的工作(当然要小心烧伤),但与此同时,这似乎在团队的某些成员(但不是全部)上引起了一些问题。 如何将一个过高的成员完成的工作整合到SCRUM和敏捷过程中进行软件开发?
32 agile  scrum  team 


6
更新密码哈希而不强制现有用户使用新密码
您维护具有已建立用户群的现有应用程序。随着时间的流逝,目前的密码哈希技术已经过时,需要升级。此外,由于UX原因,您不希望强迫现有用户更新其密码。整个密码哈希更新需要在屏幕后面进行。 假设用户的“简单”数据库模型包含: ID 电子邮件 密码 如何解决这一要求? 我目前的想法是: 在适当的类中创建一个新的哈希方法 更新数据库中的用户表以容纳其他密码字段 用户使用过时的密码哈希成功登录后,用更新的哈希填充第二个密码字段 这给我留下了一个问题,即我无法合理地区分拥有和未更新密码哈希的用户,因此将不得不同时检查两者。这似乎是可怕的缺陷。 此外,这基本上意味着,可以强制无限期地保留旧的哈希技术,直到每个用户都更新了密码。只有在那一刻,我才能开始删除旧的哈希检查并删除多余的数据库字段。 我主要是在这里寻找一些设计技巧,因为我当前的“解决方案”是肮脏,不完整的,不是什么,但是如果需要实际的代码来描述可能的解决方案,请随时使用任何语言。

9
等待审核时该怎么办?
在提出问题之前,我必须说明情况。 我在一家公司工作,担任初级软件工程师。当我完成了自己的发展并想要投入时,其中一位年长者总是阻止我。 他总是希望我等待他对其进行审查。可以,因为通常他会发现一些错误并进行一些优化。 但是,我必须在截止日期之前提交我的代码。完成后,我打电话给他,说结束了。他通常迟到。所以我的代码也迟到了。 我的问题是,我该怎么办?我应该等他复习吗? 编辑:除了问题。我很好奇另一个问题。 编码时我想自由。我如何获得对发展自由的信任? 一些解释: 我已经和他谈过了。但这没有帮助。我们已经使用了问题跟踪器,但是没有任何审查任务。只有开发和测试任务。

2
如何设计可扩展的通知系统?[关闭]
我需要写一个通知系统管理员。 这是我的要求: 我需要能够在可能完全不同的不同平台上发送通知(例如,我需要能够发送SMS或电子邮件)。 有时,对于给定平台的所有收件人,通知可能是相同的,但是有时,可能是每个平台(或多个)每个收件人的通知。 每个通知可以包含特定于平台的有效负载(例如,MMS可以包含声音或图像)。 系统需要可伸缩,我需要能够发送大量通知而不会导致应用程序或服务器崩溃。 这是一个分为两个步骤的过程,首先,客户可以输入消息并选择要发送到的平台,然后创建通知,以便稍后进行实时处理。 然后,系统需要将通知发送到平台提供商。 就目前而言,尽管我得到了一些结论,但是我不知道它的可扩展性或它是否是一个好的设计。 我有以下对象(使用伪语言): 通用Notification对象: class Notification { String $message; Payload $payload; Collection<Recipient> $recipients; } 如果我有1.000.000收件人,则以下对象的问题是什么?即使Recipient对象很小,也会占用太多内存。 我还可以为每个收件人创建一个通知,但是某些平台提供商要求我批量发送该通知,这意味着我需要定义一个包含多个收件人的通知。 每个创建的通知可以存储在诸如DB或Redis的持久性存储中。 稍后汇总此内容以确保其可伸缩性是否很好? 在第二步中,我需要处理此通知。 但是,如何区分通知给正确的平台提供商的通知呢? 我应该使用诸如MMSNotification扩展对象之类的对象abstract Notification吗?或类似的东西Notification.setType('MMS')? 为了允许同时处理大量通知,我认为像RabbitMQ这样的消息传递队列系统可能是正确的工具。是吗? 这将使我可以排队很多通知,并有几个工作人员弹出通知并进行处理。但是,如果我需要如上所述对收件人进行批处理怎么办? 然后我想象NotificationProcessor的,我我可以添加对象NotificationHandler的每个NotificationHandler将负责连接平台提供商和执行通知。 我也可以使用EventManager允许插入行为。 有任何意见或建议吗? 感谢您抽出宝贵的时间。 注意:我曾经使用过PHP,并且它可能是我选择的语言。 编辑 (根据morphunreal的答案) 您每秒发送多少消息(定义当前/初始级别,定义在重新设计之前系统应处理的最大级别) 系统具有哪些硬件限制(内存,CPU等可供系统使用) 硬件将如何扩展(即添加更多服务器,云计算等) 哪些语言/系统将生成通知? 它是我自己的事情,我负责以编程方式创建通知,但该通知是通过用户界面构建的。 生成器是否知道消息的收件人(?),还是通过其他某种方式提供消息(例如,某些警报类型的业务规则将发送给某些收件人) 应该可以为特定收件人,一组收件人(例如,使用标签系统)或整个平台创建通知。 是否有添加CC / BCC /阅读收据的业务规则 是。请注意,这实际上是特定于平台的,read或cc并非在所有平台上都可用。 …

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.