软件工程

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

11
维护方面,在不进行大括号干预的情况下“其他时间”是否被认为安全?
是否在else while不使用大括号的情况下将其视为“安全”的维护方法? 编写if-else没有括号的代码,如下所示... if (blah) foo(); else bar(); ...带有风险,因为缺少花括号,很容易在不经意间更改代码的含义。 但是,下面是否也有风险? if (blah) { ... } else while (!bloop()) { bar(); } 还是else while不使用大括号将其视为“安全”的?

12
是否有描述这种编码方法的反模式?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 我有一个代码库,程序员倾向于将其包装在没有意义的区域中。例如,给定一个错误日志,我们可以通过 ErrorLog.Log(ex, "friendly message"); 他添加了其他各种方法来完成完全相同的任务。例如 SomeClass.Log(ex, "friendly message"); 它只是转过身来并调用第一个方法。这增加了复杂性级别,并且没有任何额外的好处。是否有一个反模式来描述这一点?

6
建议IT需求是开发人员的工作吗?
我是唯一一个即将结束的Web应用程序开发人员。现在,我们正在研究使其在大约几个月的时间内上线。 这是非IT公司的Web应用程序。尽管他们有自己的内部IT团队,但是他们已经问过我对实时服务器的硬件要求是什么。RAM,32位或64位。 内部IT团队不应该这样做吗?或者由于我是唯一从事该项目的人员,所以我有责任让他们知道可能影响项目性能的任何特定硬件要求吗? 我问这个问题的原因是,我以前没有做过。过去,我一直被赋予一台服务器,并要求在其上部署应用程序。我从不担心服务器配置等。

5
如何解释为什么设计选择好?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 随着我成为一名更好的开发人员,我发现我的许多设计技能更多地来自于直觉而非机械分析。这很棒。它使我可以阅读代码并更快地体会到它。它使我可以轻松地在语言和抽象之间转换设计。它使我可以更快地完成工作。 缺点是,我发现很难向队友(更糟糕的是,管理层)解释为什么特定的设计是有利的。特别是在最佳实践方面落后于时代的队友。“这种设计更具可测试性!” 或“与继承相比,您应该更偏向于组成。” 直奔他们的脑袋,进入我的兔子洞,试图让所有人都了解软件工程的最新进展。 我当然会在实践上做得更好,但是与此同时,这会浪费很多时间和/或糟糕的设计(这将导致以后浪费时间进行修复)。当好处对听众来说并不完全明显时,我该如何更好地解释为什么某种设计会更好?


17
您在职业生涯中学到的最好的课程是什么?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我认为我的工作是“没有五分钟的工作”-程序员倾向于对开发过于乐观,我们应该在认真思考问题之后再承诺快速解决问题,然后再深入研究代码

6
函数式编程是面向对象的超集吗?
我做的功能越多,我越觉得它会增加一个额外的抽象层,就像洋葱的层如何一样-都包含了先前的层。 我不知道这是否是真的,所以要脱离我多年使用的OOP原则,谁能解释功能如何准确地描述其中的任何一个:封装,抽象,继承,多态性 我想我们都可以说,是的,它具有通过元组进行封装,或者从技术上讲元组是否可以算作“函数式编程”,还是它们只是该语言的实用程序? 我知道Haskell可以满足“接口”要求,但是再次不确定它的方法是否具有功能性?我猜想函子具有数学基础的事实,您可以说函子是对功能的期望而定的,也许吧? 请详细说明您认为功能是否满足OOP的四项原则。 编辑:我了解功能范式和面向对象范式之间的区别就很好,并且意识到现在有很多多范式语言可以同时做到这两种。我真的只是在寻找关于完全fp(例如纯粹主义者,例如haskell)如何完成所列4项中的任何一项的定义,或者为什么它不能做到其中任何一项的定义。即“可以使用闭包来封装”(或者如果我对此信念有误,请说明原因)。

6
版本历史真的很神圣吗?还是最好重新设定基础?
我一直都同意Mercurial的口头禅1,但是,既然Mercurial与rebase扩展捆绑在一起,并且它是git中的流行做法,我想知道它是否真的可以被视为“不良做法”,或者至少足以避免使用。无论如何,我都知道在推送之后重新部署基地很危险。 OTOH,我认为尝试将5个提交打包到一个文件中以使其看起来更整洁(尤其是在生产分支中)的意义,但是,我个人认为能够对部分功能进行部分提交会更好一些实验已经完成,即使它不是很漂亮,但是看到类似“尝试用X来做,但毕竟不如Y,以Y为基数做Z”这样的内容,恕我直言对那些学习的人来说具有很好的价值。代码库,并遵循开发人员的思路。 我非常自以为是(愚蠢,内脏,有偏见)的观点是,程序员喜欢重新设置基础以隐藏错误……而且我认为这根本不适合该项目。 所以我的问题是:您是否真的发现在实践中拥有这样的“有机提交”(即不受干扰的历史记录)很有价值?或者相反,您是否更喜欢遇到包装精美的提交,而无视程序员的实验过程?无论您选择哪个,为什么对您有用?(让其他团队成员保留历史记录,或者根据需要重新建立历史记录)。 根据Google DVCS分析的1,在Mercurial“历史为神圣”中。
26 git  mercurial  dvcs 

4
如何为我的Django网站开发前端(UI)
我正在学习Django和Web开发的新手。如果您觉得这个问题太蠢了,请原谅。 因此,我正在使用Django创建一个Facebook应用程序,并将其托管在Google App Engine中。该项目将专注于阅读任何网站的RSS / Atom提要(这就是我现在能说的)。 我确定足以处理RSS / Atom文件,但是我担心前端(用户界面)部分-“设计部分”。我不知道HTML / CSS / JavaScript(我可以处理简单的HTML东西,但这不会导致任何设计问题)。 首先,我考虑过使用Dreamweaver之类的工具或任何等效软件来设计UI,但是当我真正开始学习django并开始使用它时,这似乎是“不可能”的事情。 所以, 我应该如何设计网站的UI部分?我不能使用Dreamweaver之类的工具吗? 如果否,那么像我这样不懂JavaScript / CSS的人的最佳方法是什么 如果是,那么Dreamweaver的最佳开源替代方案是什么? Google App Engine可以处理所有这些吗? 与Django打交道的人如何编辑这些模板页面。Django提到它将逻辑(视图)和设计(模板)部分分开,以便公司中的不同部门可以分别处理。但是,考虑到Django的HTML页面充满了与HTML(设计)无关的“标签”,UI用户如何处理它?

17
我应该要求程序员进行单元测试吗?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我在一个我们购买大量IT项目的地方工作。我们目前正在为未来项目的需求制定系统要求标准。在此过程中,我们正在讨论是否可以要求供应商进行自动化的单元测试。 我坚信正确的自动化单元测试是记录代码质量和稳定性的唯一方法。其他人似乎都认为,单元测试是仅涉及供应商的可选方法。因此,我们将不需要自动化的单元测试,连续测试,覆盖率报告,单元测试检查或任何种类的测试。我发现这项政策非常令人沮丧。 我在这里完全不合时宜吗? 请为我提供任何观点的论据。

3
哪个许可最开放?[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 哪个是最宽松的开源许可证? “允许”将被定义为“有关如何重新分发软件的最低要求”。
26 licensing 

5
如何在Winform中正确构建项目?
不久前,我开始创建一个winform应用程序,当时它很小,因此我没有考虑如何构造项目。 从那时起,我根据需要添加了其他功能,并且项目文件夹越来越大,现在我认为是时候以某种方式构建项目了,但是我不确定什么是正确的方式,因此我没有什么疑问。 如何正确重组项目文件夹? 目前,我正在考虑这样的事情: 创建表单文件夹 创建实用程序类的文件夹 为仅包含数据的类创建文件夹 添加类时的命名约定是什么? 我是否还应该重命名类,以便仅通过查看其名称即可识别其功能?例如,重命名所有表单类,以便其名称以Form结尾。还是如果为它们创建了特殊文件夹,这是否没有必要? 怎么办,以便不是主窗体的所有代码都以Form1.cs结尾 我遇到的另一个问题是,随着我添加的每个功能的主要形式越来越庞大,代码文件(Form1.cs)变得越来越大。例如,我有一个TabControl,每个选项卡都有一堆控件,所有代码最终都保存在Form1.cs中。如何避免这种情况? 另外,您知道处理这些问题的文章或书籍吗?

11
被多线程错误困扰
在我管理的新团队中,我们的大部分代码是平台,TCP套接字和http网络代码。所有C ++。其中大多数来自离开团队的其他开发人员。团队中目前的开发人员非常聪明,但从经验来看大多是初级的。 我们最大的问题:多线程并发错误。我们的大多数类库都通过使用某些线程池类而被编写为异步的。类库中的方法通常将长时间运行的任务从一个线程排队到线程池中,然后在另一个线程上调用该类的回调方法。结果,我们有很多涉及错误线程假设的边缘错误。这导致了一些细微的错误,这些错误不仅仅具有关键部分和锁以防止并发问题。 使这些问题更难解决的是,修复尝试通常是不正确的。我发现团队在尝试(或在遗留代码本身中)尝试犯的一些错误包括以下内容: 常见错误#1-通过仅对共享数据进行锁定来解决并发问题,但是忘记了当方法未按预期顺序调用时会发生什么情况。这是一个非常简单的示例: void Foo::OnHttpRequestComplete(statuscode status) { m_pBar->DoSomethingImportant(status); } void Foo::Shutdown() { m_pBar->Cleanup(); delete m_pBar; m_pBar=nullptr; } 因此,现在有了一个错误,其中在OnHttpNetworkRequestComplete发生时可以调用Shutdown。测试人员找到错误,捕获故障转储,并将错误分配给开发人员。他反过来修复了这样的错误。 void Foo::OnHttpRequestComplete(statuscode status) { AutoLock lock(m_cs); m_pBar->DoSomethingImportant(status); } void Foo::Shutdown() { AutoLock lock(m_cs); m_pBar->Cleanup(); delete m_pBar; m_pBar=nullptr; } 除非您意识到还有一个更微妙的边缘情况,否则上面的修补程序看起来不错。如果在调用OnHttpRequestComplete 之前调用Shutdown,会发生什么情况?我的团队拥有的真实示例更加复杂,并且在代码审查过程中很难发现边缘情况。 常见错误#2-通过盲目退出锁来解决死锁问题,等待另一个线程完成,然后重新进入锁-但是没有处理对象只是被另一个线程更新的情况! 常见错误#3-即使对象是引用计数,关闭序列也会“释放”它的指针。但是忘记等待仍在运行的线程释放它的实例。这样,组件将完全关闭,然后在不希望再有任何调用的状态下在对象上调用伪造或较晚的回调。 还有其他边缘情况,但最重要的是: 即使对于聪明人,多线程编程也很难。 当我发现这些错误时,我会花时间与每个开发人员讨论这些错误,以开发更合适的修复程序。但是我怀疑,由于“正确的”解决方案涉及到大量遗留代码,因此他们常常对如何解决每个问题感到困惑。 我们将很快发货,并且我确定我们正在应用的补丁将在即将发布的版本中保留。之后,我们将有一些时间来改善代码库并在需要时进行重构。我们将没有时间重新编写所有内容。而且大多数代码还不错。但是我希望重构代码,以便可以完全避免线程问题。 我正在考虑的一种方法是这种方法。对于每个重要的平台功能,请使用专用的单线程,将所有事件和网络回调整理到其中。与Windows中使用消息循环的COM公寓线程相似。长阻塞操作仍然可以分派到工作池线程,但是完成回调在组件的线程上调用。组件甚至可能共享同一线程。然后,可以在单个线程世界的假设下编写线程中运行的所有类库。 在走这条路之前,如果还有其他标准技术或设计模式来处理多线程问题,我也非常感兴趣。我必须强调-除了描述互斥量和信号量基础知识的书以外的内容。你怎么看? 我也对其他用于重构过程的方法感兴趣。包括以下任何一项: 有关线程周围设计模式的文献或论文。除了互斥量和信号量介绍之外,还有其他内容。我们也不需要大规模的并行性,只需设计对象模型以正确处理来自其他线程的异步事件的方法即可。 …

6
纯函数式编程语言如何在没有赋值语句的情况下进行管理?
在阅读著名的SICP时,我发现作者似乎不太愿意在第3章中向Scheme介绍转让声明。 由于Scheme是我所知的第一门函数式编程语言,令我有些惊讶的是,有些函数式编程语言(当然不是Scheme)可以在没有赋值的情况下完成。 让我们使用本书提供的bank account示例。如果没有赋值语句,该怎么办?如何更改balance变量?我之所以这么问,是因为我知道那里有一些所谓的纯函数式语言,根据图灵完整理论,这也必须做到。 我学习了C,Java,Python,并在我编写的每个程序中大量使用赋值。因此,这确实是一次令人大开眼界的体验。我真的希望有人能简要解释一下这些函数式编程语言中如何避免赋值以及对这些语言有何深远影响(如果有的话)。 上面提到的示例在这里: (define (make-withdraw balance) (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Insufficient funds"))) 这改变了balance通过set!。在我看来,更改类成员非常像类方法balance。 如我所说,我对函数式编程语言并不熟悉,因此,如果我对它们说错了,请随时指出。


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.