软件工程

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

23
为什么Git这么炒作?…而其他人不?[关闭]
近年来,围绕Git的大肆宣传。每个人都知道Git,没人知道替代方案。 像Mercurial这样的其他产品似乎并未引起注意。两者均于2005年发布,并提供类似的功能。此外,通常认为Mercurial更易于使用,更直观,并且长期以来具有更好的UI。因此,可以假定这将是一种流行的替代方法,特别是对于那些刚开始使用分布式版本控制的人。然而,对于大多数人来说,这似乎并不为人所知,与Git的成功相当不同。 这篇文章的重点是试图更好地理解这种现象。 Git如何获得蛋糕的全部?他们是否以某种方式使用了更好的营销?是因为它的社区更……糟糕……“冗长”吗?是因为“ Linus”这个名字吗?是因为它的怪异形象吗? 你怎么看?

8
递归或while循环
我正在阅读一些开发面试的实践,特别是面试中提出的技术问题和测试,我对这种类型的说法误解了很多次:“好的,您可以用while循环解决问题,现在可以递归”或“每个人都可以用100行while循环解决此问题,但是他们可以用5行递归函数来实现吗?” 等等 我的问题是,递归是否通常比if / while / for构造好? 老实说,我一直认为递归不是首选,因为它仅限于比堆小得多的堆栈内存,而且从性能的角度来看,执行大量的函数/方法调用也不理想。是错的...

14
方法对您来说理想的长度是多少?[关闭]
在面向对象的程序设计中,方法的最大长度当然没有确切的规则,但是我仍然发现这两个引号有些矛盾,因此我想听听您的想法。 罗伯特·马丁(Robert Martin)在《干净代码:敏捷软件工艺手册》中说: 功能的第一个规则是它们应该很小。功能的第二个规则是它们应该小于该值。函数不能长100行。函数几乎不应超过20行。 并列举了肯特·贝克(Kent Beck)的Java代码示例: 他程序中的每个函数只有两行,三行或四行。每个明显透明。每个人都讲一个故事。每个人都以引人注目的顺序将您引向了下一个。那就是您的功能应该有多短! 这听起来不错,但另一方面,在“代码完成”中,史蒂夫·麦康奈尔(Steve McConnell)说了很不一样的话: 例程应允许有机增长到100-200行,数十年的证据表明,这种长度的例程不会比较短的例程容易出错。 他还提到了一项研究,该研究说65行或更长的例程开发起来比较便宜。 因此,尽管对此事有不同意见,但您是否有实用的最佳实践?

11
当每个人都在学习大师时,如何使git痛苦最小化?
我们大约十个人的文档团队最近从SVN迁移到Git。在SVN中,每个人都在研究master。这是我一直讨厌的模型,但我无法带来这种改变。作为迁移到Git的一部分,我们已经同意解决此问题,但我们还不能做到这一点(等待构建更改,以允许从任意分支进行构建)。同时,每个人都在研究大师。是的,我知道这很可怕,相信我。 与使用SVN相比,我们现在看到的麻烦更多,其中一些是由Git的两阶段模型(本地和远程)引起的。有时人们会做出承诺但无法推动,或者他们会与即将发生的本地更改产生冲突。昨天有人以某种方式破坏了最近的更改,但合并失败了,我认为这是Git在您进行合并并进行出色更改时所做的合并。(他无法确切地告诉我他做了什么,并且因为他使用的是GUI,所以我不能只检查他的shell历史记录。) 作为最熟练的Git用户(请阅读:我以前使用过,尽管没有做过任何复杂的事情),我是制定策略,教授工具和清理混乱的人。在我们可以切换到分支上进行开发之前,我如何对使用工具的方式进行更改,以使共享的活动主数据库不易出错? 该小组正在Windows上使用Tortoise Git。我们使用Tortoise Git是因为我们之前使用过Tortoise SVN。(我个人使用Cygwin下的命令行进行某些操作,但是团队已经明确表明他们需要GUI,我们将使用此GUI。)答案应该与此工具一起使用,而不是建议替代工具。 Tortoise Git可以通过一次操作“提交并推送”,我已经告诉他们一定要这样做。但是,它不是原子的-可能会发生提交(毕竟是本地的)的工作,但推送没有(例如,由于冲突或网络问题)。当发生这种情况时,他们会得到一个模棱两可的错误。我已经告诉他们检查BitBucket提交日志,如果他们对最近的提交有任何疑问,如果看不到,则进行推送。(如果那是问题,可以解决冲突,或者如果他们不知道该怎么办,请寻求帮助。) 团队已经有“提早并经常拉”的好习惯。但是,拉力似乎会引起冲突,我认为这是新的吗?如果不是新的,则比SVN中的频率要高得多。我听说我可以更改Git的拉动方式(重新设置基数而不是合并),但是我对那里的权衡(或在我们的环境中如何做到)没有很好的了解。 服务器是BitBucket(不是Github)。我对我们的存储库拥有完全的管理控制权,但更一般而言,服务器上没有。这些都不是可变的。 源文件是XML。还有一些图形文件,每个人都知道您无法合并,但是我们几乎也从来没有冲突。合并冲突来自XML文件,而不是图形。 我可以对Git的使用进行哪些​​更改,以使共享主控团队更加顺畅,直到我们可以使用已审阅,经过测试验证的请求请求的功能分支为止?
123 git  bitbucket 

9
讨厌多重继承吗?
我一直很喜欢在一种语言中支持多重继承的想法。尽管通常是故意放弃的,但所谓的“替换”是接口。接口根本不能涵盖所有相同的多重继承,并且这种限制有时可能会导致产生更多样板代码。 我听说过的唯一基本原因是基类的钻石问题。我就是不能接受。对我来说,它的表现非常糟糕,例如:“嗯,有可能将其弄糟,所以这自然不是一个好主意。” 但是,您可以用编程语言修改任何内容,我的意思是。我只是不能认真对待这一点,至少没有没有更彻底的解释。 仅知道这个问题就占了90%。此外,我想我几年前听说过涉及通用解决方案的问题,该解决方案涉及“信封”算法或类似的东西(有人敲响铃吗?)。 关于钻石问题,我能想到的唯一潜在的真正问题是,如果您正在尝试使用第三方库,并且看不到该库中两个看似无关的类具有共同的基类,那么除了例如,文档是一种简单的语言功能,可能要求您明确声明要创建菱形的意图,然后才能为您实际编译菱形。有了这样的功能,任何钻石的制造要么是故意的,鲁ck的,要么是因为人们没有意识到这一陷阱。 所有人都这么说... 大多数人是否有真正的理由讨厌多重继承,还是仅仅是一堆歇斯底里会造成弊大于利?有没有我在这里看不到的东西?谢谢。 例 汽车扩展了WheeledVehicle,KIASpectra扩展了汽车和电子产品,KIASpectra包含无线电。为什么KIASpectra不包含电子产品? 因为它是电子的。继承vs.组合应该始终是is-a关系vs.has-a关系。 因为它是电子的。上下都有电线,电路板,开关等。 因为它是电子的。如果冬天电池没电了,您的麻烦就好像所有车轮突然丢失一样。 为什么不使用接口?以#3为例。我不想一遍又一遍地写这个,而且我真的不想创建一些奇怪的代理帮助器类来做到这一点: private void runOrDont() { if (this.battery) { if (this.battery.working && this.switchedOn) { this.run(); return; } } this.dontRun(); } (我们不会考虑该实现的好坏。)您可以想象如何可能有一些与电子相关的功能与WheeledVehicle中的任何内容都不相关,反之亦然。 我不确定是否要解决该示例,因为那里有解释的空间。您还可以考虑从平面扩展Vehicle和FlyingObject,以及从Bird扩展Animal和FlyingObject,或者从更纯粹的示例方面进行思考。

30
用ADD / ADHD编程
我已经诊断出ADD。轻微但足以影响我的工作: 容易分心 一次不能专注于一个项目 沉迷于网络 拖延 等等 您使用什么策略进行补偿? 一澄清 我有真正的 添加。我小时候就被诊断出患有这种疾病,并且一生都在为之奋斗。我不是在谈论由媒体过载引起的人为添加。 更新资料 我刚刚阅读了此说明ADD / ADHD。这是一个很好的描述,特别是对于我们为ADDers编程的情况: 我就像一个工具箱, 将所有我需要 用到的工具 轻轻,整齐地放在箱子中,随时可以使用。 该工具箱是半透明的, 所以我可以在那里看到它们。 工具箱的钥匙已锁定在其中。

5
具有相同id属性的两个HTML元素:到底有多糟?
只需浏览google maps源代码。在标题中,他们有2个div,其中id =“ search”一个包含另一个,并且还具有jstrack =“ 1”属性。有一种形式将它们分开,如下所示: <div id="search" jstrack="1"> <form action="/maps" id="...rest isn't important"> ... <div id="search">... 由于这是google,我假设这不是一个错误。 那么违反此规则真的有多严重?只要您谨慎选择CSS和dom,为什么不重用id一样的类?有人故意这样做吗?如果是,为什么?

14
自动会使C ++代码更难理解吗?
我看过Herb Sutter的一次会议,他鼓励每个C ++程序员使用auto。 前段时间,我不得不阅读C#代码var,该代码被广泛使用,并且代码很难理解-每次var使用时,我都必须检查右侧的返回类型。有时不止一次,因为一段时间后我忘记了变量的类型! 我知道编译器知道类型,而不必编写它,但是我们应该为程序员而不是为编译器编写代码已广为接受。 我也知道这更容易编写: auto x = GetX(); 比: someWeirdTemplate<someOtherVeryLongNameType, ...>::someOtherLongType x = GetX(); 但这仅写入一次,并且GetX()多次检查了返回类型以了解其类型x。 这让我感到奇怪-是否auto会使C ++代码更难理解?
122 c++  c++11 


7
您应该使用单元测试来测试什么?
我刚大学毕业,下周要去上大学。我们已经看到了单元测试,但是我们并没有太多地使用它们。每个人都在谈论他们,所以我想也许我应该做些。 问题是,我不知道要测试什么。我应该测试一下普通情况吗?边缘情况?我怎么知道一个功能已被充分覆盖? 我总是有一种可怕的感觉,尽管测试可以证明某个功能在特定情况下可以工作,但是证明该功能在一定时期内是完全没有用的。

14
是否可以以略有不同的方式重写开源项目的每一行,然后在封闭项目中使用它?
我正在考虑将某些代码用于GPL或LGPL用于iPhone项目。 如果我使用该代码(JavaScript)并以另一种语言重写了该代码以在iPhone上使用,那将是法律问题吗? 从理论上讲,发生的过程是我遍历了项目的每一行,了解了项目的执行情况,然后以一种新的语言重新实现了这些想法。 在我看来,这就像在学习如何实现某些东西,然后与原始许可分开重新实现。因此,您仅复制了算法,可以说您可以从原始项目以外的其他地方学到算法。 许可证是否涵盖特定的实现或算法? 编辑 - - - 看到这个话题建立良好的对话,我感到非常高兴。为了给项目提供更多支持,所涉及的代码进行了某种音频分析。我相信学习或实现它并非易事,尽管我准备着手执行此任务(我处于可以实现FFT算法的水平,并且将超越此范围。)低LOC脚本,因此我认为做直接移植并不难。 我真的很喜欢重新释放端口以及在应用程序中使用它的想法。我认为没有任何问题,这将是回馈社区的好方法。 我本来想不想讨论道德问题,但我很高兴自己没有参加,因为这似乎激起了辩论。 我仍然对使用开放源代码学习感到有些奇怪。这是否意味着不允许在开放源代码项目中使用从开放源代码项目中学到的任何东西?实施必须经过多长时间或不同时间才能不被视为违反许可?ky! 编辑2 -------- 后续问题

15
“软件开发人员”与“软件顾问”有何不同?是什么使顾问?
我见过很多人自称是“软件顾问”。这些顾问从事普通软件开发人员的工作,编写代码,估计任务,修复错误和参加会议等。唯一的区别是财务状况,顾问最终会获得更多收入。那么,软件开发人员与“顾问”有何不同? 除了主要问题之外,我想知道软件开发人员如何成为顾问?是否有针对顾问的特定准则?他们是否需要积累认证并撰写研究论文?请不要混淆软件顾问和管理顾问。我见过的软件顾问不是经理。
122 terminology 

30
我仍然不知道如何编程?
我已经阅读了很多有关各种编程语言,Java,Python,C等的书籍。我理解并了解这些语言的所有基础知识,并且了解算法和数据结构。(相当于说两年的计算机科学课) 但是,我仍然不知道如何编写一个有用的程序。 所有编程书籍都向您展示如何编写语言,但不向您展示如何使用它!编程示例都是非常基础的,例如为图书馆或简单的游戏构建卡片目录或使用算法等。它们没有向您展示如何开发实际上可以做任何有用的复杂程序! 我看过SourceForge上的开源程序,但是对我来说它们没有多大意义。每个程序中有数百个文件,数千行代码。但是,我该如何学习呢?我在亚马逊上可以买到的任何书都没有给我任何编写这些程序的工具。 从阅读Java或Python编程入门或C编程语言等到实际可以说,我对X程序有什么想法?这就是我要开发的方式吗? 似乎编写程序所涉及的内容比书或课堂上所学的更多。我感觉好像有些东西。 我怎样才能走上正确的道路?
122 untagged 


6
插座和端口之间的区别
有人可以很清楚地解释一下端口和套接字之间的区别。我知道端口充当应用程序进程进入网络的大门,并且应用程序进程使用与给定端口号的套接字连接来处理网络通信,但是当您有多个进程在侦听单个端口号时,我发现很难理解插座和端口之间的区别以及它们如何装配在一起。

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.