如何成为优秀软件开发者:掌握关键技术

2024-07-02
来源:网络整理

原文链接:

目录

我更愿意帮助程序员学习“软技能”而不是开发技术——但毫无疑问,技术对于开发人员来说很重要!

我的意思是,如果你不掌握编程和开发技术,所有的软技能都不会对你有任何实际帮助。也许你可以成为一名优秀的经理或教练,但不能成为一名优秀的软件开发人员。

由于您正在阅读本书的这一部分,我假设您想成为一名软件开发人员 - 或者一名优秀的软件开发人员 - 所以让我们来谈谈您需要掌握的技能。

值得学习的技术

我先声明一下,本章的内容可能会吓跑很多初学者,因为他们会觉得要学的东西太多,甚至不知道从哪里开始。

我将尝试分解那些对您最有益且在您追求软件开发的过程中值得学习的技术。本章的目的并非列出您作为开发人员可能需要使用的所有技术,而是列出最核心和最有价值的技术并对其进行概述。

不要慌张,在本书的另一部分“软件开发需要掌握的技能”中,我会用一章的篇幅详细介绍下面列出的几乎所有技术。

因此,事不宜迟,这里是我认为最重要的技术的概述。

一种编程语言

我想每个人都是从这一点开始的。

如果不掌握一门编程语言,你就无法成为一名真正的程序员——你明白我的意思,对吧?我将在“我应该学习哪种编程语言”一章中详细介绍如何选择编程语言,所以在这里不要感到有压力。

让我在这里快速提一下,选择学习哪种编程语言可能并不像你想象的那么重要。相反,我建议你先选择一种语言来学习,而不是试图学习世界上曾经存在的每一种语言。

许多初学者甚至在找到软件开发人员的工作之前就尝试学习多种语言。我认为掌握多种编程语言是必要的,但我反对一开始就学习不同的语言,因为这很容易导致混乱,并分散你对真正需要学习的其他技术的注意力。

我的建议是深入学习一门编程语言,直到你有信心用该语言编写任何代码。

还记得我们在上一章中讨论过,在决定要成为哪种类型的开发人员时,尽可能具体是很重要的吗?选择编程语言时也是如此。

如何组织你的代码

在学习了你的第一门编程语言之后——或者在你学习它的过程中——你接下来需要学习的是如何正确地组织你的代码。

对于这个极其宝贵的技能,我在第一章推荐了一个非常好的资源:Code 。

组织机构代码是什么意思?

我指的是编写清晰易懂的代码,不需要大量的注释,因为它是不言自明的。许多开发人员在职业生涯中从未掌握过这项技能,这很不幸,因为正是这项技能——以及许多其他技能——是我判断开发人员技术能力的标准。

编写优秀的代码表明一个人除了完成需求之外还有自己的追求。组织代码确实是软件开发艺术的一部分,但它也相当困难,因为你和你的同事需要在你的代码上工作并花费大量时间来维护它,而不是编写新代码。

我不会在本书中讨论如何编写清晰的代码——就像我说的——我已经向你推荐了一个优秀的资源,但你应该从一开始就学习如何编写好的、清晰的代码,而不是等到以后再学。

我可以保证,即使你是一个初学者,只要你能编写优雅,整洁,干净,易于理解和不言自明的代码,人们就会在面试时将你视为经验丰富的开发人员。

这种技能是必须具备的,因为你不仅会把开发当成一份工作,还会把它当成自己的事业:这就是工匠精神的体现。

面向对象设计

这一点是有争议的,特别是如果你没有学习面向对象(OO)编程语言,但软件开发很大程度上基于面向对象的设计,所以你需要确保掌握它。

面向对象设计可以把复杂的程序设计分解成独立的类和对象(类的实例),这种方法可以对功能进行封装,每个类和对象都有特定的作用和功能。

管理复杂性是我们在软件开发中要做的工作。以对象的方式思考有助于我们做到这一点,因为它使我们能够将复杂系统定义和设计为一组相互关联的组件,而无需直接操纵整个复杂系统。

现在有很多函数式编程语言,但是在软件开发中遇到的大多数语言和模式仍然受到面向对象设计和分析的严重(如果不是完全)影响。

您应该很好地掌握类、不同类型的继承(包括何时使用它们)以及多态性和封装等术语的含义。

算法和数据结构

如果您在传统大学或学院学习计算机科学,算法和数据结构将占据您将要(或已经)学习内容的很大一部分。

算法是解决不同计算机科学/编程问题的通用解决方法。

例如,有很多算法可以用来对一系列连续数据进行排序,这些算法各自都有不同的特点,比如排序速度、内存大小要求、以及适合什么类型的数据集等。

计算机科学中已经存在很多此类现成的算法,掌握如何编写这些现成算法的变体以解决实际编程中遇到的困难问题也十分重要。

通常,一个拥有出色算法的开发人员可以在一小时内解决其他程序员需要几天才能解决的问题。除非你熟悉各种算法并很好地掌握它们,否则你可能完全不知道一些现成的、优雅的解决方案。仅凭这个原因,我认为这是一项值得学习的宝贵技能。

数据结构类似,算法相互补充。

所有软件开发人员都必须知道一些数据结构:

掌握数据结构和算法可以帮助我们轻松而优雅地解决许多困难的编程问题。

当我刚开始编程时,我的数据结构和算法很糟糕,因为我基本上是自学的。

直到我参加了一个叫做“数据结构和算法”的网站的竞赛,我才真正意识到它们的价值。掌握数据结构和算法并熟练操作它们可以为你带来巨大的竞争优势。

我很快发现这些技术在现实世界的编程中非常有用,因为我以前无法解决的问题现在变得很容易且有趣地解决了。

事实上,我发现这是软件开发所有领域中最有趣的部分之一。当你使用数据结构和算法为一个困难的编程问题想出一个简洁、优雅的解决方案时,感觉真是太棒了。

最好的资源(至少在写这本书的时候)是一本优秀的书“the”(中文版:《程序员面试金典》)。

在这本书中,她解释了您需要了解的所有算法和数据结构。

学习数据结构和算法是一项艰苦的工作,但它绝对值得,而且是一项能让你从同事中脱颖而出的技能。大多数软件开发人员在这方面的知识很少。

同时,如果你想通过微软这样的大公司的面试,这项技能也是必不可少的。

开发平台及相关技术

你应该熟练掌握至少一个开发平台及其相关技术,或者与该平台相关的框架。

我所说的平台是什么意思?

嗯,通常它是指操作系统,但它也可以适用于一些类似于操作系统的抽象。

例如,您可能是 Mac 或使用 Mac 或在 Mac 上进行开发的开发人员,但您也可能是专门研究特定 Web 开发平台的 Web 开发人员。

我不想参与关于开发平台到底意味着什么的争论——不同的人会有不同的看法——但为了本次讨论的目的,我将开发平台定义为您用来进行开发工作的特定环境,它有自己的生态系统和特性。

我再说一遍,我想说,选择哪个开发平台并不重要,只要你选择一个就行。

公司经常雇用使用特定平台或技术进行开发的开发人员。

如果你是 iOS 开发人员,如果你精通在这个特定平台上进行开发,你将更容易找到工作。

掌握一个开发平台不仅需要熟悉平台本身,还需要熟练使用该平台的相关开发工具、常见模式、常用框架等。

您可能认为编程语言的选择限制了平台的选择,但通常情况并非如此。

以 C# 为例,你可以使用 C# 为 Mac、iOS 甚至嵌入式系统进行开发。

所以,当你选择编程语言时,你也应该选择一个开发平台。

框架与技术栈

除了学习具体的编程语言和开发平台工具之外,我还强烈建议大家学习一定的框架,当然最好掌握这个框架相关的技术栈。

什么是框架?

什么是技术栈?

简单来说,框架就是一些库的集合,可以帮助我们在某个平台或者跨平台进行开发。通常,框架可以帮助我们更轻松地完成该平台上常见的编程任务。

回到 C# 示例,大多数 C# 开发人员使用 .NET 框架来开发 C# 应用程序。.NET 框架由许多库和类组成,允许开发人员在更高的抽象级别进行开发,避免每次需要完成某些任务时都重新发明轮子。

例如,.NET 包含用于图像处理的代码。从头开始编写这些代码非常困难,因此对于想要执行某种图像处理的 C# 开发人员来说,使用该框架是一个巨大的好处。

技术栈稍有不同。技术栈是我们在开发完整应用程序时经常一起使用的一组技术,通常包括一个框架。

例如,有一个常用的技术栈称为 MEAN 栈。它代表 .js 和 Node.js。

它是数据库技术。

.js 是一个用于开发 Web 应用程序的 Node.js 框架。

它是一个用于开发 Web 应用程序用户界面的前端框架。

小程序开发需要什么东西_开发的程序_开发程序东西需要小窗口吗

最重要的是,Node.js 是一个用于开发 Web 应用程序的运行环境。

你不需要完全理解这些词的含义——除非你想成为一名 MEAN 开发人员——更重要的是,你需要明白如果你掌握了所有这些技术和框架,你就可以开发一个完整的 Web 应用程序。

技术栈使开发应用程序变得更容易,因为它们为您提供了大多数开发人员用来开发应用程序的通用范例,因此这些知识可以轻松共享,并且您可以确信这套技术将很好地协同工作,因为它已经被其他开发人员证明过。

学习某种技术栈非常有价值,因为这意味着你掌握了开发一个完整应用所需的所有技术。许多公司都有使用某种技术栈开发的应用,这些公司更愿意寻找熟悉使用这种技术栈的开发人员,因为他们可以更快地开始开发。

基本数据库知识

过去几年,数据库领域发生了很大变化,但我看不到任何迹象表明它会很快消失,所以我认为你至少应该掌握基础知识。你觉得呢?

在撰写本书时,有两种主流数据库技术:关系型数据库和文档型数据库。我认为开发人员至少应该熟悉关系型数据库,并对文档型数据库有一定的了解。

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

有些团队会有专门的数据库开发人员或数据库管理员(DBA),但这并不是您不学习一些数据库基础知识的理由。

您至少应该了解以下内容:

此外,你可能还需要知道如何在你的开发平台和框架中使用代码来查询和存储数据。大多数开发人员应该能够使用代码与数据库进行交互。

源代码控制

源代码控制也是软件开发项目的一个组成部分。

在没有源代码控制的年代,我们只能通过网络共享所有项目文件,或者通过U盘共享不同版本的项目。

我很惭愧地承认,在我的开发生涯中,我曾多次使用这种方法来管理项目。但是,我太年轻,太愚蠢了。你不必犯同样的错误。

当今所有专业程序员至少应该知道如何使用源代码控制来签入、签出和合并代码更改。

从最基本的层面上讲,源代码控制用于帮助您保存软件项目中不同文件的更改历史记录。它还允许多个开发人员同时处理一个项目并合并他们的更改。

我不会在这里详细介绍,但您至少应该很好地掌握如何使用源代码管理系统,并且应该清楚源代码控制的大部分基本概念。

在当今的软件开发领域,几乎所有的专业开发团队都使用某种源代码控制。

构建和部署

大多数软件项目都有一些自动构建和部署系统。

有许多不同的软件可以帮助团队自动执行以前手动完成的任务,但有些团队仍然使用手动方法。

您可能会问,什么是构建和部署?

好问题。你现在应该知道如何将代码签入源代码管理了,对吧?

通常,采取某种方式来确保代码在签入源代码控制时能够正确运行是一个好主意。

这时构建系统就派上用场了。构建系统至少会编译您的所有代码并确保没有编译错误。功能齐全的构建系统还会运行单元测试和用户测试、运行代码质量检查,并提供有关代码库当前状态的某种报告。

部署系统负责将代码部署到生产机器或某种类型的测试环境。

您不需要成为这些技术的专家,但了解这些系统的工作原理以及构建和部署代码的过程的一些基本知识很重要。

通常,创建和维护构建和部署系统的实际责任是最近迅速出现的领域,称为。

同样,这也不是不了解这些过程如何运作的理由。

测试

过去,成为一名程序员并不需要具备测试知识。

过去,我们只需要编写一堆代码,将其交给一堆测试,测试就会发现代码中的一堆错误,然后我们只需修复这些错误即可。

这已不再是人们认为事情有所不同的时代。

现在很多软件项目都采用敏捷开发(我们将在开发模型中详细讨论),这需要程序员和测试人员之间更加紧密的合作。

确保软件质量现在是整个团队的责任 —— 事实上,我认为一直都是这样的。

因为,你还需要了解一些有关测试的知识。你至少应该熟悉以下术语:

一个好的开发人员——我认为你至少想成为一名好的开发人员——在将代码交给其他人之前会对其进行测试。

如果您想成为一名专业的程序员,而不仅仅是一名黑客,这是不可谈判的。

调试

许多新手软件开发人员的梦想都被调试器毁掉了。

每个人都想编写代码,对吧?有人想一直调试代码吗?

欢迎来到真实的世界。

作为一名软件开发人员,你将花费 90% 的时间来弄清楚为什么你的代码无法运行。

我知道这不是一个很有吸引力的事实。我知道你愿意花时间编写新代码,但世界并不按你希望的方式运转。

如果您使用测试驱动开发,您可能会在调试器上花费更少的时间,但无论您做什么,无论您多么努力地避免它,您仍然必须学习如何调试您自己的代码或别人的代码。

所以,与其让自己对要做的事情有一个模糊的概念,不如下定决心真正掌握如何高效的完成它。

我将在调试章节中更详细地讨论这一点,但现在,您只需要知道如何去做。

软件开发方法

您是否对需要掌握的一长串技能感到畏惧?

如果你还没有看过,这里还有一篇 - 但我保证这是最后一篇。

一些开发团队只是简单地编写代码直到所有事实都完成,而大多数团队使用某种类型的开发方法,或至少假装他们这样做。

(顺便说一句,不要指望任何团队真正遵循他们声称正在使用的软件开发方法。我并不是想批评或评判。我只是一个实用主义者,我碰巧认识很多人声称他们正在使用像 这样的软件开发方法,只是因为他们每天都有站立会议。)

因此,你至少应该了解最常见的软件开发方法的基础知识。目前,最常见的方法是瀑布式开发和敏捷开发。

许多团队声称他们采用敏捷开发。敏捷本身的定义非常广泛,但它包括许多实践或仪式,您必须了解这些实践或仪式才能在敏捷团队中生存。

我们将在软件开发方法章节中深入讨论这项技术。

信息太多?别慌

我知道需要了解的内容很多,但我们实际上甚至还未触及大多数主题的表面。

现在你可能会觉得信息量有点太大了,觉得自己对其中大部分技术都不了解。在这个阶段,什么都不懂是很正常的——除非你已经是一个经验丰富的软件开发人员。

无论如何,我将在“掌握软件开发所需的技能”部分更深入地介绍这些技术中的大多数,所以现在,只需放松,不要害怕。

接下来我会教给大家学习技术的一般方法,这样当大家在后面的章节遇到这些具体的技术时,就知道如何正确的去学习它们。

嘿,约翰

我注意到书中有很多链接,看起来您正在推广许多其他产品和工作……发生了什么事?

嗯,我很高兴你问了这个问题。

首先,让我们讨论一下这些链接。

是的,这本书里有很多链接。但别担心,你不必打开所有链接。你可以随意点击它们,或者只阅读你感兴趣的链接。

大多数情况下,我会尝试链接到我之前写过的有关该主题的信息,因为有人可能对某个主题感兴趣并想了解更多相关内容。

大多数这些链接都会转到我的博客或视频,我通常会在那里详细介绍该主题 - 或者只是为了好玩。

(此外,如果您点击本书中的任何链接 - 或手动将其输入浏览器中 - 您将被带到一个列出本书所有链接的页面,逐章列出。)

至于插入我的其他产品,是的,你是对的,我肯定会这样做。

我认为这是非常明智的。

书籍本身非常便宜,而且你不可能通过写书赚很多钱。

事实上,如果你写了一本书,你写它的理由应该不仅仅是为了赚钱,而我写这本书的理由之一就是帮助推广我认为对你来说可能有价值的其他产品和“作品”。

这并不意味着我在向您发送垃圾邮件,而且您不必购买任何东西 - 这本近 800 页的书本身就具有很大的价值 - 但如果您有兴趣,产品就在那里,我会继续推广它们。

分享