無論是醫生、老師,還是會計,都很容易讓人理解工作內容,并且這項工作在現實生活中也可以繼續發揮作用,但軟件開發工程師這個崗位實在是不好描述。縱觀國內外不少程序員扎堆的論壇,我們總能看到與“軟件開發”相關的討論,不少網友甚至發出質疑:除了工作,軟件開發是無用職業嗎?

近幾年,科班和培訓出身的 IT 從業人員數量激增,市場幾近飽和,甚至裁員風波不斷,軟件開發工程師仿佛被放在了裁員一線,聲音少,關注度低,偶爾發出一些聲響還可能是負面新聞。如果了解這個行業,就一定知道每位軟件開發工程師的成長都實屬不易。

Java 工程師、C++ 工程師、PHP 工程師都屬于單一類別,真正的軟件開發工程師比全棧工程師要求還多,除了基礎編程語言(C、C++ 或者 Java),還要了解數據庫、JavaScript、AJAX、Spring 等前沿技術,對網絡工程和軟件測試等也要有所涉獵。

一般來說,軟件開發工程師既是軟件設計師、軟件架構師,也是一個優秀的程序員,可謂是門門武器皆可把玩,標準的高薪技術人才,為什么總是被爆出悲觀無用論調呢?

軟件開發是無用職業嗎?

國外一位軟件工程師在與眾多同事聊天中總結出一句話:對大多數人而言,軟件工程開發是一個除工作之外無用的職業之一,這項技能在生活中幾乎用不到。不少網友跟帖調侃稱,平時還可以修修電腦、重裝系統、清理電腦垃圾等。調查中,大多數軟件開發工程師不會詳細向家人介紹自己的工作,除非有人刨根問底,也有人曾因為介紹得過于詳細而被家人拉去到處修電腦。

雖然調侃成分居多,但也不免傳遞出一些心酸。實際上,軟件開發工程師在產品生命周期中的作用非常重大,涵蓋需求、設計、開發、修改、發布等多個環節,生活中也沒有傳說的那么無趣和無用。很多軟件開發工程師擅長通過編碼解決生活問題,比如編寫一些軟件或小程序自動運行部分重復且復雜的工作;為零售商店編寫網站或者 APP,方便用戶選購商品;為家居編寫控制程序以達到智能目的;編寫簡單的日程提醒軟件,以免忘記重要約會…… 有業內人士表態,是否有用取決于用戶是否真的需要,只要需要就是軟件開發工程師的價值所在。

此外,在國外一線科技公司工作的軟件開發工程師,比如谷歌、蘋果,薪資水平早已達到年薪 100 萬人民幣左右。反觀國內,2010 年的軟件出口規模達到 215 億元,軟件從業人員達到 72 萬人,雖然如此,但人才缺口依舊巨大,尤其是高素質軟件工程人才,極度短缺。

所以,這個崗位不是無用,而是頂尖人才尚未到位。

軟件質量越來越差是開發的鍋嗎?

一個優秀的軟件開發工程師,必須對自己的產品負責。如今,一個手機就可以解決吃飯、休閑、出行、娛樂等各方面需求,只要幾個 APP 就可以搞定全部,軟件產品越來越多,但真正可以算得上顛覆性創新的東西卻很少,基礎軟件的質量似乎越來越差,這個鍋應該開發背嗎?

在 V2EX 上,某開發者深夜發表了一篇題為“底層開發性價比越來越低,基礎軟件的質量將會越來越差”的帖子,他表示,前半句是當前事實,后半句則是基于事實對未來的推斷,也就是說,未來,基礎軟件的質量將會越來越差,這又從何說起呢?

他認為,現在的年輕人中只有很小一部分愿意去維護和學習前人花費數十年時間,整理出的數千萬行代碼,基礎軟件的補丁質量在逐年下降。大部分年輕人不愿意做“平行世界的守護者”,更加贊同“不重復造輪子”的說法。

隨著市場對產品研發和迭代周期的要求越來越短,各種敏捷開發工具應運而生,與以往相比,同樣的功能只需要很少的特定代碼就可以實現,軟件開發工程師花費的時間確實變少了,但對性能和用戶體驗的關注也在下降,這也導致大量軟件流入市場,但整體質量卻是在下降。

當然,不少奮斗在一線的底層開發者對此也表達了不滿,認為國內尚有很多開發者重視基礎軟件質量,并愿意更新迭代前人編寫的底層代碼,只是這個群體的話語權太少,被外界聽到的聲音太弱。

當然,也有網友認為,這也不全是軟件工程師的問題,很多公司在軟件開發過程中往往是需求提了改,改了提,最終開發的產品成了一堆無用代碼堆積;工期一再壓縮,為了趕時間,大部分軟件開發工程師不得已省去設計時間,自然沒工夫評估項目效益和成本,后果往往是非常痛苦的修改和更新,不同開發者之間的協作也可能影響系統其他功能,導致整個軟件開發流程漏洞百出。

因此,軟件質量好壞不是單純依靠軟件開發工程師就可以解決的,這其中還涉及到多人協作,部門合作等問題,這個鍋全部砸在工程師身上,也是有點痛。

如何避免無用代碼堆積?

當曾經向往的職業變成一日又一日的無用代碼堆積,多少讓開發者有些心灰意冷,雖然無法保證整個產品質量,但至少可以在代碼層面下點功夫。無用代碼堆積這種現象在日常軟件開發中非常普遍,對于需求頻繁被修改的問題,根源在于弄清楚軟件開發的目的是什么,代碼有沒有用的最終決定者應該是用戶,如果一段代碼具備的功能符合用戶需求,具備業務價值,那么就是有用的。

在軟件開發過程中,需求變更和代碼修改是很正常的事情,但這個不確定性需要在一定范圍內。對此,最佳的解決方案可能是迭代開發,也叫迭代增量式開發,將整個開發周期分解為若干時間段,每隔一段固定時間就對軟件進行一次小迭代,每迭代幾次就進行一次全面測試和大版本更新,對開發成果進行質量評審,這個過程最重要的是聽取最終用戶的意見,以便及時調整優化,避免無效需求,尤其是決策者拍腦門出來的決定。

開發之前,技術負責人務必準備好相應文檔,確定好各工程師的分工,尤其是需要協同完成的部分。另外,團隊盡量抽出時間和精力進行代碼 Review,并以降低代碼復雜度為目標,如果不同工程師之間的代碼間經常互相影響,可以考慮讓這類程序員負責獨立開發模塊,降低對整個項目的影響。

長期以來,測試在國內的重視程度并不夠,一個測試團隊起碼應該有白盒測試、效率測試、單元測試等各類專職人員,不建議在所有功能完成之后才開始測試,最好是完成一個功能就馬上交給測試,測試階段應由測試完全掌握主動權,開發必須尊重測試人員的工作。

歸根結底,軟件開發是一項非常復雜的工作,為了避免過程出錯,很多公司已經摸索并建立了成熟且完整的代碼編寫規范,包括變量命名規則、層次化設計、類和接口設計,到最后的代碼 Review 都很清楚,最重要的不是會寫代碼,而是學會解決問題,做真正有價值的事情。

毫無疑問,軟件工程開發是一項有價值且極具挑戰的工作,這種價值不僅體現在工作中,很多優秀的軟件產品已經對用戶生活產生影響,這也是很多一線科技公司不可或缺的崗位,但價值到底有多大還要取決于做的人,如果開發者自身技藝不精,很容易弄巧成拙。