软件工程

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

10
函数式编程支持者将如何在Code Complete中回答此声明?
在第二版的839页上,史蒂夫·麦康奈尔(Steve McConnell)讨论了程序员在大型程序中“克服复杂性”的所有方式。他的提示最终体现在: “面向对象的编程提供了同时适用于算法和数据的抽象级别,这是仅功能分解无法提供的那种抽象。” 加上他的结论“降低复杂度可以说是成为有效程序员的最重要的关键”(同一页),这似乎对函数式编程构成了很大的挑战。 FP和OO之间的辩论通常由FP支持者围绕复杂性问题进行,这些复杂性问题特别来自于并发或并行化的挑战。但是并发当然不是程序员必须克服的唯一复杂性。也许专注于减少一种复杂性会在其他方面大大增加它的复杂度,以至于在许多情况下,增加收益是不值得的。 如果我们将FP和OO之间的比较术语从并发性或可重用性等特定问题转移到全局复杂性的管理上,那场辩论会如何? 编辑 我想强调的对比是,OO似乎封装和抽象了数据和算法的复杂性,而函数式编程似乎鼓励在整个程序中使数据结构的实现细节更加“暴露”。 例如,参见Stuart Halloway(Clojure FP的支持者)在这里说,“数据类型的过度规范”是“惯用的OO风格的负面结果”,并主张将AddressBook概念化为简单的矢量或映射而不是更丰富的OO对象。以及其他(非向量化和非地图类)属性和方法。(此外,OO和领域驱动设计的支持者可能会说,将地址簿公开为向量或映射会使封装的数据过度暴露于从域的角度来看无关紧要甚至危险的方法)。

4
从非GPL软件调用GPL软件
我可以(合法地)使用从我正在编写的另一个程序中以GPL发布的程序,而不必遵守GPL(对于我正在编写的程序)吗? 例如,我有一个使用程序的GUI(在GPL下),我可以将代码隐藏在GUI中甚至出售吗?
30 gpl 

5
不喜欢我目前的工作,想离开,如何在求职面试中解释一下?[关闭]
几年前,我移民到另一个国家,去年初,我设法获得了硕士学位。那时,我拼命寻找工作,很幸运能在一家小型软件开发公司找到工作。作为记录,我回到了自己的母公司,当时我是一位知名的开发人员,拥有非常良好的记录,过去我曾担任软件开发公司的高级开发人员和团队负责人。 现在,经过一年多的时间,出于技术和非技术方面的原因,我都想离开目前的工作。我可以忍受我们遇到的一些技术问题,但是我们的经理和团队负责人一直不尊重我,并且以令人反感的方式与我交流,这使我感到沮丧,焦虑,压力大,甚至没有。 现在我的问题是,在我所处的情况下,一个人应该如何回应“你为什么要离开目前的工作?”。显然,我不能说“因为我的经理是一个精神病患者,他一直不尊重我,冒犯了我,我已经受够了”。您认为我应该如何回答这样的问题?
30 interview 

3
BDD和TDD之间的关系
BDD和TDD是什么关系? 据我了解,BDD在TDD之上增加了两个主要内容:测试命名(确保/应该)和验收测试。在BDD开发期间,我应该遵循TDD吗?如果是,我的TDD单元测试是否应使用相同的sure / should样式命名?
30 tdd  bdd 

3
C#,Java和Scala的Closures / Lambdas /…方法的优缺点是什么?
我想知道C#和Scala之间在技术上的实现差异是什么,以及两种解决方案如何与布莱恩·格茨(Brian Goetz)发送给Project Lambda(JSR 335)邮件列表的Peek Past lambda电子邮件中表达的实现思想和关注点进行比较? 从电子邮件: 我们探索了“也许lambdas应该只是内部类实例,那真的很简单”之路,但最终走到了“函数是语言未来的更好方向”的位置。 并进一步: 世界的lambdas-are-objects视图与这个可能的未来冲突。对世界的lambda-are-functions视图并不了解,并且保留这​​种灵活性是不让lambda负担甚至带有客观性的负担的要点之一。 结论: Lambdas-are函数打开了大门。Lambdas-are-objects将它们关闭。 我们更希望看到那些门保持打开状态。 有人在Reddit主题上发表了一些评论: 我实际上通过电子邮件向Neal Gafter发送了电子邮件,由于我对他的解释的有限理解,C#和当前的Java设计非常相似,因为Delegates实际上是对象而不是函数类型。似乎他认为Java应该从C#的lambda的缺点中学习并避免它们(就像C#从Java的缺点中获悉并在一开始就避免它们一样)。 为什么“ Lambdas-are-functions”方法比“ Lambdas-are-objects”在将来能提供更多的机会?有人可以解释存在什么差异以及它们如何影响代码的编写方式吗? 看到Scala中的事情“可行”,我一直在想,我缺少关于C#/ Java(8)中采用/提出的方法的某些东西,可能与对向后兼容性的关注有关吗?
30 c#  java  scala  lambda  closures 

13
采访中“白板编码”是否不合适?[关闭]
这是一个有点主观的问题,但我很想听听访问者/受访者对此主题的反馈/意见。 我们将技术面试分为四个部分。在白板上编写代码,阅读和分析代码,设计会议和代码。 对于最后一部分,我们要求受访者做的是在白板上写一个小的代码段(4-5行),并在他们通过时进行解释。让我清楚一点,目的不是要吸引别人。我们不是在寻找完美的语法。甚至可以是伪代码。但关键是要给他们一个非常简单的问题,看看他们的大脑是否可以将解决方案传达给我们。简单的问题,我的意思是“反向字符串”,“ FizzBu​​zz”等。 请注意,我们总是首先要求使用明确的语言。我们是.NET C#房子。我们只说过“伪代码”,其中有人一直在空白/确实在为代码苦苦挣扎。 我的问题是“期望程序员在面试期间在白板上编写代码段是否不合适/不合理?”

11
源代码控制中的二进制文件
当针对嵌入式设备和其他奇异世界进行开发时,很可能您的构建过程将包含多个专有二进制文件,并使用它们的特定版本。所以问题是,它们是否在源代码管理中?我的办公室遵循“从源代码管理中签出包含编译代码所需的一切”的规则,这引起了一些严重的争论。 我反对这一观点的主要论点是使源代码控制数据库过大,缺少差异二进制文件(请参阅有关该主题的先前问题)。这违背了签出,构建,知道您具有先前开发人员想要的精确环境并且没有收集适当文件(具有特定版本的情况!)的能力。

17
通过抽象隐藏细节有什么价值?透明度没有价值吗?
背景 我不是抽象的忠实粉丝。我会承认,人们可以从接口的适应性,可移植性和可重用性中受益。那里确实有好处,我不想质疑这一点,所以让我们忽略它。 抽象还有另一个主要的“好处”,即向该抽象的用户隐藏实现逻辑和细节。论据是您不需要了解细节,并且此时人们应该专注于自己的逻辑。从理论上讲是有道理的。 但是,无论何时维护大型企业应用程序,我总是需要了解更多细节。只是为了确切地找出某物在做什么,就变得越来越麻烦,它不断地深入研究抽象。也就是说,在找到所使用的存储过程之前,必须执行“打开声明”大约12次。 这种“隐藏细节”的心态似乎只是阻碍。我一直希望界面更透明,抽象更少。我可以阅读高级源代码并知道它的作用,但是我永远不知道它是如何执行的,何时执行的,是我真正需要知道的。 这里发生了什么?我曾经使用过的每个系统是否都经过了错误的设计(至少从这个角度而言)? 我的理念 当我开发软件时,我觉得我尝试遵循一种与ArchLinux哲学密切相关的哲学: Arch Linux保留了GNU / Linux系统固有的复杂性,同时使它们井井有条,透明。Arch Linux开发人员和用户认为,试图隐藏系统的复杂性实际上会导致系统更加复杂,因此应避免使用。 因此,我从未尝试将软件的复杂性隐藏在抽象层的后面。我试图滥用抽象,而不是成为抽象的奴隶。 心中的问题 隐藏细节有真正的价值吗? 我们不是在牺牲透明度吗? 这种透明度难道不有价值吗?

17
向数学家介绍编程
我目前是一名程序员,大约16岁,已经将我的职业范围缩小到涉及计算机科学学位或电气工程学位的程度(我知道他们有很大不同,但是这个问题是关于我的朋友的),但是我朋友不太确定。 他对数学很感兴趣,是它非常好,我想他会喜欢编程,但他是不是愿意尝试它(编辑他是愿意去尝试,但之前从未做过)。任何人都可以给我关于他可以涉足编程的语言或工具的建议(在我假设的合理的基本水平上),以解决数学问题或涉及某种数学。 正如我说他非常喜欢数学,但我认为他会喜欢编程一样,问题是我不希望他被入门级与内存分配等无关的东西所拖延。我知道这很重要,但是重点是我希望他学习一些数学编程知识,然后希望他是否足够感兴趣,可以开始学习编程知识。 编辑: 并不是说他完全不感兴趣-更重要的是他之前没有积极探索过该地区,也许是因为他没有被告知。我不想强迫他做他不想做的事情,我认为这更多的是推动,以便他可以学习编程。如果他不喜欢它-足够公平,我将无法控制并且不想这样做,但是如果他发现喜欢它-这种推动将是正确的事情。
30 education  math 

7
当我所有的工作都在内部项目上时,我该如何表现出对潜在雇主的适应能力?[关闭]
我担任现职已经很长时间了(十年),在那段时间里,我觉得自己在设计人员,系统架构师和程序员方面的表现都不错。但是,所有这些工作都是在内部项目上进行的,这些项目是外界无法访问的。 我看到很多这样的建议,即“如果您可以直截了当地指出并说“我写了这个”,那将是非常令人印象深刻的”。如果您根本无法“从字面上指向”该怎么办呢,因为您是一个热情的程序员,就像经典的Joel-ism所说的那样,“很聪明并且可以完成工作”,而所有这些事情都是看不见的? 我需要开始疯狂地致力于开源项目吗?创建“现实世界”(而非公司内部)博客?坦白说,我在这10年中的大部分时间都在这里度过了快乐,直到最近才考虑到更绿色的牧场去。我会因为专注于工作当前的雇主而牺牲我的“公众形象”而陷入沉迷之中吗?
30 interview 


6
如何解释单元测试的价值
我想向我的同事介绍单元测试(和一般测试)的概念;现在根本没有测试,通过UI实际执行任务以查看期望的结果来测试事物。就像您想象的那样,代码与确切的实现紧密耦合-甚至导致代码应该放在一个类中并在整个系统中重复使用,并且跨方法进行复制和粘贴。 由于需求的变化,我被要求修改我先前编写的模块,该模块相当松散地耦合在一起(虽然不尽如人意,但在无需引入许多其他概念的情况下,我可以做到最好)。我决定在修订后的代码中包含一套单元测试,以“证明”它可以按预期工作,并演示测试的工作方式。我没有遵循真正的TDD,因为已经编写了一些代码,但是我希望遵循一些TDD概念来创建新代码。 现在,我不可避免地会被问到,为什么要花我一两天以上的时间来编写代码,因为我要与之交互的部分已经存在于系统中(尽管没有任何测试并且非常紧密耦合),当我检查其中的代码时,系统将询问我这个“测试”项目是什么。我可以解释测试的基础知识,但是我无法以其他人会理解的方式解释实际好处(因为他们认为测试需要您自己运行应用程序,因为通常实际的UI在确定功能是否“有效”时很重要“ 或不)。他们不理解松散耦合的思想(显然没有松散耦合的事实;在我编写的代码之外甚至没有任何接口),因此尝试将其用作收益可能会给我带来“恩?” 外观,再也不必放松一些现有模块,并可能引入某种IoC容器,这就像浪费时间,而不是“编程”。 有人对我如何指向此代码有任何建议,并说“我们应该开始创建单元测试”而不会屈服于任何一个居高临下的条件(例如,“编写测试会迫使您编写良好的代码。”这可能意味着代码除非是我的坏人),还是没有浪费时间却没有增加任何实际价值?

8
关于团队领导的表现,您应该问团队的三个最重要的问题是什么?
我正接近一个小型软件公司内部的一个小型开发团队(包括我自己在内的4个成员)的负责人,将近1年。我想让我的团队有机会评估自己作为团队开发人员的团队领导的表现。 我发现很难以开放式“我好吗?”来获得良好的反馈。问题,那么最重要的问题是什么?理想情况下,我希望能够提供3个简单的问题,团队可以回答。您想向团队负责人反馈哪些最重要的部分? 我最初的想法是让我的团队匿名回答这些问题?这是一个好主意吗?

4
算法入门(CLRS)书的必备数学技能
我已经对基本算法有所了解。现在,我计划研究更多高级算法,并决定继续学习“算法简介”。 我不确定,在读这本书之前我是否需要提高数学技能?(我几乎忘记了我在高中和大学学习的数学)如果这本书需要强大的数学知识,请提出一些有益的学科。 我想学习算法的实现,设计和分析。

3
ActiveRecord模式的缺点是什么?
我很好奇将ActiveRecord模式用于数据访问/业务对象的缺点是什么。我能想到的唯一一个就是违反了单一责任原则,但是AR模式很常见,以至于仅凭这个原因似乎不足以证明不使用它(当然,视图可能会偏斜,因为我使用的代码通常都没有遵循任何 SOLID原则)。 我个人不是 ActiveRecord的粉丝(除了编写Ruby on Rails应用程序,AR感觉很“自然”),因为我觉得类做得太多,并且数据访问不应该取决于类本身处理。我更喜欢使用返回业务对象的存储库。我使用的大多数代码都倾向于使用ActiveRecord的变体,形式为(我不知道为什么该方法是布尔值): public class Foo { // properties... public Foo(int fooID) { this.fooID = fooID; } public bool Load() { // DB stuff here... // map DataReader to properties... bool returnCode = false; if (dr.HasRows) returnCode = true; return returnCode; } } 或有时更“传统”的方式public static Foo FindFooByID(int …

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.