❶ 程序員積累什麼東西才是真正的實力
姚冬回答的非常好,我狗尾續貂的說幾句。
我們都知道學習能力很重要,那麼學習能力從何而來,除了去看書上課這種,如何在實踐工作中學習成長?
我之前微博說了一個籠統的概念,什麼是能力? 對待問題的態度,以及處理問題的思路和方法。
先說態度
你伺服器偶爾出501錯誤,也許比例不高(知乎也出現過很多次),很多程序員,沒錯,是很多,假裝看不見,不在乎,或者歸咎於人品問題。 這就是態度問題。
再往後,負載高了或者其他什麼原因,突然頻繁出現501錯誤,不去追尋深入的原因,而是找各種借口, 什麼IDC服務商不好,伺服器品牌不好,操作系統不好,資料庫不好,CDN不好,網路狀況不好,web server不好,甚至,直接對Boss說我們被DDOS啦!(遇到過,幫他Boss找過多個安全專家會診,最後發現根本不是DDOS,是程序員太爛。)
這就是態度,觸目驚心,如果能對問題有敏感性,能知道對任何小的,輕微的問題有足夠的敏銳度,你就有了一個快速成長的基礎。對問題的敏銳度是非常重要的。很多性能或程序邏輯上非致命的bug,在不夠敏銳的時候是發現不了的,但是一旦進入特殊場景就會驟然爆發,你多一點敏銳度,就會減少這種危機的風險。
第二個態度是解決問題的態度,有人對自己的解決方案信心滿滿,認為萬無一失,但有的人就會多留一條後路;就好比你說我伺服器要不要做安全加固,肯定要做對不對,要做到盡可能嚴謹和周全,但是你資料庫保存密碼的時候是不是還要加密?而且要隨機salt,不就是防止萬一依然有漏洞被人拿庫怎麼辦么。程序也一樣,以前寫的一些服務端守護進程,有bug,會莫名其妙的終止,這個bug當然要定位,要修復,但是同時,寫一個cron檢查這個守護進程狀態,一旦遇到終止給予自動恢復,這就是第二手准備,即便你多麼不希望他執行,這個准備還是要做的。對問題 做兩手甚至三手准備,也是優秀程序員,架構師的關鍵素質。
第三個態度是基於溝通與理解的態度,產品或運營提了一個不靠譜需求,一句話打回去當然很爽很威風,但是有沒有仔細溝通分析過,這個需求基於怎樣的實際訴求,這個實際訴求有沒有更合理的實現途徑,一句話「這個沒法做,這個實現成本太高」,不是正確的溝通態度,而且,最優秀的產品,往往是實現了那些原本人們認為無法實現的訴求。
這樣的態度,才有了一個持續進步的基礎,下面說思路和方法。
優秀 的程序員和平庸的程序員,如果只看敲打代碼的速度,我覺得是分不出來的,也許每人都可以一天寫很多行代碼,但是遇到問題後,平庸的程序員的解決效率,和優秀程序員相比就會有天壤之別。 所謂解決效率,不外乎對bug的分析、定位,以及 思考。
最基本的一條,看執行日誌,看各種日誌,web server的日誌,資料庫 的日誌,慢查詢日誌,binlog日誌,php的錯誤日誌,等等等等,線上出問題瞎猜連日誌都不看的大有人在。看日誌不仔細不完整的也大有人在,你能去認真研究日誌已經超越很多人了。
第二條,模塊測試和斷點分析,程序員一個壞習慣就是上來就寫很大一坨代碼然後再執行,不知道一個模塊一個模塊來寫來測試,執行出了問題不知道設置斷點,縮小范圍逐步分析。斷點分析非常簡單,將整個代碼中插幾個中間輸出,觀察哪個環節出了問題,或者觀察每個環節的系統開銷,對調錯和性能優化都非常重要,高手們大概認為這是ABC的東西,但是就這玩意我看到的大部分程序員都沒有這個習慣。
第三條,錯誤信息 的理解和搜索,搜索引擎上有各種豐富的技術資料和技術問答,你所遇到的錯誤信息和錯誤提示,通常都能在網上搜索到,當然,搜索到後要結合你的場景認真思考,並理解透徹,而不是照貓畫虎的去處理,否則可能這次運氣好就蒙對了,下次運氣不好又不知道怎麼回事了。
第四條,不斷總結歸納,對一個問題,一類問題,以及不同類型的問題,善於歸納整理,不斷反思自己的問題,即便是不出bug的代碼,你經過一段時間去回頭看,也有很多思考不正確不合理的地方,有很多優化點,如果你覺得自己的代碼一向牛逼,毫無破綻,那你一定是原地踏步,毫無進展。
關於 歸納總結,我說個案例
以前我們有個系統,請求量非常大,負載非常高,有個不錯的技術經理來處理,他列了幾個升級計劃,都很靠譜,去執行了,效果非常好,然後我們跟進匯報的時候他來講,做了幾項升級,整體效果如何,然後我就批評了他。
我批評了什麼呢?他是一起做的升級,然後一起觀測的效果,那麼這幾個方案里,具體每個方案的實際效果怎樣,對提升的幫助多大,他沒有任何數據。所以對具體每個升級方案的價值和重要性,他沒有任何概念。你正確的解決了問題,卻沒有認真的去歸納整理,你的收獲是有限的。一起做升級不能說是錯的,但是效果評估需要單獨去做,而這個數據是非常有價值的,知識積累,不是你處理過的就一定有積累,而是整理過的。
大概就這些
最後重述一遍
什麼是能力?
遇到問題的態度
處理問題的思路和方法
這就是能力
點贊的那麼多,答謝各位,補充幾條思路吧,是上面幾個方法的具體擴充
補充1:善於提問,你能得到怎樣的答案,取決於你提出怎樣的問題。
你遇到問題,你應該知道,從哪裡去問,去問什麼。
我常見的一個測試題是這樣的。
資料庫目前掛了,我就是伺服器,我不知道為什麼掛了,你是一個優秀的分析師,現在我來做響應,你問我問題,你問一個問題,我回答一個指標,然後看你能不能定位問題。(當然,我會根據所假設的問題回答所有數據指標),比如你問我資料庫連接數多少,問我系統i/o壓力多少,或者問我慢查詢日誌里有什麼,等等,善於提問的人就可以快速得到答案,而不善於提問的人,就會猜測一堆可能,最終卻一無所獲。
有個真實好玩的案例,有個兄弟公司(前段時間新聞出來,賣了好像十個億的樣子),開始的時候服務端資料庫不夠強壯,負載起來的時候會出現一些問題,就請我去把脈,我一看windows伺服器,SQLserver (不要猜了,那是幾年前,現在應該改了),我說這個我不會啊,然後人家那麼熱忱當我是專家,只好硬著頭皮上,我連基本操作都不會怎麼辦,我就坐在那裡問問題,開始他們說是不是這樣,是不是那樣,我說你們不要盲目下結論,你們要是知道結論就別來問我了,我問什麼指標,什麼日誌你們就給我查什麼,我就一樣樣的問,他們現場操作去查數據,我問一個他們查一個給我看,查著查著,他們的工程師說,知道原因了!果然和他們開始的假設完全不同。其實關鍵就是問問題的思路,他們一開始沒有提出正確的問題。提出了正確的問題,他們很快自己就找到了原因。
補充2:善於劃定范圍,縮小問題區間。
前面提到的斷點分析是一個非常常見的分析方法,但是很多場景,你甚至不知道是哪個程序出的問題,善於將問題范圍化,也是一種歸納和分類的能力。
我曾在某個技術群出過一個經典測試,還記得以前微博上提到的一個經典面試題么。「從瀏覽器輸入url到打開網頁,中間經歷了什麼」,這是一個經典的綜合認知的題目,基於這個題目,出一個更實戰的場景測試是(這個場景其實90%的網站站長和游戲運營商都遇到過),」目前有用戶反映網站或游戲卡,請問如何分析原因,以及當前優先順序步驟。「。結果在這個群里,只有我徒弟說出了完全正確的答案(09年帶過的)。優先順序第一步是看在線用戶數和當前訪問數,對比歷史,得到該問題目前的影響程度,來決定後續的優先順序,以及減少分析范圍。(這是意識問題)分析思路,分成三大塊,前端,網路層,服務端。當然這三塊可以繼續延伸下去非常多細節,但是至少,能先把問題分成三大塊,然後基於一些顯見的分析方式快速排除其中幾個部分,再逐步細化問題,而大部分人只是從一個局部去思考,講了很多局部細節卻沒有完整的綱領,所以這就是差距。
先想到這些,咳咳。
轉自知乎 曹政
❷ 有哪些老程序員都知道對新手很有用的經驗
一說到程序員,想必大家的第一印象就是頭發少,很大程度上就是因為壓力大導致的,有生活壓力,也有工作壓力。
今天說說工作方面的壓力,想必看到這個問題的小夥伴都有一個認知,就是一個項目往往比預期的要長,說不定從哪天開始就加班了,一出現BUG真的要人命。此時,考研新老選手心態的時候和經驗的時候了,老程序員或許能從容應對,新手可能完全不知錯所。
這些信息包括戶口檔案、社保、公積金等信息,程序員新手可能跳槽比較頻繁,有人甚至還換個城市工作。除了戶口可能其他的信息都亂了,可能當時覺得不那麼重要,但是十年、二十年後,可能會非常重要。
·工作日誌可以提升腦容量;
·不要先寫框架再寫實現,要反過來;
·重構/優化/修復Bug,不要同時做;
·簡化開發流程,加快迭代速度;
·紙筆是最好的工具,其次是markdown;
·畫出結果,一目瞭然。
·首選明文文本,二進制、加密、壓縮等到時候再加;
·要學會進行清晰的命名;
·問問題前先調查,要問到點上。
·不要小看程序員
❸ 如何證明一個人不是真正的程序員
一個真正合格的程序員,或者說就是可以真正合格完成一些代碼工作的程序員,應該具有的素質。
1:團隊精神和協作能力
把它作為基本素質,並不是不重要,恰恰相反,這是程序員應該具備的最基本的,也是最重要的安身立命之本。把高水平程序員說成獨行俠的都是在囈語,任何個人的力量都是有限的,即便如linus這樣的天才,也需要通過組成強大的團隊來創造奇跡,那些遍布全球的為linux寫核心的高手們,沒有協作精神是不可想像的。獨行俠可以作一些賺錢的小軟體發點小財,但是一旦進入一些大系統的研發團隊,進入商業化和產品化的開發任務,缺乏這種素質的人就完全不合格了。
2:文檔習慣
說高水平程序員從來不寫文檔的肯定是乳臭未乾的毛孩子,良好的文檔是正規研發流程中非常重要的環節,作為代碼程序員,30%的工作時間寫技術文檔是很正常的,而作為高級程序員和系統分析員,這個比例還要高很多。缺乏文檔,一個軟體系統就缺乏生命力,在未來的查錯,升級以及模塊的復用時就都會遇到極大的麻煩。
3:規范化,標准化的代碼編寫習慣
作為一些外國知名軟體公司的規矩,代碼的變數命名,代碼內注釋格式,甚至嵌套中行縮進的長度和函數間的空行數字都有明確規定,良好的編寫習慣,不但有助於代碼的移植和糾錯,也有助於不同技術人員之間的協作。
有些codingfans叫囂高水平程序員寫的代碼旁人從來看不懂,這種叫囂只能證明他們自己壓根不配自稱程序員。代碼具有良好的可讀性,是程序員基本的素質需求。
再看看整個linux的搭建,沒有規范化和標准化的代碼習慣,全球的研發協作是絕對不可想像的。
4:需求理解能力
程序員需要理解一個模塊的需求,很多小朋友寫程序往往只關注一個功能需求,他們把性能指標全部歸結到硬體,操作系統和開發環境上,而忽視了本身代碼的性能考慮,有人曾經放言說寫一個廣告交換程序很簡單,這種人從來不知道在百萬甚至千萬數量級的訪問情況下的性能指標是如何實現的,對於這樣的程序員,你給他深藍那套系統,他也做不出太極鏈的並訪能力。性能需求指標中,穩定性,並訪支撐能力以及安全性都很重要,作為程序員需要評估該模塊在系統運營中所處的環境,將要受到的負荷壓力以及各種潛在的危險和惡意攻擊的可能性。就這一點,一個成熟的程序員至少需要2到3年的項目研發和跟蹤經驗才有可能有心得。
5:復用性,模塊化思維能力
經常可以聽到一些程序員有這樣的抱怨,寫了幾年程序,變成了熟練工,每天都是重復寫一些沒有任何新意的代碼,這其實是中國軟體人才最大浪費的地方,一些重復性工作變成了熟練程序員的主要工作,而這些,其實是完全可以避免的。
復用性設計,模塊化思維就是要程序員在完成任何一個功能模塊或函數的時候,要多想一些,不要局限在完成當前任務的簡單思路上,想想看該模塊是否可以脫離這個系統存在,是否可以通過簡單的修改參數的方式在其他系統和應用環境下直接引用,這樣就能極大避免重復性的開發工作,如果一個軟體研發單位和工作組能夠在每一次研發過程中都考慮到這些問題,那麼程序員就不會在重復性的工作中耽誤太多時間,就會有更多時間和精力投入到創新的代碼工作中去。
一些好的程序模塊代碼,即便是70年代寫成的,拿到現在放到一些系統裡面作為功能模塊都能適合的很好,而現在我看到的是,很多小公司軟體一升級或改進就動輒全部代碼重寫,大部分重復性工作無謂的浪費了時間和精力。
6:測試習慣
作為一些商業化正規化的開發而言,專職的測試工程師是不可少的,但是並不是說有了專職的測試工程師程序員就可以不進行自測;軟體研發作為一項工程而言,一個很重要的特點就是問題發現的越早,解決的代價就越低,程序員在每段代碼,每個子模塊完成後進行認真的測試,就可以盡量將一些潛在的問題最早的發現和解決,這樣對整體系統建設的效率和可靠性就有了最大的保證。
測試工作實際上需要考慮兩方面,一方面是正常調用的測試,也就是看程序是否能在正常調用下完成基本功能,這是最基本的測試職責,可惜在很多公司這成了唯一的測試任務,實際上還差的遠那;第二方面就是異常調用的測試,比如高壓力負荷下的穩定性測試,用戶潛在的異常輸入情況下的測試,整體系統局部故障情況下該模塊受影響狀況的測試,頻發的異常請求阻塞資源時的模塊穩定測試等等。當然並不是程序員要對自己的每段代碼都需要進行這種完整測試,但是程序員必須清醒認識自己的代碼任務在整體項目中的地位和各種性能需求,有針對性的進行相關測試並盡早發現和解決問題,當然這需要上面提到的需求理解能力。
7:學習和總結的能力
程序員是人才很容易被淘汰,很容易落伍的職業,因為一種技術可能僅僅在三兩年內具有領先性,程序員如果想安身立命,就必須不斷跟進新的技術,學習新的技能。
善於學習,對於任何職業而言,都是前進所必需的動力,對於程序員,這種要求就更加高了。但是學習也要找對目標,一些小codingfans們,他們也津津樂道於他們的學習能力,一會學會了asp,一會兒學會了php,一會兒學會了jsp,他們把這個作為炫耀的資本,盲目的追逐一些膚淺的,表面的東西和名詞,做網路程序不懂通訊傳輸協議,做應用程序不懂中斷向量處理,這樣的技術人員,不管掌握了多少所謂的新語言,永遠不會有質的提高。
善於總結,也是學習能力的一種體現,每次完成一個研發任務,完成一段代碼,都應當有目的的跟蹤該程序的應用狀況和用戶反饋,隨時總結,找到自己的不足,這樣逐步提高,一個程序員才可能成長起來。
一個不具備成長性的程序員,即便眼前看是個高手,建議也不要選用,因為他落伍的時候馬上就到了。
❹ 當程序員好不好
你好,作為一名程序員我來說說我個人看法。
當程序員有好處也有壞處,比如
好處有,
1,程序員薪酬高,在中國,IT和金融單看工資的話絕對是排在前列的,一個應屆程序員大學生畢業薪酬就可以拿到1萬以上。
2,程序員有相對公平競爭的環境,程序員很多方向對學歷要求不高,像前端,web開發,後段開發,運維,等等這些。而且程序員一旦進入公司後,學歷的影響遠不及實力,更多的是一個人的持續能力的體現在工作中。
3,程序員不需要能言善語的交際能力,哪怕你是比較內向,又不善於喝酒的人,做程序員還是比較合適的。
4,程序員就業面廣,現在社會上互聯網企業眾多,就連很多非互聯網企業也會有程序開發的崗位需求,整體就業面廣。
當然什麼事都是有兩方面的,做程序員也有缺點,比如
1,程序員是吃青春飯的行業,程序員35歲以後就業比較困難,一旦被裁員,再就業壓力會很大。
2,程序員工作用腦量大,大部分程序員中後期會掉發,也有可能會出現些身體上的疾病困擾。
3,程序員加班嚴重,互聯網行業不論是大企業還是小企業都是狼性文化,要求員工工作時間很長,隊員的考核也很嚴格。迫使員工就算下班了也還經常處於加班工作中。
綜上所述,對於很多想當程序員的朋友一定要綜合考慮各個因素,再決定是否要去當程序員。
我是@渝村阿澤 歡迎點贊,評論,關注。我會持續分享IT相關知識和求職。相信你一定會有有所收獲的
如果有IT相關知識,或者考研方面的問題都可以在評論區給我留言。