现在有这样一种主流观念,压垮了很多新手软件开发者那就是你需要学习很多东西才能成为软件开发人员,并且很多人不知道从哪里开始起步如今新手进入软件开發的程序员月薪大约是1w左右,新手在成长为成熟的开发工程师的路上要学习和提升的技能是非常之多。工作经验或许能成为你拿高薪的┅个指标但是,技能才是最终的标准
这里我会尝试着具体说明那些在你追求成为软件开发人员的路上将让你受益的必要技术技能,年薪30w+的程序员需要掌握哪些技能
一篇文章当然不能详尽说明作为软件开发者,你可能需要掌握的所有技术技能但是我会列出最关键的┅些技术技能。
我认为从这一条开始说起是最合适的
不懂编程语言,怎么能成为一个真正的程序员
不过,关于选择哪种编程语言去学習可能并没有我们想得那么重要这一点请允许我一笔带过。
相反让我们谈一谈为什么我们要从一种编程语言开始,而不是试图去学习所有的东西
许多新手程序员会试图一次性或在第一份工作之前学习几种编程语言,以便于有备无患
虽然我认为你最终应该学会一种以仩编程语言,但我不建议提前这样做因为这只会导致混乱,并且会分散你需要学习的其他技能的精力
相反,我建议你应该深入研究偅点学习单一编程语言的来龙去脉,这样你才能对用这种编码语言来写代码信心十足
那么在你决定想要成为什么样的开发人员的时候,怎么样才能尽可能地独树一帜呢
在学习了一门编程语言之后——或者最好是在学习的同时——我坚信,你需要知道的下一件事就是如何囸确地构造你的代码
我所说的构造代码是什么意思呢?
我的意思是要写出好的,清晰的易于理解的代码,不需要大量注释因为代碼本身就是一种表达方式。
很多软件开发者在他们整个职业生涯都不曾去学习这个技能这是不幸的,因为这是我——以及其他许多人——判断一个软件开发人员技术和能力的主要方式
良好的代码结构展示了对这种技艺的热衷,而不仅仅是为了完成工作
构建代码是软件開发真正的艺术部分,但它也是至关重要的因为你和你的同事得花费相当多的时间来维护现有的代码,而不是编写新的代码
具体应该洳何正确地组织代码我就不说了,因为我已经给出了一个很好的资源但是要努力学习如何从一开始就写出好的、干净的代码,而不是事後学习这个技能
我只能保证,即使你是个新手如果你可以写出好的、干净又简洁的、易懂的,本身就可以表达意思的代码那么任何媔试官看到你的代码都会觉得你是一个有经验的专业人士。
并且在一定程度上或者至少在这条道路上,因为你会将这个职业当作一种专業而不是一份工作。
这有争议的特别是如果你正在学习的编程语言并不面向对象,但是有大量的软件开发世界会按照面向对象设计的思维思考所以你需要确保你了解它。
面向对象的设计是一种将复杂程序设计分解为单独的类或对象(类的实例)的方法其中封装功能苴具有特定的角色和责任。
在软件开发中我们总是试图管理复杂性。
从对象的角度思考可以帮助我们做到这一点因为它能让我们从一堆交互组件中定义并设计一个复杂的系统,而不是作为一个整体的试图解决整个复杂性
现在的编程世界有着大量的函数式编程语言,但伱在软件开发中找到的最流行的语言和模式仍然深受面向对象设计和分析的影响。
你应该好好理解什么是类继承的不同类型——何时使用它们——还有理解像多态性和封装等术语。
如果你上传统院校学习并想获得计算机科学学位的话那么这是一个很大的考点。
算法是解决各种计算机科学/编程问题的常用方法
例如,有若干常见的在程序上用于排序的算法每一种排序算法都有一系列关于速度,内存大尛要求以及数据理想类型的不同属性。
计算机科学领域有很多这样的算法并且理解如何变化这些算法来解决你可能遇到的棘手问题也佷重要,当你解决现实编程问题的时候
通常情况下,擅长这些算法可以让一个开发人员在1个小时之内就能解决可能需要另一个开发人员幾天时间才能搞清楚的问题
除非你熟悉和擅长算法,否则你甚至不知道已经有了优雅的解决方案在那里因此,仅仅只为这个原因我認为这也是一个值得掌握的宝贵技能。
数据结构也是如此并且可以与算法结合使用。
有几个所有软件开发者都应该熟悉数据结构中的包括:
数组或向量 链表 堆栈 队列 树 哈希 集合
通过熟练掌握数据结构和算法,你可以轻松又优雅地解决许多艰难的编程问题
当我开始编程嘚时候,我在数据结构和算法方面非常糟糕因为我主要是靠自学的。
我一直都没有意识到它们的价值很快,随着我遇到了一些我不知噵如何解决的问题我发现这些技能在真正的编程世界非常有用,而且解决起来相当简单——和有趣
事实上,我认为这是软件开发最有趣的领域之一解决难题并利用数据结构和算法来开发一个又干净又优雅的解决方案,真的很有意义
学习这些东西是一个挑战,但非常徝得这是可以让你超越众多同行的技能之一。大多数软件开发人员都不擅长这个领域
如果你想通过如微软或谷歌这样的大公司的面试,那么你一定得掌握这个技能集
自己是一个五年的全栈工程师,这里推荐一下我的前端开发学习交流群:里面都是学习前端的,群里會不定期更新最新的教程和学习方法有想学习web前端的,或是转行或是大学生,还有工作中想提升自己能力的web前端党欢迎加入
你应该具备一些经验,并至少掌握一个开发平台以及与之相关的技术或框架
我所说的平台是什么意思呢?
好的通常它的意思是操作系统(OS),但也适用于其他可以充当类似于操作系统角色的抽象
例如,你可以是专注于Mac或Windows操作系统得Mac开发者或Windows开发者你也可以是一名专注于特萣的web平台的web开发人员。
具体确切的关于平台是什么就不讨论了——不同的人会有不同的看法——但这里我要定义平台为你开发的特定环境它有自己的生态系统和特殊性。
再者这是另一个我认为选择并非那么重要的技术技能,只要你选择了一个就好
企业通常会聘请开发囚员针对特定的平台或技术开发软件。
你作为iOS开发者将更容易找到工作如果你专业于那个特定平台的话。
这意味着要熟悉平台本身以忣开发工具,惯用模式还有大多数程序员在为那个平台开发时会使用的通用框架。
你可能会认为编程语言的选择决定了平台但实际上倳实情况很少是这样的。
就拿C#举例如果你是一个C#开发人员,那么你可以用这种编程语言为WindowsMac,iOSAndroid,Linux甚至是嵌入式系统写代码。
所鉯不要仅仅只是选择语言;还要选择平台。
除了学习特定的编程语言和平台我高度建议去学习框架,或者更好的是与之相配套的完整的开发堆栈。
框架就是一系列被用于在特定平台或多个平台上开发代码的库它通常可以使得在该平台上的编程任务变得更加容易。
看這个C#的例子大多数C#开发人员使用.NET框架来编写C#应用程序。 .NET框架包括许多库和类能够让C#开发人员在更高的抽象级别上工作,因为每当他想莋什么事情的时候没有必要完全重新发明轮子。
例如.NET框架的部分还包含了处理图像的代码。这类代码从头编写是极其困难的所以框架极大地帮助了C#开发人员去编写需要以某种方式处理图像的代码。
堆栈则有点不同堆栈是一组技术,通常包括一个框架并且常一起用於创造一个完整的应用程序。
MongoDB是一个数据库技术
最后,Node.js是一个用JavaScript开发基于web应用程序的运行时环境
有没有理解所有这些东西并不重要—— 除非你打算成为一个MEAN开发者——重要的是要明白,如果你知道所有这些技术和框架那么你就能够开发一个完整的web应用程序。
栈使得创建应用程序变得更容易因为它们提供了一种许多开发者用来开发应用程序的通用范式,因此知识可以很容易地共享并且你也能确定哪些特定的技能集市可以一起工作的。
学习堆栈真的是非常有价值因为这意味着你拥有开发一个完整的应用程序所有必要的技能。很多使鼡特定堆栈开发应用程序的企业更愿意雇用那些熟悉那类堆栈能够立马开展工作的软件开发人员。
即使数据库的景色在过去几年时间里巳经改变了不少但我不认为数据库会很快消失,因此对此了解一二总是不会错的对吧?
当前主要有两种数据库技术:关系数据库和文檔数据库
现在的开发人员至少应该熟悉关系数据库,并稍微了解文档数据库
在软件开发中,数据库经常被用来存储应用程序的数据
當然,有些团队甚至有专门的数据库开发人员或数据库管理员(DBA)但是这并不能真正允许你不懂至少是基本的数据库知识。
数据库如何笁作 如何执行基本的查询来获取数据 如何插入、更新和删除数据 如何连接数据集
此外你可能会想知道如何以编程方式从你的代码与你所選择的平台和/或框架检索和存储数据。
大多数开发者被期待能够编写与数据库进行交互代码
源代码控制是任何软件开发项目的组成部分。
在我们使用源代码控制之前我们必须在网络上共享项目的所有文件,或者通过U盘来回查看存储在上面的不同软件版本
虽然我很不想承认,但我的确不止一次地玩过这个把戏
但是,我还年轻我蠢。你却没必要像我这样
当前,几乎所有专业的开发者人员都被期待懂嘚如何使用源代码控制来反复检查代码并希望懂得合并来自多个源的变化。
最基本层面的源代码控制可以让你保持在一个软件项目中对鈈同的文件所做更改的历史记录
它还允许多个开发人员在同一时间工作于相同的代码,然后合并这些更改
具体就不细说了,但你应该知道如何熟练地使用至少一个源代码控制系统并且你应该熟悉大多数基本的源控制概念。
在当今软件开发领域几乎所有专业的软件开發团队都会使用某种源代码控制。
现在大多数软件开发项目都有着某种自动化的构建和部署系统。
有几种不同的软件应用程序可以帮助软对自动化这两个任务,曾经是手动当然对于某些团队而言,现在仍然如此
你问什么是构建和部署?
你知道如何写代码并检入到源控制系统吗?
拥有一些方法来确保代码可在你检入后真正能工作很不错
这就是构建系统的用武之地。
最起码构建系统将编译所有代碼,并确保没有编译错误
一个复杂的构建系统可以运行单元测试或用户测试,运行代码质量检查并提供关于代码库当前状态的一些报告。
部署系统将负责部署代码要么到生产机器要么可能到某种测试环境
你不必成为这些技术的绝对专家,但是了解至少这些系统如何工莋的基础知识以及构建和部署代码的过程,是非常重要的
通常情况下,创建和维护构建和部署系统的实际职责属于所谓的DevOps(developer operations的简写)——这个快速增长的领域
但是,这并不妨碍你至少了解关于这个过程如何工作的基础知识
曾几何时开发者并没有必要知道太多关于测試的内容。
我们习惯于写一串代码然后扔给测试人员,让他们去找代码中的各种bug然后我们再来修复bug。
随着越来越多的软件项目开始采鼡所谓的敏捷过程(后面再方法这一点中我们再细谈),软件开发人员和测试人员不得不更密切地一起合作
质量已真正成为了整个团隊的责任——我倒是更想说,它一直都是
随之而来的是,你需要了解一些关于测试的东西
你至少应该熟悉如下基本术语:
白盒测试 黑盒测试 单元测试(不是真的测试) 边界条件测试 自动化验收测试
一个优秀的开发人员——会在将代码交给别人之前测试自己的代码。
如果伱真的想被认为是专业的并非浪者虚名,那么这一条没有商量余地
很多新手软件开发人员在调试时都感觉自己像是在用鸡蛋碰石头。
烸个人都希望写代码没错吧?
但好像没有人愿意调试自己的代码
大约90%的时间软件开发人员是用来搞清楚到底为什么代码不能正常工莋。
我知道你只是想能够整天写新的代码但是此路不通。
如果你采用如测试驱动开发这样的方法那么你可能会少花很多时间在调试上,但无论如何不管你做什么,不管你如何努力你都不得不学习如何调试代码或其他人的代码。
因此与其采取一种随意的方式来做一些你不得不做的事情,还不如咬紧牙关竭尽全力学会如何有效地做好这件事情
有没有被我列出来的需要知道的事情清单吓倒?
好吧还囿一个——但是我保证这是最后一个。
虽然一些软件开发团队才刚开始写代码不择手段只要完成任务即可,但是大多数团队还是至少遵循某种方法的
出于这个原因,熟悉一些最常见的软件开发方法背后的基本理念至关重要
今天,我要说的是瀑布式开发和敏捷开发
大哆数团队会声称他们正在做敏捷。敏捷本身是一个非常松散的概念但也有一些做法和——原谅我的措辞——固定程序是你应该知道的,洳果你不想只是纸上谈兵想要打造一支敏捷团队的话。
我知道这些内容通通要掌握的话有点多,而且我仅仅触及了大多数主题表面的東西
现在,你可能会觉得有点不知所措面对这些所谓的技术技能一片茫然。
程序员这条路就是无止境的学习,不断提高!
软件开发行业的薪金水平还是很高的很多应届毕业生甚至在职者都想从事这个行业。但是行业的高门槛又让很多人望而却步那么进入这个行业到底需要具备哪些技能那?下面小编给大家分享一下自己多年的经验
确定自己喜欢可视化的工作,还是抽象的工作喜欢可视化工作的可以定位为前端开发,洇为前端开发更多的会和可视化用户界面接触;而喜欢抽象的工作则可以定位为后端工程师后端工程师主要做一个软件的功能部分的开發。
开始基础的学习不管定位是前端工程师,还是后端工程师他们都需要从业者掌握基础的互联网IT知识。在具体的学习之前需要先紦这些基础的知识学习扎实,这些内容包括:HTML软件开发步骤,互联网请求响应过程(HTTP协议)基本算法(数据结构),基本编程知识 軟件开发需要学什么 然后就是不同工种的学习了,先说前端工程师前端工程师主要是对用户看到的界面上的内容进行调整,开发主要包括的内容有:HTML,CSSJavaScrit,Jquery其他的一些内容都是以这几项为基础而衍生出来的。
接下来是后端工程师的职业知识后端工程师所作的事是用戶看不到的,比如说进入网站你输入用户名密码登陆,这个登录的功能就需要后端工程师去完成主要涉及的知识有:编程语言(如Java,C#PHP,Python等这里选择一种即可),数据结构,数据库服务器
知识储备完毕,可以做一个简单的小软件去系统的应用一下自己所学的内容比洳做一个简单的学生管理系统,图书管理系统
最后你就可以去寻找相关的开发岗位了,由于没有实际的项目开发经验可以先找一些工資少一点的。等工作一两年有了项目经验这个时候你就有资本去谋求高薪水的工作了。
《远大前程 从软件新手到行业大犇》([美]Sam Lightstone2012)书上写的一段话,对软件开发人员提出的要求:
至少学习四种不同的和至少四种不同的数据格式(如JPEGXML,分隔文本和MPEG)
开发至尐能支持一千人并发访问的软件。
开发可以扩展到超过1TB数据量的软件
参加10个以上程序员一起做的项目。
做既有代码的扩展工作这些代碼至少是5年前开发的,而且无法从原始作者那里得到任何信息
解决至少40个别人代码中的缺陷。
编写支持国际化语言输入的程序包括UNICODE的輸入,以及支持两种语言以上的用户输入(错误信息图形用户界面的文本,等等)
研究下列情形的性能特点:
无论是否存在CPU缓存中的凊况,都能从内存中获取数据
对比从磁盘连续块读取与随机I/O寻址。
对比大块数据与小块数据的I/O操作
三种流行的编程语言(如Java,C/C++和PHP)
茬某个领域要具备成为专家的能力:专家级的程序员、经理、测试人员或技术布道师,或一个特定技术领域的专家(如数据库、虚拟现实、实时通信、客户关系管理系统、移动设备等等)。你需要用整个职业生涯的关注和努力才能达到世界一流的专业水平
掌握汇编语言,他们更深刻的理解系统的运行机制而我们很少有人会获得这样的知识。
不能影响你编程思维方式的语言是不值得学习的