1. 程式人生 > >程序員從校園到職場

程序員從校園到職場

book sin ros webkit 錯誤 流程 導致 區別 推薦閱讀

在剛入職的時候,我與一個工作多年的老員工之間有以下一番對話。

老員工:“你的C語言功底如何?”

我:“還可以,考試考了九十多分。”

老員工:“你覺得編碼規範重要嗎?”

我:“什麽編碼規範?我之前沒聽說過呢。”

老員工:“你覺得把代碼寫完並運行通過,你的工作就算結束了嗎?”

我:“差不多吧,在學校裏面程序運行沒問題就OK了。”

老員工:“對於測試,你是怎麽理解的?”

我:“測試就是看程序運行是否正常,看輸出結果是否正確。”

也不知道當時那位老員工聽了我的回答,是什麽感受。如今回憶起來,那時的我對自己將要從事的工作的理解是很不成熟的。

在工作的過程中,我發現我們在學校裏面學到的很多東西比較片面膚淺,根本達不到崗位的要求。像編碼規範、研發流程等學校裏幾乎不提及的知識,在實際的軟件開發項目中卻恰恰是異常的重要。

在學校裏面,我們欠缺的教育主要包括以下幾個方面。

第一,對編碼規範的要求。在計算機編程課上,老師只要求學生能夠編寫程序實現既定的功能即可,幾乎不會對編碼規範提出要求,而編碼規範是一般軟件項目中最基本的要求。

第二,對動手能力的要求。學校裏面學完一門課程之後,只要考試通過就行了,至於這門課程有什麽實際的用途,很少有人關心。這就導致很多人考試得了高分,但讓他們動手編寫一個程序卻出現了困難。一般的軟件公司對個人的動手能力是十分看中的,這就是為什麽他們喜歡招有工作經驗的人的原因。

第三,對研發流程的講授。軟件開發並不僅僅是編寫代碼那麽簡單。學校裏的老師只會教學生怎樣寫出代碼,但很少會教他們一個實際的軟件項目是怎麽回事。其實,編碼只是軟件研發中一個很小的部分,而諸如設計、測試等還會占據很大一部分時間。

第四,對團隊精神的培養。老師一直教導我們要獨立完成作業,考試的時候不要交頭接耳。而公司裏面,我們是在一個團隊裏面工作,我們要與各個成員合作來完成任務或解決問題。在很多時候,我們編寫的模塊要與其他模塊配合來實現特定的工作,這也是在考驗團隊之間的協作是否有默契。

第五,對情商的培養。學校的一個主要任務是讓學生學到專業知識,讓學生有一技之長,除此之外的其他方面都是次要的。但在工作崗位上,除了工作,我們要與不同的人打交道,還會遇到很多問題,這些都是對個人情商的考驗。很多人在學校裏面表現得很優異,但在工作中一遇到困難就怨天尤人、哀聲嘆氣的,這就是因為缺少在情商方面的鍛煉。

當然,我也是一樣,在走出校門的時候躊躇滿誌,以為世界盡在我手中。但在工作上遇到一系列問題之後,我逐漸改變了自己對軟件開發的很多看法

。作為過來人,我有義務將所學到的經驗分享給大家,讓大家在軟件開發這一條道路上走得更順暢一點。

踏出校門,對於我們整個學習生涯來說,只是“×××長征走出了第一步”。為了使得之後學習和工作的道路走得更加順暢,我們需要認清自身所學知識的不足,我們需要破除一些有關軟件開發的錯誤觀念,我們更需要在學校裏面就未雨綢繆地開始培養工作所需的一些技能。

技術分享圖片

“認清自身不足”


我在走出校門的時候非常“輕狂”,認為自己在學校裏面已經學得夠多了,工作就只是“小菜一碟”。但在工作中屢次碰壁之後,我才發現自己當時的很多想法都是不成熟的。我們踏上工作崗位,一切幾乎都要從零開始。

對於大家“非常熟悉”的C語言來說,我們在學校裏面學到的只是皮毛,遠遠不能滿足實際軟件開發工作的要求。

我們在學校裏面學到的典型的C語言程序如下:

技術分享圖片

對於以上程序,至少存在如下幾個問題。

第一,變量命名不規範,而且沒有初始化。對於該程序,main函數裏的變量n、y,fac函數裏變量f的命名均不規範,不能讓人一眼就看出它是什麽意思、要做什麽操作。這對於一小段程序來說,影響還不是很大,但如果代碼行數達到數千行甚至上萬行,那麽閱讀起來就比較的費力。另外,以上3個變量只是定義了,並沒有初始化,這在實際項目中也是不允許的。

第二,函數的命名不規範,且沒有在主函數開始之前進行聲明。本程序中的fac函數要做什麽操作?通過閱讀代碼,我們知道該函數的功能是計算一個整數的階乘。在實際項目中,函數命名非常重要,因為很多項目涉及函數個數較多,如果不能通過函數名稱來了解其作用,而必須通過閱讀代碼才能獲悉,那麽工作效率是很低的。此外,我們一般不在函數調用者的內部來對被調函數進行聲明,而是將聲明放在外部,最好新建一個頭文件(.h文件)來對程序裏出現的函數進行聲明。

第三,程序代碼排版不工整,“ if…else”語句書寫不規範。在fac函數中,代碼的排版不工整。第一個if語句下面的大括號應該與“if”關鍵字保持在同一列上,第二個“else”關鍵字應該與第二個“if”關鍵字保持在同一列上,“f=1;”和“f=fac(n-1)*n;”應該再縮進4個空格。另外,“if”和“else”關鍵字下面的執行語句不管有多少行,都應該用“{}”括起來,以方便閱讀。

第四,程序註釋過少,函數開頭沒有註釋。一般說來,在程序的關鍵語句的前面或右邊,都應該添加適當的註釋,這對程序的理解有輔助的作用。函數fac的前面應該加註釋,說明此函數的功能、輸入/輸出參數、返回值、修改記錄等。在整個程序的開頭也要添加版本信息、修改記錄等註釋信息,以方便日後查閱。

第五,程序中出現了“printf”、“scanf”和“main”函數。這是大家都習以為常的,但在實際的項目中,幾乎不可能出現這3個函數。因為很多公司都有自己的開發平臺,而且代碼都達到數千行,甚至上萬行,再加上大部分都不是基於VC開發的,你在哪裏去輸入,又在哪裏去看輸出呢?我一進公司,最開始看到程序,就想去找“printf”、“scanf”和“main”,但這是徒勞的,因為根本就沒有。關於輸入/輸出,開發中會有專門的消息處理流程來處理,大家需要知道的就是一個完整的代碼工程中不一定非要有上面的3個函數(但本書為了給大家介紹C語言的相關知識,在程序仍然使用這3個函數)。

短短的幾十行代碼,就出現了這麽多大家“沒有想到”的問題。

看到以上的分析,也許你會很驚慌:我以前的C語言難道是白學了?

非也!我舉這個例子,不是為了給大家當頭一棒,讓大家覺得軟件開發是多麽高深和艱難。我只是想說明,對於C語言,我們還有很多不知道的東西,即使是自己知道的,也與實際工作存在較大的偏差,因此大家要虛心學習。我和大家一樣,也經歷了最開始的惶恐階段,而後才逐漸去改變了自己“根深蒂固”的觀念。“知錯能改,善莫大焉”啊!

技術分享圖片

“破除錯誤觀念”

要讓我們做事情的能力能夠有所提升,觀念的轉變是關鍵。

從學生轉變為職業人的過程是很艱難的,因為我們要與自己積累了多年的“老毛病”作鬥爭,這些“老毛病”包括:做事拖拉、不守時、不遵守規則、怕吃苦等。就像發射火箭衛星一樣,擺脫重力的束縛所花費的燃料是最多的,一旦成功,那麽以後的流程就會比較輕松了。所謂“萬事開頭難”,也就是這個道理。

那麽,要想掌握工作中C語言的基本技能,我們需要破除哪些錯誤觀念呢?如圖1.1所示。

技術分享圖片

圖1.1 我們需要破除的錯誤觀念

錯誤觀念一:我的C語言學得很好。

很多剛走出學校的、準備從事軟件開發的人都持有這樣的觀念,因為他們在學校考試都得了高分。但想法是美好的,現實是殘酷的。真正到了工作崗位,你就會發現,自己在學校學的那些知識是十分有限的,根本不足以應對工作。例如,C語言中的指針、結構體、異常保護這些,學校裏面講得很少或者不深入,大家也沒有太註意,只是應付了考試,但工作中我們需要時時與它們打交道。你還說自己學得好嗎?

因此,為了個人的技術積累和職業發展,我們一定要謙虛,要虛心學習。

錯誤觀念二:編程是很簡單的事情。

持這種觀點的人,也是受到了學校教育的影響,因為書本上面的代碼都很短,而且比較簡單。但在工作中,也這麽簡單嗎?非也。

我總結了一下,教材上的程序與實際工作中的程序至少有以下幾點不同。

第一,代碼行數的多少。

教材中的代碼一般為幾十行,多則一兩百行,大家當然會覺得簡單;而工作中的代碼少則幾千行,多則上萬行,兩者根本不是同一個數量級的。我最開始拿到程序的時候,腦袋就暈了:怎麽這麽多代碼呢?我從沒看到過。

第二,變量及函數的命名。

這是兩者的最大不同,也是“專業”和“業余”的重要區別。在教材中,經常的命名有這幾個:“int i;”、“char *p;”、“float f;”、“int f(int a,int b)”等,大家都已經習以為常了。但在實際的開發中,命名方式卻大有不同。在工作中,我們要嚴格按照編程規範來辦事,對變量及函數的命名不能想當然。這在後續的章節中會有詳細的說明。

第三,程序的註釋。

這也是很讓人頭痛的事情。教材上面的程序比較短,因此註釋少,這也給大家引入了一種錯覺:註釋的有無和多少不重要。但在工作中,我們要時刻記住:在一些重要的程序語句附近,一定要有註釋。不僅如此,註釋的寫法也有多種,在不同的地方,寫法是不一樣的。簡短而清晰的註釋可以提高大家閱讀代碼的速度,進而提高了工作效率。

第四,輸入/輸出語句。

在教材上,幾乎每個程序都有“scanf”和“printf”這兩個函數,用於讀入和輸出數據,大家用得是津津有味,如果哪個程序沒有這兩個函數,反而會覺得奇怪。但在實際的項目代碼中,幾乎不存在這兩個函數的,而代之以其他方式來進行輸入和輸出。在剛開始的時候,你也許會覺得難以接受,但慢慢熟悉之後,你就會知道這是什麽原因了。

第五,程序的樣式。

在教材上,一段程序沒有什麽樣式可言,只要實現需要的功能即可。這也給大家帶來了誤解,認為編程只註重功能,其他什麽的都可以“隨心所欲”。但在工作中,對於程序的版式、布局都是有嚴格規定的,哪裏應該縮進(以及縮進幾個空格)、哪裏應該留空格、哪裏應該留空行,都是要註意的。這就像一個人一樣,光說自己肚子裏“有貨”還不行,還需要註意外表,要讓大家看起來覺得很舒服,所謂的“內外兼修”,就是這個道理。

錯誤觀念三:我只要把代碼寫好就行了,其他的就不用管了。

大家也許會認為,開發工程師只負責寫程序,其他的什麽測試啊、寫文檔啊,就不必自己操心了。其實不然。

在工作中,開發工程師的工作是很多的,編寫代碼只是一小部分。在編寫代碼之前,我們要對軟件進行詳細設計;在代碼寫完之後,不能馬上把它交給測試人員來測試。很多新手寫完代碼就了事,這是不對的。我們要首先進行自測,這會花費比較長的時間,甚至比寫代碼的時間還要長很多,等自測無誤之後,才能正式提交。

除了寫代碼和自測,我們還要編寫相關的開發文檔。你也許會認為寫文檔是文檔工程師的事情,非也,這是開發工程師要幹的。

另外,我們從開始寫代碼到最後提交,都要嚴格遵守項目的管理流程,不能放任自流,要在規則之下來做事情。

錯誤觀念四:公司會安排好我的職業道路。

每個人進入公司,都會有相應的入職培訓,這其實就是公司對應屆畢業生進行所謂的“洗腦”的過程。培訓老師會給大家講,公司是多麽多麽好,公司會針對每個員工制定好培養計劃,讓大家在適合自己的職業軌道上發展。

但是,當你發現坐在你旁邊的員工已經入職10年,可是還做著和你一樣的工作時,你對公司美好的幻想瞬間就破滅了。確實,不管是在學校,還是在工作單位,我們不要指望學校或公司能夠將未來的道路給安排好,而要靠自己不斷地努力去實現自身的價值。

科學技術日新月異,新的軟件開發技術層出不窮。從事軟件開發這一行,我們就要馬不停蹄地學習,任何寄希望於他人或公司的想法都是不可取的。

“磨刀不誤砍柴工”,在樹立了正確的觀念之後,我們學習工作中的C語言就容易多了。


技術分享圖片

“工作所需軟技能的培養”


在新員工剛進入公司的時候,一般都會有一段時間的試用期,也叫做培訓期。對於大部分IT企業來說,這個試用期大體分為3個階段:第一階段,企業文化、辦事流程、公司業務範圍等的培訓;第二階段,工作所需專業知識的培訓;第三階段叫做“以師帶徒”,也就是由一位老員工帶著來從事具體的開發工作。

但是,我們不能奢望通過這個短短的培訓期就能夠將工作中所需的技能全部掌握,因為學習重在長期的積累,個人習慣的改變更是一個漫長而痛苦的過程。這就需要我們在學校裏面就有目的性地培養工作所需的方方面面的東西。

總的說來,工作所需的一些軟技能(即除專業技能之外的一些影響個人工作和發展的技能)如圖1.2所示。


技術分享圖片

圖1.2 工作所需的一些軟技能

那麽,我們如何在學校裏面有針對性地培養如圖1.2所示的各種能力呢?

第一,對於實踐性較強的一些課程(如程序設計課程、算法課程、網絡課程、數據庫課程等),一定不能只求考試通過,要多問為什麽、多動手編寫程序。

有一位學弟發來郵件向我咨詢一些問題,其中有個問題是這樣的:

看書學技術的時候有時還是很有成就感的,特別是敲代碼實現一些小的算法的時候,感覺很舒服。但是看得時間長了偶爾就會感覺枯燥,耐不住寂寞。

想必很多人都有類似的感觸。我的答復是這樣的:

如果你在學校寫點程序就會覺得枯燥的話,在工作中你會覺得更枯燥。如果你從事軟件開發工作,那麽幾乎每天都要和程序打交道,需要相當大的韌性才能堅持得住。

如何才能既學到技術,又不感覺到枯燥呢?根據我個人的經驗,可以參考圖1.3。

技術分享圖片

圖1.3 一個學習的良性循環

打個比方來說,你要學習C語言,那麽首先要選一本好的參考書,對於書上的程序或課後的習題,你要親自敲到電腦裏面來運行。慢慢熟悉之後,你對編程會有一些心得體會,這時你就可以將這些心得體會寫成博客發表出去。寫博客又會促使你去學習新的東西,別人的評論也會讓你受益。如此不斷地循環(根據個人的經驗這是一個良性循環),自身能力會不斷提高,你會發現學習技術是一件很有趣的事情。

如果你覺得書本上的題目太簡單,可以利用我們最強大的老師(網絡)去尋找一些實際的軟件開發項目來做。此外,很多開源社區也是一個很不錯的選擇。

“問渠那得清如許,為有源頭活水來”,我們只有不斷地輸入和輸出知識,才能讓自身充滿活力。

第二,適當地參加一些社團活動或集體活動,利用假期(如寒假或暑假)到外面去做兼職。

很多學生做兼職的目的就是去掙錢,而不管所做的工作的內容是怎樣的,這就有點舍本逐末了。通過恰當的兼職及社團活動,我們不僅能夠學到一些書本上沒有的知識(或者是能夠看到書本知識在實際中的應用),還能夠培養自己與人打交道的能力以及調節工作壓力的能力。當然,在校學知識是最主要的,要在不影響學習的情況下去做兼職和參加課外活動。

第三,打好專業基礎,在高年級的時候爭取能夠到企業裏面去實習。

絕大部分學生在學校學習的最終目的是就業,也就是要走出校門,進入企業。因此,如果你在畢業之前能夠有一段到企業裏面去實習的經歷,那麽這必將豐富你的人生經歷,讓你在畢業求職的路上快人一步。

能夠去單位實習,從側面來說也是對你在校學習成果的一種認可。因此,大家一定要將自己的專業課學好,讓企業認為你是一個可以培養的人。

通過一份比較有份量的實習,我們不僅能夠學到專業知識、企業運作流程,還能夠提高自己的動手能力、表達能力、團隊協作能力等,同時也可以為自己的簡歷增加亮點。李開復老師也多次強調了大學生實習的重要性。

從認清自身所學C語言知識的不足入手,接著讓大家破除幾個有關軟件開發的錯誤觀念,然後讓在校學生有意識地培養工作所需的一些軟技能。認清自身的不足讓人謙虛,破除錯誤觀念讓人不惑,培養技能讓人信心百倍。現在,我們可以正式開啟軟件項目實踐中C語言的學習征程了。

本文摘自《C程序員從校園到職場》

技術分享圖片

《C程序員從校園到職場》

周兆熊 著

點此鏈接購買紙書

要成為一名合格的C程序員,僅僅依靠課堂上的所學所練是遠遠不夠的,實際的軟件開發對從業者提出了更高的要求。本書重在講述從學生成長為一名職業化C程序員的必備技能和關鍵要素,為眾多同道中人指點迷津。

本書從C語言的發展歷程講起,分析了學校和職場的不同,並結合豐富的代碼實例講述了程序的樣式、變量和函數、內存操作、文件、指針和結構體、算法和協議、程序重構、SQL語句和shell命令以及程序問題排查等諸多C程序開發中的典型問題。幫助讀者形成良好的編碼規範,增強其動手能力,深入了解軟件研發流程及團隊合作的重要性。

更多程序員職業生涯規劃書單

掃碼查看

技術分享圖片

今日互動(僅限微信客戶端參加)

職場中對你影響對大的人是誰?為什麽?截止時間6月15日17時,留言+轉發本活動到朋友圈,小編將抽獎選出3名讀者贈送紙書1本和2張e讀版80元異步社區代金券,(留言點贊最多的自動獲得一張)。

技術分享圖片

推薦閱讀

2018年5月新書書單(文末福利)

2018年4月新書書單

異步圖書最全Python書單

一份程序員必備的算法書單

第一本Python神經網絡編程圖書

技術分享圖片

長按二維碼,可以關註我們喲

每天與你分享IT好文。

在“異步圖書”後臺回復“關註”,即可免費獲得2000門在線視頻課程


點擊閱讀原文,購買圖書《C程序員從校園到職場》

閱讀原文


程序員從校園到職場