大討論:如何儘可能接近掌握軟件工程?

{"type":"doc","content":[{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Alan Kay,曾就讀於科羅拉多大學波德分校,2017、2018 年度最佳作者。不久前,他發起了“如何儘可能接近掌握軟件工程”的大討論,吸引了不少讀者參與討論。InfoQ 中文站翻譯並整理成文,以饗讀者。"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"“工程”是以一種有原則的方式製造東西——因此,肯定存在“軟件工程”。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"這一想法在 20 世紀 60 年代被闡述爲一種“願望”,因爲計算機中已知的“原則性方式”與已建立的工程學科(民用、機械、航空、電氣等)相比,並沒有很大的可比性。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"今天,很多計算機專家都會說,“軟件工程”的定義僅僅取決於他們所做的事情(與“計算機科學”同理)。除去“願望”,他們也刪除了很多觀察、批評和改進的動機和能力。對於這些人來說,“掌握軟件工程意味着與當前的實踐保持同步”。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我是一個老頑固,我更喜歡一種早期的、更嚴厲的、更開明的“願望”,並且喜歡比較和思考如何讓軟件開發更接近於現有的工程。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"已有的“工程學”領域本身的一個特點就是,它們已經被科學發明徹底改變了。將科學引入工程學領域花了相當長的時間:150 多年來,這個過程緩慢而艱難,但工程學現在是一種傳統修補方法的混合,可以根據原理、數學模型和現代科學制造。後兩者,尤其是後者,極大地改變了“用原理製作的含義”和“使用的原理和工具”。計算機的出現,特別是強大的交互式圖形計算,恰逢其時,藉助強大的計算機輔助設計工具、計算機輔助設計模型的仿真器,以及越來越多的直接由仿真審查的設計驅動的虛構物,推動了這一變化。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"應該指出的是,用於工程學科的新計算機工具幾乎總是比計算機人員在編寫程序時所用的工具更全面!這具有強烈的諷刺意味。(有很多“黑屏仿真卡-甲板-玻璃-電傳打字機”的屏幕在使用,這與當今電氣工程或製造工程中的設計和製造方式形成了鮮明對比。)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"再往深裏說,大多數軟件人只是在嘗試製造虛構物,大多數工具都是虛構物工具:“軟件工程”中很少有計算機輔助設計,更沒有仿真。在我的老眼裏,這並不像真正的工程過程。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"換個角度來看,在目前的“軟件工程”過程中,我並沒有看到很多“數學和科學”。現在,我要把“擴展”這一概念擱置一邊,只是說,如今計算機科學對“科學”一詞還沒有認真對待,這一術語根本就沒有用處。整個短語,也就是“計算機科學”,也許更像是設計師的牛仔褲的標籤而已。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"現在讓我來挑剔一下 \"軟件工程 \"中的第一個術語。當今的許多軟件系統都是某種形式的“遺留”,而且無論如何,它以變化的“剛性”(這與“軟性”相反)和安全和完整性的“脆弱性”(這與“工程”的意義相反)爲特徵。實際上,情況正好相反。“軟性”軟件(以及從對“軟性”軟件的理解)所需要的就是在一個工件的生命週期中具有“極端靈活性”(“軟性”是我們製造可編程計算機的原因)和“極端安全和完整性”。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"這種組合有可能從根本上擴展到“軟件工程”,我認爲我們作爲“有抱負的工程師”,主要工作就是讓軟件變得“極其安全、極端靈活”。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"我認爲這是一個重新思考這一切的良好起點。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"在我看來,“軟件工程”,正如已有發展的現有領域一樣,應該積極地追求爲其項目和領域本身找到“實際需要的東西”(What Is Actually Needed,WIAN)。因此,“掌握”是一個不斷接近這一領域的理想的過程,並非一蹴而就。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"部分網友評論"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"Dan Stark"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":",DvOps。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我學會了怎樣更好地估計一個任務需要多長的時間,並且達到我許諾的目標。我組建了團隊,在回顧會上對代碼審查和非批判性的反饋給與了誠實的評價,因爲我希望我們的團隊能夠不斷地更上一層樓。在與公司中的半技術或非技術人員交流技術話題時,我不會讓他們覺得我在貶低他們。依我看,要想在軟件工程中真正“卓越”,你需要在編程領域之外的許多方面取得成就。"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"Horia Tudosie"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":",擁有 30 多年計算機程序員經驗。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"(節選)……我認爲一個電氣工程師如果不懂得編程,就不可能與計算機打交道(即使如此),事實上,成爲一名軟件專家要比成爲一名硬件創新者要容易得多。"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"Nat Russo"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":",在 MTV 播放第一個視頻之前就開始寫代碼。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"不是這樣的,讓我來解釋一下。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當我還是一個國防承包商的時候,我和軍隊裏的人閒聊時學到了一句話:“不要混淆地圖和地形”。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"地圖並沒有真正改變。無論你所在的領域或所選技術的具體情況如何,都有一些久經考驗的、真實的工程原則適用於整個領域。40 年前,程序員的工具箱裏包含了一些工具,至今仍然存在:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"數據結構"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"流程控制"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"迭代技術"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"經典算法"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"還有許多我肯定忘記了的東西,包括調試技術等等。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"軟件開發生命週期實際上並沒有發生根本的變化。今天,我們把一些部件換成了不同的名稱,但是卻一點都不新。不管你用多小的時間單位來衡量,你仍然:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"獲取並分析需求"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"創建設計"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"經歷設計調整階段"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"實施設計"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過質量保證週期(迭代的錯誤修復\/質量保證)。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"根據組織的標準操作程序,進行產品發佈。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"無論你採用的是瀑布模式、螺旋模式還是敏捷模式,上述內容都是正確的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"今天令人困惑的不是軟件工程的過程(“地圖”)。它是快速變化的技術(“地形”),其中許多技術已經十分普及,並且將在不再需要(例如)知道如何用 C++ 編碼的工程師之前,這些技術就會消失得無影無蹤。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作爲一名富有成效且有價值的軟件工程師的途徑就是注重(掌握)軟件工程的原理。學會怎樣學習。也許聽起來奇怪,但這是一個工程師需要掌握的重要技能。學會迅速掌握新技術。請注意我沒有說“學會如何迅速掌握某某新技術”。我並沒有這麼說,因爲這最終是一件愚蠢的差事。有些人會走這條路,而且做得很好。我們稱這些人爲大師。我們的行業並不需要一個充滿大師的世界。它需要一個充滿優秀工程師的世界。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"專注於並掌握單一技術的危險在於,你要依靠預知能力來決定你的職業生涯能否持續。“鮑勃的編程語言”可能在今天和未來 24 個月內風靡一時。你也許能在 6 個月內掌握“鮑勃的編程語言”。36 個月後,當 “弗雷德的編程語言”大行其道時,你該怎麼辦?正如我所說,傻瓜纔會做。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"但如果你花費了大量時間來掌握軟件工程的原理和過程,那麼在“鮑勃的編程語言”大師們在餐車上賣玉米餅之後,你還會被僱傭很長時間,因爲你已經掌握了技能,可以掌握你現在的僱主需要的任何特定技術。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"因此,我並不贊同文章的觀點。掌握軟件工程在幾十年前和今天一樣難。因爲軟件工程的基本原理並沒有改變。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"每六個月,作爲一名軟件工程師,都要重新塑造自己。當我們從一個問題領域轉移到另一個問題領域時,它一直是一個“變色龍”。這一直是關於有能力迅速成爲一個主題專家。它一直是關於通過批判性思維和綜合抽象概念的能力來解決複雜問題。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"它從來都是關於技術的。技術來來去去。不要把它與技術掛鉤。讓它與軟件工程的原則有關,你就會有一個成功的職業生涯,並以壽命來衡量。"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"Barbara Robson"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":",研究科學家(水生生態系統建模)。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我不認爲碩士學位是一個騙局,但我可以提供一個澳大利亞的觀點,說明爲什麼有些人持這種觀點。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在澳大利亞,專業學位(成爲工程師、醫生、律師、牙醫、獸醫等所需的資格)傳統上都是本科學位。這些專業學位比基本的文學士或理學士更長,可能是 4 年、5 年或 6 年的工程學士、法律學士、醫學學士\/外科學士等。提供碩士學位,但主要限於 MBA(旨在爲商業領袖在工作中確立自己的地位後提供進一步的管理教育)和哲學碩士。(一種研究學位,有時被認爲是一種流產的博士學位。)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當澳大利亞高校開始建立其國際市場時,它們首先提供傳統的學士學位,收取的費用比國內學生高。國際學生很快就成爲許多大學收入的主要來源,併爲研究活動提供了交叉資助,從而使大學得以擴張。目前在澳大利亞的一些大學中超過30% 的學生是國際學生。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"國際學生帶來了對碩士學位的新需求。雖然在澳大利亞相對較新,但專業碩士學位卻被國際上廣泛認可。許多潛在的付費國際學生已經在本國獲得了學士學位,他們希望獲得澳大利亞的學歷,以獲得更廣泛的認可,但又不想從頭開始再讀一個本科學位。還有一些學生只是想獲得一個兩年制的學位,以幫助他們在澳大利亞立足,併爲獲得永久居留權做好準備。我還想補充一點,對許多學生來說,在國內完成學士學位,然後在澳大利亞獲得碩士學位,要比在澳大利亞獲得一個(更長的)學士學位更經濟,而且還能得到更高層次的資格,來自一個學位普遍受到國際認可的國家。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"儘管這些學位確實填補了一個寶貴的空缺,還有一種觀點認爲,學士加碩士的模式比專修學士學位能培養出更成熟、受教育更廣泛的專業人士,但是澳大利亞的一些學者,尤其是那些在其他方式下成長的老學者,對目前所提供的碩士學位持嘲諷的態度,視之爲簡單的增收手段。完成一個本科學位,然後再獲得一個更專業的碩士學位,要比從獲得學士學位的第一天起就開始從事你的專業工作要花更多的時間,並且會給學校帶來更多的學生費用。例如,傳統的專業工程資格是 4 年制工程學士學位。新的模式(與傳統模式同時提供)是 3 年的理學士,重點是工程學,再加上 2 年的工程碩士:這就是 5 年的學費,而不是 4 年。如果學生在 3 年的理學士期間沒有完成正確的基礎學科(或沒有達到足夠高的水平),則可能需要更長的時間:不是 2 年的碩士學位,可能是 3 年或更長。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一些大學現在也提供不頒發專業資格的碩士學位(包括工程碩士學位)。對這些學位有需求,因爲它們可以在一兩年內完成,即使是那些在所學專業方面沒有足夠背景的學生,在這段時間內,也能把他們培養成專業水平。我聽說這種碩士學位被輕蔑地稱爲“公關學位”。有些人認爲,大學不考慮學生的成績,只管收取學費;學生們爲了獲得永久居留權,不惜一切代價接受這些課程。我不確定這樣是否有效,但我不瞭解公關法。"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"Amin Ariana"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":",Google 員工。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"是的,我知道這裏有很多人都沒有計算機科學學位。很多地方都對軟件工程沒有學位要求,包括谷歌公司。學位只是證明你有能力的一個很好的信號。假如沒有學位,但只要你能證明自己的能力,你還是有很大的機會。雖然我必須說,沒有任何工程學科的教育背景,但它也可能是一個信號:這些能力對你來說並不重要,而我所說的“其他”人,擁有諸如電子或機械工程等其他學位,並且\/或者已經成爲黑客愛好者已經很長時間了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"所要求的能力通常是:(a)你能理解計算機科學的基礎知識,並通過爭論某種算法設計與另一種算法的優點而得到證實;(b)在有限的時間內,你可以用代碼解決問題。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在沒有學位的情況下,找到一份軟件工程師工作的最佳方式是:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"1. 把你解決問題的代碼示例放在網站上(個人網站或使用那些對你編碼能力進行排名的新網站)。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"2. 找幾個已經在你想要工作的地方的工程師來閱讀你的代碼並給出反饋(在你的學習中反覆研究,根據這些內容採取行動)。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"3. 讓他們真正相信你的能力,社交禮節在這裏沒有任何價值,而且絕對要確保他們堅定地相信你擅長這方面。他們需要能夠在你不在的時候給你排名,並在下面簽上他們的名字,所以不要自欺欺人地認爲只是得到一個“Yes”。問問他們:“你認爲我具備足夠的額能力,連續給五個面試官留下深刻印象嗎?”並認真聽取反饋意見。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"4. 如果他們說你已經準備好了,就請他們給你寫一份你想去的公司的推薦信。假如你真的瞭解你的遊戲(強大的編程技能),你會比你想象的更快地通過這個過程。甚至沒有人會問你是否有學位。因爲強大的程序員是一個“稀有的品種”。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"關鍵在於衡量 \"強大的編程技能\"。大多數擁有學位的人,甚至是計算機科學的博士,在評估自己的編碼能力時,都會受到達克效應的影響。實際編碼能力是書本理論與長期實踐的結合,僅僅取得一個學位是不可能學會的。在“筒倉”中編寫大量代碼也是不可能學到的。這是一種將好奇心結合起來,從理論上講更好的編碼方法,並熱情參與編碼,以解決大量你感興趣的問題。這樣,構成編碼技術的類比就像在雨天騎自行車一樣直觀。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"不要落入窠臼。不要止步不前。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"你的手藝比一張紙更有說服力。"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"Bill Brubaker"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":",亞利桑那州州立大學軟件工程學士。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"(節選)……“工程師”意味着嚴格的高等教育,側重於數學和項目管理。工程師運用工程科學和科學知識,確保按時、按預算、高質量地解決實際問題。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"“開發者”是“工程師”硬幣的另一面,其重點是製造東西的藝術——通常需要很長的學徒期——而不是嚴格的科學。人們對質量、預算和及時性仍有很高的期望;傳統的項目管理往往受到挑戰或被完全拋在一邊。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"……“軟件工程師”是 Margaret Hamilton 在美國國家航空航天局工作時創造的一個短語和職業,當時她主張要比單純的“程序員”有更高的報酬。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在 20 世紀 40 年代和 50 年代,男性是計算機工程師或科學家,而輸入代碼的人,通常是女性,是“程序員”。男性通常受過大學教育,而女性則在貿易學校或上崗培訓受過教育。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"“計算機科學家”是爲那些有更多學術背景的人而設。(而且,在 20 世紀 50 年代和 60 年代,美國政府向大學提供了更多的資助,並且爲那些擁有“科學”項目或“科學家”作爲僱員的公司簽訂了合同。“計算機科學家”就這樣誕生了。)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我想,“開發者”這個詞,應該是在軟件工藝運動中的產物。開發者與房地產開發商沒有什麼不同:組織、專業化和項目管理。(聽起來就像一個不同的工程師,但也許沒有那麼多的數學知識。)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"……大多數人,即時是在大廠,並不知道在術語上的區別,也不在乎,這最終意味着他們的“開發者”和“軟件工程師”概念完全是武斷的。"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"Leslie Foster"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":",軟件工程師\/開發者(1988 年~今)。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我個人的觀點是:獲取可靠的反饋。理解諸如可維護性、安全性、可擴展性、可讀性(特別是)、部署和性能 等 “非功能性需求”。這些不一定是按重要性排序的。這並不是一個詳細的清單。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"你希望在代碼之上(“代碼”)瞭解源代碼是如何影響這些非功能性需求的。許多非功能性需求必須通過將代碼分解爲子問題來滿足。“關注點分離”是經典的計算機科學概念,在這些關注點中就有非功能性需求。與此相反的問題可能就是,僅僅滿足於某件事完全起作用。隨後,如果其他人無法對代碼進行維護,或者該代碼無法在可有效使用的地方部署,則此方法不可行。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"而我認爲將程序員和軟件工程師區別開來的一種方式是,我喜歡將程序員和軟件工程師區別開來,一種方法是,使用 “工程思維”,質量就有了,代碼才能得到執行。你可以拋棄過去的努力,爲正在進行的一些新的努力而拋棄,而不必覺得你是在質疑之前做的事情。或者你可以將其替換爲從某個庫或其他依賴項中編寫的內容,並且以此爲榮。當然,無論你寫的是什麼,都會是最好的,但你要能夠接受別人的批評,並隨着時間的推移不斷完善。由於外界的進步,即使是優秀的代碼也會被淘汰。如果時間到了,你可以把代碼丟在一邊。"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"Lambros Photios"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":",Station Five 首席執行官。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"blockquote","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"掌握軟件工程大概就是從中級程序員過渡到高級程序員或技術領導。也就是說,能夠管理一個團隊或非常獨立運作的人。此外,掌握軟件工程並不涉及學習更多的編程語言或庫,因爲有太多的語言需要學習,可以說專注於少數幾個語言將有助於提高你作爲一個程序員的整體專業知識,而不是爲了學習而學習更多的語言。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有了這個先決條件,一個人如何進行過渡呢?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我一直認爲,有兩個主要的學習內容可以將中級程序員與高級或技術領導區分開來。這兩點是:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"實際接觸"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"align":null,"origin":null},"content":[{"type":"text","text":"溝通"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"讓我們把這些東西分解得更詳細一點。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"實際接觸:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"作爲程序員,你可以從理論上學習,這將讓你開始。然而,將優秀者與偉大者區分開來的是對各種技術問題的實際接觸。由於編程是解決問題的,那麼讓自己接觸更多的技術問題會讓你學會如何解決這些問題,減少在未來遇到問題時解決它們的時間。那就像是要解決一個數學問題,一次又一次。編程也是一樣,你接觸的越多,你解決問題的速度就越快。不是說要重複同一個問題,而是要解決儘可能多的、不同的問題,這樣你纔能有更高的整體接觸率,也能更好地解決未來的問題。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"溝通:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"向非技術利益相關者傳達技術概念被低估了。你可以寫出最好的代碼,也有能力解決最複雜的問題,但是如果你不能用非技術的方式來交流技術概念,你就限制了你自己和非技術利益相關者的互動。在任何產品開發團隊中,都有設計師、項目經理、產品經理、業務分析師,以及其他一系列的角色,這取決於團隊的規模和行業。能夠彌合技術和“其他一切”之間的差距是一項基本技能,它將中級程序員與高級人員和技術領導區分開來。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我希望這對你有幫助!"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"參考資料:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"https:\/\/www.quora.com\/How-does-one-get-as-close-as-possible-to-mastering-software-engineering"}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章