软件工程

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

4
我应该在JSON响应中包含HTML标记吗?
在电子商务网站中,将商品添加到购物车时,我想显示一个弹出窗口,其中包含您可以选择的选项。假设您要订购iPod Shuffle,现在必须选择要雕刻的颜色和文字。 我希望窗口是模态的,所以我正在使用由Ajax调用填充的灯箱。现在我有两个选择: 选项1:仅发送数据,并使用JavaScript生成HTML标记 这样做的好处是,它将Ajax请求减少到了最低限度,并且没有将数据与标记混合在一起。 这样做的不好之处在于,现在我需要使用JavaScript进行渲染,而不是在服务器端使用模板引擎来进行渲染。通过使用客户端模板解决方案,我也许可以稍微清理一下方法。 选项2:发送HTML标记 这样做的好处是,我可以拥有与其余渲染任务(Django)相同的服务器端模板引擎,进行灯箱的渲染。JavaScript仅用于将HTML片段插入页面。因此,它显然将渲染留给了渲染引擎。我感觉合理。 但是由于某种原因,我不愿意在Ajax调用中混合数据和标记。我不确定是什么使我对此感到不安。我的意思是,每个网页的投放方式都一样-数据加标记-对吗?
13 mvc  django  templates  json 

3
定义标准
您将如何定义标准?我正在为某种尚不存在的事物定义协议,我想为其创建一个RFC,并使用IANA提供的众所周知的端口号。我该如何开始?

5
可以将面向对象的程序视为有限状态机吗?
这可能是一个哲学/基本问题,但我只想澄清一下。 在我的理解中,有限状态机是一种对系统建模的方式,其中系统的输出不仅取决于当前的输入,而且还取决于系统的当前状态。另外,顾名思义,可以将有限状态机及其各自的状态和行为划分为有限的N个状态。 如果这是正确的,难道不是每个带有数据和函数成员的对象都是我们的面向对象模型中的一个状态,从而使任何面向对象的设计成为有限状态机吗? 如果这不是对象设计中FSM的解释,那么人们在软件中实现FSM时到底意味着什么?我错过了什么吗? 谢谢

12
最佳做法和常识之间的区别?
关于软件开发中的最佳实践1的讨论很多。我已经看到至少有3个主要观点在SE和其他地方引起了很多讨论: 什么是最佳实践,为什么? 可以断言没有最佳实践是“最佳”实践,因此最佳实践甚至在一开始就值得讨论吗? 您什么时候应该放弃最佳做法-或也许是大多数最佳做法-是因为它似乎不适用,还是由于外部限制(时间,金钱等)使权衡取舍变得不切实际? 似乎很少出现的事情,但比以往任何时候都多,这是软件开发中的常识概念。最近的经验再次使这个想法浮现在我的脑海。 我的最初印象是,与最佳实践不同的是讨论,但可能存在交叉授粉。 当我想到一般意义上的常识时,我想到的是您已经掌握或接受的一组规则,这些规则为您提供推理和做出决定的基线。遵循常识是避免您射出整条腿的好方法。但是,除了较低的基准线外,常识可以让人们做出有根据的决定,而当证据看起来足够有说服力时,有根据的决定甚至可以超越常识。我可能对这里的定义有些松懈,但我认为它已经足够接近我的榜样了。 当我想到软件开发中的常识时,我想到了所有基本卫生规则,以防止代码库迅速腐烂成无法理解的混乱。例如,不使用单个全局结构来维护和传递非平凡程序中的状态;不使用只是乱码的变量/方法/类名;这些可能非常类似于我们称之为反模式的东西。在将最佳实践应用于学习模式的实践模拟中,将常识视为学习反模式的实践模拟。 考虑到这一点,我想提出一些问题,看看其他人的回答可能会帮助我确定自己的方式。 其他人是否认为软件开发中存在常识?知道任何一种推理方式都会很感兴趣。 如果是这样,是否值得讨论?我们是否应该像有时采用最佳做法一样努力推动这一工作?是否值得进一步努力? 如果与反模式的类比看起来合理,那么一般规则是,只有在没有其他方法的情况下才使用反模式,甚至只有在非常有限的情况下才使用反模式。允许代码库偏离常识的灵活性应该是多少?答案“根本不是”似乎是不合理的,因为有时权宜之计要求偏离。但是,这似乎是与何时采用“最佳实践”不同的论点。也许不是;如果您不这样认为,我想学习为什么。 这是开放的,也许值得一个后续的问题,您会指出什么样的建议,这似乎是常识呢? 也欢迎其他想法。 1也许我会更好地称它们为“常见重复出现的域模式”,但是“最佳实践”这个名称已经足够普遍,即使每个人都不认同它们是什么,也知道了它们的本质。如果“最佳”部分困扰您,请想象我用不太权威的话语代替了“最佳做法”。

3
依靠参数化查询是防止SQL注入的唯一方法吗?
我对SQL注入攻击的所有了解似乎都表明,参数化查询(尤其是存储过程中的参数化查询)是防范此类攻击的唯一方法。在我工作的时候(回到黑暗时代),存储过程被认为是一种不好的做法,主要是因为它们的可维护性较差。可测试性较低;高度耦合;并将系统锁定在一个供应商中;(此问题涵盖其他一些原因)。 尽管在我工作时,项目实际上并没有意识到这种攻击的可能性。采用了各种规则来保护数据库免受各种损坏。这些规则可以概括为: 没有客户端/应用程序可以直接访问数据库表。 对所有表的所有访问都是通过视图进行的(对基本表的所有更新都是通过触发器进行的)。 所有数据项都有指定的域。 不允许任何数据项为空-这意味着DBA有时会磨牙。但被执行了。 角色和权限已适当设置-例如,受限制的角色仅授予视图更改数据的权利。 那么,这样的一组(强制)规则(尽管不一定是特定的一组)是否可以替代参数化查询,以防止SQL注入攻击?如果没有,为什么不呢?可以通过(仅)数据库特定措施来保护数据库免受此类攻击吗? 编辑 鉴于收到的初步答复,对该问题的重视程度略有变化。基本问题不变。 编辑2 依赖参数化查询的方法似乎只是防御系统攻击的外围步骤。在我看来,更基本的防御措施既可取,又可能使对此类查询的依赖变得不必要或不太关键,甚至可以专门防御注入攻击。 我的问题中隐含的方法基于“加固”数据库,我不知道它是否是可行的选择。进一步的研究表明存在这样的方法。我发现以下来源提供了一些指向这种方法的指针: http://database-programmer.blogspot.com http://thehelsinkideclaration.blogspot.com 我从这些来源获得的主要特征是: 广泛的数据字典,与广泛的安全数据字典相结合 从数据字典生成触发器,查询和约束 最小化代码并最大化数据 尽管我到目前为止所获得的答案非常有用,并指出了忽略参数化查询所带来的困难,但最终它们并没有回答我的原始问题(现在以粗体强调)。


8
惩罚用户输入不安全的密码[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 我正在考虑限制选择不安全密码的用户的权限(密码的不安全性由长度,使用的字符类型(大/小写,数字,符号等)决定,是否可以使用)。 (位于彩虹表中)以限制帐户遭到破坏后所造成的损失。 我还没有这个想法的申请,但是说我正在写一个论坛之类的东西:使用1234作为密码的用户可能必须在发布前填写验证码,否则将受到诸如此类的严格反垃圾邮件措施的约束。作为超时或贝叶斯过滤器拒绝其内容。如果此论坛是非常分层的,允许“提升”主持人或通过某种方式进行的其他活动,这将阻止他们完全获得特权或告诉他们他们具有特权,但不允许他们在不进行任何更改的情况下行使其特权。密码。 当然,这不是唯一的安全措施,但是它可以很好地替代其他良好的安全做法。 你怎么看?这是否只是做的太过分,将注意力从更重要的安全实践上转移了下来,还是限制风险并鼓励用户使用更安全的密码的一种好方法(并希望说服您正在使用良好的安全实践的人们)?

3
如果大型公司总是违反网络最佳实践,那么它们是如此重要吗?
通常,有许多规则和最佳做法可帮助优化网站,吸引新客户,并通常在使用户体验快速,流畅和令人愉悦的同时(有时)减少服务器负载。 而且,通常,大型公司不会费心使用这些最佳做法。在最大的网站上,除了少数公司(例如Google),我们可以看到: 表格布局,而不是最小化的JavaScript,应该没有CSS精灵,几个CSS文件,侵入性的JavaScript,即使在那些简单易行的情况下,在中调用JavaScript文件<head/>等。 无意义的错误,烦人的弹出窗口,需要填写大量字段的注册表,寄存器上的UX问题¹,愚蠢的问题和无法使用网站²的情况,网站关键部分上令人困惑的情况³,多次重定向,慢速页面等。 一方面,由于它们的成功部分或完全依赖于网站,这些公司为开发,优化和托管其网站付出了巨额资金;另一方面,他们不断违反最佳做法,而拥护这些最佳做法的人们则解释说,遵循这些最佳做法有助于实现更好的用户体验和更快的网站,而占用的环境更少(在托管于数千台服务器上的网站上不可忽略) 。 在这种情况下,提出以下要求是合乎逻辑的: 如果真正成功的大公司的网站和称职的员工确实有很多钱,并且那些对网站优化的关注不断违反这些最佳实践,那么这些最佳实践是真的吗? 或者,换句话说,如果这些最佳实践如此重要,并且对优化网站有很大帮助,那么为什么这些公司不关心它们? 让我们以Dell.com为例。我敢肯定,他们会聘请最好的人来创建他们的主页。他们的主页使用表格布局。这是否意味着那些说表格布局不好的人错了?这是否意味着戴尔聘用的最好的人才不称职? ¹第一个示例:eBay使得在注册时无法在两个字段中都粘贴您的邮件地址,从而使注册表格的使用时间更长,除了惹恼用户之外,没有其他理由;最佳做法是禁止复制,但允许粘贴。第二个示例:Microsoft Live将密码的长度限制为16个字符,没有任何明显的原因。 ²例如,当您很长一段时间没有去亚马逊时,它说密码无效,然后要恢复密码,询问您上次交易的信息,如果您已经使用过该帐户,则该帐户将不可用从未与该帐户进行过任何交易。 ³例如,Dell使得无法订购没有任何硬盘的机架服务器,而如果您已经拥有要重用的硬盘,这将是完全有效的。 optimization这种优化包括局部刷新以更快地发送最重要的内容,研究等待页面加载的时间与使用网站的人数之间的关系等 。⁵对于戴尔,微软等公司。 ⁶至于eBay或其他基于网络的公司。

2
审计和日志在软件系统中是否确实做同样的事情?
我已经看到一些软件系统具有审计和日志功能。这些功能似乎都在做相同的事情- 在后台记录所有用户的动作。数据库中甚至存在相应的审计和日志表。如果他们真的在做同样的事情,为什么开发人员会在系统中开发重复功能?
13 audit 

16
有什么更好的方式描述软件“愚蠢的证明”的过程?
关闭。这个问题是题外话。它当前不接受答案。 8年前关闭。 已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 对我来说,白痴证明只是意味着确保用户即使尝试也不会破坏软件。例如,如果从文本框中读取一个值并将其转换为双精度型,则基础软件具有白痴证明,如果用户键入非双精度型值,则该值不会中断。 我最近写了一份开发进度表,其中一项被命名为“白痴证明UI”。我正在开发此软件的人员开玩笑地冒充该术语,但我可以看到此术语实际上会使人们感到不安。 有什么更好的说法呢?

10
在修改/添加到模块时重新格式化其他开发人员代码是否可以?
在团体氛围中开发并在某些代码库中添加或修改功能时。重新格式化以前的开发人员代码以使其达到当前的编码标准是否被认为具有冒犯性或不礼貌?我了解标准已经更改,并且可能会继续更改,但是如果有人通过并更改了代码格式,你们中的任何人都会生气吗? 明确地说,我不是在谈论更改任何逻辑,只是在混乱制表符和空格等。 编辑:我不仅为了代码标准而这样做,它还帮助我通读了他们的代码并更新了代码,因此在我开始修改关键应用程序之前,我可以完全理解已经实现的逻辑。

8
我如何(迅速)使人们知道我免费提供的软件不是废弃软件?
作为独立的个体程序员: 如何让人们很快知道我没有放弃自己编写并免费赠送的软件?我是否正在努力将软件维护和支持达到专业水平? 当由一两个开发人员编写的软件免费提供或标记为开源时,通常默认的假设是它是废弃软件。通常这是一个安全的假设-如果您对此有疑问,请查看该问题的答案:程序员为什么要编写封闭源代码的应用程序然后将其释放?。 不过,有许多程序员提供免费的和/或开源的工具,这些工具不是废弃软件。 如果我们谈论的是大公司,例如Google,那么说支持的实时工具和软件与那些被放弃或停产的工具和软件之间的区别是没有真正的问题的。 活跃的git存储库不是很快-用户必须足够精明才能理解存储库并知道在哪里寻找它。一致的营销和社区管理需要比我自己投入更多的时间和精力。另外,如果我的软件流行/成功,我认为这些软件将独立发展,并得到社区中高级用户的支持。

7
什么构成了在编程中正确使用线程?
我厌烦听到人们建议您每个处理器仅使用一个线程,而许多程序每个进程最多使用100个线程!以一些常见程序为例 vb.net ide uses about 25 thread when not debugging System uses about 100 chrome uses about 19 Avira uses more than about 50 每当我发布与线程相关的问题时,几乎每次都会提醒我,每个处理器不应使用一个以上的线程,并且上面提到的所有程序在使用单个处理器的系统上都会崩溃。

7
绕过不变性
我是面向对象编程的新手,一个需要我花一段时间才能掌握的概念是不变性。我认为昨晚灯泡熄灭了,但我想验证一下: 当我遇到无法更改不可变对象的声明时,我会感到困惑,因为例如,我可以执行以下操作: NSString *myName = @"Bob"; myName = @"Mike"; 在那里,我刚刚更改了不可变类型NSString的myName。我的问题是,“对象”一词可以指代内存中的物理对象,也可以指代“ myName”。前一个定义适用于不变性的概念。 对于变量,(对我而言)对不变性的更清楚的定义是,不变对象的值只能通过更改其在内存中的位置(即其引用(也称为指针))来更改。 这是正确的,还是我仍然迷失在树林中?

4
是否可以从开放源代码项目中学习算法,然后在封闭源代码项目中实现该算法?
参考开始这一切的帖子 为了澄清我提出来的原始问题,我提出了这个问题。 如果您从开放源代码项目中学习算法,可以在单独的封闭源代码项目中使用该算法吗?如果不是,这是否意味着您不能再使用该知识?如果可以使用它,那是什么情况? 只是为了澄清,我不是想逃避许可证,否则我不会一开始就问这个问题。

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.