如何成為一名真正的程序員?
本人十幾歲開始寫程序,近十幾年來都在教人寫程序,還經營著一個可能隨時倒閉的軟件公司,主要的開發(fā)語言是C#。首先,我不認為《算法導論》是所有程序員必須一開始就掌握和精通的內容。我無意否認某些核心課程的重
本人十幾歲開始寫程序,近十幾年來都在教人寫程序,還經營著一個可能隨時倒閉的軟件公司,主要的開發(fā)語言是C#。
首先,我不認為《算法導論》是所有程序員必須一開始就掌握和精通的內容。
我無意否認某些核心課程的重要性,但是我們必須看到——很多程序員并不懂程序員的三大浪漫——編譯原理,圖形學,操作系統(tǒng),但這并不妨礙他們在日常工作中創(chuàng)造出各種有價值的軟件。
之所以這么講,原因是:
行業(yè)的門檻因技術的不斷進步而降低 不是所有的程序員都需要系統(tǒng)而全面地學習才能勝任工作。
這些年來,編程語言、開發(fā)工具的迅速發(fā)展,我們可以用C#、Java、Objective C這樣的語言完成大多數(shù)開發(fā)任務(而不是在紙上打孔或者用匯編),用著Visual Studio這樣爽的開發(fā)工具, 這并不是因為廠商大發(fā)慈悲要拯救程序員于水火之中,而是微軟這樣的廠商在取悅我們的老板和客戶——技術發(fā)展的目的是降低軟件開發(fā)的用人標準,進而降低軟件行業(yè)的人力資源成本,更快、更好、更便宜地滿足用戶的需求。
從公司的角度來看,如果要求所有開發(fā)人員都是基礎扎實、技能全面的,那么用人成本一定很高,我完全相信經過一定訓練和挑選的***鳥畢業(yè)生在經理的正確管理下可以很好的開展工作,盡管他可能不懂算法和數(shù)據(jù)結構,C和C++基本不會,這并不妨礙他為公司創(chuàng)造價值,隨著他開發(fā)經驗的增長,在時間允許的情況下再去補充一些基礎知識也是完全可以的。
幾年以前有個學生”,打引號是因為我并沒有真正教過他,中專畢業(yè),專業(yè)是鉗工,曾經給我展示過胳膊上的長長的疤痕,說是被車床傷到的。
他要求跟我學的時候屬于入門階段,最開始學習的并不是什么三大浪漫,而是C#. 在掌握了一門編程語言后,很快自學了其他語言(甚至Delphi), 在一年后找到了一個小公司做些基本的開發(fā)工作,然后涉足安全領域,開發(fā)了各種工具,現(xiàn)在在一家安全公司上班,提升很快,收入不菲。前不久跟我聊他配合網監(jiān)做一些取證和提審的工作經歷。
2006年,我在武漢某個夜市的大排檔上,凌晨2點多,看到一個服務員在忙里偷閑看一本計算機書籍(掃一眼就知道),仔細一看是一本Java入門書,聊起來才知道這妹子是護校畢業(yè),但是對計算機有興趣,就想在大排檔當服務員攢學費去***鳥。她還拿出一沓油跡斑斑的信簽紙,上面全是她寫的程序,她說每次去網吧都要裝開發(fā)環(huán)境,太麻煩了,所以干脆在紙上寫。哥看不下去了,給一開軟件公司的朋友打電話強烈推薦這妹子去實習,朋友一聽情況表示拒絕,我說你只要給他管工作餐就好,不用發(fā)工資。1個月后這妹子進入試用期,2個月后轉正,后來在朋友公司做了近兩年,據(jù)朋友說開發(fā)能力很強,再后來,我就不知道了。
作為教師,感動我的總是這這樣的學生”,而不是那些坐在教室里花著父母的錢虛度光陰的學生。
可能有人會覺得這樣的程序員是野路子”,不登大雅之堂,但這一點都不妨礙他們兢兢業(yè)業(yè)的工作,為公司創(chuàng)造價值并且改變了自己的生活。
如果這些人要系統(tǒng)而全面的學習計算機專業(yè)的基礎課程,得需要多少時間和金錢成本?他們所處的環(huán)境是否允許他們這樣做? 他們不這樣做,是不是就成不了真正的程序員”?
在我的意識里——能夠根據(jù)客戶的需求(或者上級的要求),選擇恰當?shù)募夹g方案(或者按照上級的指示)開展開發(fā)工作,在合理的時間內完成開發(fā)任務并達到質量要求的人,就是真正的程序員。
要成為這樣的程序員,其實沒那么難。
在這個答案里,我想把程序員分為兩個層次:
L1-能根據(jù)上級的指示,按照公司的要求和規(guī)范開展開發(fā)工作的,稱為程序員。
L2-能根據(jù)客戶的需求,選擇恰當?shù)募夹g方案,制定合理的工作計劃,獨自或帶領團隊完成開發(fā)工作并達到質量要求,稱為軟件工程師。
我想題主可能想成為的是后者,而不是普通的編碼人員,在我接觸到的程序員中,其實很少有單純從事簡單編碼工作的,他們大多數(shù)都是干的軟件工程師的活。
軟件工程師應該具備哪些能力呢?我們以前歸納過:
1. 分析問題的能力
2. 設計解決方案的能力
3. 編碼實施的能力
4. 排除故障的能力
這四種能力如果要展開來講,要寫好長的,暫時就不寫了。
開始回答——”如何成為的問題。
科學家追求的是知識,工程師追求的是能力。而能力是很難從書本上的來的,只能從實踐當中來。
我注意到題主的問題中,提到看書靜不下心,看視頻又覺得太慢,可能從一個具體的項目開始更能激發(fā)學習興趣并且獲得成就感。
先給第一種路徑建議吧——從C語言開始。
之所以建議C語言,是因為C語言里沒有那么多現(xiàn)成的、強大的類庫,在不熟悉基本的語法、面向對象這些概念時C#其實比C語言難以理解,很難深入。學習C語言不僅限于對C語言語法的掌握,而是通過C語言的學習,建立程序設計的思維,比較深入地了解一些計算機系統(tǒng)的工作原理。
在我的教學班級中,我的教學內容是這樣組織的,題主似乎也可以按照這種方式來學習:
第一階段高級程序語言的基本概念(編譯、庫、鏈接等),開發(fā)工具的使用(Visual Studio 2010), C語言的基本結構以及在VC中的一些差異,動手能力上達到能按照書本輸入一個程序,能編譯,能運行的結果即可。
第二階段變量、指針、表達式、函數(shù)、分支、循環(huán)、簡單的輸入與輸出。
第一階段和第二階段的時間往往很短。
第三階段開始做第一個小程序(比如最簡單的超市收銀系統(tǒng)),這個時候學生開始頭大,因為很多要用到的東西根本就沒給他們講過,即使網上查得到資料也未必都能用在項目里。學生被我?guī)нM一個接一個的坑里,我從不在第一時間告訴他們答案,總要他們冥思苦想抓耳撓腮一個星期了,下周上課的時候才開始講解決的思路和方法。
經過1個月左右的折磨,他們基本可以完成一個單機版的的超市收銀系統(tǒng),完成比如輸入(從鍵盤,掃描槍就免了)信息、修改輸入、價格查詢、匯總結賬這樣的功能。從知識層面上,結構體、指針、文件訪問這些基本都解決了,順帶著把簡單的查找、排序算法也學了。
可以說這是學生最痛苦的階段,但是正是這個階段開始培養(yǎng)他們的自學能力,這個太重要了。但是效果也很明顯,到后期的時候,少數(shù)學生開始先于我提出解決方案了。
然后接著折騰,先帶學生回顧做過的這個程序,看如何能做的更好,運行的更快,Review和重構。
由于是純C完成的,程序總是看上去很混亂,修改、擴充也不是很方便,于是我們開始探索另一種編程思想——面向對象,C++上場,又是1-2個月,用C++重新寫這個程序,在這個過程中,要求他們自己實現(xiàn)String類,封裝數(shù)據(jù)結構和業(yè)務邏輯、數(shù)據(jù)訪問......
到這里,一個學期結束了,第二學期要求學生把這個控制臺的黑窗口改成圖形用戶界面。MFC不準用,只準用一個叫做Easy-x的圖形庫,而且只準用其中的putpixel函數(shù)來繪制點,一輪新的折磨開始,從畫點、劃線、逐點寫漢字開始,繪制按鈕、繪制文本框、響應鼠標和鍵盤,并且要求他們開始設計和實現(xiàn)TextBox, Button,Image這些類.....,,順便把消息循環(huán)之類的機制也做了初步的了解和簡單的實現(xiàn)。
到這時候,有的同學已經開始做出”高仿Windows"了,要不要太驚喜!
到這里,我基本可以相信我的學生不會為C#和Java發(fā)憷了,更重要的是——他們具備了真正的程序員所必須具備的核心能力——自學能力、獨立解決問題的能力。
整理自知乎(Tony He)
大家如果對編程感興趣,想了解更多的編程知識,解決編程問題,咨詢編程學習,可以關注我們的微信公眾號:程序員互動聯(lián)盟(coder_online),這里有java高手、C++/C高手、windows/Linux高手等你來。