软件工程

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

2
在全部捕获或基本异常类中记录异常是否更明智?
我正在重构一个相当大的Web应用程序。主要问题之一是不一致的错误处理,我正在尝试提出一个明智的策略。我已经通过set_error_handler创建了一个自定义错误处理程序,该处理程序从本质上转变了ErrorExceptions中的 PHP错误以及一个直接从Exception继承的自定义基本异常类。 在生产环境中,我正在通过set_exception_handler使用通用异常捕获功能,并且将要添加异常记录*的功能。我的难题是在基本异常类或全部捕获中执行实际日志记录的位置。 我想到了将其记录在全部功能中的几个原因: 代码中有很多异常需要转换为基本异常类的适当子代。在此之前,并非所有异常都会被记录。 总括而言,以某种方式感到更自然,基本异常类不应该仅仅这样做。(这可能是一个单一的责任原则,但可能只是一种误导) 以及登录基本异常类的原因之一: 目前,全部收集仅用于生产。将其引入我们的其他环境(开发,测试)很容易,但是这需要进行一些调整,因为错误在每个环境中的处理方式不同,在生产中将其转换为404/503错误页面。 在哪里记录异常有可接受的做法吗? *日志记录将首先涉及写入文本文件,并且可能会演变成发送某些类型异常的邮件。 @unholysampler的回答提示了一些说明: 我面对的是2 * 10 ^ 6 sloc代码库,其中包含许多我无法控制的第三方内容,而我确实有一些代码可以控制PHP中的preddates异常。而且还有一些糟糕的最新代码,我们正从长期的沉重压力中恢复过来,在这些压力下,我们实际上不得不停止思考并被黑了。 我们正在积极进行重构以解决所有不一致问题,并引入明智的错误处理方法,但这将需要一些时间。在达到正确处理错误的程度之前,我对该怎么办更感兴趣。在某个时候,我可能会问另一个关于明智的例外策略的问题。 记录背后的主要动机是,每当生产中发生任何问题时,都会在我的手机上收到一封电子邮件。我不在乎数据转储是否会很大,如果确实如此,我将有一份cron作业,不时地删除旧的。

6
“自动构建”是什么意思?
我正在尝试将持续集成添加到项目中。 根据Wikipedia的介绍,CI的一项主要内容是自动构建。但是,由于CI和构建自动化文章似乎不同意,我对确切的含义感到困惑。 特定的混淆点:在以下情况下, “自动构建”是什么意思: 使用解释性语言(例如Python或Perl)的项目? 在最终用户的计算机上从源代码构建? 具有不能简单地预编译和分发的依赖项的应用程序,例如用户计算机本地的RDBMS中的数据库?

7
建立完整的程序?
阅读书籍,观看视频和查看教程都很容易。做笔记和实际学习材料可能会稍微困难一些,但是即使那样,只要脑子不错并且有相当大的兴趣的人,就很容易了(更不用说了,很有趣)。 问题是,它并没有真正让您编写完整的程序或网站。假设您是那些青少年(仅在高中阶段,没有真正的(大学水平)计算机科学或编程课程,没有现实世界的经验),并且选择了Groupon。甚至甚至是马克·扎克伯格(Mark Zuckerburg),都可以肯定他是一个天才,并且他是一个非常有能力的程序员……但是如何? 您如何建议那些并非一定是编程新手,而是真正的编程真正的应用程序和真正的程序员的人去开发它?什么是“开发过程”-特别是对于单个程序员(或大约2-3个青少年)? 此外,就Web开发而言,流程是什么?像Facebook或Groupon这样的东西是用框架(例如CodeIgniter或Zend for PHP)编写的吗?还是他们开发自己的框架?我不是在问如何提出一个好主意,而是要如何有效地实施好主意?有人咨询吗? 我已经阅读了几本有关C和C ++的书籍(主要是C编程语言和C ++编程语言),并读过AP Computer Science(以及一些其他有关Java和OOP的书籍)。我还阅读了一些有关PHP(和CodeIgniter)和Python的教程。但是我还在读高中,从技术上讲,我的年龄还不够大,无法在实习中工作几个月。

4
单元测试静态类型的功能代码
我想问大家,在这种情况下,对以Haskell,scala,ocaml,nemerle,f#或haXe编写的静态类型的功能代码进行单元测试是有意义的(最后一个是我真正感兴趣的,但是我想利用更大社区的知识)。 我问这是因为,根据我的理解: 单元测试的一方面是使规范具有可运行的形式。但是,当采用声明性样式将规范化规范直接映射到语言语义时,实际上是否有可能以可运行的形式以独立方式表达规范,从而增加价值? 单元测试最明显的方面是跟踪无法通过静态分析发现的错误。鉴于类型安全的功能代码是一种非常接近静态分析器所理解的代码的好工具,因此您似乎可以将很多安全性转移到静态分析上。但是,无法涵盖代码中使用x而不是y(都为坐标)之类的简单错误。OTOH在编写测试代码时也可能会出现这样的错误,因此我不确定是否值得这样做。 单元测试确实引入了冗余,这意味着当需求改变时,实现它们的代码和涉及该代码的测试都必须被改变。当然,这种开销大约是恒定的,因此可以说,这并不重要。实际上,在像Ruby这样的语言中,它的确无法与优势相提并论,但是鉴于静态类型的函数式编程涵盖了许多基础单元测试的目的,因此感觉这是一个不变的开销,可以不付出任何代价就可以减少它。 由此推断,在这种编程风格中,单元测试已经过时了。当然,这样的主张只会导致宗教战争,所以让我将其归结为一个简单的问题: 当您使用这种编程风格时,您在什么程度上使用单元测试以及为什么使用(为什么希望代码获得什么质量)?或者反过来说:您是否有标准,可以用来限定静态分析器覆盖的静态类型功能代码单元,因此不需要单元测试范围?

4
为什么将康威的“生命游戏”用于代码撤退?
Code Retreat是一整天的培训活动,着重于软件开发的基础知识。即将到来的是“全球”代码撤退日,我很期待。就是说,我以前去过那里,不得不说有很多混乱……这很好。 我仍然不明白的一件事是,为什么“生命游戏”对TDD来说是个好问题,以及TDD的好坏是什么样子。 意识到这是一个相当开放的问题,请随时发表评论。
15 tdd 

2
在尝试Scala之前需要了解Java吗
我对学习Scala感兴趣。我已经阅读了很多有关它的内容,但是很多人都看重它,因为它有一个对并发性更好的actor模型,它以更好的方式处理xml,解决了头等函数的问题。 我的问题是,您是否需要了解Java才能理解/理解Scala中的工作方式?最好先尝试一下Java然后尝试Scala,还是可以在没有Java背景的情况下启动Scala?
15 java  scala 

2
结构分型的(缺点)
我刚刚看过Daniel Spiewak的演讲,他谈到了结构化类型与Scala的ans Java 标称类型相比的优势。这种差异的一个示例是以下Java代码 public interface Foo { public int length(); } public interface Bar { public int length(); } Foo f = ...; Bar b = f; 当然不会编译哪个,因为Foo和之间的类型兼容性Bar由名称决定。 另一方面,结构类型系统可以声明两种类型相等或兼容,因此,除其他事项外,还可以进行检查的鸭子类型。 现在,我认为我确实了解结构类型系统的大多数优点,但是我想知道它是否不会从以下示例中使类型安全失效 class Foo { class Bar { /* ... */ } def takeBar(b: Bar) = { /* ... */ } …

10
谁应该培训新程序员?初级还是高级程序员?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为话题成为软件工程堆栈交换。 4年前关闭。 在我的团队中,我们经常需要最高级的程序员来培训/指导全新的初级程序员。但是,这些高级程序员是从事大量真正重要工作的人。 我试图与我的经理争辩说,让才华横溢的初级程序员将新的程序员置于自己的领导之下是很有意义的。首先,它将使高级开发人员有更多的时间从事更重要的计划(并不是说指导并不重要)。接下来,它将使初级程序员对其工作感到有些自豪,因为他们会被要求承担这种责任,并且他们可能会在教学中学到一些东西。最终,这将为公司节省资金,因为高级开发人员的成本比初级开发人员高得多。 我的老板一直未能被说服,因为显然这是自从一开始就对这支球队工作的方式。假设已经决定必须进行某种形式的培训/指导,那么谁能为我提供更好的论据或告诉我为什么我做错了?您的团队做什么? **我们都可以同意,资历不一定表示能力,所以假设“高级程序员”是指“顶级程序员”。

8
需要执行批量操作时,是否应该放弃ORM框架?
这是一种常见情况: 您需要在使用ORM框架的应用程序中实现批量操作。 第一次通过之后,您已经注意到严重的性能问题。 这是我的问题: 在这种情况下,您是否应该支持包含原始SQL的解决方案? 还是有众所周知的设计模式可以帮助您缓解与ORM框架的批量操作通常相关的问题? 编辑: 我不是问您是否应该从整个应用程序中删除ORM框架。 我在问:您是否应该为该应用程序的这一小部分放弃ORM框架?
15 orm  heuristics 

2
许多小的脚本,一个或多个存储库?
同事和我自己都遇到了一个我们有很多看法的问题。 当前,我们有一个git存储库,我们将所有cronjobs保留在其中。大约有20克朗,它们除了它们都是小型python脚本并且对于某些活动必不可少之外,并没有真正的关联。我们使用一个fabric.py文件来部署和requirements.txt文件管理所有脚本的要求。 基本上,我们的问题是,是否将所有这些脚本都保存在一个git存储库中,还是应该将它们分离到各自的存储库中?通过将它们保存在一个存储库中,可以更轻松地将它们部署到一台服务器上。对于所有脚本,我们只能使用一个cron文件。 但是,这感觉不对,因为20个cronjob在逻辑上不相关。此外,使用一个在requirements.txt文件中的所有脚本,这是很难搞清楚什么是依赖一个特定的脚本,它们都必须使用的软件包的版本相同。 我们可以将所有脚本分离到各自的存储库中,但这会创建20个需要记住和处理的不同存储库。这些脚本中的大多数都不是很大,解决方案似乎过大。 一个相关的问题是,我们是对所有cronjobs使用一个大crontab文件,还是对每个cronjobs使用单独的文件?如果每个人都有自己的设备,那么一个crontab的安装如何避免覆盖另一个19个?这似乎也很痛苦,因为随后需要20个不同的cron文件进行跟踪。 简而言之,我们的主要问题是将它们紧密地捆绑在一起作为一个存储库,还是将它们通过自己的require.txt和fabfile.py分离到自己的存储库中?我们觉得我们也可能正在寻找一些非常简单的解决方案。有没有更简单的方法来解决此问题?

8
为什么我们不使用动态(服务器端生成的)CSS?
由于服务器端生成的HTML是微不足道的(并且是在AJAX之前制作动态网页的唯一方法),因此服务器端生成的CSS并非如此。实际上,我从未见过。有CSS编译器,但是它们会生成可用作静态文件的CSS文件。 从技术上讲,它不需要特殊的库,HTML 样式标记应引用PHP(/ ASP / whatever)模板脚本而不是静态CSS文件,并且脚本应发出CSS 内容类型标头-仅此而已。 它有缓存问题吗?我不这么认为。该脚本应发出no-cache等标头。对设计师来说有问题吗?不,他们应该编辑CSS模板(就像他们编辑HTML模板一样)。 为什么我们不使用动态CSS生成器?或者,如果有的话,请告诉我。

5
一种提高RAD环境中发布质量的简单方法
这里有点背景-我们是RAD开发人员的一个小团队(一个5人),负责一家大型非软件公司的内部软件开发。“内部软件”从使用MSSQL服务器作为后端的桌面.NET应用程序到在后台运行的Python脚本到MS Word文档和模板(技术之源)不等。 整个团队由全方位的人员组成,能够从用户那里获得需求,对其进行编码,对其进行测试并部署到生产中。一旦软件投入生产后,将由另一个团队负责,但是如果出现问题,通常我们很容易进行干预。 到目前为止,一切听起来不错,但是有一个问题-作为RAD团队,我们必须经常发布,而且如果没有我们发布一个或两个应用程序的新版本(也可能是脚本,更新的Word文档),就没有一天可做,C ++控制台应用等)导入生产环境。我们进行开发测试,并通过允许最终用户在UAT环境中运行软件来使其参与。 ...但是这些错误反正逐渐渗透到生产中。用户确实知道这些错误和偶尔的不稳定是他们为真正迅速获得所需付出的代价,但与此同时,它也让我们思考-也许我们可以改进开发或发布实践以提高稳定性。软件,并减少添加新功能时引入的错误数量。 优点-首先我们真的没有太多的流程,所以应该很容易就可以开始进行改进,不好的事情-作为RAD小组的一员,我们实际上没有太多的时间和资源来实施事情有些大,但我们一直在考虑以下举措,欢迎您提出任何反馈,提示,提示和建议。 当前,一些应用程序是在开发人员测试后直接发布到产品中的,而绕过了用户验收测试。应该停止这种做法,即使是很小的更改也必须由最终用户进行测试。每个应用程序都会有一个从最终用户中选择的专用beta测试器。仅在Beta测试人员确定新版本之后,它才能从测试环境升级到生产环境。 我们不进行代码审查-但是我们将在其中一位签入变更集之前开始进行代码审查。我也在考虑“发布审核”-基本上,一个开发人员必须坐在旁边,而另一位开发人员则看着他/她进行软件发布(复制二进制文件,更新配置,向数据库添加新表等)-通常它只是需要5到10分钟,因此不会花费太多的“发布审核”时间。 当一个新版本被证明具有足够的bug可以从生产中撤出并由一个好的旧版本替代时,如何减少回滚时间。我们确实存储了所有发行版本的历史记录(以二进制文件的形式),以使返回一个版本变得容易-尽管快速“用先前版本的二进制文件覆盖新发行的二进制文件”还是很容易的,但它仍然是一个手动过程,容易出错有时要求“如果回滚将失败并且将使系统无法使用而不是出现故障,该怎么办”。 这是我们用完我们的想法的地方,我们希望得到您的反馈,如果您可以分享一些简单的发行/开发过程改进建议,那就太好了。

1
Groovy是否遵循Tennent的通信原理?
这是对Tennent的通信原理的有趣讨论,以及Neal Gafter的简短描述: 该原理规定,将表达式或语句包装在闭包中然后立即调用时,其含义应与包装在闭包中之前的含义相同。在将代码包装在闭包中时,语义上的任何更改都可能是该语言的缺陷。 Groovy语言是否遵循此原则?


2
Objective-C的方法开销是否不建议采用“许多小方法”设计方法?
我通常喜欢使用小方法,这是Bob Martin在Clean Code中所建议的。我对Objective-C的内部知识也已经读够了,至少对它的消息分发如何工作有一些了解(bbums系列对此特别有用)。 尽管有过早的优化问题,但我想知道,Objective-c使用objc_msgSend所做的所有工作,实际上是否足够重要,以至于“许多小方法”方法对于Objective-C项目而言是不可取的。 经验发现尤其值得欢迎(也许我有时会自己进行测试)。任何编写过大型Objective-C项目的人的经验也将很棒。 澄清度 这个问题的总体语气是故意的。我不是在问特定应用程序的性能调优(这就是为什么我在这里而不是在SO上问的原因),而是更多关于Objective-C的语言特性是否会阻碍某种设计方法。我观察到我从Apple和其他各方(在github等上)看到的许多代码都倾向于大型方法(和类),并且我想知道这是否由于语言而逐渐消失了本身。当然,我可能读错了代码,或者可能是文化因素而不是技术因素导致了这种趋势(如果存在)。 (对于它的价值,我目前正在编写Objective-C,并且正在使用小的方法) 进一步要求 我同意已经给出的两个答案。我想做的另一件事是让某人指向我(希望是实质性的)开源(或其他可见的)Objective-C代码库,该代码库使用了不错的简短方法(和小型类)。我尚未在Objective-C中看到任何东西可与(例如)fitnesse来源进行比较。

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.