软件工程

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

11
异步与同步的含义[关闭]
在计算机科学中,异步和同步一词的含义是什么? 如果您用谷歌搜索单词的含义,您将获得以下信息: 异步:不存在或不在同一时间发生。 同步:同时存在或同时发生。 但是似乎它们被用来传达编程或计算机科学中相反的含义: HTML异步属性表示即使HTML仍在解析或下载,脚本也将在下载后立即执行,这意味着脚本和HTML都同时存在并同时发生。 这些术语是用来传达计算机科学中相反的意思的吗?

4
随着团队的成长,如何在整个应用程序体系结构中保持一致性?
作为一家创业公司的唯一开发人员,我能够在我们的应用程序的体系结构和框架中做出很多决定。 快进4年,后来又进行了收购,我有一支5人的团队,很多时候感觉就像是荒野的西部。做出任何设计决定的人都会喜欢它们:在一个地方将DB类型的整数和枚举放在一个地方,在另一个地方使用字符串,此问题的框架,然后在其他地方针对同一问题的不同框架,等等。 如何执行一致性?对我来说,这很重要,但是我的团队成员似乎赞成“如果有效,那么有效”的方法。 我想我的问题很大一部分是:期望这样的标准对我来说是不现实的吗?我遇到这样一个想法:作为扼杀创造力的独裁者,但是做他们想做的事情似乎是不可扩展的。

3
为什么我们仍然向后增加堆栈?
编译C代码并查看汇编时,所有的堆栈都像这样向后生长: _main: pushq %rbp movl $5, -4(%rbp) popq %rbp ret -4(%rbp)-这是否意味着基本指针或堆栈指针实际上是向下移动内存地址而不是向上移动?这是为什么? 我换$5, -4(%rbp)到$5, +4(%rbp),编译和运行代码并没有任何错误。那么,为什么我们还必须在内存堆栈上倒退呢?
46 c  memory  assembly 

6
检查`c> ='0'`或`c> = 48`更好吗?
与我的一些同事讨论之后,我遇到了一个“哲学上的”问题,即如何按照最佳实践来对待Java中的char数据类型。 假设有一个简单的场景(显然,这只是一个非常简单的示例,目的是为我的问题赋予实践意义),在给定String's'作为输入的情况下,您必须计算其中存在的数字字符的数量。 这些是2种可能的解决方案: 1) for(int i=0; i<s.length(); i++) { if(s.charAt(i) >= 48 && s.charAt(i) <= 57) { n++; } } 2) for(int i=0; i<s.length(); i++) { if(s.charAt(i) >= '0' && s.charAt(i) <= '9' ) { n++; } } 两者中哪一个更“干净”并符合Java最佳实践?

7
为什么调用堆栈具有静态的最大大小?
使用过几种编程语言后,我一直想知道为什么线程堆栈具有预定义的最大大小,而不是根据需要自动扩展。 相比之下,在大多数编程语言中发现的某些非常常见的高级结构(列表,地图等)被设计为在添加新元素时根据需要增长,其大小仅受可用内存或计算限制的限制(例如32位寻址)。 我不知道任何编程语言或运行时环境,其中最大堆栈大小不受某些默认或编译器选项的限制。这就是为什么太多递归会很快导致普遍存在的堆栈溢出错误/异常的原因,即使仅将进程可用内存的最小百分比用于堆栈。 为什么大多数(如果不是全部)运行时环境为堆栈在运行时可以增长的大小设置了最大限制?
46 stack 

7
数据库约束发生了什么?
当我查看RDBMS的数据库模型时,通常会惊讶地发现几乎没有约束(除了PK / FK)。例如,百分比通常存储在类型的列中int(虽然tinyint会更合适),并且没有CHECK约束将值限制为0..100范围。同样在SE.SE上,建议检查约束的答案通常会收到注释,表明数据库是约束的错误位置。 当我询问不实施约束的决定时,团队成员会回答: 他们甚至都不知道自己喜欢的数据库中是否存在这样的功能。对于仅使用ORM的程序员而言,这是可以理解的,但是对于声称拥有给定RDBMS 5年以上经验的DBA而言,这是可以理解的。 或者它们在应用程序级别强制执行此类约束,并且在数据库中复制这些规则不是一个好主意,这违反了SSOT。 最近,我看到越来越多的项目甚至不使用外键。同样,我在SE.SE上看到了一些评论,这些评论表明用户不太在意引用完整性,让应用程序来处理它。 当询问团队有关不使用FK的选择时,他们说: 例如,当必须删除其他表中引用的元素时,它就是PITA。 NoSQL坚如磐石,那里没有外键。因此,我们在RDBMS中不需要它们。 就性能而言,这并不是什么大问题(上下文通常是在小型数据集上运行的小型Intranet Web应用程序,因此,实际上,即使索引也没有太大关系;没有人会介意给定查询的性能是否超过1.5 s到20毫秒)。 当我查看应用程序本身时,我系统地注意到了两种模式: 该应用程序会正确清理数据并在将其发送到数据库之前对其进行检查。例如,无法102通过应用程序将值存储为百分比。 该应用程序假定来自数据库的所有数据都是完全有效的。就是说,如果102以百分比来表示,某处某处将崩溃,或者仅将其按原样显示给用户,从而导致奇怪的情况。 尽管超过99%的查询是由单个应用程序完成的,但随着时间的流逝,脚本开始出现-要么在需要时手动运行脚本,要么执行cron作业。还可以手动对数据库本身执行某些数据操作。脚本和手动SQL查询都具有引入无效值的高风险。 这是我的问题: 没有关系约束而最终甚至没有外键的关系数据库建模的原因是什么? 就其价值而言,这个问题和我收到的答案(尤其是与Thomas Kilian进行的有趣的讨论)使我写了一篇有关数据库约束的结论文章。

7
为什么链式装订工非常规?
在bean上实现链接非常方便:无需重载构造函数,大型构造函数,工厂,并提高了可读性。我想不出任何弊端,除非您希望对象是不可变的,在这种情况下,它就不会有任何设置方法。那么,这不是OOP约定的原因吗? public class DTO { private String foo; private String bar; public String getFoo() { return foo; } public String getBar() { return bar; } public DTO setFoo(String foo) { this.foo = foo; return this; } public DTO setBar(String bar) { this.bar = bar; return this; } } //...// DTO …


4
NoSQL有什么开创性的东西吗?[关闭]
我是一个非常扎实的关系数据库专家,并且一路了解第3种范式,欣赏SQL的代数集理论根源,并且可能使(或不与)一颗破碎的心联系起来。 我还没有找到与妻子约会之夜的关系数据库结构,但是我想过与妻子约会之夜的关系数据库项目。 现在,我听到有关NoSQL并对其进行研究。顺其自然,NoSQL是否具有开创性,在数学上是新颖的,还是“嘿,您甚至根本不需要关联地组织数据,这要容易得多”吗? NoSQL是否像数据结构的超级外壳?在我看来,数据最终必须具有要检索的结构,并且检索必须以某种语言来定义。
46 nosql 

6
用有意义的类名屏蔽Java集合的好坏方法?
最近,我习惯于用人类友好的类名“掩盖” Java集合。一些简单的例子: // Facade class that makes code more readable and understandable. public class WidgetCache extends Map<String, Widget> { } 要么: // If you saw a ArrayList<ArrayList<?>> being passed around in the code, would you // run away screaming, or would you actually understand what it is and what // …

7
如何衡量重构的潜在价值
在具有技术债务的旧的大型项目中,如何可靠地估算或衡量重构代码的收益? 例如,假设您在软件堆栈解决方案中有一些组件是用较旧的语言编写的,而某些较后的组件是用较新的语言编写的。开发团队将不断向该解决方案添加新功能和错误修复。 开发人员建议用新版本替换现有的旧语言组件将是“一件好事”。但是,这项工作不会增加任何额外的功能,这将花费x开发日。 销售人员建议添加“一项很棒的新功能”。公司通过使用公式来衡量他的建议的价值。即。它将在t年内以x开发日的工作成本为公司赚取F百万英镑。 公司如何以有意义的方式增加重构建议的成本?在什么情况下,这可能是公司最赚钱的选择?

3
为什么贫血领域模型在C#/ OOP中被认为是不好的,而在F#/ FP中却非常重要?
在关于F#的博客文章中,它表示乐趣和收益,它表示: 在功能设计中,将行为与数据分开非常重要。数据类型是简单且“哑”的。然后分别有许多作用于这些数据类型的函数。 这与面向对象的设计正好相反,在面向对象的设计中,行为和数据必须结合在一起。毕竟,这正是一个类。实际上,在真正的面向对象设计中,除了行为外,您应该什么都没有-数据是私有的,只能通过方法访问。 实际上,在OOD中,围绕数据类型的行为不足被认为是一件坏事,甚至有一个名字:“ 贫血领域模型 ”。 鉴于在C#中,我们似乎继续从F#借用,并尝试编写更多的函数式代码;为什么我们不借用分离数据/行为的想法,甚至认为它不好呢?仅仅是因为该定义不与OOP一起使用,还是有一个具体的原因在C#中是不好的,由于某些原因在F#中不适用(实际上是相反的)? (注意:我对C#/ F#中的差异特别感兴趣,因为它们可能会改变对优劣的看法,而不是对博客文章中的任一种看法持不同意见的人)。

2
REST API应该如何处理对部分可修改资源的PUT请求?
假设REST API响应HTTP GET请求,在子对象中返回一些其他数据owner: { id: 'xyz', ... some other data ... owner: { name: 'Jo Bloggs', role: 'Programmer' } } 显然,我们不希望任何人能够PUT支持 { id: 'xyz', ... some other data ... owner: { name: 'Jo Bloggs', role: 'CEO' } } 并取得成功。的确,在这种情况下,我们甚至可能不会采取任何措施来实现这一目标。 但是,这个问题不仅仅涉及子对象:通常,应该对不应在PUT请求中进行修改的数据执行哪些操作? 是否应要求PUT请求中缺少它? 是否应该默默丢弃? 是否应该检查它,如果它与该属性的旧值不同,则在响应中返回HTTP错误代码? 还是我们应该使用RFC 6902 JSON补丁而不是发送整个JSON?

4
过多的抽象会不好吗?
作为程序员,我觉得我们的目标是在给定的域模型和业务逻辑上提供良好的抽象。但是这种抽象应该在哪里停止呢?如何在抽象及其所有优点(灵活性,易于更改等)以及易于理解代码及其所有优点之间进行权衡。 我相信我倾向于写过于抽象的代码,但我不知道它有多好。我经常倾向于将其编写为某种微型框架,包括两部分: 连接在微框架中的微模块:这些模块易于理解,开发和维护为单个单元。这段代码基本上代表了实际执行功能的代码,如需求所述。 连接代码;现在我相信这里是问题所在。该代码趋于复杂,因为它有时非常抽象,一开始很难理解。之所以会出现这种情况,是因为这仅仅是纯粹的抽象,实际上基础和业务逻辑是在所提供的代码1中执行的;因此,该代码一旦经过测试就不会更改。 这是编程的好方法吗?难道说,变更代码在许多模块中非常分散,并且很容易理解,而变更代码与抽象POV相比却非常复杂?如果所有代码都统一地复杂(即代码1更复杂和相互链接,而代码2更简单),以使通过它的任何人都可以在合理的时间内理解它,但是更改很昂贵,或者上述解决方案是好的, “更改代码”非常容易理解,调试,更改,“链接代码”有点困难。 注意:这与代码的可读性无关!1和2处的代码都是可读的,但2处的代码具有更复杂的抽象,而代码1则具有简单的抽象。

5
批评IO monad被视为在世界上运作的州monad
IOHaskell中的单子通常被解释为州是世界的州单子。因此,将IO amonad 类型的值视为worldState -> (a, worldState)。 前一段时间,我读了一篇文章(或博客/邮件列表帖子),该文章批评了这种观点,并提出了一些不正确的原因。但是我既不记得这篇文章,也不记得原因。有人知道吗 编辑:这篇文章似乎丢失了,所以让我们在这里开始收集各种参数。 我开始悬赏以使事情变得更有趣。 编辑:该文章中,我一直在寻找的应对尴尬的阵容:单子输入/输出,并发性,异常和外国语言的Haskell中调用由西蒙·佩顿-琼斯。(感谢TacTics的回答。)

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.