技術中(zhōng)心

這裏象征着我(wǒ)(wǒ)們的态度和能力

程序員(yuán)和工(gōng)程師有什麽不一(yī)樣?
發布者:admin    信息來源:本站原創    發布時間:2015-08-21      浏覽次數:8917
分(fēn)享到:
  我(wǒ)(wǒ)剛剛工(gōng)作的時候,面試官曾經跟我(wǒ)(wǒ)說:好好幹兩年,可以迅速從程序員(yuán)成長爲工(gōng)程師。當時我(wǒ)(wǒ)覺得太詫異了,從很多招聘啓示來看,“程序員(yuán)”不就等 于“工(gōng)程師”嗎(ma),隻是“工(gōng)程師”更好聽(tīng)一(yī)些而已。等我(wǒ)(wǒ)工(gōng)作久了,才知(zhī)道“程序員(yuán)”和“工(gōng)程師”真的是不一(yī)樣的——程序員(yuán)隻寫程序,工(gōng)程師寫能在現實世界中(zhōng) 創造價值的程序。

  可惜,很多軟件開(kāi)發人員(yuán)未必清楚兩者的差别,甚至做了很久也隻算程序員(yuán)而不算嚴格意義上的工(gōng)程師。所以我(wǒ)(wǒ)就自己的觀察和經驗,談談程序員(yuán)和工(gōng)程師的差别。

  第一(yī),工(gōng)程師不寫黑箱程序。
  “程序=數據結構+算法”,這個著名的公式大(dà)家都知(zhī)道,不幸的是,它不适合描述工(gōng)程領域或者現實世界的程序。有很多程序,數據結構和算法都寫得 很棒,功能足夠強大(dà),系統足夠複雜(zá),但是——它很難調試,一(yī)跑起來就無法停止,而且誰也不知(zhī)道程序現在到底在幹什麽,裏面發生(shēng)了什麽。
  别覺得好笑,我(wǒ)(wǒ)遇到過很多工(gōng)作三四年甚至五六年的開(kāi)發人員(yuán),仍然不停地生(shēng)産黑箱程序:出現問題的第一(yī)反應是直接殺掉進程重啓(天哪你們的程序不能安全關閉的嗎(ma)?)。當然還有更生(shēng)猛的,直接用開(kāi)發機連上生(shēng)産數據庫(防火(huǒ)牆上開(kāi)個洞)去(qù)調試。
  你說他們技術不好嗎(ma)?明明各種技術問題也能搞定。你說他們沒有系統意識?做過的程序也不簡單。但是,他們做的充其量隻能叫“程序”,而不是工(gōng)程上成熟的“系統”。
  怎樣的程序不是黑箱?你需要考慮它的層次劃分(fēn),你需要考慮哪些(功能之外(wài)的)運行信息必須暴露和記錄,以什麽方式暴露記錄,你甚至還需要考慮這 些暴露和記錄對性能的影響,以及程序需要對外(wài)提供什麽操縱接口……當你把這一(yī)切都考慮清楚,寫出能夠讓運行細節“盡在掌握中(zhōng)”的程序的時候,你的一(yī)條腿就 邁進了“工(gōng)程”的大(dà)門。
  這方面,互聯網和軟件開(kāi)發的大(dà)廠會更加關注一(yī)些,但也不是說個人就毫無追求的空間了。網絡爬蟲大(dà)家都會寫,大(dà)家也都知(zhī)道如果要數據抓得準,調試 起來很麻煩。我(wǒ)(wǒ)有個朋友在某大(dà)廠寫過一(yī)套“可視化”的爬蟲,可以用逐步操縱語句的執行,迅速定位問題所在。這種水平的工(gōng)程師,屬于可遇而不可求的類型,每 次說起來大(dà)家仍然啧啧稱贊。
  第二,工(gōng)程師注意實現和接口分(fēn)離(lí)。
  Java 面試的一(yī)道經典問題是:請描述抽象類和接口的區别。通常,大(dà)家都會知(zhī)道“接口”和“實現”要分(fēn)離(lí)。不幸的是,很多人理解的“接口”,隻是俠義的特定語言提供的 interface,而沒有考慮“接口”真正的含義。
  接口的真正含義是什麽?計算機最擅長處理額是信息,它可以讓信息脫離(lí)現實的障礙高速流動起來。如果說“實現”是幹髒活累活,“接口”就是發出幹髒活累活指令的窗口。髒活累活幹一(yī)遍就足夠了,但發指令的窗口卻可以有千千萬萬。
  更具體(tǐ)一(yī)點說,完成功能的是程序員(yuán),完成功能并且設想它會在什麽情況下(xià)使用,并且讓人方便使用的,是工(gōng)程師。我(wǒ)(wǒ)見過不少這樣的程序:登錄會話(huà)一(yī) 開(kāi)始放(fàng)在本地内存裏沒問題,到了要切換到數據庫裏方便會話(huà)轉移就得大(dà)興土木,雖然要做的其實仍然隻是存取而已;程序自動加載的數據出了問題,就根本不能手 動加載;以前手動加載的數據,改成自動加載就要推倒重來……
  有沒有接口意識,能不能真正區分(fēn)接口和實現,這是區分(fēn)程序員(yuán)和工(gōng)程師的一(yī)大(dà)标識。
  第三,工(gōng)程師注重功能的邏輯聯系。
  很多系統都在不斷的變化和改進過程中(zhōng),程序員(yuán)看到的是功能點,工(gōng)程師看到的是功能點之上的邏輯。
  任何系統當然都是由若幹功能構成的。但在功能點之上,還需要一(yī)張有邏輯意義的大(dà)網,才能把功能點組合起來,把複雜(zá)度降低,成爲大(dà)家能理解的對 象。最簡單的“登錄”,就包含數據輸入、數據驗證、登錄信息記錄等等功能,“登錄”是這些功能的邏輯集合,也是理解這些功能的基礎。
  随着時間的推移,業務的增長,新功能可能越來越多,比如用戶數據的加載,對好友的通知(zhī),廣告的推送準備等等。這些功能實現起來當然都容易(因爲 很具體(tǐ)),但功能堆積的後果是複雜(zá)度急劇上升,因爲功能之間的邏輯聯系被切斷了。所以,工(gōng)程師必然需要思考,這些功能應該怎麽組合,放(fàng)到哪些具有邏輯意義 的動作——比如“登錄”裏去(qù)?正是經過這樣持續不斷的思考,系統的複雜(zá)度才能夠被一(yī)直維持在較低的水平,容易讓大(dà)家理解。
  這個例子看起來很簡單,但做起來卻沒那麽容易。我(wǒ)(wǒ)有時看到複雜(zá)的系統操作手冊,簡直讓人哭笑不得:1) 點這裏;2) 點那裏;3) 輸這個…… 這些操作對應的邏輯意義那麽準确,分(fēn)明就該是一(yī)次性自動完成的啊,把它們割裂開(kāi)來的後果大(dà)大(dà)提高了系統的複雜(zá)度,既不方便維護,也不方便操作。最後來擦屁 股的,隻能是開(kāi)發人員(yuán)自己。
  我(wǒ)(wǒ)經常反思自己接受的教育,在學校裏寫程序,和工(gōng)作了寫程序,有那麽一(yī)點相同,但又(yòu)好像完全兩回事,到底有什麽不同,隻有親自體(tǐ)會、思考了才能 明白(bái),所以我(wǒ)(wǒ)想把自己的所見所感寫出來。悟性好的有機會接受很好訓練的同學,估計不需要了解這些。但對于沒有這樣條件的同學,但願我(wǒ)(wǒ)的這點念叨能給你們一(yī) 點幫助。

4000-880-989
(24小(xiǎo)時熱線)
聯系客服
微信公衆号

官方公衆号

小(xiǎo)程序

©2008-2022 CORPORATION ALL Rights Reserved. 西山區唯美網絡科技工作室版權所有 滇公網安備