如何辨別一個程序員水平的高低?

太多的不該


自認為不是一個好的面試官,因為我認為在這麼短的時間內,準確地衡量出來程序員水平的高低是有比較大的難度的,並且我有多次看走眼的時候,面試的時候覺得能力還不錯,但是入職工作了一段時間之後,編程能力不忍直視。

工作之後接觸一段時間,我會從這麼幾個方面觀察他們,以判斷技術能力的高低和發展潛力。


能不能出活兒、能不能debug

能不能把開發任務按時按質量地完成,當然是最主要的衡量標準了:

  • 需求理解快而準確,流程設計考慮全面,可以按時間要求開發完成,Bug少...這當然是項目經理最喜歡的程序員了;

  • 能力一般,但是工作態度端正,不懂就問,也可以按照時間要求完成工作,這也是合格的程序員;並且經過一段時間的培養和成長,可能變成優秀的程序員;

  • 工作能力一般,每次迭代都領最簡單的任務,開發出來的代碼問題多多,沒有責任心,發生問題就喜歡甩鍋...這種程序員,很快會被淘汰。

解決問題的方法

在開發過程中,難免會遇到沒有見過的問題,有些程序員遇到問題無從下手,而優秀的程序員,自有一套解決問題的方法。

  • 擅長使用搜索引擎、Stack Overflow等網站,有一定的英文閱讀能力,遇到問題之後,先嚐試按照暴露出來的問題搜索,尋找解決問題的方法;這裡不太建議使用中文搜索引擎,很多時候,按照英文搜索,更容易找到解決方法;

  • 問領導、問前輩、問同事,有些問題自己解決起來很困難,但是其他人有可能遇到過相同或類似的問題,他們給一些提示和方向,就可以幫助你很快地解決問題;但是要注意,這些問題一定是要你自己思考過,嘗試解決過,而不是一有問題,就去尋求別人的幫助。

分析問題、流程設計的思路

有人會認為,程序員的主要工作就是敲代碼,上班大部分時候都是在敲代碼,其實並不是這樣:

  • 程序員很多時間都在做需求分析,能不能快速和全面地理解需求,也是考核程序員水平的一個標準;

  • 在敲代碼之前,要做很多設計工作,一些複雜的功能,需要把流程圖畫出來,甚至把偽代碼寫出來;一些水平比較低的程序員,甚至這一步做的都有困難,流程都想不明白,寫出來的代碼更不可能對了。

總結問題和改進問題的能力

好的程序員,相同的問題不會犯第二次,差的程序員,總會在一個問題上栽跟頭:

  • 優秀的程序員,也是一步一步成長起來的,各方面都差不多的兩個新手程序員,為什麼若干年後的水平相差很大,就是因為優秀的程序員,在工作中會遇到各種問題,他們在找到解決問題的方法之後,會總結經驗,當未來遇到相同或類似問題的時候,可以很快解決;

  • 建議大家養成寫技術筆記的習慣,技術博客不僅是分享給別人看的,更是一個總結的過程,寫給自己看的。

我將持續分享Java開發、架構設計、程序員職業發展等方面的見解,希望能得到你的關注。


會點代碼的大叔


我以前的公司,最垃圾的程序員才拿一千多。卻比現在拿一萬多的牛逼。表現,bug少,做的快。甚至面試手寫b+樹。回答虛擬機。現在一萬的。答不上就跑了。讓他二千塊做他不幹。以前的答不上二千塊晚上一兩點下班,單休,都幹。


用戶93912154010


我9年的程序員也當過技術面試官,所以對這個問題還是有很深的體會。根據實際的自己參加面試的經驗以及面試別人的經驗,我摸索出了一套魔鬼面試的流程。

要考察一個程序員水平的高低,根本就不需要問很多問題,也不需要做筆試題,只要讓他完完整整的解決一個實際的問題,就能夠考察出這個人水平的高低了。

最簡單的一個辦法,就拿平時工作中遇到的複雜的問題,告訴他現象,然後讓他分析有哪幾種可能性。

最好選擇那種複合型的性能問題,比如說這個現象有多種原因造成的,而且其中涉及到操作系統,數據庫,網絡,算法等多方面的問題。

讓他說出每一種可能性都用什麼方法來排查,看哪些觀測指標,怎樣判斷是不是這一種原因。

接下來給他提供實際的環境,讓他按照他的說法去做排查,看他會不會觀測那些指標,所說的工具會不會用?

解決的辦法是不是能夠真的實際上手去操作,把問題給解決掉,如果一個方法不起效,能不能及時切換到另外一個方法。

過程中這個人的知識面,邏輯思考的能力,溝通能力,表達能力,實際動手的能力,面對問題的耐力,都能夠考察的一清二楚。

不要覺得這個很花時間,大多數人在實際動手這個環節之前就已經掛掉了。

過了這項面試的人,在實際的工作中,大部分都是技術骨幹,可以獨當一面的。


木魚說職場


程序員的水平高低,不是靠語言或外在表現就能看出來的,不是看他會多少技術、參加過多少項目、寫了多少博客,而是看他在實際業務場景中解決問題的能力,尤其是面對一些特別複雜的問題,或在高強度、高壓工作狀態下解決問題的能力與態度。


技術可以通過學習掌握,但是解決問題、定位問題的能力卻不是一蹴而就。大家可能會說,“解決問題的能力”這個太寬泛了吧,可以更具象化嗎,有具體的測量方法嗎?簡單整理了以下幾點供參考。


優秀的代碼能力

會寫出滿足需求的代碼,早就不是評判程序員水平的標準了。代碼編寫既要滿足業務需求,同時還要考慮後續的軟件維護,說得通俗些,既要自己爽,也要別人爽。一個優秀的程序員,會致力於寫出更簡單、更效率、可讀性強、擴展性強的程序代碼。


邏輯思維

程序員在日常工作中,需要理解各式各樣的業務需求,所以這就需要程序員具備一定的邏輯思維能力。可以說,邏輯思維是程序員的靈魂,因為每一行代碼都是程序員邏輯的體現。


debug能力

項目著急上線,發佈時出現問題?

業務高峰時段,系統宕機了?

業務催、運營催、用戶催、老闆催!

各種形態的bug,各種著急的心情,背後無數支眼睛盯得內心慌慌......

這些都是一位合格程序員所需要面對的日常。不同的程序員,在解決問題的方法、效率、質量等方面,都各有千秋。一個經驗豐富的程序員,能夠扛住各方壓力,在複雜條件下找到核心問題,通過抽絲剝繭的分析來找到產生問題的原因,並快速進行應對處理,事後及時覆盤總結,減少同類問題出現的概率。


學習能力

隨之互聯網的發展,越來越多的人湧入程序員這個賽道,競爭日益激烈,加之新技術層出不窮,更新迭代快,程序員所使用的語言、框架、模式都會發生天翻地覆的變化。如果不主動學習,你很快就會被落伍淘汰。



溝通能力

這種其實在面試過程中能體現出來,溝通主要是技術溝通,以及和客戶之間的溝通,所有技術都不是閉門造車就能搞定的,溝通能讓事情推進起來更加順暢,包括和產品經理之間的流暢的溝通也顯得非常重要。程序員的能力表面是可以直接展示出來,但很多內在需要是需要時間的磨合才能瞭解,人就才能見人心,而且很多優秀的程序員是培養出來的,能夠長時間在一起的隊友都是時間長了磨練出來的。


責任心

線上出bug了,第一時間響應、處理;

團隊項目進度緊張、人手緊缺,主動補位;

又或者,在項目推進過程中如果只是關心自己模塊內容,對於整個項目置之不理,只守著自己的一畝三分地。

隨著時間軸的拉長,你會發現,有此f技術能力不是最好的,甚至不如你的小夥伴,最後做到了技術主管或經理、甚至更高職位,這裡面除了技術實力,還有一個叫“責任心”的東西。


結束語

判斷一個程序員的水平高低,核心是其解決問題的能力,而解決問題的能力養成,需要紮實的底層基礎來支撐,要綜合其代碼質量、項目經驗、框架能力、邏輯思維等等多方面,不能單看某一方面。


而對於1-6歲的程序員來說,想要成為一個高級程序員,變得越來越優秀,唯有持之以恆去學習、積累、實踐、修煉。


簡單羅列,歡迎補充或修正,覺得不錯請點贊支持下,謝謝~


----end----



優知學院


給他安排debug的任務,最好是崩潰問題或性能問題,觀察他面對大量複雜的代碼,在信息不全的的情況下,看他怎樣一步步抽絲剝繭縮小範圍,最終定位根本原因,並且給出一個不錯的fix。

如果能獨立完成工作,那麼以後必然成為高手。

如果經過少量提醒點撥也能完成,以後會是個不錯的程序員。

如果需要不斷提醒,只能按照我給的思路去反覆測試調查,那麼只能說是個踏實肯幹的人,但天賦不高,可以委派些普通任務。

如果以上皆非,我基本就放棄對他的治療了。

之所以選崩潰或性能問題,因為這種問題沒什麼玄學,行就行、不行就不行,結果好驗證。

這種問題很考察基本功,可能對操作系統,語言,編譯鏈接器,內存,進線程,網絡,存儲,圖形學都要有深刻理解,也很考驗邏輯推理能力,在一堆證據中構建合理的證據鏈推導出最終結果,懂得大膽假設小心求證的工作方法,也考察耐心和毅力,有的問題需要構建複雜的測試場景,還要反覆多次測試才能重現,考察溝通能力,複雜的bug可能涉及多個部門開發組,可能還要對最終用戶做訪談。

還有就是這我總結出了一些架構視頻資料和互聯網公司java程序員面試涉及到的絕大部分面試題和答案做成了文檔和架構視頻資料還有完整高清的java進階架構學習思維導圖免費分享給大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分佈式、高併發等架構技術資料),希望能幫助到您面試前的複習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習。


浩淼淼o


帶領團隊已多年,項目數十個,對判別程序員水平的高低,我有自己的看法,歡迎大家一起交流。



1.代碼質量。

優質的代碼,首先是經得起考驗。靜態分析工具過一遍,無錯誤,無警告。當然警告部分需要人工重審,因為靜態分析工具不一定完全正確。過了這一關,重要的還須過測試關,少Bug或無Bug的代碼,才是好代碼。優質的代碼帶有技術氣質和藝術氣質。閱讀起來,有一種賞心悅目的快感,即工整美觀,乾淨利落,又蘊含著理論常識,運用技巧,精準到位。



2.表達能力。

良好的表達能力,需要建立在以下幾方面:解決問題能力(復現,定位,分析,解決,驗證,總結),語言組織能力,邏輯思考能力,團隊協作能力。換句話來說,能用團隊成員能理解的語言和思路,完整清晰地描述問題及方案的來龍去脈,優劣取捨。一件事情,可以展開講半天,也可以濃縮成一分鐘,收放自如。不同的聽眾,理解力和關注點都不同,表達者應有準確的定位和闡述。



3.文檔能力。

文檔形式包括但不限於PPT,文字,圖表,音視頻。文檔內容包括但不限於API說明,工具手冊,項目事項,技術論述,陷阱總結,方案展示,指導手冊。文檔要求必須是滿足公司或部門的規範和格式,否則五花八門的,不利於交流和傳承。



以上3點,是我量化判斷程序員水平的標準,僅供參考。相比水平,其實我更看重程序員的態度,執行力,時間觀念,自學力等等,也是很重要的團隊作戰能力,也可以說是程序員水平的考量吧。

謝謝大家。


嵌入式宏思微想


計科專業從事軟件開發十幾年了,主要在瀏覽器內核領域研究的比較多,最近在研究服務器後臺方向,辨別程序員水平高低主要看做出了什麼產品,如同現在的程序員主要是項目經驗,簡歷上寫的一堆項目經驗都是面試的時候主要提及的問題。經常在面試中會問兩個關鍵點:一個是做過什麼項目;一個是在項目組中承擔什麼職務,畢竟參與過和做的多少程度是不一樣的,這些都是可以通過一些具體的細節檢測出來,問題越具體越是容易看出水準,具體的東西不是能夠編造出來的。

有很多技術公司直接不通過筆試,僅僅通過簡單的面試就確定工資水準了,最簡單的測試程序員水平的直接用筆試的方式,筆試可以把一些細節量化,儘量的細節化也是能測試出程序員基本功的,但這種基本用來測試初級程序員的,很多高級的程序員看到有筆試直接就抬腿走人了,因為有些程序員在一個方向做的時間太長了,很多基本功都忘得差不多了,所以筆試可能不過關,現實中很多程序員筆試不過關,面試還可以,也一樣可以做項目說的就是這類人,起碼這算是非常優秀的程序員。

有很多公司採用谷歌的方式,直接採用上機寫代碼的方式檢驗程序員水平,這種方式比較直接,但在現實中可能消耗的時間以及面試官的精力,目前只有極少數的公司用這種方式,國外的公司用這種方式比較多,這種看基本功非常有效。通過代碼可以看到編碼習慣以及算法的設計上,都能直接看的出來。

普通的程序員直接看項目的經驗,高級的直接看做過的產品,特別是產品主要設計人員,這就是程序員內心的自豪感,畢竟作為一個程序員起碼要有自己設計開發的產品,也算是不白做一個程序員,在程序員的職業經歷中如果能經歷過一個產品從開始設計的初稿到最後推向市場,如果是完整的經歷,將是一種巨大的財富,只要經歷過一次都會對產品設計有一個比較層次的認識,這種能力需要靠直接的面試語言表達來展示出來,談下對產品的認識以及產品穩定性性能等方面的總結,能到這個層面起碼是高級軟件工程師的級別。

當然有些程序員內在的東西不是靠語言或者寫代碼看出來的,因為一個優秀的程序員不僅僅是代碼能力以及框架能力,還有幾個非常重要的能力

  • 責任心,在項目推進過程中如果只是關心自己模塊內容,對於整個項目置之不理,基本上很難有多大的成績,眼界只是守著自己的一畝三分地,有些程序員開始其貌不揚,技術能力也不是最好的,但最後做到了主管或者經理甚至副總,這裡面一定包含著技術之外的東西,至少包含責任心。

  • 抗壓能力,現在絕大部分程序員都有抗壓能力不強的缺陷,有了一個看似變態的需求內心的第一反應就是排斥,作為一個技術人員首先要做到用技術服務產品,不要摻雜過多的消極因素在工作中,只要是能當技術管理抗壓能力一定是比普通的技術人員更加用於承擔。

  • 溝通能力,這種其實在面試過程中能體現出來,溝通主要是技術溝通,以及和客戶之間的溝通,所有技術都不是閉門造車就能搞定的,溝通能讓事情推進起來更加順暢,包括和產品經理之間的流暢的溝通也顯得非常重要。

程序員的能力表面是可以直接展示出來,但很多內在需要是需要時間的磨合才能瞭解,人就才能見人心,而且很多優秀的程序員是培養出來的,能夠長時間在一起的隊友都是時間長了磨練出來的。

希望能夠幫到你。


大學生編程指南


大家好,老陳為你解答自己的觀點。


技術厲害的人不僅代碼清晰,而且業務邏輯能力很強,而且但凡是略懂代碼的人只要看了代碼百分之八十以上就能知道這個人技術怎麼樣。當然這是要在看代碼的情況,那麼不看代碼怎麼辨別呢,那麼就只能通過口頭交流技術就能得知。


一、通過面試得知應聘者的技術水平

程序員找工作,就先就是第一輪就是人事給你面試,先照本宣科問一些問題,你只要回答的不是拖拖拉拉,而且表現的很自信的那種,那基本上第二輪就能通過。但是在第二輪,一般是技術領導面試你,那麼就會直接問你的技術相關的問題,面試官會根據你的簡歷或者他對應聘者的要求提出一些技術問題,通過這種方式立馬就能得知一個人技術水平怎麼樣,但也有特例,有些人應聘者是做了功課的,把面試題刷的滾瓜爛熟,但是做項目就不太行,所以就要通過下面這種方式辨別一個人的技術水平。

二、通過工作中的觀察得知一個人的技術水平

在工作中肯定會和身邊的同事合作開發,那麼只要合作一兩天就能發現一個的人技術水平,一是開發效率,二是代碼的質量,三是業務邏輯,四是理解能力,五是對技術的專研,六是考慮問題。一個人要是把需求完成的再好,毫無bug,但是他寫的代碼你根本沒辦法看,沒辦法讓人接受,這並不代表他寫的代碼技術就高,只能說他其他方面強。

我一開始做前端開發的時候,總是遇到問題就問他人,他們就立馬知道我的技術怎麼樣,我處理問題內心是很慌亂的,害怕自己考慮的不全面,害怕自己不能解決這個bug,每到這個時候我就會叫同時幫忙處理,那個時候根本不敢一個人開發一個項目。怕遇到問題不會解決,怕產品上線之後,存在很多很多問題。

責任心不強的人,做事態度不端正的人、邏輯思維能力不強的人,不喜歡總結的人,寫出來的代碼經常出問題的人,平時喜歡逃避責任或者喜歡甩鍋的人技術肯定不是很強的人。

優秀的程序員都是怎樣幹活的?

優秀的程序員的特點:知其然而知其所以然。他們即便做事的風格不一樣,思路不太一樣,但是他們都有一個很好的習慣就是做筆記、喜歡徹底把問題研究透,甚至會反覆的提出質疑,然後反覆的解決問題。

  1. 喜歡做筆記,把遇到的問題記下來。有的人放在博客上,有的人專門放在筆記編輯器裡,比如有道雲筆記。


  2. 找到各種解題思路並且分析哪個解題思路更優一點,而一般的程序員腦海裡只想著解決問題就行。

  3. 能夠快速定位到問題的所在,即便是不會處理,也能快速的通過搜索找到解決問題的辦法,先把問題解決掉,然後再去想是什麼原因導致自己沒有考慮到這方面,這種解決方法先做個筆記,然後想想為什麼要這樣解決。

  4. 他們都不會自己死磕在一個問題上,都會和身邊的分享,也許其他人就知道呢,因為三個行必有我師。

謝謝大家的支持,期待您的點評。

老實人侃職場


小鄭是從事前端開發的,曾經被面過也面過其他人,一路上也見到過,更多的是共事過各種各樣的程序員大牛。與大牛一起共事和討論,那是一件非常值得享受的事情,因為那樣可以使你開闊視野,達到知道自己不知道的境界,從而有方向, 在短時期內進入到一個新的境界......。啊,有點跑題了,不好意思,下面說正題。
我想從一個前端開發人員的角度,說一下,我是如何辨別開發程序員的水平高低的。

一、從專業基礎能力來看

除了專業基礎能力之外,我說兩個最容易被程序員忽略的兩個看似不起眼,卻是最需要重視的兩個基礎知識點。
1. 基礎算法,數據結構理論紮實程度
如果這項能力較弱,就會導致後面一編程思維難於理解。比如前端JS中涉及到的原型鏈,如果比較瞭解數據結構中鏈表結構,那麼這個東西也就不難理解。類似問題還有很多。
2. 計算機體系結構,操作系統理論,網絡理論的紮實程度
如果操作系統,網絡基礎沒了解過,那麼在你的職業道路上,越往後面,一些重要的東西理解起來就會比較吃力,比如前端從瀏覽器輸入URL到服務器返回數據這個過程,要更深入的理解TCP/IP,協議棧等就比較困難,學習到node開發,到I/O,進程,線程方面理解不好,就不能很好的使用node的api等。
前端這個業務,導致這些基礎能力較弱其實也是很容易想得到的原因。
可能是:計算機專業出身,在校沒學好。
可能是:非計算機專業出身,0基礎培訓,速成上崗,不紮實。
可能是:非計算機專業出身,自學,不體系化。
可能是:知道要學習,自律不行或者有意識無行動。
總之,大概就這些個原因,如果程序員想這職業道路上發展的更好,更高,補補這些基礎知識是會讓自己起的更輕鬆。
面試的時候,也會帶上一兩個相關問題,來探探程序員的功底。

二、從做過的項目來看

對於有經驗的開發,至少參與過完整項目從立項,開發,測試,部署等完整的項目流程。這個時候,只需要從下面兩個方面來問,來了解,基本就能斷定該程序員水平高低。
1. 看對整個項目所做出的個人貢獻。
比如:項目如何做技術選型的。這一點可以往深的問幾個為什麼。從回答中,就能知道其對技術掌握的真實情況。尤其是對於多人合作完成項目而言,不僅要看程序員對整個項目的把控能力(這裡包括技術和業務),而且要了解是如何協作的,自己的能力定位,對新技術和不斷變化的現狀是否願意學習和接受及探索。這樣一個程序員的全方位的能力基本就能知道了。
2. 看在整個項目開發過程中解決問題的能力。
這是一個關於處理問題是否有歸納方法論的習慣。
作為開發者,很多時候我們除了開發新需求,設計新的項目結構,還需要處理很多臨時的問題。不管什麼問題,相似度高的問題不要重複花時間,提高開發效率。
基於這一點,可以問在項目中碰到過的最大問題是什麼,自己是如何解決的。或者直接問是否有什麼方法論。
項目經驗是最好了解一個程序員水平高低的有力證據。從上面這兩方面去問,基本就能斷定一個程序員開發項目的水平高低。

三、從側面來了解高水平程序員的素質

一名高水平程序員還應該具備的幾個通用素質是:
1. 高效的溝通能力
工程師不僅要具備全面嚴謹的思維邏輯,良好的溝通能力也是幫助我們高效完成工作的一項必不可少的技能。
2. 高效的開發工具
工欲頭善其事必先利其器,使用高效的工具能節省大量的開發時間。
3. 必要的產品設計思維
有經驗的程序員在開發需求時除了實現需求,做的另一件事情是思考這個需求為什麼是這樣的呢。是不是合理呢?如果不合理該怎麼修改呢?

小鄭搞碼事


如何判斷一個程序員水平的高低,那麼可以通過非常簡單的方法來進行判斷,就是看一看這個程序員是否會說人話。

因為絕大多數水平初級或者是中級的程序員,他們在思考問題的時候都是非常邏輯性的去思考問題的,雖然說這樣的思考是沒有什麼問題的,但是在和普通人進行技術問題的溝通的時候,經常會牛唇不對馬嘴。



所以你要看一個程序員的水平的高低,只需要問他一個技術性的問題就可以了,讓他用非常通俗的語言把這個問題給解釋清楚,如果你能聽得明白的話,那麼你就可以來分辨這個程序員的水平的高低了。

舉一個例子,你可以問一個程序員,當你在瀏覽器的地址欄當中輸入了一個網址之後發生了什麼,導致瀏覽器當中把一個正確的網頁給渲染出來了。


再比如另外一個問題,你可以問一個程序員瀏覽器和服務端之間是怎麼確定每一個用戶的身份的?

當然你必須保證你身邊有一個人是瞭解這些技術問題的,當一個程序員可以把這些問題用非常淺顯的通俗的讓你聽得懂的話,把這個描述清楚的話,那麼就說明這個程序員的水平功底是非常深厚的。

就算不是說是專家級別的水平,那麼他也可以去解決你日常的工作當中遇到的絕大多數的問題。


因為你招聘一個工程師最重要的事情是他能夠完成你的工作,而不是說它有多麼強大的科研技術能力。

只有能把問題分析清楚的工程師,才有能力去解決問題。因為在編程領域,解決問題的能力並不是特別重要,最重要的問題是能不能夠分析問題並提出正確的問題,因為只有你提出了正確的問題,你才能夠找到解決問題的答案。

以上文字只是我的個人觀點,如果各位看官有不同的觀點,歡迎在評論區中討論留言。


分享到:


相關文章: