软件工程

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

10
为什么Today()是不纯函数的示例?
看起来,当阅读类似于Wikipedia的有关“纯函数”的文章时,它们被Today()列为不纯函数的示例,但对我来说似乎很纯净。是否因为没有正式的输入参数?为什么在一天中的实际时间不被视为“函数的输入”,在这种情况下,如果您给它相同的输入,即一次执行today()两次,或者又返回原点以再次执行它(可能是一个假设: )),输出将是同一时间。Today()永远不会给您一个随机数。它总是给您一天中的时间。 维基百科的文章说“不同的时间会产生不同的结果”,但这就像说不同x sin(x)会给您带来不同的比率。并且sin(x)是他们纯函数的例子。

9
编程中的内存管理是否已成为无关紧要的问题?
背景信息 我重新访问了一个我很久没去过的古老(但很棒)的网站-Alioth Language Shootout(http://benchmarksgame.alioth.debian.org/)。 几年前,我开始使用C / C ++进行编程,但是由于参与的项目中的语言限制,从那时起,我几乎一直只在Java中工作。我不记得这些数字,而是想大致了解一下Java的状况。在资源使用方面与C / C ++背道而驰。 该执行时间仍然比较好,与Java在表现最差的4倍比C / C ++慢,但平均约(或以下)2倍。由于Java本身实现的性质,这不足为奇,并且它的性能时间实际上比我预期的要短。 真正的难题是内存分配 -最糟糕的是,Java分配了: 内存比C高52倍 比C ++高25倍。 52倍的内存...绝对令人讨厌,对吗?...还是?内存现在相对便宜。 问题: 如果我们不是在对工作内存(即嵌入式系统等)有严格限制的目标平台上说话,那么今天选择通用语言时是否应该考虑内存使用情况? 我之所以提出这样的要求,部分原因是因为我正在考虑迁移到Scala作为我的主要语言。我非常喜欢它的功能方面,但是从内存上看,它比Java还要昂贵。但是,由于内存似乎正在以每年更快,更便宜和更丰富的方式(似乎越来越难找到没有至少4GB DDR3 RAM的家用笔记本电脑),因此可以不争辩说资源管理正在变得越来越多与(可能需要昂贵的实现方式)高级语言功能无关,后者可以更快地构建更具可读性的解决方案?

6
如果我是唯一的开发人员,是否有在自己的仓库上使用拉取请求的目的?
因此,我从GitHub上的我的一个真实项目开始,进展顺利,想法的流动速度比我最初想象的要快得多。为了使事情井井有条,我设置了一些分支,以便可以分别开发不同的功能。 现在,当我将分支推送到GitHub时,在该部分中有两个按钮:Pull Request以及Compare最近推送到的分支的名称。我知道Compare按钮的用途,但是我不明白为什么要在自己的仓库中创建拉取请求。 有人可以解释一下我为什么要这么做吗?如果我是唯一的开发人员,则在我自己的仓库中发出拉取请求是否有用?
38 github  workflows 

10
FizzBu​​zz的有效性及超越[关闭]
作为面试过程的一部分,如今,我们最初要求求职者进行“ FizzBu​​zz”,如今,能够正确回答FizzBu​​zz的求职者比例已急剧增加-这可能是由于其在网络上的流行。 大约一年前,作为第二个问题,我们开始提出一个与原始FizzBu​​zz非常相似的问题。该问题的设计与原始的FizzBu​​zz一样简单,还可以评估候选人的特殊能力,特别是以有意义和合乎逻辑的方式对一组“业务规则”进行排序和优先排序的能力。任意顺序。该问题的措词最初似乎有点含糊,这可能使非英语母语者难以理解,但如果可以通过认真思考解决问题-这也使应聘者有机会提出问题进行澄清,这始终是一件好事。 我们发现作为开发人员,这是一项非常重要的技能,因为软件开发通常基于功能要求,这些功能要求随时间推移没有特定的顺序,这可能会在没有明确指示的情况下对软件的其他区域施加约束和条件,并且精明的开发人员的工作至少是要调查与实施有关的潜在问题和冲突。 我们发现,通过FizzBu​​zz的应试者中有略超过65%(样本大小为38)完全失败了FizzBu​​zz v2.0,通常情况下,稍后会检测到这些应试者,但这似乎是一种很好的检测方法他们早。 我的问题不是关于FizzBu​​zz是否过时的问题,而是有关导致FizzBu​​zz v2问题失败的大量候选人的因素是什么。 这个问题太含糊吗? 面试环境的压力会降低批判性思考的能力,以至于无法完成如此琐碎的任务? 题: 用您喜欢的编程语言编写一个例程,该例程将字符串列表作为输入,并且对于列表中的每个字符串将执行以下操作之一: 如果字符串包含字母A,则仅打印Fizz 如果字符串包含字母B,则仅打印Buzz 如果字符串同时包含A和B,则仅打印BuzzBuzz 如果字符串不同时包含A和B,则仅打印FizzFizz 如果字符串仅包含一个A和仅一个B,则仅打印FizzBu​​zz 候选人提出的一些典型问题是: 应该区分大小写吗? “包含A和B”是否意味着A应该先于B 如果没有达到所有要求,应该打印什么? 如果可以满足多个条件怎么办? 我们发现,绝大多数成功完成问题的候选人根本不问任何问题,就像FizzBu​​zz一样。
38 skills 

5
为什么没有针对Windows / Mac / Linux的本地Java解释器?
在我看来,将Javascript用于一般的服务器端脚本编写任务非常有用,因为它具有与Perl和Python差不多的功能。但是AFAIK没有用于主要机器体系结构的通用Java解释器。我想另一个问题可能是缺少库,但是如果有口译员在场,这些库肯定会出现。Google的V8可能是一个起点。有人认为我们会很快看到吗?
38 javascript 

7
作为独立的初级开发人员,我如何审查自己的进度[关闭]
我目前在一家2人公司工作,担任主要开发人员。我的老板得到了客户,模拟了一些png设计模板并将其交给我。 这个系统运行良好,我真的很喜欢它。 我从事的项目类型是针对中小型企业的,他们通常需要CMS系统。从头开始开发,我将为客户构建定制的后端,以添加/编辑/删除类别,标签,产品等,然后根据交给我的设计模板将它们输出到前端。随着时间的流逝,项目变得越来越复杂,具有购物车/订购功能和其他常见的电子商务类型功能。 同样,该系统运行良好,我真的很喜欢它。 我的问题是我作为程序员的个人发展。我有很多业余时间阅读编程博客,通过stackexchange进行检查,阅读建议的编程书籍(目前为止在“ The Pragmatic Programmer ”上,到目前为止还算不错),进行脑部锻炼(lumosity.com和khanacademy数学问题),做了很多工作。体育锻炼和其他个人发展型活动。 但我不禁感到,我在反馈,评论方面漏了一点。我的老板很棒,从来没有对我的工作赞不绝口,但是不幸的是他要么忙于检查我的代码,要么说实话,我不认为这是他的专业之一,因此无法提供反馈。 我想知道我在做错什么,在做正确的事情。我是否应该在控制器中添加这么多的逻辑,是否对代码进行足够的调制等? 因此,我所做的就是开发了一个小型的“家庭预算”应用程序,并尝试按照我目前所知道的那样干净有效地进行操作。 我想知道的是,我可以在哪里提交此应用程序,并请一些经验丰富的开发人员提供反馈。这不仅是我的代码的一个子部分,如“ codereview.stackexchange”似乎需要,而且我的整个工作流程都需要批评。 我知道这是一个要问的问题,我希望给出的主要建议是在团队中寻找工作,这当然是我以后将要研究的内容,但是现在我想坚持我的当前做法。就业情况,但只是不想养成太多的坏习惯。 让我知道是否可以提供进一步的信息以帮助澄清,或者如果这不是我事先表示歉意的合适位置。不想使用reddit,因为我觉得这个社区培养了更多经过深思熟虑的回应。

12
C / C ++的可编译现代替代方案
我正在考虑编写新的软件产品。性能将是至关重要的,因此我对使用一种解释性语言或使用仿真层的语言(阅读Java)保持警惕。 这使我想到了使用C(或C ++)的想法,但是它们都相当长。我很久没用了。我认为在过去的20年中,有人可能创建了相当流行的东西,可以很好地编码和编译。 有什么比C更现代的替代方法来编写高性能的已编译代码? 如果说C ++与15年前是不同的野兽,我会考虑一下,我想我假设它有一些固有的问题。 并行化很重要,但可能不会跨多台计算机。

5
密码或对象?
在提供用于获取域实体的业务逻辑方法时,该参数应接受对象还是ID?例如,我们应该这样做: public Foo GetItem(int id) {} 或这个: public Foo GetItem(Foo foo) {} 我相信整个传递对象,但是在这种情况下,我们得到一个对象,而我们只知道ID,该怎么办?调用方应该创建一个空的Foo并设置ID,还是应该将ID传递给方法?由于传入的Foo除了ID以外都是空的,因此我看不到调用方必须创建Foo并设置ID的好处,因为它可以将ID发送给GetItem()方法。

2
您应该从库代码登录吗?
如果我正在开发Java库,那么从库代码中发出日志语句是否是一种好习惯? 在库中记录日志将使调试和故障排除更加透明。但是,另一方面,我不喜欢用日志记录语句乱扔我的库代码。是否还有任何性能影响需要考虑?
38 java  logging 

4
Java 1.0的“核心” API包是什么?
在阅读有关Google v Oracle案的信息时,我遇到了这些问题(显然是从主持审判的法官那里获得的) ... 是否同意至少在1996年时以下情况成立? 以下是Java应用程序编程接口的核心:java.lang,java.util和java.io。 Java编程语言是否引用或要求上述三个之外的任何方法,类或包? ... 资料来源:Groklaw 显然有很多法律后果,Google和Oracle在某些方面可能不同意,我不在乎。将法律交给律师。 但是,我怀疑这里有一段有趣的历史。 我的问题是(谁的人第一次做任何Java编码2001年在1.3版本左右),在Java的1.0版本是什么,需要外java.lang,java.util和java.io编译一个有效的Java程序? 作为一个示例(使用C#5.0),await关键字依赖于(除其他外)。没有该类,编译器将无法正常运行。Task<T> GetAwaiter() 同样,是否有依赖于其他软件包的核心运行时功能(例如ClassLoader *)? 我会出于好奇而问,对于最低限度可行的Java(该语言,忽略其周围的所有合法内容)到底需要什么是很有意思的。 *我假设ClassLoader甚至是Java 1.0中的功能,它是7.0中规范的一部分,并且可能是许多早期版本。
38 java  history 

4
公共常量是否“不好”?
这是: public MyClass { public const string SomeString = "SomeValue"; } 比这更糟: public MyClass { public static string SomeString { get{ return "SomeValue";}} } 两者可以用相同的方式引用: if (someString == MyClass.SomeString) ... 但是,第二个保护是作为财产的。但是,这真的比const好多少? 我已经学到了遍及公共领域的危险。因此,当我看到一些在公共字段上使用这些常量的代码时,我立即着手将其重构为属性。但是到了一半,我想知道拥有静态属性而不是常量有什么好处。 有任何想法吗?
38 c# 

4
我们应该在哪里验证领域模型
我仍在寻找域模型验证的最佳实践。将验证放入域模型的构造函数中好吗?我的域模型验证示例如下: public class Order { private readonly List<OrderLine> _lineItems; public virtual Customer Customer { get; private set; } public virtual DateTime OrderDate { get; private set; } public virtual decimal OrderTotal { get; private set; } public Order (Customer customer) { if (customer == null) throw new ArgumentException("Customer name must …

3
将昨天的技术债务归咎于今天的弊病
我目前不最初编写的应用程序上出现了数量惊人的质量,可伸缩性和负载问题。值得庆幸的是,我有一些从头开始做的新项目,以保持我的理智。 最初的团队由20名开发人员(其中大多数人具有过时的技能)组成,没有业务需求文档或质量保证测试人员,并且从一开始就以瀑布式的方式管理不善。生产的早期是一个令人尴尬的噩梦,涉及用更脆弱的修补程序修补脆弱的过程式代码。后来又添加了一些功能,这些功能被大刀阔斧地打入了一个从来都不打算支持它们的数据模型中,看到相同的代码重复十次并且看到资源没有被安全关闭,并且ORM查询只获取了成千上万个实体,这并不少见。扔掉几乎所有的东西。 只是我现在,每当出现一个新问题时,我都会改写模块以达到更好的标准,并使模块更加稳定,但是管理层需要对所有这些原因的发生做出适当的解释。 他们对这种应用程序质量差且技术债务沉迷的想法感到震惊和困惑。幸运的是,他们理解技术债务的概念并在我寻求消除技术债务的过程中为我提供了支持,他们对我非常支持和赞赏,但我觉得我似乎一直在指责原始团队(他们全都在另一个项目中毁了另一个项目)师)。 最重要的是,我不想成为“那个家伙”,他总是抱怨在他之前的项目开发人员。我以前在我的职业人士中已经看到过这种态度,我个人认为他们是无知的,没有考虑到鼓励事物成为现状的环境和设计影响。 通常,我会以这种态度将以前的团队归咎于理想化的初级开发人员的设计和实施不力,这些理想的初级开发人员没有更多高级成员所拥有并受益的生活经验。 您是否觉得有一种更好的方法,也许更柔和的方法可以向管理人员报告这类问题,而又不会在您之前提高人员/团队的声誉?
38 management 

4
为什么要接住捕捉,必须使用方括号?
您可以使用多种语言(至少需要Java,也可以考虑使用C#吗?) if( condition ) singleStatement; while( condition ) singleStatement; for( var; condition; increment ) singleStatement; 因此,当我只有一条语句时,不需要使用添加新的作用域{ }。为什么我不能通过try-catch做到这一点? try singleStatement; catch(Exception e) singleStatement; 关于try-catch是否有一些特别之处,需要始终拥有新的作用域或其他内容?如果是这样,编译器无法解决该问题吗?


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.