回顾我作为程序员的职业生涯和生活,我有很多提高我的编程技能的方法-读取代码,编写代码,阅读书籍,收听播客,观看屏幕录像等等。
我的问题是:您做过哪些最有效的事情来提高您的编程技能?您会向想要改进的其他人推荐什么?
我确实希望在这里有各种各样的答案,而且没有一个“一刀切”的答案-我想知道对不同的人有用的方法。
回顾我作为程序员的职业生涯和生活,我有很多提高我的编程技能的方法-读取代码,编写代码,阅读书籍,收听播客,观看屏幕录像等等。
我的问题是:您做过哪些最有效的事情来提高您的编程技能?您会向想要改进的其他人推荐什么?
我确实希望在这里有各种各样的答案,而且没有一个“一刀切”的答案-我想知道对不同的人有用的方法。
Answers:
决定TO是“杰克的万事通”
在我职业生涯的早期,我曾是使用特定数据库和编程语言的专家。不幸的是,那个特定的数据库丢失了“数据库大战”,我发现我的职业选择受到了限制。在那之后,我有意识地决定,我再也不会让自己陷入困境。因此,我研究了所有可以动手的东西:Windows,Unix,C,C ++,Java,C#,Perl,Python,Access,SQL Server,Oracle,Informix,MySQL等。无论是新工具还是新技术,我成为了“首选人”-“问克雷格,如果他不知道,他会学的。” 结果,我从事了各种各样的项目,从用于环境遥测的嵌入式系统到用于导弹防御的指挥和控制系统。
我曾经遇到过的唯一问题是那些坚持聘请皮特翁让我进入专业领域的公司,而我的专长是通才。[编辑:也被称为Polymath或文艺复兴时期的人或多专家。]
要记住的事情……高科技知识的半衰期是什么?它遵循摩尔定律:您知道的所有事物的一半将在18-24个月内过时。选择错误学科的专家很容易受到技术压力的破坏。通才只需增加一些技能,并记住过去应用这些技能的经验教训。
我一直以为自己是一个非常热门的程序员。然后,一个叫他亚伦的新人被录入了我们的团队。亚伦显然在很多方面都比我强。他也比我小。他让我意识到过去几年我并没有真正进步。我是一个特别的黑客,当时是一个中等水平的黑客。
这提醒我有意识地尝试改善自己,尤其是所编写代码的质量。
亚伦带我学到很多东西。他教我如何将我编写的大多数代码至少保留和扩展几年,因此我在编写代码时应牢记这一点。我应该为我的代码编写自动测试。Aaron一直在谈论我如何永远不停止在第一个工作版本上工作,而是重构和完善直到代码优美为止。我发现我使用的语言和工具有很大的改进空间。
我从亚伦学到的最重要的事情是永不停止学习。
几年后,亚伦离开了公司。我感到空虚。过去的几年中,他使我的技能提升到了一个全新的水平,我意识到我现在比团队中的其他成员要好得多。他们仍然在编写错误的代码,并像以前一样犯同样的错误。我试图教他们,但他们没有兴趣学习。实际上,他们很生气,因为有人会这么自大地告诉他们他们正在犯什么错误。
因此,几个月后,我也离开了公司。我搬到一家拥有非常才华的团队的小型公司。那里的每个人都想了解更多,我喜欢它。
我很高兴认识亚伦。没有他,我可能仍会和那帮老帮在那家老公司打交道,无所事事,而且自己想得太多。
定期去健身房。
认真地讲,当我保持身体健康时,我的大脑会好得多。问题变得更加容易,不那么令人头疼,烦恼不再是一种诱惑,一步一步地解决问题似乎并不那么艰巨。
编程。从事有趣的项目。没有什么比进入和工作更重要了。特别是在压力下。我总是告诉任何问我如何编程的人-只是找到一个很酷的项目(即使必须组成它)并继续工作。
我是“每年学习一种编程语言”系统的忠实拥护者。一年让您有足够的时间克服“好吧,我知道语法,所以现在我知道了语言”的偏见,并迫使您走得更远,了解该语言的好处,并以一种该语言(我的意思是,您最终不会使用Ruby语法编写Java应用程序)。每种语言都会改变您对编程的看法-我知道如何使用递归,但是直到我在Prolog上一堂课后,才进行递归思考(我想像ML这样的功能语言会产生相同的效果)。
启动一个宠物项目。我个人对于一个好的宠物项目的方程式是,您有过的经验+您没有的经验=您会发现有用的应用程序。例如,Migratr(我自己的咖啡因周末转变为正在进行的项目)起初是“我知道c#,但我从未针对Web API进行编码。我想将我的所有照片都移至Zooomr”。就像以前“我曾经使用Web API编写过代码,但我不知道C#”一样容易
发布您的宠物项目本身就是一种了不起的教育经历。突然之间,几乎没有人教过所有东西,但每个人都应该知道(对我而言,这是在建立自己的测试系统,充分利用版本控制系统,在没有其他人设置截止日期时如何调整自己的速度,如何与您的交互)用户以及如何知道何时对功能请求说“不”),所有这些东西都会浮出水面,并迫使您以前所未有的水平进行自我教育-至少不要懒散地阅读dzone上关于这些问题的烈火“ foo”与“ bar”处理方式的优缺点。
做到这两件事涵盖了频谱的两端。学习一门新语言将使您成为更好的编码员。宠物项目将使您成为更好的开发人员:P
教自己组装。我13岁时是否使用旧的6502芯片?14吗 太早了。但是我想不出什么能比深入到位更能改善您的开发了。
学习汇编使您可以洞悉计算机在根本上更低的层次上进行“思考”的方式,而在这一层次上的优雅令人惊讶……没有浪费的动作,没有“处置”数据。在此级别上进行开发将教会您效率,并磨练您的批判性思维和逻辑技能。它还会很快治愈您的任何草率习惯!
65xx芯片具有三个寄存器(累加器X和Y),并且没有用于乘法或除法的机器级指令。我记得编写了一个程序来计算战斗伤害,翻阅了本书,突然意识到我必须编写自己的数学库。花了几周的时间在我的笔记本上书写1和0,试图找出“除”和“小数位”的真正含义。
从那时起,我就学习了C ++,pascal,.NET以及许多其他东西……但是,他们中没有一个教给我太多,吸引我太多,或者让我感到“哇”,就像我的旧将军上的汇编所做的那样。
回顾我写的旧文章,意识到它们有多糟糕。
编程。
认真的说,有书,有代码katas,有这样的网站,但我相信,作为开发人员的最好的改进方法是从事真实的项目,让真正善变的客户对真实的工程有不断变化的要求问题。经验无可替代。
我认为您可以做的最重要的事情就是有意识地努力进行改进。没有什么灵丹妙药,您必须不断寻找新的信息资源,新的经验和更多的实践。
第二重要的事情是,思考您在做什么,为什么要做以及如何做得更好。与以前的项目相同。回顾一下您已经完成的工作以及现在可能会有所不同的方法。考虑可以做得更好的地方,或者您仍可以改进的地方。
我每天在工作中看到两个很好的例子。我有一个喜欢学习的同事,想成为他能做的最好的开发人员。他利用任何停机时间阅读博客,读书,讨论编程技术以及提出大量问题。在过去的一年中,他的进步也非常明显。另一个同事干得很好,做得很好。但这就是他所做的一切。他坚持自己所知道的,不花很多精力去改进,不在现有项目之外的任何项目上工作,四年后,他拥有与我见面时完全相同的技能和编程能力他。
帮助我成为程序员的基本知识:
为程序员打字是必不可少的。每个人都有一个“程序员”同事,正好用两个手指打字,不得不看键盘上的所有东西。不好玩。学习触摸式打字可以极大地提高您作为程序员的工作效率。
如果您不问,没人会告诉您。
您可以阅读喜欢的所有书籍,代码和开放源代码项目,但是您需要了解软件开发的最终用户方面。您需要走出回波室。因此,我将介绍一些非技术性要点,这些将对您的技术职业有所帮助。
离开键盘,与最终用户互动,并通过他们的眼睛看到他们如何使用该软件。最终用户通常不是技术人员,因此他们将软件视为一项神奇的工作,而您将软件视为一组合理的步骤。这两个世界是完全不同的。因此,对您来说似乎容易和合乎逻辑的事情对其他人可能看起来有些神秘而又令人生畏。
测试,测试,测试。我在大型公司中看到的许多软件都使用测试用例。地狱,他们使用JUnit,xUnit和所有其他单元测试语言。但是我所看到的问题是,大多数程序员从未看到过他们的软件在生产环境中的样子。了解用户(或系统,如果它们是批处理作业)如何与您的应用程序,库或界面进行交互,以找出他们向其扔出什么样的可憎信息。这将帮助您生成良好的测试用例,并停止假设您的程序将始终获得正确的数据集。
参加TopCoder算法竞赛。
辞掉我的上一份工作。
不断学习和实践所学知识。
通过:
个人项目:自从我开始编程以来,我一直在从事个人项目。涉及小游戏,图像处理,隐写术,实施文件类型规范,从头开始实施各种协议或随着时间的推移实施各种程序。
阅读书籍: 我决定在业余时间阅读并阅读各种书籍。专家们围坐在一旁等待阅读,有很多写得很好的书。通过阅读各种论坛帖子,您可以从书中获得无与伦比的深度。
通常这是我学习任何新技术的时间顺序:
定期阅读优质博客(Atwood,Martin Fowler等),了解最新技术新闻,关注有趣的新技术。这些步骤将使我决定是否发现任何值得进一步探索的东西。
阅读正确的书或任何其他资源以适合您的水平(例如,对于初学者来说,如果您想学习设计模式,我建议您采用“ Head First设计模式”。)我还对书籍有特别的偏爱。
用我学到的东西推出一两个玩具项目。我不担心该项目的用处。我的目的只是利用我的学习。(例如,面向对象的计算器项目就可以了)
我会看看我是否可以在工作中使用这些东西。(例如,尽管我们在工作中不使用Subversion,但我将其用作本地存储库,但我使用Ruby来完成一项任务,否则该任务将过于单调且耗时)
这是我认为大多数人都错过的最好的部分。知识共享会议。例如,与团队成员进行一到两次会议。我相信教学是真正学习技术的最好方法之一。我保证,无论听众是否接受,您对技术的理解水平都将变得多元化。:-)