软件工程

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

17
为什么全球国家如此邪恶?
在我们开始之前,让我说我非常了解抽象和依赖注入的概念。我不需要在这里睁开眼睛。 好吧,我们大多数人在没有真正理解的情况下说了太多次了,“不要使用全局变量”,或者“ Singletons之所以邪恶是因为它们是全局的”。但真正是如此不好的不祥的全局状态? 假设我需要为应用程序进行全局配置,例如系统文件夹路径或应用程序范围的数据库凭据。 在那种情况下,除了在某种全局空间中提供这些设置之外,我看不到任何好的解决方案,这对于整个应用程序都是通用的。 我知道这是不好的滥用,但是全球空间真的THAT邪?如果是的话,那里有什么好的替代方案?

30
为什么业务分析师和项目经理的薪水比程序员高?[关闭]
我们必须承认,编程比创建文档甚至创建甘特图和向程序员询问进度要困难得多。因此,对于那些天真的幼稚的人来说,知道编程通常比较困难,为什么业务分析师和项目经理的薪水比程序员高?是什么使他们的工作成为高薪工作,即使在大多数情况下程序员都是最晚回家的人? 更新 令我无知的是,从某些答复看来,BA和PM之所以能获得更高的薪水,是因为它们通常是造成程序员混乱的原因。但归根结底,是程序员弄脏了手,以解决问题并更加努力地工作。因此,这仍然没有意义。

14
您是否应该将后端编写为API?
今天,我对我们的MVC应用程序进行了热烈的讨论。我们有一个用MVC(ASP.NET)编写的网站,它通常遵循在视图中执行某些操作的模式->击中控制器->控制器构建模型(调用获取数据的Manager,在该模型中构建模型控制器方法本身)->模型去查看->冲洗并重复。 他说我们的代码太紧密了。例如,如果我们还需要桌面应用程序,则将无法使用现有代码。 他说的解决方案和最佳实践是构建一个API,然后在您的API之上构建您的网站,然后构建一个桌面应用程序,移动应用程序等非常简单。 由于种种原因,这对我来说似乎是个坏主意。 无论如何,我似乎无法通过谷歌搜索找到任何讨论这种做法的东西。是否有人对优缺点有任何了解,为什么要这样做,为什么不应该这样做或需要进一步阅读? 我认为这是一个坏主意的一些原因: 太抽象了,无法通过API运行后端。您正在尝试使其过于灵活,这将使其变得难以处理。 MVC中内置的所有内容似乎都无用,例如角色和身份验证。例如,[授权]属性和安全性;您将不得不自己动手。 您的所有API调用都需要附加安全信息,并且您将必须开发令牌系统等等。 您将必须为程序将要执行的每个功能编写完整的API调用。您几乎要实现的每种方法都需要使用API​​。每个用户的Get / Update / Delete,以及每个其他操作的变体,例如更新用户名,将用户添加到组等,等等,每个将是一个不同的API调用。 当涉及到API时,您会丢失各种工具,例如接口和抽象类。WCF之类的东西对接口的支持非常微弱。 您有一个创建用户或执行某些任务的方法。如果要创建50个用户,则只需调用50次即可。当您决定将此方法用作API时,本地Web服务器可以命名管道连接到它,也没有问题-您的桌面客户端也可以访问它,但是突然间,您的批量用户创建将涉及在Internet上锤击该API 50次,不好 因此,您必须创建一个批量方法,但实际上您只是在为桌面客户端创建它。这样,您最终不得不a)根据与其集成的API修改API,而不能直接与其进行集成,b)做更多的工作来创建一个额外的功能。 YAGNI。除非您专门计划编写两个功能相同的应用程序,例如一个Web和一个Windows应用程序,否则这将是大量的额外开发工作。 当您无法端对端进行调试时,调试会困难得多。 许多独立的操作将需要大量的来回操作,例如,某些代码可能会吸引当前用户,检查该用户是否具有管理员角色,获取该用户所属的公司,获取其他成员的列表,并将其全部发送出去一封电邮。这将需要大量的API调用,或者为您想要的特定任务编写定制方法,而该定制方法的唯一好处是速度快,但缺点是不灵活。 可能还有其他一些原因,这些都不在我脑海中。 在我看来,除非您真的需要两个相同的应用程序,否则确实不值得。我也从未见过这样构建的ASP.NET应用程序,您必须编写两个单独的应用程序(API和您的代码),并同时对它们进行版本控制(如果您的用户页面有一个新字段,则d必须同时更新API和您使用的代码,以确保不会产生不良影响,或进行大量额外的工作以保持其健壮性)。 编辑:一些不错的回应,现在真的开始对这一切意味着什么有了一个好主意。因此,为了扩展我的问题,您将如何构建一个MVC应用程序以遵循此API结构? 例如,您有一个显示有关用户信息的网站。在MVC下,您可以: 视图-(CS)HTML页面,其中显示一个UserViewModel控制器-调用GetUser()并创建一个UserViewModel,并将其传递给具有GetUser方法的视图管理器类(与您的API相似)。 控制器执行GetUser(),但您也需要桌面应用程序。这意味着您的GetUser需要通过某种API公开。您可能需要TCP连接,或者是WCF,或者可能是Remoting。您还需要一个将是RESTful的移动应用程序,因为持久性连接不稳定。 那么,您是否会为每个API编写一个API,一个具有方法GetUser()的WCF Web服务,而代码恰好return new UserManager().GetUser()呢?和做同样事情的MVC 4 Web API方法呢?在继续直接在您的MVC控制器方法中调用GetUser时? 还是您会选择适用于所有三个应用程序的解决方案(Web api REST服务)并在其上构建所有内容,因此所有三个应用程序都进行API调用(对本地计算机的mvc调用)。 这仅仅是理论上的完美场景吗?我可以看到以这种方式进行开发的开销很大,尤其是如果您必须以一种允许您以RESTful方式进行操作的方式进行开发时。我认为其中一些已包含在答复中。 编辑2:在阅读更多内容之后,我在下面提出了一条评论,我认为这可能会解释它。我认为这个问题有点棘手。如果您将后端编写为API,让我感到困惑,我认为应该有一个单一的Web服务,所有东西(MVC应用程序,桌面应用程序,移动应用程序)都可以调用来完成工作。 我得出的结论是,您真正应该做的是确保业务逻辑层正确分离。查看我的代码,我已经这样做了-控制器将调用GetUser()管理器,然后从中创建一个视图模型以使用View进行渲染。因此,实际上,业务逻辑层是一个API。但是,如果要从桌面应用程序调用它,则需要编写WCF服务之类的内容以方便调用它。即使仅调用GetUser()一个包含代码的WCF方法return MyBusinessLayer.GetUser()就足够了。因此,API是业务逻辑,而WCF / Web api等只是让外部应用程序调用它的一小部分代码。 因此存在一些开销,因为您必须根据需要将业务逻辑层包装在不同的API中,并且必须为希望其他应用程序执行的每个操作编写API方法,此外,您还需要找出一种进行身份验证的方法,但在大多数情况下是相同的。将您的业务逻辑放在一个单独的项目(类库)中,您可能不会有任何问题! 希望这种解释是正确的。感谢它产生的所有讨论/评论。

8
git中的“ stage”是什么意思?
我发现git很难理解,因为我找不到用于操作的单词的含义。我已经检查了字典中“ stage”的含义,但这些含义均与源代码管理概念无关。 在git的上下文中,“ stage”是什么意思?

5
我应该永远保留GitHub分叉的存储库吗?
因此,我分叉了其他人的存储库,进行了一些更改,提交了请求请求,然后我的更改将其添加到了产品中。大! 但是...我应该如何处理我的分叉存储库?我是否有令人信服的理由来保留我的存储库,还是应该继续删除它?我不打算再做任何贡献,但是如果我改变主意,我想我可以总是重新派发它。 我并不真正担心保留备份。我更担心断开链接,丢失提交消息等。
314 github 

4
苏联的太空计划使用了哪些软件编程语言?
我对苏联的太空计划产生了兴趣,并有兴趣发现Buran航天器上的软件大约是1988年用Prolog编写的。 有谁知道在较早的任务中可能使用了哪些语言,尤其是1970年代初期的Mars PrOP-M火星漫游者任务,这些任务在某种程度上是自主的并且可以越过障碍物? 编辑 我来自Buran Prolog的资料是1990年5月从CIA网站获得的这份解密文件。我找不到OCR版本,因此这里是p中的相关引文。0449: 根据开放源文献,苏联人使用法国开发的编程语言Prolog来为Buran车辆开发车载系统软件...

16
为什么将x + = y之类的快捷方式视为良好做法?
我不知道这些实际上是什么,但我一直都在看到它们。Python的实现类似于: x += 5作为的简写x = x + 5。 但是,为什么这被认为是好的做法?我在阅读过的每本有关Python,C,R等的书籍或编程教程中都涉及到它。我知道这很方便,可以节省三个按键,包括空格。但他们似乎总是我绊倒,当我阅读代码,至少在我看来,使它少可读性,而不是更多。 我是否遗漏了一些在所有地方都使用过的明显原因?

19
我应该尽早从函数返回还是使用if语句?[关闭]
我经常用两种格式编写这种函数,我想知道一种格式是否比另一种格式更受青睐,为什么。 public void SomeFunction(bool someCondition) { if (someCondition) { // Do Something } } 要么 public void SomeFunction(bool someCondition) { if (!someCondition) return; // Do Something } 我通常使用第一个编码,因为这是我的大脑在编码时的工作方式,尽管我认为我更喜欢第二个编码,因为它可以立即处理所有错误,而且我觉得它更易于阅读

30
我怎么知道我是否是一个优秀的程序员?
像大多数人一样,我认为自己在这个领域比平均水平高一点。我收入丰厚,获得晋升,而且从未遇到过获得良好推荐或找到工作的真正问题。 但是我到处都足以注意到我工作过的许多最糟糕的程序员都以为他们是最好的。被其他不良程序员包围的不良程序员似乎是最自欺欺人的。 我当然不完美。我确实会犯错。我确实错过了最后期限。但是我认为我做出的动作与“其他优秀程序员”所做的动作相同。问题是我将“其他优秀程序员”定义为“与我一样的人”。 因此,我想知道,程序员有什么方法可以进行某种合理的自我评估?我们怎么知道我们在工作上是好是坏? 或者,如果条件一样好和坏的太不明确,如何能程序员诚实找出自己的长处和短处,使他们能够采取前者的优势,努力提高后者?
301 evaluation 

10
我是Subversion极客,为什么我应该考虑或不考虑Mercurial或Git或任何其他DVCS?
我试图了解分布式版本控制系统(DVCS)的好处。 我发现颠覆再教育和本文由马丁·福勒是非常有用的。 Mercurial和其他DVCS促进了使用变更集和本地提交的代码处理新方法。它防止合并地狱和其他协作问题 我们不受此影响,因为我练习持续集成,除非在进行实验,否则不能在私有分支中单独工作。我们为每个主要版本使用一个分支,其中修复了从主干合并的错误。 水星让你有中尉 我知道这对于像Linux这样的大型项目很有用,但是我看不到小型且高度协作的团队(5至7人)的价值。 Mercurial更快,占用磁盘空间更少,完整的本地副本允许更快的日志和差异操作。 我也不对此感到担心,因为即使我正在处理非常大的项目,我也没有注意到SVN的速度或空间问题。 我正在寻找您的个人经验和/或前SVN怪才的意见。特别是关于变更集的概念和整体性能的提高。 更新(1月12日):我坚信值得尝试。 更新(6月12日):我亲吻了Mercurial,我很喜欢。他的樱桃当地风味的味道。我亲吻Mercurial只是为了尝试。我希望我的SVN服务器不要介意。感觉很不对劲。感觉很好。并不是说我今晚恋爱了。 最终更新(7月29日):我荣幸地复习了Eric Sink的下一本书,名为“ 版本控制示例”。他说服了我。我去Mercurial。

20
SVN比Git有什么优势?[关闭]
毫无疑问,关于程序员工具的大多数争论都归结为个人选择(由用户)或设计重点,即根据特定用例优化设计(由工具构建者)。文本编辑器可能是最突出的例子-可以在Windows上工作并且在Mac上可以在Mac上的Haskell中进行编码的编码器,可以实现跨平台和编译器集成的价值,因此可以选择Emacs而不是TextMate等等。 事实证明,新引入的技术真正地优于现有的选件并不常见。 版本控制系统(VCS),尤其是集中式 VCS(CVS和SVN)与分布式 VCS(Git和Mercurial)是否真的是这种情况? 我使用SVN已有大约五年的时间,目前在我工作的地方使用SVN。不到三年前,我转到所有个人项目的Git(和GitHub)。 我可以想到Git相对于Subversion的许多优点(并且在很大程度上抽象出了分布式与集中式VCS相比的优点),但是我想不出一个相反的例子-一些任务(这一点很重要,并且在程序员中很常见)工作流程),Subversion比Git更好。 我从中得出的唯一结论是,我没有任何数据-并不是说Git更好,等等。 我的猜测是存在这样的反例,因此是这个问题。

14
为什么每个人都集中使用Git?
我过去的两家公司都使用Git进行版本控制。据我所知,似乎有90%的公司使用Git而不是其他版本控制系统。 Git的最大卖点之一就是它是去中心化的,即所有存储库都是平等的。没有中央资料库/真相来源。这是Linus Torvalds所倡导的功能。 但是似乎每个公司都以集中方式使用Git,就像一个公司会使用SVN或CVS。人们总是从服务器上(通常是在GitHub上)获得一个中央存储库。我从未见过或听说过(以我有限的经验)人们以真正去中心化的方式使用Git,即按自己认为合适的方式推和拉到其他同事的存储库。 我的问题是: 人们为什么在实践中不使用分布式工作流程? 以分布式方式工作的能力对现代版本控制是否甚至很重要,还是听起来不错? 编辑 我意识到我在最初的问题中没有理解正确的语气。听起来好像我在问,当分布式版本控制系统(DVCS)如此明显地优越时,为什么有人会集中工作。实际上,我想说的是,我对DVCS完全没有任何好处。然而,我经常听到人们鼓吹它的优越性,而现实世界似乎同意我的观点。

16
杂乱无章的Java文化-为什么事情如此繁重?它优化了什么?[关闭]
我以前经常用Python编写代码。现在,出于工作原因,我使用Java编写代码。我从事的项目相当小,也许Python会更好地工作,但是有使用Java的非工程性正当理由(我无法详述)。 Java语法没问题;这只是另一种语言。但是,除了语法外,Java还具有被视为“正确”的文化,一套开发方法和实践。现在,我完全无法“培养”这种文化。因此,我将不胜感激正确方向的解释或指点。 我开始的堆栈溢出问题中提供了一个最小的完整示例:https://stackoverflow.com/questions/43619566/returning-a-result-with-several-values-the-java-way/43620339 我有一个任务-解析(从单个字符串)并处理一组三个值。在Python中,它是一个单行(元组),在Pascal或C中,它是一个五行记录/结构。 根据答案,可以在Java语法中使用struct的等效项,在广泛使用的Apache库中使用struct的等效项-但是“正确”的实现方法实际上是通过为值创建一个单独的类,并完成吸气剂和二传手。有人很乐意提供一个完整的例子。它是47行代码(嗯,其中一些行是空白)。 我知道,庞大的开发社区可能并非“错误”。因此,根据我的理解,这是一个问题。 Python实践优化了可读性(按照这种哲学,导致了可维护性),然后提高了开发速度。C惯例针对资源使用进行了优化。Java实践针对什么进行了优化?我最好的猜测是可伸缩性(一切都应准备好以百万计的LOC项目的状态),但这是一个非常微不足道的猜测。

30
为什么不是所有公司都购买最好的硬件给开发人员?
我肯定错过了什么。 在我所在地区雇用程序员的成本为每小时50到100美元。高端机器只有3,000美元,因此每三年购买一台真正出色的计算机的成本为0.50美元/小时。($ 3000 /(150周* 40小时)) 您需要一台高端机器吗?不,这里的3000美元代表的是可能最多支出的金额,而不是我期望的金额。这大约是高端iMac或MacBook(17英寸)的成本。 因此,假设您可以通过购买便宜的计算机每三年节省$ 2000,而您的平均开发人员的收入为$ 60。(这些是我可以提供给bean-counter的最慈善的数字。如果您仅节省1000美元或750美元,这只会使我的情况更糟。)如果这些便宜的计算机每天只花费您10分钟的生产力。(一点也不费力,我确定我的机器花了我更多钱。)然后,在3年中,125个小时的损失总计将损失7500美元。每天损失1分钟(750美元)将获得1250美元的净收益,这几乎不能抵消士气低落的成本。 这是“一分钱又愚蠢的事”还是我简化了这个问题?为什么没有普遍的共识(即使在“企业”中),软件开发人员应该拥有出色的硬件? 编辑:我应该澄清的是,我并不是在谈论尖叫让我的朋友羡慕的快速性能和/或SSD。我说的是RAM太少而无法处理其正常工作量的计算机,这会导致冻结,重新引导,并且(在正常情况下)大约20分钟(毫不夸张地)引导和打开典型的应用程序。(除了周末,我不关门。) 实际上,我计划很快购买一台新机器,它将有所改善。(我将在2011年从2GB RAM到3GB RAM。)但是,按照当前的标准,这台新机器性能中等,因此可以合理地预计,在其退役日期之前,这也是不可接受的。 等待!在您回答或评论之前: 3000美元没关系。如果您要购买的机器的价格低于该价格,那就更应该购买该机器。 我不要求更频繁的升级。在相同的时间表上只有更好的硬件。因此,没有隐藏的安装成本等。 请不要讨论尖端硬件与非常好的硬件之间的区别。我正在游说使用非常好的硬件,例如在一台机器上,这在最坏的情况下是三年前制造的最好的机器之一。 每小时$ 50-$ 100是估计的就业成本 -不包括薪水。如果您是承包商,那将是承包商所使用的开票费率(包括其费用和利润),即雇主的社会服务费。供款,雇主医疗保健供款等。除非您知道此数字不切实际,否则请勿对此数字发表评论。 确保您正在提供新内容。在提供另一个答案之前,请先阅读所有答案。

25
BIG何时重写答案?
刚读了有关“大改写”的问题,我就想起了一个我想自己回答的问题。 我有一个可怕的项目,传给我,是用Struts 1.0用旧Java编写的,表具有不一致的关系,或者根本没有关系,甚至没有主键的表也没有要用作主键的字段,但并不是唯一的。大部分应用程序都以某种方式“正常工作”。大多数页面被重用(复制粘贴的代码)并进行硬编码。曾经从事该项目的每个人都以一种或另一种形式诅咒它。 现在,我长期以来一直在考虑向高层管理人员建议对这个可怕的应用程序进行完全重写。我正在慢慢尝试个人时间,但我真的觉得这值得一些专门的资源来实现。阅读有关大型重写的文章后,我有了第二个想法。当我想说服上级支持我的重写时,这不是很好。(我在一家很小的公司工作,因此该提案有可能获得批准) TL; DR什么时候可以重写答案,您可以使用哪些参数来支持它?

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.