软件工程

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

5
在代码审查中注释的最佳方法是什么?
每当我们一个人签入某项内容时,我的团队就开始使用坩埚/鱼眼镜头来发起代码审查。我们只有3个人,我们每个人都被鼓励审查代码并在我们认为合适的地方留下评论。 我的问题是,如何最好地在遇到问题的代码行上留下评论?我想表达自己的观点而又不显得刻板。 我不想看起来像是骑着马,说:“ 我一直在做这种事…… 而且我也不想看起来像是我在试图变得权威,说些类似的话。 “ 这应该以这种方式完成... ”但是我仍然需要弄清楚他们在做什么并不是很好。 澄清一下: 对于我应该评论的内容,这确实是一个很好的资源:代码审查是主观的还是客观的(可量化的)?,但我正在寻找如何对此发表评论。

4
视觉和听觉上清晰的拉丁字母子集?
假设您给某人一张卡片,上面印有代码“ 5SBDO0”。 在某些字体中,字母“ S”很难从视觉上与数字5区分开(例如,数字零和字母“ O”)。 大声朗读代码,可能很难区分“ B”和“ D”,必须说“ B代表男孩”,“ D代表狗”或使用“ 语音字母 ”。 在大多数情况下,大声朗读时字母和数字的最大子集是什么? 背景: 我们希望生成一个短字符串,该字符串可以编码尽可能多的值,同时仍易于通信。 假设您有一个6个字符的字符串“ 123456”。在基数10中,这可以编码10 ^ 6个值。 在十六进制“ 1B23DF”中,您可以用相同数量的字符对16 ^ 6个值进行编码,但是当大声读取时,这听起来可能会模棱两可。(“ B”对“ D”) 同样,对于任何N个字符的字符串,您将获得(字母的大小)^ N个值。 由于要很容易地容纳在人类工作记忆容量的范围内,因此该字符串的长度限制为大约六个字符。 因此,要找到我们可以编码的最大值数量,我们需要找到最大的字母/数字明确集合。我们没有理由不考虑字母GZ和一些常见的标点符号,但是我不想手动成对比较“ G听起来像A吗?”,“ G听起来像B吗?”,“是否我自己听起来像C”。我们知道这将是O(n ^ 2)个语言工作=)...
13 design 

1
为什么没有工具可以在PHP中重载静态属性?
介绍 PHP使您可以通过在类中声明魔术方法来重载方法调用和属性访问。这将启用以下代码: class Foo { public function __get($name) { return 42; } } $foo = new Foo; echo $foo->missingProperty; // prints "42" 除了重载实例属性和方法外,从PHP 5.3.0开始,我们还可以static通过覆盖magic方法来重载方法调用__callStatic。 缺少的东西 可用功能中明显缺少的是过载静态属性的能力,例如: echo Foo::$missingProperty; // fatal error: access to undeclared static property 此限制已明确记录在案: 属性重载仅在对象上下文中起作用。这些魔术方法不会在静态上下文中触发。因此,不应声明这些方法static。从PHP 5.3.0开始,如果声明了一种魔术重载方法,则会发出警告static。 但为什么? 我的问题是: 是否出于技术原因当前不支持此功能?还是(颤抖的)政治原因? 过去是否有过任何中止尝试添加此功能的尝试? 最重要的是,问题不是 “如何在userland PHP中具有动态静态属性?”。也就是说,如果您知道__callStatic要共享的特别可爱的实现,则一定要这样做。

7
为什么小的固定词汇表被视为RESTful服务的优势?
因此,RESTful服务的词汇表中有一组固定的动词。RESTful Web服务从HTTP方法获取这些信息。定义固定的词汇表具有一些假定的优势,但是我并不十分了解这一点。也许有人可以解释。 为什么REST概述的固定词汇表比为每个状态动态定义词汇表更好?例如,面向对象的编程是一种流行的范例。RPC是用来定义固定接口的,但是我不知道为什么人们会认为RPC受这些限制的限制。我们可以动态指定接口,就像RESTful服务动态描述其内容结构一样。 REST被认为是有利的,因为它可以在不扩展词汇量的情况下增长。RESTful服务通过添加更多资源而动态增长。通过动态指定每个对象的词汇表来扩展服务有什么问题?我们为什么不只使用在对象上定义的方法作为词汇,而让我们的服务向客户描述这些方法是什么以及它们是否有副作用? 从本质上讲,我感觉到服务器端资源结构的描述等同于词汇表的定义,但是随后我们被迫使用有限的词汇表来与这些资源进行交互。 固定的词汇量真的能使客户端的关注与服务器的关注脱钩吗?我当然必须关心服务器的某些配置,这通常是RESTful服务中的资源位置。抱怨使用动态词汇似乎不公平,因为无论如何我们都必须动态地推理如何理解这种配置。RESTful服务描述了您可以通过超媒体识别对象结构而进行的转换。 我只是不明白什么使固定的词汇表比任何自我描述的动态词汇表更好,后者可以在类似RPC的服务中很好地工作。这仅仅是限制HTTP协议词汇量的不好理由吗? 反射 只是为了澄清我的想法比我做的更好。假设您正在设计任何通用的API,甚至可能都不是面向Web的。如果有人说您只能在对象上使用这些方法名称,您会感到高兴吗?REST不仅限于HTTP,而是考虑您编写的每个API,面向Web或以其他方式仅由包含GET POST PUT和DELETE方法的对象组成的API的情况。因此,您无法定义该object.foo方法。您必须定义一个名为foo的新对象,并调用其GET方法。从本质上讲,这就是REST的工作方式,这让我有些不舒服。您对foo的作用没有更好的一般理解,只是被迫为本质上是父对象上的方法创建一个新对象。此外,您的API同样复杂,通过创建更多对象,您隐藏了接口的复杂性。RESTful Web服务迫使我们采用一个接口,该接口在我们要公开的API上下文中可能足够,也可能不够。也许有很好的理由使用面向Web的API来执行此操作,但是有理由不为每个通用API中的每个对象采用标准接口。一个实际的例子将不胜感激。

4
Ruby是做什么的(或者是Rails)?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 大多数编程语言都有一些影响其用法和适用性的设计决策。 例如: Python专注于代码的可维护性/可读性,并且缩进已成为语言本身的一部分。 Java的意图是使跨平台的OOP比C ++更加“轻松”和“友好” Objective-C是作为C的OO包装而构建的,当时还不知道C ++的未来 Erlang专为高度容错和并发系统而设计 PHP设计用于处理网页的动态创建 CoffeeScript旨在公开Java 脚本的大部分内容,并添加OOP语法糖,并在“幕后”等中隐藏JS的细微差别(全局等)。 每种编程语言都试图利用并利用特定的细分市场恕我直言。以上是我对编程语言的基本原理以及支配其发展和广泛采用性的观点。当然,还有更多,但是该列表仅用作示例 但是,我一直在努力地理解Ruby的创立原则及其日益普及的趋势。Ruby的流行是什么?还是设计Rails框架的一个人的天才?如果是后者,是因为Ruby使Rails的设计更好/更容易/更快了?凭什么? 根据其创建者最常被引用的原因是“ ...想要一种有趣的弱类型编程语言”-我不认为这完全是创建新编程语言的原因!恕我直言,无论使用哪种语言,编程都很有趣(每种语言都有一些不好的部分,但是要么绕过它,要么与它共存)。 那么,Ruby语言在当前语言中没有(或没有)利用什么利基呢?导致广泛采用的Ruby的“强项”(USP)是什么?Ruby以前没有做过(或者非常困难)做了什么? 我不是Ruby程序员,而是Ruby noob,所以很困惑。 免责声明:这不是一场大战,我不是在寻找Ruby vs编程语言类型的答案。我正在寻找导致广泛采用的基于Ruby的设计决策。Ruby满足于流行有什么利基?还是纯粹归因于Rails?

5
奇怪的公司发布周期:进行分布式源代码控制吗?
抱歉,这篇文章很长,但我认为值得。 我刚从一家小型.NET商店开始,其运作方式与我工作过的其他地方有很大不同。与我以前任职的职位不同,此处编写的软件针对多个客户,并且并非每个客户都同时获得最新版本的软件。因此,没有“当前生产版本”。当客户确实获得更新时,他们还将获得自上次更新以来可能已添加到软件中的所有功能,而这可能是很久以前的事了。该软件是高度可配置的,并且可以打开和关闭功能:所谓的“功能切换”。此处的发布周期非常紧张,实际上它们没有按计划进行:功能完成后,软件便部署到了相关客户。 该团队仅在去年从Visual Source Safe迁移到Team Foundation Server。问题是他们仍然像使用VSS一样继续使用TFS,并在单个代码分支上强制执行Checkout锁定。每当将错误修复发布到现场时(甚至对于单个客户),他们都只需构建TFS中的内容,测试该错误是否已修复并部署给客户!(我自己来自制药和医疗设备软件背景,这真是难以置信!)。结果是半熟的开发人员代码甚至未经测试就投入生产。Bug总是会渗入发行版中,但是如果刚获得构建的客户通常不使用该bug所在的功能,他们将不会看到这些bug。主管知道这是一个问题,因为该公司正在逐渐发展壮大突然之间有一些大客户加入,而一些小客户也加入了。 有人要求我查看源代码控制选项,以消除错误的代码或未完成的代码的部署,但又不牺牲团队发行版的某种异步特性。在我的职业生涯中,我曾使用过VSS,TFS,SVN和Bazaar,但是TFS是我大部分经验的去处。 以前与我合作的大多数团队都使用Dev-Test-Prod的两个或三个分支解决方案,其中一个月的开发人员直接在Dev中工作,然后将更改合并到Test然后是Prod,或者在“完成时”升级,而不是在一个固定的周期。使用定速巡航或团队构建的自动化构建。在我之前的工作中,Bazaar被使用在SVN之上:开发人员在自己的小型功能分支中工作,然后将其更改推送到SVN(与TeamCity绑定)。很好,因为很容易隔离更改并与其他人的分支机构共享。 在这两种模型中,都有一个中央的dev和prod(有时是测试)分支,通过该分支推送了代码(标签被用来标记生产该版本的prod中的构建...这些都被制成了分支以修复错误。发布并合并回开发人员)。但是,这确实不适合此处的工作方式:没有命令何时发布各种功能,何时完成将它们推入。 有了这个要求,我看到的“持续集成”方法就失效了。为了获得与持续集成的新功能,必须通过dev-test-prod来推送它,这将捕获开发中所有未完成的工作。 我认为,要解决此问题,我们应该使用没有开发测试prod分支的大量功能分支模型,而是将源作为一系列功能分支存在,当开发工作完成时,这些功能分支将被锁定,测试,固定,锁定,经过测试然后发布。其他功能分支可以在需要/想要时从其他分支获取更改,因此最终所有更改都会被其他人吸收。这完全符合我上一份工作所经历的纯粹的Bazaar模型。 听起来如此灵活,但似乎没有某个开发主干或prod分支似乎很奇怪,我担心分支无法进行重新集成,或者后期的微小更改永远不会被其他分支和开发人员所抱怨。合并灾难... 人们对此有何想法? 第二个最后一个问题:我对分布式源代码控制的确切定义有些困惑:有些人似乎暗示它只是没有像TFS或SVN这样的中央存储库,有人说这是关于断开连接的(SVN断开了90%并且TFS具有功能完善的离线模式),其他人则说这与功能分支和分支之间没有父子关系的合并的简便性有关(TFS也具有无基础的合并!)。也许这是第二个问题!

6
为什么选择一个已建立的CMS,而不是从头开始构建一个?
在接下来的几周中,我的很多研究将针对不同的CMS。我已经简要介绍了Episerver和umbraco。在阅读这些系统时,我不禁会认为,无需学习许多(相当大的)CMS平台的细节和结构就可以实现提供内容管理功能。 过去,我得到过一些项目,这些项目使我作为开发人员的角色必须与编辑人员的角色保持独立(有意义)。即,我的任务是开发网站的设计和功能,以及客户的工作来更新内容。我通过实现一种“门户”来实现这一点,在该门户上有几个页面可以接受文本输入和图片上传等(基本上,他们想要的任何内容),然后将这些新内容记录到数据库中,然后通过设计,后面的代码会将所有这些信息从数据库中读取到相关控件(例如中继器)中。 对我来说,这已经成为我的客户管理内容以与我的解决方案一起部署的足够有效的方式。我知道我错了-CMS比完全建立的CMS更可取-但除了成本问题之外,为什么呢?
13 asp.net  cms 

1
在线代码编辑器
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 8年前关闭。 主要的在线IDE托管在服务提供商的服务器上。例如Kodingen,Cloud9,ShiftEdit。因此,如果外部服务器由于某种原因而关闭,它们将不可用,无论如何,我还是更喜欢在自己的计算机上进行计算。 有谁知道在线IDE或编辑器(最好只是一个编辑器-Ace或CodeMirror JS编辑器的简单实现),可以在本地主机上(在本地LAMP服务器上)下载并运行它?到目前为止,我已经找到了两个-Eclipse Orion和Wiode,但是我不太喜欢它们中的任何一个,我正在寻找替代方法。 同样合适的是浏览器扩展,它们可以在浏览器上(脱机)在本地运行,而无需访问某些外部站点。例如Chrom(e / ium)的SourceKit。
13 ide  text-editor 

5
敏捷软件开发:您如何*在财务上*响应不断变化的用户需求?
在SE和其他网站上阅读所有这些“敏捷开发”内容时,我总是想知道一件事: 在“传统”软件工程中,您 收集用户的需求, 根据这些要求编写规范, 把它交给客户,并向他收取到目前为止已完成的工作的费用, 做一个(粗略的)技术设计,以便您可以估算实施成本, 为用户提供实施的价格报价, 等待客户签署规格书并接受报价, 设计,实施,测试, 法案。 如果在此过程中需求发生变更,则您发送所需变更的报价(有价格)(如果变更很小,则免费提供,您喜欢客户,而客户却不经常这样做) 。 那么,这在敏捷项目中是如何工作的(财务上),而频繁的需求变更是流程的一部分? 您是否为每次设计变更都写报价?(这不是很乱吗?) 还是您协商固定价格并希望客户不要经常更改要求?(可能会有风险,我知道客户会在接受该项目完成之前利用这个机会请求多年的新功能。) 还是只向客户收取所需的总时间费用?(对于事先不知道成本的客户可能会有风险。)

2
如何针对我的申请处理负面广告活动?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 8年前关闭。 几年前,我开发了一个应用程序:尽管它与今天可用的软件相比已经过时且无用,但它在首次发布时对人们很有帮助。 我最近在Google上搜索了自己的名字,并偶然发现了一个网站,该网站声称我的应用程序是无法正常卸载的恶意软件,并提供了逐步删除说明。 当然,这不是真的,我对这种含意感到非常沮丧。 我应该如何处理这种情况?我应该与网站所有者对抗还是以其他方式处理?
13 feedback 

3
如何对音频进行单元测试?
我已经继承了一个小项目,并希望通过为要添加的所有新代码编写单元测试来扩展并稳定它。第一类TypedAudioCreator创建音频文件,事实证明,这很容易首先进行测试,然后编写代码。 但是,到了编写的时间TypedAudioPlayer,我不知道该如何测试。这是一门很小的课程,专注于播放声音的基础知识: public class TypedAudioFilePlayer { public event StartedPlayingHandler StartedPlaying; public event StoppedPlayingHandler StoppedPlaying; public readonly int TimeBetweenPlays; private Queue<TypedAudioFile> _playlist = new Queue<TypedAudioFile>(); public TypedAudioFilePlayer(int timeBetweenPlays) { TimeBetweenPlays = timeBetweenPlays; } public void AddFile(TypedAudioFile file) { _playlist.Enqueue(file); } public void StartPlaying() { ThreadPool.QueueUserWorkItem(ignoredState => { while (_playlist.Count > 0) …
13 c#  tdd 

2
在没有Java经验的情况下,使用Scala构建Android应用的理想学习路径是什么?
不幸的是,目前没有关于“使用Scala学习Android开发”这一主题的书籍,这将是理想的解决方案。我猜想我至少需要在这里拿起3本书,每个主题一本书。但是,我不知道以什么顺序阅读它们,是否同时阅读它们,可以安全地跳过Java书的哪些部分等等。 对我而言,开始使用Scala构建Android应用的最佳途径是什么?
13 java  android  scala 


2
一个产品的不错的git分支模型,该模型应该与另一个第三方产品的版本(以及一个建议的优缺点)一起提供
注意: 我的问题集中在我的特定问题(涉及Liferay)上,但是我希望它对需要在git上维护同一项目的各种版本的人有用。 我在一家为Liferay Portal编写很多插件的公司工作。这些插件(portlet,主题等)通常是可重用的,当然,应该为门户的新版本进行更新。 但是,通常必须将Portlet迁移到Liferay的新版本并维护其先前版本。同样,我们经常必须为某些客户端创建非常特定的自定义,将其添加到“主版本”中没有意义。 这些要求使我们的工作复杂化,但是幸运的是,我们可以进行一些简化。例如,一次只能由一位程序员频繁更新插件。同时在插件中添加两个或多个功能的情况很少见。 现在,我们正在迁移到Gitorious。我们正在尝试为这种情况设想一个分支模型。 我的模特 我建议的是: 每个插件在项目内部的Gitorious中都有自己的存储库。例如,用于显示小猫的portlet将kittens-portlet在liferay-portlets项目内部具有一个存储库。 创建新插件时,请在根据Liferay版本命名的分支(例如lf5.2)上创建它。 每次对插件进行更新时,都会批准该更新并将其部署到生产环境中,并用一个版本(例如lf5.2v1,lf5.2v2等)标记该插件* 每次将插件移植到Liferay的新版本时,我们都会分支最新版本(例如,创建branch lf6.0)。 一旦投入生产,新分支的负责人将收到诸如的标签lf6.0v1。 每次我们必须以客户端特定的方式自定义插件时,都会使用客户端名称创建一个分支(例如,我们将为lf5.2clientcorp客户端“ ClientCorp Inc.” 创建一个分支)。 这是一个不寻常的模型:它没有master分支并且没有很多分支。这就是我假设具有这种模型的存储库的样子: 一位朋友发现此系统相当复杂且容易出错。他提出了出色且受欢迎的Vincent Driessen模型,我发现该模型仍然难以管理和严格遵守纪律。当然,它很棒(并经过测试!),但对于我们的情况似乎太复杂了。 我朋友的模特 然后,他提出了另一种模型:我们将为Liferay版本中的每个插件提供一个存储库(因此,我们将开始创建kittens-lf5.2-portlet,然后再创建kittens-lf6.0-portlet),每个插件都有一个master分支和一个develop分支。该master会随时进行部署。(或者,master和Steve Loshstable所建议的相反)。 这很简单,但是我不喜欢这个系统: 它可能会在一个项目中导致大量的存储库,从而使Gitorious难以浏览。 项目目录的名称是相关的。如果有人将存储库克隆到kittens-lf6.0-portlet目录并使用ant生成WAR(通常),则WAR名称也将是kittens-lf6.0-portlet。kittens-portlet在升级的门户网站中,此portlet的旧版本(例如命名)将被视为不同的portlet(并且可能会丢失)。稍加注意可以避免它,但我宁愿避免它。 同一插件的不同版本将分开维护。我伤了我的心:( kittens-lf6.0-portlet 我认为,这是存储库的丑陋名称。 我怀疑最后两个要点-也是两个更主观的要点-是我不愿意的主要原因。尽管如此,所有四个反对意见仍然成立。 太太,我自己的建议对我自己来说似乎很奇怪,我想知道上面是否有隐藏的错误。OT3rdH git非常强大和灵活,我认为探索它的可能性不应该感到羞耻。 所以,我问: 最好的模型是什么?我的建议?我朋友的模特?现在是传统的Vincent Driessen系统? 您还建议其他什么分支模型? 如果您认为我的模型不好,为什么会这样呢?我很想了解缺点和盲点。 *实际上,我更喜欢用这样的版本标记提交,例如,v1但显然git中的标记不在分支范围内-也就是说,我不能在其中添加1 v1标记,lf5.2而在其中另一个标记lf6.0-因此我必须命名科。它是正确的BTW吗?

5
异构列表是否有特定目的?
来自C#和Java背景,我习惯于列表是同质的,这对我来说很有意义。当我开始使用Lisp时,我注意到列表可能是异类的。当我开始使用dynamicC#中的关键字时,我注意到,从C#4.0开始,也可能存在异构列表: List<dynamic> heterogeneousList 我的问题是什么?异构列表似乎在处理时会产生更多开销,并且如果您需要在一个地方存储不同的类型,则可能需要不同的数据结构。我的天真是在丑陋的面孔上浮出水面,还是真的有一次使用异类列表有用吗?

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.