从能够编写代码到成为一名优秀的开发人员,我该如何发展?


10

我对如何从能够编写脚本(bash,awk)和编写简单的应用程序(c,php,python)到设计和开发更大,更复杂的软件缺乏具体的解释感到沮丧。似乎一方面有编程语言书籍,另一方面有专为程序员团队设计的软件工程/项目管理书籍。

我都读过很多。我已经阅读过XP / Agile经典著作,并对软件开发过程有不错的理论理解。我喜欢阅读别人的代码,可以很好地遵循它。但是,当我对一个项目有一个想法或想从“问题/需求在这里”到“解决方案在这里”时,我的脑子一片空白,我不知道从哪里开始。

我只是破解吗?对于没有团队合作或大型软件公司的个人开发人员,是否有任何结构化的工作流程?我真的不希望获得PMP或在软件公司工作。我只是在寻找有效,高效,实用的工作流程。


2
经验是一位好老师。
伯纳德

更大,更复杂的软件不仅是更简单,更简单的软件的集合吗?
钻机

5
“因为艺术最重要的是工作。除了每天坐下来尝试之外,其他都没有关系。” -史蒂芬·普雷斯菲尔德(Steven Pressfield)
瑞安

用同样的方式去卡内基音乐厅...
迈克尔·布朗

1
到达卡内基音乐厅的方法相同-练习!
马丁·贝克特

Answers:


11

我认为,您将通过经验和多种工作方式而成为一名优秀的开发人员。您已经说过,从“这是我的想法”到“这是我的解决方案”,您遇到了问题。对于软件开发方法论以及成为经验丰富的开发人员而言,这更加重要。

使用软件开发方法学不仅仅是“仅仅破解代码”,而且这些方法学提供了结构化的工作流程。敏捷家族在那里为较小的开发团队(或个人)提供了良好的结构,您可以遵循这些结构来帮助您从“想法”阶段过渡到“成品”阶段。

这些年来,我从他人那里以及通过从事各种项目中学到了一些东西,例如:

  • 使所有东西都可测试,这将使您的生活更加轻松;
  • 您不能期望自己有一个完美的设计,而没有设计经验就可以设计企业应用程序/下一个最大的游戏名称/在此处插入更多内容;
  • 如果您没有经验并向他人学习,那么就很难设计出好的软件。
  • 即使您是经验丰富的开发人员,也永远不会有一次完美的设计-事情因此而改变;您的设计也可能;
  • 写下来的东西:书写/绘画/白板/绘画/无论感觉如何,只要写下来,就可以使生活更轻松。例如GUI设计,类图等。以我的经验,仅仅“一起砍东西”有可能导致灾难性的失败。
  • 不要重新发明轮子,您不必这样做。如果您尝试实现自己的HashMap,则可能是在做错什么。研究事物,并在编写代码之前进行思考。

希望其中的一些帮助。


也许这是我尝试不使用铅笔和纸来克服数字时代的症状。我记得制作思维导图之类的东西。好建议。

我同意写下来。我在很小的大型团队中工作有丰富的经验,我要做的第一件事是列出软件/模块的基本要求。它有什么作用?学习软件设计原理,这实际上是您所要学习的-在一开始就不必高度结构化,只需编写一些组织性说明即可帮助您确定方向,而无需参考任何语言或技术。当您有明确的方向时,请确定如何实施。

我认为,如果没有某种便签本,无论铅笔,纸还是白板,您都无法真正设计出任何东西。我还保留了项目设计的所有迭代,因为您不知道何时必须放弃的好主意突然变得可行。
TMN

我是一个非常有远见的人,所以图片总能帮助我理解和解决问题:-)
Deco

5

我认为,就像在任何职业中一样,要成为一名优秀的职业,除了理论上的形成外,所需要的就是经验

作为医生,仅凭在医学院学习的课程就无法成为一名好医生,或者律师不能仅凭其学历就知道成为旅行顾问的所有政治方面,因此,成为一名优秀的开发人员需要经验和时间。

经验并非来自阅读第三方代码。如果您是一名医学生,他/她将能够指出很多程序,疾病,药物等,但这些东西的实际应用(何时应用一种程序,诊断出什么疾病等)只会出现有监督和经验。

由于您不想在大型公司(或与此有关的任何公司)工作,因此建议您从开发小型应用程序开始,一次仅一步。自己开发软件会花费很多时间,相信我。

我建议您成为一名优秀的软件开发人员/工程师的另一件事,就是为开源软件做出贡献。很多人通过帮助开发开源软件并在事后咨询中赚了很多钱(和经验,顺便说一句)。他们以对开源的贡献而闻名。

无论如何,我认为获得经验并不是捷径,必须有纪律耐心地追求。


这是一个很好的类比。阅读其他人的代码对我的风格有所帮助,但是您是对的,它并没有给我任何真正的经验。有人建议走OSS路线。我想我会调查一下。

4

您可以从增强他人的代码开始。进行一些项目,并为其添加功能。您必须决定该功能将要做什么,以及它应该如何做。在现有代码的框架内工作,设计解决方案。

并且不要害怕破解东西。许多新的开发都是通过完善(或最好重写)快速且肮脏的原型来完成的。继续并使用本书中所有最差的做法和反模式,只要找出满足您要求的内容即可。然后,返回并正确设计它。通常,当我在我的800行三过程怪异方法中对一些配置参数进行硬编码时,我会想到“您知道,更好的方法是...”。

我知道它目前不流行,但是结构化分析技术确实帮助我掌握了软件设计。尝试制作一些气泡图和DFD,以感受分解问题并设计系统的不同部分以协同工作的感觉。


2

正如其他人所说,经验来自编写代码。但是,如果可能的话,您还应该让其他人查看您的代码。经验丰富的程序员可以指出代码中的问题,并向您展示更好的处理方式。为开源项目做贡献将使您有机会同时进行这两项工作。


1

对我来说,这有助于将较大的软件分解为较小的块。然后将这些块分成更小的部分,依此类推。每个软件程序都是一小部分逻辑的集合。

例如,考虑一个博客。您希望能够创建和编辑其他人可以阅读的帖子。您可以立即将项目分为管理部分和公共部分。至少,管理员将需要管理员用户,登录页面和用于管理博客的部分。管理博客的部分可以分为CRUD(创建,读取,更新,删除)界面。创建新博客帖子将需要进行检查,以确保管理员用户具有正确的特权,表单,表单验证以及保存到数据库的能力。等等。

您将问题或功能分解得越多,它就越易于管理。它是分而治之。一旦能够像这样映射出您的软件,就可以看看它的不同部分是如何相互作用的。您可以在哪里重复代码?什么可以抽象?在您计划和编写代码本身时,这应该是一个迭代过程。

我建议您先确定最低功能集,然后再添加其他功能。您将需要进行防御性的编码,以便将来的更改不会太困难,但是同时,您也不想实现可能永远无法完成的半功能。在保持灵活性和愿意无情地杀死亲爱的人,借用文学参考之间很难走。擅长于这种特殊的平衡行为仅来自经验。

正如其他答案提到的那样,这就是结果:经验。获得它的唯一方法就是开始。从一开始就不必担心使其完美。首先使代码工作,然后使其美观,然后使其快速。

另外,与本段不同,不要在事后考虑安全性。您应该对软件遭到破坏的方式有所了解,但是,一开始,请不要信任任何用户输入。


0

我知道您说您不想在软件公司工作,但这是获得许多其他答案所讨论的经验的好地方。无论您是否想从事大型项目,接触他人的工作和工作风格都是一件好事。

例如,您不能自己尝试配对编程。而且,如果您与比您更聪明的人结对,则可以从他们那里获得更好的实践,同时获得该方法的经验,从而获得额外的好处。

顺便说一句,我的练习是尝试与那些我感觉自己在经验,技能等方面都低于平均水平的小组合作。它极大地提高了我的游戏水平。这是多少很难做到这一点单独或者你是“有经验”的家伙。


0

您正在寻找的是解决问题的能力。我注意到,假设开发人员已经可以做到这一点,这很愚蠢。幸运的是,解决问题是一项通用技能,用于数学,研究,日常生活等。

首先,您应该遵循科学的方法,并带有一些修饰。

  1. 您遇到了问题(使用工具和技术来定义此问题)
  2. 您假设一个解决方案(模式和经验帮助)
  3. 测试假设(此处甚至可能没有代码)
  4. 重复步骤2和3,直到假设成立。您现在有了一个理论(解决问题的工作程序)
  5. 进行实验以强调理论,寻找漏洞(测试用例!)
  6. 如果测试用例成立,那么您有解决方案!否则,冲洗并重复

请注意,这是相当高的水平。每个步骤通常都涉及几个子步骤,例如确定问题所在。例如,看一下解决数学中的单词问题。您收集事实(一种工具),并确定实际需要什么。然后,您检查事实,尝试将其映射到解决方案。

这最终成为主要问题的子问题。因此,再次执行步骤。我们需要一个中间项目来获得最终结果,因此这成为我们的新问题。这样可以将问题分解为容易理解的小部分。求解完每一部分后,解决方案就会拼凑在一起。

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.