软件工程

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

5
您如何最好地在REST API中表示双向同步?
假设系统中有一个带资源的Web应用程序,以及另一个具有类似资源的远程应用程序的引用,那么您如何表示双向同步操作,该操作将“本地”资源与“远程”资源同步? 例: 我有一个代表待办事项清单的API。 GET / POST / PUT / DELETE / todos /等 该API可以引用远程TODO服务。 GET / POST / PUT / DELETE / todo_services /等 我可以通过我的API作为代理通过远程服务来处理待办事项 GET / POST / PUT / DELETE / todo_services / abc123 /等 我希望能够在本地待办事项集和远程待办事项集之间进行双向同步。 以一种rpc的方式, POST / todo_services / abc123 / sync / 但是,在“动词很糟糕”的想法中,是否有更好的方法来表示此动作?

5
为什么几种流行的编程语言会受到C的影响?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 根据TIOBE索引,排名前10位的编程语言似乎受C的影响很大: 1. Java 该语言的大部分语法源自C和C ++,但具有更简单的对象模型和更少的低级功能。- wikipedia.org 2. C C是有史以来使用最广泛的编程语言之一,很少有计算机体系结构不存在C编译器。- wikipedia.org 3. C# 在.NET Framework的开发过程中,类库最初是使用称为简单托管C(SMC)的托管代码编译器系统编写的。1999年1月,安德斯·海斯伯格(Anders Hejlsberg)组建了一个团队,以建立当时称为Cool的新语言,该语言代表“类似C的面向对象语言”。- wikipedia.org 4. C ++ 它由Bjarne Stroustrup于1979年在贝尔实验室开始开发,是对C语言的增强。- wikipedia.org 5. Objective-C Objective-C是一种反射式的,面向对象的编程语言,它将Smalltalk样式的消息传递添加到C编程语言中。- wikipedia.org 6. PHP 他将这些脚本重写为C编程语言通用网关接口(CGI)二进制文件,对其进行了扩展以增加使用Web表单以及与数据库进行通信的能力,并将其称为“个人主页/表单解释器”或PHP / FI。- wikipedia.org 8. Python Python是在1980年代后期构思的,它的实现是1989年12月由荷兰CWI的Guido van Rossum开始的,它是ABC编程语言(其本身受SETL启发)的继承者,该语言能够进行异常处理并与Amoeba操作系统进行接口。- wikipedia.org ABC(编程语言)它的设计师声称ABC程序通常大约是等效Pascal或C程序的四分之一,并且更具可读性。- wikipedia.org 9. Perl Perl借鉴了其他编程语言的功能,包括C,shell脚本(sh),AWK和sed。- wikipedia.org 10. JavaScript JavaScript使用受C语言影响的语法-wikipedia.org 看来大多数人都从C借用了他们的语法和/或至少在开始时就受到了其他几种方式的严重影响。为什么?

8
如何确定数据对象类型是否应设计为不可变的?
我喜欢不可变的“模式”,因为它的优点,在过去,我发现设计具有不可变数据类型(某些,大多数甚至全部)的系统是有益的。通常,这样做的时候,我发现自己编写的bug更少,调试起来也容易得多。 但是,我的同龄人通常会避开一成不变。它们一点也不缺乏经验(远非如此),但是它们以经典的方式编写数据对象-私有成员,每个成员都有一个getter和setter。然后通常他们的构造函数不带参数,或者为了方便起见可以带一些参数。很多时候,创建对象是这样的: Foo a = new Foo(); a.setProperty1("asdf"); a.setProperty2("bcde"); 也许他们到处都这样做。也许他们甚至都没有定义使用这两个字符串的构造函数,无论它们多么重要。也许他们以后不再更改这些字符串的值,并且永远不需要更改。显然,如果这些事情是对的,那么将对象更好地设计为不可变的,对吗?(构造函数具有两个属性,根本没有二传手)。 您如何确定对象类型是否应设计为不可变的?有很好的判断标准吗? 我目前正在讨论是否将自己项目中的某些数据类型切换为不可变,但我必须将其证明给同龄人,并且这些类型中的数据可能会(很少)更改-那时您当然可以更改这是一成不变的方法(创建一个新方法,从旧对象复制属性,但要更改的属性除外)。但是我不确定这仅仅是我对不可变事物的热爱,还是对它们的真正需求。

8
敏捷出问题时[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我正在为最近刚入职的一些新手编写敏捷课程,并且我想补充一个警告性的故事,以便他们理解敏捷并不适用于所有项目。 我的问题是,由于到目前为止与我合作的项目的性质一直很好,所以我不能坦诚地说出可能出问题的原因以及在错误类型的项目中使用它的原因。 敏捷项目出错时要注意什么?
23 agile 

12
我刚开始在Scrum工作,似乎缺少了一些东西。我是Scrum的新手
该代码是经典ASP / ASP.NET组合的完整混乱。混乱包括我们修补大混乱或对其进行补充。我们都太忙了,无法开始重写,所以我想知道。 Scrum中哪一部分可以让开发人员有能力说足够就够了,并要求他们有时间开始大型重写?我们似乎无休止地循环使用“ Stories”修补旧代码。 因此,事情似乎由非技术人员执行,他们似乎不希望推动重写,因为他们不了解代码库的糟糕程度。 那么谁来负责进行这种大的重写更改呢?开发人员?Scrum Master? 目前的策略只是为了找到时间,去做自己不参与上级领导,因为他们大多归咎于当前的混乱我们是在.. <-关于非技术人员告诉技术人员在这里做什么插入咆哮->。

7
为什么要教导CS记住记忆?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 过去一年,我在高中时就读了高级位置计算机科学。似乎我们被教导只是记住代码和功能,而不是如何在使用文档等方面变得足够聪明和有效。 实际上,我想很多(如果不是全部)编程工作都可以让您浏览文档,回顾过去的代码和其他代码,本质上是做我的老师认为“作弊”的事情。 尽管我确实同意核心概念对于记忆(在任何主题中)都是必不可少的,但对我来说,为CS类进行笔试似乎是多余和不切实际的,尤其是在实际上您需要编译器,调试器,参考文件的情况下手册以及整个互联网,以便在任何实际工作情况下都能参考。 为什么讲授CS 而不是讲授有用的技能(包括如何使用和解释文档,示例代码,调试器等),而是专注于代码和功能的记忆?
23 learning 

9
为什么这么难使C不那么容易发生缓冲区溢出?
我正在大学上一门课程,其中一个实验室是对它们提供给我们的代码执行缓冲区溢出攻击。范围从简单的漏洞利用到改变堆栈上某个函数的返回地址以返回到另一个函数,一直到更改程序寄存器/内存状态然后返回到您调用的函数的代码,这意味着您调用的函数完全不会利用该漏洞。 我对此进行了一些研究,并且即使在现在,此类漏洞利用仍在很多地方使用,例如在Wii上运行自制程序以及iOS 4.3.1不受限制的越狱行为。 我的问题是为什么这个问题很难解决?显然,这是用于黑客攻击数百件事情的主要漏洞,但似乎很容易解决,只需截断超出允许长度的任何输入,然后对所有输入进行清理即可。 编辑:我想从另一个角度考虑问题-为什么C的创建者不通过重新实现库来解决这些问题?

8
在Scrum中,是否应该将诸如开发环境设置和功能开发之类的任务作为子任务管理在实际用户故事中?
有时在项目中,我们需要花时间在以下任务上: 探索替代框架和工具 学习为项目选择的框架和工具 设置服务器和项目基础结构(版本控制,构建环境,数据库等) 如果我们正在使用用户故事,那么所有这些工作应该去哪儿? 一种选择是使它们全部成为第一个用户故事的一部分(例如,制作应用程序主页)。另一个选择是对这些任务执行加急操作。第三种选择是使任务成为问题 / 障碍(例如,尚未选择的开发环境)而不是用户故事的一部分。

5
不存储新对象而创建新对象是不好的做法吗?
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 7年前。 我见过用Java代码创建的对象,但没有存储对该对象的引用。例如,在eclipse插件中,我看到了SWT Shell的创建过程,如下所示: new Shell(); 这个新的Shell对象没有存储在变量中,但是将一直保持引用状态,直到处理完该窗口为止(默认情况下,关闭该窗口时会发生[我相信?])。 创建这样的对象而不存储对它们的引用是不好的做法吗?还是图书馆设计不当?如果我不需要引用,而只想要对象的“副作用”怎么办?我是否仍应存储参考? 更新: 诚然,我上面的例子很差。虽然我看到过这样创建的UI元素,但是创建这样的SWT Shell可能毫无意义,因为您需要在Shell实例上调用open方法。有由AIX提供更好的例子,如从以下Java并发教程: (new HelloThread()).start(); 在许多情况下都可以看到这种做法,因此问题仍然存在。这是好习惯吗?
23 java 

3
为什么C ++在编程竞赛和竞赛中占主导地位?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 我知道C ++是一种非常快速的语言,但是C会不会变得如此快,或者在某些情况下会更快? 然后您可能会说C ++具有OOP,但是大多数编程难题所需要的OOP数量并不多,我认为C可以处理。 这就是我问这个问题的原因:我对编程竞赛和竞赛非常感兴趣,并且我习惯于用C进行编码。但是,我注意到绝大多数人都使用C ++(例如,在Google Code Jam 2011的25个决赛入围者中有17个使用了C ++,而没有人使用C),所以我想知道我在使用C方面是否处于不利地位。 除了对象定向之外,是什么使C ++更适合编程竞赛的语言?为了在比赛中表现更好,我应该学习和使用哪种语言的功能? 对于背景知识,我认为自己非常精通C,但是我才刚刚开始学习C ++。
23 c++  c 

4
为什么我们需要XML名称空间的URI?
我试图弄清楚为什么我们需要用于XML名称空间的URI,而我找不到这样做的目的。谁能在一个具体的例子中使我有所作为呢? 编辑: 好吧,例如:我来自w3schools <root xmlns:h="http://www.w3.org/TR/html4/" xmlns:f="http://www.w3schools.com/furniture"> <h:table> <h:tr> <h:td>Apples</h:td> <h:td>Bananas</h:td> </h:tr> </h:table> <f:table> <f:name>African Coffee Table</f:name> <f:width>80</f:width> <f:length>120</f:length> </f:table> </root> 那么应该http://www.w3schools.com/furniture持有什么呢?
23 xml  namespace 

8
是否有用于命名类型的良好技术或测试?
一个尴尬,开放的问题,但这是我一直碰到的问题: 易于维护和使用的软件是经过精心设计的软件。试图使设计更直观意味着对组件进行命名,以使下一个开发人员应该能够推断出组件的功能。这就是为什么我们不将类命名为“ Type1”,“ Type2”等的原因。 当您对现实世界的概念(例如客户)进行建模时,这通常就像在对现实世界的概念进行建模后命名类型一样简单。但是,当您构建面向系统的抽象事物时,很容易用尽易于理解和消化的名称。 当尝试使用基本类型或接口描述组件的类型(而不是它们的工作方式)来命名类型系列时,对我来说,情况变得更糟。这自然导致每种派生类型试图描述实现的风格(例如IDataConnection,SqlConnection在.NET Framework中),但是如何表达复杂的内容,例如“通过反射工作并寻找一组特定的属性”呢? 然后,当你终于选择了一个名字,你觉得类型描述什么它试图做,你的同事问:“跆拳道这是否DomainSecurityMetadataProvider实际上做什么? ” 是否有任何好的技术来为组件选择一个好记的名称,或者如何在不弄乱名称的情况下构建一组组件? 我可以对名称进行任何简单的测试,以更好地了解名称是否为“好”,并且对其他人应该更直观吗?
23 design  naming 

10
如何证明应用程序建立在错误的代码库上?
我目前正在审查由一些以前在我的工作中工作过的开发人员构建的系统。从用户的角度来看,该系统运行良好,但是当深入研究代码审查时,这简直是一团糟。我非常确信该应用程序的构建方式将无法承受未来的更新,更不用说使用率的高增长了。 问题是我知道情况有多严重,但我的上级却没有。我该如何向经理证明这一点,以便他真正地看到问题并可以说服他在当前代码库上进行最少的分类,并在不久的将来为该应用程序的下一版本启动新的开发线?

11
是否可以编写不需要不断修改的软件?
我已经用许多不同的语言编写了许多软件,并且还“编写”了与使用Verilog和VHDL的FPGA一起使用的硬件。 我倾向于更喜欢编写硬件而不是编写软件,我认为主要原因之一是可以编写“完成”并且不需要修改的硬件:定义接口和功能,编写测试平台,实施硬件模块,然后使用模拟器测试其功能。然后,您可以依靠该硬件模块作为构建块来创建更大更好的产品:如果需要向该模块添加功能,则可以创建第二个模块并在其中添加功能。您永远不会丢掉原始模块,因为它可以正常工作并且仍然有用。 我对软件的主要不满之一是它永远不会“完成”。总有另一个功能要添加。通常,添加功能时会在以前正常工作的其他地方引入错误。只要不违反接口,在硬件中就不会发生这种情况。 明确地说,我并不是在建议使用某些功能列表来构建某个版本,而仅此而已:永远是这样:我赞成随着时间的推移进行迭代和发行多个版本以添加新功能。我只是不想在左侧戳代码而在右侧找到错误,而这似乎是在添加新功能之后发生的。 是否可以通过类似于“编写”硬件的方式来编写软件?有没有一种好的软件开发方法,可以始终取得向前的进展,并允许添加新功能而无需重写现有代码和引入新的错误?

11
在Bank world中选择代码设计工作或懒惰
我在一家出色的投资银行工作了两年。 我进行了一些技术项目,希望创建最优化的代码,同时尊重适应的良好设计模式,SOLID原则,demeter规律并避免各种重复的代码... 当生产交付=>零错误时,一切都按预期进行。 但是,大多数开发人员来找我是为了使我的所有代码过于复杂以至于无法理解阅读。我听了一个例子:“做一些if和instanceof,忘记多态性,这样很容易纠正紧急生产错误”。我不想回答…… 知道这些开发人员一点也不好奇,拒绝努力理解一个好的设计(例如,90%的开发人员不知道什么是策略模式,并且编写过程代码,并且从不进行设计,因为他们说,他们很简单) ),我的项目经理告诉我,我对银行世界的看法确实是错误的,而且过于理想化。 你会建议我什么?我要重申的是,我是否真的希望真正好的代码,或者让我适应大多数开发人员,对于我来说,重复设计代码对我而言,这并不是真正有趣的设计代码,而是我们开发人员工作的全部美。 或者相反,他们是否应该学习基本的面向对象原则和最佳实践以适应我的代码?

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.