Skip to content

[翻译]作为一个软件开发人员,你必须掌握的技能

原文The Technical Skills You Need to Have as a Software Developer

我强烈支持并帮助软件开发者在他们的技术能力之外提升”软技能”.事实上我曾写过一本关于这点的-但毫无疑问:技术能力也相当重要
我的意思是,当你无法写代码并开发软件,你所有掌握的软技能毫无意义.或许你是一个称职的管理者或指导者,但不是一个合格的开发者.
但如果你读了下面这些,我相信你会有兴趣成为一名软件开发者-或是一个大牛-所以我们来聊聊 你需要掌握的技术技能
#技术买单

如今,这个话题淹没了众多开发新人,因为感觉太多东西要掌握,而且不知道从哪里开始.
这里我想打破这个话题.探讨一下最基本和受益的技术技能,让你在成为软件开发者的路上越走越远.
这一章并不是要把你成为开发者需要掌握的技术技能全部列出,我会试着列举几个基本的,给你一个概述.
不用害怕.本书这一章标题”关于软件开发你需要知道的”,我给大家一个章节概述这些技能,深入浅出.
废话少说,简洁明了的看一下我认为最重要的技术技能.

#一门编程语言
我认为这个话题作为开始是明智之选,你觉得呢?
不掌握一门编程语言就不是一个合格的程序员-Vern,你知道我什么意思(详见Ernest P. Worrell不懂这个梗也没关系)
我在”学习哪种编程语言”章节中讨论过如何选择,所以不要太紧张.
我马上就表示编程语言的选择并不是你想象的那样重要.
相反,我们来聊聊为什么我建议学习一门编程语言,而不是广泛涉猎.
很多开发新手在找到一份工作前,花时间同时学习很多编程语言.
然而我认为你最好从一门编程语言开始,不要超前学习,否则你会迷惑,并让你无力学习其他的技术技能.
我建议你深入学习一门编程语言,然后你会对用这门语言写代码非常的自信.
记住一旦你决定成为何种软件开发者,你必须足够专一.

#结构化代码

当学习完一门编程语言-或是正在学习.接下来你需要知道的一件事情就是如何正确的结构化你的代码.
我已经给过你一份很棒的资源来帮助你学习这种技能:Code Complete by Steven McConnell.
什么是结构化代码?
意思是编写 好的,清晰的,易懂的代码不需要大量注释,因为代码本身就传递了信息.
很多软件开发者在整个职业生涯中都没有学习这种技术,不幸的是这种技术也是成为合格开发者的基础.
好的代码结构不仅仅是完成工作,更是艺术的结晶.
结构化你的代码真的是软件开发的艺术但这也饱受批评,因为无论你或同事维护起你的代码都要比写新代码更费时间.
我并不想在这教你如何正确结构化你的代码-因为我在上面已经给过你一个很棒的资源了.但你一定要在开始就学会如何编写干净整洁的代码,而不是在之后.
我确信这一点,即使你是个初学者,只要你能写干净整洁易懂,表达自身意义的结构化代码,任何看到你代码的人都觉得你是个有经验的专家.
至少在一定程度上,你将把职业当做专业,而不是一份工作:匠人的标志

#面向对象设计

这一点仍待讨论,尤其是你正在学习一门非面向对象的编程语言.但大多软件开发的思想建立在面向对象之上,所以你必须了解它.
面向对象设计是在设计复杂的程序时,将它们分割成独立的类和对象(实例化的类),每个都有封装单独的功能,角色和责任.
在软件开发中,我们总是尝试处理复杂度.
基于对象的思想帮助我们处理问题,因为它允许我们把复杂的系统定义并设计成相互联系的组件,而不是设计成一个复杂的整体.
如今有大量的函数语言,但你会发现,受面向对象设计和分析的影响,软件开发中流行的语言和模式仍然很重要.
你必须深刻理解什么是类,继承有哪几种形式-该什么时候使用,也要理解多态和封装.

#算法和数据结构
如果你在大学学习编程并取得计算机科学的学位,算法和数据结构是其中非常重要的一部分.
算法是解决计算机科学/编程问题的一种方式.
举个例子,从编程角度来说,这里有很多算法来实现对一个列表的排序.每一种排序算法的速度,需要的内存和基于的思想都各不相同.
在计算机科学中有很多算法,基于这些算法,面对你自己遇到的问题,理解并实现你自己的算法也相当重要.
通常,算法好的开发者用一个小时解决的问题,其他开发者可能要几天时间才能解决.
除非你对算法非常熟悉,不然你面对问题时可能意识不到解决方案早已存在.所以,我认为这是一种非常重要的技能.

数据结构分为一些相似的类别,并与算法紧密相关.
下面是一些开发者必须熟知的数据结构:
* 数组(Arrays or vectors)
* 链表(Linked lists)
* 堆(Stacks)
* 队列(Queues)
* 树(Trees)
* 哈希(Hashes)
* 集合(Sets)
精通数据结构和算法,你可以轻松解决众多复杂的编程难题.
当我开始编程时,我的数据结构和算法很糟糕,因为我都是自学的.
我从未意识到它的价值,知道我开始参加TopCoder网站的竞赛.从那我懂得了算法和数据结构能把你带到一个更高的境界.
很快,它展示了它的强大,帮助我解决了编程中的众多难题,那些我之前毫无头绪的问题,如今看来简单又有趣.
事实上,我认为这是软件开发中最有趣的一个领域.用算法和数据结构来干净,优雅又高效地解决一个复杂的问题,能给人带来巨大的成就感.
截止写这篇文章时,最好的资源是Gayle Laakmann McDowell写的一本书Cracking the Coding Interview
在这本书中,她描述了所需要知道的一切关于数据结构和算法的知识.
学习数据结构和算法是个很大的挑战,但这是值得的.这也是你能超越其他人的一项技能.多数软件开发者在这方面还是有所欠缺的
如果你想通过Microsoft或是Google的面试,你要把这种技能掌握的炉火纯青.

#开发平台和相关技术

你至少接触过一种开发平台和相关技术,并有一些经验.
我所说的平台是什么意思?
一般来说,它是指操作系统,但也适用于其他和操作系统相似的抽象概念.
举个例子,你可能是个Mac开发者或Windows开发者,取决于你使用Mac或Windows系统,但你也是个web开发者,基于特定的web平台.
我并不想讨论具体的平台,不同的人有不同的意见,讨论的目的是 我所定义的平台是你开发基于的环境,和其生态系统以及特性.
再次重申,你所选择的我认为并不重要,重要的是你有所选择.
公司通常任用不同的开发者在不同的平台和技术上进行开发.
如果你是个IOS开发者,一般容易找到工作.
这意味着你要要熟悉平台,和这个平台上的开发工具,专有的模式,以及通用的框架.
你或许认为编程语言的选择会决定平台,但关系很小.
就拿C#来说.你可以为Windows,Mac,IOS,Android,Linux甚至嵌入式系统编写代码.
所以不仅仅要选择一种语言,也要选择一个平台.

#框架或开发栈
除了学习一门编程语言和平台,我强烈建议学习一种框架,或更深入一点,学习整套工作栈.
什么是框架?
什么是工作栈?
框架就是一个平台或跨平台的函数库集合.它通常使得在平台上的编程任务变简单.
回到C#的例子.大多数C#开发者使用.NET框架或写C#应用,.NET框架包含众多库和类,允许C#开发者做某些事情的时候高度抽象,不需要每次都重复的发明轮子.
举个例子,一些.NET框架包含操作图片的代码.这些代码很难东拼西凑的写出来,所以框架使得C#开发者操作图片时受益匪浅.
开发栈有一点点不同.一个工作栈是一系列技术的集合,通常包含框架,协同开发出整个应用.
举个例子,有个常用的开发栈叫做MEAN,它基于MongoDB,Express.js,AngularJS和Node.js.
MongoDB是数据库技术.
Express.js是Node.js框架,用于创建web应用.
AngularJs是前端JavaScript框架,用于web应用的用户交互界面.
最后,Node.js是用JavaScript开发web应用的运行环境.
你不明白上面这些并不重要-除非你想成为MEAN开发者.重要的是明白这点,如果你掌握了上面这些技术,你可以开发整个web应用.
开发栈使得创建应用变得容易因为众多开发者使用它提供的通用的范例来开发应用,所以知识共享变得容易,你也可以确定这一套技术可以协同工作.
学习一套开发栈很有用,因为这意味着你拥有开发完整应用需要的全部技术.很多公司用一套特别的开发栈来开发应用,并寻找熟悉这套开发栈的开发者,得心应手的开发.

#数据库知识

尽管最近几年数据库略有变化,我并没有看到数据库走远.所以你最好对数据库也略知一二.
我写这本书时,有两种主流数据库技术:关系数据库和文档数据库.
我认为一个开发者如今至少要熟悉关系数据库并理解文档数据库.
在软件开发中,数据库用来存放应用的数据.
当然,一些团队会有专职数据库开发者或数据库管理员(DBA),但这并不妨碍你了解数据库的基本知识.
最少最少,你要了解这些:
* 数据库工作原理
* 基本的数据查询
* 数据的增加,更新和删除
* 如何汇总数据
另外,你很可能想知道如何在你所选的平台或框架上,用代码检索和储存数据.
大多数开发者需要能够写出与数据库交互的代码.

#源代码管理
源代码管理是每个软件开发项目的重点.
回忆过去,在我们使用源代码管理之前,我们需要通过网络共享工程的所有文件,手动的翻阅不同版本的软件源代码.
我很羞愧的承认我不止一次做这种事情.
但是,我还小,还不懂事,你可不要像我一样.
如今,几乎所有的专业开发者需要知道如何通过源代码管理来检查代码,检出代码和合并不同源代码的差异.
源代码管理是基本的技能,让你可以在软件项目中保存不同文件差异的历史记录.
它允许众多开发者在同时,同样的代码上协同工作,最后再合并这些更改.
我们在这并不详细说明了,但你至少要掌握一种源代码控制系统,并熟悉大多基本的源代码控制原则.
如今软件开发世界中,专业的开发团队都会用源代码控制.

#构建和部署
如今,大多数软件开发项目拥有一些自动化构建和部署系统.
有很多不同的软件应用帮助团队将那些手册上指导的步骤任务自动化处理.
你问,什么是构建和部署?
问得好.
你知道如何写代码并提交到源代码管理系统吗?
通过某种方式确保你提交的代码能正常工作,这很重要.
这就需要构建系统了.
最基本的,构建系统编译所有代码,确保没有编译错误.
一个复杂的构建系统当然也会基于代码当前的状态 运行单元测试或用户测试,运行质量检测,并提供报告.
部署系统负责将代码部署到生产环境或其他测试环境.
你并不必深入这些技术,但了解这些系统的工作原理很重要,以及它们如何构建和部署代码.
通常,创建和维护构建和部署平台属于DevOps(开发者操作的简称)的领域.
但这并不妨碍你了解这些基本知识.

#测试

很久之前,开发者并不需要了解测试.
之前我们只需要编写大量代码然后”事不关己”,把代码扔给测试人员,让他们找出代码中的bug,然后我们再去修复.
今非昔比.
伴随着众多软件项目使用敏捷开发(我们了解更多的方法论之后在讨论敏捷开发),开发人员和测试人员需要更紧密的协同工作.
质量需要整个团队负责-我很认同这一点.
这意味着,你需要了解一些测试.
你至少要熟悉下面这些技术术语:
* 白盒测试
* 黑盒测试
* 单元测试
* 边界状况
* 自动化测试
* 验收测试
一个好的开发者-我希望你也成为一个好的开发者-在把代码交给别人前测试自己的代码.
如果你想成为专业的,而不是业余开发者,测试是必须掌握

#调试
很多开发新手梦想碾碎调试路上的巨石.
每个人都想写代码.
但不是每个人都想调试他们的代码.
真相了.
你会花费90%的时间来找出为什么你的代码不能工作.
我知道调试并不迷人.我知道你每天只想写新的代码,但这个世界并不是你想象的那样.
如果你实践某种方法论,比如测试驱动开发,你很可能在调试上花费相对较少的时间,但无论怎样,你必须学会如何调试代码.
所以,既然你知道要做什么,相比无计划的忙碌,不如努力高效地学习.
关于调试的这一章,我本来要说的还有很多,但现在你只需要知道如何调试.

#方法论
是不是已经被我所说的一系列你需要了解的知识吓到了?
如果没有,这有额外一点-我保证是最后一点了.
当一些软件开发团队万事俱备开始写代码时,他们大多数遵循某种方法论.
(顺便说一下,不要期待任何团队会完全遵循他们声称的开发方法论.我在此并不想详细说明这点.我只是一个现实主义者,听闻很多软件开发者声称遵循Scrum开发,仅仅是因为他们每天开站立会.)
正因如此,你很有必要熟悉基本的软件开发方法论.
如今,有 瀑布式开发敏捷开发.
多数团队声称他们是敏捷开发.敏捷本身就是一个宽泛的概念,但有一些最佳实践.如果你想适应敏捷团队,你必须多交流,多沟通.
我们将在软件开发方法论的章节讨论的更深入.

#不知所措?别这样
我知道这里有一堆需要掌握的东西,我只是在每个关注点上轻描细节.
你现在可能有点不知所措了似乎并不理解上面所说的技术技能.
没关系.你也不是一个有经验的开发者,真遗憾(开玩笑的,么么哒,但你必须要努力)
无论如何,我在书中的”关于软件开发你需要知道的事情”标题下详细论述这几点.
所以淡定.
今后,我会继续指导你各种技术,所以准备好学习这些技术.

Published inTranslate

Be First to Comment

发表评论

电子邮件地址不会被公开。 必填项已用*标注