软件工程

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

19
杰出的程序员与真正的优秀程序员有什么区别?[关闭]
你知道他们是谁。他们是编程的摇滚明星: 他们的编码速度提高了10倍。 他们的代码可以正常工作。 他们不仅从内到外都知道他们的主要语言,而且还知道其幕后工作方式。 在您提出任何问题之前,他们都知道大多数问题的答案。 他们中的一些人发明了我们都使用的编程原理。 而且,它们也往往在特性上显得谦虚。 这些人是什么?他们的思考过程是否与普通程序员有所不同?还是他们只是非常有才能的人而努力工作? 换句话说:我怎么能像他们?我知道我认为需要学习成为一个好人,但是接下来的十年似乎将需要我来学习它,然后我的知识就会过时了。

30
您认为编程的第一原则是什么?
我一直喜欢问自己“这的首要原则是什么?” 在我学到了一些基本知识之后(例如编程)。这是一个鼓舞人心的问题,IMO,可能会迫使您考虑某些事物背后的最重要原则,尤其是诸如编程之类的技能。 那么,您认为编程的第一个原则是什么?我稍后再给出答案。

3
按类型的文件夹或按功能的文件夹
我利用了AngularJS样式指南。在本指南中,有一种称为的样式folder-by-feature,而不是folder-by-type,我很好奇什么是最佳方法(在此示例中为Java) 假设我有一个应用程序,可以在其中使用服务,控制器,存储库以及当然的域对象来检索“用户和宠物”。 以文件夹.....样式为例,对于包装结构,我们有两个选择: 1.文件夹类型 com.example ├── domain │ ├── User.java │ └── Pet.java ├── controllers │ ├── UserController.java │ └── PetController.java ├── repositories │ ├── UserRepository.java │ └── PetRepository.java ├── services │ ├── UserService.java │ └── PetService.java │ // and everything else in the project └── MyApplication.java 2.按功能文件夹 com.example ├── …

4
何时使用解析器组合器?何时使用解析器生成器?
最近,我想深入了解解析器领域,希望创建自己的编程语言。 但是,我发现存在两种不同的编写解析器的方法:解析器生成器和解析器组合器。 有趣的是,我找不到任何可以解释哪种资源更好的资源。相反,我查询的许多资源(和人员)都不知道另一种方法,只是将其方法解释为该方法,而根本没有提及另一种方法: 在著名的龙书进入词法/扫描,并提到(F)法,但都没有提到解析器组合。 语言实现模式在很大程度上依赖于Java内置的ANTLR解析器生成器,根本没有提到解析器组合器。 Parsec上的Parsec 简介教程(是Haskell中的Parser Combinator)根本没有提到Parser Generators。 Boost :: spirit(最著名的C ++解析器组合器)根本没有提到解析器生成器。 很棒的说明性博客文章“ 您可能已经发明了解析器组合器”根本没有提到解析器生成器。 简单概述: 解析器生成器 解析器生成器获取用DSL编写的文件,该文件是Extended Backus-Naur形式的某种方言,并将其转换为源代码,然后可以(在编译时)成为该DSL中描述的输入语言的解析器。 这意味着编译过程分为两个单独的步骤。有趣的是,解析器生成器本身也是编译器(其中许多确实是自托管的)。 解析器组合器 解析器组合器描述了称为解析器的简单函数,这些函数均将输入作为参数,如果匹配则尝试提取此输入的第一个字符。它们返回一个元组(result, rest_of_input),如果解析器无法解析此输入中的任何内容,则该字段result可能为空(例如nil或Nothing)。一个例子是digit解析器。其他解析器当然可以将解析器作为第一个参数(最后一个参数仍保留在输入字符串中)来组合它们:例如,many1尝试尽可能多地匹配另一个解析器(但至少要匹配一次,否则它本身会失败)。 现在,您当然可以结合(组成)digit和many1创建新的解析器,例如integer。 同样,choice可以编写一个更高级别的解析器,该解析器获取解析器列表,依次尝试每个解析器。 这样,可以构建非常复杂的词法分析器/解析器。在支持运算符重载的语言中,这看起来也很像EBNF,尽管它仍然是直接用目标语言编写的(并且您可以使用所需的目标语言的所有功能)。 简单差异 语言: 解析器生成器使用EBNF-ish DSL和这些语句匹配时应生成的代码的组合编写。 解析器组合器直接以目标语言编写。 乐兴/解析: 解析器生成器在“词法分析器”(将字符串拆分成可能被标记以表明我们正在处理的值的标记)与“解析器”(从词法分析器获取标记的输出列表)之间有非常明显的区别并尝试将它们组合起来,形成一个抽象语法树)。 解析器组合器不需要/不需要这种区别;通常,简单的解析器执行“词法分析器”的工作,而更高级别的解析器将这些更简单的解析器称为确定要创建哪种AST节点。 题 但是,即使存在这些差异(这是差异列表,可能还远远不够!),我仍无法就何时使用哪一个做出明智的选择。我看不出这些差异的含义/后果。 哪些问题属性表明使用Parser Generator可以更好地解决问题?哪些问题属性表明使用Parser Combinator可以更好地解决问题?

7
RESTFul:状态更改操作
我正计划构建RESTfull API,但是有些架构问题正在脑海中产生一些问题。我想避免向客户端添加后端业务逻辑,因为当业务逻辑可以快速更改时,很难实时维护多个客户端平台的更新。 假设我们将文章作为资源(api / article),我们应该如何实现诸如发布,取消发布,激活或停用之类的操作,但又要尽量使其简单? 1)我们是否应该使用api / article / {id} / {action},因为在那里可能会发生很多后端逻辑,例如推送到远程位置或更改多个属性。可能最难的是,我们需要将所有文章数据发送回API进行更新,并且无法实现多用户工作。例如,编辑器可以发送5秒钟的旧数据,并覆盖其他记者2秒钟前所做的修复,而我无法向客户解释这一点,因为发布文章的人实际上与更新内容没有任何关系。 2)创建新资源也可以是api / article- {action} / id选项,但返回的资源将不是article- {action},但我不确定这是否合适。同样在服务器端代码文章类中,正在处理两种资源上的实际工作,并且我不确定这是否与RESTfull思想背道而驰。 任何建议都欢迎。
59 api  rest 

12
这是C语言中goto的一个不错的用例吗?
我真的很犹豫要问这个问题,因为我不想“征求辩论,争论,民意测验或扩展讨论”,但是我是C语言的新手,并且希望对语言使用的常见模式有更多了解。 我最近听到对该goto命令有些反感,但最近也发现了一个不错的用例。 像这样的代码: error = function_that_could_fail_1(); if (!error) { error = function_that_could_fail_2(); if (!error) { error = function_that_could_fail_3(); ...to the n-th tab level! } else { // deal with error, clean up, and return error code } } else { // deal with error, clean up, and return error code …




6
为什么CPU缓存如此之快?
是什么使CPU高速缓存内存比主内存快得多?我可以看到分层缓存系统有一些好处。较小的缓存可以更快地进行搜索是有意义的。但是必须有更多的东西。
58 memory  caching 

5
什么时候在akka / erlang中使用actor不好?
我每天与akka合作7-8个月。当我开始时,我将在应用程序上工作,并注意到actor基本上会在actor系统内部的任何地方用于大多数对象之间的通信。所以我也做同样的事情-为x / y / z旋转另一个演员。 在我看来,这可能太过随意了,在不需要的地方增加了复杂性-但是我找不到关于应该使用参与者与普通同步甚至是期货的异步逻辑的讨论。我的同事提到类似的内容后,我开始思考自己的立场。我最近才意识到有几种情况,我在考虑一个任务,然后避免创建另一个参与者,因为我可以在不可变的实现中安全地实现相同的结果-例如,从数据库或文件中获取配置值的地方,而这些地方很少访问并且会等待结果是实际用例。 尤其是在我看来,在任何情况下,如果您正在使用不可变状态,参与者都会造成复杂性并限制吞吐量-例如,对象中的纯函数可以在没有任何并行级别的情况下并发调用,但是演员一次只能处理一条消息。另一个考虑因素是,如果您需要等待结果,除非您开始使用期货,否则就将线程停放,但是在不需要担心异步消息传递或扩展的情况下,聘请演员似乎过大。 所以我的问题是-使用演员的时间不好吗?我很好奇erlang看起来如何并且真的希望别人的见识。或者,如果有一些有关演员使用的原则。

4
何时以及出于什么目的在C中将const关键字用于变量?
在这里审核我的代码时,const出现了使用关键字的问题。我了解它用于对变量执行只读行为。 我对它可能有用时的各种情况感到困惑。 是否应该在功能原型中为了清楚起见使用它? 在代码开发期间是否应将其用作安全措施? 是否应该在各种函数的范围内使用它们来声明运行时常量? 应该完全使用吗? 这些问题仅仅是我所面临的困惑的例子。一般的困惑是 什么时候const在C编程中使用关键字? 在C语言中使用此关键字可以获得哪些好处? 使用const关键字有什么弊端吗? 有人指出,由于所有这些问题,在我的问题的细节中,这个问题可能太广泛了。我只是想澄清这些问题只是为了澄清对主要问题的困惑。 何时以及出于什么目的在C中将const关键字用于变量? 也可以改写为 const在C`中正确使用关键字具有相同的优缺点。

10
程序为什么要使用闭包?
在阅读了许多解释闭包的文章之后,我仍然缺少一个关键概念:为什么要写闭包? 程序员将执行什么样的特定任务,最好通过闭包来完成? Swift中闭包的示例是访问NSUrl并使用反向地址解析器。这是一个这样的例子。不幸的是,这些课程只是关闭。他们没有解释为什么将代码解决方案写为闭包。 一个现实世界中编程问题的示例可能会触发我的大脑说:“啊哈,我应该为此写一个闭包”,这比理论上的讨论要有用得多。该站点上不乏理论讨论。

4
拥有更高薪水的技术工作是否意味着您不再需要编写代码?[关闭]
我在一家大公司工作,技术人员大致属于以下类别之一: 一开发商在Scrum团队中谁开发的单品,也许工作与密切相关的产品的其他球队。 一位架构师,他是多个团队的顾问(5-6),并试图识别团队工作之间的共同点,这些共同点可以被抽象到库中(但是,架构师不编写库代码)。该架构师还参加了许多与管理层的会议,并试图设定技术方向。 在我公司中,架构师角色是大多数技术人员进入其职业生涯的下一步。 我的问题是:大多数公司的工作方式是否使他们薪水最高的技术人员远离编写代码?这是开发人员职业的自然趋势吗?开发人员可以拥有全部功能(代码和设置方向吗?)

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.