什么是每个开发者应该知道的一些高级软件开发主题?

假设您的公司已经给您时间和金钱来获得一年中您可以吃的高级编程主题的培训,全权负责。 那些话题会是什么样的呢?你想如何获得这些话题?

假设:

  • 你仍然有交付成果存在,但你可以允许一个月的一个星期的一年这个培训。
  • 培训可以来自任何地方。 IE:教室,现场指导员,书籍,订阅,播客等
  • 主题可以涵盖任何平台,技术,语言,DBMS,工具集等。

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

为此,我可能会大量使用互联网研究; 但是一所好大学的校内入学可能是一个很好的开始。

安全!

很多程序员只是在构build程序的“主要”部分后,才想到可以增加安全性。 您可以随时了解如何保护您的应用程序,如何devise安全的软件,如何进行入侵检测等。

高级数据库开发

数据仓库(MDX,OLAP查询,星型模式,事实表等),高级性能调优,高级模式和查询模式等等都是非常有用的。

以下是我总是向那些没有得到足够的CS培训的初级开发者解释的三个问题。 所有其他的东西通常比实质更炒作,或者可以相当容易地拿起。 但是如果你不了解这三者,你可能会造成很大的伤害:

  1. algorithm分析,包括Big O Notation 。
  2. 各种层次的凝聚力和耦合力 。
  3. 阿姆达尔定律 ,以及它如何与优化有关。

国际化问题,特别是因为它听起来像不会是一个先进的话题。 但它是。

无障碍

它被这么多组织所忽略,但事实的一个简单的事实是,有很多人视力低下,色盲或其他差异,可以使networking浏览一个非常令人沮丧的经验。 如果每个人都至less有一点点的培训,我们可能会得到一些更具包容性的基于networking的用户界面。

面向对象的devise模式。

我认为“高级”对每个人都是不同的,但是我build议以下做法是:大多数像样的开发者(即那些不需要被告知NP完整性或者devise模式的开发者)可以从下面获得:

  • 超越“locking”和何时应用它们的multithreading技术。
  • 深入培训,学习和习惯自己的工具链(IDE /文本编辑器,debugging器,剖析器,shell)的聪明function。
  • 一些密码学理论以及人们创造的安全scheme中不同常见缺陷的实践经验。
  • 如果他们针对数据库进行编程,请了解其数据库的内部结构以及高级查询组合和调优技巧。

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

不幸的是,交stream技巧似乎属于大多数开发者的“高级主题”部分(当然,目前的公司除外)。 获得这种技能的最佳方式是练习。

  • 拿起耳机,和别人聊天 ,而不是在旁边的办公桌上发个电子邮件。
  • 拿起电话,并客户交谈 ,而不是在围栏上发送电子邮件。
  • 在会议中提问 ,而不是坐在笔记本电脑屏幕后面的twittering。
  • 积极参加工作中的非技术性会议。
  • 在公共场合介绍

大多数项目不会由于技术原因而失败。 他们失败了,因为他们不能创build一个团队。 沟通对团队dynamic至关重要。

这也不会损害你的职业生涯。

我采取的最好的课程之一是技术写作课程。 在我的职业生涯中,这已经让我很满意。

另外:这个话题可能并不重要 – 组织对此感兴趣并为之付费的事实,开发者想要去做的事情是比任何一个特定主题更好的成功/改进的指标。

我也不认为这个话题是多么重要。 开发组织在一个项目中处理很多事情,即使试图使用新东西的尝试失败,培训,然后在工作实施/反复试验中,也会给你一些更好的视angular。 这个经验可能会对后续项目有所帮助。

我是一个书的人,所以我不会真的打扰教学。

不一定按照这个顺序,根据你已经知道的

  • OO编程
  • 函数式编程
  • 数据结构和algorithm
  • 并行处理
  • 设置基于逻辑(本质上是SQL背后的理论和如何应用它)
  • build立parsing器(我只是把它放在这里,因为它实际上是在我工作的地方)
  • 软件开发方法

NP完整性 。 具体来说,如何检测一个问题是否是NP完全的,以及如何build立一个近似的解决scheme。

我认为这很重要,因为您不希望开发人员尝试通过获得最佳解决scheme来解决NP完全问题 ,除非问题的search空间非常小,在这种情况下,powershell是可以接受的。 然而,随着search空间的增加,解决问题所需的时间呈指数增长。

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

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

我来自基于MS的开发者世界,所以这里是我的承担

  1. 更多关于云计算新概念(各种API等)。 因为行业在一段时间以来就在赌博。

  2. 更多关于.net框架的LinQ

  3. 分布式数据库

重构技术(这意味着也学会编写一套好的单元/functiontesting)。

知道如何重构是保持代码清洁的最好方法 – 当你第一次正确的时候(特别是在新的devise中),这是很less见的。

然而,许多重构需要一套体面的testing来检查重构是否不会增加意想不到的行为。

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

debugging

David J. Agans的debugging是关于这个话题的一本好书。 当你处理multithreading程序,崩溃,algorithm不起作用时,debugging可能非常复杂。 每个人都会擅长debugging。

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

转到Stack Overflow DevDays

和ACCU会议


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

那么如果你在这里,我希望现在你有基本的东西了:

  • OOP最佳实践
  • devise模式
  • 应用安全
  • 数据库安全/查询/模式

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

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

我认为一个高级程序员应该知道如何让你的雇主给你时间和金钱来获得一年中你可以吃的高级编程主题的培训。 我还没有进步。 🙂

我会build议在大学/大学的人工智能class。 大部分东西都很有趣,容易掌握(至less是基本的),解决问题的方法通常是创造性的。

银河旅游指南。

我怎么会喜欢获得培训? 我很乐意有相当多的时间用于自我培训。

我完全同意Accessabiitly。 我被要求在工作中考虑这个网站,并且对这个主题缺乏真正的知识,不仅缺乏CSS标准来帮助屏幕阅读器。

不过,我的答案是graphics用户界面devise – 这是一个相当困难的事情得到正确的。 有太多可怕的应用程序可以通过花时间遵循HCI(人机交互)build议/devise来防止。 在制作GUI时,让Google /苹果公司获得灵感,而不是典型的数百个button/标签组合,而这些组合往往被推出。

  • 自动化testing:unit testing,function集成testing,非functiontesting
  • 编译器详细信息(在某些平台上比其他平台更相关):编译器如何在语言X中实现某些通用结构? 在字节码解释的平台上,JIT编译如何工作? 什么可以JIT编译(例如,可以虚拟调用JIT编译?)?
  • 基本的networking安全
  • 来自其他问题领域的常用devise习惯用语,与目前您正在使用的领域相比,

我build议学习有关重构,testing驱动开发和各种unit testing框架(NUnit,Visual Test,CppUnit等)。我还将学习如何将自动化unit testing集成到持续集成构build中。

最终,如果你能certificate你的代码做它声称它可以做的事情,你不必在那里回答问题为什么或如何。 如果维护者出现并试图“修复”你的代码,他们会立即知道是否破坏了代码。 围绕需求(用例)编写的testing向维护者解释你的用户希望它做什么,并提供一个如何调用它的小例子。 把unit testing看作function文档。

testing驱动开发(TDD)是一种更为新颖的devise方法,从需求开始,在编写代码之前先写testing。 然后你写出足够的代码来通过testing。 在编写额外的代码(你可能永远不需要)之前,你必须停下来,因为如果你发现你真的需要这个代码的话,你将会重构它。

TDD很酷的地方在于,一个糟糕的界面(比如一个依赖很多的界面)也很难编写testing。 编码人员很难重构界面,以便testing。 而且这种重构简化了代码,消除了不适当的依赖关系,或者将相关的testing分组在一起,使testing变得更加容易,从而提高了内聚性。 开发人员在编写一个接口不好的模块时,立刻就会明白,开发人员坚持这种架构,并且倾向于紧密内聚和松散耦合的原则。 良好的接口是自然的结果。 作为奖励,一旦你通过了所有的testing,你就知道你已经完成了。

从表面上看,这似乎是一个容易回答的问题,只需input您最喜欢的关于其他开发人员无法正确执行的操作。 但是当我通读答案并思考时,我意识到,20年前我的本科计算机科学课程就涵盖了每一个“高级课题”。 我怀疑OO,安全性,函数式编程等概念在那个时候已经发生了变化。 当然这些工具有,但我认为工具不同于主题。

那么计算机科学中的“高级课题”是什么呢? 谁是二十一世纪的图灵,克努斯,你们的?

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

很有趣,没有人没有提到:

  • debugging。
  • 工具和IDE你一起工作
  • 和你正在开发的平台。

如果你知道自己的工具真的很好,并且如果你知道如何debugging某个人的代码,那么每天的开发都会更加有趣。

源代码pipe理