无论是医生、老师,还是会计,都很容易让人理解工作内容,并且这项工作在现实生活中也可以继续发挥作用,但软件开发工程师这个岗位实在是不好描述。纵观国内外不少程序员扎堆的论坛,我们总能看到与“软件开发”相关的讨论,不少网友甚至发出质疑:除了工作,软件开发是无用职业吗?

近几年,科班和培训出身的 IT 从业人员数量激增,市场几近饱和,甚至裁员风波不断,软件开发工程师仿佛被放在了裁员一线,声音少,关注度低,偶尔发出一些声响还可能是?#22909;?#26032;闻。如果了解这个行业,就一定知道每位软件开发工程师的成长都实属不易。

Java 工程师、C++ 工程师、PHP 工程师都属于单一类别,真正的软件开发工程师?#28909;还?#31243;师要求还多,除了基础编程语言(C、C++ 或者 Java),还要了解数据库、JavaScript、AJAX、Spring 等前沿技术,对网络工程和软件测试等也要有所涉猎。

一般来说,软件开发工程师既是软件设计师、软件架构师,也是一个优秀的程序员,可谓是门门武器皆可把玩,标准的高薪技术人才,为?#35009;?#24635;是被爆出悲观无用论调呢?

软件开发是无用职业吗?

国外一位软件工程师在与众多同事聊天中总结出一句话:对大多数人而言,软件工程开发是一个除工作之外无用的职业之一,这项技能在生活中几乎用不到。不少网友跟帖调侃称,平时还可以修修电脑、重装系?#22330;?#28165;理电脑垃圾等。调查中,大多数软件开发工程师不会详细向家人介绍自己的工作,除非有人刨根?#23454;祝?#20063;有人曾因为介绍得过于详细而被家人拉去到处修电脑。

虽然调侃成分居多,但也不免传递出一些心酸。实际上,软件开发工程师在产品生命周期中的作用非常重大,涵盖需求、设计、开发、修改、发布等多个环节,生活中也没有传说的那么无趣和无用。很多软件开发工程师擅长通过编码解决生活问题,?#28909;?#32534;写一些软件或小程序自动运行部分重复且复杂的工作;为零售商店编写网站或者 APP,方便用户选购商品;为家居编写控制程序以达到智能目的;编写简单的日程提醒软件,以免忘记重要约会…… 有业内人士表态,是否有用取决于用户是否真的需要,只要需要就是软件开发工程师的价值所在。

此外,在国外一线科技公司工作的软件开发工程师,?#28909;?#35895;歌、?#36824;?#34218;资水平早已达到年薪 100 万人民?#26131;?#21491;。反观国内,2010 年的软件出口规模达到 215 亿元,软件从业人员达到 72 万人,虽然如此,但人才缺口依旧巨大,尤其是高素质软件工程人才,极度短缺。

所以,这个岗位不是无用,而是顶尖人才尚未到位。

软件质量越来越差是开发的锅吗?

一个优秀的软件开发工程师,必须对自己的产品负责。如今,一个?#21482;?#23601;可以解决吃饭、休?#23567;?#20986;行、娱?#20540;?#21508;方面需求,只要几个 APP 就可以搞定全部,软件产品越来越多,但真正可以算得?#31995;?#35206;性创新的东西却很少,基础软件的质量似乎越来越差,这个锅应该开发背吗?

在 V2EX 上,某开发者深夜发表了一篇题为“底层开发性价比越来越低,基础软件的质量将会越来越差”的帖子,他表示,前半句是当前事实,后半句则是基于事实对未来的推断,也就是说,未来,基础软件的质量将会越来越差,这又从何说起呢?

他认为,现在的年轻人中只有很小一部分愿意去维护和学习前人花费数十年时间,整理出的数千万行代码,基础软件的补丁质量在逐年下降。大部分年轻人不愿意做“平行世界的守护者?#20445;?#26356;加赞同?#23433;?#37325;复造轮子”的说法。

随着市场对产品研发和迭代周期的要求越来越短,各种敏捷开发工具应运而生,与以往相比,同样的功能只需要很少的特定代码就可以实现,软件开发工程师花费的时间确实变少了,但对性能和用户体验的关注也在下降,这也导致大量软件流入市场,但整体质量却是在下降。

?#27604;唬?#19981;少奋斗在一线的底层开发者对此也表达了不满,认为国内尚有很多开发者重视基础软件质量,并愿意更新迭代前人编写的底层代码,只是这个群体的话语权太少,被外界听到的声音太弱。

?#27604;唬?#20063;有网友认为,这也不全是软件工程师的问题,很多公司在软件开发过程中往往是需求提了改,改了提,最终开发的产品成了一堆无用代码堆积?#36824;?#26399;一再压缩,为了赶时间,大部分软件开发工程师不得已省去设计时间,自然?#36824;?#22827;评?#32769;?#30446;效益和成本,后果往往是非常痛苦的修改和更新,不同开发者之间的协作也可能影响系?#31216;?#20182;功能,导致整个软件开发流程漏洞百出。

因此,软件质量好坏不是单纯依靠软件开发工程师就可以解决的,这其中还涉及到多人协作,部门合作等问题,这个锅全部砸在工程师身上,也是有点?#30784;?/p>

如何避免无用代码堆积?

当曾经向往的职业变成一日又一日的无用代码堆积,多少让开发者有些心灰意冷,虽然无法保证整个产品质量,但至少可以在代码层面下点功夫。无用代码堆积这种现象在日常软件开发中非常普遍,对于需求频繁被修改的问题,根源在于弄清楚软件开发的目的是?#35009;矗?#20195;码有没有用的最终决定者应该是用户,如果一?#26410;?#30721;具备的功能符合用户需求,具备业务价值,那么就是有用的。

在软件开发过程中,需求变更和代码修改是很正常的事情,但这个不确定性需要在一定?#27573;?#20869;。对此,最佳的解决方案可能是迭代开发,也叫迭代增量式开发,将整个开发周期分解为若干时间段,每隔一段固定时间就对软件进行一次小迭代,每迭代几次就进行一次全面测试和大版本更新,对开发成果进行质?#31185;?#23457;,这个过程最重要的是听取最终用户的意见,以便及时调整优化,避免无效需求,尤其是决策者?#21738;?#38376;出来的决定。

开发之前,技术负责人务必准备好相应文档,确定好各工程师的分工,尤其是需要协同完成的部分。另外,团队尽量抽出时间和精力进行代码 Review,并以降低代码复杂度为目标,如果不同工程师之间的代码间经常互相影响,可以考虑让这类程序员负责独立开发模块,降低对整个项目的影响。

长期以来,测试在国内的重视程度并?#36824;唬?#19968;个测试团队起码应该有白盒测试、效率测试、单元测试等各类专职人员,不建议在所有功能完成之后才开始测试,最好是完成一个功能就马上交给测试,测试阶段应由测试完全掌握主动权,开发必须尊重测试人员的工作。

归根结底,软件开发是一项非常复杂的工作,为了避免过程出错,很多公司已经摸索并建立了成熟且完整的代码编写规范,包括变量命名规则、层?#20301;?#35774;计、类和接口设计,到最后的代码 Review 都很清楚,最重要的不是会写代码,而是学会解决问题,做真正有价值的事情。

毫无疑问,软件工程开发是一项有价值且极具挑战的工作,这种价值不仅体现在工作中,很多优秀的软件产品已经对用户生活产生影响,这也是很多一线科技公司不可或缺的岗位,但价值到底有多大还要取决于做的人,如果开发者自身技艺不精,很容易弄巧成?#23613;?/p>