每一个优秀程序员必须具有的技术技能

我特别支持软件开发者在他们掌握技术技能的同时去学习“软技能”——事实上,我写了一本关于这方面的书——可是不能否认的是:技术技能很重要。前端

个人意思是,若是你不能编写代码和开发软件,那么你学习众多软技能有个卵用。也许你能够成为一名优秀的管理人员或指导人员,但不会是软件开发人员。程序员

若是你正在阅读这篇文章,那么我假设你有兴趣成为一个软件开发人员——或者是更优秀的软件开发人员——下面就让咱们来聊一聊你须要知道哪些技术技能。web

用技能赚钱

如今,有这样一种主流观念,压垮了不少新手软件开发者,那就是你须要学习不少东西才能成为软件开发人员,而且不少人不知道从哪里开始起步。面试

这里我会尝试着具体说明那些在你追求成为软件开发人员的路上将让你受益的必要技术技能。算法

一篇文章固然不能详尽说明做为软件开发者,你可能须要掌握的全部技术技能,可是我会列出最关键的一些技术技能。数据库

编程语言

我认为从这一条开始提及是最合适的。编程

不懂编程语言,怎么能成为一个真正的程序员数组

不过,关于选择哪一种编程语言去学习可能并无咱们想得那么重要这一点,请容许我一笔带过。网络

相反,让咱们谈一谈为何咱们要从一种编程语言开始,而不是试图去学习全部的东西。数据结构

许多新手程序员会试图一次性或在第一份工做以前学习几种编程语言,以便于有备无患。

虽然我认为你最终应该学会一种以上编程语言,但我不建议提早这样作,由于这只会致使混乱,而且会分散你须要学习的其余技能的精力。

相反,我建议你应该深刻研究,重点学习单一编程语言的前因后果,这样你才能对用这种编码语言来写代码信心十足。

那么在你决定想要成为何样的开发人员的时候,怎么样才能尽量地独树一帜呢?

如何构造代码

在学习了一门编程语言以后——或者最好是在学习的同时——我坚信,你须要知道的下一件事就是如何正确地构造你的代码。

有一个很好的资源来帮助你学习这个很是宝贵的技能:Steven McConnell的《Code Complete 》。

我所说的构造代码是什么意思呢?

个人意思是,要写出好的,清晰的,易于理解的代码,不须要大量注释,由于代码自己就是一种表达方式。

不少软件开发者在他们整个职业生涯都未曾去学习这个技能,这是不幸的,由于这是我——以及其余许多人——判断一个软件开发人员技术和能力的主要方式。

良好的代码结构展现了对这种技艺的热衷,而不只仅是为了完成工做。

构建代码是软件开发真正的艺术部分,但它也是相当重要的,由于你和你的同事得花费至关多的时间来维护现有的代码,而不是编写新的代码。

具体应该如何正确地组织代码我就不说了,由于我已经给出了一个很好的资源,可是要努力学习如何从一开始就写出好的、干净的代码,而不是过后学习这个技能。

我只能保证,即便你是个新手,若是你能够写出好的、干净又简洁的、易懂的,自己就能够表达意思的代码,那么任何面试官看到你的代码都会以为你是一个有经验的专业人士。

而且在必定程度上,或者至少在这条道路上,由于你会将这个职业看成一种专业,而不是一份工做。

面向对象的设计

这一条是有争议的,特别是若是你正在学习的编程语言并不面向对象,可是有大量的软件开发世界会按照面向对象设计的思惟思考,因此你须要确保你了解它。

面向对象的设计是一种将复杂程序设计分解为单独的类或对象(类的实例)的方法,其中封装功能且具备特定的角色和责任。

在软件开发中,咱们老是试图管理复杂性。

从对象的角度思考能够帮助咱们作到这一点,由于它能让咱们从一堆交互组件中定义并设计一个复杂的系统,而不是做为一个总体的试图解决整个复杂性。

如今的编程世界有着大量的函数式编程语言,但你在软件开发中找到的最流行的语言和模式,仍然深受面向对象设计和分析的影响。

你应该好好理解什么是类,继承的不一样类型——什么时候使用它们——还有理解像多态性和封装等术语。

算法和数据结构

若是你上传统院校学习并想得到计算机科学学位的话,那么这是一个很大的考点。

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

例如,有若干常见的在程序上用于排序的算法。每一种排序算法都有一系列关于速度,内存大小要求,以及数据理想类型的不一样属性。

计算机科学领域有不少这样的算法,而且理解如何变化这些算法来解决你可能遇到的棘手问题也很重要,当你解决现实编程问题的时候。

一般状况下,擅长这些算法可让一个开发人员在1个小时以内就能解决可能须要另外一个开发人员几天时间才能搞清楚的问题。

除非你熟悉和擅长算法,不然你甚至不知道已经有了优雅的解决方案在那里。所以,仅仅只为这个缘由,我认为这也是一个值得掌握的宝贵技能。

数据结构也是如此,而且能够与算法结合使用。

有几个全部软件开发者都应该熟悉数据结构中的,包括:

  • 数组或向量
  • 链表
  • 堆栈
  • 队列
  • 哈希
  • 集合

经过熟练掌握数据结构和算法,你能够轻松又优雅地解决许多艰难的编程问题。

当我开始编程的时候,我在数据结构和算法方面很是糟糕,由于我主要是靠自学的。

我一直都没有意识到它们的价值,直到我和一个名为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框架来编写C#应用程序。 .NET框架包括许多库和类,可以让C#开发人员在更高的抽象级别上工做,由于每当他想作什么事情的时候,没有必要彻底从新发明轮子。

例如,.NET框架的部分还包含了处理图像的代码。这类代码从头编写是极其困难的,因此框架极大地帮助了C#开发人员去编写须要以某种方式处理图像的代码。

堆栈则有点不一样。堆栈是一组技术,一般包括一个框架,而且常一块儿用于创造一个完整的应用程序。

例如,有一个常见的称为MEAN的栈。它表明MongoDB,Express.js,AngularJS,和Node.js。

MongoDB是一个数据库技术。

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

AngularJS是一个用于为web应用程序建立用户界面的前端JavaScript框架。

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

有没有理解全部这些东西并不重要—— 除非你打算成为一个MEAN开发者——重要的是要明白,若是你知道全部这些技术和框架,那么你就可以开发一个完整的web应用程序。

栈使得建立应用程序变得更容易,由于它们提供了一种许多开发者用来开发应用程序的通用范式,所以知识能够很容易地共享,而且你也能肯定哪些特定的技能集市能够一块儿工做的。

学习堆栈真的是很是有价值,由于这意味着你拥有开发一个完整的应用程序全部必要的技能。不少使用特定堆栈开发应用程序的企业,更愿意雇用那些熟悉那类堆栈可以立马开展工做的软件开发人员。

基础数据库知识

即便数据库的景色在过去几年时间里已经改变了很多,但我不认为数据库会很快消失,所以对此了解一二老是不会错的,对吧?

当前主要有两种数据库技术:关系数据库和文档数据库。

如今的开发人员至少应该熟悉关系数据库,并稍微了解文档数据库。

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

固然,有些团队甚至有专门的数据库开发人员或数据库管理员(DBA),可是这并不能真正容许你不懂至少是基本的数据库知识。

最起码,你应该知道:

  • 数据库如何工做
  • 如何执行基本的查询来获取数据
  • 如何插入、更新和删除数据
  • 如何链接数据集

此外,你可能会想知道如何以编程方式从你的代码与你所选择的平台和/或框架检索和存储数据。

大多数开发者被期待可以编写与数据库进行交互代码。

源代码控制

源代码控制是任何软件开发项目的组成部分。

在咱们使用源代码控制以前,咱们必须在网络上共享项目的全部文件,或者经过U盘来回查看存储在上面的不一样软件版本。

虽然我很不想认可,但个人确不止一次地玩过这个把戏。

可是,我还年轻。我蠢。你却不必像我这样。

当前,几乎全部专业的开发者人员都被期待懂得如何使用源代码控制来反复检查代码,并但愿懂得合并来自多个源的变化。

最基本层面的源代码控制可让你保持在一个软件项目中对不一样的文件所作更改的历史记录。

它还容许多个开发人员在同一时间工做于相同的代码,而后合并这些更改。

具体就不细说了,但你应该知道如何熟练地使用至少一个源代码控制系统,而且你应该熟悉大多数基本的源控制概念。

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

构建和部署

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

有几种不一样的软件应用程序,能够帮助软对自动化这两个任务,曾经是手动,固然对于某些团队而言,如今仍然如此。

你问什么是构建和部署?

好问题。

你知道如何写代码,并检入到源控制系统吗?

拥有一些方法来确保代码可在你检入后真正能工做很不错。

这就是构建系统的用武之地。

最起码,构建系统将编译全部代码,并确保没有编译错误。

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

部署系统将负责部署代码要么到生产机器要么可能到某种测试环境。

你没必要成为这些技术的绝对专家,可是了解至少这些系统如何工做的基础知识,以及构建和部署代码的过程,是很是重要的。

一般状况下,建立和维护构建和部署系统的实际职责属于所谓的DevOps(developer operations的简写)——这个快速增加的领域。

可是,这并不妨碍你至少了解关于这个过程如何工做的基础知识。

测试

曾几什么时候开发者并无必要知道太多关于测试的内容。

咱们习惯于写一串代码,而后扔给测试人员,让他们去找代码中的各类bug,而后咱们再来修复bug。

切不可再如此。

随着愈来愈多的软件项目开始采用所谓的敏捷过程,(后面再方法这一点中咱们再细谈),软件开发人员和测试人员不得不更密切地一块儿合做。

质量已真正成为了整个团队的责任——我却是更想说,它一直都是。

随之而来的是,你须要了解一些关于测试的东西。

你至少应该熟悉以下基本术语:

  • 白盒测试
  • 黑盒测试
  • 单元测试(不是真的测试)
  • 边界条件
  • 测试自动化
  • 验收测试

一个好的开发人员——我假设你至少想成为一个优秀的开发人员——会在将代码交给别人以前测试本身的代码。

若是你真的想被认为是专业的,并不是浪者虚名,那么这一条没有商量余地。

调试

嗯,不少新手软件开发人员在调试时都感受本身像是在用鸡蛋碰石头。

每一个人都但愿写代码,没错吧?

但好像没有人愿意调试本身的代码?

这就是真相。

大约90%的时间软件开发人员是用来搞清楚到底为何代码不能正常工做。

我知道你只是想可以成天写新的代码,可是此路不通。

若是你采用如测试驱动开发这样的方法,那么你可能会少花不少时间在调试上,但不管如何,无论你作什么,无论你如何努力,你都不得不学习如何调试代码或其余人的代码。

所以,与其采起一种随意的方式来作一些你不得不作的事情,还不如咬紧牙关不遗余力学会如何有效地作好这件事情。

方法

有没有被我列出来的须要知道的事情清单吓倒?

好吧,还有一个——可是我保证这是最后一个。

虽然一些软件开发团队才刚开始写代码,不择手段只要完成任务便可,可是大多数团队仍是至少遵循某种方法的。

出于这个缘由,熟悉一些最多见的软件开发方法背后的基本理念相当重要。

今天,我要说的是瀑布式开发和敏捷开发。

大多数团队会声称他们正在作敏捷。敏捷自己是一个很是松散的概念,但也有一些作法和——原谅个人措辞——固定程序是你应该知道的,若是你不想只是纸上谈兵,想要打造一支敏捷团队的话。

不堪重负?不须要

我知道这些内容统统要掌握的话,有点多,并且我仅仅触及了大多数主题表面的东西。

如今,你可能会以为有点不知所措,有点不堪重负,面对这些所谓的技术技能一片茫然。

不要紧。你不用不着这样,除非你已是一个软件开发从业人员,在这种状况下,可耻的是你!(开个玩笑。但你真的最好须要提升本身了,真的。)

无论怎样,我将在《What You Need to Know About Software Development》这本书中更深刻地谈论这些主题中。

因此,淡定点。

好吧,接下来,学习这些技术技能的时候到了,你准备好了吗?