前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >每个优秀程序员必须具备的技术技能

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

作者头像
李海彬
发布于 2018-03-23 04:08:19
发布于 2018-03-23 04:08:19
7540
举报
文章被收录于专栏:Golang语言社区Golang语言社区

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

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

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

用技能赚钱

现在,有这样一种主流观念,压垮了很多新手软件开发者,那就是你需要学习很多东西才能成为软件开发人员,并且很多人不知道从哪里开始起步。

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

一篇文章当然不能详尽说明作为软件开发者,你可能需要掌握的所有技术技能,但是我会列出最关键的一些技术技能。

编程语言

我认为从这一条开始说起是最合适的。

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

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

相反,让我们谈一谈为什么我们要从一种编程语言开始,而不是试图去学习所有的东西。

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

虽然我认为你最终应该学会一种以上编程语言,但我不建议提前这样做,因为这只会导致混乱,并且会分散你需要学习的其他技能的精力。

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

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

如何构造代码

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

有一个很好的资源来帮助你学习这个非常宝贵的技能: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,AndroidLinux,甚至是嵌入式系统写代码。

所以,不要仅仅只是选择语言;还要选择平台。

框架或堆栈

除了学习特定的编程语言和平台,我高度建议去学习框架,或者更好的是,与之相配套的完整的开发堆栈。

什么是框架?

什么是堆栈?

框架就是一系列被用于在特定平台或多个平台上开发代码的库。它通常可以使得在该平台上的编程任务变得更加容易。

看这个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》这本书中更深入地谈论这些主题中。

所以,淡定点。

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java程序员必须掌握的核心技能有哪些?
私下里,经常有一些读者问我:“二哥,作为一名软件开发者,我应该掌握哪些技能,才能被领导赏识呢?”说实话,我心目中很多选项,不少于 20 个,但我斟酌再三,只挑选了其中最能让你受益的 8 个,不仅能让领导赏识你,还能让领导给你升职加薪。
马士兵的朋友圈
2020/09/18
6020
新手程序员必备10大技能
如果你已经有一段时间的编程经验,或者正准备学习编程,那么可能会考虑的是:怎样才能成为一名优秀的程序员?计算机专业的毕业生如何为软件开发和编程职业生涯做准备?职场对于初级开发人员有哪些期望?这是临近毕业或初入职场的新手程序员们密切关注的问题。
陈哥聊测试
2021/07/14
1.8K0
新手程序员必备10大技能
如何在面试中发现优秀程序员
作者: Steve Hanov 我曾在一次面试中要求一个很有经验的嵌入式软件开发人员写出一个反转一段字符串并输出到屏幕上的程序。他在这个题目上挣扎了很久。这个家伙是个很神奇的人。你给他一些没用的零件,他能建造一个机器人,并能用程序控制它在屋里走来走去。他曾经参与过研制卫星,并且这个卫星现在正在轨运行。他只用左脑都比我能干。但是对于这个题目他却从来、从来没机会干过:在屏幕上显示什么东西。 有些人就有这种技能,能在面试中问出正确的问题,发现优秀的程序员。而有些人却害怕提问,畏首畏尾,问一些从网上拷贝下来的问题
用户1410343
2018/03/27
7700
真正优秀的Python开发人员拥有哪些技能?
如果你想彻底,在面试时有必要提出适当的问题。询问特定的 Python 概念,如数据结构、数据类型、异常处理、文件处理和生成等。如果他们在回答这些问题时毫不犹豫,你可以确信他们实践了他们所宣扬的。
很酷的站长
2023/02/20
6570
真正优秀的Python开发人员拥有哪些技能?
「编程羽录」上线,程序员必备的这些技能你能get到嘛?
好久不见,给大家带来个好消息,小羽的全新专题「编程羽录」系列正式上新,主要是介绍一些关于面试题和经验总结的文章。
浅羽技术
2021/05/13
4590
「编程羽录」上线,程序员必备的这些技能你能get到嘛?
Python最抢手、Go最有前途,7000位程序员揭秘2019软件开发现状
互联网的下半场,科技公司为面对更加严峻的竞争环境,越来越重视开源节流。而对于身处其中且撑起 IT 半边天的技术人,如今如何了?从技术角度来看,其又该作何改变顺应潮流?
AI科技大本营
2019/06/21
5640
Python最抢手、Go最有前途,7000位程序员揭秘2019软件开发现状
全栈工程师需要具备什么技能?
如果具备以下10个基本素质,那你应该对你的全栈开发前景充满信心,也会为你将来出海铺平道路。
侧风
2024/03/11
2470
全栈工程师需要具备什么技能?
程序员被聘用的13个开发技能
这些日子,开发人员掌握JavaScript总不会错。JavaScript能力是目前为止被高层执行人员和招聘人员誉为最频繁的追捧技能。JavaScript已被证明是当今市场中高度可移植和宝贵的技能。
一墨编程学习
2018/09/14
5610
程序员被聘用的13个开发技能
35岁以上的大龄程序员们,后来都干什么去了?
知乎上有个话题叫做“程序员的悲哀是什么?”,有个高赞回复直戳大多数程序员的命门:“最大的悲哀就是以为自己挣到了很多钱,其实根本不懂怎么挣钱,随着年龄的增长,工作瓶颈越来越多,越来越容易受到歧视,却不知道怎么走下去!”
江一铭
2022/06/16
1.5K0
35岁以上的大龄程序员们,后来都干什么去了?
面向程序员的 ChatGPT
近年来,编码和编程领域经历了一场重大革命,而在这一变革中的重要参与者之一就是 ChatGPT。这一尖端技术为程序员和开发人员提供了一种新颖而迷人的方法来解决困难的编码难题并简化他们的工作流程。由于其出色的自然语言处理能力和阅读和解释代码的能力,ChatGPT 是程序员的理想问题解决工具。
ApacheCN_飞龙
2024/05/24
1230
面向程序员的 ChatGPT
作为软件开发人员需要的技术技能
我们一度都是新手,开始时可能有点困难。但是,如果您刚刚成为一名专业软件开发人员,那么本文将包含一些实用且易于理解的建议。
sanshengshui
2019/06/26
1.1K0
作为软件开发人员需要的技术技能
软件开发者升职加薪的 8 项技能
私下里,经常有一些读者问我:“作为一名软件开发者,我应该掌握哪些技能,才能被领导赏识给我呢?”说实话,我心目中很多选项,不少于 20 个,但我斟酌再三,只挑选了其中最能让你受益的 8 个,不仅能让领导赏识你,还能让领导给你升职加薪。
沉默王二
2020/03/25
3440
程序员世界常见的6个问题
程序员世界常见的6个问题 我作为CTO已经有一段时间了。在这个工作岗位上,我不但制定准则,还带领团队、管理项目、设计架构、组织工作、制定代码审查、调查不同的问题、研究各种解决方案、结识许多技术人员和联
用户1289394
2018/02/27
7150
程序员世界常见的6个问题
为什么优秀的程序猿都阅读源码
嘿,朋友们!本文我将分享一些关于主动阅读和研究源码的一些想法。在我看来,阅读源码能够帮你成为一名更专业的开发人员。毫无疑问的是,阅读源码提高了我的软件开发水平。
Bug开发工程师
2020/03/27
6610
程序员被聘用的13个开发技能
程序员被聘用的13个开发技能 1.温习JavaScript 这些日子,开发人员掌握JavaScript总不会错。JavaScript能力是目前为止被高层执行人员和招聘人员誉为最频繁的追捧技能。JavaScript已被证明是当今市场中高度可移植和宝贵的技能。 2.了解大数据 大数据项目相较于去年继续扩大,而且在这几年里也没有放缓的迹象。开发人员必须有全面的(商业智能)和分析产品,机器学习工具和其他可以转移、存储和汇总大量数据解决方案的知识。只有这样,他们才能帮助他们的公司存储,交互和分析大数据,以便于做出更
用户1289394
2018/02/27
6960
GitHub 40000星!收下这份宇宙最强「程序员装备指南」
GitHub有一个4万星的超强清单,里面内容从通用工具到编程比赛,从论坛到面试,还有英语学习,无所不包,堪称「程序员生存指南」。
昱良
2021/07/01
8350
GitHub 40000星!收下这份宇宙最强「程序员装备指南」
成为优秀程序员的10个技巧
我最近在接受采访时被问如何成为优秀程序员。这是一个有趣的问题,我认为如果我们应该遵循一些准则 - 我相信 - 无论我们的天赋如何,我们都可以成为伟大的程序员。事实上,这些准则不但适用于程序员,而且适用于所有专业人士。
我就静静地看
2018/09/11
6120
为什么Python程序员有这么高的需求?
Python是一种高级通用编程语言.它支持与其他语言相同的编程基础--比如循环、条件和函数--用于组装软件算法。它提供了一个易于学习的语法,强调可读性,从而降低程序维护成本.
程序员皮克
2021/12/30
3100
程序员优秀之路:一起来看下这 97 位”砖家“能给出啥编程的好建议?(2)
程序运行时出现异常通常可以归为:技术异常和业务异常,区分二者有利于我们更好的捕获它们。
掘金安东尼
2022/09/19
3330
新手程序员应该知道的7件事
新手程序员应该知道的7件事 资深软件开发人员分享的一些关于专业化编程的经验和教训,这些经验教训都是经过多年历练总结得出的。 如果你刚进入专业的软件开发世界,那么得益于在计算机科学和编程方面的教育和/或培训,你已经具备了一定的知识。但是真正的开发业务工作又和在学校编程不同,这是你不可能从大学课程或编码学校中学会的东西。 为了了解新手程序员需要知道哪些内容,我咨询了一些经验丰富的编码老将,这些“老”将全部有着至少十年(有的甚至是几十年)作为专业软件工程师的工作经验。我的问题是,如果他们现在回过头去,哪些技能和知
用户1289394
2018/02/27
7990
新手程序员应该知道的7件事
推荐阅读
相关推荐
Java程序员必须掌握的核心技能有哪些?
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文