软件工程

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

2
语言为什么不对switch语句使用显式的穿透?
我在看为什么我们要用break在switch?,这使我想知道为什么某些语言(例如PHP和JavaScript)允许隐式掉线,而没有支持(AFAIK)的显式掉线。 这并不是continue完全需要的,而是需要创建一个新的关键字,并且可以解决任何有关作者是否打算通过案子的模棱两可的问题。 当前支持的形式是: switch (s) { case 1: ... break; case 2: ... //ambiguous, was break forgotten? case 3: ... break; default: ... break; } 而将其写为: switch (s) { case 1: ... break; case 2: ... continue; //unambiguous, the author was explicit case 3: ... break; default: ... break; } …

9
我应该听雇主的话并使用CASE工具吗?
我的雇主(不是开发人员)认为CASE工具将帮助我们改善开发流程和文档。我不确定这一点,我们是一个由5个开发人员组成的小组,为本地客户构建移动银行解决方案。我认为CASE工具需要购买,将浪费时间和金钱,而且我们需要一些时间才能习惯它们并有效地使用它们进行建模和填充。代码生成是另一个问题,我真的认为CASE生成的代码不如优秀开发人员编写的代码好。 我认为,如果我们坚持敏捷原则,设计模式,使用TDD并保持代码干净。我们应该很好。至于分析和设计,我认为白板上的简单UML图应该可以解决问题。文档既好又重要,但应尽量减少,而且我们不应该只关注文档而忘记代码。这就是我的想法。 我对么?还是应该听我的雇主并开始研究合适的CASE工具?

5
您如何支持代码发布后的工作结束?
就代码支持而言,离开公司(甚至集团/部门)的流程是什么? 最好处理所有问题吗?您是否让其余的开发人员可以访问自己作为将来的资源?如果是这样,有没有办法不授予完全访问权限? 我已经亲身体验了第一手开发人员提供的有关通用软件体系结构的答案将是无价的。 我知道,如果需要认真的帮助,那么它将成为雇佣谈判作为支持合同的典型案例。但是,是否需要认真的帮助,您可以采取哪些步骤来简化与您联系的过程? 我当时正在考虑做类似(YOUR_NAME)_codesupport @(YOUR_FAVORITE_EMAIL_CLIENT).com地址的事情。 我的具体情况: 我是一个合作社学生,因此在公司工作4个月后在公司周围反弹。这意味着向自己介绍许多新的代码库,并在我离开公司时留下大量的孤立代码。如果我留下垃圾代码,我会感到很难过。
17 support 

4
我是否应该继续为那些不断要求而不付钱的客户开展自由职业?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 5年前关闭。 因此,一位客户来找我,说需要做一些工作。基本上有4个任务,我同意以一定的价格执行。我接受客户在ODesk上创建工作机会(固定时间和价格的工作),但是花了几天时间并不断提醒客户根据该工作开始合同。 问题是原始任务已经完成,合同仍然有效,我还没有付款,客户说他将在项目完成时付款,直到那时,新任务不断发生,或者更改了旧任务需要完全重做元素。对于所有这些,客户承诺付款。此客户端没有有关ODesk的更新,那里没有新任务。我一直在提醒客户有关整理管理问题的信息,但没有结果。同时,由于该项目即将启动,客户会继续进行工作。 我不知道该怎么办。 如果我拒绝在没有官僚作风的情况下执行任何工作,则该项目将延迟。但这不是我的错,是吗?在这种情况下,我恐怕会收到负面反馈,甚至更糟。 如果我退出这个项目,恐怕我什至都无法获得所获得的收益。 如果我继续这样,我将浪费大量时间来做类似于此处所述的事情,但是作为一名程序员(是的,它已经提出了类似的要求,需要大量的硬编码内容)。 在这种情况下,我该如何与此类客户沟通?如何避免冲突? PS客户是一家小公司。不同的人处理此项目的不同方面,每个人都对原始规范进行自己的更改。 2年后:哇!很疑问!大受欢迎! 我决定让每个人都结束这个故事。我遇到了客户,并解释说,直到我为自己做的事情获得报酬,以及每小时签订一份合同后,我才会工作。他们第二天付了我钱,开了份合同。开始了富有成果但短暂的合作。大家都很开心 除了我没有得到任何反馈。

5
函数可以修改参数吗
我们有一个包装Linq To SQL的数据层。在此数据层中,我们有此方法(简化) int InsertReport(Report report) { db.Reports.InsertOnSubmit(report); db.SubmitChanges(); return report.ID; } 在提交更改时,将使用数据库中的值更新报告ID,然后我们将其返回。 从主叫方看起来像这样(简化) var report = new Report(); DataLayer.InsertReport(report); // Do something with report.ID 查看代码,作为一种副作用,已经在InsertReport函数内部设置了ID,然后我们忽略了返回值。 我的问题是,我应该依靠副作用,而是做类似的事情。 void InsertReport(Report report) { db.Reports.InsertOnSubmit(report); db.SubmitChanges(); } 还是应该防止它 int InsertReport(Report report) { var newReport = report.Clone(); db.Reports.InsertOnSubmit(newReport); db.SubmitChanges(); return newReport.ID; } 甚至会 Report …

12
教导自己,作为物理学家,成为一名更好的程序员[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 4年前关闭。 我一直很喜欢物理学,也一直喜欢编码,所以当我获得大学博士学位时提供数值物理学的职位(细节不相关,主要是集群的并行编程)时, -我的脑子 但是,像大多数物理学家一样,我是自学成才的。我没有关于如何以面向对象的方式进行编码的广泛背景知识,也没有在某些kD树中优化搜索的特定算法的名称。 由于到目前为止我的所有工作都更加关注物理学和科学成果,因此毫无疑问我有一些不良习惯- 尤其是因为我的编码是我自己的,而不是真正的团队合作。我主要使用C,因为它非常简单,而且“您写的就是您所得到的”-不需要花哨的抽象。但是,由于我想进一步了解抽象所具有的功能,因此我最近改用了C ++,它非常像C(至少在语法上)。 我该如何像计算机科学专业的毕业生那样以一种良好的抽象方式自学编程呢? 我知道我的代码是高效的,但我希望它也要优雅,可读。请记住,我没有时间阅读关于抽象编程的几本1000页的书。我需要花时间进行与物理相关的实际研究(如果我的主管知道我花时间考虑如何优雅地编程,我的主管会嘲笑我)。如何从程序员的角度评估我的工作是否还不错?

3
为什么虚拟机上的更多CPU内核会降低编译时间?
[edit#2]如果来自VMWare的任何人都可以使用VMWare Fusion的副本来打我,我很乐意做与VirtualBox与VMWare比较的相同操作。我以某种方式怀疑VMWare虚拟机管理程序将针对超线程进行更好的调整(也请参见我的答案) 我看到一些奇怪的东西。随着我在Windows 7 x64虚拟机上增加内核数量,总体编译时间会增加而不是减少。编译通常非常适合并行处理,因为在中间部分(后依赖映射)中,您可以简单地在每个.c / .cpp / .cs /任何文件上调用一个编译器实例,以建立供链接器使用的部分对象过度。所以我以为编译实际上可以很好地扩展内核数。 但是我看到的是: 8核:1.89秒 4核心:1.33秒 2核心:1.24秒 1核心:1.15秒 这仅仅是由于特定供应商的虚拟机管理程序实现(在我的情况下为type2:virtualbox)导致的设计工件,还是在更多的VM上更普遍地使虚拟机管理程序实现更简单?有这么多因素,我似乎能够为这种行为辩护和反对-因此,如果有人比我更了解这一点,我很想读您的答案。 谢谢席德 [ 编辑:解决评论 ] @MartinBeckett:冷编译被丢弃了。 @MonsterTruck:找不到直接编译的开源项目。太棒了,但现在不能搞定我的开发环境。 @Mr Lister,@philosodad:使用VirtualBox时有8个硬件线程,因此应该以1:1映射而不进行仿真 @Thorbjorn:我有6.5GB的虚拟机和一个较小的VS2012项目-我换入/换出垃圾页面文件的可能性很小。 @All:如果有人可以指向一个开源VS2010 / VS2012项目,那么这可能比我(专有)VS2012项目更好的社区参考。Orchard和DNN似乎需要调整环境才能在VS2012中进行编译。我真的很想看看使用VMWare Fusion的人是否也看到了这一点(针对VMWare与VirtualBox划分) 测试细节: 硬件:Macbook Pro Retina CPU:Core i7 @ 2.3Ghz(四核,超线程= Windows任务管理器中的8核) 记忆体:16 GB 磁盘:256GB SSD 主机操作系统:Mac OS X 10.8 VM类型:VirtualBox 4.1.18(类型2虚拟机管理程序) 来宾操作系统:Windows 7 …

2
实施过滤搜索的最佳方法
我想问您,关于实施过滤后的搜索表单的意见。让我们想象以下情况: 1个有很多列的大表 可能很重要的一点是,此SQL Server 您需要实现一个表单来搜索此表中的数据,并且在此表单中,您将具有几个复选框,可用于汇总此搜索。 现在,我的问题是,以下哪一项应该是实现搜索的最佳方法? 创建一个内部带有查询的存储过程。此存储过程将检查应用程序是否提供了参数,如果未提供参数,则将在查询中放入通配符。 创建一个动态查询,该查询将根据应用程序给出的内容进行构建。 我之所以这样问,是因为我知道SQL Server在创建存储过程时会创建执行计划,以优化其性能,但是通过在存储过程内部创建动态查询,我们会牺牲执行计划获得的优化吗? 请告诉我,您认为最好的方法是什么。

2
算法的预期运行时间和平均运行时间是什么意思?
假设我们要分析算法的运行时间。有时我们说我们想在输入大小为n时找到算法的运行时间,在最坏的情况下用O(n)表示它。有时,尽管我看到书籍/论文说我们需要找到算法的预期时间。有时也使用平均运行时间。 什么是“预期时间”?在什么情况下找到期望的时间而不是最坏的情况有用? 编辑:我认为预期的运行时间和平均运行时间之间存在细微的差别,但我不确定。通过这篇文章,我想知道确切的区别。

7
我是否可以在法律上和道德上参与社区对封闭源代码做出贡献的开放源代码项目?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 2年前关闭。 假设我在开源许可证下启动并开发了一些项目,并接受了一些社区的贡献。如果我决定进行商业和封闭源代码(或拆分许可)项目,我的立场有多不稳定? 这个问题并没有直接解决社区贡献项目的问题,至少就道德而言,这似乎是不同的领域。从法律上讲,这也可能是个难题,因为我不确定贡献是否属于我的版权范围,或者贡献者是否对他添加的项目部分拥有版权。 只要我提前就可能在将来将项目商业化,我是否在道德上和法律上都是安全的?
17 licensing  ethics 

2
什么标准取代了830-1998?
我一直在研究如何更正式地记录软件项目,并且了解了IEEE 830-1998:《软件需求规范的推荐做法》。但是,从该链接可以看到,它已被取代。 我知道830-1998,甚至830-1993都可以使用。但是,如果没有别的,我想知道是什么标准取代了它。在这种情况下,可能没有关系,但是如果为了其他技术问题而取代了其他标准,我认为最好在某个地方链接取代的另一个标准(如果不是同一行中的另一个标准的话(830,在本指南中)案件))。 值得一提的是: 在IEEE标准协会网站上搜索“软件要求规范”或“软件要求”时,最新标准为830-1993, SWEBOK的2004年(当前)版本引用了830-1993(第2.5段), 该文档的Wikipedia文章并未提及该标准已被取代。 TLDR:您如何找到取代另一标准的标准,以及取代830-1998的标准?

3
MVVM,DDD和WPF分层应用程序项目结构指南
我正在尝试在VS中设置我的应用程序的结构,我想“尝试”并在将来对其进行合理的证明。该应用程序将是对旧的Winform应用程序的WPF重写,该应用程序没有遵循任何约定。没有层,层,首字母缩略词等。 这是一个相当大的企业应用程序。我计划将Linq To SQL用作数据库,并且很可能始终是MS SQL。我也有一个现有的技能。 我想尽可能地遵循MVVM和DDD,但是结合使用它们时,我对应用程序的结构感到困惑。让我尝试通过一些示例进行说明。 当我遵循MVVM时,我的文件夹结构可能如下所示: Views Models ViewModels Helpers 但是这如何适合于简单的DDD分层方法,其中我的项目结构可能类似于此: MyApp.UI MyApp.Domain MyApp.Data 我应该将其Models放在“域”层中还是有3种说法Person?这就引出了另一个问题,即我将数据库对象的存储库和映射放在哪里?我会假设数据... Views我会进入UI,但ViewModels也会吗? 最后,我将业务逻辑嵌入哪里? 我在CodePlex,DDD示例中发现了以下内容,虽然对您有所帮助,但似乎对Web应用程序有所帮​​助,但这似乎是我的无知。 不要误会我的意思,我知道我可以拥有尽可能多的文件夹,并可以随意命名。我试图弄清楚在哪里放置东西,以便可以扩展,而不是那些地方必须叫什么。 我的问题的核心可能会这样显示。 我有tblPerson产生的物件*.dbml。这很明显,将属于我的“数据”层。 现在,我将拥有Model,DTO,Domain Model或在称为的单独Layer(project?)中调用的任何东西Person。我需要一个Mapper用于Person对tblPerson那个我不知道放在哪里。 然后,我将拥有一个ViewModel,例如,EditPerson它将拥有它自己的属性,Person但可能还会更多。 最后,我将有一个绑定到该ViewModel的View。 需要明确的是,我的假设和猜测已填满该段,我希望有人能为我打气或向他们提供见解,这样从现在开始的6个月到一年内,我不会踢得比自己需要的更多。

7
如何证明代码重构时间?
有一个超过70k LOC的大型项目。 该项目肯定需要在Core Framework和其他部分中进行一些代码重构。在项目开始时没有设置任何时间进行重构。但是随着时间的推移,有40多个开发人员加入并离开了该项目。在我看来是必不可少的。 在争论和捍卫适当的软件开发原则时,您的重点是什么?

7
如何避免静态分析的陷阱
我在一家在Joel Test(至少在纸上)上获得11分的公司工作。 但是实际上,没有什么能比预期的要好,该项目已经在DEFCON 1上进行了半年。现在,我的大多数同僚都高兴,如果他们可以在周日下午6:00回家。 使用静态分析工具是使我不工作的显而易见的好习惯之一。该项目都跟踪gcc -Wall警告和专有且非常昂贵的“ C / C ++”工具。 Gcc警告的确经常指向真实的(如果大部分时间都是无礼的)错误。 但是,专用工具列出了诸如隐式强制转换和字符串文字的sizeof之类的内容。隐式演员表也在其样式表中列入黑名单。 标准做法是迫使人们关闭每个警告。请注意,这确实排除了主要是误报的警告,这不是问题。 结果是: 人们向每个右值和每个参数添加类型转换,以隐藏过程中真正存在问题的类型不匹配。 人们引入一个错误,或者使用其他有问题的语言功能(用strlen代替sizeof,用strncpy代替strcpy,等等)。 警告被静默。 错误报告开始滚动。 主要要点是原始代码是由在语言能力范围内安全地工作的人编写的,而修正不是。 现在,我真的不认为可以挽救这家公司。但是,我想知道是否有一种更好的方法,最好是可以使用“专业”工具的方法,还是我应该避免完全使用它们,以防将来我自己做出决定。 不能假定所有程序员都是不能犯错的天才的解决方案。因为如果可以的话,那么首先就不需要使用这些工具。


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.