標籤:

軟體工程專業的學生需要掌握哪些技能?

現在大二,感覺已經找到了方向,對移動應用開發非常感興趣,自學 iOS 開發一年多了,不過不太敢確定以後如何發展。

=====================================

學校教的:c,c++,數據結構,離散數學,軟體工程概論……

自己學的:objective-c 和 cocoa touch

自己弄了個網站學到的:html, js, css, php, 還有seo, 域名, 伺服器等雜七雜八的技術知識

但是感覺除了 objective-c 和 cocoa touch掌握的有一定程度以外,其他都是基本入門而已

======================================

以上背景,下面是我的疑惑……

我是不是學的太雜了?一個標準的軟體工程學生應該掌握哪些技能?或者各位前輩參加工作後,對軟體工程的學生在學業上和專業技能發展上有哪些指導呢?

我個人在學校學生會和學院社團都有職位,班長,平時還有一份穩定的兼職在做,我該放棄哪些東西,是否需要專門去學某一項知識?


被 @周筠 老師艾特來了,小小地答一下。

個人理解,需要掌握以下一些技能點:

  1. 面向對象程序設計(OOP),並會通過具體的編程語言(建議Java和C#二選一)實現。如果要入門,推薦網易雲課堂北京大學唐大仕老師的《C#程序設計(上)》。《C#程序設計(下)》10月12日開始。不過這個課程比較基礎,需要進階的,可以學習北京理工大學 @金旭亮 老師的《面向對象軟體開發實踐之基本技能訓練》和《面向對象軟體開發實踐之專業技能訓練》。不過真的有難度。Java的話可以考慮浙江大學 @翁愷 老師的《程序設計入門—Java語言》與《Java語言程序設計進階》。當然,順帶掌握語言相對應的 IDE,如 Visual Studio 或者 MyEclipse。

  2. 基本的數據結構與演算法。可以看網易雲課堂上浙江大學 陳越 老師 和 何欽銘 老師的《數據結構》。也可以看 學堂在線 上清華大學鄧俊輝老師的《數據結構》。
  3. 資料庫,至少掌握SQL以及一個主流的DBMS(MySQL,SQL Server,Oracle等)的使用,具體種類取決於你打算主要發展的技術路線,如你選擇C#,那麼可以考慮SQL Server。如果需要更進一步的提高,如如何設計較好的資料庫,可以學習王珊《資料庫系統概論(第5版)》中關於資料庫設計規範(主要是範式)方面的章節。當然需要大量的範例做補充。可以多看看 http://toutiao.io 或者 博客園 上的文章。
  4. 設計模式。學了這個你才能很大程度上加深對於OOP的理解。可以從《Head First設計模式》或者中南大學劉偉老師的幾本設計模式書入門。具體請看我在另外一個問題下的回答:初學軟體設計模式應該讀哪本書? - 知乎用戶的回答
  5. 軟體工程。推薦 @鄒欣 老師的《構建之法(第2版)》。也可以關注他的微博。還可以看 愛課程 上清華大學軟體學院 @劉強 老師的《軟體工程》課程。
  6. 軟體測試技術。基本概念可以看同濟大學軟體學院 朱少民老師的《軟體測試方法和技術(第3版)》,他在網易雲課堂也有相應的課程。也可以上 Coursera 學習南京大學軟體學院 陳振宇 老師的課程《軟體測試》,不過有難度。現在也有不少公司開始注重單元測試,各種單元測試框架(如xUnit)學習起來都很簡單,難點在於用例的設計,而用例的設計是建立在各種軟體測試方法(等價類、邊界值、判定表等)基礎之上的。
  7. 一些軟體工程方面的輔助工具,如版本管理工具 Git (經常和 GitHub 一起出現),推薦廖雪峰的教程,如果英語水平好也可以看這個:http://campus.codeschool.com/courses/mastering-github,JIRA 等缺陷追蹤系統等。
  8. 最好掌握 UML。可以學習 Coursera 上北京大學的《面向對象技術高級課程》,非常好。
  9. 最好掌握一門Web編程語言(http://ASP.NET/PHP),JavaScript和一個前端框架。這個資料就很多了。也可以看 金旭亮 老師的課。
  10. Office三件套——Word、Excel和PowerPoint。看過不少准畢業生甚至工作了幾年的畢業生做的文檔和幻燈片,無論從低劣的審美上還是粗糙的格式上簡直都讓人無法直視。


作為一名大四的學生,我無法回答這個問題,但是我還是想分享一下自己的心得,以供參考:

1. 凡有所學皆有所用。所有的知識儲備都可以為今後的發展提供更多的可能。當在工作中遇到一個機會,如果曾經有相關的經驗,那麼把握住這個機會的概率就會更大。

2. 深度優先還是廣度優先。個人覺得應該深度優先。因為如果能夠在某個方向上有深入的了解,得到一些較為專業的經驗,比如:實習、開源項目甚至實際工作經驗。那麼,在相對實際的開發中,我們會有更多的機會,從我們的夥伴那裡,以更小的成本學習到其他領域的知識。雖然我承認木桶理論,但是我也認為,在某些時候,對於一個技能的深入掌握,會成為我們的核心競爭力。

3. 沒有標準。世界上沒有相同的兩片樹葉。個人認為理想的教育應該因材施教,而不是把人塑造成千篇一律的機器。通常,我會想想自己在可見的未來想成為什麼樣的人。我和目標之間的差距在於什麼地方?我可以通過什麼途徑來縮小差距?

這個世界誘惑太多,想明白自己到底想要什麼,什麼才是自己的核心競爭力。對自己培養核心競爭力有好處的事情我們應該多做,但是讓自己快樂的事情,我們更應該做!


很多大學生和剛工作不久的人常常有這樣的疑問,自己學了這個語言、那個語言、這種技術、那種技術,是不是學得太雜了,是不是應該專註於一種語言或者技術。

我認為大多數提問的人並沒有學雜,而只是在打基礎而已。從這個問題中也可以看到,學校教的東西是基礎中的基礎,提問者本人學習的是移動開發的基礎,做網站學到的是網路開發的基礎。

我們在高中和大學選專業之前都是文理兼修,因為那些是其他一切科學知識的基礎。

同樣,在IT職業的路上,你在問題中提到的知識也都是基礎。都學會了不是學雜了,而只是讓自己的基礎知識更全面,更紮實。儘管學下去,不需要顧慮什麼。只要注意學習的時候不要只學皮毛,多學學每種技術的思想和核心,這樣對今後快速學習和擴展知識面以及專註某一技術都會有很大幫助的。


下面這些學校的同學們通過已經或正在接受的軟體工程課程的訓練,獲得了一些有價值的技能,也許值得你借鑒:

多所高校軟體工程課程的訓練內容

福州大學軟體工程課程的同學在怎樣做項目?

愛因斯坦講過這樣一段話——

用專業知識教育人是不夠的。通過專業教育,他可以成為一種有用的機器,但是不能成為一個和諧發展的人。要使學生對價值有所理解並且產生熱烈的感情,那是最基本的。他必須獲得對美和道德上的善惡鮮明的辨別力。否則,他 —— 連同他的專業知識 —— 就更像一隻受過很好訓練的狗,而不像一個和諧發展的人。為了獲得對別人和對集體的適當關係,他必須學習去了解人們的動機、他們的幻想和他們的疾苦

寧波大學的 @劉慰 老師這樣評價《構建之法》——

這本書與絕大部分介紹軟體工程或者項目管理的書籍非常不同的一點,就是鄒老師非常強調「人」在軟體開發中起到的作用

本書用了一小半的內容來介紹「人」的問題,像第5章就非常詳細地介紹了一個團隊中常見的崗位,以及每個崗位的職責,同時還列舉了理想的模式,以及不那麼理想但非常常見的模式。...絕大多數軟工類書籍都強調要「加強溝通技巧」,但是如何溝通卻完全沒有涉及。鄒老師實實在在地在書中介紹了不少「說話的藝術」。

(劉老師的書評詳見:所有軟體工程教師與學生都值得一讀的書 )

鄒欣老師在《構建之法》中,列出了初級軟體工程師的幾種成長:

更多內容,請看這裡:

《構建之法》試讀:3.1 個人能力的衡量與發展(1)

《構建之法》試讀:3.1 個人能力的衡量與發展(2)

《構建之法》試讀:3.2 軟體工程師的職業發展

《構建之法》的作者 @鄒欣 老師的知乎專欄值得關注,比如這篇軟體開發不是閉卷考試 ——回答的正是題主的提問——

軟體開發不是閉卷考試

鄒欣

有同學問:

「我負責項目中一個關鍵的功能, 它有一定的技術難度,但是做好了會很有面子! 我調試了很久,都沒找到實現的途徑,這時我已經在這上面花了很多時間了,而且無法預期解決需要多長時間。 怎麼辦?」

一種典型失敗的情況是:

第一天:我正在做一個關鍵的功能, 看起來不難,做好了會很有面子。。。

第三天:就是搞不通,就這樣過了三天,其中「murphy"s law」 (總在沒有時間的時候要花時間處理意外事情)又浪費了一天。我想還是加班,先別告訴老闆;如果做好了,再加緊做幾個小功能。這樣還是能趕上進度。。。

第五天:全組開會,支吾了幾句,說還是很有希望如期完成的。。。

第九天:加了班,也問了同事,還是沒戲,小功能也沒時間做了… 眼看期限就要到了,心裡充滿了悲劇情緒。老闆要是問起,就如實說明,要是沒問,我還是爭取做好了再報告。

第十一天:期限到了!還是沒頭緒, 要和老闆開會review了,Panic!

首先我們要明確,這是一個實際的團隊項目。不是學校里的閉卷考試(一些人在離開學校很久還偶爾做惡夢,考試中一些題做不出來…)。

實際的項目中的問題,都是有解的,而且大多數是多項式時間內有解。我們在現實項目中的 「解題能力」,取決於下面這些因素:

1. 對問題的了解。有沒有能力了解客戶需求,分析問題,把大問題分解成小問題來解決。有沒有眼光看到可以簡化/繞過一些難題。在閉卷考試的時候,所有的題意和條件都在試卷上,理解之後,就可以埋頭做題了, 你不能問老師,更不能和同桌討論;但是實際項目中,用戶的初始需求是非常含糊的,而且經常變化。我們不能想像,客戶剛開口說:

「嗯,能不能做一個搜...」

工程師就一揮手打斷了客戶,

「我知道了,兩周後來拿全站搜索功能!」

「網站要支持搜索」, 是哪一種呢?

- 全部自己做搜索,還是可以用第三方的解決方案?

- 所有剛剛提交的信息必須立即顯示在結果中,還是允許有延時

- 支持中文?分詞? 搜索正文,包括用戶名或其他元數據么? 還是。。。

- 支持複雜的查詢條件么?是否支持二次細化查詢?

- 對結果的排序有何要求?

- 最終想達到什麼結果?

不同的需求,有不同的解決方案,這時不宜 「make too much assumption」,認為用戶要的就是某一種,就甩開膀子開始做。 要深入的了解用戶文字後面的真正理由,一個工程師抱怨說, 他的企業客戶要求軟體 UI 上面所有的按鈕都要是3D 並且半透明。他深入了解後,發現原因是客戶的女友喜歡玩某一時髦遊戲軟體(就不點名了),上面的按鈕都是這樣的。

工程師大叫一聲 - 我倒...

他從昏迷中蘇醒後,怎麼辦? 我想他可以提示客戶專註於軟體的流程和業務邏輯,也許能把按鈕的需求放到較低的優先順序。

2. 對技術的了解。看書的時候覺得「技止此耳」,開發項目的時候才覺得實際情況和書上講的都有一些出入,偏偏一些重要的細節書上沒有提。我們很多人是邊看http://asp.net的書, 邊開發http://asp.net 的項目,這相當於一邊看醫學書一邊動手術。。。

另外,有時候 low-tech 的解決方案要更好。 不一定每一個類都要多態繼承, 用很多虛函數, 才能實現。

3. 估計任務的能力 – 軟體項目難度及日程的估計,是一門不小的學問,初學者犯了錯誤也沒關係,關鍵是要吃一塹,長一智。當你說「某某 feature要在某某日子完成」,你的意思是到了那一天:

  • 程序剛寫好,編譯通過, or
  • 可以在debugger 中運行通過, or
  • debug/retail 都成功,可以集成在網站上,但是有一些問題, or
  • 自己已經完成了測試,能保證簽入代碼後,整個項目構建沒問題, or
  • 測試人員已經全面完成了測試,or
  • 和其他有依賴關係的功能都集成測試過。

要達到不同的狀態需要的時間是很不一樣的!(參見 軟體項目的估計)

4. 溝通和管理風險的能力。 軟體工程項目中最怕的是 「surprise」 和 「lack of visibility」,作為程序員,溝通非常重要。及早和同事/上級/客戶通報項目遇到的風險,會讓大家都了解項目的進展及問題,及時得出解決方案。 比如要達到某個要求有困難,用戶是否一定要此功能?要及時溝通。

在北航的《現代軟體工程》課,一個小組把所有希望都寄托在一個號稱 「技術大拿」 的同學身上,他用一連串的技術名詞,讓其他同學相信他一定能單人搞定這個項目。 結果在項目要交付的前一周,這位同學消失了,不來學校也不接電話...

5. 拒絕的能力。在以上能力的基礎上,還要有對不切實際的需求說 「no」 的勇氣和自信。

(題圖來自這裡 )

&>&>&>鄒欣老師在這篇專欄中提到的五項能力,在《構建之法》中均以多得多的篇幅仔細展開敘述了,so,專欄算是導讀。若要深入領會,不妨一邊實踐一邊讀《構建之法》。


學校教的叫軟體工程,你學的叫程序員。

前者指導或磚在哪,或如何搬,或搬哪裡,後者只管搬。

其實軟體工程的培養目標的人在企業很重要的,一般是5~10年以上工作經驗的還不一定有機會當。

關於學習的心靈雞湯,各位答案中已經說得很多了,就不多說了。

參考清華大學的培養計劃:

軟體工程專業本科培養方案

一、培養目標

本專業面向軟體系統應用、設計、開發、運維、服務等與軟體全生命周期相關的產業,培養基礎扎實、專業突出、並具有較強國際競爭能力和創新能力的軟體系統的科學家和工程師

二、基本要求

軟體工程專業本科畢業生應達到如下知識、能力和素質的要求:

1.具有堅實的自然科學、人文社會科學和工程技術基礎,以及較強的工程實踐能力;

2.具備較強的社會責任感和良好的職業道德;

3.具備紮實的軟體理論和軟體工程專業知識,具有良好的工具使用與實驗能力、軟體分析與開

發能力、過程式控制制與管理能力、團隊協作與溝通能力;

4.具有獨立工作能力、終身學習能力和創新精神。

五、專業核心課程

計算機系統軟體

數據結構與演算法

軟體理論基礎


修電腦

因為會有無數親朋好友知道你的專業後讓你做這件事。


學得雜很好啊,這樣才更容易讓你發現你感興趣的,然後再深入

既然對移動應用開發感興趣,就繼續朝這個方向發展


首先,不要輕易相信所謂木桶原理之類的定論,這個不成立,至少不能用在學習上,你想既然規定了長短板來比作技術深淺,那是誰規定了你所學的東西一定要如水一般端平,為什麼木桶里一定要去裝水,我插花不行啊,短板只決定了偏向它的花枝,但是整體的高度是由最高的長板決定的。

然後,學的廣還是學的深,這個取決於看這個問題的角度,和你的本領本身其實沒有關聯。講究圍繞一個中心點,全面拓展。而當找不到中心的時候,當然要海納百川。比如我研究C裡面的數組語法,把其他的語言都了解了一遍,了解語言的同時了解了使用語言的框架,IDE,了解框架時了解搭建框架的伺服器架構,當然到最後,別忘了完成最初的目標,這是適應這個時代的學習方式,更好、更快地適應環境。


我是今年畢業,目前在深圳做android開發這一塊。

1.我的專業是信息安全技術,網路方向的,大一的時候我也嘗試去尋找自己的方向,大概有:ios,android,Html5,Python等,後來綜合各方面考慮後開始自學android。當然專業課伺服器,php,html,網路,路由交換各種都有,我的做法是完成這些,其實學校認為(僅代表我們學校的情況)你學的很好的,對於專業來說,你僅僅是了解或者入門而已。所以,並不衝突,我感覺有的是作為專業基礎知識的。

2.我在學校曾經負責過社團,這也讓我更好的鍛煉自己的溝通和交流能力,以及去分享自己學到的一些技術,分享是檢驗學習成果最好的方式,可以加深自己的理解。所以說,我感覺你沒有必要去放棄,尤其是以後工作中工程師相對溝通交流的並不多,然後良好的表達問題和意見的能力,我感覺還是比較重要的。

3.選准自己喜歡的方向,堅持下去,一定要堅持下去。不管外界說這個趨勢怎麼怎麼,我感覺重要的是通過學習一門技術,掌握了學習技術的方法和解決問題的能力是最重要的。重要的在於學習的過程,你收穫的。然後,就是有機會一定要去做項目,不管是參加比賽還是找一個公司去寫代碼,成長和收穫都是對於自己學習比較快的。實用google,並關注github。


十多年寫代碼畫架構外加忽悠顧問技術招聘的老油條答一下:招應屆生,只看這兩點 1. 高考數學分數是不是120以上,多多益善 2.人品 3.求職意願

其他的么,哪怕你在學校里天天打LOL 掛科N門四級沒過學位證畢業證沒有……我都不care


這裡面的tips可以作為學習的參考:

現代軟體工程 課件 軟體工程師能力自我評價表


推薦閱讀:

免費的mac清理軟體有哪些?
有什麼軟體可以一刷一天?
不裝安全軟體是一個好習慣嗎?
無編程基礎的人想編寫一款軟體應該如何做?整個軟體架構,基礎設計都有了

TAG:軟體 |