软件工程

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

2
如今如何模块化和打包客户端Javascript库?
我一直在追赶现代的客户端JS生态系统,并阅读CommonJS和AMD(包括相关工具-browserify,requirejs,onejs,jam等等)。如果我正在编写Javascript库,如何对它进行模块化/打包,以便可以最广泛地访问它(理想情况下,对CommonJS,AMD尤其是两者都不满意的用户)? 像jQuery这样的流行库似乎只是使用老式文件串联来构建自身,并动态检测它是否应该写入exports或全局上下文。我目前正在做同样的事情,但是主要的缺点是,如果我(与jQuery不同)依赖于一些库,那么不必要求用户手动预先包含传递集就很好了。(尽管我目前只有两个依赖项。)当然还有全局名称空间污染。 还是为每个上下文生成我的库的多个版本是最干净的? 我也想知道打包和发布。有几种系统,但是我相信主要的系统是bower,它很容易处理,因为它所做的只是获取。但是,我想知道是否也应该针对其他组件系统,例如component(需要CommonJS)。 我还应该注意其他相关方面吗?是否有所有这些都可以遵循的良好示例项目?

7
物理敏捷板“总是”比电子工具好吗?
每当出现关于使用哪种敏捷工具的问题时,总会有一些人回答“不要使用电子工具,因为您将失去看得见的板子优势,而这会更好地促进团队对话。” 总是这样吗?或者在任何情况下电子工具都是更好的选择?每种方法的优缺点有哪些?
11 agile  tools 

1
以char类型存储EOF(文件结尾)字符
我读过丹尼斯·里奇(Dennis Ritchie)的《 C编程语言》一书,该书int必须用于容纳EOF的变量-使其足够大以使其可以容纳EOF值-不能char。但是以下代码可以正常工作: #include<stdio.h> main() { char c; c=getchar(); while(c!=EOF) { putchar(c); c=getchar(); } } 没有更多输入时,getchar返回EOF。在上面的程序中,c具有char类型的变量能够成功保存它。 为什么这样做?根据上述书籍中的解释,该代码不起作用。
11 c 

10
有关如何反驳代码覆盖率质量参数的任何工具/建议
现在,我知道人们会认为这个问题重复或被问过很多次,在这种情况下,我希望获得与相关问题的链接以及我的问题的答案。 我最近在代码覆盖方面与某些人意见不一致。我有一群人希望我们的团队基于100%的覆盖率并不意味着良好的质量测试以及良好的代码质量就完全放弃代码覆盖率的研究。 通过推销“代码覆盖率”可以告诉我尚未确定的内容的论点,我可以进行回退,并帮助我们专注于这些领域。 (以上已经在类似这样的其他SO问题中以类似的方式进行了讨论-https: //stackoverflow.com/questions/695811/pitfalls-of-code-coverage) 这些人的论据是-然后,团队会做出反应,迅速创建质量低下的测试,从而浪费时间,同时又不增加明显的质量。 在理解他们的观点的同时,我正在寻找一种方法,通过引入更健壮的工具/框架来照顾更多的覆盖标准, 从而使代码覆盖更可靠(Functional, Statement,Decision, Branch, Condition, State, LCSAJ, path, jump path, entry/exit, Loop, Parameter Value etc)。 我正在寻找的建议是将这样的代码覆盖率工具和实践/过程结合在一起使用,这可以帮助我在对建议感到满意的同时反驳此类争论。 我也欢迎根据您的经验/知识如何提出反对意见提出的任何评论/建议,因为尽管主观,但是代码覆盖率使我的团队更加意识到了代码质量和测试价值。 编辑:为了减少对我对典型代码覆盖范围弱点的理解的困惑,我想指出的是,我并不是指 Statement Coverage(或执行的代码行)工具(有很多)。实际上,这里有一篇很好的文章介绍了所有错误之处:http : //www.bullseye.com/statementCoverage.html 我不仅在寻找语句或行覆盖率,而且还在寻找多个覆盖率标准和级别。 请参阅:http : //en.wikipedia.org/wiki/Code_coverage#Coverage_criteria 这个想法是,如果一个工具可以根据多个标准告诉我们我们的覆盖范围,那么它将成为对测试质量的合理自动化评估。我绝不是要说线路覆盖率是一个很好的评估。实际上,这就是我提出这个问题的前提。 编辑: 好的,也许我对它的预测太过夸张了,但是您明白了。问题在于以统一/一致的方式在所有团队中设置流程/策略。人们普遍担心,您如何确保测试质量,如何在没有任何措施的情况下分配保证的时间。因此,我喜欢具有可测量的功能,当使用适当的流程和正确的工具进行备份时,它将使我们能够提高代码质量,同时又知道不会浪费时间在浪费性的流程上。 编辑:到目前为止,我从答案中得到了什么: 代码审查应涵盖测试以确保测试质量 “测试优先”策略有助于避免事后写出的测试仅增加覆盖率% 探索涵盖测试标准的替代工具,而不仅仅是声明/行 分析覆盖的代码/发现的错误数量将有助于理解覆盖的重要性并提供更好的案例 最重要的是,请信任团队的投入以做正确的事并为自己的信念而战 涵盖的区块/测试数量-值得商but,但具有一定价值 感谢您迄今为止的出色回答。我真的很感激他们。此功能比具有强大功能的头脑风暴要好几个小时。

2
处理订阅,余额和定价计划更改
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 序言 我的目的是为多个项目创建可重用的代码(并在github上发布)以管理订阅。我了解条带化和定期计费提供商,但这不是该模块的目标。它应该只是用于计算帐户余额,轻松通知续订订阅以及处理价格计算的包装程序/帮助程序。 在某些国家/地区,您可能无法使用重复计费,因为提供商或付款方式对此支持不佳或没有支持,或者价格太高(小额付款)。而且有些人不想使用循环计费,而是手动支付账单/在年末开具发票。因此,请不要建议贝宝定期计费,递归或类似服务。 情况 假设您有一个可以订阅订阅计划的模型(例如User)。该模型具有一个字段,该字段存储当前正在订阅的订阅计划的标识符。因此,在每次计划更改时,都会记录更改。 有一个模型(例如SubscriptionPlanChanges),其中的以下字段记录了提到的更改: subscriber与订阅模型有关(User在这种情况下) from_plan 定义更改之前模型具有的计划标识符 to_plan 定义模型现在选择的计划标识符 created_at 是存储更改的日期时间字段 valid_until 存储日期,直到实际订阅有效 paid_at 也是一个日期时间字段,用于定义是否(以及何时)订阅已支付 当然,这种布局是可以讨论的。 帐户余额问题 当用户更改其订阅计划时,我需要比较计划字段,获取价格,并根据当前计划valid_until及其价格计算新计划的扣除额。说:您订购了计划A的一年,但是在6个月后,您升级到计划B,因此您可以从计划A的6个月中扣除一半的已付价格。 我想知道的是:如果某个用户(例如)切换到免费计划,那么他有一个积分,如果该用户想要再次切换,则可以扣除该积分。您会在另一个字段中缓存该值,还是每次都计算与该用户相关的所有记录?您会添加/更改有关表格布局的内容吗? 易于理解的问题 当订阅期结束时,用户会收到通知,并有可能通过再次付费来续订其订阅。最简单的方法是只更新paid_at和valid_until新的订阅选项。但是,我不确定您是否存储了某人可能需要的所有数据,例如付款/订阅历史记录。 另一个选择是为此创建一个附加记录,其中from_plan和to_plan具有相同的标识符(因此表示“无变化”)。但是这不会以某种方式干扰帐户余额的计算吗? 如果有人能为我指出有关处理此类订阅的逻辑的正确方向,我将非常感激。 更新 感谢您的帮助。我认为我的问题太模糊了,因此我将尝试通过使用较少的抽象来使其更加精确。不幸的是,我还不能解决我的问题。 案例A User可以选择Subscription Plan A。当前,此文件存储了一个SubscriptionPlanChange以进行跟踪。例如5个月后,User将其订阅升级为Subscription Plan B。因此,他为新订阅支付价格,减去未使用的7个月的方案a的价格。 案例B 3个月后,User回滚到他的Subscription Plan A。他不必付款,但会收到一笔余额,因此,在订阅结束时,他将从新订阅中扣除该余额。 案例C User可以为具有独立订阅计划的子服务选择订阅计划。相同Case A,Case B可以申请该子服务订阅。 _Case D_ 用户取消其订阅之一。这导致他的余额增加了。 我的问题(目前至少是)主要取决于如何正确存储数据,以便我可以重现订阅的历史以进行业务分析和计算余额,并根据订阅获得未付款项等。 我也不确定是否应将余额存储在例如用户模型本身中,或者是否未存储但可以根据存储的数据/历史记录随时进行计算。 需要注意一些事项,尽管我认为它们不应该引入问题: …

6
要使软件工程成为正规专业,需要改变什么?
与其他专业(例如会计,法律,医学等)不同,软件工程没有专业范围的认证。 我非常了解旨在作为专业知识和经验证明的众多技术和方法学特定认证,但是没有公共软件工程学会/理事机构设置(并有权进行法律评估)公认的专业标准。 我知道软件是一门充满活力的野兽-它既是艺术,又是科学-但我想知道软件工程是否有潜力成为正规专业。 要发生什么需要改变,这甚至是一件好事吗? (如果有人知道对该主题进行正式研究,我将不胜感激。) 更新资料 我同意以下关于软件工程当前认证水平的许多优点。我还发现有些国家将软件工程视为一种职业,而其他国家却没有,这很有趣。 但是,“正式职业”一词似乎以及它在软件工程中的应用似乎有点笼罩。我认为软件工程的关键问题-而不是成熟的职业-的主要原因是,如果您是一位认证的软件工程师,并且-例如-您为电梯编写的某些软件发生故障并导致人员死亡,您的认证和/或正式专业机构的成员资格不会被撤销。 当然,您的公司可能被起诉数以百万计,您个人可能会丢掉您的工作并获得不好的推荐,但一般而言,由于您被该公司雇用,您个人受到有限责任盾的保护。换句话说,据我所知,没有适当的法律评估/执行(不同于其他正式职业及其执政协会),其职责是一旦您产生了巨大的负担就正式禁止您进行交易。 我很喜欢这样一个答案,即软件工程(按现状)是一种精英,不需要正式的职业,这是一件不可改变的好事。同时,我认为我们需要对任务关键型软件的软件工程师与其他/非关键型软件的开发人员进行明确区分。 对于那些在关键任务软件上工作过或曾经工作的人-是否要承担个人责任?如果软件工程师犯了代价高昂的错误,是否肯定需要正式的回应?

3
如果项目取消,谁拥有代码?
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 4年前关闭。 问题是:我正在一个自由市场上工作,我决定取消与一位客户的项目,因为客户不可能无限制地拖延工作并且后端有很多错误。我想给他部分退款(部分原因是因为我工作了两个月并且有3k行代码,尽管由于他后端的问题,应用程序仍然无法正常工作)。 问题:谁是我编写的代码的“所有者”?在项目启动时,我们没有对此达成协议。我可以告诉他不要使用我的代码吗?我了解,无论如何他都可以无视我的禁令,我只是想知道我是否有正式的“权利”这样说。


3
将机密数据安全地存储在客户端Web应用程序中
我有这个Web应用程序,它将成为所有客户端技术(HTML,CSS,JavaScript / AngularJS等)。该Web应用程序将与REST API进行交互,以访问和修改数据。目前,尚不确定REST API将使用哪种类型的身份验证系统。 据我了解,任何类型的API身份验证系统(API密钥,OAuth 1/2等)都将具有某些需要保密的数据,否则可能会损害访问权限。对于API密钥,它们本身的密钥需要保密,对于OAuth 2,客户端秘密/访问令牌/刷新令牌需要保密,我确定OAuth 1涉及的4个密钥中的一些必须保密(不是OAuth 1的经验过多)。我一直在尝试思考是否有一种方法可以将这种秘密内容存储在纯客户端Web应用程序中,而无需在服务器端进行中间层排序。 我一直在尝试考虑这个问题,而我想不起任何地方可以这样做。我的意思是我无法将其存储在javascript中,因为任何人都只能查看源代码或打开控制台并获取数据。我不确定100%localStorage的安全性以及用户是否可以访问/修改该数据。即使本地存储是安全的,我想到的将数据放入其中的两种方法也不是。一种方法是仅将数据存储在javascript源代码中,这是我能想到的最不安全的事情。现在,如果我使用的是OAuth 2之类的东西,其余的api本身会给我令牌,那仍然不是那么安全(比第一个选项好),因为这些令牌将以纯文本形式返回,任何人都可以看到计算机正在查看的请求。 有没有办法让完全运行客户端的应用程序能够安全地存储秘密数据,而无需在服务器端设置某种中间层?

4
在敏捷开发中如何处理用户界面设计和相应的功能支持?
在敏捷开发过程中,通常主要侧重于用户故事,但是有时一个需求可能跨越多个用户故事。 例如,客户端可以为论坛中的所有用户请求搜索页面,并且在每个用户上可以执行多种操作,例如禁止用户,删除用户,重置密码等。 我们可以将此功能至少分为4个用户故事: 搜索用户 禁止用户 删除用户 重设密码 用户界面设计者将如何实现这样的用户界面?他/她是否应该处理第一个用户故事,然后开始为UI增加更多功能?但是,我认为最终的UI会搞砸了! 如果他决定使用整个功能(搜索+动作),那么如果这些动作的优先级较低,并且将在搜索功能完成后进行多次迭代,该怎么办?

3
字节码编织与Lisp宏
我一直在阅读人们为Java和C#等语言编写的库,这些库利用字节代码编织来完成诸如拦截函数调用,插入日志记录代码之类的事情。我还一直在阅读Lisp / Clojure宏试图更好地了解如何利用它们。我对宏的了解越多,它们似乎提供的功能与字节码编织库相同。功能是指在编译时处理代码的能力。 我一直在查看的库示例包括AspectJ,PostSharp和Cecil。 有什么可以做的而不是另一种?他们实际上解决了相同的问题,还是我在比较苹果和橙子?


2
.NET开发人员试图学习Rails上的Ruby
我是.NET开发人员,本周末我才有机会与Ruby on Rails一起玩。 在.NET中,我们通过创建单独的类库项目来分离应用程序的各个层。从设计模式的角度来看,我们是否也必须在Rails中做到这一点,还是仅仅是其中包含所有内容的整个项目?

3
缓存排序/属性可以更改的分页结果的最佳实践是什么?
缓存排序/属性可以更改的分页搜索结果的最佳实践是什么? 假设在我的应用程序中,有人想要查看最近的20个讨论线程(在10,000个线程中)。一个请求将通过发送到数据库,servlet以XML / JSON形式从讨论线程表中获取前20条记录。如果他们随后要查看下一个20,则转到结果的下一页,这会触发另一个请求以获取下一个批次(限制和偏移= 20,依此类推)。 为了减少服务器负载和客户端等待,我想缓存结果的前几页。但是,我有两个问题: 结果显示的表可以按多个属性(即,线程创建日期,线程作者,最后发布日期)排序。这意味着没有上下文(即我们排序的依据)之类的“前20个结果”这样的语句是没有意义的。然后,前端如何与后端通信已加载的内容?我的第一个想法是对每个结果使用ID,但是在随后的请求中将它们发送回服务器(并根据它们过滤结果)就像将所有内容盲目地发送回一样耗时。我怎样才能做到这一点? 如果先前返回的结果的属性(即最新日期)改变了怎么办?然后,我们需要一种检查每个结果的方法,以查看自页面调入以来是否已在服务器端对其进行了修改。我该怎么做?

6
哪些更改太大而无法通过适当的设计轻松实现?
这是一个相当模糊的问题,但这是我在阅读有关适当设计的内容时从未感到满意的答案。 通常,在学习面向对象的编程,抽象,分解等方法时,设计的圣杯以及它们始终声称您使用的是开发技术的原因是,这将使您的程序“易于更改” ,“可维护的”,“灵活的”或用于表达这种有效果的概念的任何同义词。通过将ivars标记为私有,将代码拆分为许多小的自包含方法,使接口保持通用,可以使您完全轻松自如地修改程序。 对于较小的更改,这对我来说效果很好。改变类以提高性能所用的内部数据结构从来都不是主要困难,而且独立于API的用户界面端也没有改变,例如重新设计文本输入系统或检修游戏元素的图形。 所有这些更改似乎天生就是独立的。就所涉及的外部代码而言,它们均不涉及对要修改的程序组件的行为或设计进行任何更改。无论您是以程序编写还是以OO样式编写(具有大型功能还是小型功能),即使您只有中等程度的设计,也可以轻松进行这些更改。 但是,每当更改变得繁琐而繁琐时(即,对API进行更改),我的所有宝贵“模式”都无法挽救。巨大的变化仍然很大,受影响的代码仍然受到影响,并且大量的错误产生工作摆在我面前。 所以,我的问题是这个。适当的设计声称能够促进多大的变化?是否有一些其他的设计技术,或者对我来说是未知的,或者是我没有实现,确实确实使粘滞性修改变得简单,还是那个承诺(我听说过这么多不同的范例)仅仅是一个好主意,完全脱离了软件开发的一成不变的真理?我可以添加到工具栏中的“更改工具”吗? 具体来说,导致我进入论坛的问题是:我一直在努力实现一种解释性编程语言(在D中实现,但这无关紧要),并且我决定将闭包的参数设为基于关键字,而不是当前的位置。这就需要修改所有现有的调用匿名函数的代码,幸运的是,这很小,因为我很早就开发了我的语言(<2000行),但是如果我稍后再做出决定,那将是巨大的。在这种情况下,是否可以通过适当的预见性设计使修改变得更容易,或者确定(大多数)变化本质上影响深远?我很好奇这是否是我自己的设计技能的失败-如果是的话,我 明确地说,我绝不怀疑OOP或其他常用的模式。但是,对我而言,它们的优点在于代码库的原始编写而不是维护。继承使您可以很好地抽象出重复的模式,多态性使您可以通过人类理解的函数(哪个类)而不是由机器理解的效果(switch语句的哪个分支)来分离代码,而小的独立函数可以让您以一种非常愉快的“自下而上”的风格写作。但是,我对他们的灵活性表示怀疑。

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.