如何確定自己是否適合做程序員?
怎樣知道自己到底喜不喜歡編程?將來要以此為工作?
貼一篇曾經引發過許多討論和轉載的舊文,希望對你有所啟發。
理想的程序員
我算是靠坑蒙拐騙進了程序員的門,然後一路狂奔。26歲之前幾乎沒有任何寫代碼的經驗,研究生畢業卻意外選擇了一家不可能提供培訓的初創公司,在每日擔憂公司倒閉、害怕被炒魷魚以及同事冷落白眼的三重壓力下逆流而上,一年半後離職,已是擁有500萬用戶產品的後台主程。從前我對計算機技術心懷畏懼,認定技術高人一定有佛光籠罩,晝夜不息運鍵如飛日吐代碼上萬行。現在也算見過一些世面了,回首那段忐忑不安宛如初夜的過程,我卻不發覺有任何的勵志意味,而是視為一種理所當然。理想的程序員,和理想的建築師、理想的財務師、理想的按摩師沒有任何的差別,他們本質上都是一群手藝人。我相信理想的程序員人人皆可成為。
近三年總在互聯網圈廝混,我認識過一些程序員,共事過一些程序員,領導過一些程序員,又面試過一些程序員。他們學歷不同,有的來自北大,有的來自北大青鳥,有的是博士,有的是高中肄業;資歷也不同,有的來自BAT,有的來自某破產基金公司(還是一個銷售);年限也從0到15年不等。但我認為程序員只需分三類:天才的程序員、理想的程序員、平庸的程序員。天才的程序員我只敢說接觸過3個,這是天命。7分由你是顆精子的時候就已決定,擁有絕佳的數學天賦、冷靜緻密的邏輯、為解決難題寧願不眠不休而深以為樂的技術熱情;3分來自起步要早早早,恨不得同齡人玩泥巴的時候就得開始玩電腦,大學畢業前就突破一萬小時法則,後面的已是遊戲人生。
天才的程序員可遇不可求,更不能長有,我看到的90%仍是平庸的程序員。IT時代的膨脹,已讓程序員如同文藝復興時的印刷匠一樣的普通,多數投入祖師爺門下的人,僅是為了更大的飯碗,更高的待遇,更好的生計。平庸的程序員編寫腐爛的代碼,沒有規範和一致性,固守舊世界的語言,還好談論大的架構和性能,說的比做的漂亮。而毫無例外的,他們認定技術沒有出路,做產品、營銷和管理的是更高大上的手藝,而他們當中的99%,又會自然的流露出自己恰巧具備了那方面的天賦,至於進程為什麼會崩潰這樣的小問題是不屑於去了解的。
而我最喜歡和理想的程序員相處,恨不得與他們同吃同住,如果允許,我希望我的隊伍能插滿他們的旗幟。理想的程序員心眼兒不壞(他們從來都不是辦公室政治的寵兒,是一群單純明亮快樂的手藝人),有天真爛漫的好奇心(他們的眼睛裡經常閃著「哇,這個是怎麼做到的!」),永遠精益求精(他們的口頭禪是「我再研究一下」),還樂於分享(他們活躍於GitHub、各大問答社區和你的身邊,捨得將寶貴時間用於幫助新手)。是的,他們不需要被管理,只需要給一個大的方向,總能回報以意想不到的結果。
理想的程序員與平庸的程序員只有一牆之隔。兩者的差距只有6個一點點,而人與人的差距,正是在這日積月累的一點點中,被永遠拉開了。有意思的是,我發現這6個一點點都和意識有關,也就是程序員和其他一切新興產業的工種一樣,只需要意識加上時間的錘鍊,人人皆可達到理想的階段。理想的程序員必然也是一個優秀的problem-solver。
第1個一點點:專註眼下
見過太多心猿意馬的程序員,我不得不把「專註眼下」作為天字第一條。他們往往有各式各樣的小夢想,比如做個小茶農、做個小鵝販、做產品、做銷售、做投資,卻被程序員的高薪或是沒有轉行的魄力「耽誤」了,而因為不專註,他們不在意做好自己的本分,不在意錘鍊自己的技能,不在意學習新興的技術。不可否認,這世界上存在著偉大的產品(像喬老爺)、偉大的銷售(像埃里森)、偉大的投資客(像彼得菲),而他們毫無例外都是程序員出身。可你聽說過巴菲特評價蓋茨的話么,比爾蓋茨如果轉行去賣狗,那他一定是全世界最大的狗販。我堅信除了少數的天才外,冥冥眾生均可以在多個領域取得成功,只要保持足夠的專註。而哪怕你下一年就想賣狗去,程序員的經驗仍然能訓練你強大的邏輯、謹慎和耐心,放在哪個行業都是相當可觀的競爭力。
第2個一點點:思考力與推動力
我認為處理bug、崩潰、調優、入侵等突發事件比編程本身更能體現平庸程序員與理想程序員的差距。當面對一個未知的問題時,如何定位複雜條件下的核心問題、如何抽絲剝繭地分析問題的潛在原因、如何排除干擾還原一個最小的可驗證場景、如何抓住關鍵數據驗證自己的猜測與實驗,都是體現程序員思考力的最好場景。是的,在衡量理想程序員的標準上,思考力比經驗更加重要。
有時候小夥伴跑過來,問我「提交了一個任務被卡住了,怎麼辦」的時候,我總覺得他可以做得更好。比如,可以檢查試驗別的任務,以排除代碼自身的原因;可以通過Web UI檢查異常(如果沒有賬號,可以讓我提供);可以排查主機日誌或刪除緩存,再不濟,總應該提供任務ID和控制台日誌給我。理想的程序員永遠不會等事情前進,他們會用盡一切方法讓事情前進。
第3個一點點:Never Say No
記得從前廠離職之前,找老闆談話,他說我最大的優點就是從來不和他說這個做不到。後來我發現在很多團隊里,都存在一種技術和產品的對立,程序員往往以「技術上無法實現」來擋產品的需求,而產品也往往以「Facebook可以為什麼我們做不到」來奚落程序員。這兩句話應該屬於禁語,從根本上都不利於程序猿和產品狗的相親相愛。
一句「技術上無法實現」是容易出口,可有多少人在說出這句話的時候,心裡是100%肯定的?如果不肯定,為什麼不能回去谷歌一下再回答?原本我以為程序員是充滿想像力,在因為有想像力,才能誕生那麼多改變我們生活的軟體和互聯網產品。見識多了,才了解大部分程序員已經在與bug的對抗中變得保守而不願擔當風險,與此同時許多團隊也不願意寬容失敗。於是「Say No」變成一種習慣性的抵觸,還記得曾國藩為什麼解散湘軍么?他說那支軍隊已「暮氣漸深」,不能打仗了。要做理想的程序員,就不能給自己滋生暮氣的機會,如果面對不合理的需求,可以把時間成本擺出來,把曲線救國方案亮出來,簡單粗暴「Say No」是不可取的。
第4個一點點:投資未來
程序員是一個非常殘忍的職業。你所學所用的語言、框架、模式,很可能在數年內就成昨日黃花了;你現在嘲笑的另一群程序員,可能馬上就能轉身來嘲笑你了。所以理想的程序員除了做好自己的本分,還要花費時間來投資未來。什麼是「投資」?投資就是你現在投入的時間,在未來會以更多的時間或者金錢(看看早幾年學習iOS的程序員現在的薪酬!)回報你。舉我自己的領域 -- 數據挖掘為例,08年左右Hadoop開始興起,一時「大數據」概念火熱,Hadoop工程師萬金難求,各互聯網公司紛紛把數據統計、數據分析和數據挖掘的業務切換到分散式平台上。這幾年眼看Hadoop還在不斷迭代,Spark又異軍突起,一舉刷新了Hadoop保持的排序記錄,以內存存儲中間數據帶來的性能優勢和豐富的數據結構讓人愛個不停,各種奇異的小bug和陡峭的學習曲線又讓人打退堂鼓。那麼,明眼人都知道Spark是未來的趨勢(內存會越來越便宜),在主業務放在Hadoop的條件下,就可以適當把一些小模塊切換到Spark上,同時留意Spark社區的發展。很快從Spark獲得的性能收益就能把之前投入的學習時間掙回來。
第5個一點點:善用工具
善用工具可以分為4個層面:
- 搜索引擎
- 不相信重複
- 代碼片段
- 自動化
我剛入行那會,一個計算機專業卻當了公務員的朋友問我,你一點都沒學過編程,平時怎麼寫代碼?我說,谷歌,於是遭到無情的恥笑,以至於我在哪裡的賬號都叫2shou,告誡自己是一個無恥的二手程序員。這是一個笑話,但如果現在問我,我還是要回答谷歌。程序員的成長就像膨脹的圓餅,外面是無邊無際的大海,圓餅越大,與大海接觸的面也越大,懂的越多,不懂的越多,而計算機科學又是一門更新換代異常迅速的學科,同時也是知識互聯網化最好的學科,很難利用傳統的科班式有教有學的方法,相反通過搜索引擎則很容易獲取到最新的知識。
不相信重複,大師的話叫DRY原則(Dont repeat yourself),代碼寫多了,會有人為的直覺判斷好的和爛的代碼,我的標準是簡潔和規範,簡潔並不是美感上的標準,重複越少,給自己出錯的機會也越少,後期維護的成本也越少。
如果你不幸丟了三周前的代碼,也許你能憑著過人的記憶力把腦子裡殘餘的片段複寫出來,但如果丟的是三個月前的代碼,恐怕就沒有那麼好的運氣了。理想的程序員會著力找尋有效的資料保存方式,把工作里靈光閃現寫下的代碼、腳本、配置、經驗等短的片段保存起來,以便任何時候都能複查。
理想的程序員必須懶惰。對他們來說,重複的步驟和重複的代碼一樣醜陋,如果意識到一項工作有可能長期要重複,那麼自動化的時間總是越早越好。
第6個一點點:管理時間
之所以管理時間會對程序員這個行當特別重要,是因為在完成任務時你必須像荒野里的狼一樣,「獨行」。沒有外界約束的情況下還能穩定控制自己,保證能高效率地工作和學習,那麼日積月累你肯定會變得比一般人厲害。
程序員乾的是高強度的腦力活,一般每天集中4-5個小時應對本職工作就足夠了,但工作之外,一定要安排時間用於學習。除了學習,留點時間放空自己也是必要的,利用泡茶或者喝咖啡的間隙,把彌足珍貴的時間留給自己,往前想往後想,事半功倍。
說了這麼多,想必有人會問,費勁心思成為一個理想的程序員,又有什麼用處?會有高薪嗎?不。能升職嗎?也不見得。迎娶白富美呢?不如去賣狗。 稻盛和夫曾經說過一個故事,明治時期的手藝人被天皇召見,雖然都是不讀書的鄉下人,但一輩子兢兢業業地做一件事情,自然有一股高貴的氣質。理想的程序員,應該就是循著這種高貴的氣質而去的吧。
更多精彩內容,歡迎關注微信公眾號「極客思享」(codingcoffee)
程序員的基本能力是:Tasking和學習能力。
當好程序員的能力是:用更好的方法來實現功能
Tasking和學習能力
雖然這看上去是一件很難的事,但是也不是一件很難的事。這也不依賴於你是否對某一個技術棧的理解,這隻實際上只是學習能力的一種體現。
在扯這些廢話之前,先讓我們來看看我們是如何實現一個功能、應用的。這也是在Growth里提到的Tasking:
- 有一個明確的實現目標。
- 評估目標並將其拆解成任務(TODO)。
- 規劃任務的步驟(TODO)
- 學習相關技能
- 執行Task,遇到難題就跳到第二步。
以本文的寫作為例,細分上面的過程就是:
- 我有了一個中心思想——在某種意義上來說就是標題。
- 依據中心思考我將這篇文章分成了四小節。
- 然後我開始寫四小節的內容。
- 直到完成。
而如果將其劃分到一個編程任務,那麼也是一樣的:
- 我們想到做一個xxx的idea。
- 為了這個idea我們需要分成幾步,或者幾層設計。
- 對於每一步,我們應該做點什麼
- 我們需要學習怎樣的技能
- 集成每一步的代碼,就有了我們的系統。
所以,實際上這並不是考驗你技術能力的點,而是考驗你如何劃分任務和學習能力的點。在我不斷地實現一個個系統的時候,最後我才意識到了這一點——學習能力和Tasking才是最重要的。換句話說,你現在學會什麼並不重要,重要的是你以後有沒有學習的能力。
有了一直想著過安逸的生活,所以就會安樂的死去。不過反正人生在世,自己開心就行,不要管別人怎麼說。隨後,我發現大部分我想到的都可以實現。
那麼問題來了:
- 用鉛筆寫字也是寫,用鋼筆寫字也是寫,用電腦打字也是寫——到底要用哪個工具來寫。
- 用楷體來顯示也是顯示,用宋體顯示也是顯示——到底要怎樣的實現。
這實際上就是:用更好的方法來實現功能。
用更好的方法來實現功能
對於這一步來說,有太多的東西值得去探索:
- 更好的架構
- 更好的工具
- 更好的語言
- 。。。
對於語言這一點上來說,Python和Ruby是兩個不同的極端,不過看上Ruby是繼承Perl的思想的基礎上,就不多說了。Python,一個問題只有一個方法;Ruby,一個問題有幾個方法。因而在這兩個語言來,想要快感就用Ruby,還有近年來流行的Scala。想要便捷就是Python,不容易出現別的問題。
而這些只是我得到的結論,每個人都會得到不同聽結論的。因而,探索是一件很有意思的事~~,如圖:
所以實際上,這一步是去探索一個更廣闊的天空。我們需要知道不同的語言和技術棧的一些優勢,了解並知道如何去應用即可。
如,以前我用的是Django的RESTful方案Tastypie管理來解決問題。後來,又發現了Django REST Framework,又用它實現了原來的邏輯。大四時,我發現PHP語言中的Laravel在RESTful這件事情上,似乎很有表現力,並且更容易「部署」——LNMP。接著實習時,發現Java在部署上更不錯,它只需要一個Java包。而這個過程,只是出自於部署方面來考慮問題的。
即使現在我是一個使用Node.js的人,我還是覺得Java的打包就是優勢。
在探索的過程中,我們就知道挖掘技術哪家強?
當我還在嬰兒,剛學會抓東西的時候。
爸媽會拍一段錄像,我憨厚地在床上爬著、翻滾著。
床上會陸續擺著一些東西,我記得在錄像帶里,有一張百元大鈔、一盒香煙、一塊手錶、一條金項鏈、一本書、一盒磁帶和一個計算器。
沒錯,我看見我毫不猶豫地抓起了計算器。
你以為這樣就結束了?
我媽拿起了百元大鈔,塞到我手裡,被我無情地扔了。
我繼續擺弄著手裡計算器。
舅舅從煙盒裡抽出一根煙,硬是塞到我嘴裡,未遂。
我繼續擺弄著手裡計算器。
外婆拿起金項鏈在我面前晃蕩,我抓了一下下,就不理了。
我繼續擺弄著手裡計算器。
……
我爸彷彿看見了勝利,因為這些攤著的東西,是他們自己拿出來調戲我的,我也不知道他們在那時有沒有押什麼籌碼。
大概是我媽看見了我爸嘚瑟的笑容,一把奪走了我手裡的計算器。
我TM……哭了。
我爸就把我抱了起來,把計算器塞回了我手裡哄我開心。
我TM……笑了。
所以說,不是三歲看老,三個月就能看老了。
===========================================================
在百度搜了好幾頁才搜到那個計算器的圖,因為那計算器在家裡用了好久,還是挺有印象的。
大概就是長這樣的:
如果不想讓你孩子成為碼農的話,最好讓這些有魔性的東西離他們遠一點。(比如歸零
愛運動。這是一個可以坐一天的職業,沒有下課鈴,沒有課間操,一年到頭,天天如此,自己不動,沒人拉你。沒有運動習慣,幹個十年八年,身體就頂不住了。最好有一兩個運動愛好,這樣才能長久。
可以不說話。就像狗每天需要溜溜,人也有交流的需求,但程序員往往一天說不了幾句話,一說話就是改需求,修bug,如果自己要靠說話釋放壓力,愉悅心情,就要考慮考慮了。
一個人戰鬥。別說這個我不會,別指望別人告訴你怎麼做,自己找,自己學,不揪頭髮想幾個小時,不要開口問別人。
英語閱讀能力。不需要能讀報紙小說,但至少能閱讀文檔,看Stackoverflow,給變數起名字的時候,不用拼音。
動手。會吹的是老闆,能做出來的,才是程序員。思考如何實現,動手配置環境,一行行的寫出細節,不論結果多簡陋,依然能從中獲得成就感。
容忍抽象。什麼層呀,類呀,棧呀,堆呀,都是抽象,是摸不著看不到的東西,是由邏輯和行為來定義的,一開始會覺得很難理解,最好的辦法是自己實現一遍。
不斷學習。程序員的快樂來自於學習和實現,如果學習讓你感到痛苦,樂趣也就少了一半。終身學習,也算是職業特點。
能夠對著屏幕一整天。這是職業現實,沒什麼好說的。編程的時候很開心,覺得時間過的很快,停不下來。
總是知道下一步要做什麼,要學什麼,要實現什麼。
關於編程有說不完的想法,和閃閃發亮的計劃。
對待代碼細緻入微,有癖好,有固執的堅持,完美主義。
從寫的第一行代碼,到現在,到未來,
所有的寫過的,正在寫的,和即將寫的,
那些零碎的,散亂的,還是整潔的,有條理的,不同角度和功能的,
都是一個在不斷進化的整體與你思維交流,不斷的融合與發展和進步。
我認為這是一種適合,其它情況和別的工作都一樣,都只是養家糊口的工作。
看完了大部分回答,不禁有一種知乎藥丸的趕腳,這麼好的問題居然罕有很理性的討論分析,看來知乎已經是段子手和機靈鬼的天下了。
雖然我也覺得有些機靈抖得很精妙,但是作為一個還有點責任感的小V,還是要來點乾貨的。
----------------------------------乾貨分界線-----------------------------
身為創業者,帶過技術團隊,也曾經閱猿無數。 @aidy liu 的答案給了我一些啟發,來分享下。
程序猿最重要的能力是什麼?
解決問題的能力!這個很多IT從業者都是贊同的,應該沒有太大異議。
那麼如何從「解決問題」的角度看自己是否適合做程序猿呢?
我認為有兩大標準可以用來衡量——「探索精神」和「邏輯思維」
1 探索精神
探索精神從宏觀角度上講是人類文明不斷進步的源泉;具體到每個個體,則是個人成長的動力。一個人從呱呱墜地起,對未知的世界總是充滿好奇,從雨雪冰霜的物質轉換到喜怒哀樂的情感變化,都會激發探索精神。而這其中,適合做程序猿的這一批人,是對「物體運行原理」具有探索精神的人。這裡的「物體」既包括電子設備的軟硬體,也包括機械、化工、生物等學科的研究對象。
在創業之初,我們沒有那麼多資金找更多技術大牛,甚至技術熟手,過來面試的大多數都是沒有工作經驗的應屆生。所以我衡量的標準只能是潛力——是否值得培養。除了基礎的編程知識外,我常會跟面試者們聊這些問題:
有沒有自己搭過一個網站?
有沒有學習過一些最新的技術?
你的電腦配置如何?cpu是哪個型號,內存多大?
有沒有拆開過電腦?
手機是iOS還是Android?
iOS怎麼刪除應用,怎麼禁止應用聯網?
Android root過嗎?root過之後為什麼安全性會降低?
如果是機械相關行業的,我還會聊:
汽車是如何啟動的?
公交車的摺疊門是怎麼實現的?
變速自行車是怎麼變速的?
另外,遊戲玩不玩,玩的好壞也可以作為參考哦~
如果面試者帶了電腦,我也會看一下他常用的軟體:
用IE的,呵呵~
有梯子的,不錯~
github,有為~
百度全家桶,這個……
這種衡量方式,從我們的實踐效果來看還是不錯的。我們公司的技術骨幹基本都是自己培養起來的,而且有一半並不是科班出身。
就像踢球有球感,說話有語感一樣,我們公司稱「程序猿」有一種神秘的力量——碼感。
安裝一個新軟體,不需要看說明書,隨便點點就會了。
電腦出問題了,google一下,隨手點點就解決了。
面對黑漆漆的linux窗口,命令在手中滑出,根本停不下來。
對「物體運行原理」的探索精神讓你有機會獲取到「碼感」這種神秘力量,編程自然不在話下。有了這種探索精神,你就有了成為一個程序猿的基礎。
2 邏輯思維
邏輯思維是一種理性認知的思維方式。
有時候我們讀一本書,洋洋洒洒不知所云,合上書後很難有條理地說出這本書的脈絡;
我們讀另一本書,讀罷仍意猶未盡,書中所講層次清晰,我們很容易在大腦中建立書中所講的立體知識框架;
有時候我們聽人講話,滔滔不絕口若懸河,好像塞了滿腦子詞語,卻沒有重點。
我們聽另一個人講話,樸實無華,但是感覺始終圍繞在一根主線,一旦偏離過遠就會被拉回來。
這是我所理解的邏輯思維能力高低的表現。沒有一定的邏輯思維,基本上只能做軟體流水線上的裝配工人。將各種開源、破解的軟體組件集成起來實現一定的功能。而優秀的程序猿所用到的演算法、架構知識,無一不是需要良好的邏輯思維能力的。邏輯思維能力可以是先天具備,也可以是後天培養。衡量邏輯思維能力的一個可靠參考便是數學思維。很多國外的計算機專家都有數學專業學位也就不足為奇了。
在面試技術崗位的時候,對於邏輯思維能力,我通常都是直接讓面試者口述或者手寫演算法。舉個最常用的例子——遞歸:
1 能舉出面對面的兩面鏡子等例子,算是對遞歸的基本理解。
2 能從棧的角度理解遞歸,說明課程上學的還不錯。
3 能從一個問題中提取出具有相似性的功能,並抽象出遞歸函數,說明邏輯思維能力優秀。
探索精神決定了你是否可以成為一名合格的程序猿,決定了程序猿門檻的高度。
邏輯思維決定了你是否可以成為一名優秀的程序猿,決定了程序猿天花板的高度。
說了這麼多,最後我想說,知乎上像我這麼有點責任感的小V不多了,趕緊點贊加關注,支持下唄!
---------------------關於評論--------------------------
雖然贊數還遠遠比不上抖機靈的幾個回答,但是針對幾個評論還是統一回復下:
1 數學不好,怎麼當好程序猿。
數學的邏輯思維是成為一個優秀乃至頂尖程序猿的必備條件,但是並不是人人都有機會成為優秀程序猿的。可能80%的人都只是合格的程序猿,那麼只要具備了探索的精神,肯花費時間去學習,也是可以成為合格的程序猿的,只是說這樣的程序猿在發展到一定階段會遇到瓶頸,而這個瓶頸需要數學基礎來突破的。而且如果我們不涉及到人工智慧等「數學密集」型編程領域,所用到的數學只是也不會特別高深,高中知識基本能滿足大部分需求了。
2 對於一條評論的解釋。
親愛的小V同志, 你的答案很有意思, 也給了大家不少啟發和感慨.
但這個問題畢竟是在討論什麼樣的人才是好的程序員, 而不是在討論什麼樣的人是一家創業中的科技公司的好員工. 如果是後者, 我會給你點贊同的. 但我們在討論的是前者, 所以我不同意你說的探索精神那一部分.
程序員有很多種, 但能說得上好的, 總結起來無非就是兩方面的能力出眾: 分析問題的能力, 和解決問題的能力. 從這兩點上出發, 並沒有要求程序員一定要有出眾的探索精神, 我認識有很多很不錯的程序員, 他們不會翻牆, 還是用IE; 不懂電腦配置是什麼鬼, 不知道自己的手機要怎麼root. 他們就是那些對"事物的運行原理"漠不關心的哪一類人, 但是這不能說明他們不是一個合格的程序員. 他們有些人是只會專註一個方面的內容, 或者說白了, 程序員對他們來說, 僅僅只是一份工作而已, 在工作中他們可以做到認真敬業, 但和工作無關的東西, 他們並不想去了解. 或者他們不合適去你們這樣的公司, 但我們不能否認他們也是優秀的程序員. 事實上, 我們很多台灣和歐美的同僚們, 即使成為了業界的大牛, 卻依然不會修電腦, 每次都要IT部門的人幫忙, 沒有那麼多奇奇怪怪的理由, 只是因為沒必要.而且, 這個世界很大, 不是只有計算機的那點事.
我在這裡寫的這樣, 可能會引起你的反感, 對此我深感抱歉, 但我並沒有任何惡意. 我只是覺得你的答案會讓一部分人對我們這個行業有誤解, 所以我要把一些事實說出來, 僅此而已.
這是本回答下的一次評論,我解釋一下:解決問題的能力是非常重要的,我在回答的開始也提出了。但是只回答「解決問題的能力」在判斷是否適合做程序員這個問題上並沒有太多指導意義。不只程序員需要解決問題的能力,市場拓展、PR公關、醫生很多職業都需要解決問題的能力。而我試圖將「解決問題的能力」這種很抽象的說法具體化,找到可以判定「解決問題能力」大小的衡量標準。
一般來說,對於程序員,解決問題的能力指的是把實際問題進行計算機建模和抽象的能力。
建模和抽象的前提是對問題有充分的理解。這需要一定的探索精神去挖掘問題的運行原理。老闆對程序員說我要開發一個電商網站,程序員總要去探索一個電商網站的運行原理並把運行邏輯研究清楚,否則代碼漏洞很多,網站千瘡百孔,這就是不合格的程序員的作品。探索精神還體現在語言、工具的選擇運用上,python是會用了,但是不懂其基本運行原理不懂其性能限制,我認為作為程序員也是不合格的。
建模和抽象的過程需要有一定的數學基礎和邏輯思維。堆棧的數據結構搞不清楚、邏輯判斷的時候或且非的組合搞不明白,在寫過的代碼中會藏有很多隱患。一些很難調的bug很容易產生。
所以,我用探索精神和邏輯思維來作為」解決問題的能力「的衡量標準。
對於只是把編程當成工作的程序員,可以對編程沒有興趣,也可以不去研究框架的架構,但是同樣需要去深入探索需要解決的問題,探索尋找最佳的解決方案。程序員也不必要都會翻牆、會root、懂電腦配置……但是這些都表現了一個人不怕接觸陌生事物,是一個人具有探索精神的表現。對陌生事物的恐懼是程序員的天敵。
3 公司招人問題
有很多評論提到我們公司的招人問題,有興趣的可以私信我~
看了我的答案,大家覺得能有點啟發,我就心滿意足了;
如果能點個贊,我就萬分感激了;
如果還能加個關注,我就有動力不斷輸出高質量的內容了~
是否抱著一種願意終生學習的人生態度。
從人的角度看。
衡量一份工作是否適合自己的標準至少有三個:你所擅長的、你所喜歡的、對你最有價值的(最能掙錢的)。如果你把世界上所有的工作按自己的標準分類到這三個組裡,理想的狀態是這三個組存在交集上,然後你從這個交集里選一個。然而不幸的是,對有些人來講,這三者的交集為空,還有更不幸的情況是任意兩組交集都為空,最不幸的情況是這三個集合本身都為空。當一個人不知道自己擅長什麼,也不知道自己喜歡什麼,也不知道什麼對最自己的人生最有價值的時候,就屬於這種最不幸的情況。根據題目描述不難推測出:程序員這個職業目前不在題主的擅長集,也不在熱衷集,或許在價值集。
從程序員這個職業的角度看。
判斷一個人是否適合做程序員的標準很多。最關鍵的幾個是:
0. 理解力(或自學的能力):程序員的起點。具有這個能力的特點是,如卡馬克說的:「給我一冰箱的漢堡和互聯網,我就能解決所有問題。」。如果你從小養成了個習慣或思維定勢——覺得沒有老師教就學不會,那你不適合當程序員。如果你學了的東西只是為了過考試,比如學完高中物理還買個仙人掌放電腦前防輻射,你也不適合當程序員。
1. 邏輯思維力(或推衍的能力):這個是做稱職程序員的底線。比如不能寫的代碼出個Exception就抓瞎不知道哪裡出了問題,而是有能力從Exception順藤摸瓜反推出哪裡出了問題。Code即邏輯,Code有問題即邏輯有問題。沒有邏輯的人是無法找到邏輯漏洞的,也寫不出條理清晰的代碼。
2. 抽象思維力:這個能力大體可以決定一個程序員的上限。沒有這個能力是做不出一切皆文件這種抽象的,可以試試學習函數式編程,如果無法理解並使用高階函數,你不適合做程序員。再來幾個更初級的例子。如果你學寫代碼的過程中,理解指針的指針的指針這個東西的時間超過了一天,那你不適合當程序員。(強調一下,這裡不適合是指你無法成為一個優秀的程序員,你想做當然肯定是可以做的。)
3. 專註力:我理解的專註力只是興趣的衍生品,你打Dota打CS打個幾個小時能越打越精神,為什麼?因為你覺得有趣兒。如果也覺得寫代碼有意思,那專註自然就不是個事兒。
4. 想像力與記憶力:這個不是說過目不忘的那種,只是說你大概記得有什麼類,都有什麼函數,每個函數里的大體過程是什麼樣的。然後走路、坐地鐵的時候就可以用想像力在腦子裡做代碼的重構啦,找Bug啦什麼的,然後回到電腦前就噼里啪啦敲代碼。我聽說有人在夢裡也能寫代碼,我還沒有鍛鍊出這個技能。當然,這些能力不是必須的,你隨身帶個筆記本也行,就是效率低些,影響職業成長的上限。
5. 英語:很遺憾地,目前多數有價值的東西都是英文的。所以無障礙閱讀Stackoverflow的回答是起碼的。
6. 閱讀速度:我想不出一個和合適的能力名與之對應。大體是指看書、看網頁、看和理解代碼的速度、如果有需要,能從一大堆Log中迅速找出關鍵信息(當然不是僅僅閱讀速度的問題,還確定於你所能熟練使用的文本處理工具)、能抓到在屏幕上一閃而過的異常訊息(不是說能記住,而是說一眼就能感覺出有些不對勁,然後回去細看。)有不少人也不笨,但是聰明反被聰明誤,從小不怎麼看書,閱讀速度上不去,一個Stackoverflow的回答,有人掃一眼幾秒就抓到重點,有人要看3分鐘。有人看代碼速度,一目十行,再善用佳軟,再加強大的理解力和紮實的基礎知識,找個Bug幾分鐘的事兒,有人看代碼瞪著屏幕一個單詞一個字地看,文件一多就閱讀障礙了,如果理解力再差些,找個同樣的Bug找一上午。當然這個技能不是很核心,因為它無法獨立帶來價值(有人看小說快,但是看代碼慢,就是由於別的核心能力不足,閱讀速度快也沒太大用)。但是這個技能很錦上添花、拉開差距(閱讀速度+理解力=更快的學習能力)。好在這個技能算是可以鍛煉的,只是如果你比別人晚了20年開始鍛煉的話,怕是再努力也要幾年才能追趕上。
7. 溝通:很多人都覺得程序員不需要溝通,其實只是板磚碼農不太需要而已。你起碼要能清楚地解釋自己的方案,更好地溝通是能把自己的好想法推廣出去。當然,如果你1-4都是非常NB的水平,你不溝通也沒有問題。桃李不言,下自成蹊。你一個人把大家的代碼都寫了,你一句話不講,大家也會把你當神的。
以上幾個能力,0-6應該在學校就獲取到80%,7在學校獲取到50%。能把上面幾點全部做到很好的人是極少數,能把其中的2、3點做好大體就算「適合」做程序,能在軟體行業找到合適的崗位了。只是如果只有2、3點能做好,在軟體業的職業發展不會很理想。
如果實在分辨不出哪個適合自己,那就選自己最喜歡做的。你老婆對你說:「老公,晚上回來買一個西瓜,如果看到西紅柿,就買兩個。」
如果你晚上買了一個西瓜和兩個西紅柿回來的話,說明你不適合當程序員。
如果你晚上只買了兩個西瓜回來的話,說明你適合當程序員,但是
。。。
。。。
。。。
。。。
。。。
。。。
。。。
你應該不會有老婆。
=========華麗麗的分割線===========
你們這群程序員也是夠了,一直在吵應該買幾個西瓜,你們這麼吊你們老婆知道嗎?還有很多有經驗的程序猿說應該反覆確認用戶需求的,你們確定你們都能找的到老婆?
我聽到需求時心裡運行的代碼如下:
int 到底買點啥 ( ) {
// 所有把大括弧放到這一行的人都去屎!
int 西瓜的數量 = 1;
if (看到了西紅柿) {
// 注意大括弧的位置
西瓜的數量 = 2;
}
return 西瓜的數量;
}
// 尼瑪,為什麼沒有縮進!!!!
那麼什麼時候該買三個西瓜呢?我們重現一下場景:
你老婆對你說:「傻X,晚上回來買一個西瓜,如果看到西紅柿,就再買兩個。這次你要是還買兩個西瓜回來,我就一輩子都不理你了!」
你仔細揣測了一下她的需求,發現了這個關鍵的「再」字!哈哈哈,這種戰鬥力只有5的渣題怎能難倒我這種top coder!你晚上開開心心地買了三個西瓜回來,跪碎了新買的HHKB pro,老婆還是摔門而去,攔都攔不住!
這次你運行的代碼如下:
int 到底買點啥 ( ) {
// 所有把大括弧放到這一行的人都去屎!
int 西瓜的數量 = 1;
if (看到了西紅柿) {
// 注意大括弧的位置
西瓜的數量 += 2;
}
return 西瓜的數量;
}
謝邀,直接敲代碼就行。
怎麼知道自己是否喜歡素描?怎麼知道自己是否喜歡唱歌?這答案應該不需要問別人吧。
有挺多妹子私信問過我這個問題,但是她們的特點是:都還沒起步。還沒開始敲幾行代碼,就開始擔心以後的職業穩定性,收入,適不適合女生等等問題。
這問題其實你自己敲段時間就有答案了,別浮躁。對我而言,看到自己做出的東西能有種正向激勵所以就一直自學下去了。
題主加油。
- 你喜歡電腦
- 不討厭英文,或者英文還不錯
- 鍛煉身體和理解問題,你喜歡後者多一點
- 比普通人說話少
- 喜歡對頭腦里「看到」的東西問如何做到
- 你喜歡做東西,獨自的
- 屏幕上排好的代碼,對你有神秘的吸引力
- 學生時代似曾有過某種編程的感覺
- 你喜歡電腦超過你喜歡人
那麼你適合做程序員。
支持你自己(https://www.linkev.com/?a_aid=itlr )。
有人說程序員是一個很苦逼的職業,也有人特別嚮往這個很有技術含量的職業。那麼如何確定自己是否適合這項職業,可以將以下幾點作為參考:
1、興趣
適不適合當程序員首先還是看興趣。如果你喜歡寫程序編程,感覺有意思,可以一個人坐一天一直修bug,無論面對的是各種符號、數字,還是英文,都不會覺得心煩。那麼,你是喜歡的。如果你願意去主動學習鑽研,你一定也是喜歡的。
2、邏輯思維
邏輯思維能力強能幫助程序員將他所擁有的知識聯繫起來建立起知識體系,在研發程序或軟體時,在他腦海中建立起一個較為清晰完善的框架。
3、學習能力
學習能力決定著程序員的職業道路能走多遠。互聯網時代更新換代速度快,技術也是隨著發展不斷更新淘汰。你所擅長的技術可能一夜之間就被淘汰掉,因此想要成為一名程序員,甚至是一名優秀的程序員,必須具有良好的學習能力,善於學習,主動學習新技術,否則將會被時代所淘汰。
4、想像力
編程是一項很抽象的活兒,一堆數字、符號、英文字母放在一起,一般人看到的是一堆亂碼,而程序員需要靠自己的知識庫,在大腦中將其轉換成自己的所需的成果。沒有想像力,在編程過程中思路將會受限制,更不用說自主開發程序了。
5、專註力
程序員的日常基本可以算是能一天不說話,自己一個人坐一天去解決問題,碼代碼這樣。遇到問題,能夠一個人冷靜下來去思考如何有效、高效解決,直到解決完問題為止,也就是足夠專註。
在學習正統編譯原理知識之前試著寫個圖靈完備的語言的解釋器,要可以定義變數和函數的那種,一般一星期內寫出來的就比較適合做科學家,不然就只能是個程序員(狹義的)
評論區有我被吊打的記錄,你們可以拿來羞辱我一、
「你好,在嗎?」
「在的,怎麼啦」
看到女神的回復,小張眼前一亮,通宵兩天幫同事敲代碼終於換來了女神的微信,一定要把握住這次機會一舉拿下!看,現在這個開頭就很不錯!
怕女神等太久,小張謹遵網上要用問句打開聊天話題的技巧,迅速回了一條信息。
「沒事沒事,你吃飯了嗎?」
「吃了……剛和你同事去吃了自助烤肉,有點吃多了2333」
自助烤肉?最近不是有報道說自助烤肉很不衛生嗎,還用了不合格的禽類生肉,吃了有可能會感染禽流感啊,可得趕緊提醒下女神!
於是小張趕緊去朋友圈翻到了新聞鏈接,轉發給女神,並且提醒她自助烤肉一定要少吃,不僅不衛生還容易發胖。可惜不知道為什麼,女神這次遲遲沒有回復,小張心裡著急,忍不住又發了一條。
「你在幹什麼呢?」
「啊,這幾天降溫,有點感冒,在找家裡有沒有感冒藥了=。=」
「感冒病毒吃藥是沒太大作用的,你多喝熱水啊!早點休息,多喝熱水好得快!」
隔了幾分鐘,女神回復了小張一個表情包。
小張心裡想,女神真是幽默,既然她不舒服就別打擾她了,讓她好好休息。回了個「晚安88」後心滿意足地捧起身邊的《程序員撩妹指南》。
這個故事演變到現實中,大概是下圖這種情況:
黑客哥哥實力演繹什麼叫「憑本事單的身」,當然小慕相信,一個會講脫口秀的實力派程序員,火了之後脫單難度應該不高,如果他願意換掉格子馬甲的話……言歸正傳,你是小張這樣可愛耿直不知道怎麼跟女生聊天的鋼鐵直男的話,那麼你已經融入程序員這個圈子一大半了。
二、
24歲的小王最近深陷憂慮,明明自己還不到而立之年,髮際線卻身先士卒接受了歲月的摧殘——快長到後腦勺了。
上班的時候,他一邊敲著代碼,一邊忍不住摸自己越來越亮的腦門,看著前面工位頭髮烏黑濃密的前輩,小王下定決心,就算這個問題很難以啟齒也一定要取取經,面子肯定沒有顏值重要啊!
剛問完前輩就聽到手機振動,小王趕緊摸出手機打開微信,只見前輩給他推送了一個鏈接——植髮的秘密!想植髮,來XXXX醫院。
Emmmmm……
「小王啊,你最近一個月項目那邊忙不忙,都幾點睡?」
「我這個月還好,一般到晚上十點十一點左右就能忙完。」
「哎,我這個月真是慘,這周都沒一點前睡過覺了,感覺得去買點東西補補腎。你那邊要是有啥好產品,記得推給我啊!」
「好……」
小王關掉微信,心裡很惆悵,只能點上一根煙接著敲起了代碼。晚上他做了一個夢,夢到公司給所有人發了一頂嶄新的假髮,大家特別開心地說自己終於擁有了絲般順滑的黑髮,公司還出資讓他們每個人去換一個功能強大的人工腎,公司內外都充滿了歡樂的氣息……
要做程序員,你得有一個健康的體魄來應對高強度的工作,尤其是頭髮和腎。
三、
「天啊這詭異的bug到底是哪來的???」
小李欲哭無淚,感覺自己即將乘風歸去,扶搖直上九萬里。他揉揉眼睛,覺得可能就是自己能力不足吧,這個bug再給他十年時間可能也解決不了了……
「X他X的終於成了!」突然身後傳來一聲大喊,小李回頭一看,是同樣被一個莫名bug折磨了一天的同事,他之前坐在椅子中噼里啪啦敲鍵盤兩個多小時,期間自己叼了一根煙一直沒有點燃都不知道,現在看來終於解決了問題。
苦不苦,想想紅軍兩萬五。
作為程序員的驕傲突然湧上心頭,不解決這個bug,自己無顏面對江東父老。小李感覺一股神秘的力量出現,就像吃了菠菜的大力水手,自己還能再戰十個回合。
「X他X的終於成了!」數小時後,又是一聲歡呼。
每個程序員與bug都有一段聞者傷心見者流淚的血淚史。程序員與bug的關係,大概就是你是風兒我是沙,纏纏綿綿到天涯。bug沒有解決,結什麼婚,娶什麼老婆!
沒有這種置婚禮於腦後捨我其誰與bug艱苦鬥爭的不服輸的精神,你怎麼做好一個程序員?
四、
以上都是誇張說法,其實大家對於程序員的認識有一定誤解,他們並不都是穿著樸素很無趣刻板的人。在慕課網的講師中,就有熱愛健身、肱二頭肌發達的程序員,也有愛化妝愛打扮的程序媛,更有說話風趣、撩妹一套一套的食物鏈頂層程序員。
不過,他們也有很多共通點:
專註力——弱水三千,只取一瓢飲。人的精力是有限的,絕大部分人要專註於一件事才能有所成就,編程時同樣需要程序員的專註力;
自學能力——問渠那得清如許,為有源頭活水來。這是一門硬功夫,講究的是舉一反三、融會貫通,而不是單純以學習時間來衡量自己學習的價值;
落實能力——Talk is cheap, show me the code.這句話是Linux內核的發明人Linus Torvalds說的,意思是:說說很簡單,給我代碼。有知乎大神將其翻譯為「廢話少說,放碼過來」;
好奇心——熱愛未知,如熱愛清晨和星空。樂于思考輪子如何轉起來的,是成為一個優秀程序員必須具有的精神。
……
這些美好的特質都與成為一個優秀的程序員息息相關,當然,最重要的一點就是熱愛——熱愛代碼,熱愛編程,熱愛解決bug時的成就感,熱愛為之奮鬥的日日夜夜。
如果題主你擁有對程序員職業的熱愛,就不必猶豫太多,成為可愛又迷人的程序員,麵包和老婆都會有的~
最後,雙十一要到了,小慕也為廣大程序員朋友們準備了禮物,歡迎大家積极參加活動贏取獎品哦~
活動詳情請戳→慕課網11.11狂歡趴開始了,程序員快來!!
子「爸,我想當程序員。」
父「哦,那你先買40公斤麵粉來!」
子「啊?為什麼?我一個人怎麼搬?」
父「自己想辦法。20分鐘之內搞定!」
子「時間也太短了吧!」
父「還有,不要麵粉了。要低筋粉。還剩5分鐘。」
子「要求變太多了吧!」
父「兒啊,我看你當不了程序員。」
——Twitter.StarKnight 譯
摘自朋友圈...
#################分割線###############
感覺要破百,第一次。事先感謝下點贊的朋友們和發此朋友圈的哥們。
會不會更完這條就再也沒人點贊了……
#################再割################
誠惶誠恐,第一次這麼多贊,其實有點歪樓,像各位大神說的,確實乙方的狀態都差不多,只是在不同行業上具體實現形式上有所不同。
所以不管做什麼,個人認為還是興趣最重要,在這種工作狀態下,就算對本身工作興趣十足,到最後都有可能被磨的不想幹了;那麼,如果沒有興趣,可能真的就呵呵了。
如果題主說,就是不知道自己興趣是什麼,才這麼問,那真的,哎。各路大神有好多已經答了這個行業大概是在幹什麼,剩下的,多去了解,多思考,多做,多體會。
最後祝題主早日找到自己的興趣點,好好堅持。我在另一個問題下的答覆。我始終認為喜歡編程是成為優秀程序員的必要條件
………………
題主,你知道什麼是喜歡編程嗎?
喜歡就是當你無聊的時候,拿起編程的書能像看小說一樣看的津津有味。
喜歡就是當你坐在馬桶上突然想到技術問題一坐一個小時,別人差點以為你出事。
喜歡就是編起程序來,從早上編到深夜,午飯晚飯都忘了吃,連廁所都沒上。
喜歡就是為了完成項目,連續72小時不合眼,完成後連續睡了20小時。
這些事情,我都干過。所以我無法理解一個號稱喜歡編程的人會懶。講得好複雜, 至少做起來不需要繞彎子, 下面是 CoffeeScript 的文檔,
雖然是有點過氣的技術, 但是從設計清晰和實用來看是目前最輕鬆的,
給你一個星期時間, 不管是自學, 還是看視頻, 還是問人, 一個星期內看下自己能不能寫程序出來:
CoffeeScript 中文
如果看完我司這句slogan後你會產生性衝動的話,那麼恭喜你,你找到了答案。
曾經大學畢業面試的時候,被問到為什麼認為自己適合做程序員?
我當時講了一個實際的例子。
我說,我玩遊戲一般到晚上十點十一點就困了,幾乎沒法堅持到過半夜。寢室同學拉著去通宵,我從來不參與,因為後半段根本提不起精神。
但有一次,我寫一個小程序,遇到各種問題,不斷嘗試解決,當我終於達到自己想要的效果的時候,發現窗外天已經開始發白了。看了看錶,凌晨4點鐘……
推薦閱讀:
※為什麼尾遞歸優化似乎不常出現在非函數式語言的解釋器、編譯器中?
※怎樣讀《C++ 編程思想》?
※本人從事前端,想學習一門後端語言,求大神推薦?
※學習經濟學需要熟悉哪些編程語言?
※哪些 Python 庫讓你相見恨晚?