软件工程

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

7
如何改变草率的公司文化?[关闭]
有时,当我遇到需要解决的问题时,我发现解决该问题的最简单方法是编写一个小程序作为个人工具。我没有使它具有超级可用性或超强健性,因为我是唯一要使用它的人,而且我没有时间完善和全面测试它。 然后,一位同事看到了程序并提出了要求,因为他遇到了同样的问题,并且该工具可以提供帮助。我给他“这不是很漂亮,但可以完成工作”的免责声明,让他拥有。 我知道的下一件事,我的上司打电话给我,告诉我他正在尝试使该软件在客户的计算机上运行,​​但显示X错误消息。WTF ??该软件尚未发布,我也没有被告知需要发布。但是出于某种原因,我的上司认为它足够好,并在不通知原始开发人员的情况下发布了它。 现在,使用可以轻松解决此特定问题MessageBox.Show("DO NOT GIVE TO CLIENTS!");。但是,该问题表明存在更深层次的问题:我们的公司文化马虎。马虎软件可以,马虎进程也可以。不必担心未来-只需投入足够的精力使其几乎不能立即使用,将二进制文件放入.zip文件中,然后发货即可。足以胜任政府工作。 这是一家拥有10名全职员工的小型公司,正在成长,并且已经存在了一段时间。不要误会我的意思;我喜欢在这里工作,也喜欢公司。不要告诉我跑步;我想成为使公司变得更好的一部分。您如何开始为这种文化带来良好的变化?

4
Haskell中的return-type-only only多态性好吗?
在Haskell中我从未完全了解过的一件事是如何拥有多态常量和函数,这些常量和函数的返回类型不能由其输入类型确定,例如 class Foo a where foo::Int -> a 我不喜欢这样的一些原因: 参照透明度: “在Haskell中,给定相同的输入,一个函数将始终返回相同的输出”,但这是真的吗?read "3"在Int上下文中使用时返回3 ,但在上下文中使用时抛出错误(Int,Int)。是的,您可以说这read也是一个类型参数,但是我认为类型参数的隐式性使其失去了某些美感。 单态限制: 关于Haskell的最烦人的事情之一。如果我错了,请纠正我,但是MR的全部原因是看起来共享的计算可能不是因为type参数是隐式的。 输入默认值: 再次是Haskell上最烦人的事情之一。例如,如果您在输出中将函数多态的结果传递给输入中的函数多态,则会发生这种情况。同样,如果我错了,请纠正我,但是如果没有函数的返回类型不能由其输入类型(和多态常量)确定的函数,则不需要这样做。 因此,我的问题是(冒着被盖章为“讨论问题”的风险):是否有可能在类型检查器不允许这些定义的情况下创建类似于Haskell的语言?如果是这样,该限制的利弊是什么? 我可以看到一些直接的问题: 例如,如果2仅具有type Integer,2/3则将不再使用当前定义进行类型检查/。但是在这种情况下,我认为具有功能依赖性的类型类可以解决(是的,我知道这是一个扩展)。此外,我认为拥有可以采用不同输入类型的函数比拥有受其输入类型限制的函数要直观得多,但是我们只是将多态值传递给它们。 值的打字喜欢[]和Nothing我看来,像一个难啃的骨头。我还没有想到处理它们的好方法。

14
是否有某种语言或设计模式允许“删除”类层次结构中的对象行为或属性?
传统类层次结构的一个众所周知的缺点是,在对现实世界建模时,它们是不好的。例如,尝试用类来表示动物的种类。这样做确实存在几个问题,但是我从未见过的解决方案是,当子类“丢失”超类中定义的行为或属性时,例如企鹅无法飞行(有也许是更好的例子,但这是我想到的第一个)。 一方面,您不想为每个属性和行为定义一些标志来指定它们是否全部存在,并在访问该行为或属性之前每次对其进行检查。您只想说在Bird类中,鸟类可以简单,清晰地飞行。但是,如果以后可以定义“例外”而不必到处使用一些可怕的骇客,那就太好了。当系统生产一段时间后,通常会发生这种情况。您突然发现一个根本不适合原始设计的“例外”,并且您不想更改代码的很大一部分来容纳它。 因此,是否有一些语言或设计模式可以干净地处理此问题,而无需对“超类”以及使用它的所有代码进行重大更改?即使解决方案仅处理特定情况,也可以将多个解决方案一起形成一个完整的策略。 经过更多思考,我意识到我忘记了《里斯科夫替代原则》。这就是为什么你不能这样做。假设您为所有主要的“功能组”定义了“特征/接口”,则可以在层次结构的不同分支中自由实现特征,例如“飞翔”特征可以由Birds以及某些特殊的松鼠和鱼来实现。 因此,我的问题可能是“我如何取消实施特质?” 如果您的超类是Java可序列化的Java,则即使您无法对状态进行序列化(例如,如果您包含“ Socket”),您也必须也是一个。 一种方法是始终从一开始就成对定义所有特征:Flying和NotFlying(如果不进行检查,则会抛出UnsupportedOperationException)。非特征不会定义任何新接口,可以简单地进行检查。听起来像是“便宜”的解决方案,特别是如果从一开始就使用它。

6
面向对象的“规范化”
在数据库编程中,有一种称为“规范化”的技术可以对要存储的数据进行处理。 有没有人尝试将此概念应用于对象设计?你怎么样 效果如何? 编辑:为了扩展/阐明,数据库规范化不仅仅是减少冗余的一组原则。实际上,您需要经历一些步骤和阶段,并且至少要有一些适度的客观指标来告诉您所处的阶段。对象设计有其自身的原理,并且有嗅觉的概念,但是有什么办法可以做类似的事情来告诉您您是否处于XX-form0,1,2 ...等...以及移至下一个“标准化”级别的方法?
28 design 

6
迪克斯特拉推荐一个精通母语的人意味着什么?[关闭]
Dijkstra在这里写道: 除了数学上的偏爱之外,对母语的掌握也非常出色,这是一名合格的程序员的最重要资产。 我不明白这句话的后半部分。您能否解释或阐述? PS我在印度长大。我在家里说孟加拉语。我在自己居住的社区讲马拉地语;印地语是一种国家语言,口语非常广泛,所以我知道。在学校和大学里,我都以英语为第一语言教我。当然,现在我想使用多种语言,我必须承认我对任何一种语言都没有掌握。这真的影响我的编程能力吗?如果是,怎么办?有什么解决方案吗?
28 skills 

14
新手寻求有关编程的一般建议[关闭]
需要你们中的一些人回想一下您可能不擅长编程的时代... 现在(作为软件开发人员)在我的新工作已经几个月了,已经过了试用期。几乎没有编程经验(仅C ++),并且目前正在使用asp.net MVC和silverlight。因此,有一个公司正在开发的网站,我正在努力使其变得更好,消除错误等。 问题是-通过Visual Studio了解已经建立的系统/网站。我总是感到非常不知所措,从不知道我应该看这行的哪一部分,并且通常在了解全局时遇到很多麻烦。我发现Visual Studio本身很难掌握,更不用说asp.net框架了。 我给人的印象是,因为我的同事比我更有经验,所以他们得到了所有好的工作,而我却只能做些废话-这些工作甚至都不是模糊的编程。意味着他们在学习/创造更多,而我在学习/创造几乎没有。我越来越沮丧,什么也不想说。 我并不愚蠢,我已经阅读并实践了许多基本的编程概念……我只是被该死的框架所吓倒。我看着它,只是感到瘫痪。 结果是我一直在问老一辈的老家伙,他很生气,宁愿给我轻松/无心/非编程的工作,以避免浪费时间帮助我。然后,当我听不懂某些内容时,我会犹豫是否要问他,并试图确定是否会浪费时间。 我是那种慢慢地整理东西的人,但是对细节非常关注。我认为前者使我显得无能。 有人到达我的家乡,请说些有用的信息。...我害怕在几个月内失去工作或其他原因...

5
敏捷和ISO 9001可以很好地交互吗?
关于精益软件开发和ISO 9001所涵盖的实践之间的关系的学术论文很少。大多数文章说,这些方法之间的差异很大,但也有一些观点指出,这些概念可以互补,并且同时使用这两种方法可以获得更大的收益。方法。 从学术上讲它非常漂亮,但是实际上它是吗? 所以这是一个问题:您是在将敏捷作为ISO 9001的公司工作还是在公司工作?你的看法是什么?真正好的是什么,什么不合适?
28 agile  lean  iso 

18
为什么公司不购买开发商娱乐工具?[关闭]
很多时候,当我对发展感到厌倦,而我的思想(在家里)对我没有任何帮助时,我只是做些有趣的事情,我的思想就可以腾出更多的时间来解决问题,并且可以解决问题。但是,当我向经理推荐这种技术作为提高开发人员生产率和效率的技术时,他拒绝接受工作不是娱乐的理由。我认为这个公式对我有用。其他开发人员也是如此: 2 hours of productive work + 30 minutes of entertainment > 3 hours of dull work 为什么公司不相信它? 更新:我不知道为什么这已经关闭作为题外话。如果您觉得这很重要,请投票重新打开它。

13
我们团队的色盲成员
我的团队非常依赖于代码中的颜色来概述需要使用的功能(我们为需要注意的代码行加色)。我们有一个色盲的密友,想加入我们的团队。在不使用颜色的情况下,我们能做些什么来突出需要满足的需求?我们的团队中大约有25个人都习惯了线条着色系统,我们发现它是最有效的。
28 teamwork  color 

3
为什么C ++模板错误消息如此恐怖?
C ++模板臭名昭著,因为它会生成冗长且无法读取的错误消息。我对C ++中的模板错误消息为何如此糟糕有一个大致的了解。本质上,问题在于直到编译器遇到模板中某种类型不支持的语法时才触发错误。例如: template <class T> void dosomething(T& x) { x += 5; } 如果T不支持该+=运算符,则编译器将生成一条错误消息。而且,如果这种情况发生在某处库的深处,则错误消息可能长达数千行。 但是C ++模板本质上只是一种编译时鸭子类型的机制。C ++模板错误从概念上讲非常类似于动态语言(例如Python)中可能发生的运行时类型错误。例如,考虑以下Python代码: def dosomething(x): x.foo() 在这里,如果x没有foo()方法,Python解释器将引发异常,并显示堆栈跟踪以及非常清楚的错误消息,指出问题所在。即使直到解释器深入某个库函数内部才触发错误,运行时错误消息也仍然不像典型的C ++编译器所发出的不可读呕吐那样糟糕。那么,为什么C ++编译器无法更清楚地指出出了什么问题?为什么某些C ++模板错误消息从字面上导致我的控制台窗口滚动5秒钟以上?

10
习惯于静态语言的程序员如何应对缺少Javascript工具的问题
在我的大部分职业生涯中,我几乎都是使用编译语言(尤其是Java)进行编程的。关于Java,我最喜欢的事情之一是当使用Eclipse之类的工具时,您的生产率如何,实际编写的代码很少。 您可以: 轻松自动地重构您的方法和类 立即查看调用方法或使用常量的所有位置(Open Call层次结构/显示引用) 静态类型意味着您可以使用代码完成来显示对象上可用的所有参数/功能 按住Control键单击函数/成员/类名,直接进入其定义 所有这些功能使我觉得IDE是我最好的朋友。编写Java代码,尤其是了解其他人的程序变得容易得多。 但是,越来越多的人要求我使用Javascript,到目前为止,我的经验一直很消极。 特别是: 没有立即找到函数入口点的方法(纯文本搜索除外,纯文本搜索可能会导致随后在调用层次结构之后进一步搜索方法,而其中两到三个您忘记了从哪里开始) 将参数传递给函数,无法知道该参数上有哪些属性和函数(除了实际运行程序之外,导航至调用该函数的位置,并使用console.logs输出所有属性可用) 匿名函数通常用作回调,这经常导致混乱的代码路径,从而使您无法快速浏览。 可以肯定的是,JSLint在运行时会捕获一些错误,但即使那样,也不如直接在浏览器中的代码下具有红色波浪线那样方便。 结果是您几乎始终需要把整个程序放在脑子里。这极大地增加了编写复杂程序的认知负担。所有这些需要担心的额外东西,在我的大脑中为实际创造力和解决问题的空间减少了。 当然,将对象放在一起而不是编写整个正式的类定义会更快。但是,尽管程序可能会更容易些,编写起来更快,但以我的经验来看,它们却很难阅读和调试。 我的问题是,其他程序员如何应对这些问题?显然Javascript越来越流行,我读的博客都是关于人们如何使用Java的,而不是拼命尝试寻找解决这些问题的方法。 GWT允许您改为使用Java编写Javascript环境的代码,但它似乎没有我所期望的被广泛使用。实际上,人们似乎更喜欢Javascript用于复杂程序。 我想念什么?

6
有没有一本规范的书可以作为经验丰富的开发人员学习Java?[关闭]
在过去的5/6年中,我一直是.NET开发人员。我从来没有做过任何专业的Java开发,而我上一次真正接触它的时候大概是在大学里。我一直在玩Scala语言,但是一点也不认真。最近,已经为我提供了执行一些很酷的工作的机会,但是我使用Java而不是.NET。我认为我可以通过目前的技能熟练使用,这意味着我已经知道如何编程,并且熟悉C#和C ++等语言。因此,语法和所有这些语言内容确实不是问题。我需要一本非常好的参考书和一本有关如何用Java进行思考的书。每种语言/框架/堆栈都尝试以某种方式解决问题,并且我确信Java也不例外。 有哪些您不能没有的精彩Java书籍?是否有关于Java最重要部分的书籍必须首先理解? 附带说明,我将主要进行Java Web开发。关于持久性,框架,服务器等使用什么类型的东西,并不是真正100%的。
28 java  books 

9
为什么Scala没有用C或C ++实现
有人知道为什么Scala是用Java和.NET而不是C或C ++实现的吗?大多数语言都是用Cor C ++实现的(例如Erlang,Python,PHP,Ruby,Perl)。除了允许访问Java和.NET库之外,用Java和.NET实现的Scala的优点是什么? 更新 如果用C来实现,Scala不会获得更多好处,因为它可以进行更好的调整而不是依赖JVM?
28 java  c++  .net  c  scala 

22
为什么要学习十六进制?[关闭]
那天我上了很多入门编程课,主要目的是让我对所发现的每种不同类型的编程有所了解。毫不奇怪,几乎每个类都以相同的格式运行:硬件简介,软件简介,然后进入实际编程。尽管了解硬件和软件的工作原理非常重要,但我始终对每门课程都涉及的一个主题感到困惑。 在我发现的软件介绍部分中,他们总是很着重于以二进制,十六进制甚至八进制数进行识字。我知道了解这些东西是什么,以及计算机如何解释它们是很好的,但是我从来没有发现自己真的需要知道如何读写这些数字系统。确实,我唯一见过的东西不是base 10,而是CSS中的颜色,如果您使用www.colorpicker.com之类的颜色,这会更加容易 我是否只是对编程世界中这些非基数10的数字系统的精彩用法一无所知,还是将这些部分纳入所有编程教科书中的古老传统?有没有人有一个很好的例子说明普通程序员实际在哪里使用八进制数?

4
是否在某处有白痴的软件许可指南?
基本上,除了开放源代码和封闭源代码存在的事实以外,我对这个问题的了解还不是很多。 我是一名Web开发人员(丝毫不是设计师),所以我在网上寻找图标之类的东西。我一直是这些图标的忠实拥护者,这些图标具有知识共享署名2.5许可证。据我所知,该许可证说“只要您在某处有指向我的链接,就可以对他们进行任何操作 ”。这个假设正确吗? 就在今天,我发现了一个新的图标集,其许可证更加混乱(在此处找到),说实话,我不知道是否可以使用它们。 目前,我只想将它们用于可能永远看不到的玩具,但后来我的源代码存储在Github上,将图标存储在可公开访问的位置是否合法? 如果我把它们放在我的个人网站上,上面可能有广告,使我时不时地赚五美分,那合法吗? 如果我在向用户提供免费服务的网站上使用它们,那合法吗? 如果该网站然后开始赚钱(通过之类的付费订阅),或得到由某人(可能性很小但有一天可能)买下了是那个合法的吗? 是否有一些新手指南可以解释所有这些内容,因为我不希望现在开始使用这类内容,而只需要稍后对其进行更改。即使我购买了这些图标,仍然存在我不了解的许可问题!:( 而且这类东西越来越频繁地弹出...
28 licensing 

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.