软件工程

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

9
应用程序日志记录有哪些模式和反模式?[关闭]
最近,我不得不调查我们的大型企业应用程序的一个领域问题。我不得不梳理日志以发现问题,这让我感到恐惧,最终,日志根本无法帮助您识别/隔离错误。 注意:我了解并非所有错误都可以通过日志发现。这不会改变日志令人恐惧的事实。 我们的日志记录存在一些显而易见的问题,我们已经可以尝试解决。我不想在这里列出这些内容,因此我不能简单地向您显示我们的日志文件,以便您可以就如何做提供建议。 相反,为了评估我们在日志记录方面的表现,我想知道: 关于应用程序(尤其是大型应用程序)的日志记录有哪些准则(如果有)。 是否有我们应该遵循的模式或我们应该注意的反模式? 这是要修复的重要事情,还是可以修复,还是所有日志文件都非常庞大,并且您需要补充脚本来分析它们? 旁注:我们使用log4j。
66 logging 

12
让非程序员了解开发过程
当为一家主要不是编程公司的公司开始一个项目时,人们的期望之一是最后会有一个成品,其中没有任何错误,并且可以立即完成所需的一切。但是,这种情况很少发生。 有什么方法可以管理期望并向非程序员说明软件开发与其他类型的产品开发有何不同?

11
遗留代码移交最佳实践
几个月后,一位同事将继续进行一个新项目,而我将继承他的一个项目。为了准备,我已经下令迈克尔·费瑟斯(Michael Feathers)有效地使用旧版代码。 但是本书以及到目前为止我发现的有关遗留代码的大多数问题都与按原样继承代码的情况有关。但是在这种情况下,我实际上可以访问原始开发人员,并且我们确实有时间进行有序移交。 我将继承的一段代码背景: 它的功能是:没有已知的错误,但是随着性能要求的不断提高,在不久的将来将需要进行一些优化。 未记录:在方法和类级别上几乎有零个文档。但是,该代码应该在更高级别上执行的操作已被很好地理解,因为多年来我一直在使用其API(作为黑匣子)进行编写。 只有更高级别的集成测试:只有集成测试可以测试通过API与其他组件之间的正确交互(再次是黑匣子)。 非常低级的,针对速度进行了优化:由于此代码是整个应用程序系统的核心,因此多年来,许多代码已进行了多次优化,并且非常低级(对于某些结构,一部分具有自己的内存管理器) /记录)。 并发和无锁:虽然我对并发和无锁编程非常熟悉,并且实际上为该代码贡献了一些内容,但这又增加了另一层复杂性。 大型代码库:这个特定的项目有超过一万行代码,因此我无法向我解释所有内容。 用Delphi撰写:尽管我不认为该语言与该问题紧密相关,但我将把它放在这里,因为我认为这种类型的问题与语言无关。 我想知道如何才能最好地度过他离开之前的时间。这里有一些想法: 让一切都可以在我的机器上构建:尽管应该将所有内容检查到源代码控制中,但谁也不会忘记偶尔检查一次文件,因此这应该是首要任务。 更多测试:虽然我希望进行更多的类级单元测试,以便在进行更改时可以尽早发现我引入的任何错误,但现在的代码不可测试(大型类,长方法,太多代码)相互依赖)。 文档内容:我认为对于初学者来说,最好将文档重点放在代码中那些本来就难以理解的领域,例如由于其低级/高度优化的特性。恐怕其中有些事情看起来很丑陋,需要重构/重写,但是实际上其中存在一些优化,这是我可能会错过的一个很好的原因(参见Joel Spolsky,您应该做的事情)从不做,第一部分) 如何记录:我认为最好是一些体系结构的类图和关键功能的序列图以及一些散文。 向谁记录:我想知道让他写文档或让他向我解释会更好,这样我可以写文档。我担心,对他而言显而易见但对我而言不明显的事情将无法得到适当覆盖。 使用成对编程进行重构:由于时间限制,这可能无法实现,但是也许我可以重构他的一些代码,以使其在他仍然在提供有关事物为何如此的方式的输入时更加可维护。 请评论并添加到此。由于没有足够的时间来完成所有这些工作,因此我对如何确定优先级特别感兴趣。 更新:移交项目结束后,我在下面的答案中根据自己的经验扩展了此列表。

30
在一个项目上注定要发生厄运的警告信号是什么?[关闭]
不管使用哪种语言,行业或经验如何,从事失败的项目都是大多数程序员的共同点之一。 这些项目可以是很棒的学习经历,令人心碎的灾难(或两者都有!),并且可能由于多种原因而发生: 高层管理者的心变 技能不足/资源不足的团队 开发周期中优秀竞争对手的出现 管理上/下 一旦完成了几个这样的项目,就可以在早期阶段准确地确定一个项目注定要失败的时候吗? 对我来说,一个重要的迹象是,外部的最后期限是一个艰难而又快速的时期,同时又包含了功能的蔓延。我已经看到计划周密的项目,一旦后期的功能请求开始加入并添加到最终的“交付成果”中,按计划进行的项目就会异常偏离正常。这些请求的提议者赢得了Columbo的绰号,因为很少有人离开会议室而只要求“再做一件事”。 您要注意的那些警告信号会引起即将来临的厄运的警钟?

25
坦白说,您喜欢牛仔编码吗?[关闭]
大多数程序员捍卫政治上正确的方法论,例如敏捷,瀑布式,RUP等。其中一些遵循方法论,但并非全部遵循。坦白说,如果您可以选择方法论,那么您肯定会采用主流的“正确”方法论,或者您更喜欢像牛仔编程这样的“简便”方法论?为什么? 我知道这取决于。请说明何时使用一种或另一种。请说出您在Cowboy编码方面看到的优势。 在Wikipedia上了解有关Cowboy编码的信息

3
使用哪种编程语言编写BIOS程序?
据我了解,ROM中保存的BIOS代码/位流应该是通用的(与多个CPU类型或ISA一起使用)。另外,我在网络上看到有可能转储其代码(并“反汇编”它)。 那么,它是用哪种语言,指令集或机器代码编写的呢?它不需要任何类型的处理器来执行其操作吗?如果是这样,我想它将使用外部CPU,那么它如何知道所使用的特定指令集? 也许它有一个内部处理器?
65 cpu  bios 

6
在数据库配置方面,应该在UTF-8上使用Latin-1吗?
我们在我工作的公司中使用MySQL,并使用Ruby on Rails构建面向客户端和内部的应用程序。 当我开始在这里工作时,遇到了一个以前从未遇到过的问题。生产服务器上的数据库设置为Latin-1,这意味着只要有用户输入,用户在其中复制和粘贴UTF-8字符,MySQL gem就会引发异常。 我的老板称这些为“坏字符”,因为它们大多数是不可打印的字符,并说我们需要将它们去除。我找到了几种方法来完成此操作,但是最终我们遇到了需要UTF-8字符的情况。另外,这有点麻烦,特别是因为似乎我所读过的唯一解决方案是将数据库设置为UTF-8(对我来说很有意义)。 我听到的坚持使用Latin-1的唯一论点是,允许不可打印的UTF-8字符可能会使MySQL中的文本/全文搜索混乱。这是真的吗? 还有其他原因使人应该在UTF-8上使用Latin-1吗?据我了解,它是卓越的,并且变得越来越普遍。

7
1 <10的比较是否比1 <1000000便宜?
我只用了大约10亿作为z-indexCSS中a的数量,并在考虑必须进行的比较。在非常大的数字与非常小的数字之间进行比较时,ALU级别的性能是否有所不同? 例如,这两个摘要中的一个摘要会比另一个摘要贵吗? snippet 1 for (int i = 0; i &lt; 10000000; i++){ if (i &lt; 10000000000000) { //do nothing } } snippet 2 for (int i = 0; i &lt; 10000000; i++){ if (i &lt; 1000) { //do nothing } }
65 performance  cpu 

8
如何处理加入开源项目的困难程序员?
我有一个特定站点的开放源脚本(我试图在这里不使用任何名称来命名),我和其他一些开发人员最近将其移至GitHub。自从迁移到新系统以来,我们已经获得了几名新开发人员,特别是其中一位非常活跃的开发人员。但是,这个活跃的人已经开始更改许多项目。 首先,他删除了我们的版本控制系统(不像Git,而是那样-我们称它为version v4.1.16),并说最好在我们认为准备就绪时将代码推送到该站点。现在没有放置发布说明的集中位置,这已经很烦人了。 使我准备好收拾行装的事情是推脚本。该项目的另一位开发人员编写了一个简单的基于Python的推送脚本。由于我们在不同的地方在线保留了多个版本的脚本,因此我开始使用图形界面来编写一个较大的Java程序,以取代Python脚本。我在IRC上通知了所有人,我收到了程序员的一个非常讨厌的答复,他说旧的基于Python的脚本可以完成我所能做的一切,而且更加轻巧(他还评论说,他认为Python比Java更好,依此类推)。我查看了旧推脚本的代码,发现他说的功能都不存在。 所以现在我想知道该怎么办。我在这个项目上花了很多时间,所以我不想起床离开,但是我发现与这个新开发人员一起工作很困难。另一方面,他现在是项目的第一提交者,提交的数量比主要开发人员还要多。我不太确定该怎么做。还有其他人遇到过这个问题吗?如果是这样,您做了什么? 更新1:我已经禁用了每个人的提交访问权限,并且我要求人们接受请求请求。我还提出了一些解决其他问题的措施。其他人都没有对此表示任何支持。麻烦的开发人员只是说,那些不严格遵循“提交操作”的人会认为,当项目真的没有时,它就会变得杂乱无章。我显然不同意这一点,因此我正在认真考虑退出该项目。 更新2:首席开发人员开始对以下事实感到满意:我的一个提交应该删除了代码中的三个换行符(还原提交在我发布讨论后显示,甚至没有引用我的“提交”),然后他们两个开始讨论是否撤消我的提交访问权限。因此,我已经完成了合乎逻辑的事情,并离开了项目。感谢您对每个人的帮助!
65 open-source  team 

14
以动态类型的语言从单个函数返回不同的数据类型不是一个好主意吗?
我的主要语言是静态类型(Java)。在Java中,您必须从每个方法返回单个类型。例如,您不能使用有条件返回a String或有条件返回a的方法Integer。但是例如在JavaScript中,这是很有可能的。 用静态类型的语言,我明白了为什么这是一个坏主意。如果返回Object了每个方法(所有类都继承自该方法的公共父级),那么您和编译器将不知道您在处理什么。您必须在运行时发现所有错误。 但是在动态类型语言中,甚至可能没有编译器。在动态类型的语言中,对于我来说,为什么返回多个类型的函数不是一个好主意并不为人所知。我在静态语言方面的背景使我避免编写此类函数,但是我担心自己会紧盯着一种功能,该功能可以使我的代码更清晰一些,从而无法看到。 编辑:我将删除我的示例(直到我可以想到一个更好的示例)。我认为这引导人们回答我不想提出的观点。

13
空保护每个取消引用的指针是否合理?
在一项新工作中,我在代码审查中被标记为这样的代码: PowerManager::PowerManager(IMsgSender* msgSender) : msgSender_(msgSender) { } void PowerManager::SignalShutdown() { msgSender_-&gt;sendMsg("shutdown()"); } 有人告诉我最后一个方法应为: void PowerManager::SignalShutdown() { if (msgSender_) { msgSender_-&gt;sendMsg("shutdown()"); } } 即,即使它是私有数据成员,我也必须对它进行NULL保护msgSender_。我很难克制自己,不能用粗话来形容我对这块“智慧”的感觉。当我要求解释时,我听到一系列恐怖故事,这些故事是关于某位初级程序员如何在某年内对类应该如何工作感到困惑的,并意外删除了一个他本不应该拥有的成员(然后将其设置为NULL之后) (显然)),并且在产品发布后,事情就在现场爆发。我们已经“学到了硬道理,相信我们”,最好NULL检查一下所有内容。 在我看来,这就像简单而简单的货物崇拜编程。一些好心的同事正在认真地尝试帮助我“了解它”,并了解这将如何帮助我编写更强大的代码,但是...我忍不住觉得自己是不了解它的人。 编码标准要求首先检查函数中解引用的每个指针NULL(甚至是私有数据成员)是否合理?(注意:为提供背景信息,我们生产的是消费类电子设备,而不是空中交通管制系统或其他“故障等同人员死亡”的产品。) 编辑:在上面的示例中,msgSender_协作者不是可选的。如果是NULL,则表明存在错误。传递给构造函数的唯一原因是PowerManager可以使用模拟IMsgSender子类进行测试。 简介:对此大家有一些非常好的答案,谢谢大家。我接受@aaronps的邮件是因为它简短。似乎有相当广泛的普遍同意: 强制规定NULL看守每一个复引用指针是矫枉过正,但 您可以通过使用参考(如果可能)或const指针来避开整个辩论,并且 assert语句是NULL警卫人员的更开明的选择,用于验证是否满足函数的前提条件。

8
我该如何挽救我的实习机会?[关闭]
我目前在一家大型非软件开发公司担任实习生。我申请的职位不是专门的开发职位,但雇用我的团队希望拥有CS专业,以帮助他们尝试开发一些内部项目。我来这里已经四个星期了,最初的困惑开始消退。但是,我是整个办公室中唯一的CS专业人士-我的团队,大楼甚至附近的地方都没有软件开发的背景。我最好的是数据库经理,他们的部门太忙了,无法为我的项目提供支持。我的队友们帮助我了解他们如何做他们的工作(我做我的工作,这是很重要的),但没有人帮我做我的工作,即发展。 他们给我的项目范围比我在学校所做的任何事情都要大。加上我独自一人工作,试图在没有任何形式的指导甚至没有明确定义的目标的情况下从头开始开发应用程序的事实,我非常担心自己的成功能力。我几乎不知道应该从哪里开始,现在我可能还不到两个月。 我觉得我应该学习软件开发过程,但是现在好像我在黑暗中摸索。对于我来说,这尤其令人不安,因为我一开始对自己的开发技能不是很自信。我一直在研究和自学,但是我只是一点一点。他们对我寄予厚望,但我不确定自己的能力。显然,我需要坐下来与我的经理讨论我所处的职位,我打算尽快做到这一点(他们经常出差并离开办公室)。 我该如何处理?这次实习将在我知道之前结束,并且我不想在这里呆着任何时间。他们也不希望这样,他们随时可以为我提供帮助,但是如果没有编程知识,他们将无能为力。恐怕告诉他们我没有能力生产他们想要的东西。我应该如何与他们联系?我看到工程实习生从其他工程师那里得到帮助,学习如何做他们的工作,我觉得我只是坐在这里花时间。任何有关如何纠正我的处境的建议将不胜感激。 更新资料 我感谢大家提供的所有有益反馈,这使我放心。我要做的第一件事是与经理和主管会面。我们在这里讨论了我的期望。他们知道我没有太多的实习时间,这有助于我们确定要完成的框架的类型,这将使​​未来的实习生或员工有希望从我留下的东西中受益。我还用分配的时间解决了我对自己能力的担忧,他们理解并期待着。 我收到了另一个地方的数据库管理员打来的电话-我的经理与他的主管进行了交谈,他们将支持我的项目,这将为我提供使用的资源,因此我不会不知所措。我在做。虽然只有一半。在所有可能的项目中,我们将其范围缩小到两个最重要的项目。至于我的其他项目,正如有人提到的那样,我本质上是首席软件架构师,这对于实习生来说是一种独特的情况。如果事情至少成功了一半,我想我将获得很多知识和经验,可以帮助我与未来的雇主合作。就目前而言,我认为我有一定​​的基础来开始研究和开发我的项目。再次感谢大家的答复!

1
Dijkstra给志愿者做了什么任务,他的论文“谦虚的程序员”中提到了这一点?
在Dijkstra的论文“谦虚程序员”中,他提到自己给一些志愿者解决了一个问题: “我已经对真正有经验的志愿者进行了一些编程实验,但结果出乎意料,出乎意料。我的志愿者中没有一个人找到明显且最优雅的解决方案。经过仔细分析,结果发现有一个共同的来源:他们的重复概念与相关的受控变量要加强的思想紧密联系在一起,以至于他们在精神上看不见明显的事物。他们的解决方案效率低下,不必要地难以理解,并且花了很长时间才找到它们。” Dijkstra给志愿者的问题是什么?有什么解决方案?

5
为什么某些大型项目(例如Git和Debian)仅使用邮件列表而不使用问题跟踪器?
对于任何规模合适的项目,Bug跟踪器对我来说似乎都不是一件容易的事-它使组织数百或数千个问题变得非常容易,而不会发生问题冲突或混淆的情况。 因此,当我看到一些非常大的项目(例如Git)使用邮件列表作为协调维护和开发的主要方法时,我就有些震惊。例子: Git-社区页面: ...错误报告应发送到此邮件列表。 Debian错误跟踪系统,根据Wikipedia: ...它的独特功能是它没有任何形式的Web界面来编辑错误报告-所有修改都是通过电子邮件完成的。 许多现代的错误跟踪器与电子邮件(可以接收有关正在查看的错误或已分配给您的错误的评论或通知)以及版本控制系统(可以将提交标记为解决问题等)都具有很好的集成性。 )。其中大部分必须通过邮件列表手动完成,并且您会收到大量关于不感兴趣的错误的电子邮件。 那么,与基于Web的错误跟踪器相比,邮件列表的主要优点是什么?为什么某些大型项目仅使用邮件列表?

8
创建我自己的数据库系统
我需要学习数据库如何工作才能更有效地使用它们,而我的学习方式就是这样做。 我想创建自己的数据库系统。我并不是指创建一个使用查询来解析文件的伪数据库;这只是带有查询语言的文件系统接口。我说的是数据库引擎的实际结构。而且由于我的想法既不是关系型的也不是面向文档的(如果存在的话,它就是“面向节点的”),所以我需要任何资源尽可能抽象和高级。 那么我将如何去创建它呢?我可以阅读哪些资源/教程/书籍以了解? 语言一点都不重要。理想情况下,该代码应为伪代码以说明该概念,而不是与特定语言绑定,而是可以执行任何操作。我无法在Google上找到关于此事的任何信息(因为我对这个问题非常不了解,也许我只是没有输入正确的搜索字词)。 如果没有这样的资源,那么我想关于如何创建客户端的事情至少是朝正确方向迈出的一步。

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.