每个开发人员应该知道哪些高级软件开发主题?

时间:2009-06-01 18:00:24

标签: language-agnostic

假设您的公司给了您时间&有资金获得关于一年内可以吃的任何高级编程主题的培训,全权委托。那些主题是什么,你更愿意获得它们?

假设:

  • 你仍然有可以实现的可交付成果,但是你可以获得一年中每月一周的培训。
  • 培训可以来自任何地方。 IE:课堂,现场讲师,书籍,订阅,播客等。
  • 主题可涵盖任何平台,技术,语言,DBMS,工具集等。

32 个答案:

答案 0 :(得分:44)

并发/并行编程和多线程,特别是在内存模型和内存一致性方面。我认为每个程序员都应该意识到这个领域的考虑因素,因为我们进入了一个多核/多CPU的世界硬件

为此,我可能会最重视互联网研究;但是在一所优秀的大学校园入学可能是一个很好的开始。

答案 1 :(得分:38)

安全!

太多的程序员只是在完成程序的“主要”部分之后构建一些东西,并认为他们可以在事后添加安全性。您可以随时了解有关如何保护应用程序的更多信息,如何设计软件从一开始就是安全的,如何进行入侵检测等等。

高级数据库开发

数据仓库(MDX,OLAP查询,星型模式,事实表等),高级性能调优,高级架构和查询模式等等总是很有用。

答案 2 :(得分:20)

以下是我总是发现自己向没有获得足够CS培训的初级开发人员解释的三个问题。所有其他的东西通常都是炒作而不是实质,或者可以很容易地拿起来。但如果你不知道这三个,你可以造成很大的伤害:

  1. 算法分析,包括Big O Notation
  2. 各个级别的 cohesioncoupling
  3. Amdahl's Law,以及它与优化的关系。

答案 3 :(得分:20)

国际化问题,特别是因为它听起来不像是一个高级主题。但确实如此。

答案 4 :(得分:17)

辅助

很多组织都忽略了这一点,但事实上的一个简单事实是,有很多人视力低下,色盲或其他差异导致网络导航非常令人沮丧。如果每个人都至少接受过一些培训,我们可能会获得一些更具包容性的基于Web的UI。

答案 5 :(得分:14)

面向对象的设计模式。

答案 6 :(得分:14)

我认为“高级”对每个人来说都是不同的,但我建议以下内容是最体面的开发人员(即那些不需要被告知NP完整性或设计模式的人)可以从以下方面获益:

  • 多线程技术 超越“锁定”以及何时应用它们。
  • 深入学习和培训 聪明地习惯化自己 工具链中的功能(IDE /文本 编辑器,调试器,分析器,shell。)
  • 一些加密理论和实践经验,以及人们创造的安全方案中的不同常见缺陷。
  • 如果他们针对数据库进行编程,请了解其数据库的内部和高级 查询组合和调整技术。

答案 7 :(得分:11)

开发人员应该了解SQL开发的基础知识以及他们的决策如何影响数据库性能。编写查询是一回事,编写查询,理解解释计划并根据输出做出设计决策是另一回事。我认为关于PL / SQL开发和数据库性能的良好课程将非常有益。

答案 8 :(得分:10)

不幸的是,对于大多数开发人员来说,沟通技巧似乎属于“高级主题”部分(当然,目前的公司被排除在外)。 获得这项技能的最佳方式:练习。

  • 拿起耳机,然后谈话 有人而不是IM或电子邮件 在下一张桌子的那个人。
  • 拿起电话,谈话到a 客户而不是发送电子邮件 在篱笆上。
  • 在会议上提问,而不是坐在笔记本电脑后面 屏幕叽叽喳喳。
  • 积极参加参加工作中的非技术性会议。
  • 在公共场合展示

由于技术原因,大多数项目都不会失败。他们失败是因为他们无法创建团队。沟通对团队动力至关重要。

这也不会伤害你的事业。

答案 9 :(得分:8)

我学过的最好的课程之一是技术写作课程。在我的职业生涯中,这对我很有帮助。

另外:主题是什么并不重要 - 组织对此感兴趣并为此付费并且开发人员想要去做的事实是一个比任何一个更好的成功/改进指标特别的话题。

我也认为这个主题不重要。开发组织在项目期间处理很多事情,培训,然后在工作实施/试验和错误将始终为您提供一些更好的视角 - 即使尝试尝试/使用新的东西失败。这种经历可能会对后续项目提供更多帮助。

答案 10 :(得分:7)

我是一个书人,所以我不会那么烦心。

不一定按此顺序排列,取决于您已知道的内容

  • OO编程
  • 功能编程
  • 数据结构和算法
  • 并行处理
  • 基于集合的逻辑(基本上是sql背后的理论以及如何应用它)
  • 构建解析器(我只是把它,因为它实际上出现在我工作的地方)
  • 软件开发方法

答案 11 :(得分:6)

NP Completeness。具体来说,如何检测问题是否为NP-Complete,以及如何建立问题的近似解决方案。

我认为这很重要,因为你不希望开发人员通过获得最佳解决方案来尝试解决NP-complete problem,除非问题的搜索空间非常小,在这种情况下暴力是可以接受的。但是,随着搜索空间的增加,解决问题所需的时间呈指数级增长。

答案 12 :(得分:6)

我将介绍新技术和新趋势。我正在研究/提高我的技能的一些新技术包括:

  • Microsoft .NET Framework v3.0 / v3.5 / v4.0
  • 云计算框架(Amazon EC2,Windows Azure服务,GoGrid等)
  • 设计模式

答案 13 :(得分:4)

我来自基于MS的开发者世界,所以这是我对此的看法

  1. 更多关于云计算中的新概念(各种API等)。因为业界有一段时间押注它。

  2. 有关LinQ for .net framework的更多信息

  3. 分布式数据库

答案 14 :(得分:4)

重构技术(这意味着还要学习编写良好单元/功能测试集)。

了解如何重构是保持代码清洁的最佳方法 - 当您第一次正确使用它时很少见(特别是在新设计中)。

然而,许多重构需要一组不错的测试来检查重构是否会增加意外行为。

答案 15 :(得分:3)

调试

Debugging by David J. Agans是一本关于这个主题的好书。处理多线程程序,崩溃,无效的算法时,调试可能非常复杂。等每个人都擅长调试。

答案 16 :(得分:3)

并行计算 - 学习它的最简单和最好的方法

答案 17 :(得分:2)

我建议在学院/大学进行人工智能课程。大多数东西都很有趣,易于掌握(至少是基础知识),问题的解决方案通常很有创意。

答案 18 :(得分:2)

银河系的搭便车指南。

答案 19 :(得分:2)

转到Stack Overflow DevDays

ACCU conferences


阅读

  • 敏捷软件开发,原则,模式和实践(Robert C. Martin)
  • 清洁代码(Robert C. Martin)
  • 实用程序员(Andrew Hunt& David Thomas)

答案 20 :(得分:2)

我认为高级程序员应该知道如何让雇主给你时间和时间。有资金获得关于一年内可以吃的高级编程主题的培训。我还没有进步。 :)

答案 21 :(得分:2)

如果你在这里,我希望你现在已经掌握了基础知识:

  • OOP最佳实践
  • 设计模式
  • 应用程序安全性
  • 数据库安全/查询/架构

最值得注意的是,开发人员应该努力学习多种编程语言和学科,以便他们的技能在不止一个方向上得到扩展。他们不需要成为这些其他技能的专家,但至少对与他们的中心学科的整合有非常敏锐的理解。从长远来看,这将使他们成为更好的开发人员,并让他们能够使用所有工具来创建可以超越单一语言限制的应用程序。

除了编写特定主题外,您还应该学习如何在Agile,XP或其他基于团队的方法下工作,以便在团队环境中工作时更加成功。

答案 22 :(得分:2)

我投票支持现实世界的战斗故事。来自其他组织的开发人员介绍他们的成功和失败。不要将演示文稿限制为您正在使用的技术。对于一个非常复杂的项目,这必然会切入你甚至没有考虑过的“高级”主题。现实世界的成功(和失败)有很多东西要教。

答案 23 :(得分:1)

我完全同意Accessabiitly。我被要求调查网站上的工作,并且对这个主题缺乏很好的了解,不仅缺乏CSS标准来帮助屏幕阅读器。

然而,我的回答是GUI设计 - 要做到这一点非常困难。有太多可怕的应用程序可以通过花时间跟随HCI(人机交互)建议/设计来防止。在制作GUI时,Google / Apple可以获得灵感 - 而不是典型的数百个按钮/标签组合,而这些按钮/标签组合经常被推出。

答案 24 :(得分:1)

  • 自动化测试:单元测试,功能集成测试,非功能测试
  • 编译器详细信息(在某些平台上比其他平台更相关):编译器如何在语言X中实现某些常见结构?在字节码解释平台上,JIT编译如何工作?什么可以是JIT编译的(例如,虚拟调用可以编译JIT吗?)?
  • 基本网络安全
  • 来自其他问题领域的常见设计习语,而不是您目前正在处理的问题。

答案 25 :(得分:1)

我更愿意接受培训?我希望有大量的公司时间专注于自我培训。

答案 26 :(得分:1)

我建议学习重构,测试驱动开发和各种单元测试框架(NUnit,Visual Test,CppUnit等)。我还将学习如何将自动化单元测试整合到持续集成构建中。

最终,如果您能够证明您的代码符合其声称的要求,那么您无需回答有关原因或方法的问题。如果维护者出现并尝试“修复”您的代码,他们会立即知道他们是否破坏了代码。围绕需求(用例)编写的测试向维护者解释用户希望它做什么,并提供一些如何调用它的工作示例。将单元测试视为功能文档。

测试驱动开发(TDD)是一种更新颖的设计方法,从需求开始,您可以在编写代码之前编写测试。然后编写足够的代码来通过测试。你必须在编写额外代码(你可能永远不需要)之前停止,因为如果你发现你确实需要它,你将在以后重构它。

使TDD酷的原因是糟糕的界面(例如具有大量依赖性的界面)也很难编写测试。编程人员宁愿重构界面以使其更容易测试,这太难了。而这种重构简化了代码,删除了不适当的依赖关系,或者将相关的测试分组在一起,使其更容易测试,从而提高了内聚力。通过在开发人员编写接口模块时立即明白开发人员,开发人员坚持使用该体系结构,并倾向于紧密内聚和松散耦合的原则。良好的界面是自然的结果。作为奖励,一旦你通过所有测试,你就知道你已经完成了。

答案 27 :(得分:1)

从表面上看,这似乎是一个容易回答的问题,只需输入您最喜欢的关于其他开发人员无法正确做到的事情。但是当我仔细阅读答案并给予一些思考时,我意识到我所提出的每一个“高级主题”都涵盖在我20年前的本科计算机科学课程中。我怀疑OO,安全性,函数式编程等概念在那个时代已经发生了变化。当然这些工具有,但我认为工具与主题不同。

那么计算机科学中的“高级主题”是什么?谁是21世纪的图灵,Knuth,Yourdon?

我对这个问题没有一个明确的答案,尽管我希望看到有关并行编程理论的更多工作,这些理论将使工具能够为开发人员提取那些混乱的东西。

答案 28 :(得分:1)

很有趣,没人提到:

  • 调试。
  • 工具&你正在使用
  • 和您正在开发的平台。

如果您真正了解自己的工具,并且如果您知道如何轻松地调试某人 elses代码,那么您可以完成更多工作并让您的生活变得更轻松,那么日常开发会更有趣。

答案 29 :(得分:1)

来源控制

答案 30 :(得分:1)

对于Microsoft .NET人员

我认为Silverlight在接下来的几年甚至许多年都会变得巨大。

答案 31 :(得分:0)

有趣的是,我目前的软件工程课程已经涵盖了每个主题建议(除了少数几个),但Parallelism是一个先进的单元。也许知识的宽度比我们想象的更有限,而且每个主题可用的知识深度更有价值。 我建议学习一些符合标准的东西。我知道在一家我正在实习的公司,提供摄影课程,它与商业无关,但却让人们养成了学习的习惯。学习如何重新学习。