软件工程

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

15
计算机编程的艺术-读书还是不读书?[关闭]
那里有很多关于编程的书,似乎Code Complete在大多数人的“必读编程书”列表中几乎排在首位,但是Donald Knuth 的《计算机编程的艺术》呢?我是一个忙碌的人,在工作和年轻的家庭之间,我没有大量的空闲时间,因此我必须对如何使用它保持谨慎。 我想知道-这里有人读过'TAOCP'吗?如果是这样,那么值得花时间阅读,还是将其他书籍或更多类似宠物编程的开源编程或为开源做贡献的方式更好地利用我的时间进行专业发展呢? 免责声明-对于那些穿着“ Knuth是我的男生” T恤的人,请不要误解我的意思-我想读一下,但我只是想知道它是否应该放在我的优先事项列表的顶部或如果其他事情应该先出现。
63 books 

29
为什么计算机科学学位对专业程序员很重要?[关闭]
我拥有计算机科学学位。对于开门,找工作来说很棒。就帮助我在C#.NET编程的专业领域(即使不是整个美国,如果不是整个世界上最受欢迎的OS,我在该领域中最受欢迎的平台和语言),它几乎没有用。您为什么认为这对您作为职业生涯的程序员有帮助(除了喷出prims算法外,还给某些面试官留下了深刻的印象)? 在当今的世界适应中,敏捷的思维,强大的沟通能力,OO和基本的设计技能使开发人员能够编写出客户会接受的软件。这些技能仅在CS程序中略过。在我看来,阅读Wrox撰写的500页C#书籍比4年来的com cici blaster课程提供了更多有用的技能。许多人不同意。那么,为什么计算机科学学位很重要?

30
我需要去一所知名大学吗?[关闭]
作为美国即将毕业的高中生,我将在几个月内面临一个艰难的决定:我应该去哪所大学?是否值得去康奈尔大学,斯坦福大学或卡内基·梅隆大学(当然,假设我进来)获得著名的计算机科学学位,实习机会以及与教授的联系,同时承担大量债务;还是我最好去纽约州立大学纽约州立大学(SUNY Binghamton)(可能是纽约最好的公立学校),并且仍能接受相当体面的教育,同时使自己免于承担超过10万美元的债务?是的,我知道以前曾经问过类似的问题(即here和here),但是请耐心等待,因为我没有找到适合自己情况的答案。 我已经详细阅读了上面两个链接的问题,但是它们并没有回答我想知道的内容: 是的,我知道上一所名牌大学可能会使我与该领域的一些优秀教授和领导人建立联系,但是平均而言,这在财务上是如何转化的?我的意思是,良好的人际关系能获得如此良好的回报吗,以至于我很容易摆脱十万美元的债务? 我可以在卡内基·梅隆大学获得五年制硕士学位的事实又如何影响方程式呢?立即获得更高的学位会帮助我刚从大学毕业后获得一份薪水更高的工作,还是额外的一年只会使我进一步负债累累?当然,不必去读研究生才能获得可比的学位,这将是巨大的经济实惠,但是过早地获得学位会带来更大的价值吗? 如果我去纽约州立大学宾厄姆顿分校,这比我考虑的要少得多(尽管那里有任何想分享经验的校友,我将不胜感激),我是否会关门大吉呢?能否用长期利益抵消我的短期经济利益?从本质上讲,短期利益是否超过潜在的长期损失? 这些问题的答案都与我最终的大学决定有关(同样,允许我进入这些学校),所以我希望询问该领域的熟练和知识渊博的人将有助于我做出正确的选择(如果有的话)一个东西)。 另外,请注意:我处在一种特殊的情况下,如果不借一大笔贷款我就无法支付大学费用,但是却几乎没有经济援助(可能是联邦或其他方式)。我不想对此进行过多的阐述(因此请从表面看),但这主要是我问这个问题的原因。 非常感谢!它对我意义重大。 编辑:感谢大家的精彩回答!所有的人都经过深思熟虑且写得很好,我希望我有时间对所有这些都发表评论。希望我能在放学回家后今晚下班... 编辑2: 哇!真是难以置信,我在这么短的时间内就收到了这么多有用的回复!我没有时间适当坐下来对其中的许多问题做出回应,但是我真的很感激,我明天会这样做。非常感谢所有张贴的人! 编辑3: 对于那些感兴趣的人,我加入了CMU,康奈尔大学和宾厄姆顿公司,并决定选择宾厄姆顿。CMU和康奈尔没有给我任何经济援助,而宾厄姆顿作为一所公立学校,包括食宿在内每年的费用不到20,000美元。当我收到录取通知书时,决定很艰难,但是在拜访了宾厄姆顿并意识到这所学校的水平之后(美国的公立学校被严重低估了;这是一个可怕的问题—物有所值,事实证明)宾汉姆顿大学比我申请的许多私立学校更具选择性,并不是说这具有内在的意义,而是作为一个衡量标准),我无法通过。另外,我在一个下雨天去了,但印象深刻,所以我知道那是那一天。;) 经过一些实际的财务分析,我意识到我永远无法偿还CMU或Cornell每年需要的60,000美元,只能让宾汉顿的选择更好。 尽管这个问题是针对我的情况的,但是我希望这可以帮助其他人。 编辑4:最近,我意识到处于类似位置的学生一直在这个问题上绊脚石,我想作一个简短的更新。我在宾厄姆顿(Binghamton)感到非常高兴,如果我不得不再次经历整个大学过程,我将不会选择任何其他学校。我认为大多数学生无论走到哪里都趋于幸福,但是对我来说,宾厄姆顿是一次很棒的经历。 我想告诉学生的是:我知道如果不关注学校的名称和声誉就很难对学校进行评判-我怀疑卡内基·梅隆大学是否会被视为学习计算机科学的坏学校-但不要因为学校而忽视学校您从未听说过它们!不要害怕做出实际的选择。我知道宾厄姆顿并不是一所举世闻名的大学,但据我所知,我们的课程更为严格,并且比我听说过的许多顶尖学校奠定了更好的基础,而且价格便宜得多。我们专注于为学生提供实习,工作和研究机会,并且与Microsoft,Bloomberg,IBM,Lockheed Martin等公司有着紧密的联系。我们'学校-我们可能并不出名,但是如果您来到这里,您将为您的职业,以及几乎可以肯定的实习或工作打下良好的基础。另外,我们有足够的小,学生可以了解他们的教授好(我有几个朋友谁是直呼其名的基础上与他们的教授),如果他们有兴趣做研究其有一定的帮助,这是我们做了很多的在宾厄姆顿。 当我选择宾厄姆顿时,我对此一无所知,这是您只能去一所学校就可以了解的一件事-这样的细节不会在小册子和杂志上强调,您可以通过它来学习经验。因此,我想说的是,不要仅仅根据您是否听说过学校而去挑选学校,而应该考虑公立学校。更好的选择,例如宾厄姆顿,都是很好的选择。 带着一点盐:当然,如果您有干劲,技能和努力工作,并且如果您追求成功,那么您去哪里也没关系,因为无论您身在何处都会被注意到。我对自己的实习和工作机会感到非常幸运,我的经历也确实是骗人的,但是如果您不断提高自己的技能并运用自己的能力,则可以比学校更进一步地发展自己。
63 education 

19
处理可怕的估计
我最近从事的一个项目被建筑师严重低估了。估计至少超出了500%。 不幸的是,在与客户签署估算之后,我才被带入该项目。作为高级开发人员,我很快意识到了功能和技术规范。包含一些巨大的差距和不确定性。 结果,我感到不得不与业务和技术主管召开紧急会议,让他们了解现实。作为开发人员的首要任务,我发现这是一个非常压力和困难的情况。“企业”指责IT不称职,是我收到的一些“子弹”使者。 客户威胁要取消该帐户,但是迄今为止该项目仍未完成,我不再直接参与其中。 这位建筑师在社交上是一个好人,但基于这一事件,他要么完全无能,要么存在巨大的销售/业务压力,影响了他的估算。 因此,作为程序员,您对这种情况有何经验?您会如何建议处理这种情况?

10
是否存在过多的私有功能/方法?
我了解文件齐全的代码的重要性。但是我也了解自我记录代码的重要性。直观地读取特定功能越容易,我们在软件维护期间就可以进行得越快。 话虽如此,我喜欢将大型功能分离为其他较小的功能。但是我这样做的程度是,一个班级最多可以有五个班级,以服务于一种公共方法。现在将五个私有方法乘以五个公共方法,您会得到大约二十五个隐藏方法,这些隐藏方法可能只会被那些公共方法调用一次。 当然,现在可以更轻松地阅读这些公共方法,但是我不禁认为,拥有太多函数是不明智的做法。 [编辑] 人们一直在问我为什么认为过多的功能是不好的做法。 简单的答案:这是一种直觉。 我的信念一点都没有任何小时的软件工程经验作为后盾。只是不确定性给了我一个“作家的障碍”,但对于程序员而言。 过去,我只编写个人项目。就在最近,我开始进行基于团队的项目。现在,我想确保其他人可以阅读和理解我的代码。 我不确定会提高可读性。一方面,我正在考虑将一个较大的功能分成名称可理解的其他较小的功能。但是我还有另一面说这是多余的。 因此,我要对此进行启发以选择正确的路径。 [编辑] 下面,我包括我怎么两个版本可以解决我的问题。第一个解决方案是不分离大块代码。第二个做不同的东西。 第一版: public static int Main() { // Displays the menu. Console.WriteLine("Pick your option"); Console.Writeline("[1] Input and display a polynomial"); Console.WriteLine("[2] Add two polynomials"); Console.WriteLine("[3] Subtract two polynomials"); Console.WriteLine("[4] Differentiate two polynomials"); Console.WriteLine("[0] Quit"); } 第二版: public static int …


4
什么是线程池?
一个人如何实现线程池?我一直在Wikipedia上阅读“线程池”,但是我仍然想不出该解决该问题的方法(可能是因为我不太了解简单的线程池)。 有人可以用简单的英语解释我是什么线程池,一个人将如何回答这个问题?

11
将程序分成多个类为什么很好?[关闭]
我仍然是一名高中学生(正在读10年级),并且还没有在学校学习实际的计算机课程。到目前为止,我所做的一切都是通过书本。这些书教会了我诸如继承的概念,但是将程序分成多个类又有什么帮助呢?这些书从未告诉过我。 我问这个问题主要是因为最近有一个项目。这是一款街机视频游戏,就像有人所说的Flash游戏一样(尽管我不知道Flash游戏是什么)。事实是,这只是一堂课。仅使用一个类,它就可以很好地工作(但是偶尔会有一些滞后)。所以,我只是问如何将其拆分为多个类会有所帮助。 这个项目是用Java编写的,我是唯一从事该项目的人。

7
使用验收和集成测试代替单元测试是否足够?
这个问题的简短介绍。我现在已经使用TDD,最近使用BDD已经超过一年了。我使用诸如嘲笑之类的技术来更有效地编写测试。最近,我开始了一个个人项目,为自己编写一个小小的资金管理程序。由于我没有遗留代码,因此从TDD开始是一个完美的项目。不幸的是,我没有体验到TDD的喜悦。它甚至破坏了我的乐趣,以至于我放弃了这个项目。 怎么了 好吧,我使用了类似TDD的方法来使测试/需求发展程序的设计。问题在于,超过一半的开发时间用于编写/重构测试。所以最后我不想实现任何其他功能,因为我需要重构并编写许多测试。 在工作中,我有很多遗留代码。在这里,我写了越来越多的集成和验收测试,以及更少的单元测试。这似乎不是一个坏方法,因为大多数错误是通过验收和集成测试检测到的。 我的想法是,最终我可以编写比单元测试更多的集成和验收测试。就像我说的那样,对于检测错误,单元测试并不比集成/验收测试好。单元测试也对设计有益。由于我曾经写过很多文章,所以我的类总是被设计为可测试的。此外,在大多数情况下,让测试/需求指导设计的方法可导致更好的设计。单元测试的最后一个优点是它们更快。我已经写了足够多的集成测试,知道它们可以和单元测试一样快。 在浏览网络后,我发现这里和那里提到的想法非常相似。您如何看待这个想法? 编辑 在一个例子中回答这个设计很好的例子,但是我需要对下一个需求进行大量重构: 首先,执行某些命令有一些要求。我编写了一个可扩展的命令解析器-从某种命令提示符下解析命令,并在模型上调用正确的命令。结果以视图模型类表示: 这里没有错。所有类都彼此独立,我可以轻松添加新命令,显示新数据。 下一个要求是,每个命令应具有其自己的视图表示形式-命令结果的某种预览。我重新设计了程序,以针对新要求实现更好的设计: 这也很好,因为现在每个命令都有自己的视图模型,因此也有自己的预览。 事实是,命令解析器已更改为使用基于令牌的命令解析,并且剥夺了其执行命令的能力。每个命令都有自己的视图模型,数据视图模型只知道当前的命令视图模型,而不知道必须显示的数据。 我现在想知道的是,新设计是否没有违反任何现有要求。我不必更改任何我的验收测试。我不得不重构或删除几乎每个单元测试,这是一大堆工作。 我想在这里展示的是在开发过程中经常发生的一种常见情况。旧的或新的设计都没有问题,它们只是随需求而自然变化-我的理解是,TDD的优点之一就是设计不断发展。 结论 感谢您的所有答案和讨论。在此讨论的总结中,我想到了一种方法,将在下一个项目中对其进行测试。 首先,我在像往常一样执行任何操作之前编写所有测试。 对于需求,我首先编写一些验收测试,以测试整个程序。然后,我为需要实现需求的组件编写了一些集成测试。如果有一个组件与另一个组件紧密协作以实现此要求,那么我还将编写一些集成测试,其中两个组件都需要一起测试。最后但并非最不重要的一点是,如果我必须编写一个具有高排列的算法或任何其他类(例如,序列化程序),我将为此特定类编写单元测试。所有其他类均未经测试,但未经任何单元测试。 对于错误,可以简化过程。通常,错误是由一个或两个组件引起的。在这种情况下,我将为测试该错误的组件编写一个集成测试。如果它与算法有关,我只会编写一个单元测试。如果不容易检测到发生错误的组件,我将编写验收测试以查找错误-这应该是一个例外。

16
如何在不支持异常的语言中处理零除?
我正在开发一种新的编程语言来解决一些业务需求,并且该语言面向新手用户。因此,不支持该语言中的异常处理,即使我添加了它,我也不希望他们使用它。 我已经到了必须实现除法运算符的地步,我想知道如何最好地处理除零错误? 我似乎只有三种可能的方式来处理这种情况。 忽略错误并产生0结果。尽可能记录警告。 将其添加NaN为数字的可能值,但这引发了有关如何处理NaN语言其他区域中的值的问题。 终止程序的执行并将严重错误报告给用户。 选项1似乎是唯一合理的解决方案。选项#3不切实际,因为该语言将用作夜间cron来运行逻辑。 解决零除错误的方法是什么,选择#1会有什么风险。

7
在设计可测试性时如何处理静态实用程序类
我们正在尝试将我们的系统设计为可测试的,并在大多数零件中使用TDD进行开发。当前,我们正在尝试解决以下问题: 在各个地方,我们有必要使用静态辅助方法,例如ImageIO和URLEncoder(均为标准Java API)以及各种其他主要由静态方法组成的库(例如Apache Commons库)。但是,测试使用此类静态帮助程序类的方法极其困难。 我有一些解决此问题的想法: 使用可以模拟静态类的模拟框架(例如PowerMock)。这可能是最简单的解决方案,但感觉有点像放弃。 围绕所有这些静态实用程序创建实例化包装器类,以便可以将它们注入使用它们的类中。这听起来像是一个相对干净的解决方案,但是我担心我们最终将创建大量这些包装器类。 将对这些静态帮助器类的每个调用提取到一个可以重写的函数中,并测试我实际要测试的类的子类。 但是我一直认为这只是许多人在进行TDD时必须面对的问题-因此必须已经有解决此问题的方法。 使使用这些静态帮助器的类可测试的最佳策略是什么?

15
有什么理由不直接从客户端Javascript转到数据库吗?
可能重复: 编写Web“服务器少”应用程序 因此,假设我要构建一个Stack Exchange克隆,然后决定使用CouchDB之类的东西作为我的后端存储。如果我使用它们的内置身份验证和数据库级别授权,是否有任何理由不允许客户端Javascript直接写入可公开使用的CouchDB服务器?因为这基本上是一个CRUD应用程序,并且业务逻辑由“只有作者才能编辑他们的帖子”组成,所以我认为在客户端内容和数据库之间没有一层的必要性很高。我只是在CouchDB端使用验证,以确保没有人放入垃圾数据,并确保正确设置权限,以便用户只能读取自己的_user数据。渲染将通过类似于AngularJS的客户端完成。从本质上讲,您可能只拥有一个CouchDB服务器和一堆“静态”页面,因此一切顺利。您不需要任何类型的服务器端处理,而只需要一些可以处理HTML页面的内容即可。 向世界开放我的数据库似乎是错误的,但是在这种情况下,只要正确设置权限,我就无法想到为什么。这违背了我作为Web开发人员的本能,但我想不出一个很好的理由。那么,为什么这是个坏主意呢? 编辑:看起来这里有一个类似的讨论:编写Web“服务器少”应用程序 编辑:到目前为止,很棒的讨论,我感谢大家的反馈!我觉得我应该添加一些通用假设,而不是专门调用CouchDB和AngularJS。因此,我们假设: 数据库可以直接从其隐藏存储对用户进行身份验证 所有数据库通信都将通过SSL进行 数据验证可以(但不应这样做)由数据库处理 除了管理员功能外,我们关心的唯一授权是仅允许某人编辑自己的帖子 每个人都可以读取所有数据(除了可能包含密码哈希的用户记录之外),我们非常满意 管理功能将受到数据库授权的限制 没有人可以将自己添加为管理员角色 数据库相对容易扩展 真正的商业逻辑几乎没有,甚至没有。这是一个基本的CRUD应用

3
为什么我们需要将私有成员放在标题中?
私有变量是一种向类用户隐藏复杂性和实现细节的方法。这是一个相当不错的功能。但是我不明白为什么在c ++中我们需要将它们放在类的标题中。我看到这有两个令人讨厌的缺点: 它使用户的标题杂乱无章 每当修改内部结构时,它将强制重新编译所有客户端库 此要求背后是否存在概念上的原因?仅仅是为了简化编译器的工作吗?
62 c++  headers 

6
对象池是否已被弃用?
我对对象池的概念非常熟悉,并且我总是尝试尽可能多地使用它。 另外,我一直认为对象池是标准规范,因为我已经观察到Java本身以及其他框架尽可能多地使用池。 最近,尽管我读了一些对我来说是全新的东西(并且违反直觉?)。 该池实际上使程序性能变差,尤其是在并发应用程序中,并且建议实例化new对象,因为在较新的JVM中,对象的实例化确实非常快。 我在书中读过: Java Concurrency in Practice 现在,我开始考虑我是否对这里的事情有所误解,因为本书的第一部分建议使用Executors重用Thread而不是创建新实例。 那么,如今对象池是否已被弃用?

4
箭头的目的是什么?
我正在通过Haskell学习函数式编程,并且尝试通过首先理解为什么需要它们来抢占概念。 我想知道功能编程语言中箭头的目标。他们解决什么问题?我检查了http://en.wikibooks.org/wiki/Haskell/Understanding_arrows和http://www.cse.chalmers.se/~rjmh/afp-arrows.pdf。我所了解的是,它们用于描述计算图,并且它们允许更轻松的无点样式编码。 本文假定无点样式通常更易于理解和编写。这对我来说似乎很主观。在另一篇文章(http://en.wikibooks.org/wiki/Haskell/StephensArrowTutorial#Hangman:_Main_program)中,实施了子手游戏,但是我看不到箭头如何使这种实现自然而然。 我可以找到许多描述该概念的论文,但没有找到动机。 我缺少什么?

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.