关于语言不可知:每个开发人员应该知道哪些高级软件开发主题?

What are some advanced software development topics every developer should know?

假设你的公司给了你时间和金钱,让你在一年内就可以吃到的许多高级编程主题接受培训,全权委托。这些主题是什么?您希望如何获得它们?

假设:

  • 您仍然有可交付成果要实现,但是您可以在一年中每月接受一周的培训。
  • 培训可以来自任何地方。例如:教室、现场讲师、书籍、订阅、播客等。
  • 主题可以涵盖任何平台、技术、语言、DBMS、工具集等。


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

为此,我可能会大量使用互联网研究;但在一所好大学学习一门校园入门课程可能是一个很好的开端。


安全!

太多的程序员只是构建一些东西,并认为他们可以在完成程序的"主要"部分之后添加安全性。你总是可以从了解更多关于如何保护你的应用程序,如何设计软件使其从一开始就安全,如何进行入侵检测等方面受益。

高级数据库开发

诸如数据仓库(MDX、OLAP查询、星型模式、事实表等)、高级性能调优、高级模式和查询模式等总是有用的。


国际化问题,尤其是因为听起来它不是一个高级主题。但事实的确如此。


下面是三个我发现自己一直在向没有得到足够的CS培训的初级开发人员解释。所有其他的东西通常都比物质更具炒作性,或者可以相当容易地被接受。但是如果你不知道这三个,你会造成很大的伤害:

  • 算法分析,包括大O表示法。
  • 不同层次的凝聚力和耦合。
  • Amdahl定律,以及它与优化的关系。

  • 可达性

    很多组织都忽视了这一点,但问题的简单事实是,有大量视力低下或没有视力、色盲或其他差异的人,这会使浏览网页成为一种非常令人沮丧的体验。如果每个人都至少接受过一些培训,我们可能会得到一些基于网络的uis,这些uis的包容性更强。


    面向对象的设计模式。


    我想"高级"对每个人都是不同的,但我建议大多数优秀的开发人员(即那些不需要被告知NP完整性或设计模式的开发人员)可以从以下方面获益:

    • 多线程技术在"锁定"之后以及何时应用它们。
    • 深入培训学习和习惯于聪明工具链中的功能(ide/text编辑器、调试器、探查器、shell。)
    • 一些密码学理论和实践经验,在人们创建的安全方案中有不同的常见缺陷。
    • 如果他们针对一个数据库编程,学习他们的数据库内部和高级查询组合和调优技术。


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


    不幸的是,对于大多数开发人员来说,沟通技巧似乎属于"高级主题"部分(当然,现在的公司不包括在内)。获得此技能的最佳方法:练习。

    • 拿起耳机,和某人而不是给我打电话或发邮件隔壁桌子的那个人。
    • 拿起电话和客户机而不是发送电子邮件越过栅栏。
    • 在会议上提问,而不是坐在笔记本电脑后面。屏幕上的叽叽喳喳声。
    • 积极参加工作中的非技术会议。
    • 在公共场合展示一些东西。

    大多数项目不会因为技术原因而失败。他们失败是因为他们无法创建一个团队。沟通对团队动态至关重要。

    它也不会损害你的事业。


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

    另外:这个主题可能并不重要——事实上,组织对它感兴趣,并且为它买单,开发人员想去做去做,这比任何一个特定主题都是成功/改进的更好指标。

    我也不认为这个话题有多重要。开发组织在一个项目中处理如此多的事情,以至于培训和在职实施/试用和错误总是能让您获得更好的视角——即使尝试/使用新事物的尝试失败了。这些经验可能会对后续项目有更多帮助。


    我是一个读书人,所以我不会真的费心指导。

    不一定按这个顺序,而且取决于你已经知道了什么

    • 物件导向程式
    • 函数式编程
    • 数据结构和算法
    • 并行处理
    • 基于集合的逻辑(本质上是SQL背后的理论以及如何应用它)
    • 构建解析器(我只放了这个,因为它实际上出现在我工作的地方)
    • 软件开发方法

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

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


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

    • Microsoft.NET框架v3.0/v3.5/v4.0
    • 云计算框架(Amazon EC2、Windows Azure Services、Gogrid等)
    • 设计模式


    我来自基于MS的开发者世界,下面是我的看法

  • 更多关于云计算的新概念(各种API等)。因为这个行业有一段时间在赌。

  • 有关.NET框架的Linq的详细信息

  • 分布式数据库


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

    知道如何重构是保持代码干净的最好方法——当您第一次正确地获得代码时(尤其是在新设计中),这是很少见的。

    但是,许多重构需要一组相当好的测试来检查重构是否没有添加意外行为。


    调试

    大卫·J·阿甘斯的《调试》是一本关于这个问题的好书。当您处理多线程程序、崩溃、不起作用的算法时,调试可能非常复杂。等等,每个人最好擅长调试。


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


    转到堆栈溢出devdays

    以及Accu会议

    • 敏捷软件开发、原则、模式和实践(Robert C.Martin)
    • 清洁代码(罗伯特·C·马丁)
    • 务实的程序员(Andrew Hunt和David Thomas)

    《银河系漫游指南》。


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


    我会投票支持真实的战斗故事。让其他组织的开发人员展示他们的成功和失败。不要将演示局限于您使用的技术。对于一个非常复杂的项目,这必然会切入到您甚至没有考虑过的"高级"主题中。现实世界中的成功(和失败)有很多东西要教。


    我认为一个高级程序员应该知道如何让你的雇主给你时间和金钱,让你在一年内就可以吃多少高级编程主题接受培训。我还没有进步。:)


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

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

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

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


    我希望如何获得培训?我希望有大量的公司时间致力于自我培训。


    我完全同意无条件的。我被要求在工作网站上查一下它,这是一个真正缺乏关于这个主题的良好知识,不仅缺乏CSS标准来帮助屏幕读者。

    然而,我的答案是GUI设计——这是一件很难纠正的事情。有太多可怕的应用程序可以通过花时间遵循人机交互(HCI)建议/设计来阻止。当你制作一个图形用户界面时,以谷歌/苹果为灵感,而不是你通常会被推出的数百个按钮/标签组合。


    我建议学习重构、测试驱动开发和各种单元测试框架(nunit、可视化测试、cpput等),我还将学习如何将自动化单元测试纳入持续集成构建中。

    最终,如果你能证明你的代码做了它声称它能做的,你就不必在那里回答关于为什么或如何做的问题。如果一个维护人员出现并试图"修复"您的代码,他们会立即知道是否破坏了代码。围绕需求(用例)编写的测试向维护人员解释了您的用户希望它做什么,并提供了一个如何调用它的工作示例。把单元测试看作功能文档。

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

    TDD之所以酷,是因为一个糟糕的接口(比如一个有很多依赖性的接口)也很难为其编写测试。很难让编码人员重构接口,使其更容易测试。重构简化了代码,删除了不适当的依赖项,或者将相关的测试分组在一起,以便于测试,从而提高了内聚性。当开发人员编写一个接口不好的模块时,通过让它立即对开发人员很明显,开发人员坚持体系结构,并遵循紧密内聚和松散耦合的原则。良好的界面是自然的结果。作为奖励,一旦你通过了所有的测试,你就知道你已经完成了。


    从表面上看,这似乎是一个很容易回答的问题,只需输入你最喜欢的关于其他开发人员不能正确做的事情的恼怒。但当我通读答案并思考时,我意识到20年前我的计算机科学本科课程中涵盖了所有"高级课题"。我怀疑OO、安全性、函数式编程等概念在那个时候已经改变了。当然,工具有,但我认为工具不同于主题。

    那么什么是计算机科学中的"高级课题"?谁是21世纪的图灵,克努斯,你的儿子?

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


    很有趣,没人提到:

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

    如果你非常了解你的工具,并且你能完成更多的工作,并且如果你知道如何轻松调试别人的代码,那么每天的开发会更有趣。


    源控制


    对于Microsoft.NET人员

    我认为Silverlight在未来的几年,甚至可能很多年都会是巨大的。


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


    有趣的是,每一个建议的主题(除了极少数)都已经在我当前的软件工程课程中介绍过,但是并行性是一个高级单元。也许知识的广度比我们想象的要有限,而且每个主题的知识深度更具价值。我建议学习一些不正常的东西。我知道我在一家公司实习,那家公司开设了一门摄影课程,与商业无关,但它让人们养成了学习的习惯。重新学习。