软件工程

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

2
如何执行良好/更好的源代码控制实践?
我怀疑我专注于错误的问题,因此在介绍我设想的可能次优的解决方案之前,我将首先描述我认为问题所在。 当前情况: 目前,我的同事只有在很长一段时间内才提交他们的代码更改,这些更改分散在整个项目中。我猜这是进步,因为不久前他们只是将.zip存档放在某些网络共享上。尽管如此,合并仍然是一场噩梦-坦白地说,我已经受够了。而且我也厌倦了交谈,解释和乞讨。这只是必须停止-不要让我不断成为“坏人”。 我的解决方案: 由于似乎对这些问题一无所知,并且/或者对这些问题没有兴趣,而且我不能指望任何努力可以持续几天以上……因此,我想让几个小时的颠覆服务器来做这些事情。唠叨。 我的问题: 我是在这里偏离基地还是在看错问题?似乎我缺少了一些东西,而且我认为通过查看解决问题的工具来问错了事情。 我应该在寻找一种工具来解决此问题,还是应该采取什么措施解决此问题?

6
为什么我们必须等待I / O?
众所周知,磁盘操作速度很慢,我们知道它们速度很慢的原因。所以这里的问题是为什么我们必须等待I / O或为什么会有IOWait之类的东西? 我的意思是我已经注意到,当您在后台执行一些I / O任务时,您的计算机基本上会变慢很多,我特别注意到,在使用Linux时,如果您要执行更长的I / O任务,直到操作系统完成,操作系统几乎变得无法使用。 确实,我也在文章中找到了这个主题,其中有一个摘要: I / O等待率为12.1%。该服务器具有8个核心(通过cat / proc / cpuinfo)。这非常接近(1/8核心= 0.125) 所以从根本上讲,这意味着它会降低计算机的运行速度,为什么?我的意思是,好的,现在普通计算机至少有2个核心,有时是4个,有时是由于超线程等而拥有更多。但是现在的问题是,为什么CPU实际上必须呆在那里,除了等待IO之外,实际上不做其他任何事情?我的意思是流程管理的基本思想或体系结构,现在我不知道是操作系统负责还是将其归结为硬件部分,但应该让CPU等待或执行定期检查,同时实际执行许多其他任务,并且仅在准备就绪时返回IO流程。确实,如果这是一项艰巨的任务,而CPU必须等待,那为什么呢?这样可以更有效地利用硬件进行管理吗?例如,可能会有某种小型cpu会等待它,并在返回到流程后立即将一小部分数据传递到实际cpu,因此该流程将重复进行,而我们不必几乎将整个cpu核心专用于数据复制过程...还是我应该发明这种东西并为此获得诺贝尔奖?:S 现在,好了,我真的是从观察者的角度出发,我确实还没有深入探讨这个话题,但是我真的不明白为什么cpu必须以HDD的速度工作,尽管它可能只是做其他事情,一旦准备好就回到硬盘。这个想法不是要加快需要IO操作或复制过程或其他操作的应用程序的速度,而是要在执行该操作时将CPU占用的影响降到最低,以便OS可以将其用于其他进程和用户。进行某些复制操作时不必感到一般的计算机延迟...
28 cpu  io  operations 

7
我的公司合并分支机构错了吗?
最近,我碰到了一篇有关分支和合并以及SCM的MSDN文章:分支和合并入门-Chris Birmele。 他们在文章中说“大爆炸合并”是一种合并的反模式: 大爆炸合并-将分支合并推迟到开发工作的尽头,并尝试同时合并所有分支。 我意识到这与我公司对所有开发分支的工作非常相似。 我在一家非常小的公司里工作,只有一个人担任最终审查+干线合并授权。我们有5个开发人员(包括我在内),我们每个人都会被分配一个单独的任务/错误/项目,我们每个人都将离开当前主干(subversion),然后在我们的分支中执行开发工作,测试结果,编写文档如有必要,请与其他开发人员进行同行评审和反馈循环,然后将分支提交给我们的项目管理软件进行评审+合并。 我的老板是主干存储库的唯一授权,实际上将把分支的所有审核推迟到一个时间点,在该时间点他将尽其所能进行审核,一些​​分支将被退回以进行增强/修复,有些则被丢弃。分支将直接合并到主干中,由于冲突等原因,一些分支将被退回。 对于我们来说,在最终审阅队列中有10-20个活动分支合并到主干中并不少见。 在最后的审阅和合并阶段,我们经常还必须解决冲突,因为两个分支是在同一主干上创建的,但修改了同一段代码。通常,我们可以通过重新分支,重新应用更改并解决冲突,然后提交新分支进行审核(可怜的人变基)来避免这种情况。 我有一些直接的问题是: 我们是否展示了被称为“大爆炸合并”的非常反模式? 我们看到的某些问题是此合并过程的结果吗? 我们如何在不增加我老板的瓶颈的情况下改善这一合并过程? 编辑:我怀疑我的老板会放松对中继存储库的控制,还是允许其他开发人员合并到中继。不知道他这样做的原因是什么,但是我真的不打算提出这个话题,因为这个话题以前被提出过并且很快就被否决了。我认为他们只是不信任我们,这是没有意义的,因为无论如何都跟踪了一切。 任何其他见解这种情况将不胜感激。

1
如何在生产代码中处理函数名称错误?
我最近在GitHub上遇到了一个Python库。该库很棒,但是在函数名称中包含一个明显的错字。让我们称它为dummy_fuction()应该dummy_function()。此功能肯定是“狂野的”,最有可能在嵌入式系统中使用。 我想到的第一件事是添加具有正确名称的函数的第二个版本,并为下一版本的第一个版本添加弃用警告。 三个问题: 上面的方法会产生意想不到的后果吗? 是否有解决此类问题的标准方法? 弃用警告应保留多长时间?

6
没有TDD的单元测试感
我们有一个新的(相当大的)项目正在启动,我们计划使用TDD进行开发。 TDD的想法失败了(有很多业务和非业务原因),但是现在我们正在进行对话-是否应该编写单元测试。我的朋友说,在没有TDD的情况下编写单元测试没有任何意义(或几乎为零),我们应该只关注集成测试。我相信相反,编写简单的单元测试仍然有一定的道理,只是为了使代码更可靠。你怎么看? 补充:我认为这不是>> thisquest <<的重复-我了解UT和TDD之间的区别。我的问题不是关于差异,而是关于编写没有TDD的单元测试的感觉。
28 unit-testing  tdd 

4
否定性“传统代码”的由来是什么
每个人都在谈论软件开发中的遗留代码,我听说过过去十年中用来将任何代码库描述为不良代码的术语。 对程序员一样具有如此强大内涵的这个术语从何而来? 我相信肯定有一些关于软件开发的书是这个学期的开创者。我很想找到术语“旧版代码”的由来。

3
我应该创建单独的工作帐户和个人GitHub帐户吗?[关闭]
我对编程还很陌生,并且我一直在从事许多个人项目,我担心这些项目可能很愚蠢且不专业。我拥有的项目类型是Reddit Image Downloader和GM在角色扮演游戏中使用的工具。 我想开始在所选的数据分析领域中为项目建立GitHub帐户,但是我不确定如何在GitHub帐户上组织项目。我是否应该创建一个主要包含不同分析脚本的“专业” GitHub,并为我的有趣小项目创建一个单独的“个人”帐户?还是我只是想得太多,应该只保留一个帐户?
28 github 

3
强制用户在Google Play商店中更新到我的应用的最新版本
是否可以在Google Play商店中为我的应用程序进行“重要更新”,而该更新要求用户更新应用程序才能继续使用? 例如,假设我推送了一个带来一些错误修正的更新。不需要强制执行,用户可以根据需要进行更新:这是非关键更新。 现在,说我纠正了我应用程序上的一个非常严重的安全问题,并希望所有用户都更新到此版本以继续使用该应用程序:这是关键更新。 基本上,如果有重要更新并且用户尚未更新,则只有在使用之前,他才能使用该应用程序。 使用Play商店可以吗? 感谢您的反馈意见!

6
使用关系数据库与JSON对象获取事件/活动数据
我正在一个项目中尝试在一个标准SQL关系数据库或JSON对象之间存储有关事件或活动的数据。 该项目将存储多种事件类型的数据,因此我决定仅描述此问题的一种事件类型。 现场音乐事件(此问题底部使用JSON模式完整描述)是一个对象,用于存储数据,例如事件发生的地点,事件的时间/日期和事件的成本。现场音乐事件对象具有一对一(事件->名称,事件->描述)和一对多(事件->场所,事件->日期,事件->票证类型) )关系。此外,事件对象可以包含一个或多个执行者ID,这些ID链接到执行者对象。表演者对象存储有关在现场音乐事件中表演的音乐家的数据。 用户将使用简单数据(“以'x'名称为我查找事件”)和复杂数据(以'x'音乐体裁为'y'事件并在距我当前半径'z'范围内以'y'为代价的事件来查询数据)位置”)查询。数据将由用户使用Web表单提交。 从定义的JSON模式中可以看出,我本来打算使用JSON对象存储此数据,但是我听到有些人说,因为我的数据是纯关系型的,所以我应该坚持使用较旧的方法。 鉴于我的需要,我希望对每种方法的利弊有任何想法。如果您需要任何澄清,请随时询问。 { "event": { "eventID":{ "type":"string" }, "eventType":{ "type":"array", "eventTypeItem":{ "type":"string" } }, "eventName":{ "type":"string" }, "eventDescription":{ "type":"string" }, "eventVenueList":{ "type":"array", "eventVenueListID":{ "type":"integer" } }, "eventURL":{ "type":"string" }, "eventTwitter":{ "type":"string" }, "eventFB":{ "type":"string" }, "eventInstagram":{ "type":"string" }, "eventEmail":{ "type":"string", "format":"email" }, "eventContactPerson":{ "type":"string" }, …
28 design  sql  json 

8
C#泛型-如何避免冗余方法?
假设我有两个看起来像这样的类(第一段代码和一般问题与C#相关): class A { public int IntProperty { get; set; } } class B { public int IntProperty { get; set; } } 这些类不能以任何方式进行更改(它们是第三方聚会的一部分)。因此,我不能使它们实现相同的接口,也不能继承将包含IntProperty的相同类。 我想对IntProperty两个类的属性都应用一些逻辑,在C ++中,我可以使用模板类很容易地做到这一点: template <class T> class LogicToBeApplied { public: void T CreateElement(); }; template <class T> T LogicToBeApplied<T>::CreateElement() { T retVal; retVal.IntProperty = 50; return retVal; …
28 c#  generics 

2
每年年初是否需要在github上更新MIT许可证?
我在我的所有github项目中都使用了MIT许可证。第二行表示2013年位于顶部。为了将来拥有版权(例如,2013年之后),是否需要每年更改版权,或者它是否是现状?我要添加,修改还是保留原样? The MIT License (MIT) Copyright (c) 2013 Aseem Bansal <aseembansal@ymail.com> //Rest of the MIT LICENSE

3
为什么不注释功能参数?
为了使这个问题更容易回答,让我们假设程序员头脑中模棱两可的代价要比几次额外的击键要昂贵得多。 鉴于此,我为什么不让我的队友不注释其功能参数就逃脱呢?以下面的代码为例,这可能是更复杂的代码: let foo x y = x + y 现在,对工具提示的快速检查将向您显示F#已确定将x和y表示为整数。如果这就是您的意图,那么一切都很好。但是我不知道那不是你的意图。如果您已创建此代码以将两个字符串连接在一起怎么办?或者,如果我认为您可能打算添加双打呢?或者,如果我只是不想将鼠标悬停在每个函数参数上来确定其类型,该怎么办? 现在以这个为例: let foo x y = "result: " + x + y F#现在假设您可能打算连接字符串,因此x和y被定义为字符串。但是,作为维护您的代码的可怜的schmuck,我可能会看这件事,并想知道您是否打算将x和y(整数)加在一起,然后将结果附加到用于UI的字符串中。 当然,对于这样简单的示例,可以放手,但是为什么不执行显式类型注释的策略呢? let foo (x:string) (y:string) = "result: " + x + y 模棱两可有什么危害?当然,程序员可能会为尝试做的事情选择错误的类型,但至少我知道他们的意图是,这不仅仅是疏忽。 这是一个严重的问题...我对F#还是很陌生,正在为我的公司开拓创新。我采用的标准可能会成为将来所有F#编码的基础,并且嵌入无止尽的复制粘贴中,我相信它将在未来的几年中渗透到整个文化中。 那么...关于F#的类型推断是否有什么特别之处,使其成为一项有价值的功能,仅在必要时进行注释?还是专家F#-er习惯于为非平凡的应用程序注释其参数?
28 f#  parameters 

2
历史增长的软件是否有命名的反模式?[关闭]
是否有一种反模式来描述一个历史悠久的软件系统,其中多个开发人员只是向系统添加了新功能,但没有人真正关注整个体系结构,也从未进行过重构? 我认为,当管理人员/客户不断要求新功能并且没有人重构任何东西而只是增加其他开发人员以前所做的事情时,就会发生这种情况。 原因还可能是开发人员对软件系统不知所措,并不真正了解它当前的工作方式,然后只是在最后添加/粘上了他的代码(而不是重构和更改代码)。 因此,随着时间的推移,维护系统变得越来越困难。 (我想知道是否有针对这种反模式的图片,以使所有编程人员都无法清楚了解它-就像一辆通过添加越来越多的功能而无需考虑整体设计而制造的汽车。就像有人需要拖曳拖车时向后骑,然后工程师只是将牵引杆焊接到汽车的前部。工作已经完成。但是现在,前围不再打开了。)

1
如果规格有缺陷,是否仍应遵守?
我被指派为我的雇主的应用程序之一与客户开发的外部系统集成。我们客户的集成规范存在一些与安全性有关的明显缺陷。这些缺陷将允许未经授权的用户访问系统以查看受限制的数据。 我已经指出了缺陷及其潜在的安全风险(如果按设计实施它们),并提供了没有缺陷的替代方法,但是(总之)客户已经告诉他们“按照我们指定的方式进行操作”。 程序员是否有道德责任不实施具有已知安全风险的代码?在什么时候,客户的要求超过我们作为软件开发人员创建安全应用程序所承担的道德责任?

2
以下(反)模式的名称是什么?它的优缺点是什么?
在过去的几个月中,我偶然发现了以下技术/模式。但是,我似乎找不到一个特定的名称,也不能百分百确定其所有优点和缺点。 模式如下: 在Java接口中,照常定义了一组常用方法。但是,使用内部类,默认实例会通过接口泄漏。 public interface Vehicle { public void accelerate(); public void decelerate(); public static class Default { public static Vehicle getInstance() { return new Car(); // or use Spring to retrieve an instance } } } 对我来说,最大的优势似乎在于,开发人员只需要了解接口,而无需了解其实现,例如,在他快速想要创建实例的情况下。 Vehicle someVehicle = Vehicle.Default.getInstance(); someVehicle.accelerate(); 此外,我已经看到该技术与Spring一起使用,以便根据配置动态提供实例。在这方面,它看起来也可以帮助模块化。 但是,我无法撼动这是滥用接口的感觉,因为它将接口与其实现之一结合在一起。(相关性反转原理等。)有人可以向我解释该技术的调用方式以及它的优缺点吗? 更新: 经过一段时间的考虑后,我重新检查并注意到,使用以下单例版本的模式的频率更高。在此版本中,公共静态实例通过接口公开,该接口仅初始化一次(由于字段为final)。另外,几乎总是使用Spring或将接口与实现分离的通用工厂来检索实例。 public interface Vehicle …

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.