高级程序员关于始终使用书籍的建议是一个好主意吗?[关闭]


53

我是初级开发人员,仅从事该行业5年。在我目前的公司中,有一位资深人士称他为Infestus。有时,我有机会从头开始发光并做一些全新的事情。

最近的一个例子是我必须在多线程应用程序中创建一个单例。我决定使用这种方法。当Infestus看到它后,他很快就称我为愚蠢的人,并告诉我使用这种方法。在问他为什么他只是为了更好而放弃时,这就是这种情况,这本关于Java的书说它更好。

这是一种常见的模式:每当我有机会做新的事情时,我都会很快被Infestus击落,而他的方法更好的唯一原因就是这些书是由著名的程序员编写的。他总是试图给我读书,以便我可以“学习”编程的方式。

我仅仅花了5年的时间来编写程序,但是只是盲目地遵循有关解决问题的最佳方法的书总是一个好主意,还是我应该不时尝试进行尝试?来自Infestus的抱怨声不断,开始使我从不尝试任何新事物并遵循书中的示例。

编辑:我完全迷路了。是的,我知道盲目跟随任何东西都是一个坏主意。但是这位看起来像上帝的程序员Infestus似乎了解很多,他告诉我,正确编程的唯一方法是看书,然后将所有内容都记到T。他强加的所有规则都是书中所写的,所以我只是想知道如果书是唯一正确的方法。

编辑2:Infestus不是我的老板。他只是负责审查代码的高级开发人员之一。而且,他在评论后的大部分评论都是由书名组成的,这种方法是错误的。


100
下面是什么一味一个好主意?
FrustratedWithFormsDesigner 2013年

16
盲目跟随任何东西都是一个坏主意,但不要让“ Infestus”使您在书本上感到讨厌。阅读书籍是超越自己的舒适区并扩展编程技能的最佳方法之一。
Kyralessa 2013年

21
听起来好像长者可能知道他为什么要遵循这些解决问题的特殊方式-但也许不想花时间向您解释原因,而只是将您指向可以说明问题的资源。您阅读过他指导您的资源吗?他们是否解释了为什么选择了选择的解决方案?
Joris Timmermans 2013年

28
5年后,您不再是大三了,您知道吗?Infestus知道吗?
iluxa

25
...brushed it off as this is better and that's how this and this book about java says it is better. 这应该立即发出警报。如果Infestus无法为您提供独立的解释,则他本人可能不理解。(或者他需要一本《不良论点插图集》的副本。)
Blrfl 2013年

Answers:


87

您将在整个职业生涯中遇到这样的程序员。自己进行实验和学习没有错。当然,书很好。这些示例通常在干净的环境中工作,但是如果您是另一家公司的开发人员,那么就没有干净的(不受他人干扰)环境。

知道如何以“正确”的方式做事总是很高兴,但是意见每年都在变化。因此,请学习。充分利用高级开发人员的能力,将其与您自己学习的知识相结合。最终,您将成为高级开发人员,并将从这些经验中学习并教给初级开发人员。

只是不要混蛋。


65

他是否真的称您为愚蠢,还是只是鄙视代码?称任何愚蠢的东西都是不明智的,但这不会使建议无效。我认为Infestus提出了有价值的建议,将来您应该认真考虑他的建议。他似乎读了很多书,至少在这种情况下,他的见解广博。同步既昂贵又棘手。他建议的实现比您的实现更高效,更简单,并且可以保证正常工作。

他总是试图给我读书,以便我可以“学习”编程的方式。

他真好 他正在积极地帮助您,但您似乎在让自我妨碍。不要亲自批评您的代码。代码价格便宜,易于更改。如果有人向您展示了一种更简单的操作方法,请感谢他们。

是的,阅读将使您成为一个更好的程序员。我认识的所有专家都广泛阅读。如果您阅读不多,那么您充其量是平庸的,在接下来的五年中,您可能会发现自己已不再适合销售。


6
您提出了一个很好的观点,并且链接到的文章也很有趣,但是它清楚地表明,在最后,双重检查锁定不适用于JDK 1.4和更早版本(对于那些JDK的内存模型)。从JDK 1.5及更高版本开始,只要保存实例的字段声明为volatile(在OP链接的示例中就是这种情况),它就可以工作。
Shivan Dragon 2013年

4
谢谢您的建议:)是的,每当他真的对代码感到生气时,他的确会叫我愚蠢(有时是疯狂的)。我的自我接受并不仅仅是接受他的答案,而是他试图将其推向我的喉咙以及他为我和我的代码使用的名字的方式,但这是一个不同的故事。但是,很高兴知道书籍确实提供了见解:)
Quillion

6
@Quillion-就我个人而言,我不会忍受他的名字叫。听起来您已经厌倦了一切。我会认真考虑与您的经理讨论这个问题,甚至可能是人力资源。生命太短了,无法忍受别人的虐待。
webdad3 2013年

2
@Quillion-没人应该那样对待你。我不在乎他们是谁。永远记住,每个人都是可以更换的。我会认真考虑先与Infestus交谈,然后再与您的经理交谈,再与HR交谈。如果您不满意,请继续前进。相信我,您会发现另一群人。
webdad3 2013年

1
Infestus对他认为深刻的丑陋产生了情感上的反应。也许有人会请他控制自己,从而使他受益。
凯文·克莱恩

22

读书不应该是盲目的:作者在介绍本书时应该尝试说服您他/她的方法的优点。对于您的上级,将您指向一本解释他偏爱的方法的书是合理的,而不是要求他自己解释:尽管他应该能够在不依靠该书的情况下解释自己偏好的好处,但这也是重复的工作,该书的作者已经完成。

因此,请阅读本书,看看本书的作者说了什么,如果它使您感到困惑,或者您想确认自己的理解,或者您不同意,请与您的上级讨论,但是现在您可以能够进行更有成效的讨论。


我会同意的。如果一本书的作者无法解释他们所谈论的方法的优点,那么阅读该作者的书的人将如何做到这一点,因此必须做到以下两点之一:确实存在,并且读者根本不理解它,或者不存在解释,因此读者应尝试找到该方法的解释。由于我们是在讨论一个特定的主题,因此只有一种有效的方法可以解决这个问题,因此肯定必须存在一种解释。换句话说,我同意您的回答。
Ramhound 2013年

17

任何健康关系的三个关键要素。沟通,诚实和信任。这关系到所有关系,甚至是工作关系。您应该与主管讨论这些问题。

如果您不理解他主张某种设计的原因,请告诉他。告诉他您还没有读过这本书,并且您想了解为什么他的做法更好。关键是您应该尝试了解他的处事方式。

我认为您也应该更加尊重这个人。在您的脑海中,您称呼他是贬义性的名字,并批评他对待您认为的“学习”方法。注意这一点。另一方面,您确实说过他称您为愚蠢。那不是很酷,你应该告诉他,称呼某人为愚蠢并不酷。

想法可能很愚蠢。我们所有人都会犯错,错过一切,甚至是高年级的人。当设计中存在缺陷时,最好的问题是“为什么要这样做?在情况X,Y,Z处不会破裂吗?设计B不会更好吗?”

请记住,您正在与其他人一起使用此软件。这是一项很难学习的技能。不必从头开始编写任何东西都没关系,通过使代码成为最好的代码,总是有闪耀的空间。

“最佳”常常意味着可读性可理解性。我们程序员花大量时间阅读别人的代码。如果该代码清晰易读,那么这将使该代码真正有价值。我们学习编写出色代码的方法之一是阅读大量优秀代码。您通常会在书本中找到非常好的代码。因此,阅读一两本优秀的编程书籍可能会使您成为更好的程序员。


实际上,我确实认为他的技能是敬虔的,并且值得尊重。但是,对任何新事物的严厉批评都开始使我不敢尝试新事物并坚持使用书本,是的,他很庸俗。
Quillion

6
新的并不总是好的,而旧的并不总是坏的。如果他批评一个主意,就要求知道为什么。总是问为什么。“因为书上这么说”还不够好。另一方面,阅读本书后,他很有可能具有更广阔的视野。您还应努力扩大自己的视野,以至于可以根据自己的优点对设计进行论证。
古斯塔夫·贝特拉姆2013年

2
不要以为任何人都敬虔。你不能总是依靠他。将他视为具有更多经验的同龄人。如果您像对待上帝一样对待他,您就会卖空自己,您将永远不会受到尊重。
webdad3

7

在您工作的公司中,可能是。这就是他们要求您做的。

这位工程师Infestus告诉他们“这是写在书中的,这就是原因”,在教育初级开发人员方面做得很差。他不是传教士,是工程师,他应该能够分解并提出概念,以便大三学生可以从他的经验中学习。

我鼓励您与公司中知识渊博的开发人员交谈,向他们询问有关不同编程技术的优缺点等问题。这连同阅读书籍和博客(我建议使用Joel on Software-仅Google,这是必须的)应该给你更好的理解。


4

恕我直言,这里有两个方面,您应该分别处理:

  • 这个家伙是个混蛋,称呼您的名字之类的事实,仅仅是因为他可以(他是高年级,您不是,如果你们中的一个抱怨另一个,他会从怀疑中受益),恶霸般的行为,而且很糟糕。

尽量不要屈服于他的水平。不要试图欺负他,也不要告诉老板或其他任何东西。尽最大努力忽略他的行为的这一方面,请记住它变得太极端了(即,如果它影响您的工作效率等),您应该对此采取一些措施。

  • 他告诉您您的代码不好(以及如何正确执行)的事实。老实说,根据您的描述,忽略了他的语气,这方面的行为还不错。您可以更快地学习,并在有经验的人纠正您并告诉您不仅做错了事,而且告诉您如何做对事的情况下,在适当的背景下查看它们(与仅自己学习所有内容相比)来自个人试验/错误实验等)。

很多次我让某个人纠正了我最初认为的“我的完美代码”,只是让那个人告诉我该怎么做才感到沮丧,后来才意识到他一直是对的,我的版本很糟糕,他的是好,感谢上帝,他看到了!:)因此,我学会了淡化我最初的冲动:“嘿,你不告诉我怎么做,先生!” 相反,每次有人纠正我时,我首先都会客观地重新检查我的代码,然后再检查他的代码,并确保他的观点不正确,这是我做错了。如果是我的错,我要感谢他的帮助,并确保我真的了解他的解决方案的工作原理(而不仅仅是复制/粘贴它)。

嘿,有时候我确实发现所提供的更正实际上比我最初所做的更糟,在这一点上我尝试与另一个人讨论所有这些。老实说,我注意到没有什么比别人在犯错时能接受改正更能赢得别人对你的尊重的了,但与此同时,不要害怕说你是那个人鉴于您可以立即证明您的肯定是基于一些实际的研究,而不仅仅是自我,因此您认为正确的人是对的。

在这一点上,我认为您应该真正尝试和该人讨论他的建议,您的建议等等。向他展示您的想法,解决方案的方法以及为什么您认为它比他的要好(诚实和客观地认为是)。或者,如果您发现他的主张比您的主张更好,请告诉他,对您的帮助表示感谢。这可能会重建一些烧毁的桥梁。


1
我完全同意你的意见:)并且我确实会无视他的语气,并且总是试图贬低我,因为我猜这是他的性格。但是最让我困扰的是,他会告诉我我的代码是错误的(我不介意),然后与其尝试向我解释他会给我一本书并告诉我的错误方式,在尝试编写愚蠢的代码之前先阅读一下。那就是让我质疑书是否能回答所有问题的原因,因为半数的时间,当我阅读这本书时,它并不完美地适用于眼前的情景。
Quillion

好吧,是的,我明白您的意思了,但是这一切实际上取决于这本书以及他的推荐方式。例如,如果他说“你做得不好,去读一些编程书”之类的话显然是不好的,但是如果他说“有效的Java 2nd Edition提供了一个更简单更好的Singletons示例,请在此处查看。 safaribooksonline.com/book/programming/java/9780137150021/… “然后,我想说这对您是有帮助的(再次,
不用

我永远不会“忽略”这种行为。如果我已经告诉过他叫喊叫不会飞的话,要么和他的老板坐下来,要么跳过与他的老板交谈。
钻机

3

自己尝试并学习所有可能的知识。阅读了足够多的书后,您会发现有很多关于特定主题的书,它们可能彼此矛盾。尝试您认为最好的选择,如果有时间或想要比较/对比,请尝试两种选择。

与老板打交道是完全不同的主题和方法。如果我希望某人按照书中的确切方式做某事,我会告诉他们。那就是我,因为我不与思想读者联系。您的老板养成了习惯,问一个新项目时问他是否推荐任何书籍或参考资料。

无论您做什么,都不要停止从事新项目。我知道我们所有人都很容易就如何处理这种情况提供提示,这些提示可能会也可能不会奏效,但是您是必须忍受它并遭受负面影响的人。您会变得更好,但这通常是由于在新事物上编写了更多代码,从成功和失败中学习而来。


3

盲目跟随书本不是一个好主意,但完全跟踪和盲目地读书有区别。

当你想了解的东西在书上,它通常适当严格地遵守它在第一,当你得到一个感觉什么它试图教给你。奇怪的是,完成后您仍然不了解所有内容(通常是这样的事情),但是一开始完全照着书会为您提供一些可以尝试的东西,因为您会尝试理解自己的问题。再次可能,您会发现与书中所表达的观点不一致的方式,但是您将了解该书试图解决的问题,以便在编写自己的代码时可以以您自己的方式(或者至少部分以他们的方式)解决这些问题,而不是仅仅留待以后再咬这些问题。

另一件事不是Java固有的,但是在该社区中却特别常见。我想我可以猜到您在谈论哪些书,它们构成了Java社区词典的主要部分。当您需要了解找到的其他Java代码时,对它们及其描述事物的方式的了解将大有帮助。这本身就是一项宝贵的技能。


3

阅读书籍和博客文章对编程非常有帮助。有一些书,所有开发人员都应该阅读。

但是,书籍并不是学习不同编程概念和技术的唯一来源。如今,基于视频的按需培训变得非常流行。您可以检查Pluralsight,它为专业人员提供了高质量的培训。

实际上,如果您只阅读没有帮助的书。除了阅读,我们还需要做其他事情。您可以在此处找到更多详细信息。


基于视频的培训,基于教室的培训或仅阅读源材料。最后,他们都共享一件事,您阅读(或收听)新代码,并听/读采用该方法的原因的说明。
Ramhound

2

您应该问他您的方法特别有什么问题。如果他无法清楚地回答,您可能会确定这只是一个普通人,喜欢上乘。


1
他的技能和编写的程序确实表明了他在编程方面的优势。然而,他为什么要做某种特定方式的大多数理由总是与著名作家的书联系在一起。但是我并不在乎他对我的感觉,而是想知道书籍是否真的是成为一个好的程序的最好方法,以及是否应该像相信一个宗教人士相信圣经那样去信任它们。
Quillion

您绝对应该知道为什么选择一种方法而不是另一种方法的原因。出于您所理解的理由,必须找到合理的解决方案。否则,您的(高级)技能不会变得更好。您可以从书本中获得想法,但想法是重要的,而不是在何处或由谁呈现。编程不是宗教:)。
风土

1
是的,不要被他吓倒。听起来他可能是一个非常优秀的程序员,但在领导和教学方面却不那么出色。
犯罪

@Quillion-成为一名优秀的程序员的唯一方法是通过大量阅读,阅读书籍(或任何其他来源)来做到这一点,您可以在阅读时实际编写代码。您甚至读过有问题的书吗?您必须确定代码的作者是否值得倾听,一个声称拥有Java 20年经验的作者是一个很好的倾听者。这意味着他有机会与实际的Java开发人员讨论某些主题。如果要写一本有关Java的书,我会去研究的源头,并用我的经验来解释这个话题。
Ramhound 2013年

@Ramhound是的,我必须阅读他给我的书。是的,我同意他关于某些主题的书。但是,我在他推荐的书中发现的问题是,它们描绘了一个完美的世界,其中所有代码均已正确完成,而另一半时间,他们感到有些过时了。但是,他不断向我发送垃圾书,以阅读和捍卫他所有的论点,而不是试图向我解释,这让我开始思考,也许书不是最好的来源。但是似乎它们是,我将进一步研究它们。
Quillion 2013年

2

关于书籍的问题是,它们(大多)通过了修订,从而有更好的机会发现不良做法和误解。同样,“大牌”是有经验的人,他们依靠善于赚钱来赚更多的钱来卖书,因此,对他们所说的内容有一些最低限度的质量保证。

就是说,阅读书籍,论文和其他资料来源,当然是在得到实践的证明之后,可以成长为一名专业人士的好方法。因此,阅读这些书籍(即使是Infestus推荐的书籍)对您也有好处。但是,由于几乎总会有其他方法来解决相同的问题,因此这些书必须主要扩大您对该主题的理解。

关于“我自己走”的方法,重点是:您能否坚持自己的观点?您如何证明您的解决方案比其他任何解决方案都要好?有时您可以自己设计出色的解决方案,但是,与其他已知解决方案相比,您必须能够说出自己的更好的原因,因为其他解决方案至少对他们有用。然后,要富有创造力和周到,但最重要的是要有效。

如果是的话,我会读那些书的。通过给您更多的论点,这将对您有所帮助,同时,您可能会发现Infestus-也许-错误地将这些书作为论据,但尚未被发现,因为没人知道这些书的内容。否则您可能会发现他实际上是


1

我的经验是,当关注编程主题时,与在互联网上搜索相同的主题信息相比,书中带有适当解释的信息的质量和表示要好得多。互联网通常缺乏适当的解释,上下文和质量。

互联网上所述信息的数量更高。

因此,我的总体策略是从书本上学习,以加深理解,然后从互联网上学习,以接触到不同的影响并扩大我的经验(并且经常看到如何不做东西)。


1

我将研究每种方法的优点并做出您自己的判断。如果您认为您的方法更好,请与Infestus讨论,直到一个人说服另一个人。如果您无法达成协议,则可以征求第二意见,也可以只是接受Infestus的方法,具体取决于您对此的感觉有多强。

在单例的情况下,您可能会反对枚举方法的一个论点是枚举不能扩展类。我经常这样写代码:

public class DateSerializer extends AbstractSerializer<Date> {
  public static final DateSerializer SINGLETON = new DateSerializer();

  private DateSerializer() {}

  public byte[] serialize(Date date) { ... }
}

枚举不能做到这一点。由于枚举方法并非在所有情况下都有效,因此您可以争辩说,为了保持一致性,即使不需要extends子句,也应避免使用它。

可以反对使用枚举的其他一些参数:

  • 这是一个hack-它使用枚举来代替他们不想要的东西
  • 这让以前从未看过的读者感到困惑

嗯...为什么要将日期序列化器实现为单例呢?如果它是无状态的,则您希望实例化它很便宜,并且拥有多个实例应该不是主要问题。如果它不是无状态的,那么就必须使其同步,并且有可能成为瓶颈……
Stephen C

@StephenC对于无状态类,当允许多个实例满足时,这似乎很奇怪,这有什么好处?一个想到的有状态单例是packrat解析器-您可能有几个扩展AbstractParser的单例类。的确,如果要并行解析,则需要同步,但是共享备注状态很重要。
Daniel Lubarov 2013年

相反,它似乎很奇怪,我认为你会不屑与单身人士和从他们出现,如果你不需要的复杂性。在我看来,最简单的方法是创建,使用和丢弃“变压器”对象……除非有很强的理由/动机要重用它们。
Stephen C

1

我在很大程度上依赖书籍作为知识的来源-这些是很好的基础,我认为Infestus是对的,因为您应该在业余时间消费大量书籍,因为它们可以真正提高您的技能。虽然我认为您应该消耗书籍,但并不是唯一的信息来源-参加本地用户组,​​将相关的技术新闻通讯发送到收件箱,阅读博客。

但是,我不同意这样的说法,因为它是在书中以某种方式编写的,所以这是必须完成的方式。是的,书提供了很好的建议,它们是由专家撰写的,并且经过专家的同行评审,但是我参与了一本比较简单的书,我可以告诉你,通常至少需要两年的时间才能完成书的编写,编辑和发行。技术的变化步伐迅速,两年前的建议可能不再是今天的正确建议。通用主体通常经受时间的考验,但是优化特定活动可能会因新硬件或新软件版本而无效。

要求Infestus与您一起进行建议的建议是一个很好的建议-走开,阅读所有内容,然后返回一些您已经尝试为自己解决/解决的沉思问题以及支持您的证据方法。

有一个问题是,五年后您是否还仍然是大三学生。对我而言,衡量某人是否为大三的关键指标不是多年的经验,而是他们需要多少勺子喂养。我希望中级开发人员能够相对自给自足,是一个深思熟虑的知识资源使用者,他们可以据此采取行动并将其扩展到他们所处的位置。他们还应该处于可以开始初级教学的阶段,因为他们对主题有深刻的了解,以便他们可以清楚地解释事情。另一个核心能力是信心-如果您已经完成工作,阅读内容并制作了体面的东西,请不要担心在初审法院辩护,因为初中需要验证,开发人员需要达成共识。


1

抛开工作场所的举止,抛弃高级开发人员所扮演的导师角色的现实,抛弃自己的探索欲望,抛弃侮辱性行为以及抛弃书籍恋物癖...

团队中代码审查的目的是1)验证代码和2)确保编写代码的人理解代码改进背后的含义。这里不是说“因为马丁·福勒(Martin Fowler)在GoF书中这样说而改变”的地方。但是,这里是说“因为[简要说明]而更改此内容;在GoF书中有更详细的讨论”。

如果您的高级开发人员没有(至少简单,巧妙地)提供更改说明,并坚持使用“因为[book]”一语,那么他就是个聪明人和混蛋。你如何解决?在团队会议上以口头形式提及该问题,并请您的队友提供一两个陈述,以简要说明更改的优点或必要性以及该参考书。请务必感谢他提供的参考书。

面对现实,您的目标是欣赏变更建议,而不会因工作或工作而灰心。告诉他 “如果您能在回顾我的代码时简短地描述更改的优点或必要性,我将不胜感激更改建议;因为这是我发现仅您的书籍参考书会有所动机。”

如果他继续拒绝对他的书籍参考资料提供简单的解释,或者如果您可以提供另一本书或业内知名度相同或更高的书而具有不同的见解,并且符合您的情况,那么您也许可以添加自己的书考虑到保留原始代码,请在您的评论注释中引用。这样做足够多次,他可能会退缩。要非常小心,反对的论点是正确的,而且更重要。让高级开发人员弄错了,但仍然可以按他的方式行事是可以的,这是我学到的,必须不断学习。


1

我想说,仅从书籍中学习编程是不可能的,但是好的书籍将为您带来巨大的推动力。这就像空手道-您不会只阅读黑带;)我相信在这种特殊情况下,Infestus先生指的是Joshua Bloch的“ Effective Java”。这确实是一本关于Java开发的好书,如果您还没有的话,一定应该阅读。

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.