软件工程

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


5
什么是持续集成(CI),它有什么用?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 有人可以向我解释持续集成的概念吗,它如何以一种易于理解的方式工作?公司为什么要在代码交付工作流程中采用CI?我是一名开发人员,而我的公司(主要是构建团队)使用Team City。作为开发人员,我总是签出,更新代码并将其提交到SVN,但总的来说,我从来没有真正担心过TeamCity或CI。所以我想了解CI的用处?CI是敏捷方法论的一部分吗?

5
以编程方式找到算法的Landau表示法(Big O或Theta表示法)?
我习惯于手动搜索我的算法的Landau(Big O,Theta ...)表示法,以确保它们已尽可能地优化,但是当函数变得真正又大又复杂时,它就在不断发展。手工做的时间太多。它也容易出现人为错误。 我花了一些时间在Codility(编码/算法练习)上,并注意到它们会为您提交的解决方案(时间和内存使用量)提供Landau表示法。 我想知道他们是怎么做到的...你会怎么做? 除了词法分析或代码解析之外,还有其他方法吗? 这个问题主要涉及PHP和/或JavaScript,但是我对任何语言和理论都开放。

4
如何最好地让那些无所事事的非技术经理束手无策,并且仍然能提供出色的工作?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 7年前关闭。 这个问题可能被认为是主观的(我得到了警告)并且已经结束,但是由于我需要一些很好的建议/经验,因此我将冒险。 我看了在下面“关于”页面的Fog Creek软件,该公司认为乔尔Spolsky的成立,是CEO: 早在2000年,Fog Creek的创始人Joel Spolsky和Michael Pryor一直在寻找一个工作场所,那里程序员有体面的工作条件,并有机会做出色的工作,而不会感到烦恼,非技术经理无法进入方式。每个高科技公司都声称他们想要优秀的程序员,但他们不会把钱花在嘴上。 它从物理环境开始(数十个小房间被塞进一个嘈杂的黑暗房间,销售人员在电话里大喊大叫,使开发人员无法集中精力)。但这远不止于此。经理们对变更感到恐惧,他们将任何新想法视作一种被隔离的奇异病毒。拿破仑复杂的初级管理人员坚持认为事情必须按照自己的方式做,否则您将被解雇。公司家具警察在任何人将电影海报贴在小隔间里时都感到痛苦不已。杂乱无章的事情如此猖that,以至于即使有好的主意,也不可能用它们来制造产品。缺乏经验的经理人实行即时运行管理,就如何做事情发出严厉命令,而又不会四处寻找他们的法令的滑稽结果。 最糟糕的是,负责的MBA类型认为编码是一种支持功能,基本上是一种花哨的键入形式。 一个钝真相关于当今大多数大型软件公司的!不幸的是,并不是每个开发人员都像Joel Spolsky 一样gutsy(或者lucky,我可以说吗?)!所以我的问题是: 如何最好地与此类经理合作,让他们远离困境,同时仍能完成出色的工作?

3
如何在两个节点之间的相互连接期间避免分布式死锁?
假设我们有两个对等节点:第一个节点可以向第二个节点发送连接请求,但是第二个节点可以向第一个节点发送连接请求。如何避免两个节点之间的双重连接?要解决此问题,顺序执行为创建入站或出站TCP连接而执行的操作就足够了。 这意味着每个节点都应按顺序处理每个新的连接创建操作,包括传入连接和传出连接。这样,在从节点接受新的传入连接之前或在向节点发送连接请求之前,维护已连接节点的列表,只需检查该节点是否已存在于列表中就足够了。 为了使创建连接的操作顺序进行,对连接的节点列表执行锁定就足够了:实际上,对于每个新连接,新连接的节点的标识符都添加到该列表中。但是,我想知道这种方法是否会导致分布式死锁: 第一节点可以向第二节点发送连接请求; 第二节点可以向第一节点发送连接请求; 假设两个连接请求不是异步的,则两个节点都锁定所有传入的连接请求。 我该如何解决这个问题? 更新:但是,每次创建新的(传入或传出的)连接时,我仍然必须锁定列表,因为其他线程可能会访问该列表,因此仍然存在死锁问题。 更新2:根据您的建议,我编写了一种算法,以防止相互接受登录请求。由于每个节点都是对等节点,因此它可以具有一个客户端例程来发送新的连接请求,以及一个服务器例程来接受传入的连接。 ClientSideLoginRoutine() { for each (address in cache) { lock (neighbors_table) { if (neighbors_table.contains(address)) { // there is already a neighbor with the same address continue; } neighbors_table.add(address, status: CONNECTING); } // end lock // ... // The node tries to establish …

4
对于像Dart这样可编译为其他语言的语言,GPL如何运作?
除了特殊的Chromium版本Dartium之外,任何Web浏览器均不支持Google Dart语言。要将Dart用于生产代码,您需要通过Dart-> JavaScript编译器/翻译器运行它,然后在Web应用程序中使用输出的JavaScript。 因为JavaScript是一种解释型语言,所以每个接收“二进制”(也称为.js文件)的人也都收到了源代码。 现在,GNU通用公共许可证v3.0指出: “作品的“源代码”是指对作品进行修改的首选形式。” 这意味着除JavaScript代码外,还必须将原始Dart代码提供给最终用户。这是否意味着即使已经以人类可读/可写/可修改的形式提供了源代码的副本,但任何用Dart编写的Web应用程序也必须向其网站的所有访问者提供原始Dart代码?

7
选择编程范例来解决问题的经验证据
C2 Wiki讨论了面向对象编程的经验证据,该结论基本上得出结论,没有什么可以超越权威。这是在2008年最后一次编辑。这里的讨论似乎可以证明这一点:关于OO是否过时的问题,当函数编程是一个错误的选择,并且AOP的优缺点都可以由贡献者的意见来回答,而无需依赖证据。 当然,欢迎既有知名的从业人员的见解,也可以提供有价值的东西,但是当它们与实验数据一致时,它们似乎更加合理。这个证据存在吗?我知道基于证据的软件工程是一回事,但是我可以在这种情况下实践吗?具体来说,如果我有一个P想通过编写软件来解决的特定问题,是否存在大量的知识,研究和研究,这些知识,研究和研究会让我看到解决问题的结果如何P取决于编程范例的选择? 我知道哪种范式作为“正确答案”可以取决于特定研究关注的指标,研究保持不变或变化的条件,以及其他因素。这不会影响我寻找此信息并进行严格评估的愿望。 显而易见,有些人认为我正在寻找“曲柄”解决方案-某些香肠机将我的问题信息放入其中,而其中出现了“功能”或“结构化”之类的词。这不是我的意图。我正在寻找的是如何进行研究-尽管有很多警告和假设,但我不会在这里讨论,但是有很多关于此事的文献会-有关软件的某些属性的变化取决于问题和选择的范式。 换句话说:有人说“ OO可以提供更好的灵活性”或“功能程序的bug更少” –我要的(部分)证据就是这一点。其余人则要求提供证据证明这一点,或者要求这些假设正确的假设,或者表明这些考虑并不重要的证据。关于为什么一种范例比另一种范例更好的观点有很多。这些背后有什么目标吗?

5
学习一种新语言是否为时过早?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 个人背景:最近6个月,我在大学里正式学习C ++。在此之前,我涉足JavaScript已有一年。现在,我正在考虑在放假的一个月内学习Python。 通过在学习过程的早期分散我的注意力,是否会降低学习效率?我应该花一个月的时间继续使用C ++吗?还是学习一种新语言永远不会太早?

1
为什么要花费数小时才能通过MRO解码来自“好奇号”流动站的传输?
NASA的这段视频片段说,来自火星侦察轨道器(MRO)中继的“ 好奇号”的数据将被存储几个小时,然后传输到地球(大约需要14分钟),此后,工程师需要花费几个小时才能解码数据。 从我阅读的内容来看,如果需要,MRO似乎可以用作Curiosity的备用通信设备。 在好奇号降落的情况下,我认为MRO会一直存储数据,直到它绕着红色星球绕行,并在传输之前与地球有直接的视线(然后,我只是在这里推测),我可以了解。 但是,为什么在地球上收到MRO中继的信号后,NASA工程师要花几个小时来解码呢? (加分点:解码MRO信号通常需要几个小时吗?)

3
是更好的做法是在类中预初始化属性,还是在过程中添加它们?
很抱歉,这是一个绝对如此愚蠢的问题,但是我很好奇目前存在的最佳做法,而且我似乎在Google上找不到很好的答案。 在Python中,我通常使用一个空类作为超级类数据结构容器(有点像JSON文件),并在此过程中添加属性: class DataObj: "Catch-all data object" def __init__(self): pass def processData(inputs): data = DataObj() data.a = 1 data.b = "sym" data.c = [2,5,2,1] 这给了我极大的灵活性,因为容器对象实际上可以存储任何东西。因此,如果出现了新的需求,我将其添加为DataObj对象的另一个属性(我在代码中传递了该属性)。 但是,最近(FP程序员)给我留下了深刻的印象,那就是这是一种糟糕的做法,因为这使得很难阅读代码。必须仔细阅读所有代码,以找出DataObj实际具有的属性。 问题:如何在不牺牲灵活性的情况下重写此代码,以实现更大的可维护性? 我可以采纳函数式编程中的任何想法吗? 我正在寻找最佳实践。 注意:一种想法是使用一个期望遇到的所有属性来预先初始化该类,例如 class DataObj: "Catch-all data object" def __init__(self): data.a = 0 data.b = "" data.c = [] def processData(inputs): data = …

7
您如何应对过于迅速的变更带来的成本?
像大多数现代开发人员一样,我非常重视敏捷原则,例如客户协作和对变更的响应,但是当产品所有者(或由谁决定需求和优先级的人)过于频繁地改变需求和优先级时会发生什么呢?喜欢一天几次? 我最近继承了一个很小的代码库,该代码库有错误,不完整,甚至无法处理它应该想到的最简单的情况。我可以处理技术问题,但每天都会收到几封电子邮件,短信或电话,说:“天哪,您现在就必须努力!最重要的事情!这是一个人!”(这只是一点点夸张)更糟糕的是,大多数事情都是次要细节,甚至与该软件实际上应做的事情都不相关,反正要花几天的时间才能实现。我试图解释的是,时间太短了,我们应该首先专注于最重要的事情,但是翻译中似乎会丢失一些东西,因为同一件事会在一两天后发生。 是否有某种产品所有者负责人的角色,深入的研究,隐喻或报价可以帮助我减少浪费的精力或至少解释这种混乱行为的代价?

4
如何向同事介绍代码
您如何将代码库引入团队中的新成员,该代码库可能相当复杂并且与很多“陷阱”缠在一起? 我认为最简单的方法是用图表来布局整个体系结构,并在新人逐渐习惯于代码后花几个星期(或几个月)来赋予新定义的任务(范围广)。 但是,作为顾问(和初级员工),由于时间限制或团队角色指定,我不能总是这样。(我在这个特定项目上的工作时间是其他人的两倍,因此“初级”绝不是“对代码/项目的了解较少”。) 我现在已经受了好几次任务,向项目和代码介绍一个新成员,可悲的是,每次我发现自己的能力都不比以前更好。我喜欢图表和图片,但是经常觉得它们并不能充分说明系统的复杂性。(小孩子的“陷阱”呢?) 该项目已经到了将要交付给客户的地步,为了使事情更具挑战性,我将要与之进行知识转移的人实际上只是大学毕业。(并不是说我与高级开发人员进行知识转移时会更好。) 我每个月参加一次用户组,并在出现其他机会时参加,因此我没有被无用的新主题介绍,但是感到我复制有效知识共享的能力严重不足。 任何建议将不胜感激。我主要是在寻找可以遵循的指南。例如:您从哪里开始?你如何进行?您如何在不花大量时间的情况下涵盖听众不熟悉的技术或模式?您在哪里将业务逻辑与代码结构联系在一起? 谢谢! (与往常一样,请根据需要随意编辑问题。)

3
在Scrum团队中担任团队经理和开发人员
我正在管理一个由6个人组成的团队,这些团队最近搬到了Scrum。 我们有一个Scrum Master(团队中的一名开发人员)和一个产品负责人。 由于我有很多空闲时间(因为我过去所做的很多管理工作现在都是由Scrum主管和产品负责人完成的),并且由于我想保持技术上的相关性,所以我正在做一些技术开发工作。 我是开发团队的一员,致力于每个sprint中的一些故事,并作为团队的一员参加所有会议。 您认为这是个好主意吗?它可以与团队的“自组织”相矛盾吗?
11 scrum  management 

4
我应该在二进制运算符之前还是之后放置换行符?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 使用Python或Javascript时,应始终将二进制运算符放在上一行的末尾,以防止换行符过早地终止代码。它可以帮助您发现错误。 但是在C或C ++中,这不是问题,所以我想知道: 我有什么理由比第二个版本更喜欢第二个版本吗? return lots_of_text + 1; 与 return lots_of_text + 1; (例如,其中之一有助于防止其他类型的错误吗?还是其中之一被认为更具可读性?)
11 c++  coding-style 

6
Java开发人员应该了解垃圾收集算法吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 最近有人在采访中问我是否知道任何垃圾收集算法。 我知道什么是垃圾回收,但是我从未真正考虑过学习垃圾回收算法,因为作为开发人员,我不必担心它,垃圾回收器为我完成了所有艰苦的工作。 你们认为Java开发人员应该了解垃圾收集器算法吗?如果是,您能告诉我应该看哪个?

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.