我应该继续自己的自学编码实践还是学习专业的编码方法?[关闭]


36

最近,我一直在从事专业工作,与其他程序员一起闲逛,并结交业界朋友。唯一的是我是100%自学的。这使我的风格与经过适当培训的人的风格极为不同。不同之处在于我的代码的技术和组织。

这是我做的几件事的混合体。我倾向于将几种编程范例融合在一起。像Functional和OO。我比OO更倾向于功能性方面,但是当某些东西作为抽象实体更有意义时,我会看到使用OO。就像游戏对象。接下来,我也会在做某事时走简单的路线。相反,有时候,我从专业程序员那里看到的代码似乎很复杂!我使用很多闭包。最后,我不是最好的评论者。我发现仅阅读我的代码比阅读注释要容易。大多数情况下,即使有注释,我最终还是要阅读代码。另外,有人告诉我,由于我编写代码的方式非常简单,因此很容易阅读。

我听到受过专业训练的程序员不断进行诸如单元测试之类的事情。我以前从未用过的东西,所以我什至都没有关于它们是什么或它们如何工作的最模糊的想法。下划线“ _”很多,这并不是我真正的品味。我使用的大多数技术都是直接来自我的,或者是我读过的几本书。对MVC一无所知,尽管我曾经听说过很多关于main.js的内容。我认为这是组织应用程序的一种方式。尽管这使我感到困惑,因为到目前为止我已经建立了自己的组织结构。

有点痛苦。当学习Ubuntu的Quickly之类的新知识时,我根本无法使用模板应用程序。我很难理解我可以告诉别人的代码。完整的OO编程确实给我留下了不好的印象,但这似乎是其他所有人严格使用的东西。

这让我对代码的外观没有那么自信,或者想知道我加入公司或为开源项目做贡献时是否会引起火花。实际上,我非常害怕人们最终会签出我的代码。这是任何程序员都可以正常进行的事情,还是我真的应该改变自己的技术?


2
在一周/一个月内,没有人成为可靠的开发人员。花时间了解如何以可靠和可维护的方式交付代码。如果您继续学习并对如何做得更好感到好奇,您肯定会成为“摇滚明星开发者”!
EL尤苏波夫2012年

11
您应该意识到,生产软件往往比其原始作者的寿命更长-能够编写其他人可以理解以维护的代码是一项非常重要的技能。鼓励其他人阅读您的代码并告诉您他们的想法,并从中学习

1
这个地方在地球上的什么地方“完全偏离了受过适当训练的人的风格”?我从未找到受过适当训练的研究生。
Reactgular 2012年

2
我很乐意与更多了解闭包的人一起工作,更不用说考虑使用函数式编程了……
Izkata 2012年

只要您让其他程序员/雇主知道您的背景,就可以了。在自学而不是像受过良好训练的人那样编码与在受过训练而不是像其他受过类似训练的人那样编码之间有区别。
Pureferret 2012年

Answers:


62

实际上,我非常害怕人们最终会签出我的代码。

好。意识到人们会看您的代码会使您更加努力。

编程已成为一个非常大的领域。有许多主题,工具,利基和专业领域,其中有些是整个职业生涯。有很多东西需要学习和了解,当您与其他程序员一起工作时,总会有一些您知道他们不知道的东西,以及他们知道您不知道的东西。这是一件好事。

如果您担心自己的经历不完整,可以采取许多步骤,通过正规教育和与受过培训的专家合作来对此进行修正。但这听起来像是您担心会有一个可量化的里程碑,之后人们会说:“好吧,既然我已经掌握了这一点,那么我正式是一名程序员。” 没有这样的里程碑。在我学到一些新知识之后,我肯定有片刻想过“是的,现在我要去某个地方了”,但是并没有神奇的清单,您必须了解和做一些自称的程序员。

我对编程有很多了解,我在许多项目中使用了十几种语言,但是我可以称呼自己的编程知识很小。我喜欢那个。坦白说,程序员不是您本人。程序员是您不断学习成为的东西。

诚实地盘点您的技能,优势和劣势。从比您有更多经验的人那里获得反馈。寻找与您认为的位置非常相符的职位-但不要害怕去从事一些超出您当前掌握的工作。如果您只从事工作,那么您已经了解了一切,那么您将永远不会在工作中学习。


44
程序员是您不断学习成为的东西。我应该把它翻译成中文并给它做个纹身吗?
Radu Murzea 2012年

1
@SoboLAN我已允许您执行此操作。不过我要照片!
asfallows 2012年

2
虽然我确定还有其他网站,但codereview.stackexchange.com是我唯一了解的网站。不过,让某人亲自对其进行审查并与他们一对一交谈有很多价值。也许您附近有一所大学/大学,一位友好的教授愿意与您见面?那是我能想到的最好的东西-也许其他人会有更好的主意。
asfallows 2012年

1
在我看来,真正的考验是您是否已交付他人实际使用的代码。

4
@ThorbjørnRavnAndersen:您第一次意识到人们实际上正在使用您生产的产品可能会非常令人恐惧。之后非常有能力。然后再次感到恐惧,因为您发现自己犯了一个大错误;-)
Joachim Sauer 2012年

16

当您开始与其他开发人员合作开发应用程序时,其中一些个人风格的原型将被您所困扰。

如果您开始在使用下划线的商店工作,则将使用下划线。每个人,无论其先前的背景如何,都遵循商店的编码风格标准。

除非您的编码风格非常明显,否则您最好习惯于编写清晰简洁的注释来解释代码的工作方式,以便其他开发人员可以遵循它。

如果您对单元测试一无所知,请购买一本好书。那里有很多关于单元测试的好书。与MVC相同。

专业的软件开发人员知道如何与他人打成一片,而不会乱扔沙箱。最优秀的人知道如何读写代码,无论其样式如何。


5

编程具有艺术性和学科性。艺术部分是思考并实施最佳方法。纪律是确保您正确地执行了此操作,并确保其他人可以理解您的代码并在必要时对其进行增强。

艺术部分很有趣:之所以这么做是因为您喜欢它。自然,这就是您首先要自学的部分。

纪律部分更令人讨厌:您出于必要而这样做。但是,它是团队合作中至关重要的组成部分:至少在某种程度上,您无法逃避这一挑战。一旦您的代码与团队成员的代码集成在一起,您“随意更改”的灵活性就会大跌眼镜。但是,您需要具有自信地更改代码以响应不断变化的需求或解决错误的能力。这就是各种“无聊的”测试的来源:有了很多测试,就很容易检查您的最新更改是否破坏了事情。

代码样式也变得越来越重要,因为坚持一种通用样式会使每个人都更容易阅读代码。在大型公司中,您会发现每夜进行的工作会自动测试是否符合编码标准,并在您偏离时通过电子邮件发送讨厌的警告。

回到您的问题,专注于美术组件是程序员开发的自然早期。在您开始欣赏学科组成部分之前,可能需要在行业中工作数年。但是,您不需要积极地寻求“改变您的技术”:它们会在团队合作过程中自然地发生变化。


3

对于您的问题,是的,您应该始终在寻求更改技术的方法,以接受独特的项目和新兴技术。

@assfallows的观点是:“坦率地说,程序员不是你本来的东西。程序员是你不断学着的东西。” 确实是编码的全部和全部。

很高兴您注意到您在某些领域做的与其他事情有所不同,特别是当您看到它是一种标准时。您已经发现了单元测试和MVC-现在,下一步必须是了解它们。了解它们的工作原理,实现它们的需求,并尝试了解何时实现它们是一个好的设计。

这是一个不断发展的领域,新的语言和模式不断上升和下降。如果您对编码方面感到满意,请开始检查设计部分。了解什么使它们变得更好以及何时使用它们。

当然,加入团队是一个很大的好处-您总是需要其他人的眼睛来查看您的代码,以发现您急忙的领域或没有想到全部含义。


2

您无需成为更大的评论者。但是您应该是一个很好的提交者(是的,开始使用某种VCS-我建议使用Git)。

风格是不断发展的东西。不用担心 您将学习什么是可重用的代码,什么不是可重用的代码。但是您必须练习并为此寻求帮助。

尝试在Github上帮助一些开源项目。那里的有些人真的很好,会尽力帮助您。这是我可以给您的最佳提示。


2

实际上,我非常害怕人们最终会签出我的代码。这是任何程序员都可以正常进行的事情吗?还是我真的应该改变自己的技术?

没有更多经验丰富的程序员的反馈,您如何知道要更改的内容?

让其他人审阅您的工作可能会令人生畏,尤其是在前几次,这是获得需要提高技能的建设性批评的最佳方法。有一个SE网站上的代码审查可能对您有所帮助。让聪明的朋友看看您的代码是获得反馈的另一种好方法。


2

最重要的是发展灵活性。您对基本概念越熟悉,您在任何语言,编程方法,样式或环境中的响应能力就越高。

精通并不是要学习各种东西,而是要学习在各种情况下解决问题的方法。

最好的处方是实践。您应该始终有一个项目。如果您介于两次付费演出之间,请拿起一个私人玩具。一个周末有空吗?在“ hello world”中使用以前从未使用过的语言或平台。寻找一次可以学到很多东西的方法。例如,在Google App Engine中构建内容,您将立即了解有关Python,BigTable和面向列的数据库的所有信息。您还将获得大量的“专业” Google风格。

一位优秀的将军知道如何在各种地形中运用他所学的策略和积累的经验。听起来您有一些战术和经验,但是您需要遇到一些陌生的地形。这可能是确定您所知道的知识以及接下来需要学习的知识的唯一最佳方法。

而且,如果您追求的是“专业”风格,那么请承担一些“专业”项目。找到您喜欢的开源项目,为自己分配要进行的更改,然后进行设置。为公驴审查员做好准备,但请记住,该领域的大多数人并没有因为拥有良好的社交技巧而去应聘。重点是让自己尽可能多地想成为自己。而且,您必须充分锻炼自己,才能自己做。没有一个班级能真正教你。实际上,今天的课堂学习实在太多了,而现实世界中没有足够的能力。


感谢Johnny提出的第一个答案,欢迎您访问Stack Exchange上的Programmers组。对堆栈交易所网站的问题和答案请查看这些有用的指引:programmers.stackexchange.com/questions/how-to-answer - DeveloperDon
DeveloperDon

1

这让我对代码的外观没有那么自信,或者想知道我加入公司或为开源项目做贡献时是否会引起火花。实际上,我非常害怕人们最终会签出我的代码。这是任何程序员都可以正常进行的事情吗?还是我真的应该改变自己的技术?

我认为,如果您专注于客观地评估代码质量,则无需担心其他人对代码的看法。是吗

  • 正确?
  • 可以理解吗?
  • 可以维护吗?
  • 有效率吗?

作为首要原则,始终应该将目标放在关注客观质量上,而不是他人的观点上。专注于他人的意见是平庸之路,也是您所经历的焦虑之路。

关心他人观点的唯一原因是能够与他人进行良好的社交(或在工作环境中)融合。如果您将提高工作客观质量的目标放在首位,则无需担心别人的反应-他们只是学习的机会,或者在最坏的情况下,是要处理的实际细节。 。

做真实的自己!!继续学习并享受您的工作。


感谢Chris为您发布的第一个答案,欢迎您访问Stack Exchange上的Programmers组。我非常尊重您的思路。“人们说你做不到的,你试图找到自己可以做的。” 亨利·大卫·梭罗。请在Stack Exchange网站上查看以下有用的指导原则,以获取有关问题和答案的信息:programmers.stackexchange.com/questions/how-to-answer
DeveloperDon

1

你让我想起了我上大学后当一名软件工程师的经历。如果您想成为一名程序员,我会说一个职位。您将需要注释您的代码,编写单元测试,完全理解面向对象的代码。但是现在您没有真正的理由这样做。只要您只是在从事个人小型项目。除了自己,您无须回答任何其他问题。作为开发人员,您将不再成长。

通过承担许多人正在从事的大型项目,并必须回答管理人员的问题,例如“此版本的bug是否免费?因为我们打算将其发布给客户。”。您将成长为一名程序员/工程师。您会遇到一些困难。您可能会发现所提到的东西更有价值,并且可能会发现前所未有的新事物。你会成长。

即使我的大学即使尝试了,也没能教给我这些东西。

对于单元测试,请寻找“测试驱动开发”。

对于注释,请考虑一下您离开后编写的代码。而其他人将花费时间进行逆向工程。

对于面向对象的语言。至少了解它。您可以使用该工具以更具可读性的方式解决问题。

祝你好运:D


0

总之,最好的学习方法通常是一个你可以学习到挂出。如果您觉得自己的技能还没到手,那么和最好的人一起出去玩是您所能做到的。当然比退出和孤立自己要好得多。

但是,我认为您正在绘制一张非常简化且具有误导性的图片。远非所有“专业教授”的程序员真的有任何好处。仅仅因为他们做某事并不一定意味着它是正确的事。

而且您说的很多(但不是全部)听起来确实像是您可以教给他们一两个技巧的人。

我比OO更倾向于功能性方面,但是当某些东西作为抽象实体更有意义时,我会看到使用OO。

对我来说听起来很棒。最好的编码人员是使用正确工具进行工作的人员。我总是选择一个既了解这两种范式的人,又对那些只使用一种范式的人有意义。

接下来,我也会在做某事时走简单的路线。相反,有时候,我从专业程序员那里看到的代码似乎很复杂!

同样,简单是件好事。直到它不要让你的代码复杂,需要很复杂。有些人的确是出于对优雅的误解而使事情变得复杂,或者是因为“稍后我们将需要此附加功能”。通常,最好执行最简单的解决问题的方法。

我使用很多闭包。好。这就是为什么他们在那里。他们确实吓到了一些陷于1990年代和Java过时的准OOP模型的人,但实际上,这就是他们的问题。

最后,我不是最好的评论者。

应该评论什么以及如何评论是非常主观的。那里并没有真正的“正确”或“错误”,但是在团队中工作时,重要的是编写整个团队而不是仅代码编写者都能理解的代码。有时,必须做出折衷以符合团队的编码风格。那并不一定意味着您应该写更多的评论,而只是意味着您和您的团队必须对此达成共识。

我听到受过专业训练的程序员不断进行诸如单元测试之类的事情。我以前从未使用过的东西,所以我什至都没有关于它们是什么或它们如何工作的最模糊的想法。

好吧,问他们。:)测试您的代码是必不可少的,而单元测试是一种流行且有用的工具。

下划线“ _”很多,这并不是我真正的品味。

与评论一样,这是主观的,取决于语言。在C和C ++中,lowercase_with_underscores是一种相当常见的命名约定。在许多其他语言中,您几乎不会看到下划线。但归根结底,这实际上并不重要。无论一个函数被调用write_to_logWriteToLog实际上不打算有所作为。有人将不得不将其吸纳起来并遵守团队在那里达成的共识。

对MVC一无所知,尽管我曾经听说过很多关于main.js的内容。我认为这是组织应用程序的一种方式。尽管这使我感到困惑,因为到目前为止,我已经建立了自己的组织结构。

与单元测试一样,永远不要停止学习。您与不了解您的人一起工作,并且与您的背景不同。互相学习。显然,有些东西可以教给他们,但是有些东西却可以教给您,您不知道或从未听说过。这并不意味着您(或他们)是一个不好的程序员。这意味着一个优秀的程序员是一个努力提高自己并向他人学习的人。

完整的OO编程确实让我不快

在这里也是一样,我就是您所说的“专业培训”(CS学位)。自学编程的人与自学成才的人一样多。听起来您正在与一些确实需要学习一些新技巧的人一起工作。

实际上,我非常害怕人们最终会签出我的代码。这是任何程序员都可以正常进行的事情吗?还是我真的应该改变自己的技术?

都。当然,让其他人查看(并判断)您所做的事情很可怕。但这也很有教育意义。他们可以告诉您他们会另外做些什么,或者为什么他们会否则做。他们可以帮助您改善自己,也可以自己学习一些东西。向他们展示解决问题的代码比他们“首选”解决方案所能解决的要好,并希望他们会“哦,那很干净。您怎么知道那样做?您怎么称呼它?我应该自己使用这种技术”


0

这不是一个完整的答案,您已经有了几个不错的答案。但是,有两点对我来说似乎有些困惑,尚未解决。

这是我做的几件事的混合体。我倾向于将几种编程范例融合在一起。像Functional和OO。我比OO更倾向于功能性方面,但是当某些东西作为抽象实体更有意义时,我会看到使用OO。就像游戏对象。

在我看来,您似乎在混淆声明式命令式编程,而不是函数式与对象式编程。如果您的意思是倾向于声明式编程而不是命令式编程,那是一件好事。声明式寻求消除副作用,这应使您的代码更易于理解。

现代编程语言通常支持声明性编程模型。例如,在C#中,使用Linq会产生声明式样式,因为您不是在说如何获得所需的内容。你只是在说你想要的。

完整的OO编程确实给我留下了不好的印象,但这似乎是其他所有人严格使用的东西。

现代语言通常是多范式语言。很少有人会使用“纯”语言。许多功能语言都支持对象和副作用。被认为是面向对象的语言通常不会施加约束,即一切都是对象。

完整的OO是什么意思?我从未研究过“纯” OO代码。也许您可以给我们一些您不喜欢的东西的细节。开源项目中的插图可能会有所帮助。

OO编程为我们提供了许多功能来支持诸如:数据抽象,封装,消息传递,模块化,多态性和继承之类的功能。如果我查看的代码库没有利用这一点,那会给我留下不好的印象。


为什么要下票?
Dave Hillier 2012年

0

简短的回答:是的。

教自己几乎是件好事。
良好的过滤条件和良好的建议。

WRT学习专业编程,是的。
你有什么考虑?
会议,研讨会,证书,学位?
每个都有成本/收益。
当投资回报率良好时,如果您有足够的资源,那就去争取。

通过考虑来源来权衡学位建议:有或没有他们的人有既得利益。
与每个人聊天。

学术界是否与行业隔绝?经常。
学历一文不值吗?美元方面,很难争论。
毕业生几乎总是赚钱,但要提防大学贷款。

有知识吗?也许。
如果您讨厌上学,您将获得的投入不会比投入的更多。

如果您觉得学位对您来说是一个值得追求的目标,那可能就是这样。

深入挖掘并了解学习计划,成本和环境。确保您有兴趣,承诺,时间和资源。您可能上了13年学,那另外4年又是什么?它们将是最昂贵的,而您将使它们变得最有价值的主要人是您。

成本可能非常吓人,但它们只说明了故事的一部分,因为出于功绩,需求和一百多个其他原因,有许多助学金和奖学金。

如果您去,请选择聪明的教授和芽。


0

第二个问题-我可以使用自己的风格吗?

你有两个问题。

第一个在您的标题中。请参阅我之前的答案。

第二部分在大约五段中进行了详细说明,您可以通过以下几点来描述自己的风格与专业风格的不同之处:

  • 100%自学。
  • 技术和组织有所不同。
  • 功能和面向对象的融合。
  • 不太复杂。
  • 很多关闭。
  • 很少评论。
  • 没有单元测试。
  • 下划线很少。
  • 没有MVC。
  • 没有骨干.js。
  • 没有模板应用程序。

总而言之,我想您是在问您是否使用Frank Sinatra方法是否可以-“我以自己的方式做到了”。当您称呼其他人的代码专业人士时,我感到模棱两可,但您对此并不认同。样式是一个棘手的个人问题,关于什么是好的代码的争论是无止境的,并且常常是浪费时间。如果您的小组使用书面编码约定,则某些问题可能会更容易。请检查:

http://en.wikipedia.org/wiki/Coding_conventions

杀死别人的代码是一种礼节,这是您应该与团队合作的另一件事。穿上厚厚的皮肤,希望它们不会太残酷,但是无论您做什么,都不要开战。

您评论了关于他人看到您的代码的焦虑。准备好吧,因为他们不仅会看到它,而且会重写它并告诉您您的风格有什么问题。您的同事可能是灵活的或僵化的。无论哪种方式,我都建议您不要重写其样式代码,也不要使样式的每个方面都经过协商。

拥有统一代码(和统一培训)的原因是为了提高开发的速度和生产率,并以某种方式使最佳实践的学习制度化。诸如camelCase或use_underbars之类的问题看似琐碎而琐碎,但保持一致性有好处。

请接受单元测试和测试驱动的开发。当您独自一人而不是从事有偿项目时,它更像是一种业余爱好。您的东西不需要与其他人正在做的事情相吻合。如果您的代码崩溃,没什么大不了的。但是,当您与团队合作时,您编写的代码会影响整个团队,尤其是对客户而言。

同样,如果您的团队使用MVC,请从与其引用的相同资源中了解它。实验证明,构造程序的方法可以带来巨大的不同。同样,以团队中的榜样和领导力为例。

如果您的团队使用ribs.js,也可以使用它。您的团队就像鸭子在编队飞行。团结起来可以帮助他们减少能源消耗,使他们更安全,并帮助他们更有效地到达目的地。如果您极力推崇,这种类比就会失败,但是使用通用工具,技术以及配合团队决策具有很大的优势。


0

给出的建议非常有用,但是我要记住,我的主要目标是创建对用户有用的“工作软件”。我的听众通常不是一群程序员-他们是愿意为自动化解决方案付费的商人(用户不在乎OO方法论,框架,单元测试,代码注释等,因此也不太了解)。挂上它。)

我发现敏捷宣言的理想对我的职业生涯非常有用(www.agilemanifesto.org)

  • 个人与流程和工具之间的互动
  • 工作软件超过全面的文档
  • 客户合作而非合同谈判
  • 响应计划变更

0

我完全与这个问题有关。我有完全相同的感受,并且背景非常相似(但不完全相同)。我应该经过专业(或学术上)的培训,因此我应该对OO编程等有所了解。编程不是我的主要主题,但我确实做到了。我在某些课程中学习了面向对象,并且根本不了解理由。实际上,我唯一了解OO是当我从事商业工作时,被两名出色的导师强迫进入。

我敢肯定,我的教授同样出色,但是您看到了在商业环境中实践与函数式编程相比真正的好处,但是您没有机会在旨在运行和教学并在几个月内结束的课程中看到它。我还没有机会研究基于MVC的结构,但是我相信它是相同的,即我可以从书中学习概念,但是当我在书中使用它时,我会理解它的好处。商业环境。我完全同意您的看法,如果可以通过一种更简单的方法解决问题,为什么还要使用OO和MVC以及任何其他复杂的结构。我的建议是不要羞于工作,因为它会使您面临不同的情况,并使您以不同的方式理解相同的事物。

当然,我是在学术背景中学习语法和概念的,但是在商业世界中,我开始学习编程。


无论教学水平如何,都无法替代现实世界的经验
安德鲁(Andrew)
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.