倍可親

回復: 0
列印 上一主題 下一主題

程序員水平的高低如何辨別?【能力指南】

[複製鏈接]
跳轉到指定樓層
樓主
硨磲大爺 發表於 2016-10-26 02:48 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  轉載知乎 程序人生

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

  工作3-5年,大家都做過點什麼?但是有的程序員只是技術遷移、完全沒解決問題的能力啊?大家盤點下,在你眼中,高工作年限的程序員,技術水平差是什麼樣子?

  問題一來讓大家了解下,技術差是給別人是怎樣的一種體驗,二來是告訴大家如果自己有這些方面的問題,趕快成長,努力修補。

  

  回答者:姚冬,程序員

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

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

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

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

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

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

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

  回答者:Emily L,Buy Side Equity Research / HFT

  判斷別人水平的最好方法是提高自己的水平。一個程序員可以容易的判斷比自己水平低的程序員的能力。當你看到一個程序員犯過多少自己當年犯的錯誤的時候你就很清楚了,不然他很可能比你強,不過你很難判斷他比你強多少。

  回答者:吳水永,http://www.huamanshu.com

  我定義自己的核心競爭力第一條就是debug能力。

  debug能力是在豐富經驗的基礎上,以敏感的判斷迅速確定問題出現的環節,而這個過程如果是在眾人圍觀定位線上bug的情況下,心裡滿足感瞬間爆表,這就是我們常說的「消防員」。

  所以debug要求豐富的經驗、廣泛的知識面、紮實coding能力(包括熟記各種命令參數)、敏感的判斷。就PHP在我看來,debug能力可以分以下幾個層級。

  A :刷新頁面,出錯,百度,修改,刷新...

  B:tail -f php_error.log,刷新頁面,修改,刷新...

  C:開發環境列印:var_dump,線上寫到文件:file_put_contents + tail

  當然也有些同學會覺得var_dump這名字寫得太長不方便,重新定義一個d => var_dump,dd => var_dump + die,贊一個,畢竟排錯越快越好,尤其是線上問題。到了這裡,基本都會做,以下沒有太強的等級性,有些是平行的,如網路和進程。

  D:還有一些稍微需要配置的debug工具,如xdebug,xhporf,wincachegrind,php/mysql慢日誌分析,這些的話,基本需要優化的點了

  E:需要對這個PHP腳本進程做更細粒度的debug,ps查找僵死進程,strace -p php進程id來查看一個僵死進程現在是在做什麼,因為什麼原因。

  F:如果是web端,從請求到nginx到php-fpm到php文件到log文件,確定問題在哪一環節。可能你需要tcpdump這個粒度到三次握手的數據包工具來debug有部分請求出現499,是系統、nginx、php-fpm參數設置不當?還是php進程被長時間腳本佔用,沒有及時消耗nginx的隊列。或者最近遇到的一個很神奇的問題:php輸出一個標準json_encode(array),web端得到的居然是一個array亂序的json。

  G:如果是有開發php擴展需要的同學,必不可少的就是gdb和.gdbinit zbacktrace,當時在開發ip2city擴展的時候,出現core dump,也只有靠它了。

  H:待補充

  好吧,這些在面試的時候得找到很合適的例子,才能讓展開思路。

  但有另外一個可以直接看出一個工程師的能力,那就是github,代碼規範一覽無遺,邏輯層次,模塊設計能力,註釋說明,異常處理等等,那就已經把這個工程師釘死在哪一個水平了。

  歡迎對我meolu (huamanshu) · GitHub提評論、標star什麼的:)

  回答者:think123,不能只埋頭碼磚,還得抬頭看看天

  前面幾位都很有道理。

  依我看來:

  評論一個程序員技術的高低,不是看他會多少技術,又懂多少技術。參加過什麼大型的項目,也不是看他有沒有自己的博客,github有多少star。

  而是看他解決問題,定位問題的能力。

  這個很重要,真的很重要。

  技術可以很快上手使用,但是解決問題定位問題的能力不是輕易就行的。特別是在高壓下解決問題的能力。

  舉個例子:

  小天:老大,這裡怎麼沒有執行成功呢?代碼我從其他地方拷過來的呢!

  老大:報異常了沒有?

  小天:報了,說的是文件導入失敗,可是我的文件寫入的方法沒有問題呀!

  老大:你看看人家怎麼寫的

  小天:人家沒寫這一塊,只有我這裡才需要對文件內容進行特殊處理

  老大:那麼問題就在這一塊兒了。(縮小問題範圍了)

  小天:我只是把文件內容寫好了就導入了資料庫了呀!

  老大:資料庫導入文件那個我看了是公共的sql,沒問題。

  小天:你看我文件寫入這一塊的代碼嘛,沒啥問題呢,我看了文件內容都是正常的。

  老大:既然如此,那麼肯定是導入的時候存在問題,但是公共方法是可行的,肯定是你的文件格式有問題,你調整一下文件的編碼試一試。

  。。。。。。。。。。。。。。。。。。

  小天:老大,搞定了,果然是文件編碼的問題,不同的編碼讀取的位元組長度不一樣,資料庫總是以它認為的編碼去讀取,保持編碼一直就行了。

  老大:好的,我知道了。

  從始至終,老大沒有看過代碼。

  phpdragon,編得碼、修得腦、翻得牆、上得床。

  下文有不滿和戾氣,可能還有以偏概全,願意指點一二的,麻煩評論個,先謝謝!

  ====邪惡的分割線===

  以下 都是很好的回答:

  怎麼成為一個優秀的程序員,而不是一個優秀的碼農? - 知乎用戶的回答@蕭井陌

  如何辨別一個程序員水平的高低? - 姚冬的回答如何辨別一個程序員水平的高低? - 知乎用戶的回答如何辨別一個程序員水平的高低? - 知乎用戶的回答如何辨別一個程序員水平的高低? - Vkki 的回答如何辨別一個程序員水平的高低? - 吳水永的回答如何辨別一個程序員水平的高低? - 紀路的回答如何辨別一個程序員水平的高低? - think123 的回答如何辨別一個程序員水平的高低? - 汪淘的回答如何辨別一個程序員水平的高低? - 白喬的回答

  一句話,是騾子是馬,拉出來溜溜就知道了!====以下的嫌棄太長的就不看吧===

  個人經驗的補充:

  1.代碼的命名真的很重要,很重要,很重要,很重要。

  這樣的代碼我就不貼了,每次看到我都有忍不住重構的衝動。

  代碼是寫給人看的好嘛!代碼是寫給人看的好嘛!代碼是寫給人看的好嘛!

  headImg 是什麼鬼? 我能以為是banner么,頭部的圖片 ,請原諒我蹩腳的中式英語!

  avatar 這個呢、portrait 這個呢? 會不會更好些? 英語不好就不能用好有道、google翻譯么?

  還有用中文拼音命名的,親,我們用的是英文做為腳本好么?

  你要用這樣的,用易語言可好?!

  為什麼要用框架? 一個很重要的原因是命名規範,目錄規範,結構規範,分層規範,

  有利於團隊協作,不要本末倒置!

  2.架構和規劃能力很重要,模塊分層,解耦設計什麼的,文件目錄嵌幾層?

  這其中又跟命名的能力能搭上點關係。命名都命不好,目錄結構怎麼建?

  url不要做的漂亮些嗎?不考慮seo了?

  你喜歡 addGoods 還是喜歡 goodsAdd ? 請你尊重點我的那些初高中英語語法好么?

  3.協助能力、可持續能力。

  API考慮過兼容性沒,為後續的維護考慮過沒,考慮過這段代碼可能承載幾十萬併發沒?

  那些什麼動不動就上了問 auth2 你了解過嗎? mongo你用過沒? redis呢?memcache呢?

  一個工具罷了,問的問題有多lower啊?!

  就不會問,什麼情況下 memcahed命中率就不行了? 怎麼提高命中率? 使用場景適合哪些?

  那如果我說,不好意思,mongao我沒接觸過? 你一杆子打死我么?

  還有,不要說什麼,額,工期趕,沒時間做優化,呵呵達, @Vkki 、 @夏岩 他們怎麼能寫出來?

  代碼能寫的清晰些么? if嵌套可不可以不盡量使用?用array 代替 switch 可好?代碼越精簡不好嘛?多動了下腦子,少寫了幾行不好嗎?

  head做變數初始、參數檢查、環境檢查

  body做業務邏輯,

  if里做返回,外面寫邏輯可是能省幾層嵌套的,這你可知道?

  foot構造返回結果。

  這個樣的三段式如何?

  class xxxxx(){

  const $XXX = 1;

  function xxx($args){

  if(empty($args)){

  return false;

  }

  $sql = 'SELECT user_id FROM {{user}} WHERE isdel = :isdel';

  $user_ids = $this->db->createCommand($sql)->bindValue(':isdel', CUser::ISDEL)->queryAll();

  if(empty($user_ids )){

  return false;

  }

  if(!$this->activateUsers($user_ids)){

  return false;

  }

  $this->xxxxx($user_ids);

  $this->xxxxx($user_ids);

  $this->xxxxx($user_ids);

  $this->xxxxx($user_ids);

  $result['user_list'] = $this->xxxxx($user_ids);

  $result['xxxxx'] = $this->xxxxx($user_ids);

  return $result;

  }

  }

  上面的是否比你們的if(xxx){}else{if(xxx){}else{}} 閱讀性強很多?

  比如設計個支付功能,你是如何想的?支付網關這麼多家,API腫么弄?要不要繼承抽象再具體實現,對外暴露統一介面,內部再細分實現?見過直接拿鵝廠的api直接引用的,自己都懶得再封裝一次,就沒考慮過還會用支付寶,財富通,匯付通、xxx通了,接入一個用一套嗎,不統一管理?

  實現後台可配置可切換,脫離程序汪,後人只要繼承抽象類,實現api就好,不優雅嗎?

  簡訊網關腫么做? 可不可以實現和處理支付的方法一樣,實現插件式、可切換、低耦合?

  你們不是學了各種設計模式嗎? 以上就可以秀什麼工廠模式、單例模式、監聽模式等等等。

  你們幾個這麼想過的?從系統層面、運維層面考慮過沒?

  有為後面可能為你擦屁股的同事考慮過嗎?

  那麼請問,如果要你寫個資金託管功能,你怎麼寫呢?資料庫的欄位屬性設定可以在模型里做常量定義么?

  你喜歡在業務變化后,欄位屬性變更后,改SQL代碼的時候四處查找替換么?

  你就是喜歡配置寫在代碼里,就是喜歡沒有考慮過使用配置文件要麼資料庫。

  你就是喜歡客服沒事告訴你這裡有問題,然後你去改個代碼再上傳的鬧騰下,

  顯示在救火,刷我還存在,刷我很厲害的樣子。

  其實你不知道,最好的程序代碼是脫離其產生者的。

  為自己程序處處救火的程序汪並不是一條好汪。

  我記得一句話就是:別想著你的代碼以後還有機會重構!

  每次說,額,這裡我後面會改的,會改的,但是可惜,現實情況是根本不會給你這個時間的。

  代碼寫出來,一是要爽了自己,二是也要爽了別人。

  4.debug的能力、總結能力、學習能力

  真的很重要,代碼寫出來真的花的時間不長,但擦屁股的時間比寫代碼的時間多多了!

  出了問題不記錄,寫個博文都好啊,我可沒那麼強大的記憶力,所以最討厭考記憶力。

  5.不要一貫的使用各種演演算法,秀演演算法的你們夠了,要寫去寫底層,應用的場景比較多。

  應用層面的程序,演演算法的應用不是特別多,大部分都是業務代碼。

  以這個作為評價標準的,真心然並軟。

  你們要面試,麻煩你們出題的時候好好結合實際好么?

  哪怕出一個你 當前手上的任務為題目也好啊!

  6.有github是加分項,有博客是加分項!?

  我還真沒見過幾個面試官面試的時候跟我說,我看過你github、你博客中的某篇文章不錯什麼的。

  沒有,真沒有,面試官那種浮躁的要死,面試官也時脫產來面試的,根本沒有時間看嘛。

  但搞的好像沒有github、博客就沒有競爭優勢似的,大家都註冊成風了,尤其是新人!

  我寫博客只是記錄和分享我的經驗的,不是來給你們加分的。

  7.論大公司的面試(有點口水,不看唄)

  有幸被騰訊面試了,是的,鵝廠,可惜是委託面試。被 各種虐,是的,真的覺得 自己的 不足。

  開口各種關鍵詞,而且是英文縮寫,各種沒聽過,真的,我真沒有聽過,,,

  恕我一直在二線城市,我沒有靠譜的大平台能參與,也沒有高併發,很少用的大數據統計分析。

  但,我只是面試 個外包企業啊,有必要扯那麼多犢子嗎?

  建站公司,外包公司什麼尿性,也是做人才儲備嗎?

  我承認問這些的必要性,因為鵝廠招人,是去做人才儲備的,基礎不牢靠肯定不要的。

  同事的哥哥是鵝廠的,也聽過一些面試的小消息,

  對於社招的,不內推,要進去真的很難!

  HR都是設置自動篩選機制好么,沒有達標的直接不看好么!英雄不看出處真的不是處處都有的!投遞簡歷的方式,學歷是硬傷!

  不見得我的潛力就沒有本科的好,但這也是招聘的無奈,因為不通過實際的工作,根本看不出一個人的能力長短,但招聘的時間比較短,只能通過一些明面的東西來篩選了。

  公司的大半同事都是推薦的,包括我,也是被人推薦給boss的(不知道是誰推薦的),然後CTO主動電話面試。

  如何面試 iOS 工程師? - 知乎用戶的回答

  裡面的各種奇葩問題,對,就是要用奇葩!

  因為有人曾經問我,無限極分類怎麼寫,呵呵,我只回一句:循環調用!

  8.識人才難,成人才更難!

  HR很多都是良莠不齊,而且還有噁心的!

您需要登錄后才可以回帖 登錄 | 註冊

本版積分規則

關於本站 | 隱私權政策 | 免責條款 | 版權聲明 | 聯絡我們

Copyright © 2001-2013 海外華人中文門戶:倍可親 (http://big5.backchina.com) All Rights Reserved.

程序系統基於 Discuz! X3.1 商業版 優化 Discuz! © 2001-2013 Comsenz Inc.

本站時間採用京港台時間 GMT+8, 2025-8-9 16:38

快速回復 返回頂部 返回列表