程式設計師和軟體工程師的區別

  關於軟體工程師和程式設計師的區別,大家都知道嗎?今天小編就帶大家瞭解一下 軟體工程師和程式設計師的區別 , 軟體工程師是程式設計師嗎 。

  軟體工程師和程式設計師的區別

  其實懂IT的朋友應該知道,程式設計師和軟體工程師之間有著很大的區別,軟體工程師是對於軟體開發相關工作的人員的一個統稱。軟體工程師是IT行業中需求量最大的一個職位,穩居IT行業職位需求TOP10第一位。軟體工程師的技術要求比較全面的,除了最基礎的程式語言C語言/C++/JAVA等、資料庫技術SQL/ORACLE/DB2等、.NET平臺技術、C#、C/S B/S程式開發,還要掌握諸如JAVA SCRIPT、AJAX、HIBERNATE、SPRING、J2EE、WEB SERVICE、STRUCTS等的前沿技術。除此之外,還要涉獵於網路工程和軟體測試的其他技術,以便於操控全域性。軟體工程師可以說是一個專案開發的掌舵者。一名優秀的軟體工程師應該具有較強的邏輯思維能力,對於技術的發展有著敏銳的嗅覺。雖然要求技術全面,但無須偏執於門門技術都精通,任何軟體工程師都有自己的技術特長和偏向,對於自己手中的技術,可有精通-掌握-熟悉-瞭解之分,根據工作需要和職業發展的具體情況來劃分。 程式設計師是專職從事程式開發、維護的專業人員。

  按照標準來看:一個軟體工程師的工作程式是需求分析、總體設計、詳細設計、測試設計、軟體開發程式設計。與此軟體開發流程管理相適應,軟體企業也要有合理的人力資源結構。在這一結構中每一個人都必須按照分工協作的原則來進行流水線作業,其中數量最多的要數從事軟體開發程式設計等基礎工作的人員,也就是我們所說的程式設計師。所以,程式設計師和軟體工程師之間的區別就像蓋樓的分工一樣,程式設計師永遠是扮演工人的角色,而軟體工程師是這座大樓的設計人員。這也是程式設計師和軟體工程師的最大區別。

  軟體工程師是程式設計師嗎

  應該說一個軟體工程師首先應該是一個合格的程式設計師,但程式設計師只能是成為軟體工程師的第一步。一個軟體工程師來說,在掌握了基本的程式設計技能後,開發軟體所需要的各種除了編碼之外的其它知識會更為重要,比如如何從組織工程與專案的角度來看待軟體開發的問題,如何為軟體搭建合理準確的架構,什麼樣的軟體會更易於維護與更新。故而軟體工程師的級別要大於程式設計師。

  程式設計師和工程師有什麼不一樣

  第一、工程師不寫黑箱程式

  “程式=資料結構+演算法”,這個著名的公式大家都知道,不幸的是,它不適合描述工程領域或者現實世界的程式。有很多程式,資料結構和演算法都寫得很棒,功能足夠強大,系統足夠複雜,但是——它很難除錯,一跑起來就無法停止,而且誰也不知道程式現在到底在幹什麼,裡面發生了什麼。

  別覺得好笑,我遇到過很多工作三四年甚至五六年的開發人員,仍然不停地生產黑箱程式:出現問題的第一反應是直接殺掉程序重啟天哪你們的程式不能安全關閉嗎。當然還有更生猛的,直接用開發機連上生產資料庫防火牆上開個洞去除錯。

  你說他們技術不好嗎?明明各種技術問題也能搞定。你說他們沒有系統意識?做過的程式也不簡單。但是,他們做的充其量只能叫“程式”,而不是工程上成熟的“系統”。

  怎樣的程式不是黑箱?你需要考慮它的層次劃分,你需要考慮哪些功能之外的執行資訊必須暴露和記錄,以什麼方式暴露記錄,你甚至還需要考慮這些暴露和記錄對效能的影響,以及程式需要對外提供什麼操縱介面……當你把這一切都考慮清楚,寫出能夠讓執行細節“盡在掌握中”的程式的時候,你的一條腿就邁進了“工程”的大門。

  這方面,網際網路和軟體開發的大廠會更加關注一些,但也不是說個人就毫無追求的空間了。網路爬蟲大家都會寫,大家也都知道如果要資料抓得準,除錯起來很麻煩。我有個朋友在某大廠寫過一套“視覺化”的爬蟲,可以用逐步操縱語句的執行,迅速定位問題所在。這種水平的工程師,屬於可遇而不可求的型別,每次說起來大家仍然嘖嘖稱讚。

  第二、工程師注意實現和介面分離

  Java面試的一道經典問題是:請描述抽象類和介面的區別。通常,大家都會知道“介面”和“實現”要分離。不幸的是,很多人理解的“介面”,只是狹義的特定語言提供的Interface,而沒有考慮“介面”真正的含義。

  介面的真正含義是什麼?計算機最擅長處理的是資訊,它可以讓資訊脫離現實的障礙高速流動起來。如果說“實現”是幹髒活累活,“介面”就是發出幹髒活累活指令的視窗。髒活累活幹一遍就足夠了,但發指令的視窗卻可以有千千萬萬。

  更具體一點說,完成功能的是程式設計師,完成功能並且設想它會在什麼情況下使用,並且讓人方便使用的,是工程師。我見過不少這樣的程式:登入會話一開始放在本地記憶體裡沒問題,到了要切換到資料庫裡方便會話轉移就得大興土木,雖然要做的其實仍然只是存取而已;程式自動載入的資料出了問題,就根本不能手動載入;以前手動載入的資料,改成自動載入就要推倒重來……

  有沒有介面意識,能不能真正區分介面和實現,這是區分程式設計師和工程師的一大標識。

  第三、工程師注重功能的邏輯聯絡

  很多系統都在不斷的變化和改進過程中,程式設計師看到的是功能點,工程師看到的是功能點之上的邏輯。

  任何系統當然都是由若干功能構成的。但在功能點之上,還需要一張有邏輯意義的大網,才能把功能點組合起來,把複雜度降低,成為大家能理解的物件。最簡單的“登入”,就包含資料輸入、資料驗證、登入資訊記錄等等功能,“登入”是這些功能的邏輯集合,也是理解這些功能的基礎。

  隨著時間的推移,業務的增長,新功能可能越來越多,比如使用者資料的載入,對好友的通知,廣告的推送準備等等。這些功能實現起來當然都容易因為很具體,但功能堆積的後果是複雜度急劇上升,因為功能之間的邏輯聯絡被切斷了。所以,工程師必然需要思考,這些功能應該怎麼組合,放到哪些具有邏輯意義的動作——比如“登入”裡去?正是經過這樣持續不斷的思考,系統的複雜度才能夠被一直維持在較低的水平,容易讓大家理解。

  這個例子看起來很簡單,但做起來卻沒那麼容易。我有時看到複雜的系統操作手冊,簡直讓人哭笑不得:1 點這裡;2 點那裡;3 輸這個…… 這些操作對應的邏輯意義那麼準確,分明就該是一次性自動完成的啊,把它們割裂開來的後果大大提高了系統的複雜度,既不方便維護,也不方便操作。最後來擦屁股的,只能是開發人員自己。

  我經常反思自己接受的教育,在學校裡寫程式,和工作了寫程式,有那麼一點相同,但又好像完全兩回事,到底有什麼不同,只有親自體會、思考了才能明白,所以我想把自己的所見所感寫出來。悟性好的有機會接受很好訓練的同學,估計不需要了解這些。但對於沒有這樣條件的同學,但願我的這點唸叨能給你們一點幫助。

猜你喜歡