软件工程

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

12
是否将诸如API密钥之类的秘密信息保留在源代码控制之外的策略?
我正在一个网站上工作,该网站将允许用户使用来自Twitter,Google等的OAuth凭据登录。为此,我必须在这些提供商处注册并获得我拥有的超级秘密API密钥用誓言保护身体的各个部位。如果我的钥匙结了,那部分就被拉了。 API密钥必须随我的源一起传送,因为它在运行时用于执行身份验证请求。就我而言,密钥必须存在于应用程序中的配置文件中或代码本身中。当我在一台计算机上进行构建和发布时,这不是问题。但是,当我们将源代码管理混为一谈时,事情就会变得更加复杂。 因为我是个贱人,所以我更喜欢在云或GitHub中使用免费的源代码控制服务,例如TFS。这给我带来了一个小难题: 当我的API密钥在代码中并且我的代码可在公共存储库中使用时,如何保持身体完整? 我可以想到许多方法来解决此问题,但是没有一种方法令人满意。 我可以从代码中删除所有私人信息,并在部署后重新编辑。实施起来会很痛苦(我不会在很多方面详述),并且不是一种选择。 我可以加密它。但是,由于我必须解密它,因此任何有消息来源的人都可以弄清楚该怎么做。无意义。 我可以支付私人来源控制的费用。哈哈j / k花钱了吗?请。 我可以使用语言功能将敏感信息与我的其余源代码隔离开,从而使它不受源代码控制。这就是我现在正在做的事情,但是如果错误地检查机密文件,很容易搞砸。 我真的在寻找一种有保证的方式,以确保我不会与世界共享我的私人信息(除了在手套上),这将通过开发,调试和部署而流畅地运行,并且也非常安全。这是完全不现实的。 那我该怎么办呢? 技术细节:VS2012,C#4.5,源代码管理将是TF服务或GitHub。当前使用分部类将敏感键拆分到一个单独的.cs文件中,该文件不会添加到源代码管理中。我认为GitHub可能具有优势,因为.gitignore可以用于确保不检入部分类文件,但是我之前已经搞砸了。我希望有一个“哦,常见的问题,这就是你的做法”,但我可能不得不满足于“没有那么多的吸引力”,:/

29
对“开源,提交补丁”的典型反驳是什么?[关闭]
在产品(特别是开源产品)上建议某些功能的危险是,您会得到响应,“为什么不这样做?”。 这是有效的,而且您可以自己进行更改很酷。但是,我们实际上知道,随着程序员倾听用户的声音,即使这些用户是其他程序员,产品也确实会不断进步。而且,进行这些更改的有效方法可以包括已经在项目中工作并接受并实现该想法的人员。 有一些常用术语用来指代软件开发问题。例如Bikeshedding。是否有一个通用术语基本上可以回答:“是的,我知道我可以改变世界上的几乎任何东西,甚至是封闭源代码。我都可以被雇用,然后去编写该代码。但是在这种情况下,我只是在做实际上对于另一位已经非常适合轻松进行更改的编码人员有用的观察,或者只是在讨论各种可能性。” [ps(几天后)-我应该指出,“提交补丁”通常会用幽默的语气来表达,我正在寻求适当的机智回应。]
215 open-source 

17
过早的优化真的是万恶之源吗?
我的一位同事今天提交了一个名为的类ThreadLocalFormat,该类基本上将Java Format类的实例移动到了线程本地中,因为它们不是线程安全的,而且创建起来“相对昂贵”。我写了一个快速测试,计算出我每秒可以创建200,000个实例,问他是否创建了那么多实例,对此他回答“远不及那么多”。他是一位出色的程序员,并且团队中的每个人都非常熟练,因此我们对所生成的代码毫无疑问,但这显然是在没有实际需要的情况下进行优化的情况。他应我的要求取消了代码。你怎么看?这是“过早优化”的案例吗,真的有多糟糕?

6
在ES6中应该使用多少个“ let”和“ const”?
我最近一直在为io.js写很多ES6代码。没有太多可学习的代码,所以我觉得自己正在定义自己的约定。 我的问题是有关何时使用constVS let。 我一直在应用此规则:如果可能,请使用const。仅let当您知道其价值需要改变时才使用。(如果以后发现您需要更改其值,则可以随时将其更改const为a let。) 此规则的主要原因是易于一致地应用。没有灰色区域。 问题是,当我应用此规则时,实际上95%的声明是const。这对我来说很奇怪。我只使用let的东西像i一个for循环,或偶尔搞什么积累斐波那契数总数(不拿出在现实生活中很多)。我对此感到惊讶–事实证明,到目前为止,我的ES5代码中95%的“变量”是针对不变的值。但是,看到const我的代码全都感觉不对。 所以我的问题是:可以使用const这么多吗?我真的应该做类似的事情const foo = function () {...};吗? 还是我应该保留const那些在模块顶部对文字进行硬编码的情况const MARGIN_WIDTH = 410;?
214 javascript  es6 

5
如何编写一个非常基本的编译器
高级编译器喜欢gcc根据代码的编写语言(例如C,C ++等)将代码编译为机器可读文件。实际上,它们根据相应语言的库和功能来解释每个代码的含义。如果我错了纠正我。 我希望通过编写一个非常基本的编译器(可能使用C语言)来编译静态文件(例如,文本文件中的Hello World)来更好地理解编译器。我尝试了一些教程和书籍,但所有这些都是针对实际案例的。它们处理具有与相应语言相关的含义的动态代码的编译。 如何编写基本的编译器以将静态文本转换为机器可读文件? 下一步将变量引入编译器。想象一下,我们想编写一个只编译某种语言功能的编译器。 引入实用的教程和资源受到高度赞赏:-)
214 c  compiler  compilation  gcc 

18
一个人如何管理上千条IF ... THEN ... ELSE规则?
我正在考虑构建一个应用程序,该应用程序的核心是数千个if ... then ... else语句。该应用程序的目的是能够预测奶牛在任何景观中如何移动。他们受到太阳,风,食物来源,突发事件等的影响。 如何管理这样的应用程序?我想象在经过数百个IF语句之后,程序将如何响应并调试导致某种反应的结果将意味着每次必须遍历整个IF语句树,这将是无法预测的好。 我已经阅读了一些有关规则引擎的内容,但是我看不到它们如何克服这种复杂性。

9
花大量的时间(如果不是更多的话)编写测试而不是实际的代码是正常的吗?
我发现测试比他们正在测试的实际代码更加棘手,更难编写。对于我来说,花更多的时间编写测试而不是测试代码并不稀奇。 那是正常的还是我做错了什么? 问题“ 单元测试或测试驱动的开发值得吗?”,“ 我们比实施系统本身花费更多的时间来实施功能测试,这是否正常?”,他们的答案更多地是关于测试是否值得(例如“我们应该完全跳过编写测试吗?”中的内容)。尽管我确信测试很重要,但是我想知道我在测试上花费的时间是否比实际代码多还是正常的,还是仅我一个人? 从我收到的问题的观点,答案和投票的数量来看,我只能认为它是网站上其他任何问题都没有解决的合法问题。

15
为什么我们需要私有变量?
为什么在类中需要私有变量? 我读过的每本关于编程的书都说这是一个私有变量,这是您定义它的方式,但仅此而已。 在我看来,这些解释的措辞总是像我们对我们的职业确实存在信任危机。这些解释听起来总是像其他程序员要弄乱我们的代码一样。但是,有许多编程语言没有私有变量。 私有变量可以帮助防止什么? 您如何确定特定财产是否应为私有?如果默认情况下每个字段都应该是私有的,那么为什么在类中有公共数据成员呢? 在什么情况下应该公开变量?

16
我们真的需要OO语言来管理软件复杂性吗?
这将是一个非技术性的软性问题,我不确定这是否是正确的平台。但是我是CS的初学者,所以我希望你们能容忍它。 在第一学期中,我们通过Java和UML介绍了OOP概念,例如封装,数据隐藏,模块化,继承等。(Java是我的第一门编程语言) 以我的理解,OOP是一种管理软件复杂性的方法。但是它的原理并不是新的或独特的,它们在某种意义上在所有工程领域都是通用的。 例如,汽车是一种非常复杂的结构,其复杂性由具有明确定义的行为和接口的模块化和封装组件的层次结构来管理。 但是我不明白引入新的编程范例的原因。我认为,用于管理复杂性的所有原理都可以通过过程编程语言来实现。例如,对于模块化,我们可以将程序分为许多小程序,这些小程序执行定义明确的任务,其代码包含在单独的文件中。这些程序将通过其定义明确的输入和输出相互交互。可以对文件进行保护(加密?)以实现封装。为了重新使用代码,我们只要在新程序中需要它们时就可以调用它们。这不是捕获所有的OOP还是我缺少非常明显的东西? 我不是要证明OOP可以管理复杂性。我认为确实可以。但是我认为,用于处理复杂性的所有原理(例如模块化,封装,数据隐藏等)都可以很容易地由过程语言实现。那么,如果我们不进行复杂性管理,为什么要真正实现面向对象设计呢?


16
我的老板要求我停止编写小的函数,并在同一循环中完成所有操作
我已经读过罗伯特·C·马丁(Robert C. Martin)的一本名为《清洁代码》的书。在本书中,我看到了许多清理代码的方法,例如编写小的函数,仔细选择名称等。这似乎是迄今为止我所读过的最有趣的有关干净代码的书。但是,今天我的老板不喜欢我看完本书后写代码的方式。 他的论据是 编写小函数很痛苦,因为它迫使您进入每个小函数以查看代码在做什么。 即使主循环超过300行,也可以将所有内容放入主大循环中,以使其读取速度更快。 仅在必须复制代码时编写小型函数。 不要使用注释名称编写函数,而是将复杂的代码行(3-4行)放在注释上方;同样,您可以直接修改失败的代码 这与我读过的所有内容背道而驰。您通常如何编写代码?一个主要的大循环,没有小的功能? 我使用的语言主要是Javascript。由于我删除了所有小的明确命名的函数并将所有内容放入一个大循环中,因此我现在真的很难阅读。但是,我的老板喜欢这种方式。 一个例子是: // The way I would write it if (isApplicationInProduction(headers)) { phoneNumber = headers.resourceId; } else { phoneNumber = DEV_PHONE_NUMBER; } function isApplicationInProduction(headers) { return _.has(headers, 'resourceId'); } // The way he would write it // Take the right resourceId …

10
传递参数的(反)模式是否有名称,将仅在调用链的多个级别使用?
我试图在某些旧代码中找到使用全局变量的替代方法。但是这个问题与技术选择无关,我主要关注的是术语。 显而易见的解决方案是将参数传递给函数,而不是使用全局变量。在此传统代码库中,这意味着我必须更改长调用链中最终将使用该值的点与首先接收该参数的函数之间的所有函数。 higherlevel(newParam)->level1(newParam)->level2(newParam)->level3(newParam) newParam在我的示例中,where 以前是全局变量,但可能是以前的硬编码值。关键是,现在newParam的值是从获得的,higherlevel()并且必须一直“移动”到level3()。 我在想,如果有一个姓名(或名称)的这种情况下,你需要一个参数添加到许多功能只是“传”未经修改的值/模式。 希望使用正确的术语将使我能够找到有关重新设计解决方案的更多资源,并向同事描述这种情况。

10
为什么我们在设计模式中需要这么多的类?
我是大四学生中的初级开发人员,并且在理解他们的思维和推理方面付出了很多努力。 我正在阅读域驱动设计(DDD),无法理解为什么我们需要创建这么多的类。如果采用这种设计软件的方法,我们最终将得到20-30个类,最多可以替换为两个文件和3-4个函数。是的,这可能很麻烦,但是它更具可维护性和可读性。 每当我想查看某种EntityTransformationServiceImpl功能时,都需要遵循许多类,接口,它们的函数调用,构造函数,它们的创建等等。 简单的数学: 60行伪代码与10类X 10(假设我们有完全不同的逻辑)= 600行杂乱代码与100类+更多包装和管理它们;不要忘记添加依赖项注入。 读取600行凌乱代码=一天 100节课=一周,仍然忘记哪个课什么时候 每个人都说它易于维护,但是为什么呢?每次添加新功能时,都会添加五个带有工厂,实体,服务和值的类。我觉得这种代码的运行速度比凌乱的代码要慢得多。 假设,如果您在一个月内编写了50K LOC混乱代码,则DDD内容需要进行大量审查和更改(我都不介意在两种情况下进行测试)。一个简单的添加可能需要数周,甚至更多。 一年之内,您编写了很多混乱的代码,甚至可以多次重写它,但是使用DDD样式,您仍然没有足够的功能来与混乱的代码竞争。 请解释。为什么我们需要这种DDD样式和许多模式? UPD 1:我收到了很多不错的答案,请大家在某处添加评论或使用阅读列表的链接编辑您的答案(不确定从哪开始,DDD,设计模式,UML,代码完成,重构,实用性等。) ..那么多好书),当然还有顺序,这样我就可以像你们中的一些人一样开始理解并成为高级。

9
聚合与构成
我了解OOP中的组合是什么,但是我无法清楚地知道什么是聚合。有人可以解释吗?

9
为什么认为Mercurial比Git容易?
在进行比较时,在我看来,它们的功能集之间可能存在1:1的映射。然而,经常被引用的说法是“ Mercurial更容易”。该声明的依据是什么?(如果有)
204 git  mercurial 

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.