软件工程

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

4
在没有监督的情况下学习嵌入式系统开发[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我今年毕业,获得了第一份工作,涉及C编程,Linux管理和嵌入式系统开发。我对自己的工作感到很满意,但是我恐怕不会成为该领域的成功程序员。我现在是一个孤独的开发人员,我的团队成员是硬件专家,没有人可以指导我或不能以嵌入式编程的方式教我,我必须自己全部学习。 所以这是我的问题。是否可以从入门级职位开始成为高级嵌入式系统开发人员,而无需高级程序员的任何监督?我怎么能成为一个人(也许在论坛,IRC频道,好教科书的帮助下)?需要多长时间? 更新:到目前为止,我已经收到了一些有用的答案,但是我意识到我需要关于该主题的一些具体指示。 因此,这是我的特殊问题: 有哪些好的教科书可以用来学习嵌入式开发? 哪些专业的在线社区对有抱负的嵌入式开发人员会有所帮助(不计算诸如Stack Overflow,Reddit等常规内容)? 致力于嵌入式开发的最有趣的博客是什么?

5
衡量发展速度的方法
我见过很多测试来衡量编程语言的执行速度的测试,但是我从未发现过衡量开发速度的测试。 我听说使用动态语言时,开发速度有所提高,但是有什么证明吗?我并不是要说动态语言效率不高,但是我想看看科学研究的结果(如果存在的话)。 更好的是有关维护设施的信息。有些语言比其他语言更容易调试吗? 编辑:我最感兴趣的是语法紧密的两种语言之间的差异。例如,我想用C编程通常会比用Java编程慢。但是Java编程比C#编程快吗?

3
单元测试,是在框架之前还是之后编写它们?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 这是我在这里的第一个问题,因此我将简短地说明。 在编写单元测试时,应该在为它们创建基础框架之前还是之后编写它们?这是我的首席执行官和总裁之间进行的一次讨论,我希望您对此发表意见。 就个人而言,我总是先编写代码,然后编写单元测试,但是您呢?

6
编程时我需要考虑哪些法律方面的考虑?[关闭]
很难说出这里的要求。这个问题是模棱两可,含糊,不完整,过于宽泛或夸张的,不能以目前的形式合理地回答。如需帮助澄清此问题以便可以重新打开, 请访问帮助中心。 7年前关闭。 最近,我与一个小组合作创建了一个日志系统,用于对实验室进行补习,以跟踪教师的工作时间和实验室的使用情况。为了符合FERPA,我们必须对设计进行一定的更改。 我的问题源于好奇心,即在我的学习过程中,从未真正提及过该领域的人们在工作中如何应对法律的遵守。因此,我想知道程序员在工作中必须考虑多少法律。
10 legal 

4
我应该坚持要求我们在合并回主干之前执行代码审查吗?
从StackOverflow请求重新发布: 我的工作时间很短,开发时间非常有限。我们开发了一种对我们的工作成果很重要的工具,但每天都不使用。我是团队中唯一拥有程序员背景的人。 我的问题是,在合并回主干一年多之前,我一直在推动代码审查。每个人都对此表示同意,但是仍然只有我的代码被审查过。从长假回来后,我回到了代码注释的主干,因为“这是一个丑陋的解决方案-尽快删除”和“快速修复”。另一个新功能是任命了一个人负责该工具。(最初提供给我一个职位,但由于与工作无关的原因而拒绝了我。)他认为这是一种可行的工作方式:由于我们的开发时间有限,因此我们应该走捷径。 我担心的是其他开发人员编写的代码很丑陋:经常破坏封装,编写巨大的类,在陌生的地方添加内部类,几乎没有单元测试等等。最终将不可能进一步开发该工具。 我应该坚持要求我们在合并到主干之前执行代码审查,还是我只是一个代码质量卑鄙的人?

10
您见过最糟糕的技术决定是什么?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 这包括体系结构决策,平台选择或任何此类错误选择导致负面后果的情况。

5
Windows Service或Windows Task Scheduler?
我打算创建一个实用程序,该实用程序将查询数据库并存储一些信息(在数据库的另一个表中)。它是一个多线程实用程序,需要每5或10分钟/以后运行,一天可能会发生三次。 我在C#/ DotNet编程中看到两种方法可以实现此目的。 创建具有计时器方法的Windows服务。 控制台程序,并使用Windows Task Scheduler对其进行调度。 您更喜欢哪一个?为什么?
10 .net 

10
我应该如何创建lo-fi(非交互式)UI原型?
我目前正在研究一些基本的原型,一方面是收集需求,另一方面是设计最终的UI。 目前,我正在尝试使用便利贴来构建屏幕,其中黄色的提示信息和粉红色的操作(按钮或菜单)。想法是您可以轻松移动,删除和添加信息。但是我敢肯定还有更有效的方法。 为开发人员有效创建非交互式UI原型的推荐方法是什么? 又为什么呢? 我尝试了一些笔,纸和便利贴版本,它们像铅球一样掉下来(可能是我的绘画技能)。最后,我使用了Balsamiq,到目前为止,它受到大多数用户的欢迎,并且得到了它的原型。las,有些人仍然对第一个应该通过lo-fi原型了解应用程序应该做什么的想法有疑问,他们真的想在承诺任何事情之前先“看屏幕上的东西”。

4
为什么.NET世界没有Rails / grails / django / roo之类的东西?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 在我看来,快速发展的Web平台将彻底改变Web应用程序的世界。 自从Rails 1.0为Ruby发行以来已经五年了,自那时以来,我们已经看到Grails代表Groovy,Django代表Python和Roo代表Java。 但是据我所知(可能是有限的,作为Java / Groovy程序员),没有类似的C#框架。 这样的事情存在吗?如果没有,为什么不呢? 编辑: 当我说“快速开发”时,很可能我没有使用正确的词,但是我所谈论的框架可能可以让您在30分钟内构建一个工作的博客引擎。考虑到要找到控制器所需的各种配置,以及持久化和检索实体所需的配置和代码,您不能用Java,Spring和Hibernate合理地做到这一点。 因此,我正在谈论一种以约定优先于配置的思想处理所有CRUD的框架。如果有人对我所说的话有正确的词,请告诉我。



10
有人使用虚拟机进行Web开发吗?为什么?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 我看到一些喜欢将虚拟机用于Web开发的开发人员。还有其他人这样做吗?如果有,为什么要这样做?在VM上而不是在非虚拟化环境中进行开发是否有优点/缺点? 我认为虚拟机的运行速度较慢。

2
函数式编程如何处理从多个位置引用同一对象的情况?
我正在阅读和听到,人们(也在此站点上)经常赞美函数式编程范例,强调使所有内容保持不变是多么好的。值得注意的是,人们甚至在传统的命令式OO语言(例如C#,Java或C ++)中也提出了这种方法,不仅是在像Haskell这样的纯函数式语言中,这种语言迫使程序员这样做。 我觉得很难理解,因为我发现可变性和副作用...很方便。但是,考虑到人们当前如何谴责副作用并认为是在可能的情况下消除它们的一种好习惯,我相信如果我想成为一名合格的程序员,我必须让我的乔妮开始对这种范例有一些更好的了解...因此,我的问。 当我发现功能范式存在问题时,一个地方就是自然地从多个地方引用一个对象。让我用两个例子来描述它。 第一个例子是我打算在业余时间制作的C#游戏。这是一种基于回合制的网络游戏,其中两个玩家都有4个怪物组成的团队,并且可以将一个怪物从其团队中移到战场上,在那里它将面对对方玩家发送的怪物。玩家还可以从战场上召回怪物,并用其团队中的另一个怪物代替它们(类似于口袋妖怪)。 在这种情况下,可以从至少2个地方自然引用单个怪物:玩家的团队和战场,其中引用了两个“活动”怪物。 现在,让我们考虑一个怪物被击中并失去20点生命值时的情况。在命令式范式的括号内,我修改了此怪物的health字段以反映此更改-这就是我现在正在做的。但是,这使Monster类可变且相关的函数(方法)不纯净,我认为到目前为止,这仍被认为是一种不好的做法。 即使我允许自己以低于理想状态的方式编写游戏代码,以便希望在将来的某个时候完成游戏,但我还是想知道并理解它应该如何写得正确。因此:如果这是设计缺陷,如何解决? 就我所知,在函数式中,我将对此Monster对象进行复制,使其与旧对象相同,除了该字段。并且该方法suffer_hit将返回此新对象,而不是就地修改旧对象。然后,我同样会复制Battlefield对象,并保持其所有字段相同(除了该怪物)。 这至少有两个困难: 层次结构可以比Just- Battlefield>的简化示例更深入Monster。我必须对所有字段(除了一个字段)进行这种复制,并在此层次结构中一直返回一个新对象。这将是样板代码,我发现这很烦人,特别是因为功能编程应该减少样板代码。 但是,一个更为严重的问题是,这将导致数据不同步。野外活动的怪物的生命值会降低。但是,从其控制者那里引用的同一个怪物Team不会。如果我改用命令式风格,那么对数据的每次修改都可以在所有其他代码位置立即看到,在这种情况下,我发现它真的很方便- 但是我得到东西的方式正是人们所说的势在必行! 现在,可以通过Team每次攻击之后的旅程来解决此问题。这是额外的工作。但是,如果以后突然可以从更多地方引用怪物,该怎么办?例如,如果我具有一种能力,例如,让一个怪物专注于另一个不一定在场上的怪物(我实际上正在考虑这种能力)怎么办?我肯定会记得在每次攻击后立即进行一次聚焦怪物的旅程吗?这似乎是一个定时炸弹,随着代码变得越来越复杂,它会爆炸,所以我认为这是没有解决方案的。 当我遇到相同的问题时,从第二个示例中得出一个更好的解决方案的想法。在学术界,我们被告知要在Haskell中编写我们自己设计的语言的口译员。(这也是我被迫开始了解FP是什么的方式)。当我实现闭包时出现了问题。现在可以再次从多个位置引用同一作用域:通过保存该作用域的变量以及任何嵌套作用域的父作用域!显然,如果通过指向该范围的任何引用对该范围进行了更改,则此更改也必须通过所有其他引用可见。 我提出的解决方案是为每个范围分配一个ID,并在Statemonad中保存所有范围的中央字典。现在,变量将仅保留它们绑定到的作用域的ID,而不是作用域本身,并且嵌套作用域还将保留其父作用域的ID。 我猜想在我的怪物战斗游戏中可以尝试相同的方法。相反,它们拥有保存在中央怪物词典中的怪物ID。 但是,我再次看到这种方法存在问题,使我无法毫不犹豫地接受它作为解决问题的方法: 它再次是样板代码的来源。它使单线必然变成三线:以前对单个字段进行单行就地修改现在需要(a)从中央字典中检索对象(b)进行更改(c)保存新对象到中央字典。同样,持有对象和中央字典的id而不是拥有引用会增加复杂性。因为FP的广告是为了减少复杂性和样板代码,所以这暗示我做错了。 我还打算写一个似乎更严重的第二个问题:这种方法引入了内存泄漏。无法访问的对象通常将被垃圾回收。但是,即使没有可访问的对象都引用此特定ID,也无法对中央词典中保存的对象进行垃圾回收。尽管从理论上讲,仔细的编程可以避免内存泄漏(一旦不再需要,我们可以小心地从中央字典中手动删除每个对象),但是这很容易出错,并且FP广告宣传增加了程序的正确性,因此这可能再次不是正确的方法。 但是,我及时发现它似乎是一个已解决的问题。Java提供WeakHashMap了可用于解决此问题的方法。C#提供了类似的功能- ConditionalWeakTable尽管根据文档,它是供编译器使用的。在Haskell中,我们有System.Mem.Weak。 存储此类词典是解决此问题的正确功能解决方案,还是我看不到更简单的解决方案?我想象这样的词典的数量很容易增长,而且非常糟糕。因此,如果这些字典区域也应该是不可变的,这可能意味着很多参数传递,或者在支持该功能的语言中,表示单子计算,因为字典将以单子形式保存(但是我再次将其读为纯函数式)语言,尽可能少的代码应该是monadic,而这个字典解决方案会将几乎所有代码都放在Statemonad内;这再次使我怀疑这是否是正确的解决方案。) 经过一番考虑之后,我想我会再问一个问题:构建这样的词典能获得什么?许多专家认为,命令式编程的错误之处在于某些对象的更改会传播到其他代码段。为了解决这个问题,对象应该是不可变的-正是出于这个原因,如果我正确理解的话,对它们所做的更改应该在其他地方不可见。但是现在,我担心对过期数据进行操作的其他代码段,因此发明了中央字典,以便……将某些代码段中的更改再次传播到其他代码段中!因此,我们不是回到带有所有假定缺点的命令式样式,而是增加了复杂性吗?

3
保持秘密不受源代码控制-我们只是在解决问题吗?
我继承了一些项目,其中秘密位于App.config和类似文件的源代码控制中。幸运的是,它不是公共存储库,因此风险并不像以前那样严重。我正在寻找更好的方法来管理此问题,例如Azure KeyVault。(但我不希望这个问题专门针对该解决方案。) 总的来说,我们不只是解决问题吗?例如,使用Azure KeyVault,应用程序ID和应用程序秘密成为您不受源代码控制的事情。这是一个不幸的典型例子,说明这种情况容易出错。其他方法最终都变得相似,其中包含您必须保护的API密钥或密钥库文件。 在我看来,像Azure KeyVault这样的产品没有比将您的秘密保存在单独的配置文件中并确保它位于您的.gitignore或等效文件中更好,并且毫无意义地更复杂。该文件必须根据需要通过边信道共享。当然,人们可能会不安全地将其通过电子邮件相互发送给对方... 有没有一种方法可以管理秘密,而不仅仅是解决问题?我相信这个问题有一个明确定义的答案。以此类推,如果我要问HTTPS不仅能解决问题,答案是CA密钥随您的OS一起分发,而我们信任它们是因为我们信任OS的分发方法。(我们是否应该单独提出一个问题...)

5
是否可以以编程方式评估任意代码的安全性?
最近我一直在考虑安全代码。线程安全的。内存安全。不会在带有段故障保险柜的情况下爆炸。但是为了清楚起见,让我们使用Rust的安全模型作为我们的定义。 通常,确保安全性是网络的一个大问题,因为正如Rust的需求所证明unsafe,存在一些非常合理的编程思想(例如并发性),如果不使用关键字就无法在Rust中实现unsafe。尽管并发可以由具有锁,互斥,渠道和内存隔离或者你有什么绝对安全的,这需要工作以外的铁锈的安全模式unsafe,然后手动确保编译器,“是的,我知道我在做什么看起来不安全,但是我已经从数学上证明了它是绝对安全的。” 但这通常归结为手动为这些事物建模并通过定理证明者证明它们是安全的。从计算机科学的角度(可能)和实用性的角度(是否要占用宇宙的生命),可以想象一个程序以任意语言使用任意代码并评估它是否是“防锈”? 注意事项: 一个简单的提示就是指出程序可能正在停止,因此停止问题使我们无法正常工作。假设提供给阅读器的任何程序都可以停止 虽然“以任意语言编写任意代码”是目标,但我当然知道,这取决于程序对所选语言的熟悉程度,我们将以此为前提

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.