無(wú)論是醫(yī)生、老師,還是會(huì)計(jì),都很容易讓人理解工作內(nèi)容,并且這項(xiàng)工作在現(xiàn)實(shí)生活中也可以繼續(xù)發(fā)揮作用,但軟件開(kāi)發(fā)工程師這個(gè)崗位實(shí)在是不好描述??v觀國(guó)內(nèi)外不少程序員扎堆的論壇,我們總能看到與“軟件開(kāi)發(fā)”相關(guān)的討論,不少網(wǎng)友甚至發(fā)出質(zhì)疑:除了工作,軟件開(kāi)發(fā)是無(wú)用職業(yè)嗎?
近幾年,科班和培訓(xùn)出身的 IT 從業(yè)人員數(shù)量激增,市場(chǎng)幾近飽和,甚至裁員風(fēng)波不斷,軟件開(kāi)發(fā)工程師仿佛被放在了裁員一線,聲音少,關(guān)注度低,偶爾發(fā)出一些聲響還可能是負(fù)面新聞。如果了解這個(gè)行業(yè),就一定知道每位軟件開(kāi)發(fā)工程師的成長(zhǎng)都實(shí)屬不易。
Java 工程師、C++ 工程師、PHP 工程師都屬于單一類別,真正的軟件開(kāi)發(fā)工程師比全棧工程師要求還多,除了基礎(chǔ)編程語(yǔ)言(C、C++ 或者 Java),還要了解數(shù)據(jù)庫(kù)、JavaScript、AJAX、Spring 等前沿技術(shù),對(duì)網(wǎng)絡(luò)工程和軟件測(cè)試等也要有所涉獵。
一般來(lái)說(shuō),軟件開(kāi)發(fā)工程師既是軟件設(shè)計(jì)師、軟件架構(gòu)師,也是一個(gè)優(yōu)秀的程序員,可謂是門門武器皆可把玩,標(biāo)準(zhǔn)的高薪技術(shù)人才,為什么總是被爆出悲觀無(wú)用論調(diào)呢?
一、軟件開(kāi)發(fā)是無(wú)用職業(yè)嗎?
國(guó)外一位軟件工程師在與眾多同事聊天中總結(jié)出一句話:對(duì)大多數(shù)人而言,軟件工程開(kāi)發(fā)是一個(gè)除工作之外無(wú)用的職業(yè)之一,這項(xiàng)技能在生活中幾乎用不到。不少網(wǎng)友跟帖調(diào)侃稱,平時(shí)還可以修修電腦、重裝系統(tǒng)、清理電腦垃圾等。調(diào)查中,大多數(shù)軟件開(kāi)發(fā)工程師不會(huì)詳細(xì)向家人介紹自己的工作,除非有人刨根問(wèn)底,也有人曾因?yàn)榻榻B得過(guò)于詳細(xì)而被家人拉去到處修電腦。
雖然調(diào)侃成分居多,但也不免傳遞出一些心酸。實(shí)際上,軟件開(kāi)發(fā)工程師在產(chǎn)品生命周期中的作用非常重大,涵蓋需求、設(shè)計(jì)、開(kāi)發(fā)、修改、發(fā)布等多個(gè)環(huán)節(jié),生活中也沒(méi)有傳說(shuō)的那么無(wú)趣和無(wú)用。很多軟件開(kāi)發(fā)工程師擅長(zhǎng)通過(guò)編碼解決生活問(wèn)題,比如編寫一些軟件或小程序自動(dòng)運(yùn)行部分重復(fù)且復(fù)雜的工作;為零售商店編寫網(wǎng)站或者 APP,方便用戶選購(gòu)商品;為家居編寫控制程序以達(dá)到智能目的;編寫簡(jiǎn)單的日程提醒軟件,以免忘記重要約會(huì)...... 有業(yè)內(nèi)人士表態(tài),是否有用取決于用戶是否真的需要,只要需要就是軟件開(kāi)發(fā)工程師的價(jià)值所在。
此外,在國(guó)外一線科技公司工作的軟件開(kāi)發(fā)工程師,比如谷歌、蘋果,薪資水平早已達(dá)到年薪 100 萬(wàn)人民幣左右。反觀國(guó)內(nèi),2010 年的軟件出口規(guī)模達(dá)到 215 億元,軟件從業(yè)人員達(dá)到 72 萬(wàn)人,雖然如此,但人才缺口依舊巨大,尤其是高素質(zhì)軟件工程人才,極度短缺。
所以,這個(gè)崗位不是無(wú)用,而是頂尖人才尚未到位。
二、軟件質(zhì)量越來(lái)越差是開(kāi)發(fā)的鍋嗎?
一個(gè)優(yōu)秀的軟件開(kāi)發(fā)工程師,必須對(duì)自己的產(chǎn)品負(fù)責(zé)。如今,一個(gè)手機(jī)就可以解決吃飯、休閑、出行、娛樂(lè)等各方面需求,只要幾個(gè) APP 就可以搞定全部,軟件產(chǎn)品越來(lái)越多,但真正可以算得上顛覆性創(chuàng)新的東西卻很少,基礎(chǔ)軟件的質(zhì)量似乎越來(lái)越差,這個(gè)鍋應(yīng)該開(kāi)發(fā)背嗎?
在 V2EX 上,某開(kāi)發(fā)者深夜發(fā)表了一篇題為“底層開(kāi)發(fā)性價(jià)比越來(lái)越低,基礎(chǔ)軟件的質(zhì)量將會(huì)越來(lái)越差”的帖子,他表示,前半句是當(dāng)前事實(shí),后半句則是基于事實(shí)對(duì)未來(lái)的推斷,也就是說(shuō),未來(lái),基礎(chǔ)軟件的質(zhì)量將會(huì)越來(lái)越差,這又從何說(shuō)起呢?
他認(rèn)為,現(xiàn)在的年輕人中只有很小一部分愿意去維護(hù)和學(xué)習(xí)前人花費(fèi)數(shù)十年時(shí)間,整理出的數(shù)千萬(wàn)行代碼,基礎(chǔ)軟件的補(bǔ)丁質(zhì)量在逐年下降。大部分年輕人不愿意做“平行世界的守護(hù)者”,更加贊同“不重復(fù)造輪子”的說(shuō)法。
隨著市場(chǎng)對(duì)產(chǎn)品研發(fā)和迭代周期的要求越來(lái)越短,各種敏捷開(kāi)發(fā)工具應(yīng)運(yùn)而生,與以往相比,同樣的功能只需要很少的特定代碼就可以實(shí)現(xiàn),軟件開(kāi)發(fā)工程師花費(fèi)的時(shí)間確實(shí)變少了,但對(duì)性能和用戶體驗(yàn)的關(guān)注也在下降,這也導(dǎo)致大量軟件流入市場(chǎng),但整體質(zhì)量卻是在下降。
當(dāng)然,不少奮斗在一線的底層開(kāi)發(fā)者對(duì)此也表達(dá)了不滿,認(rèn)為國(guó)內(nèi)尚有很多開(kāi)發(fā)者重視基礎(chǔ)軟件質(zhì)量,并愿意更新迭代前人編寫的底層代碼,只是這個(gè)群體的話語(yǔ)權(quán)太少,被外界聽(tīng)到的聲音太弱。
當(dāng)然,也有網(wǎng)友認(rèn)為,這也不全是軟件工程師的問(wèn)題,很多公司在軟件開(kāi)發(fā)過(guò)程中往往是需求提了改,改了提,最終開(kāi)發(fā)的產(chǎn)品成了一堆無(wú)用代碼堆積;工期一再壓縮,為了趕時(shí)間,大部分軟件開(kāi)發(fā)工程師不得已省去設(shè)計(jì)時(shí)間,自然沒(méi)工夫評(píng)估項(xiàng)目效益和成本,后果往往是非常痛苦的修改和更新,不同開(kāi)發(fā)者之間的協(xié)作也可能影響系統(tǒng)其他功能,導(dǎo)致整個(gè)軟件開(kāi)發(fā)流程漏洞百出。
因此,軟件質(zhì)量好壞不是單純依靠軟件開(kāi)發(fā)工程師就可以解決的,這其中還涉及到多人協(xié)作,部門合作等問(wèn)題,這個(gè)鍋全部砸在工程師身上,也是有點(diǎn)痛。
三、如何避免無(wú)用代碼堆積?
當(dāng)曾經(jīng)向往的職業(yè)變成一日又一日的無(wú)用代碼堆積,多少讓開(kāi)發(fā)者有些心灰意冷,雖然無(wú)法保證整個(gè)產(chǎn)品質(zhì)量,但至少可以在代碼層面下點(diǎn)功夫。無(wú)用代碼堆積這種現(xiàn)象在日常軟件開(kāi)發(fā)中非常普遍,對(duì)于需求頻繁被修改的問(wèn)題,根源在于弄清楚軟件開(kāi)發(fā)的目的是什么,代碼有沒(méi)有用的最終決定者應(yīng)該是用戶,如果一段代碼具備的功能符合用戶需求,具備業(yè)務(wù)價(jià)值,那么就是有用的。
在軟件開(kāi)發(fā)過(guò)程中,需求變更和代碼修改是很正常的事情,但這個(gè)不確定性需要在一定范圍內(nèi)。對(duì)此,最佳的解決方案可能是迭代開(kāi)發(fā),也叫迭代增量式開(kāi)發(fā),將整個(gè)開(kāi)發(fā)周期分解為若干時(shí)間段,每隔一段固定時(shí)間就對(duì)軟件進(jìn)行一次小迭代,每迭代幾次就進(jìn)行一次全面測(cè)試和大版本更新,對(duì)開(kāi)發(fā)成果進(jìn)行質(zhì)量評(píng)審,這個(gè)過(guò)程最重要的是聽(tīng)取最終用戶的意見(jiàn),以便及時(shí)調(diào)整優(yōu)化,避免無(wú)效需求,尤其是決策者拍腦門出來(lái)的決定。
開(kāi)發(fā)之前,技術(shù)負(fù)責(zé)人務(wù)必準(zhǔn)備好相應(yīng)文檔,確定好各工程師的分工,尤其是需要協(xié)同完成的部分。另外,團(tuán)隊(duì)盡量抽出時(shí)間和精力進(jìn)行代碼 Review,并以降低代碼復(fù)雜度為目標(biāo),如果不同工程師之間的代碼間經(jīng)常互相影響,可以考慮讓這類程序員負(fù)責(zé)獨(dú)立開(kāi)發(fā)模塊,降低對(duì)整個(gè)項(xiàng)目的影響。
長(zhǎng)期以來(lái),測(cè)試在國(guó)內(nèi)的重視程度并不夠,一個(gè)測(cè)試團(tuán)隊(duì)起碼應(yīng)該有白盒測(cè)試、效率測(cè)試、單元測(cè)試等各類專職人員,不建議在所有功能完成之后才開(kāi)始測(cè)試,最好是完成一個(gè)功能就馬上交給測(cè)試,測(cè)試階段應(yīng)由測(cè)試完全掌握主動(dòng)權(quán),開(kāi)發(fā)必須尊重測(cè)試人員的工作。
歸根結(jié)底,軟件開(kāi)發(fā)是一項(xiàng)非常復(fù)雜的工作,為了避免過(guò)程出錯(cuò),很多公司已經(jīng)摸索并建立了成熟且完整的代碼編寫規(guī)范,包括變量命名規(guī)則、層次化設(shè)計(jì)、類和接口設(shè)計(jì),到最后的代碼 Review 都很清楚,最重要的不是會(huì)寫代碼,而是學(xué)會(huì)解決問(wèn)題,做真正有價(jià)值的事情。
毫無(wú)疑問(wèn),軟件工程開(kāi)發(fā)是一項(xiàng)有價(jià)值且極具挑戰(zhàn)的工作,這種價(jià)值不僅體現(xiàn)在工作中,很多優(yōu)秀的軟件產(chǎn)品已經(jīng)對(duì)用戶生活產(chǎn)生影響,這也是很多一線科技公司不可或缺的崗位,但價(jià)值到底有多大還要取決于做的人,如果開(kāi)發(fā)者自身技藝不精,很容易弄巧成拙。