作为软件开发人员需要的技术技能


我们一度都是新手,开始时可能有点困难。但是,如果您刚刚成为一名专业软件开发人员,那么本文将包含一些实用且易于理解的建议。

如果你不能实际编写代码并开发软件,那么你所学到的所有软技能都不会对你有很大帮助。也许你会成为一名优秀的经理或管理人员,但不是软件开发人员。但是,如果您正在阅读本书的这一部分,我假设您有兴趣成为一名软件开发人员 - 或者更好的 - 所以让我们谈谈您需要了解的技术技能

捡起技能包

现在,这是一个倾向于压倒许多初级软件开发人员的话题,因为你可能感觉有 很多东西需要知道,甚至很难 知道从哪里开始

我将尝试将其分解为最有用和有益的 技术技能,这些技能最有助于您 成为软件开发人员

本章绝不是一本详尽的列表,列出了作为软件开发人员可能需要的所有技术技能,但我已经尝试列出了必要的技术,并在此给出了概述。

所以,如果没有进一步的说明,这里简要介绍一下我认为最重要的技术技能。

 

一种编程语言

我认为我们最好从这个开始,不是吗?

不知道编程语言真的不能成为程序员 - 你知道我的意思吗,对吧!

不过,我会很快说 ,选择哪种编程语言 并不像你想象的那么重要

相反,让我们来谈谈为什么我建议从一种编程语言开始,而不是试图学习太阳下的一切。

许多初学程序员试图通过一次学习几种编程语言或在他们尝试作为软件开发人员完成第一份工作之前来充实自己。

虽然我认为你最终应该学习不止一种编程语言,但 我建议不要提前做, 因为它只会导致混乱,并且会将你的精力从你需要学习的许多其他技术技能上转移开来。

相反,我建议你 深入学习并学习单一编程语言的细节,这样你就可以对用这种语言编写代码的能力充满信心。

 

书籍和文章推荐:

我挑选几本入门级的书籍和文章进行推荐,比较深入的书 等你学完可以自行选择购买

 

如何构造代码

在学习了编程语言之后 - 或者最好在学习它的同时 - 我坚信你需要知道的下一件事是如何正确地构建你的代码。

构建代码我的意思是什么?

我的意思是编写 好的,清晰的,可理解的代码,不需要大量的注释,因为代码本身是通用的

许多软件开发人员在没有学习这项技能的情况下经历了整个职业生涯,这很不幸,因为这是我和其他许多人评判软件开发人员技能和能力的主要方式。

良好的代码结构表明了对工艺的专注,而不仅仅是完成工作。

构建代码实际上是软件开发的艺术部分,但它也很重要,因为您和您的同事必须使用代码将花费更多时间来维护现有代码而不是编写新代码。

我不打算在本书中详细介绍如何正确构建代码 - 就像我说的 - 我已经为您提供了一个很好的资源,但 您应该努力学习如何从一开始就编写好的,干净的代码 而不是事后学习这个技能。

我可以保证,即使你是初学者,如果你能写出好的,干净的,简洁的,可理解的代码,在结构本身中表达它的意义,那么任何看到你的代码的浏览者都会 认为你是经验丰富的专业

在某种程度上,你将会,或者至少在未来的道路上,因为你将把编码视为一种职业,而不仅仅是一份工作

书籍和文章推荐:

 

面向对象设计

这个是有争议的,特别是如果你正在学习一种非面向对象(OO)的程序语言,但是 足够的软件开发世界会考虑OO设计,所以你需要确保你理解它

面向对象设计 是一种设计复杂程序的方法,这些程序将它们分解为单个类或对象(类的实例化),它们封装了功能并具有特定的角色和职责。

在软件开发中, 我们总是试图管理复杂性

根据对象进行思考有助于我们这样做,因为它允许我们从一堆交互组件中定义和设计一个复杂的系统,而不是试图从整体上解决整个复杂性。

今天有很多函数式编程语言,但是 在软件开发中你会发现的最流行的语言和模式仍然会受到面向对象设计和分析的影响。

您应该很好地理解类是什么,不同类型的继承是什么 - 以及何时使用它们 - 以及理解多态 和封装等术语 。

算法和数据结构

如果您参加传统的大学或大学计划获得计算机科学学位,这将是您将要学习或将要学到的内容的很大一部分。

算法是解决各种计算机科学/编程问题的常用方法。

例如,有几种算法通常用于以编程方式对事物列表进行排序。这些排序算法中的每一种都有一组不同的属性,包括速度,内存大小要求以及它所处理的理想数据类型。

在计算机科学领域有许多这样的算法,理解如何编写 这些算法的自己变体 以解决在解决实际编程问题时可能遇到的棘手问题也 很重要

通常,熟悉算法可以让一个开发人员在一小时内解决问题,这可能需要另一个开发人员几天才能弄明白。

除非你熟悉并且熟悉算法,否则你 甚至不知道已经存在一个优雅的解决方案。所以,仅仅因为这个原因,我认为这是一项有价值的技能。

数据结构属于类似的类别, 并与算法结合使用。

所有软件开发人员都应该熟悉几种数据结构,包括:

  • 数组或向量

  • 链接列表

  • 堆栈

  • 队列

  • 哈希

通过很好地掌握数据结构和算法,您可以轻松而优雅地解决许多困难的编程问题

当我第一次开始编程时,我在数据结构和算法上非常糟糕,因为我主要是自学成才。

很快,很明显这些技能在真正的编程世界中是多么有用,因为我遇到了以前不知道如何解决的问题,现在这些问题非常容易和有趣。

事实上, 我认为这是软件开发中最有趣的领域之一。通过解决一个棘手的问题并利用数据结构和算法来开发一个干净,优雅的解决方案非常有效。

学习这些东西是一个挑战,但非常值得。这是可以让你远远超过同龄人的技能之一。 软件开发人员的大多数人都在这方面设备不足

如果你想通过微软或谷歌等公司的面试, 你肯定需要掌握这个技能

书籍和文章推荐:

开发平台及相关技术

您应该对至少一个开发平台以及随之而来的相关技术或框架有一些经验和掌握。

平台是什么意思?

嗯, 通常它意味着操作系统(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#开发人员来说是一个巨大的好处。

技术栈有点不同。 技术栈是一组技术,通常包括框架,它们通常一起用于创建完整的应用程序

MongoDB是一种数据库技术。

Express.js是一个用于创建Web应用程序的Node.js框架。

AngularJS是一个前端JavaScript框架,用于为Web应用程序创建用户界面。

最后,Node.js是一个用于在JavaScript中开发基于Web的应用程序的运行时环境。

技术栈使创建应用程序变得更容易, 因为它们提供了许多开发人员用来开发应用程序的通用范例,因此可以轻松地共享知识,并且可以确保一组特定的技术可以协同工作。

学习技术栈可能非常有价值,因为这意味着您拥有开发完整应用程序所需的所有技能。许多拥有使用特定技术栈开发的应用程序的公司将寻找熟悉该技术栈并可以立即运行的软件开发人员。

基础数据库知识

虽然数据库的情况在过去几年中已经发生了很大的变化,但我认为数据库不会很快消失,所以我认为你可能应该对它们有所了解,不是吗?

在编写本文章时, 有两种主要的数据库技术:关系数据库和文档数据库。

我想说今天的开发人员至少应该熟悉关系数据库,并且可能也应该对非关系数据库有一些了解。

在软件开发中,数据库通常用于存储应用程序的数据。

当然,有些团队会有专门的数据库开发人员或数据库管理员(DBA),但这并不能让您至少不了解数据库的基础知识。

至少,你应该知道:

  • 数据库如何工作

  • 如何执行基本查询以获取数据

  • 如何插入,更新和删除数据

  • 如何将数据集连接在一起

此外,您可能希望了解如何 使用所选平台和/或框架以编程方式从代码中检索和存储数据

期望大多数开发人员能够编写可与数据库交互的代码。

书籍及文章推荐:

  1. 关系性数据库

    另外,MySQL 的官方文档,写的也是非常不错的,英语比较好的读者,也可以看看。

  2. 非关系数据库

 

版本控制

版本控制是任何软件开发项目的一个组成部分。

回到当年,在我们使用版本控制之前,我们将拥有项目所有文件进行网络共享,或者我们用U盘或者硬盘来回拷贝项目代码。

至少在大学时,进行项目开发和毕业设计的时候,我都是这么做的。

但是, 我当年比较年轻。我真蠢。你没有必要。

今天几乎所有的专业开发人员都应该知道如何使用版本控制来提交代码,检查代码,并希望合并来自多个源的更改

最基本级别的版本控制允许您保留对软件项目中不同文件所做更改的历史记录。

它还允许多个开发人员同时处理相同的代码 并将这些更改合并在一起。

我不会在这里详细介绍,但 您应该知道如何使用至少一个版本控制系统,并且您应该熟悉大多数基本的源代码控制概念。

几乎所有专业软件开发团队都会在当今的软件开发领域中使用某种版本控制。

书籍及文章推荐:

  1. 超级强烈推荐 《Git 教程》文字 + 图片 + 视频 。

文字 + 图片 + 视频 。

比较浅显易懂

  1. marklodato 《图解 Git》

构建和部署

今天,大多数软件开发项目都有某种自动构建和部署系统。

有几种不同的软件应用程序可以帮助团队自动完成这两项任务,这些任务曾经是手动的,对于某些团队来说仍然如此。

你问什么是构建和部署?

好问题。

至少,构建系统将编译所有代码并确保没有编译错误。

复杂的构建系统 还可以 运行单元测试或用户测试,运行代码质量检查,并提供 有关代码库当前状态的一些报告

部署系统 将负责将代码部署到生产计算机或部署到某种测试环境。

您不必是这些技术的绝对专家,但 至少要了解这些系统如何工作的基础知识以及构建和部署代码的过程非常重要

通常,创建和维护构建和部署系统的实际责任属于一个快速增长的领域,称为DevOps(开发人员操作的简称)。

但是,这并不能成为您理解至少这个过程如何运作的基础知识的借口。

书籍和文章推荐:

Jenkins官方网站

<<持续交付>>

测试

过去,开发人员不必了解有关测试的知识。

我们会编写一堆代码并将其“扔到墙上” 给一群测试人员,他们会在我们的代码中发现各种错误,我们会修复错误,就是这样。

不再。

有这么多软件项目采用所谓的敏捷过程(我们将在讨论方法时对此进行更多讨论),软件开发人员和测试人员必须 更紧密地合作。

质量确实成为整个团队的责任 -我认为它一直都是。

话虽如此,您需要了解有关测试的知识。

你应该至少熟悉一些基本术语,比如:

  • 白盒测试

  • 黑盒测试

  • 单元测试(不是真正的测试)

  • 边界条件

  • 测试自动化

  • 验收测试

我假设你至少想要成为一名优秀的开发人员 - 在将自己的代码提供给其他人之前测试它们。

如果你真的想成为一名专业人士,而不仅仅是一个黑客,这是不容 谈判的

调试

啊,许多新手软件开发人员将他的梦想砸在调试器的磐石上。

每个人都想写代码,对吗?

但是,没有人想调试他们的代码吗?你听到了吗?

真相时间。

作为一名软件开发人员,您将花费大约90%的时间来确定 您的代码无法运行的原因

我知道这不富有魅力。我知道你只想整天编写新的代码,但这个世界并没有这样做。

如果你使用测试驱动开发这样的方法,你可能会花很少的时间在调试器上,但无论你做什么,无论你如何尝试和绕过它, 你将不得不学习如何调试你的代码 或别人的。

所以,不要对自己知道的必须做的事情采取随意的方法,你应该 咬紧牙关,学习如何有效地做到这一点

方法

你需要知道的事情清单还有吗?这么吓人!

如果没有,这里还有一个 - 但我保证这是最后一个。

虽然一些软件开发团队刚刚开始编写代码并在完成后完成工作,但 大多数团队都有一些他们至少假装遵循的方法

(顺便说一下,请注意: 不要指望任何团队真正遵循他们自称使用的软件开发方法。我不是想在这里玩世不恭或指责。我只是一个现实主义者,而我碰巧知道有很多人说他们正在做像Scrum这样的软件开发方法,因为他们每天都会举行会议。)

因此,至少熟悉最常见的软件开发方法背后的一些基本思想至关重要。

今天,我想说这些是 瀑布式开发敏捷开发

大多数团队都声称他们正在做敏捷。敏捷本身就是一个非常宽松的概念,但是有一些实践,而且,我敢说,如果你想能够谈论谈话,你可以说,并且适合敏捷团队,你应该注意的仪式。

我们将在关于软件开发方法的章节中更深入地讨论这个问题。

书籍和文章推荐:

不堪重负?不要

我知道这是相当多的东西,而且我在这些主题的大部分内容上几乎都没有深入进去。

现在你可能会感到有些不知所措, 并且你不了解这些技术技能的大部分内容。

没关系。您不应该 - 除非您已经是一名职业软件开发人员,在这种情况下,您会感到羞耻!(开个玩笑。我爱你,但 你最好还是从新了解一下上述技能 - 真的。)

posted @ 2019-06-12 17:13  三升水  阅读(4794)  评论(0编辑  收藏  举报