软件工程

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

3
为什么在新代码中几乎不使用C ++ 17的[[nodiscard]]是什么原因?
C ++ 17引入了该[[nodiscard]]属性,该属性允许程序员以一种方式标记函数,如果返回的对象被调用者丢弃,则编译器将生成警告。可以将相同的属性添加到整个类类型。 我已经在最初的提案中了解了使用此功能的动机,并且我知道C ++ 20会将属性添加到类似的标准函数中std::vector::empty,其名称并未传达关于返回值的明确含义。 这是一个很酷的实用功能。实际上,这似乎太有用了。在我所读过的所有地方[[nodiscard]],人们都在讨论它,就好像您只是将其添加到少数几个函数或类型中而忽略了其余的函数或类型一样。但是,为什么不可丢弃的值应该是特例,尤其是在编写新代码时?丢弃的返回值通常不是bug还是至少浪费资源? C ++本身的设计原则之一不是编译器应该捕获尽可能多的错误吗? 如果是这样,那么为什么不将[[nodiscard]]您自己的非传统代码添加到几乎每个单个非void函数和几乎每个单个类类型中呢? 我已经尝试过用自己的代码来做到这一点,并且它工作得很好,除了它非常冗长,以至于开始看起来像Java。使编译器默认警告丢弃的返回值 似乎更自然,除非您标记意图[*]的其他少数情况。 在标准提案,博客条目,Stack Overflow问题或互联网上的其他任何地方,我对这种可能性的讨论都为零,我一定会错过一些东西。 为什么这样的机制在新的C ++代码中没有意义?冗长是不是[[nodiscard]]几乎无处不在的唯一理由吗? [*]从理论上讲,您可能拥有类似[[maydiscard]]属性的内容,也可以将其追溯地添加到printf标准库实现中的功能中。
70 c++ 


9
您如何在没有接受标准的情况下开发软件?
在没有接受标准的情况下,您如何在4-5个开发人员的团队中协作开发软件,而又不知道测试人员将针对哪些产品进行测试以及与多(2-3)个人充当产品所有者。 我们所拥有的只是一个粗略的“规范”,其中包含一些屏幕截图和一些要点。 我们被告知,这很容易,因此不需要这些东西。 我对如何进行一无所知。 附加信息 我们有一个艰难的截止日期。 客户是内部人员,理论上我们有产品所有者,但是至少有3个人测试该软件可能会使工作项失败,原因仅在于该工作项无法按他们认为的工作方式工作,并且对他们的预期或期望几乎没有透明度他们一直在测试直到失败为止。 产品负责人无法随时回答问题或提供反馈。没有定期安排的会议或与之通话,反馈可能需要几天的时间。 我可以理解,我们不能有一个完美的规范,但是我认为对于每个sprint中实际进行的工作都具有接受标准是“正常的”。

7
这是汇编语言吗?
在我的童年时代,我曾使用MK-61 苏联计算器编程。它具有四个操作寄存器(X,Y,Z,T)和15个存储寄存器。一个程序可以有105个步骤。 我记得它有以下命令: 交换X和Y寄存器 移位寄存器(Z到T,Y到Z,X到Y) 从存储寄存器(1..15)复制到X 从X复制到存储寄存器(1..15) 如果X <0,则转到程序步骤## 使用X和Y值执行运算(+,-,*,/)并将结果放入X 该命令设置了汇编语言吗?使用此设备是否对汇编语言有基本了解? 事实证明,这就是所谓的“按键编程”。 有趣的事实:1988年,类似的计算器(像这样的计算器,但具有与能量无关的内存)被用作太空任务轨迹计算的备用硬件。:-)

17
在诊断和修复缺陷之前坚持重现每个缺陷是否合理?
我在一家软件产品公司工作。我们拥有实施我们产品的大型企业客户,我们为他们提供支持。例如,如果有缺陷,我们会提供补丁等。换句话说,这是一个非常典型的设置。 最近,针对客户在日志文件中发现的与我方产品的集群实现中的并发数据库访问有关的异常,已发出并分配了票证给我。因此,此客户的特定配置对于此错误的发生可能很关键。我们从客户那里得到的只是他们的日志文件。 我向我的团队建议的方法是尝试在类似于客户的配置设置中重现该错误并获得可比的日志。但是,他们不同意我的方法,即我不需要重现该错误,因为该错误过于耗时,并且需要在VM上模拟服务器集群。我的团队建议我只是“遵循代码”以查看线程和/或事务不安全代码的位置,然后将更改放入简单的本地开发工作中,而不是像发生事件的环境那样的集群实现错误的来源。 对我来说,要制定一个抽象的蓝图(程序代码)而不是一个有形的,可见的表现形式(运行时再现)似乎很困难,所以我想问一个普遍的问题: 在诊断和修复缺陷之前坚持重现每个缺陷并对其进行调试是否合理? 要么: 如果我是高级开发人员,我是否应该能够阅读多线程代码并对其在所有用例场景中的工作情况有一个清晰的了解,而不是需要运行应用程序,亲自测试不同的用例场景并逐步完成代码一行一行?还是我对这种工作环境的要求很差? 调试sissies吗? 我认为,响应事故单提交的任何修复程序都应在模拟的环境中进行测试,该环境应尽可能接近原始环境。您还怎么知道它将真正解决该问题?这就像发布一款新车型时一样,没有用假人对它进行碰撞测试即可证明安全气囊确实有效。 最后但并非最不重要的一点,如果您同意我的看法: 我应该如何与我的团队交谈,以说服他们我的方法是合理,保守和防弹的?

7
乔尔测试的等效性,用于评估程序员
我知道要衡量项目或代码,我们可以使用Joel测试,但是是否有任何简单的标准测试(例如Joel测试)能够衡量和过滤程序员的水平? 我的计划是在进行更详细的测试之前,首先将该测试作为快速筛选。
70 interview 


9
第一批编译器是如何制作的?
我总是对此感到疑惑,也许我需要一门关于编程语言的良好历史课程。但是,由于当今大多数编译器都是用C编写的,那么最早的编译器是如何编写的(在C之前是AKA),或者是所有语言都只是被解释了? 话虽这么说,我还是什至不了解第一种汇编语言是如何完成的,我理解什么是汇编语言,但是我看不到他们如何使非常第一的汇编语言起作用(例如,他们是如何使第一命令(如mov R21)或w / e设置为等效的二进制代码?

16
有什么正确的方法告诉管理层我们的代码很烂?
我们的代码是错误的。它可能并不总是被认为是坏的,但它是坏的,而且只会走下坡路。我不到一年前刚从大学毕业,我们代码中的许多内容使我感到难以置信。最初,我认为作为一个新手,我应该闭嘴,直到我对我们的代码库有所了解为止,但是我已经看到很多知道它不好的地方。 一些亮点: 我们仍然使用框架(尝试从查询字符串中获取内容,几乎是不可能的) VB脚本 源安全 我们“使用” .NET-意思是说,我们有.net包装器,它们调用COM DLL,几乎不可能轻松调试 一切基本上都是一项巨大的功能 代码不可维护。每个页面都有多个文件,每次创建新页面时都会创建这些文件。基本上,主页做了很多次Response.Write()来呈现HTML(无法运行runat =“ server”?)。之后,客户端(VBScript)上可能会有很多逻辑,最后页面提交给自己(通常将很多东西存储在隐藏字段中),然后在页面上发布到处理页面,该页面可以执行诸如保存数据到数据库。 我们得到的规格是可笑的。通常,他们会要求诸如“使用字段Y或字段Z自动填充字段X”之类的内容,却没有指示何时选择字段Y或字段Z。 我确信其中部分原因是没有在软件公司工作,但我觉得编写软件的人们至少应该在乎其代码的质量。我什至无法想象,如果我提出一些建议,那么很快就会发生任何事情,因为迫在眉睫的最后期限迫在眉睫,但是我们将继续编写不良代码并使用不良做法。 我能做什么?我什至如何提出这些问题?我的团队中有75%同意我的观点,并且过去曾提出过这些问题,但没有任何改变。

10
非OOP设计模式?[关闭]
我只听说过“设计模式”一词用于面向对象的代码,而GoF模式仅包括OOP设计模式,但是设​​计模式是解决常见编程问题的绝佳解决方案,对吗?那里没有什么说他们必须限于OOP,是吗? 我想看到一些面向对象编程领域之外的设计模式示例。你有什么?甚至存在吗(没有一本书籍,像GoF书籍一样,必须一定要写出来,才应该使用;就足够了​​)? 它们可能特定于某些编程语言,但是一般的(范例级别)模式是首选的,而其他模式则不是面向对象的。

19
除了它的预定用途以外,是否有任何一种语言因其流行而广受欢迎?
采取这种情况: 程序员创建一种语言来解决某些问题。 然后,他发布了这种语言,以帮助其他人解决类似的问题。 另一个程序员发现,对于某些不同类别的问题,它实际上要好得多。 借助于此新应用程序,该语言随后主要在该应用程序中流行。 是否真的有这种情况发生? 换句话说,语言的预期目的是否与语言的实际使用方式或语言是否流行有关?语言具有广告目的甚至重要吗?

7
什么时候在C#中使用抽象类代替具有扩展方法的接口?
“抽象类”和“接口”是相似的概念,其中接口是两者中比较抽象的。一个区别因素是抽象类在需要时为派生类提供方法实现。但是,在C#中,最近引入的扩展方法已减小了这种差异因素,该扩展方法使得可以为接口方法提供实现。另一个区别因素是,一个类只能继承一个抽象类(即没有多重继承),但可以实现多个接口。这使接口的限制更少,更加灵活。因此,在C#中,什么时候应该使用抽象类而不是具有扩展方法的接口? 接口+扩展方法模型的一个著名示例是LINQ,其中为IEnumerable通过多种扩展方法实现的任何类型提供了查询功能。

22
命名约定:camelCase与underscore_case?您对此有何想法?[关闭]
我已经使用了underscore_case大约2年了,由于新工作,我最近改用了camelCase(后来使用了大约2个月,后来我仍然认为underscore_case更适合涉及大量程序员的大型项目,主要是因为代码更易于阅读)。 现在,每个人都使用camelCase,因为(他们说)代码看起来更优雅。 您对camelCase或underscore_case的看法 ps请原谅我的英语不好 编辑 首先更新: 使用的平台是PHP(但是我不希望得到与PHP平台相关的严格答案,任何人都可以分享他们的想法,最好使用它,这就是为什么我首先来到这里) 我和团队中的其他人一样使用camelCase(就像你们大多数人一样推荐) 我们使用Zend Framework,它也推荐camelCase 一些示例(与PHP相关): Codeigniter框架建议使用underscore_case,说实话,代码更易于阅读。 ZF推荐了camelCase,但我并不是唯一一个认为ZF代码更难理解的人。 所以我的问题改写为: 让我们以您拥有一个不推荐任何命名约定的Foo平台为例,这是团队领导者选择一个的惯例。您是那个团队的负责人,为什么要选择camelCase或为什么选择underscore_case? ps谢谢大家到目前为止的迅速回答
70 naming 

26
人们如何阅读大型技术书籍?[关闭]
我看到大多数优秀的程序员都有阅读大型书籍来学习技术的习惯。 除了对技术的真正兴趣之外,阅读技术书籍还真正需要什么? 如何提高阅读这些书的能力?
70 learning 

5
为什么要在模型中加入业务逻辑?当我有多种类型的存储时会怎样?
我一直认为业务逻辑必须在控制器中,并且控制器(因为它是“中间”部分)保持静态,并且模型/视图必须通过接口进行封装。这样,您可以在不影响任何其他因素的情况下更改业务逻辑,对多个模型(每个数据库/存储类型一个)进行编程,并为多个视图(例如针对不同的平台)编程。 现在,我在这个问题中读到,您应该始终将业务逻辑放入模型中,并且控制器与视图紧密相连。 对我来说,这没有任何意义,它意味着每次我想拥有一种支持另一种数据库/存储类型的方法时,都必须重写包括业务逻辑在内的整个模型。 如果我想要另一个视图,则必须重写视图和控制器。 有人可以解释为什么会这样,还是我在某个地方出错了?

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.