A. 為什麼程序員的思維很難理解
1、程序員的思維比普通人要嚴謹。
對編程有一定了解的人都能理解這一點,一是一二是二,電腦不認模稜兩可的回答,因為「模稜兩可意味著更多的可能答案」,所以你跟程序員交談的時候,如果你問他「為什麼要這樣問」或「你為什麼聽不懂」,你就會知道你自己的描述有多麼的不嚴謹了。
最簡單的例子,你媽媽讓你去市場買水果,如果看到有蘋果就買一個蘋果,看到梨就買兩個。你看到市場有蘋果和梨,你會買什麼回家?
首先給出一個大前提,在程序上不存在「潛台詞」或者「潛規則」這種東西,唯一起作用的只有「字面意思」。
一般人肯定是買一個蘋果和兩個梨。當然程序員也不是腦子有坑,以一個正常人的思維考慮也會買一個蘋果和兩個梨,但是看到這問題的第一個瞬間的直覺反應,卻是「如果看到梨就買兩個蘋果」。這個問題不存在潛台詞,所以所有人都會直接從字面理解老媽的意圖。
按照程序的邏輯分析,這句話共分為兩個部分,代表兩個程序任務。「如果看到有蘋果就買兩個蘋果」為任務一,條件是「看到有蘋果」,目標對象「買蘋果」,數量「一個」;「如果看到有梨就買兩個」為任務二,條件是「看到有梨」,數量「兩個」,沒有給出新的目標對象。
因此按照程序邏輯來講,第二句話將繼承上一個目標對象,也就是「買蘋果」,所以這句話被看起來像職業病一樣的思維直接翻譯成了「如果看到有蘋果就買一個蘋果,如果看到有梨就買兩個蘋果。」
————————————————————
2、程序員看問題比一般人透徹。
這是職業特性導致的,因為電腦編程的嚴謹性,因此程序員面對一個問題、一個需要實現的目標或者一個bug時,他會思考更底層的問題,並且會習慣性採用歸納法來盡量避免以後可能遇到同樣的問題。
比如用輸入法輸入中文的詞句,有的時候打出了一串拼音,然後按下數字2選取發現不是自己想要的詞,然後發覺數字1對應的才是自己想要的,刪掉,重新輸入拼音,這次按下數字1的瞬間卻發現兩個詞的位置調換了,於是又刪掉重新鍵入,這次認真地看了看,終於選對了想要的詞的序號。
這個時候你會說,啊,我下次應該更小心一點,不要馬虎大意想當然,看清楚了再點。
程序員不這么想,他會想,導致這個問題的看來是輸入法的「詞語順序自動調整」功能,他會自動監測使用者輸入的各種詞語的頻率,來自動調整詞語的順序,底層代碼實現的邏輯很簡單,每個不同的詞對應一個從輸入法安裝到現在的輸入次數的計數器,直接按計數器排列順序就好了;也有的輸入法會監測你輸入後是否會將其刪掉,那麼這時候會被智能識別為打錯字,計數器不會加一。
然後再一思考,這種功能一般都是可以開關的,如果我想要靠記憶記住順序使用而不用輸入法自動調整的話,比如對漢字輸入的速度有一定要求需要考記憶記住漢字序號,我只需要進入輸入法設置將其關掉即可;如果我想要它幫助我調整詞句位置,但是又不需要頻繁地調整,那麼在我有工作需要的時候我會提前關掉,平時開啟即可;而如果我想單純依賴這一功能,那就不用管它,下次看清楚再選就好了。
B. 如何成為架構師 7個關鍵的思考 習慣和經驗
工作了挺久,發現有個挺有意思的現象,從程序員、高級程序員,到現在掛著架構師、專家之類的頭銜,伴隨著技術和能力的提高,想不明白的事情反而越來越多了。這些疑問有些來自於跟小夥伴交流,有些是我的自問自答,有些到現在也想不清楚,這篇文章就來寫一寫這些問題。
如何更高效的學習?
很多新人程序員一開始在學習上找不到方向,但我想在渡過了一段時間的新手期之後這類問題大多都會變得不再那麼明顯,工作的方向也會逐漸變得清晰起來。
但是沒過多久,能了解到的資料就開始超過每天學習的能力,像是買了沒看的書、收藏沒讀的貼、mark了之後再也沒有關注過的文章越積越多,更別提每天面對各種技術分享或者微博里的新鮮玩意了。
大多數人每天能留給自己學習的時間有限,這個階段如何提升學習效率就成了要解決的重點。
說說自己提升學習效率的心得,其實非常簡單:體系化的學習。
我曾經很喜歡看一些博客或者是一些「看起來」比較通俗易懂的文章,每天在微博微信里刷到什麼技術文章就mark下來,基本上幾分鍾就能讀完。可一段時間下來,雖然讀了不少東西,但是還是有種在原地打轉的狀態,並沒有感受到有什麼實際的提高。
最後實在忍不住,抱著厚書硬啃了一遍,突然有種豁然開朗的感覺:讀書時自己學到的是一張完整的知識網路,每個知識點和其它內容相互聯系和區別。這種全方位的理解比起一篇篇獨立的文章,不知要高到哪裡去了。
而讀了一段時間書之後,漸漸原本不在一個體系之內的知識也會慢慢聯系起來,比如說後端服務的開發,簡單梳理一下,就成了這樣:
在重復了幾次痛苦的學習-梳理過程後,再去看一些獨立的文章或者資料往往會事半功倍,因為能在體系內找到相對應的知識,甚至有時候一本書里一頁只需要看一句話,點破那層窗戶紙,就可以掌握新的知識。
你是怎麼知道這些的?
工作中總是會遇到各種各樣的問題,有幾次把問題處理過程總結了一下,發了出來,之後就像滾雪球一樣,有越來越多的小夥伴來咨詢問題,比如說:
前一陣幫忙排查一個性能問題,系統壓力稍微一大就會頻繁Full GC,壓力降低之後又恢復了。
某個小夥伴接入代碼質量檢查系統之後發現每次構建會報一個莫名其妙的錯誤,打不了包。
某次代碼有bug,小夥伴跑來來問我git怎麼才能回滾代碼。
每次查完這種問題的時候,一些剛畢業沒多久小夥伴們就會用一種崇拜的眼神看著我,然後大多會問:「你是怎麼知道這些的?」
實際上,雖然我一直在不斷的學習,但是面對工作中無窮無盡的新問題,大部分問題還是會命中我沒有掌握的那部分區域。每次有人問到我不了解的知識時我都會非常開心:還有什麼比帶著問題學習更有效率的學習方法呢?
而且幸運的是,在建立了自己的知識體系的基礎上,學習新的知識通常都能很快的上手,解決一個問題往往只需要多了解一個知識點而已。
舉個例子,頻繁Full GC的問題,以前查過很多次GC的問題,大多數是Java程序或JVM內存泄露問題,而這次內存沒有泄露,GC吞吐量也正常,那麼我只需要查一下如何查看一段時間內創建的最多的對象的方法就可以了。
回到剛才的問題,小夥伴們問我:「你是怎麼學到這些的知識的?」
答案是:在你問我問題之後現學的。
架構師應不應該寫代碼?
似乎隔三差五就能看到一些關於架構師應不應該寫代碼的文章。我是屬於寫代碼派,因為我本身就喜歡寫代碼。但是,當工作職責發生變化之後,如何保持寫代碼和其它工作之間的平衡就成了問題。
從個體效率上來看,我自己親自寫代碼,和很多人相比沒有什麼絕對優勢,甚至有些人碼代碼的速度比我還快一些。
但作為架構師,參與寫代碼還是會有一些不大不小的收益。
一般來說合格的程序員對於明確分配的任務會完成的很好,但是大部分情況下「架構」這個詞意味著架構師並不會涉及太多細節,架構圖和代碼實現之間總還是有些距離,你無法保證所有人都會正確的理解你的設計,或者是程序員寫代碼時遇到障礙時會立刻想出足夠優雅的解決方案。
之前寫過一篇關於爛代碼的文章 ,大部分爛代碼並不是架構師的設計問題,如果程序員沒能很好的理解設計或者是經驗不足,往往會做出一些非常匪夷所思的東西。比如我見過剛畢業的程序員為了防止模塊耦合而將耦合的代碼又拷貝了一份,或者為了「優化性能」而盡量把所有邏輯寫在一個函數里。
如果不能及時發現並改正這些問題,那麼這些地方就會變成「正確的錯誤代碼」,或者」不是我寫的「代碼,或者」我靠我也看過那段代碼「之類足以被掛上恥辱柱的玩意。這種問題算是架構師的責任嗎?作為一個視名聲如命的架構師,我認為是的。
在我看來,寫代碼的架構師更像是在做後勤保障的工作:在代碼中第一時間發現可能存在的問題,向其他人提出警告,或是給予其他人改進的意見,必要的時候或是給其他人演示一下正確的姿勢。
大部分情況下我作為架構師並不需要攬下「核心模塊」開發這種工作,畢竟我能調配的時間太零散了,效率難以保證,很多人在專注的情況下比我做的好很多,我只需要保持大局觀需要適度參與就可以了。
總的來說,架構師和程序員在某些方面上有點像產品經理和用戶的關系,大部分程序員並不會主動告訴你他們想要什麼、哪裡需要優化,甚至自己也不知道這些。想要做出好的產品,捷徑之一就是跟用戶做同樣的事情。
實踐:開會是個技術活嗎?
我覺得應該沒有人喜歡開會,身為一個程序員,沒有幾個人的志向是當什麼職場交際花。
但是會議邀請就這么一個個的跳了出來:開發需求要跟產品開會、項目方案要跟技術開會、新人轉正要去開評審會、別的公司來了幾個大牛正在開分享會、出了故障要開總結會、小組有周會、部門有周會,大項目每周開兩次碰頭會不過分吧?小項目啟動的時候開個會不過分吧?調試的時候發現有個坑大家趕緊討論討論吧?
有時候參加的會議整場下來跟我毛關系都沒有,全程神遊倆鍾頭,最後突然有人一拍桌子:」還有問題沒?好,散了!「
也有可能有個什麼會沒叫你,過了倆禮拜突然收到封郵件催開發進度,」當時那個會你沒參加,大家都說應該是你們做……你沒看會議紀要嗎?「
吐槽了這么多,但我還是認為開會是個技術活,對於架構師來說尤其如此。
大多數技術人員開會並不是那種新聞里的工作匯報或者長者們的會議,他們真的需要通過開會討論一個具體方案,或者解決什麼具體問題。可惜的是我參加過很多會議,大多數的會議都是在毫無意義的交流中浪費時間:幾方人坐在一個屋裡互相說一些對方理解不了的話,最後得出一個」我們會後再捋一捋「之類的結論。
這並不是會議才有的問題,在程序員日常的溝通中,也有很多人並不懂得如何交流,比如偶爾會收到一些寫的非常認真的郵件,打開之後是密密麻麻的一屏幕文字,但是從第一句開始就不知道他在說什麼,後面的東西連看的動力都沒有了。
大多數時候,溝通的核心不是你說了什麼,而是你想要讓對方了解什麼、讓他做什麼。良好的溝通能在工作中顯著提升效率,但很多人忽略了這個事情。
想要恰到好處的進行溝通是一件不那麼輕松的事情,但是簡單來說有幾條原則:
確保各方對背景的理解一致,比如開會之前先簡單通過郵件交流一下,對新加入會議的人花個30秒鍾做個前情提要,或者在討論過程中讓對方說一下他的理解。
去掉對方不能/不需要理解的內容,比如跟產品說「這個隊列在高並發下因為鎖的實現有問題導致CPU性能瓶頸」不如改成「我們發現了性能問題,持續10分鍾了,10萬用戶收不到運營發的無節操廣告,大概5分鍾後擴容解決」。
確保在對方失去注意力前盡快說出重點,比如排查問題的總結郵件,如果第一段是這樣:「某某框架內部使用的是xxx技術,這個技術的架構是這樣:blabla」,那麼對方可能完全不知道你在講什麼。可以換成這樣:「我發現了某某框架的bug,需要盡快升級,否則在xxx情況下有可能會出現yyy問題,具體排查過程如下:blabla」。
不要說沒有意義的內容浪費其他人的時間,比如」這需求做不了「或者」這里不可能出bug「,沒有人想聽到這些廢話。
為什麼別人的系統總是那麼爛?
很多程序員解決問題的能力很強,說要解決一個什麼問題,下午就能寫出幾百行代碼把功能實現了。但是做出來的東西有種少考慮了什麼東西的感覺,我花了挺久去想一個詞去形容「這個東西」,最後想出了個勉強可以表達的詞:程序的生命力。
大部分程序都能實現功能,但是如果把「時間」這個也作為一個考慮的維度的話,就會意識到一個合格的項目需要考慮更多的東西:更通用的使用方式、易於理解的文檔、簡單而易於擴展的設計,等等。而想要毀掉程序的生命力也很簡單:做的更復雜,更定製化,讓更少的人參與。
我跟很多程序員提過程序的生命力,比如說要讓自己寫的工具的操作方式跟其它Linux命令類似,或者要用一些更容易理解但不是性能最優的設計方式,又或者要他去參考現在業界主流的做法,很多人認為提這種需求的意義不大,我覺得這里還是舉個例子吧。
很多公司應該都會有一些遺留系統,它們龐大、笨重、難用、幾乎無法維護,所有人都在抱怨這些系統,並且每天都在想方設法換掉那些遺留系統。但是一段時間過去之後,又會發現身邊的新人又開始吐槽當時替代遺留系統的那個系統了。
「大多數系統當初都很好使,功能當時夠用,擴展性看起來也可以,但是這些系統都是開發的人離職之後變壞的。」
還有更好的辦法嗎?
成為技術專家之後的工作可以說是痛並快樂著,會有很多人找你咨詢問題,另一方面,會有太多人找你咨詢問題。
甚至有一段時間我每天的工作就是解答問題,小到工具使用中到疑難bug,大到架構設計,從早上到晚上基本都是在給各種各樣的小夥伴提供咨詢服務。
我很快發現有些地方不對頭:有些問題實在是太簡單了,以至於我甚至都不用思考就可以給出答案,為什麼會有這種問題?
後來我在每次回答之前先問一句:
「你還有更好的辦法嗎?」
一小部分人立刻能給出優化後的版本,甚至我連續問幾次之後,他能給出好幾個優化後的版本;另小一部分人會斬釘截鐵的說優化不了了,就這樣了。但是大部分人會猶猶豫豫的說出一些完全不著調的回答。
後來我改成在每次回答之前先問兩句:
「你要解決什麼問題?」
「還有更好的辦法嗎?」
效果好了很多,很多小夥伴發現要解決的問題並不復雜,只是做法跑偏了。
再後來我改成了在每次回答之前先問三句:
「他們要你解決什麼問題?」
「你解決的是什麼問題?「
」還有更好的辦法嗎?「
現在第三句已經很少問到了。
成為架構師最困難的門檻是什麼?
跟一些程序員交流的過程中,有不少人問我要怎麼成為一名牛逼的架構師。
我最近幾年面試的人挺多,發現一個有意思的現象:很多人自稱架構師的人跟你講一個架構時簡直滔滔不絕,各種技術名詞像是說相聲一樣從他嘴裡說出來,三句話不離高並發大數據,但是稍微追問一下,就會發現很多基本概念的缺失,例如自稱精通高並發的人說不清楚他所謂的高並發系統的瓶頸在哪裡,自稱精通架構設計的人說不明白他的系統怎麼保證高可用,自稱超大數據量的系統實際上只有不到100萬條數據,等等。
架構師雖然聽起來很高大上,但本質上仍然是工程師,不是科學家,也不是忽悠人的江湖騙子。學習再多,也需要實踐落地。設計架構方案更多的是在做一些抽象和權衡:把復雜的需求抽象成簡單的模型,從功能、性能、可用性、研發成本等等方面規劃如何構建一個系統,這些內容需要更多的實踐練習。
很多人沒有工作在類似微博平台這種天天需要接觸架構設計的地方,而很多公司沒有架構方面的工作可供他們練級,於是就想辦法從理論上下功夫,這類人的特徵非常明顯:在信息不足,甚至不了解實際場景的情況下就開始做架構設計,這種所謂的架構往往理解比較膚淺,經不住推敲。
每年招人之後我們都會做一些針對新人的架構方面的培訓,課程材料基本上包括了高可用架構相關的主要方面,但是學完這些材料之後就能成為獨當一面的架構師了嗎?並沒有。相反,這僅僅是開始,新人真正做了幾個並發量上萬的系統之後才算是正式入門:面對壓力時才會懂得權衡,走過彎路之後才會尋找捷徑。
所以我認為在架構師(和其它很多)的工作中最重要的部分是實踐,誇誇其談很容易,與其拽一些技術名詞,不如把你正在做的系統真正的做好。
我和大牛之間有多少距離?
跟很多人一樣,剛畢業時我覺得作為程序員,只要努力,加上少許天賦便可以獲得一些成績。
工作一段時間後,對自己和其他人的認識也越來越清晰,逐漸的發現程序員之間的差距或許比人和猴子之間的差距還大,接受這個事實這讓我郁悶了很久。
再過一段時間,發現自己已經能夠客觀的評價自己的能力,也意識到了距離並不是那麼重要,只要想辦法跑的更快,就足夠了。
C. 程序員發現 Bug 的時候是怎樣一種心境
我覺得程序員發現bug,應該就有一種學霸發現做錯了一道題的感覺,根據這張題出現在自己試卷上還是出現在別人試卷上應該是有不同的心情的,下面就程序猿的心情來簡單聊一聊。
有時候覺得程序員真的是很牛逼,那麼一大串外星文字寫出來,真是完全看不懂,人家還能一心二用,一邊寫程序,一邊看小說。
D. 知乎熱議:程序員的悲哀是什麼
最近在知乎看到一個很意思的問題,「 程序員的悲哀是什麼? 」
很多人會以為程序員「 脫發、加班、壓力大、上班摸魚 」等標簽是悲哀,而實際上這只是大眾對此的刻板映像,並不是程序員真正的悲哀
畢竟這些標簽在其他行業也都是普遍存在的,只是對於程序員群體來說,這些標簽被互聯網放大了所以顯得格外的悲哀
但實際上的程序員的悲哀卻來自我們程序員這個群體的內在通病
只關注技術的實現,不關注業務邏輯
大部分程序員在學習技術的時候,只會在乎技術的實現,而不去考慮更多的業務邏輯
經常出現的畫面就是:
也正因為如此有了產品經理這個冤家,國外的產品經理更多的是對於商業業務的推進,而國內的產品經理更多的是對於產品細節的把控
因此,程序員的發揮能力進一步被局限,工作日常就是等著產品和設計給出流程圖,按照圖紙去步步執行
這樣不僅禁錮了自己對業務的思考和成長,而且等項目做砸了,第一個背鍋的可能就是程序員
只關注技術的分享,不關注商業邏輯
開源精神是程序員所推崇的,各個項目託管網站、學習資料、視頻的分享造就了一大幫跨行進入互聯網的程序員
要是沒有現在那麼多開源的技術,估計市場上有一大半的程序員得下崗
但是也正因為程序員的開源精神,造成了大量的人才湧入,畢竟環化材生只需要拿出發一篇SCI的精力,就能成為個初級程序員,加入程序員的面試大軍
造成的結果就是初級人才越來越多,越來越內卷,最後35歲提前退休,卷王脫穎而出
讓一個看起來高技術的職業人才通通成為了前期英雄,只要到第二年校招,就會發現自己很大概率被倒掛了
以為職業發展都是線性增長
溫水煮青蛙在各個行業可能都有,但是別的行業可能是溫水慢慢的蒸,但對於程序員這個行業水溫還沒上去來著,就有人拿著網兜把帶走了
一行曾經見過,做項目前老闆發獎金鼓勵你把技術完成,但是項目完成上線後,為了節約成本就開了大部分程序員,留下少量的員工來進行維護
作為前期英雄的程序員,年輕點還好,趕緊去找下一份工作,但是年紀大了一點就難受了
這就是因為很多人按照慣性認為程序員的職業發展是線性模型,以後會越來越好,但很大情況下對於程序員來說職業發展是拋物線的,先增長後下降
如果沒有預案准備,未來將會非常難受,當然做到一半提前轉崗的不在此列
與其溫水煮青蛙,不如主動的規劃未來,那具體怎麼做呢?
就算說程序員35歲退休,那也是針對初級程序員,技術專家的生命周期要長的多
畢竟工資增長靠工齡是不可持續的,能持續支撐工資增長的就是技術的不斷精進了
不僅懂技術,而且還得更深層次的底層邏輯,才能再日常核心問題上發揮出自己的價值,這樣就算優化也很難優化到自己身上
一直在技術圈子裡很容易形成信息繭房,就像現在的各類演算法推薦的流媒體,只推薦你感興趣的內容,對你有幫助但不感興趣的內容卻離你越來越遠了
同時跟電腦打交道久了,就更不想跟人進行交流了,越陷在信息繭房之中
所以還得多離開你的電腦桌,與人交流
只有不斷的邁開腿,張開嘴,你將會發現,未來很多機會都是在與人交流中的碰撞摩擦出來的
為什麼轉行做程序員?那還不是因為工資高嘛
如果要提前規劃未來的話,最好還是多嘗試去了解兼職和副業,知道錢除了從工資里來,還能怎麼來
至少賺1塊錢也是好的,因為很多個項目都是從1塊錢開始,然後不斷滾雪球變大
只有副業開始不斷有收益,那什麼35歲危機、提前退休等危機全都不用考慮
程序員悲哀也都將會煙消雲散了
書籍的好處就在於權威和體系健全,剛開始學習的時候你可以只看視頻或者聽某個人講課,但等你學完之後,你覺得你掌握了,這時候建議還是得去看一下書籍,看權威技術書籍也是每個程序員必經之路。
安裝 Python 環境 !
工欲善其事必先利其器。學習Python常用的開發軟體也都整理在這了,給大家節省了很多時間。
光學理論是沒用的,要學會跟著一起敲,要動手實操,才能將自己的所學運用到實際當中去。如果你不知道你該做什麼,可以查看下面的實戰案例。
我們學習Python必然是為了找到高薪的工作,下面這些面試題是來自阿里、騰訊、位元組等一線互聯網大廠最新的面試資料,並且有阿里大佬給出了權威的解答,刷完這一套面試資料相信大家都能找到滿意的工作。
需要資料的小夥伴請私信我哦!
每個行業都有悲哀,雖然程序員的悲哀被放大了,但仍然是最有潛力的崗位
無論未來轉崗、還是創業,技術能力都會成為buff為自己服務
加油,打工人~
E. 我是幹了八個月的程序員,幹了十幾年的同事給我說我腦子不靈活,思維嚴謹,我是不是該轉換一下做事思路
既然他這么說,而且他有十多年的工作經驗,那肯定只看出了你工作上的一些弊端,那你可以虛心的請教他,你也應該轉換一下工作思路,因為程序員這工作比較枯燥,但是也不能太死板。能盡量寫短一些的代碼就完成工作比繞個大圈寫一堆代碼完成工作要好得多呀,效率也高。