软件开发工程师

软件开发工程师

从事软件开发工作人员的统称
软件开发工程师是对软件开发人员的职业称呼,其主要职责是在有限时间内开发出具有实际实用价值的应用程序。[1]软件开发工程师要求学会许多编程语言,除了最基础的编程语言:C语言、C#、C++、Objective-C等,还有数据库技术:SQL、ORACLE、DB2,NET平台技术,C/S、B/S程序开发,以及诸多如JAVA、SCRIPT、AJAX、HIBERNATE、SPRING、J2EE、WEB、SERVICE、STRUTS等前沿技术。
    中文名:软件开发工程师 外文名:SDE,or Developer 别名: 统称:从事软件开发相关工作的人员 技术要求:各种编程语言

主要职责

具体职责

1、熟悉软件开发流程;n2、负责与需求人员接口,熟悉项目的需求规划说明;n3、负责与开发组长接口,熟悉项目的开发计划,及项目的概要设计说明数据库设计;n4、按计划完成功能模块的功能设计、代码实现,代码编写和单元测试,并提交测试人员进行功能测试;n5、与测试人员接口,完成相关功能模块的BUG修复;n6、根据项目要求,判断是否需要完成《详细设计说明书》的编写;n7、严格遵守相关开发工具的编码规范;n8、参与需求和设计讨论,对项目开发各个环节进行签字确认;n9、为前端技服人员提供技术支持,解决技服过程中遇到的相关问题;n10、提交相关年、月、日计划和总结。n

管理职责

1、对各项目软件开发、编程等有效程序的质量、进程的自我管理;n2、确定客户所开发项目的政策、文件等信息保密性;n3、对自编项目的自检自查。nn

工作权限

1、对公司决策性制度或规划有建议权;n2、对项目实施过程中出现的风险有自我评估权;n3、对重大技术措施和技术方案,有建议权;n4、项目发展出现不能解决的问题的时候,可以向上级申请协作权。n5、对本部职责范围内的工作有管理权。

要求掌握的知识

    熟悉计算机系统的基础知识熟悉网络操作系统的基础知识理解计算机应用系统的设计和开发方法熟悉数据通信的基础知识熟悉系统安全和数据安全的基础知识掌握网络安全的基本技术和主要的安全协议与安全系统掌握计算机网络体系结构和网络协议的基本原理掌握计算机网络有关的标准化知识掌握局域网组网技术,理解城域网和广域网基本技术掌握TCP/IP协议网络的联网方法和网络应用服务技术熟悉网络系统的基本性能测试和优化技术,以及可靠性设计技术

软件开发流程

分析

软件需求分析就是回答做什么的问题。它是一个对用户的需求进行去粗取精、去伪存真、正确理解,然后把它用软件工程开发语言(形式功能规约,即需求规格说明书)表达出来的过程。本阶段的基本任务是和用户一起确定要解决的问题,建立软件的逻辑模型,编写需求规格说明书文档并最终得到用户的认可。需求分析的主要方法有结构化分析方法、数据流程图和数据字典等方法。n本阶段的工作是根据需求说明书的要求,设计建立相应的软件系统的体系结构,并将整个系统分解成若干个子系统或模块,定义子系统或模块间的接口关系,对各子系统进行具体设计定义,编写软件概要设计和详细设计说明书,数据库或数据结构设计说明书,组装测试计划。

设计n软件设计可以分为概要设计和详细设计两个阶段。实际上软件设计的主要任务就是将软件分解成模块是指能实现某个功能的数据和程序说明、可执行程序的程序单元。可以是一个函数、过程、子程序、一段带有程序说明的独立的程序和数据,也可以是可组合、可分解和可更换的功能单元。模块,然后进行模块设计。n概要设计就是结构设计,其主要目标就是给出软件的模块结构,用软件结构图表示。详细设计的首要任务就是设计模块的程序流程、算法和数据结构,次要任务就是设计数据库,常用方法还是结构化程序设计方法。n编码n软件编码是指把软件设计转换成计算机可以接受的程序,即写成以某一程序设计语言表示的"源程序清单"。充分了解软件开发语言、工具的特性和编程风格,有助于开发工具的选择以及保证软件产品的开发质量。n当前软件开发中除在专用场合,已经很少使用二十世纪80年代的高级语言了,取而代之的是面向对象的开发语言。而且面向对象的开发语言和开发环境大都合为一体,大大提高了开发的速度。n测试n软件测试的目的是以较小的代价发现尽可能多的错误。要实现这个目标的关键在于设计一套出色的测试用例(测试数据和预期的输出结果组成了测试用例)。n如何才能设计出一套出色的测试用例,关键在于理解测试方法。不同的测试方法有不同的测试用例设计方法。n两种常用的测试方法是白盒法测试,对象是源程序,依据的是程序内部的的逻辑结构来发现软件的编程错误、结构错误和数据错误。结构错误包括逻辑、数据流、初始化等错误。用例设计的关键是以较少的用例覆盖尽可能多的内部程序逻辑结果。n白盒法和黑盒法依据的是软件的功能或软件行为描述,发现软件的接口、功能和结构错误。其中接口错误包括内部/外部接口、资源管理、集成化以及系统错误。黑盒法用例设计的关键同样也是以较少的用例覆盖模块输出和输入接口。n维护n维护是指在已完成对软件的研制(分析、设计、编码和测试)工作并交付使用以后,对软件产品所进行的一些软件工程的活动。即根据软件运行的情况,对软件进行适当修改,以适应新的要求,以及纠正运行中发现的错误。编写软件问题报告、软件修改报告。n一个中等规模的软件,如果研制阶段需要一年至二年的时间,在它投入使用以后,其运行或工作时间可能持续五年至十年。那么它的维护阶段也是运行的这五年至十年期间。在这段时间,人们几乎需要着手解决研制阶段所遇到的各种问题,同时还要解决某些维护工作本身特有的问题。n做好软件维护工作,不仅能排除障碍,使软件能正常工作,而且还可以使它扩展功能,提高性能,为用户带来明显的经济效益。然而遗憾的是,对软件维护工作的重视往往远不如对软件研制工作的重视。而事实上,和软件研制工作相比,软件维护的工作量和成本都要大得多。

薪资与发展

软件开发工程师的薪资近几年一直处于上升状态,2018年毕业生的平均薪资在12k左右,高一点的达到了30w年薪。n据某校园招聘网站发布的《我国人才缺口最大行业排行榜TOP10》数据统计,目前软件开发相关的互联网行业、电子商务行业、计算机软件行业的人才缺口分别排在第1、第4、第8位。另外国内IT软件研发人才已经百万缺口,各大招聘平台每天平均发布10万个左右的软件开发职位。n所以软件开发的就业前景是非常好的,且软件开发岗位在IT产业中薪资待遇是相对很高的,同比其他行业高出50%左右。做软件开发,未来可以走技术和管理两条发展路线。技术路线发展到后面会成为技术专家,管理路线可以升职做CTO。

核心竞争力

软件工程师的核心竞争力,不是单一能力的体现,而应该是多种能力和价值的综合体,学习能力、解决问题能力和影响力构成了软件工程师的核心竞争力。n学习能力n软件工程师最基本的要求就是技术和代码,招聘网站上公司对招聘软件工程师的要求都是能掌握一门或多门编程语言,熟练使用工具和框架。但熟练掌握编程语言和看框架还不能构成核心竞争力,现在技术更新换代很快,也许我们现在熟悉的语言或框架过几年就没有市场了,还需要学习新的技术。n所以,编程语言、框架、工具还不能构成软件工程师的核心竞争力,能够快速学习掌握新的技术的能力才是软件工程师最基础的核心竞争力。n解决问题的能力n技术学习了要会用才会产生价值,那软件工程师如何运用学习到的技术呢?我们可以先看看软件工程师的日常的主要工作以及需要什么样的能力去解决:n

1.实现功能需求------需要先分析需求、然后抽象设计、实现n2.定位修复bug------改bug最大的挑战就是重现问题,也就是发现问题、分析问题、解决问题n3.重构代码、优化性能------此最难的在于发现代码问题在哪,发现性能瓶颈,寻找解决方案,最后解决。n也就是说,软件工程师的日常开发工作的核心还是在发现问题、分析问题和解决问题,我们可以统称为解决问题的能力。软件工程师水平高低恰恰就是在解决问题的能力上面。n发现问题n以前我们需要做一个抽奖系统,负责的程序员设计了技术方案让我审查,从功能来看是没有问题,但是在安全方面却欠妥。n比如用户用工具模拟用户操作反复点,这不是就能提高中奖概率,他说可以在前段增加重复点击限制,那我又说如果通过抓包工具模拟发送数据包,不也是能绕过你的前段检查么,这个就需要服务端增加uid的检查了。n同样一个抽奖系统需求,新手程序员看到的是如何实现功能,有经验的程序员会发现可能存在的安全隐患,未雨绸缪,把可能的安全问题消除掉,这就是发现问题的能力体现。n分析问题n生产环境发生故障,新手程序员通过分析把问题解决修复了,就觉得没事了,有经验的程序员会在修复后进一步分析故障产生的深层次原因,后续怎么预防类似故障再次发生,会总结出故障报告供后续经验分享。n分析问题不是简简单单分析问题的表面,还需要去分析问题深层次的原因,以及思考预防同类问题的原理。n解决问题n发现问题和分析问题后,解决问题相对会容易一些,有的时候知道问题在哪,但是不知道怎么解决也是让人很苦恼的事情。n工作中,有些新手程序员会问我linux某个命令怎么用,API怎么用,我通常不会直接告诉他答案,因为我可能也不知道具体用法,就算知道了我告诉他一次了,下一次他也不会自己解决,我会反问他:n1.查过命令手册、官方文档吗n2.有没有百度、谷歌过,很过问题别人都遇到过,也提供了解决方案,例如StackOverflow就是一个很好的地方n3.关键字是否再次提取优化,有的时候关键字的不合适会导致搜索出的答案不满足期望,可以尝试用英文关键字google搜索n我也遇到过很多次程序员请求别人问题时,没人回复,并不是没有人愿意帮忙,而是他的问题没有描述清楚,别人就很难知道他想表达的意思和要解决的问题。我这里建议大家《提问的智慧(How To Ask Questions The Smart Way)》这篇文章。n这样的发现问题、分析问题和解决问题的能力才是程序员的能力才是核心竞争力。n影响力n解决问题的能力的确是软件工程师很重要的一种能力的体现,但是还不能完全体现出软件工程师的核心竞争力。n为什么很多程序员的技术水平、解决问题能力相差无几,但有的升值加薪的机会就很多?有的不需要自己去找好工作,总有好工作主动来找他?这其中的差别,就是在于他们的影响力不同。n有些程序员做事情认真靠谱,在公司形成好的口碑和印象里,大家愿意与之共事;有的乐于助人,分享自己的经验,和别人亦师亦友,在团队有很高的威望;有的有独特的项目、公司或行业经历比如阿里巴巴大厂的几年架构师经验,在业界有知名度;有的写自己的技术博客,做技术讲座,成了技术大V,在技术圈子有一定的影响力;这些影响力不是一朝一夕形成的,但却是一个软件工程师最核心的价值体现。n我们需要通过一点点技术成长积累,一个个成功项目的积累,一篇篇技术文章分享的积累,一次次分享经验的积累,而形成足够的影响力。n所以综合来说,软件工程师的最核心竞争力是:n1.最底层、最基础的是学习能力,通过学习能力,快速掌握新的技术。n2.中间层就是解决问题的能力,利用学习到的技术去发现问题、分析问题和解决问题。n3.最上层就是影响力,核心竞争力的综合体现。

职业规划

第一阶段为起步期,一般为毕业后的3年之内。不论何种背景,这一阶段的主要工作基本是编程、测试和维护;主要目标是学习和掌握公司产品/项目的基本技术、工具和流程。本阶段是软件行业所有职业的起点和立身之本,不论将来担任何种职位,都必须依赖于这一阶段打下的基础。n第二阶段为成长期,一般为毕业后的3~10年。这一阶段的人员已经掌握了基本的技术技能和经验,能够独立工作、指导或带领他人工作。公司为这类人才提供了专业和管理两条发展通道,具体地说有以下七大类发展途径:n软件技术方向n职业通道:高级软件工程师—主管软件工程师——软件架构师——高级架构师——技术专家n特点:善于独立思考,做事谨慎细致,热衷于专研技术及其创新,对新技术敏感,技术涉面广。属专业技术人才。n准备:努力专研技术,紧跟行业动向,深入研究,掌握精髓,做到该领域的专家;经常发表技术文章,总结交流技术经验;获得IBM、MS、Oracle等各主要技术的认证、攻读软件硕士/博士学位等。n开发管理方向n职业通道:高级软件工程师——主管软件工程师——开发经理/项目经理/产品经理——项目总监——技术管理总监n特点:首先要精通产品和技术,然后还有具备良好的协调沟通能力、能团结人。精通软件工程的流程与进度控制、质量控制、资源的有效使用等。属复合型技术人才。n准备:需要有软件开发各生命周期(如开发、测试)的工作经验,至少在一项技术方面具备专家水准,能触类旁通;精通项目管理的知识、技术、技巧与方法;获得PMP、CMM、软件工程、MBA等方面的认证和学位等;具备一定的行业知识。n测试技术方向n职业通道:软件工程师/测试工程师——高级测试工程师——测试分析师——测试专家n特点:做事谨慎细致,重视细节;精通QC与QA等技术和方法,熟悉IT技术及项目管理流程,精通至少一个行业(如电信、金融、物流等)的业务流程;强调沟通,属专业技术人才。n准备:精通测试理论、方法与工具,如黑盒/自动化/安全/性能/白盒测试等;有一定的编程能力;获得GB2000、ISO9001、CMM等质量体系及软件工程、质量控制等方面的认证和学位;学习业务知识。n质量管理方向n职业通道:软件工程师/测试工程师——高级测试/品质保证工程师——测试/品质保证主管——测试/品质保证经理——测试/品质保证总监nIT实施方向n职业通道:软件工程师/测试工程师——高级测试工程师——实施顾问——高级实施顾问——实施经理——实施总监nIT咨询方向n职业通道:软件工程师/测试工程师——高级测试工程师——咨询顾问——高级咨询顾问——咨询经理——咨询总监nIT营销方向n职业通道:软件工程师/测试工程师——售前工程师——客户经理——销售经理——销售总监n3.第三阶段为发展期,一般为工作10年以后。这一阶段的人员已经成为组织内的技术或管理骨干,可以向更高层次的综合管理和企业战略方向发展。如果说第一阶段比较容易实现,第二阶段通过一定程度的努力可以实现,而第三阶段则主要靠机遇和个人奋斗了。

相关词条

相关搜索

其它词条