软件工程

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

12
是否有原因未将测试与其测试代码内联地编写?
最近,我一直在阅读一些有关Literate Programming的文章,这让我开始思考...写得井井有条的测试(尤其是BDD风格的规范)在解释代码作用方面比散文效果更好,并且具有以下优点:验证自己的准确性。 我从未见过将测试与其代码内联地编写的测试。这是仅是因为语言在编写到相同的源文件中时不会趋向于将应用程序和测试代码分开(而没有人使之变得容易),还是人们在原则上将测试代码与应用程序代码分开呢?


9
是否建议要求员工创建“工作” GitHub帐户?
我已经将所有公司的Git存储库移至GitHub,现在我想将员工添加到项目中。由于大多数员工已经拥有个人GitHub帐户,所以我想知道是否应该要求他们创建一个工作 GitHub帐户。我之所以考虑这样做,是为了减少未经授权访问我们代码库的可能性,因为他们的个人帐户可能会通过他们在网站上的个人活动而得到很好的宣传,从而增加了有针对性的攻击机会。此外,如果他们的个人帐户遭到入侵,这并不意味着劫机者可以访问整个公司代码。由于这将带来为员工维护两个帐户的负担,我想知道这是否正确,甚至是否合理。 更新 感谢您提供所有有用的见解。由于问题的主观性质,并且因为我从几个不同的答案中获得了最佳成绩,所以我不会将答案设置为可接受。 我决定以这种方式前进:我将提醒员工,出于实际原因,必须将与工作相关的GitHub电子邮件通知发送到其工作电子邮件帐户。因此,创建工作GitHub帐户会更有意义。如果他们愿意使用其个人GitHub帐户并将其连接到其工作电子邮件帐户,那就很好。任何状况之下,员工必须以书面形式同意与使用GitHub相关的许多条件。这些与帐户安全性相关:使用不与任何其他帐户一起使用的安全随机密码生成器选择安全密码,不通过非其拥有或管理的计算机访问GitHub等。最终,员工必须自己决定工作帐户是否对他们更有意义。
91 github 

15
TDD红绿色重构以及是否/如何测试变为私有的方法
据我了解,大多数人似乎都同意不应直接测试私有方法,而应通过任何公共方法对其进行测试。我可以理解他们的观点,但是当我尝试遵循“ TDD的三个定律”并使用“红色-绿色-重构”循环时,我对此有一些疑问。我认为最好用一个例子来解释: 现在,我需要一个程序,该程序可以读取文件(包含制表符分隔的数据)并过滤掉包含非数值数据的所有列。我想可能已经有一些简单的工具可以做到这一点,但是我决定从头开始实现它,主要是因为我认为这对我来说是一个不错的,干净的项目,可以进行TDD的实践。 因此,首先,我“戴上红色帽子”,也就是说,我需要测试失败。我想,我需要一种可以找到一行中所有非数字字段的方法。因此,我编写了一个简单的测试,当然它无法立即编译,因此我开始编写函数本身,并且在来回循环(红色/绿色)之后,我有了一个有效的函数和一个完整的测试。 接下来,我继续使用函数“ gatherNonNumericColumns”,一次读取文件,并在每一行调用我的“ findNonNumericFields”功能以收集最终必须删除的所有列。几个红绿色循环,我完成了,又一次具有工作功能和完整的测试。 现在,我认为我应该重构。由于我的方法“ findNonNumericFields”仅是因为我认为实现“ gatherNonNumericColumns”时需要它而设计的,所以在我看来,让“ findNonNumericFields”成为私有是合理的。但是,这将中断我的第一个测试,因为他们将无法再访问他们正在测试的方法。 因此,我最终得到了一个私有方法,以及一组测试它的测试。既然有很多人建议不要测试私有方法,那感觉就像我在这里陷入困境。但是我到底在哪里失败了? 我认为我本可以从更高的级别开始,编写一个测试以测试最终将成为我的公共方法的方法(即findAndFilterOutAllNonNumericalColumns),但这感觉与TDD的整个观点有些矛盾(至少根据Bob叔叔的说法) :您应该在编写测试和生产代码之间不断切换,并且在任何时间点,所有测试都在最后一分钟左右进行。因为如果我从为公共方法编写测试开始,那么在私有方法中获得所有详细信息之前,将需要几分钟(甚至几小时,甚至几天)才能使该方法测试公共方法通过。 那么该怎么办?TDD(具有快速的红绿色重构周期)是否与私有方法不兼容?还是我的设计有问题?

7
动态类型允许哪些功能?[关闭]
我已经使用python几天了,我想我了解动态和静态类型之间的区别。我不了解的是在什么情况下会首选。它是灵活且易读的,但是要付出更多的运行时检查和其他必需的单元测试的代价。 除了灵活性和可读性之类的非功能性标准之外,还有什么理由选择动态类型?使用动态类型我该怎么办呢?您能想到什么特定的代码示例来说明动态类型的具体优势?

5
选择ASCII编码而不是UTF-8有什么好处?
可以使用UTF-8对ASCII中的所有字符进行编码,而无需增加存储量(两者都需要存储一个字节)。 UTF-8除了“ ASCII字符”之外,还具有字符支持的优点。如果是这样的话,为什么我们会永远选择了UTF-8 ASCII编码? 当我们选择ASCII而不是UTF-8时,是否存在用例?

15
是什么让C在OOP时代如此受欢迎?[关闭]
我用C和C ++编写了大量代码,但是没想到C是第二大流行语言,仅次于Java。 TIOBE编程社区索引 我很好奇为什么在这个OOP时代,C仍然如此流行?请注意,在前5种流行的编程语言中,有4种是“现代”的,面向对象的语言。 现在,我同意您可以在C中使用OOP,但这有点痛苦和不雅(至少与我猜想的C ++相比)。那么,是什么使C如此受欢迎?是效率吗?低级 绝大多数已经存在的库或其他库?

22
为什么OOP困难?[关闭]
当我开始使用一种面向对象的语言(Java)时,我几乎就成了“酷”并开始编码。在阅读了许多有关OOP的问题之后,直到最近我才真正考虑过它。我得到的总体印象是人们对此感到挣扎。既然我没有这么难过,也不会说我是个天才,所以我想我一定错过了一些东西或误解了。 为什么OOP难以理解?是很难理解?


5
有了所有这些服务,我怎么会变得贫血呢?
我们在委托与封装业务逻辑之间划清界限的地方是什么?在我看来,我们委派的越多,我们变得越贫乏。但是,委派还促进重用和DRY主体。那么什么是合适的委托,我们的领域模型应该保留什么呢? 以以下问题为例: 授权。域对象应该负责维护其访问控制规则(例如CanEdit属性)还是应该委派给另一个单独负责管理访问的组件/服务,例如IAuthorizationService.CanEdit(object)?还是应该将两者结合?也许域对象具有CanEdit属性,该属性委派给内部IAuthorizationService来执行实际工作? 验证。与上述相同的讨论涉及验证。谁维护规则,谁负责评估规则?一方面,对象的状态应该属于该对象,而有效性是一个状态,但是我们不想重写用于评估每个域对象的规则的代码。在这种情况下,我们可以使用继承... 对象创建。工厂类与工厂方法与“更新”实例。如果我们使用单独的工厂类,则可以隔离和封装创建逻辑,但要以将对象的状态打开给工厂为代价。如果我们的域层在单独的程序集中,则可以通过公开工厂使用的内部构造函数来进行管理,但是如果存在多个创建模式,这将成为一个问题。而且,如果工厂所做的所有工作都在调用正确的构造函数,那么拥有工厂的意义何在? 类上的工厂方法消除了打开对象内部状态的问题,但是由于它们是静态的,因此我们无法像通过单独的工厂类那样通过注入工厂接口来打破依赖关系。 坚持不懈。有人可能会争辩说,如果我们的域对象要在向另一方委派执行授权检查的职责时将CanEdit公开给他人(IAuthorizationService),为什么在我们的域对象上没有执行相同操作的Save方法呢?这将使我们能够评估对象的内部状态,以确定是否可以在不破坏封装的情况下执行操作。当然,这要求我们将存储库实例注入到我们的域对象中,这对我来说有点气味,那么我们是否应该引发域事件并允许处理程序执行持久化操作? 看看我要去哪里? Rockford Lhotka对他为什么选择CSLA框架中的班级主管路线进行了精彩的讨论,而我对该框架有一些了解,可以看到他的业务对象以多种方式与域对象并行的想法。但是,我试图成为更好的DDD理想的坚持者,我想知道何时协作变得过多。 如果最终以聚合根为IAuthorizationService,IValidator,IFactory和IRepository,还剩下什么?是否具有将对象状态从“草稿”更改为“已发布”的Publish方法足以将类视为非贫血领域对象? 你的意见?

19
处理无法看到用户无法立即看到的改进中的价值的管理
我能理解进度压力。您想取悦用户,因为它们是公司的生命线。但是,某些更改确实可以使以后的一切变得更容易。不幸的是,我组织中的管理层对这种变化有一种本能的抵制,而这种抵制是如此之强以至于阻碍了长期的改进。 例如,Apple最近为iOS程序引入了自动引用计数。这是对以前必须使用的手动保留/释放调用的重大改进。该代码更易于编写和维护。转换本身可能会导致某些崩溃。但是,一旦解决了这些问题,随机怪异崩溃的数量就可能减少。 我最近向老板提到,我想切换到自动引用计数。他的回答是他想专注于明显的改进。反过来,这种反应很可能是由于他从自己之上所承受的压力所驱动的-也许恰恰是来自首席执行官的压力。 有很多类似的例子。共同点是需要修复某些问题,但是修复的短期成本超过了短期收益,其中“短期”被定义为“未来几周内”。 我应该如何处理这种情况? 编辑:感谢您的答复。让他们来。因为这与我的情况有关,所以我应该明确说明我的经理和CEO都是程序员-尽管CEO现在可能已经忘记了这是什么样子。显然,他们的程序员方面被其他压力所淹没。

8
如何修改您没有源代码的程序的输出
在我们公司中,我们有一个小程序(大小为.exe 500Kb)进行数学计算,最后将结果吐出到Excel电子表格中,该电子表格用于继续我们的工作流程。 我想在Excel电子表格上修改列,间距格式并添加VBA逻辑等,但是由于该参数无法在该程序中配置,因此在我看来,修改它的唯一方法是对.exe进行分解/反向工程。 没有人知道用什么语言编程,我们唯一知道的是: 超过20年前开发 开发者10年前退休 GUI应用 独立运行 尺寸500Kb 有什么建议可以解决这类问题吗?逆向工程是唯一的选择,还是有更好的方法?

2
Python中的相对导入有什么问题?
我最近升级了流行的Python样式检查器pylint的版本。 它贯穿了我的所有代码,指出了在同一软件包中导入模块的位置,而没有指定完整的软件包路径。 新的错误消息是W0403。 W0403:相对导入%r,应为%r 当检测到相对于软件包目录的导入时使用。 例 例如,如果我的软件包的结构如下: /cake /__init__.py /icing.py /sponge.py /drink 然后在海绵包装中写下: import icing 代替 import cake.icing 我会收到此错误。 虽然我知道并非所有的Pylint消息都具有同等重要的地位,并且我不害怕忽略它们,但我不理解为什么这种做法被认为是一个糟糕的主意。 我希望有人可以解释这些陷阱,因此我可以改善自己的编码风格,而不是(按照我目前的计划)关闭此表面上虚假的警告。

7
如何拒绝您认为不必要的代码审查?
我被要求查看一些代码来解决我认为不存在的问题。 这个比我更高级的修复程序坚持认为自己的修复程序是必要的,但对我而言,它似乎不过是C ++诡辩。我们的部署过程的一部分是代码审查,作为一名小公司的第二高级工程师,我希望审查变更。 我相信审稿人对代码更改的责任与原始编码员一样,并且我不愿意对此更改负责。您将如何拒绝此评论?

13
在Scrum环境中,速度的大幅增加是否现实?
我的经理最近确实在推动使用速度作为生产率的目标和衡量标准。我们目前正在以50个故事点的平均速度进行工作。我的经理希望我们将其提高40%,达到70个故事点(团队成员不增加)。如果我们没有实现这一增长,他希望我们提供完整的细分说明原因。 以速度衡量团队绩效并将其用作目标的整个想法对我来说似乎是错误的,但是我发现很难解释为什么。有什么帮助吗?为什么这不是衡量和激励生产力的正确方法?
89 agile  scrum 

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.