我是帮助软件开发人员开发除技术技能之外的“软技能”的坚定支持者。但是不可否认:技术技能很重要。
我的意思是,如果您实际上不能编写代码和开发软件,那么您学到的所有软技能都不会真正帮到您。也许您会成为一名优秀的项目经理,而不是一名优秀的软件开发人员。
但是,如果您正在阅读本书的这一部分,那么我假设您有兴趣成为一名软件开发人员,或者成为一名更好的软件开发人员,因此,让我们谈谈您需要了解的技术技能。
一种编程语言
我认为最好从这个开始,不是吗?
真的不懂编程语言就不能成为程序员-你知道我的意思吗,
我们将在巧妙地命名为“要学习的编程语言”一章中讨论选择要学习的编程语言,因此,请不要再强调这一点。
不过,我很快会说, 选择学习哪种编程语言并不像您认为的那么重要。
相反,让我们谈谈为什么我建议只从一种编程语言开始,而不是尝试学习阳光下的一切。
许多刚开始的程序员试图通过一次或多次学习几种编程语言来对冲自己的赌注,然后才尝试担任软件开发人员的第一份工作。
虽然我认为您最终应该学习一种以上的编程语言,但 我建议不要提前使用它,因为这只会导致混乱,并且会将您的精力从您需要学习的许多其他技术技能中转移出来。
相反,我建议您 深入学习,并专注于学习单一编程语言的来龙去脉,以便对使用该语言编写代码的能力充满信心。
还记得我们在决定要成为什么样的软件开发人员时如何谈论尽可能具体的事情?
这就是这里的想法。
如何构造代码
在学习了一种编程语言之后,或者最好是在学习它的同时,我坚信,接下来您需要知道的是如何正确地构造代码。
结构化代码是什么意思?
我的意思是编写 优秀,清晰,可理解的代码,因为代码本身是可交流的,因此不需要大量注释。
许多软件开发人员在整个职业生涯中都没有学习此技能,这是不幸的,因为这是我以及其他许多人判断软件开发人员的技能和能力的主要方式。
良好的代码结构显示出对工艺的奉献精神,而不仅仅是完成工作。
结构化代码确实是软件开发中的艺术部分,但也很关键,因为您和您的必须与您的代码一起工作的同事将花费大量时间维护现有代码,而不是编写新代码。
就像我说过的那样,我不会在本书中讨论如何正确地构建代码,因为我已经为您提供了很好的资源,但是 您应该从一开始就努力学习如何编写优质,简洁的代码。 而不是事后学习这项技能。
我可以保证,即使您是初学者,也可以编写出清晰,简洁,易懂的代码来表达其在结构本身中的含义,几乎所有看到您的代码的面试官都将 假设您是有经验的专业人士。
在某种程度上,您将成为,或者至少在将来会成为,因为您将把这个职业视为一种职业,而不仅仅是一份工作: 一个真正的工匠的标志。
面向对象设计
这是值得商bat的,尤其是在您学习的不是面向对象(OO)的程序语言时,但是在软件开发界,有 足够的人从OO设计的角度来思考,因此您需要确保自己理解它。
面向对象设计 是一种设计复杂程序的方法,该程序将它们分解为单独的类或对象(类的实例),这些类或对象封装了功能并具有特定的角色和职责。
在软件开发中, 我们始终试图管理复杂性。
以对象的方式思考有助于我们做到这一点,因为它使我们能够从一堆相互作用的组件中定义和设计一个复杂的系统,而不是试图从整体上解决整个复杂性。
当今有许多功能性编程语言,但是 在软件开发中可以找到的最流行的语言和模式,即使不是全部,也仍然会受到面向对象设计和分析的严重影响(即使不是完全)。
您应该对类是什么,继承的不同类型是什么以及何时使用它们有一个很好的了解,并且应该理解诸如多态性 和封装之类的术语 。
算法和数据结构
如果您修读传统的学院或大学课程来获得计算机科学学位,那么这将是您所学或将学到的大部分内容。
算法是解决各种计算机科学/编程问题的常用方法。
例如,有几种算法通常用于以编程方式对事物列表进行排序。这些排序算法中的每一个都具有关于速度,内存大小要求以及所处理的理想数据类型的不同属性集。
计算机科学领域中有许多这样的算法,了解如何编写自己的这些算法的变体 以解决在解决实际编程问题时可能遇到的棘手问题也 很重要。
通常,擅长算法可以使一个开发人员在一个小时内解决问题,这可能需要另一位开发人员花费几天的时间才能弄清楚。
除非您熟悉算法并精通算法,否则您 甚至都不知道那里已经存在一个优雅的解决方案。因此,仅出于这个原因,我认为这是一项宝贵的技能。
数据结构属于相似的类别,并与算法结合使用。
所有软件开发人员都应该熟悉几种数据结构,包括:
· 数组或向量
· 链表
· 堆栈
· Queue列
· 树木
· 散列
· 套装
通过很好地掌握数据结构和算法,您可以轻松而优雅地解决许多困难的编程问题。
刚开始编程时,我真的很擅长数据结构和算法,因为我大多是自学成才。
直到我开始在一个名为TopCoder的站点上竞争时,我才意识到它们的真正价值。 在该站点上 ,了解数据结构和对其进行运算的算法为您带来了明显的竞争优势。
很快,当我遇到以前不知道如何解决的问题时,这些技能在实际的编程世界中变得多么有用,而这些问题现在变得非常容易且有趣。
实际上, 我认为这是软件开发中最有趣的领域之一。解决一个棘手的问题并利用数据结构和算法来开发出性能良好的干净,优雅的解决方案,这确实是一种收获。
至少在撰写本文时,最好的资源是GayleLaakmannMcDowell的绝妙著作《 CrackingtheCodingInterview》。
在本书中,她介绍了您需要了解的有关算法和数据结构的所有内容。
学习这些东西是一个挑战,但值得。这是可以使您远远超越同行的技能之一。 在这一领域,许多软件开发人员装备不足。
而且,如果您想在像Microsoft或Google这样的公司进行面试, 您肯定需要掌握这种技能。
开发平台及相关技术
您应该对至少一个开发平台以及与之配套的相关技术或框架有一定的经验和精通。
平台是什么意思?
好吧, 通常它指的是操作系统(OS),但是它也可以应用于其他类似于操作系统的抽象。
例如,您可以是专注于Mac或Windows操作系统的Mac开发人员或Windows开发人员,但也可以是专注于特定Web平台的Web开发人员。
我不想将其归纳为一个平台究竟是什么的讨论(不同的人会有不同的看法),但是出于讨论的目的, 我将定义一个平台作为您要为其开发的特定环境。拥有自己的生态系统和特殊性。
再说一遍,这是另一件事,我认为您选择的内容并不那么重要,而是您选择的东西是如此重要。
公司通常会聘请开发人员针对特定平台或技术进行开发。
如果您具有特定平台的专业知识,则可以轻松获得iOS开发人员的工作。
这意味着要熟悉平台本身,以及程序员在针对该平台进行开发时通常使用的开发工具,惯用模式和常用框架。
您可能会认为编程语言的选择决定了平台,但实际上情况并非如此。
今天就使用C#。您可以成为C#开发人员,并为Windows,Mac,iOS,Android,Linux甚至嵌入式系统编写代码。
因此,不要只选择一种语言。选择一个平台。
框架或堆栈
除了学习特定的编程语言和平台之外,我还强烈建议您学习一个框架,或者更好的是,它附带一个完整的开发堆栈。
什么是框架?
什么是堆栈?
框架只是一组库,用于在特定平台或多个平台上开发代码。通常,它使该平台上的常见编程任务更加容易。
回到C#示例。大多数C#开发人员都使用.NETFramework编写C#应用程序。.NETFramework由许多库和类组成,它们使C#开发人员可以在更高的抽象水平上工作,因为他不必每次想做的事情都完全重新发明轮子。
例如,.NETFramework的一部分包含用于处理图像的代码。从头开始编写该代码将非常困难,因此对于C#开发人员编写需要以某种方式处理图像的代码而言,该框架是一个巨大的好处。
堆栈有点不同。 堆栈是通常结合在一起使用以创建完整应用程序的一组技术,通常包括一个框架。
例如,有一个通用的堆栈称为MEAN堆栈。它代表MongoDB,Express.js,AngularJS和Node.js。
MongoDB是一种数据库技术。
Express.js是用于创建Web应用程序的Node.js框架。
AngularJS是用于创建Web应用程序用户界面的前端JavaScript框架。
最后,Node.js是用于在JavaScript中开发基于Web的应用程序的运行时环境。
除非您将成为MEAN开发人员,否则了解所有内容并不重要,但要理解的重要一点是,如果您了解所有这些技术和框架,就可以开发整个Web应用程序。
堆栈使创建应用程序更加容易,因为它们提供了许多开发人员用来开发应用程序的通用范例,因此可以轻松共享知识,并且可以确保特定的技术集可以协同工作。
学习堆栈非常有价值,因为这意味着您具有开发完整应用程序所需的所有技能。许多拥有使用特定堆栈开发的应用程序的公司都将寻找熟悉该堆栈并可以开始运作的软件开发人员。
基本数据库知识
即使最近几年数据库的状况发生了很大变化,我也看不到数据库很快就会消失,所以我认为您可能应该了解一两件事,不是吗?
在撰写本书时, 主要有两种数据库技术:关系数据库和文档数据库。
我想说,今天的开发人员至少应该熟悉关系数据库,并且可能还应该对文档数据库有所了解。
在软件开发中,数据库通常用于存储应用程序的数据。
当然,有些团队将有专门的数据库开发人员或数据库管理员(DBA),但这并不能为您起码至少不了解数据库的基础。
至少,您应该知道:
· 数据库如何工作
· 如何执行基本查询以获取数据
· 如何插入,更新和删除数据
· 如何将数据集连接在一起
另外,您可能会想知道如何 使用所选平台和/或框架以编程方式从代码中检索和存储数据。
期望大多数开发人员能够编写可以与数据库交互的代码。
源代码控制
源代码控制是任何软件开发项目的组成部分。
回顾过去,在使用源代码管理之前,我们将与项目中的所有文件共享网络,或者在其上使用不同版本的软件来回传递拇指驱动器。
我很ham愧地承认我不止一次参与了这些恶作剧。
但是, 我还年轻。我真蠢啊。您不必如此。
如今,几乎所有专业开发人员都应该知道如何使用源代码控制来检入代码,检出代码,并希望合并来自多个源的更改。
源代码管理最基本的级别允许您保留对软件项目中不同文件所做更改的历史记录。
它还允许多个开发人员同时处理相同的代码, 并将这些更改重新合并在一起。
我们不会在这里详细介绍,但是 您应该知道如何很好地使用至少一个源代码控制系统,并且您应该熟悉大多数基本的源代码控制概念。
在当今的软件开发世界中,几乎所有专业软件开发团队都将使用某种源代码控制。
构建和部署
如今,大多数软件开发项目都具有某种自动化的构建和部署系统。
有几种不同的软件应用程序可以帮助团队自动化完成这两项任务,这些任务过去是手动的,对于某些团队来说仍然如此。
您问什么是构建和部署?
好问题。
好吧,您知道如何编写该代码并将其检入到源代码控制系统中吗?
拥有某种方法来确保在签入代码后代码确实有效,这将是一个好主意。
这就是构建系统的用武之地。
至少,构建系统将编译所有代码,并确保没有编译错误。
复杂的构建系统 还可以 运行单元测试或用户测试,运行代码质量检查,并提供有关代码库当前状态的一些报告。
部署系统将负责将代码部署到生产机器或某种测试环境。
您不必一定是这些技术的绝对专家,但是 至少了解这些系统的工作原理以及构建和部署代码的过程非常重要。
通常,创建和维护构建与部署系统的实际职责将属于一个快速增长的领域,称为DevOps(开发人员操作的缩写)。
但是,这并不能免除您至少了解此过程如何工作的基础知识。
测试
过去,开发人员不必对测试了解太多。
过去,我们要编写一堆代码,然后“扔到墙上”给一群测试人员,这些测试人员会在我们的代码中找到各种错误,然后修复这些错误,仅此而已。
不再。
如此众多的软件项目采用了所谓的敏捷流程(在使用方法论时,我们将对此进行更多讨论),软件开发人员和测试人员必须 紧密合作。
质量确实已成为整个团队的责任-我认为这一直都是如此。
话虽如此,您需要了解一些有关测试的知识。
您至少应该熟悉一些基本术语,例如:
· 白盒测试
· 黑盒测试
· 单元测试(不是真正的测试)
· 边界条件
· 测试自动化
· 验收测试
一个好的开发人员(我假设您至少希望成为一个好的开发人员)在将其代码提供给他人之前先进行测试。
如果您真的想被视为专业人士而不仅仅是黑客,那是不容 商量的。
调试
嗯,许多新手软件开发人员的梦想都砸在了调试器的坚石上。
每个人都想编写代码,对吗?
但是不是没有人想要调试他们的代码吗?雅听到我吗?
雅感觉到我吗?
真相时间。
您可能需要花费90%的时间作为软件开发人员来弄清楚 为什么您的代码无法正常工作。
我知道这并不迷人。我知道您只想整天编写新代码,但是整个世界都无法正常工作。
如果您采用诸如测试驱动开发之类的方法,则可能会在调试器上花费更少的时间,但是无论您做什么,无论您如何尝试并解决它, 都必须学习如何调试您的代码或其他人的代码。
因此,您应该只是硬着头皮,切实学习如何有效地做到这一点,而不是随便采取一些您知道 必须要做的事情。
在调试一章中,我将详细介绍这一点,但是到目前为止,您只知道如何做到这一点。
方法论
洗衣清单让您感到恐惧吗?
如果不是,这是另外一个-但我保证这是最后一个。
尽管一些软件开发团队只是开始编写代码并在完成工作后就完成工作,但大多数团队都有某种至少可以假装遵循的方法论。
因此,至关重要的是,您至少必须熟悉最常见的软件开发方法背后的一些基本思想。
今天,我要说的是 瀑布式开发和 敏捷开发。
大多数团队会声称他们在做敏捷。敏捷本身是一个非常宽松的概念,但是有一些实践,并且,我敢说,如果您希望能够讲话,可以这么说并适合加入敏捷团队,则应该注意一些习惯。
我们将在软件开发方法论这一章中更深入地讨论这一点。