我提出的设计通常比同事的设计差-我如何变得更好?[关闭]


69

我从事编程已有两年了,在解决问题和创建中小型脚本方面通常都不错,但是,我通常不擅长以面向对象的方式设计大型程序。几个问题

  1. 最近,一位与我有着多年经验的同事正在研究一个问题。我在解决问题上的时间比他长,但是,他提出了一个更好的解决方案,最后我们将使用他的设计。这真的影响了我。我承认他的设计更好,但是我想提出一个和他一样好的设计。我什至正在考虑辞职。不知道为什么,但是突然之间,我感到有些压力,例如,大三学生会怎么看我等等?正常吗 还是我对此考虑太多了?

  2. 我的工作涉及使用Python编程。我尝试阅读源代码,但是您认为我如何提高我的设计技能?我应该学习什么好书或软件吗?

请赐教。非常感谢您的帮助。


9
@Oded:我认为OP的意义在于他们拥有与同事相同的工作年限,但是该同事可以提供更好的设计,OP希望知道如何变得更好,因此作为同事很好。我认为 ...
FrustratedWithFormsDesigner 2012年

34
@Oded:是的,他不应该在不投入10年的情况下就成为大师,但是,另一方面,如果他没有任何可学习的资源,那么那10年将不会对他有多大的帮助。 。他正在这里努力成长;我们不要劝阻他吗?
梅森惠勒2012年

6
您从其他设计中学到了什么吗?您可以将其应用于您遇到的其他编码情况吗?吸吮它,并从同事那里学到尽可能多的知识。提供午餐。
JeffO 2012年

17
我会坚持。如果您可以向同事学习,请这样做。不要让你的自我阻碍机会-如果你继续前进并最终与毫无教养的人一起工作怎么办。我有25年以上的经验,但是很高兴接受3岁的程序员的建设性批评(并尽我所能)。我与一个在最糟糕的一天比我在最好的时候表现更好的人一起工作,这两个方面的结果这些人比两年前我是一个更好的程序员。
mattnz

7
生活中的事实是,您总会找到比自己更好的人。不要让它让您感到沮丧,只是尽一切努力使自己变得更好。
maple_shaft

Answers:


69

我认为这是您技能的非常积极的信号。对于那些在团队中提出“更好”设计有困难的人来说,完全无法识别为什么另一个设计更好的人是更为普遍的。

您拥有两项真正的(非常出奇的)优势:

  • 您有能力客观地与他人评估您的设计
  • 您有愿望并付出努力使您的设计达到最佳

您只有几年的路程,任重而道远,但是凭着这种态度,您一定会实现的,只是不要放弃。我们都这样处理心理挫折。只要有机会,我都会喜欢插入设计原理(与设计模式不同),我认为这是将它们派上用场的完美示例。研究它们并练习将其应用到您的设计中,您将不知道在这方面迈出了新的一步。

归根结底,设计很困难。我们每天都在处理复杂的高层抽象,要凭空创建它们,使它们运行良好,并且易于同事使用是非常困难的任务。这需要多年的实践。

因此,抬起头来,请记住:那里有很多人无法评估两个设计,而实际上却认为一个设计比另一个设计更可取,您认为他们在创造好的设计上相处得如何?

编辑:
“另一条提示,在您掌握了一些原理并实践了一些原理之后,我认为这里还有另一个问题,这对于研究具有不同目的和规则的各种语言的价值是有帮助的:

理想情况下,每个程序员都应该从每个类中了解一种语言。您能学到什么:

  1. 静态类型的OOP主流语言:Java,C#(主要用于企业软件)和C ++(系统编程和复杂的桌面应用程序)
  2. 基于原型的OOP语言:Javascript(客户端Web编程)
  3. 程序语言:C(嵌入式软件和系统编程)
  4. 功能语言:Haskell,ML或Lisp(功能语言适合高度并行化的软件)。

逻辑编程语言(Prolog)在工业中可能没有那么有用,主要用于AI的研究中。

这将有助于扩大尝试设计解决方案时想到的各种想法。


2
+1如果可以理解为什么 s,那么他们就可以很好地进行出色的设计(特别是如果他们只有几年的经验的话)。
丹尼尔·B

22
  1. 对于多个人来说,提出不同质量的设计是绝对正常的。过去,我曾应邀来评判软件设计竞赛,所以我亲眼目睹了这一点:即使最简单的设计也导致质量差异极大的解决方案,这些解决方案都来自聪明和有经验的人。
  2. 读取源代码的层次太低,无法帮助您提高设计技能:与整体设计相比,代码在较低的层次上解决了复杂性。

以改善设计软件,最好的办法是设计软件*。实现目标的一种方法是查看设计竞赛:TopCoder拥有100多个组件设计的档案,其中包含UML设计文档以及Java和/或C#的实现。挑选您喜欢的成品组件,阅读需求规范,然后尝试提出符合要求的原始设计。花一两个小时思考问题并绘制类图,然后打开获奖设计并阅读作者所做的工作。将他的设计与您的设计进行比较,找出差异,然后查看您的设计是否更好。检查比赛记分卡,以查看评委如何评价设计。这将为您提供决定如何提高设计技能所需的反馈。


*除设计软件外,这还适用于其他事项:多次进行合格的反馈,注意他们的意见,然后-您将在做任何事情时都变得更好。


1
感谢您将TopCoder引起我的注意,这是将其用作教学工具的有趣想法。
neontapir 2012年

能否请您提供一个指向的档案的链接TopCoder archive of 100+ component designs,?找不到此类文件。
StepUp

1
@StepUp 在这里。您可能需要登录才能访问它。
dasblinkenlight

如果我想看到ASP.NET的漂亮设计,应该在哪里看到?我只是在您提供的链接上看到“查找组件”。
StepUp

1
@StepUp ASP.NET太笼统了。TopCoder组件更加具体:SQL解析器,表达式求值器等
dasblinkenlight

11

好吧,不要辞职。最好与一个技能比您更好的人一起工作,以便您可以向他或她学习。

查看更好的设计并确定为什么更好。从公认的设计中学习,并思考在其他情况下可以应用类似设计的方法。一旦知道了为什么它比您的设计要好,那么您就会知道下一次设计时不要误解。与其他开发人员交谈,并询问他如何提出设计。

为了提高设计技能,最好的办法是创建设计,然后对自己进行评估和确定如何进行改进时要残酷一些。问自己一些问题,例如:它是否可以工作并且是否在各个方面都满足要求,是否可维护,我将如何进行测试,是否会导致性能问题,需求更改的可能性以及设计的良好程度能够应付变化。阅读有关设计模式的信息,然后尝试将其应用于您的设计。提出初始设计后,要毫不留情地进行重构。如果要与应用程序一起设计数据库,请广泛阅读有关规范化和性能调整数据库的知识,如果您了解如何使数据库最有效地工作,您将学到很多有关数据库设计的知识。对于应用程序,在设计时请考虑DRY和SOLID原理。阅读有关反模式的知识,以了解要避免做的事情。


3

识别更好的设计是一项重要的能力。在遵循一些有关外观设计的较早建议时,您应该养成这种感觉。

您以什么标准判断其他设计更好?它更容易理解吗?它提供了性能优势吗?它更具扩展性吗?有许多设计原则,例如分解,抽象,信息隐藏和组件模块化,可用于判断设计并且您可能已经认识到。

  • 当您查看其他设计时,请尝试命名您的条件,理解它们,扩展它们并重用它们。当您自己设计事物时,请使用这些标准并自觉地根据这些标准来评估设计,这是流程的一部分。然后,准备完全修改或放弃不符合您的标准的设计。

您将从以下一些来源中获得有关不同设计原则的想法:http : //www.cs.wustl.edu/~schmidt/PDF/design-principles4.pdf 维基百科上的软件设计Google“软件设计原则”

  • 了解软件设计的不同模型,例如面向对象设计或功能设计或结构化分析设计。这些可能是截然不同的心态,从这些心态可以执行设计任务,并且每个人都有各自擅长的领域。了解这些作为工具箱的工具。http://userpages.umbc.edu/~khoo/survey2.html

  • 确保将设计与实现分开,尝试画出您认为是好的设计的东西,以将语言和实现细节与更高级别的设计原则分开。并发展您的“设计眼”和沟通能力。

  • 最后,但也许最重要的是,广泛阅读是一个非常好的工具-从分形到贝叶斯分析到模糊逻辑到自然语言处理,都有很多有趣的东西,这些东西可以为后来出现的意想不到的想法提供饲料。使用网络,您可以细读主题,只是出于娱乐和教育目的,它将从中受益。您无需成为专家,只需熟悉术语和想法即可。

玩得开心-如果您至少一点不喜欢它,那就不要做!


2

好了,您已经迈出了第一步。您承认您有一些东西要学习,同事的工作要比您的要好,并且您想学习和改进。

第二步是分析。看他的作品,不要只是说更好。弄清楚为什么会更好。寻找具体的细节和他做得更好的观点。

一旦了解了这一点,请提取其背后的原理。提出以下问题:

  • 这个设计比我的设计好吗?
  • 这是该设计的特定要点,还是将来可以应用于其他设计的一般原则?
  • 如果这是一个一般原则,它的局限性是什么?当它是一个好主意,做事这样?(这一点非常重要。即使在不适当的情况下,它也使您无法将一些有用的想法视为金锤。)

尝试自己弄清楚事情,因为如果您提出了一个可以使您自己得出结论的推理链,那么您会更好地将想法内在化,而且还要与您的同事交谈,以确保您得到了一切对。(毕竟,您不希望在推理中犯错误并内部化一个错误的原则。)如果您无法解决问题,请随时向您的同事寻求帮助。编程是一门谦虚的学科,很多编码人员会抓住机会教别人一些新东西,这可能是StackOverflow如此之快的重要原因。


2

我还想补充(除了很好的答案),还有很多其他内容,那就是“他可以创造出比我更好的设计”。其他答案集中在如何使您在Design上变得更好,这一切都是很好的...但是...

我敢打赌,您可以做得比您的同事更好。不是创建小便匹配或任何事情(您可以做Y更好?拧您,我可以做X更好!),而是要指出一个事实,每个人都有优点和缺点。

在我的工作中,有4个开发人员。有时候,两个主要的“程序员”可以创造出让我无所事事的东西。使我的头旋转,试图将头缠绕在他们的创作上。

但是我在SQL和命令行脚本方面比它们要强得多,并且可以自动执行使它们陷入困境的工作。

他们比我好吗?在某些地方肯定是。地狱,在很多地方都是-我到目前为止是我商店的初级开发人员,而且他们个人对我有多年的经验。尽管有这些年的经验,但我在某些领域甚至比他们更好。

不再关注某人比您更擅长X的事实。即使您在接下来的十年中练习,该人也无需尝试甚至不考虑它,就可以对您进行设计。并不是说您根本不应该修正自己的弱点,但要记住,每一个优点都存在一个缺点。

关注您和您的同事的优点和缺点。


1

在生活的各个方面,您都会发现不如您的人,以及比您更好的人,尤其是在经历了“几年”之后。

您必须向所有人学习。

不要难过 也许您的同事是天生的。您应该真诚地祝贺他,并向他学习尽可能多的东西。

不要让专业人士嫉妒您和学习的机会。


1
  1. 几年真的不那么多。而且没有人拥有更好或最差的高级设计视图。例如,我认识的人能够眨眼间就可以为低级程序编写复杂的算法,但却无法理解高级设计以及诸如内聚性和依赖项之类的概念。但是,这不是事实状态。您不仅可以在更高层次的设计上变得更好(阅读几本书,在家尝试一些技巧,等等),而且还可能发现在其他编程领域,您的同伴程序员不太好。另外,如果您认为自己在经验和技术知识方面处于同一水平,则可能是随机的情况。下次也许您有更好的设计思路。另外,不要辞职,而是抓住这个机会,向同事学习。下次一起做设计 尝试抓住他的秘密,他的思想。编程就像一门手艺,是通过观察和观察他人来学习的。

  2. 设计技能主要是由经验带来的,并且在您阅读了几本重要的书之后。我向您推荐以下内容:

    • Robert C. Marting-敏捷原则,模式和实践(有2个版本,其中1个使用Java版本,1个使用C#版本。无论选择哪个版本,这些思想和原理都可以应用于任何面向对象的方法-不仅- 源代码)
    • 相比,罗伯特·C·马丁(Robert C. Marting)拥有另外两本有趣的书:Clean Code和The Clean Coder
    • 即使Martin在他的第一本书中涵盖了所有现代设计模式,您仍要查找《四人帮》中的原始设计模式书。
    • 最后,今天还有其他几本备受推崇的书:由测试指导的不断增长的面向对象软件,或者由M. Feathers(我认为)进行重构,或者由A. Cockburn编写有效的用例,在此过程中您会发现更多。

这些书都不是魔术子弹,但是阅读前2条建议可能会永远改变您对编程的看法和看法。


0

不要让它得到你。如果您有多年修正错误和编写小型程序的经验,那么您将擅长于此。您的同事可能有多年设计大型项目的经验。

熟悉基础知识非常方便,但是如果您想在设计上变得更好,则必须设计一些项目。重复直到技能沉入。

简而言之,“多年的经验”并不总是等同的。让您的岁月变得有价值。


0

“变得更好”通常意味着更好地衡量您的设计或代码,以更好地比较某些事物/人,仔细比较差异,从这些差异中吸取教训,并不断尝试以此为基础来改进未来的设计。如果发现发现自己需要学习更多的知识而感到沮丧,将会减慢这一有益过程的速度。如果您移居到没有人(或其他资源)可以有时或始终为您提供更好的比较的地方,则您可能会失去这个学习和减慢下注过程的机会。

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.