除了技术技能之外,我是帮助软件开发人员开发“软技能”的大力支持者 - 实际上不可否认: 技术技能很重要。小编从事在线教育多年,将自己的资料整合建了一个QQ群,对于有兴趣一起交流学习java的可以加群:732976516,里面有大神会给予解答,也会有许多的资源可以供大家学习分享,欢迎大家前来一起学习进步!
我的意思是,如果你不能真正编写代码并开发软件,那么你所学到的所有软技能都不会对你有很大帮助。也许你会成为一名优秀的经理或教练,但不是软件开发人员。
但是,如果您正在阅读本书的这一部分,我假设您有兴趣成为一名软件开发人员 - 或者更好的 - 所以让我们谈谈您需要了解 的技术技能。
现在,这是一个倾向于压倒许多初级软件开发人员的话题,因为它可能感觉有 很多东西需要知道,甚至很难 知道从哪里开始。
我将尝试将其分解为最有用和最 有益的 技术技能,这些技能最有助于您 成为软件开发人员。
本章绝不是一个详尽的列表,列出了您作为软件开发人员可能需要的所有技术技能,但我已经尝试列出必要的技术并在此概述它们。
不要害怕。在本书的标题为“您需要了解软件开发的内容” 一节中, 我将为这些技能中的每一项技术专门写一章,我们将进行更深入的研究。
所以,如果没有进一步的说明,这里简要介绍一下我认为最重要的技术技能。
我认为我们最好从这个开始,不是吗?
不知道编程语言真的不能成为程序员 - 你知道我的意思吗,Vern?( 如果你没有得到那个参考,请参阅 Ernest P. Worrell。享受。)
我们将在巧妙地命名为“要学习什么编程语言”的章节中讨论选择要学习的编程语言,所以 不要强调这一点。
不过,我会很快说 ,选择哪种编程语言 并不像你想象的那么重要。
相反,让我们来谈谈为什么我建议从一种编程语言开始,而不是试图学习太阳下的一切。
许多初学程序员试图通过一次学习几种编程语言或在他们尝试作为软件开发人员完成第一份工作之前对冲他们的赌注。
虽然我认为你最终应该学习不止一种编程语言,但 我建议不要提前做, 因为它只会导致混乱,并且会将你的精力从你需要学习的许多其他技术技能上转移开来。
相反,我建议你 深入学习并学习单一编程语言的细节,这样你就可以对用这种语言编写代码的能力充满信心。
还记得在决定你将成为什么样的软件开发人员时,我们如何讨论尽可能具体的问题?
这就是这个想法。
在学习编程语言之后 - 或者最好在学习它的同时 - 我坚信你需要知道的下一件事是如何正确构建代码。
我已经为您提供了一个 很好的资源 来帮助您学习这项非常有价值的技能: Steven McConnell 完成的代码。
构建代码我的意思是什么?
我的意思是编写 好的,清晰的,可理解的代码,不需要大量的注释,因为代码本身是通信的。
许多软件开发人员在没有学习这项技能的情况下经历了整个职业生涯,这很不幸,因为这是我和其他许多人评判软件开发人员技能和能力的主要方式。
良好的代码结构表明了对工艺的专注,而不仅仅是完成工作。
构建代码实际上是软件开发的艺术部分,但它也很重要,因为您和您的同事必须使用代码将花费更多时间来维护现有代码而不是编写新代码。
我不打算在本书中详细介绍如何正确构建代码 - 就像我说的 - 我已经为您提供了一个很好的资源,但 您应该努力学习如何从一开始就编写好的,干净的代码 而不是事后学习这个技能。
我可以保证,即使你是初学者,如果你能写出好的,干净的,简洁的,可理解的代码,在结构本身中表达它的意义,那么任何看到你的代码的采访者都会 认为你是经验丰富的专业。
在某种程度上,你将会,或者至少在未来的道路上,因为你将把这个职业视为一种职业,而不仅仅是一份工作: 一个真正的工匠的标志。
这个是值得商榷的,特别是如果你正在学习一种非面向对象(OO)的程序语言,但是 足够的软件开发世界会考虑OO设计,所以你需要确保你理解它。
面向对象设计 是一种设计复杂程序的方法,这些程序将它们分解为单个类或对象(类的实例化),它们封装了功能并具有特定的角色和职责。
在软件开发中, 我们总是试图管理复杂性。
根据对象进行思考有助于我们这样做,因为它允许我们从一堆交互组件中定义和设计一个复杂的系统,而不是试图从整体上解决整个复杂性。
今天有很多函数式编程语言,但是 在软件开发中你会发现的最流行的语言和模式仍然会受到面向对象设计和分析的影响,如果不是完全的话。
您应该很好地理解类是什么,不同类型的继承是什么 - 以及何时使用它们 - 以及理解多态 和封装等术语 。
如果您参加传统的大学或大学计划获得计算机科学学位,这将是您将要学习或将要学到的内容的很大一部分。
算法是解决各种计算机科学/编程问题的常用方法。
例如,有几种算法通常用于以编程方式对事物列表进行排序。这些排序算法中的每一种都有一组不同的属性,包括速度,内存大小要求以及它所处理的理想数据类型。
在计算机科学领域有许多这样的算法,理解如何编写 这些算法的自己变体 以解决在解决实际编程问题时可能遇到的棘手问题也 很重要。
通常,熟悉算法可以让一个开发人员在一小时内解决问题,这可能需要另一个开发人员几天才能弄明白。
除非你熟悉并且熟悉算法,否则你 甚至不知道已经存在一个优雅的解决方案。所以,仅仅因为这个原因,我认为这是一项有价值的技能。
数据结构属于类似的类别, 并与算法结合使用。
所有软件开发人员都应该熟悉几种数据结构,包括:
通过很好地掌握数据结构和算法,您可以轻松而优雅地解决许多困难的编程问题。
当我第一次开始编程时,我在数据结构和算法上非常糟糕,因为我主要是自学成才。
在我开始在名为TopCoder的网站上竞争之前,我没有意识到它们的真正价值, 因为知道数据结构和运行它们的算法给你带来了严重的竞争优势。
很快,很明显这些技能在真正的编程世界中是多么有用,因为我遇到了以前不知道如何解决的问题,现在这些问题非常容易和有趣。
事实上, 我认为这是软件开发中最有趣的领域之一。通过解决一个棘手的问题并利用数据结构和算法来开发一个干净,优雅的解决方案非常有效。
至少在撰写本文时,最好的资源是Gayle Laakmann McDowell的优秀书籍 Cracking the Coding Interview。
在本书中,她简要介绍了有关算法和数据结构的所有知识。
学习这些东西是一个挑战,但非常值得。这是可以让你远远超过同龄人的技能之一。 软件开发人员的大多数人都在这个领域设备不足。
如果你想通过微软或谷歌等公司的面试, 你肯定需要掌握这个技能。
您应该对至少一个开发平台以及随之而来的相关技术或框架有一些经验和掌握。
平台是什么意思?
嗯, 通常它意味着操作系统(OS),但它也可以应用于其他类似于操作系统的抽象。
例如,您可能是专注于Mac或Windows操作系统的Mac开发人员或Windows开发人员,但您也可以是专注于特定Web平台的Web开发人员。
我不想将其归结为关于平台究竟是什么的讨论 - 不同的人会有不同的意见 - 但为了讨论的目的, 我将把平台定义为您开发的特定环境,它有自己的生态系统和特殊性。
再一次,这是另一个我不认为你 选择的东西如此重要的东西,就像你选择的东西一样。
公司通常雇用开发人员来开发特定的平台或技术。
如果您具有该特定平台的专业知识,那么作为iOS开发人员获得工作将更容易。
这意味着熟悉平台本身,以及程序员在为该平台开发时通常使用的开发工具,惯用模式和通用框架。
您可能认为编程语言的选择决定了平台,但实际上很少这样。
今天拿C#。您可以成为C#开发人员并为Windows,Mac,iOS,Android,Linux甚至嵌入式系统编写代码。
所以不要只选择一种语言; 选择一个平台。
除了学习特定的编程语言和平台之外,我还强烈建议学习一个框架,或者更好的是,一个完整的开发堆栈。
什么是框架?
什么是堆栈?
框架只是一组用于在特定平台或多个平台上开发代码的库。它通常使该平台上的常见编程任务更容易。
回到C#示例。大多数C#开发人员使用.NET Framework编写C#应用程序。.NET Framework由许多库和类组成,这些库和类允许C#开发人员在更高的抽象级别工作,因为他不必在每次想要做某事时完全重新发明轮子。
例如,.NET Framework的一部分包含用于处理图像的代码。这段代码从头开始编写起来非常困难,因此框架对于编写需要以某种方式操作图像的代码的C#开发人员来说是一个巨大的好处。
堆栈有点不同。 堆栈是一组技术,通常包括框架,它们通常一起用于创建完整的应用程序。
例如,有一个称为MEAN堆栈的公共堆栈。它代表MongoDB,Express.js,AngularJS和Node.js.
MongoDB是一种数据库技术。
Express.js是一个用于创建Web应用程序的Node.js框架。
AngularJS是一个前端JavaScript框架,用于为Web应用程序创建用户界面。
最后,Node.js是一个用于在JavaScript中开发基于Web的应用程序的运行时环境。
除非您要成为一名MEAN开发人员,否则了解所有这些并不重要 - 但重要的是要了解,如果您了解所有这些技术和框架,您将能够开发整个Web应用程序。
堆栈使创建应用程序变得更容易, 因为它们提供了许多开发人员用来开发应用程序的通用范例,因此可以轻松地共享知识,并且可以确保一组特定的技术可以协同工作。
学习堆栈可能非常有价值,因为这意味着您拥有开发完整应用程序所需的所有技能。许多拥有使用特定堆栈开发的应用程序的公司将寻找熟悉该堆栈并可以立即运行的软件开发人员。
虽然数据库的情况在过去几年中已经发生了很大的变化,但我认为数据库不会很快消失,所以我认为你可能应该对它们了解一两件事,不是吗?
在编写本书时, 有两种主要的数据库技术:关系数据库和文档数据库。
我想说今天的开发人员至少应该熟悉关系数据库,并且可能也应该对文档数据库有一些了解。
在软件开发中,数据库通常用于存储应用程序的数据。
当然,有些团队会有专门的数据库开发人员或数据库管理员(DBA),但这并不能让您至少不了解数据库的基础知识。
至少,你应该知道:
此外,您可能希望了解如何 使用所选平台和/或框架以编程方式从代码中检索和存储数据。
期望大多数开发人员能够编写可与数据库交互的代码。
源代码控制是任何软件开发项目的一个组成部分。
回到当天,在我们使用源代码控制之前,我们将拥有一个包含项目所有文件的网络共享,或者我们会使用不同版本的软件来回传递拇指驱动器。
我很惭愧地承认我不止一次参加过这些恶作剧。
但是, 我还年轻。我真蠢。你没有必要。
今天几乎所有的专业开发人员都应该知道如何使用源代码控制来检查代码,检查代码,并希望合并来自多个源的更改。
最基本级别的源代码控制允许您保留对软件项目中不同文件所做更改的历史记录。
它还允许多个开发人员同时处理相同的代码 并将这些更改合并在一起。
我们不会在这里详细介绍,但 您应该知道如何使用至少一个源代码控制系统,并且您应该熟悉大多数基本的源代码控制概念。
几乎所有专业软件开发团队都会在当今的软件开发领域中使用某种源代码控制。
今天,大多数软件开发项目都有某种自动构建和部署系统。
有几种不同的软件应用程序可以帮助团队自动完成这两项任务,这些任务曾经是手动的,对于某些团队来说仍然如此。
你问什么是构建和部署?
好问题。
那么,你知道如何编写代码并将其检入源控制系统吗?
有一些方法可以确保代码在您签入后确实有效。
这就是构建系统的用武之地。
至少,构建系统将编译所有代码并确保没有编译错误。
复杂的构建系统 还可以 运行单元测试或用户测试,运行代码质量检查,并提供 有关代码库当前状态的一些报告。
部署系统 将负责将代码部署到生产计算机或部署到某种测试环境。
您不必是这些技术的绝对专家,但 至少要了解这些系统如何工作的基础知识以及构建和部署代码的过程非常重要。
通常,创建和维护构建和部署系统的实际责任属于一个快速增长的领域,称为DevOps(开发人员操作的简称)。
但是,这并不能成为您理解至少这个过程如何运作的基础知识的借口。
过去,开发人员不必了解有关测试的知识。
过去,我们会编写一堆代码并将其“扔到墙上” 给一群测试人员,他们会在我们的代码中发现各种错误,我们会修复错误,就是这样。
不再。
有这么多软件项目采用所谓的敏捷过程(我们将在讨论方法时对此进行更多讨论),软件开发人员和测试人员必须 更紧密地合作。
质量确实成为整个团队的责任 -我认为它一直都是。
话虽如此,您需要了解有关测试的知识。
你应该至少熟悉一些基本术语,比如:
一个优秀的开发人员 - 我假设你想要至少成为一名优秀的开发人员 - 在将其提供给其他人之前测试他们自己的代码。
如果你真的想成为一名专业人士,而不仅仅是一个黑客,这是不容 谈判的。
啊,许多新手软件开发人员将他的梦想砸在调试器的磐石上。
每个人都想写代码,对吗?
但是,没有人想调试他们的代码吗?你听到了吗?
雅觉得我?
真相时间。
作为一名软件开发人员,您将花费大约90%的时间来确定 您的代码无法运行的原因。
我知道这不富有魅力。我知道你只想整天编写新的代码,但这个世界并没有这样做。
如果你应用像测试驱动开发这样的方法,你可能会花很少的时间在调试器上,但无论你做什么,无论你如何尝试和绕过它, 你将不得不学习如何调试你的代码 或别人的。
所以,不要对你知道自己必须做的事情采取随意的方法,你应该 咬紧牙关,实际上学习如何有效地做到这一点。
在关于调试的章节中,我将更多地讨论这个问题,但就目前而言,只要知道,你就必须知道如何去做。
你需要知道的事情清单还要吓人吗?
如果没有,这里还有一个 - 但我保证这是最后一个。
虽然一些软件开发团队刚刚开始编写代码并在完成后完成工作,但 大多数团队都有一些他们至少假装遵循的方法。
(顺便说一下,请注意: 不要指望任何团队真正遵循他们自称使用的软件开发方法。我不是想在这里玩世不恭或指责。我只是一个现实主义者,我碰巧知道有很多人说他们正在做像Scrum这样的软件开发方法,因为他们每天都会举行会议。)
因此,至少熟悉最常见的软件开发方法背后的一些基本思想至关重要。
今天,我想说这些是 瀑布式开发 和 敏捷开发。
大多数团队都声称他们正在做敏捷。敏捷本身就是一个非常宽松的概念,但是有一些实践,而且,我敢说,如果你想能够谈论谈话,你可以说,并且适合敏捷团队,你应该注意的仪式。
我们将在关于软件开发方法的章节中更深入地讨论这个问题。
我知道这是相当多的东西,而且我在这些主题的大部分内容上几乎都没有表面。
现在你可能会感到有些不知所措, 并且你不了解这些技术技能的大部分内容。