软件工程

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

22
标识符中的空格曾经是惯用的吗?[关闭]
C#风格建议在标识符中使用CamelCase来分隔单词。Lisp传统建议使用破折号代替。 是否曾经有一种编程语言,其中不仅允许在标识符中使用空格,还允许在使用多字标识符时使用一种常用的习惯用法? 在某些Scheme实现中可能有带空格的标识符,但这并不是一种普遍的做法。这是一个例子: Petite Chez Scheme Version 8.4 Copyright (c) 1985-2011 Cadence Research Systems > (define |hey there| 100) > (define |x y z| 200) > (list |hey there| |x y z|) (100 200)


13
让应聘者写一个链表实现是不好的面试做法吗?[关闭]
通过阅读本网站和SO,我看到了许多关于采访问题和答案的故事,这些故事都说候选人必须从头开始实现链接列表。通常,这是对候选人编程(例如编写FizzBu​​zz)进行的“技巧”练习。这个想法是,如果候选人不能做到这一点,他们就不能编程,应该几乎立即被拒绝。 但是,由于以下原因,我不禁认为这可能是一个不好的做法: 诸如C#和Python之类的现代高级语言在本地广泛使用列表。仅在特殊情况下甚至可能不明智的情况下,才需要编写自己的链表对象。 像C ++这样的低级语言具有带有迭代器/列表容器和对象的标准库。 根据前两点,编码人员可以花很多年甚至不用考虑自己实现列表(链接,双向链接等)。自大学时代以来,有些人甚至可能还没有真正看到过这种东西。 计算能力也不是几年前的因素,因此通过指针进行的效率不是(通常)曾经存在的问题。 一个简单的网络搜索,例如“链表示例”,将带来大量代码示例,这些代码示例只能被记住并吐出来,而不能真正表明申请人的真正能力。 我应该说,使用链表引发对候选人的问题解决能力/批判性思维能力的开放式提问/讨论最有可能是一种非常好的面试习惯。面试官可以通过任何方式真正看到申请人的身分,以及他们认为如何从中受益。 我认为对于在台式机或Web应用程序上工作的程序员来说,这种“无链表代码,无工作”的二进制方法有点过时了。这也可能非常有害;如果一个候选人不记得如何正确地处理列表的开头,那么他本来就是一个出色的编码人员和同事,但却迷失了自己。有什么想法吗? 编辑:有很多(好)评论表明这是一个要问的好还是坏的问题,取决于工作的上下文。我完全同意,所以让我改一下这个问题:对于许多编码工作,实现链接列表是常见的面试问题,类似于FizzBu​​zz之类的问题或编写用于计算阶乘的递归函数的问题。这个问题是否具有足够的实用性,可以普遍用于全面评估编程候选人?还是应该问一个不好的问题,除了“高级开发人员,嵌入式链表团队”职位以外?

7
SQL触发器以及何时或何时不使用它们。
当我最初学习SQL时,总是被告知,只有在确实需要时才使用触发器,并尽可能使用存储过程。 不幸的是,现在(几年前)我并不像现在这样好奇和关心基本面,因此从未问过为什么。 社区对此有何看法?仅仅是某人的个人喜好,还是应该避免触发(就像游标一样),除非有充分的理由。
43 sql 

6
多次哈希密码是否更安全?
我读过几次书,存储密码时,对字符串进行“双散列”是一个很好的做法(例如,使用md5然后使用sha1,显然都使用了盐)。 我想第一个问题是,“这实际上正确吗?” 如果不是,那么请忽略此问题的其余部分:) 我问的原因是,从表面上看,我会说这是有道理的。但是,当我考虑它时,每次重新哈希(可能添加了一些东西)时,我所看到的就是最终“唯一性”的上限减小了……该界限与初始输入。 让我换一种说法:我们有x个字符串,这些字符串经过哈希处理后减少为y个可能的字符串。也就是说,第一组中有碰撞。现在从第二组返回到第三组,是否不可能发生同一件事(即,所有可能的“ y”字符串组中的冲突导致第三组出现相同的哈希)? 在我的脑海中,我看到的只是每个哈希函数调用的“漏斗”,将无限的可能性“漏斗”到有限的集合中,依此类推,但是显然每个调用都在它之前的有限集合上进行,给了我们一个设置不大于输入。 也许有一个例子可以解释我的漫步?取'hash_function_a',它将给'a'和'b'哈希值'1',并将给'c'和'd'哈希值'2'。使用此功能存储密码,即使密码为“ a”,我也可以使用密码“ b”。 取'hash_function_b',它将为'1'和'2'提供哈希值'3'。如果我将其用作“ hash_function_a”之后的“第二哈希”,那么即使密码为“ a”,我也可以使用“ b”,“ c”或“ d”。 最重要的是,我知道应该使用盐,但是它们并没有真正改变我们每次将“ x”输入映射到“小于x”输出的事实。我不认为 有人可以告诉我我在这里想念什么吗? 谢谢! 编辑:对于它的价值,我自己不做,我使用bcrypt。而且我并不真正担心它对于“黑客”的“耗尽周期”是否有用。我真的只是想知道从哈希冲突的角度来看,该过程是否会降低“安全性”。
43 hashing 

3
“ Lambda the Ultimate”一词的由来和含义是什么?
几年来,我一直在纠缠于函数式编程语言,而我一直遇到这个短语。例如,这是“小计划者”的一章,该名字肯定早于博客。(否,该章无助于回答我的问题。) 我了解lambda的含义,匿名函数的概念既简单又强大,但是我无法理解在这种情况下“最终”的含义。 我看过这个短语的地方: 小策划人》第8章的标题 博客:http://lambda-the-ultimate.org/ 一系列“ Lambda the Ultimate X”论文:http : //library.readscheme.org/page1.html 我觉得我在这里缺少参考资料,有人可以帮忙吗?

10
原型与清洁代码的早期阶段
我正在计划/开始一些个人项目,这些项目最终可能会成为我的日常工作。这让我开始思考,应该从哪个方向开始? 只是原型-编写仅能正常工作的基本代码,这可能会花费我大量时间进行优化和重构,以便于轻松扩展。 从一开始就编写干净,优化和文档化的代码,请记住,如果过了一段时间它就不具有成本效益,它将被删除。 更新:将YAGNI与sunpech和M.Sameer的答案结合起来对我来说非常有意义:)谢谢大家的帮助。

8
单个配置对象是个坏主意吗?
在我的大多数应用程序中,我都有一个单例或静态“ config”对象,负责从磁盘读取各种设置。几乎所有的类都出于各种目的使用它。本质上,这只是名称/值对的哈希表。它是只读的,因此我不必太担心我拥有如此多的全局状态。但是现在我开始进行单元测试,这开始成为一个问题。 一个问题是您通常不希望使用与运行时相同的配置进行测试。有两种解决方案: 为config对象提供一个仅用于测试的设置器,以便您可以传递不同的设置。 继续使用单个配置对象,但是将其从单例更改为一个实例,您可以在需要的任何地方进行传递。然后,您可以使用不同的设置在应用程序中一次构造它,并在测试中一次构造它。 但是无论哪种方式,您仍然面临第二个问题:几乎任何类都可以使用config对象。因此,在测试中,您需要为要测试的类及其所有依赖项设置配置。这会使您的测试代码很难看。 我开始得出这样的配置对象是个坏主意的结论。你怎么看?有哪些替代方案?以及如何开始重构在各处使用配置的应用程序?

15
您可以同时担任经理和程序员吗?[关闭]
当您自己是编程工作人员的一部分时,要管理其他程序员。 这是一个非常普遍的计划,至少在我工作的公司中是如此。 如果您同时做这两个人,您能否成为一名优秀的程序员或一名优秀的经理? 我对一个人的有效性提出质疑,这个人必须扮演两个截然不同的角色,要求截然不同的技能,环境,专心,组织等。 更新:我的问题包括公司的管理(这是我的情况),而不是团队管理。但是我当然对这两者都感兴趣。

7
SOLID原则与YAGNI
SOLID原则何时会成为YAGNI? 作为程序员,我们始终在复杂性,可维护性,构建时间等之间进行权衡。在我看来,其中两项最明智的选择准则是SOLID原则和YAGNI。如果您不需要它;不要建造它,并保持干净。 现在,例如,当我观看SOLID上的dimecast系列节目时,我看到它开始时是一个非常简单的程序,然后结束时是一个非常复杂的程序(当然,在旁观者看来,复杂性也是如此),但是它仍然使我想知道:SOLID原则何时会变成您不需要的东西?所有坚实的原则都是可以使用户在以后进行更改的工作方式。但是,如果要解决的问题是一个非常简单的问题,并且是一个一次性应用程序,该怎么办?还是SOLID原则始终适用? 如评论中所述: SOLID原则 亚尼

10
LINQ和Lambda表达式的使用会导致代码可读性降低吗?[关闭]
我正在与Linq的同事讨论,我将在此处复制: 同事:让我们在这里诚实。Linq语法很烂。这是令人困惑和不直观的。 我:哦,比T-SQL更令人困惑吗? 同事:嗯,是的。 我:它具有相同的基本部分,选择,位置和来源 同事:对我来说,Linq是关系+ OO的混蛋。同事:不要误会我的意思-它功能强大,但是他们将SQL重新定位为使用agains对象集合。 我认为使用Linq + Lamda的功能非常强大(他同意),并且还使代码更易于阅读(他不同意这一点): pickFiles = from f in pickFolder.GetFiles("*.txt") where ValidAuditFileName.IsMatch(f.Name) select f; 要么 var existing = from s in ActiveRecordLinq.AsQueryable<ScannedEntity>() where s.FileName == f.FullName && s.DocumentType != "Unknown" select s; 或(此处为VB代码) Dim notVerified = From image In images.AsParallel Group Join verifyFile In …

20
您如何保持兴趣爱好项目的动力?[关闭]
我最初是从最喜欢学习的学生开始认真编程的,然后大约4年前开始实习,我一直在做一些小项目作为学习活动。虽然现在已经上学了,但我还是以软件开发人员的身份工作。我仍然很乐意在旁边进行一些项目,以了解我在工作中没有接触过的计算机科学领域,但是我注意到在主演IDE 8个小时后,仍然很难尝试退出。最近,只要有时间我愿意做一些事情,它就会被抛在一边。 当您花费大部分时间进行编码时,有人对坚持附带项目有任何建议吗?

19
您如何与非程序员分享您的技能?
有时我感觉自己像个音乐家,无法播放现场表演。编程是一项很酷的技能,并且用途广泛,但是很多事情发生在“镜头外”-在您的头上,办公室里,远离观众。 当然,您可以与其他程序员讨论编程,并且有对等编程,您确实可以创建可以向人们展示的内容,但是当涉及向非程序员解释时,您做了什么,或者如何做。您上班的日子有点棘手。 您如何让生活中的非程序员了解您的工作? 注意:这不是让非程序员了解开发过程的重复,因为该问题与管理客户期望有关。

10
是否有任何理由使用“普通旧数据”类?
在旧版代码中,我偶尔会看到只不过是数据包装器的类。就像是: class Bottle { int height; int diameter; Cap capType; getters/setters, maybe a constructor } 我对OO的理解是,类是数据的结构以及对该数据进行操作的方法。这似乎排除了此类对象。对我而言,它们无非是structs一种失败的面向对象的目的。我认为这不一定是邪恶的,尽管它可能是一种代码味道。 是否存在这样的对象必要的情况?如果经常使用,是否会使设计令人怀疑?

7
您怎么称呼一个函数,其中相同的输入将始终返回相同的输出,但也会产生副作用?
假设我们有一个正常的纯函数,例如 function add(a, b) { return a + b } 然后我们对其进行更改,使其具有副作用 function add(a, b) { writeToDatabase(Math.random()) return a + b; } 据我所知,它并不是纯函数,因为我经常听到人们称纯函数为“无副作用的函数”。但是,就其对于相同输入将返回相同输出的事实而言,它的行为确实类似于纯函数。 这种函数类型是否有其他名称,是未命名的,还是实际上是纯函数,而我对纯函数的定义有误?

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.