什么才是程序員的核心競爭力?

jopen 9年前發布 | 14K 次閱讀 程序員

0、問題

如題所說,我現在是個剛畢業的小本,野雞學校,而且不是正統的計算機專業,現在踏入了程序員這一行,到底什么樣的技能才是才是程序員的核心競爭力,換言之,我在工作的前幾年,需要累積什么樣的技能,之后才能更好的和老板要工資,提要求。

上面是知乎上一位同學的問題,曹政老師以及其他幾位同學分別從專業技能、思維方式、方法、態度等角度進行了深度剖析,值得我們學習和思考。

PS:第一個答案是曹政老師的回答。

——————————————正文開始——————————————

我們都知道學習能力很重要,那么學習能力從何而來,除了去看書上課這種,如何在實踐工作中學習成長?

我之前微博說了一個籠統的概念:什么是能力? 對待問題的態度,以及處理問題的思路和方法。</span>

1、先說態度

1.1 懶散的態度

你服務器偶爾出501錯誤,也許比例不高(知乎也出現過很多次),很多程序員,沒錯,是很多,假裝看不見,不在乎,或者歸咎于人品問題。 這就是態度問題。

再往后,負載高了或者其他 什么原因,突然頻繁出現501錯誤,不去追尋深入的原因,而是找各種借口, 什么IDC服務商不好,服務器品牌不好,操作系統不好,數據庫不好,CDN不好,網絡狀況不好,web server不好,甚至,直接對Boss說我們被DDOS啦!(遇到過,幫他Boss找過多個安全專家會診,最后發現根本不是DDOS,是程序員太爛。)

這就是態度,觸目驚心,如果能對問題有敏感性,能知道對任何小的,輕微的問題有足夠的敏銳度,你就有了一個快速成長的基礎。對問題的敏銳度是非常重要的。很多性能或程序邏輯上非致命的bug,在不夠敏銳的時候是發現不了的,但是一旦進入特殊場景就會驟然爆發,你多一點敏銳度,就會減少這種危機的風險。

1.2 解決問題的態度

第二個態度是解決問題的態度, 有人對自己的解決方案信心滿滿,認為萬無一失,但有的人就會多留一條后路;就好比你說我服務器要不要做安全加固,肯定要做對不對,要做到盡可能嚴謹和周 全,但是你數據庫保存密碼的時候是不是還要加密?而且要隨機salt,不就是防止萬一依然有漏洞被人拿庫怎么辦么。程序也一樣,以前寫的一些服務端守護進 程,有bug,會莫名其妙的終止,這個bug當然要定位,要修復,但是同時,寫一個cron檢查這個守護進程狀態,一旦遇到終止給予自動恢復,這就是第二 手準備,即便你多么不希望他執行,這個準備還是要做的。對問題 做兩手甚至三手準備,也是優秀程序員,架構師的關鍵素質。

1.3 基于溝通與理解的態度

第三個態度是基于溝通與理解的態度,產品或運營提了一個不靠譜需求,一句話打回去當然很爽很威風,但是有沒有仔細溝通分析過,這個需求基于怎樣的實際訴求,這個實際訴求有沒有更合理的實現途徑,一句話“這個沒法做,這個實現成本太高”,不是正確的溝通態度,而且,最優秀的產品,往往是實現了那些原本人們認為無法實現的訴求。</span>
這樣的態度,才有了一個持續進步的基礎,下面說思路和方法。

2、思路和方法

優秀 的程序員和平庸的程序員,如果只看敲打代碼的速度,我覺得是分不出來的,也許每人都可以一天寫很多行代碼,但是遇到問題后,平庸的程序員的解決效率,和優秀程序員相比就會有天壤之別。 所謂解決效率,不外乎對bug的分析、定位,以及 思考。</span>

2.1 最基本的一條,看執行日志

看各種日志,web server的日志,數據庫 的日志,慢查詢日志,binlog日志,php的錯誤日志,等等等等,線上出問題瞎猜連日志都不看的大有人在。看日志不仔細不完整的也大有人在,你能去認真研究日志已經超越很多人了。

2.2 模塊測試和斷點分析

程序員一個壞習慣就是上來就寫很大一坨代碼然后再執行,不知道一個模塊一個模塊來寫來測試,執行出了問題不知道設置斷點,縮小范圍逐步分析。斷點分析非常簡單,將整個代碼中插幾個中間輸出,觀察哪個環節出了問題,或者觀察每個環節的系統開銷,對調錯和性能優化都非常重要,高手們大概認為這是ABC的東西,但是就這玩意我看到的大部分程序員都沒有這個習慣。

2.3 錯誤信息的理解和搜索

搜索引擎上有各種豐富的技術資料和技術問答,你所遇到的錯誤信息和錯誤提示,通常都能在網上搜索到,當然,搜索到后要結合你的場景認真思考,并理解透徹,而不是照貓畫虎的去處理,否則可能這次運氣好就蒙對了,下次運氣不好又不知道怎么回事了。

PS:友情提示:人生苦短,別用百度!

2.4 不斷總結歸納

對一個問題,一類問題,以及不同類型的問題,善于歸納整理,不斷反思自己的問題,即便是不出bug的代碼,你經過一段時間去回頭看,也有很多思考不正確不合理的地方,有很多優化點,如果你覺得自己的代碼一向牛逼,毫無破綻,那你一定是原地踏步,毫無進展。

2.5 案例

關于歸納總結,我說個案例:
以前我們有個系統,請求量非常大,負載非常高,有個不錯的技術經理來處理,他列了幾個升級計劃,都很靠譜,去執行了,效果非常好,然后我們跟進匯報的時候他來講,做了幾項升級,整體效果如何,然后我就批評了他。
我批評了什么呢?他是一起 做的升級,然后一起觀測的效果,那么這幾個方案里,具體每個方案的實際效果怎樣,對提升的幫助多大,他沒有任何數據。所以對具體每個升級方案的價值和重要 性,他沒有任何概念。你正確的解決了問題,卻沒有認真的去歸納整理,你的收獲是有限的。一起做升級不能說是錯的,但是效果評估需要單獨去做,而這個數據是 非常有價值的,知識積累,不是你處理過的就一定有積累,而是整理過的。</span>
大概就這些, 最后重述一遍:
什么是能力?
遇到問題的態度
處理問題的思路和方法
這就是能力
點贊的那么多,答謝各位,補充幾條思路吧,是上面幾個方法的具體擴充

3、曹政老師的補充

補充1:善于提問,你能得到怎樣的答案,取決于你提出怎樣的問題。

你遇到問題,你應該知道,從哪里去問,去問什么。
我常見的一個測試題是這樣的。
數據庫目前掛了,我就是服 務器,我不知道為什么掛了,你是一個優秀的分析師,現在我來做響應,你問我問題,你問一個問題,我回答一個指標,然后看你能不能定位問題。(當然,我會根 據所假設的問題回答所有數據指標),比如你問我數據庫連接數多少,問我系統i/o壓力多少,或者問我慢查詢日志里有什么,等等,善于提問的人就可以快速得 到答案,而不善于提問的人,就會猜測一堆可能,最終卻一無所獲。
有個真實好玩的案例,有個 兄弟公司(前段時間新聞出來,賣了好像十個億的樣子),開始的時候服務端數據庫不夠強壯,負載起來的時候會出現一些問題,就請我去把脈,我一看 windows服務器,SQL server (不要猜了,那是幾年前,現在應該改了),我說這個我不會啊,然后人家那么熱忱當我是專家,只好硬著頭皮上,我連基本操作都不會怎么辦,我就坐在那里問問 題,開始他們說是不是這樣,是不是那樣,我說你們不要盲目下結論,你們要是知道結論就別來問我了,我問什么指標,什么日志你們就給我查什么,我就一樣樣的 問,他們現場操作去查數據,我問一個他們查一個給我看,查著查著,他們的工程師說,知道原因了!果然和他們開始的假設完全不同。其實關鍵就是問問題的思 路,他們一開始沒有提出正確的問題。提出了正確的問題,他們很快自己就找到了原因。

補充2:善于劃定范圍,縮小問題區間。

前面提到的斷點分析是一個非常常見的分析方法,但是很多場景,你甚至不知道是哪個程序出的問題,善于將問題范圍化,也是一種歸納和分類的能力。
我曾在某個技術群出過一個 經典測試,還記得以前微博上提到的一個經典面試題么。“從瀏覽器輸入url到打開網頁,中間經歷了什么”,這是一個經典的綜合認知的題目,基于這個題目, 出一個更實戰的場景測試是(這個場景其實90%的網站站長和游戲運營商都遇到過),”目前有用戶反映網站或游戲卡,請問如何分析原因,以及當前優先級步 驟。“。結果在這個群里,只有我徒弟說出了完全正確的答案(09年帶過的)。優先級第一步是看在線用戶數和當前訪問數,對比歷史,得到該問題目前的影響程度,來決定后續的優先級,以及減少分析范圍。(這是意識問題)分析思路,分成三大塊,前端,網絡層,服務端。當然這三塊可以繼續延伸下去非常多細節,但是至少,能先把問題分成三大塊,然后基于一些顯見的分析方式快速排除其中幾個部分,再逐步細化問題,而大部分人只是從一個局部去思考,講了很多局部細節卻沒有完整的綱領,所以這就是差距。</span>

先想到這些,咳咳。

4、附:其他同學的回答

4.1 姚冬的回答

  • 學習能力,尤其是自學能力,你啥時看到那些有名的程序高手在論壇上問“學習XX該看什么書,如何快速學習XXX,學習XXX有什么代碼推薦”之類的問題,他們想學什么很快就能自己找到相關資料。這個行業發展太快,技術淘汰的速度也很快,3年不學新東西就可能落伍了。
  • 動手能力,都是看書看資料,當別人還在糾結看什么書,還在糾結書里的字句是什么意思的時候,有些人的幾百上千行代碼都已經能運行了。
  • </ul>
    • 耐心和毅力,做程序員興趣固然重要,寫自己喜歡的代碼那是相當愉快的事情,但是程序開發中無論如何還有大量乏味無趣的事情,要能堅持,咬牙把這些做完。
    • 表達能力,能在大庭廣眾下,把自己的想法邏輯清晰流暢地講出來,讓人聽懂。
    • </ul> 那么技術呢?技術不重要,有了以上幾種能力,市場上需要什么技術,很快就能掌握了。
      最后再說說工資的事,記住兩句話:
      • 工資不是老板對你過去貢獻的回報而是對你未來貢獻的預期。
      • 現任老板不可能給出讓你滿意的工資,下一任老板才會。
      • </ul>

        4.2 學歷代表過去,能力代表現在,學習能力代表未來。

        以上是justjavac的回答。

         本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
         轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
         本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!