作為一個程序員需要學多少技能?


其實只需要唯一的一個技能,搜索能力

你可以看到,人肉搜索的起源地貓撲,其實就是中文互聯網最早的幾個有閑程序員聚集地。

大家都說,程序世界變化快,你的學習能力是啥?是上課?誰讓你上課哦,當然是你搜索技術的能力。

百度誰不會用啊?

嘿,筆誰不會用?你寫得出諾貝爾文學獎作品?

強大的搜索能力才是現今互聯網社會當中,程序員必須的能力。

簡單來說,那麼多那麼多的技術問題,99%都可以在互聯網上搜索到,為什麼還會有不停地問?因為他搜不到。

springMVC和spring的關係清清楚楚擺在spring官網上,為什麼還那麼多人搞不清楚?因為他搜不到。

搜索能力分為兩塊

1,存疑

2,搜索

存疑能力你必須有,你要時刻確定,我這個知識,理解,是不是正確的,這點上恰恰是你outstanding於80%的人的一個重點,只有你存疑了,你才會去搜索,你確定的事情,你是不會去搜索的

搜索能力其實大部分人差很多,你常常聽到有人說,這個是我網上搜來的。好,請問,哪個網?怎麼搜的?關鍵詞是什麼?回答是哪裡來的?知網,貼吧,知乎,豆瓣,網上這麼多這麼多內容,你看到一條就認為他是對的,這就是普通小白。你搜一個科學知識,卻在百度民科吧找到答案,明顯就是錯的。你搜一條醫學知識,卻去看了XX系,命都懸。

搜索能力包含了選取正確的關鍵詞,篩選信息來源,摒棄無用資料來源,double confirm同一知識的不同來源,搜索原始數據支持論點,搜索論據而非論點,衍生搜索提供知識的人等一系列操作。

比如我搜索一個技術解決方案,在中文網路我一搜,我發現有幾篇排名靠前的博客,我會先看這個博客主的技術經歷,很多都是學生到處抄抄,這些我就過濾掉,其次我看這些博客的排版,如果排版混亂,多數是複製黏貼的,我也pass,當我看到一個文章初步來看沒問題,我還要看看日期,這是不是比較新的,太舊的可能已經過時。在初步確定以後,我還會拿這篇文章的關鍵詞去英文網路查一下,看看有沒有類似的問題和解決方案存在,相互印證了之後,才會把它放到備選知識庫當中,然後自己親手試驗,如果確定無誤,我才確認這個信息是準確的。

貼個萌新三連,很好的解釋了搜索能力的關鍵點


謝邀。

1. 學好"物理"。 基礎演算法和數據結構。是計算機世界的基本定律,是程序問題的終極答案;

2. 學好「化學」。 各類系統和語言的關鍵性質,提供能寫出優秀程序的原料;

3. 學好「生物」。 不同的技術構成不同的生態系統,不同的生態系統有不同的規則。程序符合生態系統環境,才能長成參天大樹。

4. 學好「歷史」。 技術從哪裡來,要到哪裡去;

5. 學好「文學」。 寫明白文檔,表達好邏輯,起得好名字,用得好隱喻;

6. 學好「建築」。 鋼鐵,水泥,腳手架,防災,抗壓,無單點,架構是系統的核心;

7. 學好「藝術」。 寫程序對得起自己的眼睛,做產品對得起用戶。

8. 學好「經濟」。 成本、收益和時間幫助你做編程時的主要決策。

編程世界是真實世界的縮影。程序員要做的就是先「高中」畢業,然後選擇一個最擅長的專業繼續深造。


學習能力和分析、解決問題的能力是一切能力的根本。
最終取決於你的需求: 如果你只是想找個幹活兒的,那麼直接給他個任務看看他能不能自己獨立搞定就行了。但如果你是準備培養一個技術骨幹,那麼就要重點考察那些更加根本性的能力。
舉個極端點的例子: 一個編程很熟練,但是都理解不了 DI 的設計目的和原理的老程序員,和一個啥也不會,但是我給他一個要解決的問題和約束,他能自然推導出一個 DI-like 方案的新程序員,我如果要找技術骨幹,毫無疑問會選擇後者。但是如果我只是要找個幹活兒的,最多用一年就不準備再續約的程序員,那麼可能會考慮選擇前者(當然,如果後者表現出強大的學習能力和一定的勤奮,我仍然會優先選擇後者)。


如果單純的說技術,那麼作為一個程序員需要學多少技能?這個問題的答案是「無限多的技術」。

軟體開發是一個跨度很大的技術工作,在語言方面,有C,C++,Java,Ruby等等等等,在環境方面,又分嵌入式,桌面系統,企業級,WEB,基礎系統,或是科學研究。

但是,不管是什麼的情況,總是有一些通用的基本職業技能。這些最基本的職業技能通常決定了一個程序員的級別,能否用好這些技能,直接關係到了程序員的職業生涯。

下面是程序員所應該具備的基本職業技能:

閱讀代碼、編寫程序、使用IDE、使用版本控制、單元測試、軟體設計、熟悉軟體工程、使用程序庫或框架、程序調試、重構代碼、自動化編譯。

但是隨著時間的推移,會有更多的技能出來。所以說,單純的說技術,這是個無底洞。活到老學到老。作一個真正合格的程序員,還應該具有這些基本素質。

1、學習和總結的能力

程序員是人才很容易被淘汰,很容易落伍的職業,因為一種技術可能僅僅在三兩年內具有領先性,程序員如果想安身立命,就必須不斷跟進新的技術,學習新的技能。

善於學習,對於任何職業而言,都是前進所必需的動力,對於程序員,這種要求就更加高了。善於總結,也是學習能力的一種體現,每次完成一個研發任務,完成一段代碼,都應當有目的的跟蹤該程序的應用狀況和用戶反饋,隨時總結,找到自己的不足,這樣逐步提高,一個程序員才可能成長起來。

2、團隊精神和協作能力

把它作為基本素質,並不是不重要,恰恰相反,這是程序員應該具備的最基本的,也是最 重要的安身立命之本。把高水平程序員說成獨行俠的都是在囈語,任何個人的力量都是有 限的,即便如linus這樣的天才,也需要通過組成強大的團隊來創造奇蹟。

3、測試習慣

作為一些商業化正規化的開發而言,專職的測試工程師是不可少的,但是並不是說有了專職的測試工程師程序員就可以不進行自測;軟體研發作為一項工程而言,一個很重要的特點就是問題發現的越早,解決的代價就越低,程序員在每段代碼,每個子模塊完成後進行 認真的測試,就可以盡量將一些潛在的問題最早的發現和解決,這樣對整體系統建設的效率和可靠性就有了最大的保證。

4、復用性,模塊化思維能力

經常可以聽到一些程序員有這樣的抱怨,寫了幾年程序,變成了熟練工,每天都是重複寫一些沒有任何新意的代碼。復用性設計,模塊化思維就是要程序員在完成任何一個功能模塊或函數的時候,要多想一些,不要局限在完成當前任務的簡單思路上,想想看該模塊是否可以脫離這個系統存在,是否可以通過簡單的修改參數的方式在其他系統和應用環境下直接引用,這樣就能極大避免重複性的開發工作,如果一個軟體研發單位和工作組能夠在每一次研發過程中都考慮到這些問題,那麼程序員就不會在重複性的工作中耽誤太多時間,就會有更多時間和精力投入到創新的代碼工作中去。

歡迎關注我的微信公眾號:九章演算法(ninechapter),幫助你了解IT技術前沿,通過面試、拿到offer、找到好工作!


有兩個基本技能會貫穿你的職業生涯,時刻提醒自己強化這兩個能力總會讓你的生活更美好。而且是無論任何時候,怎麼強調都不為過的,即使是老手也經常在這兩件事上犯錯誤。

  1. 學會使用google。當你寫了一段代碼,編譯一個開源代碼,或者安裝某個軟體,遇到意想不到的問題的時候,第一時間把錯誤信息貼到google上,99%的時候你會發現早已經有人提出過相同的問題,解決方法就在第一條搜索結果。甚至當你犯下rm -rf /這樣的錯誤時,驚慌之前記得先問google,你會發現世界末日比你想像的要遠。
  2. 學會使用列印語句(printf,println等)。你的程序運行結果和自己想的不一樣?放棄之前先老老實實在每一步的中間狀態,把重要的變數值清清楚楚地列印出來。不要想當然的以為那些值一定計算正確。99%的時候當你第一眼看到那些列印出來的結果時,就會明白問題出在哪了。不是每個語言都有強大的IDE讓你可以設斷點單步調試,有些時候你甚至得在遠程的linux主機上調試程序,但是列印語句永遠都可以使用。這是最笨的方法,但卻是永遠有效的方法,不論你的程序有多麼複雜,運行在哪裡。

在你的程序員生涯里會不斷學習到新的酷炫技能,但是相信我,不會有任何一個能給你帶來超過這兩個基本技能的收益。尤其是在遇到問題時,問問自己,這兩點都做到了嗎?


我上班第一天我的老闆讓我做的第一件事
看兩篇文章:
程序員隨想
雷軍
我不是天生的程序員,也並非天生就喜歡電腦,上高中時也沒有想過將來會當程序員,接觸電腦純屬偶然--小時候的一個好朋友上大學時選擇了電腦專業,為了和這個朋友有更多的「共同語言」我便選擇了計算機系。在大學,我略窺電腦世界,開始為之「發燒」;畢業後,開始了一個程序員的職業生涯。
從開始寫程序到現在快十年了,寫過的程序不少。從這些年的風風雨雨中走過來,不能不有些體會。說到體會,最大的體會就是這條路太漫長。
一、一輩子有你 苦一點也願意
我沒有奢望大家把寫程序和文學創作相提並論,但其中的苦楚卻不是一個普通用戶能夠體味的。為了寫好一個程序,我們度過太多不眠之夜。有個朋友如此評價道,「寫程序簡直是在自殺,巨費精力巨費腦子巨累」。但還是有許多人不畏其苦,前仆後繼。
我剛接觸到電腦就發現電腦的妙處:電腦遠沒有人那麼複雜,如果你的程序寫得好,你就可以和電腦有著非常融洽的關係,就可以指揮電腦幹你想乾的事,這個時候,你是十足的主宰。每每坐在電腦面前,你就如同在一個王國里巡行。
電腦里的世界很大,程序員是活在自己想像的王國里。你可以細微到電腦里的每一個位元組、每一個比特的東西。
這樣的日子簡直就是天堂般的日子,很多人都愛上了這樣的日子。
不少人認為程序員最多干到三十五歲就可以收山,腦子也差不多該歇歇了,並認為寫程序是年輕人的事情,到了一定年齡,估計沒什麼人再當程序員。
我剛畢業時,意氣風發,也想先吃點苦,到了三十歲就不幹了。年長一點後就發現了自己的無知。一個人大學畢業就二十一二歲,技術成熟一點後可能二十五,接著就是票子、妻子和房子等等諸多忙不完的事情。一切搞掂的時候,也許就是三十五歲。如果三十五歲就放棄的話,我們就不用選擇程序員的道路。
電腦進入我國時間不短,但真正大規模開始用,還是八五年PC登陸我國時候的事。因此國內真正寫電腦程序的人最長也就寫了十幾年(不知道是否還有這樣的人)。由於電腦應用在國內時間比較短,國內程序開發的主力以三十五歲以下的年輕人為主,但這並不表示程序員如同紅粉佳人般的容易衰老。美國和台灣地區的開發者以三四十歲的人為主。開始寫程序的時候,我們覺得沒有什麼不能做的(現在還能聽到這樣的豪言壯語),而且更要命的是,好象我們特別聰明,特別適合開發軟體,比老外強得多。當我們真正接觸那些傑出的國外開發人員的時候,發現他們太厲害了,都有十多年的開發經驗,絕對多數的產品出自這些有豐富開發經驗的程序員之手。
畢業後,編程不僅僅是愛好,而且成了一輩子的工作,可以肯定會幹一輩子,雖然我沒有打算一生只干這一件事。用一生來編程是一件既容易又困難的事。如果碌碌無為,為交差寫點程序,這樣寫兩輩子的人都有。但如果想全身心地寫程序,寫十年都不是一件容易的事。現在我的不少朋友都洗手了,有時我也有這種想法,但一旦面對電腦,立刻頓悟:電腦還是自己最擅長乾的事,也是最順手的事。
二、我的未來不是夢
有的人刻苦學習編程技術,努力提高編程水平,並把高級程序員作為追求的目標,甚至是終身的奮鬥目標。後來參與了真正的商品化軟體開發後,感到非常困惑和茫然。
當我上大學的時候,高級程序員也曾是我的目標。當時,我通過等級考試獲得了高級程序員證書,並在自己的名片上印上「高級程序員」的字樣。後來,我的水平提高了,似乎也成了大家認可的好程序員了。這個時候我卻開始茫然。我希望我的技術能得到別人的承認,當得到別人的承認後,我又能如何呢?後來我發現,無論成為多麼高級的程序員都沒用,關鍵是是否能夠出想法、出產品,你的勞動是否能被社會承認,是否能為社會創造財富。
我的未來是明確的,開發出高質量的適用社會的產品,為社會創造財富。
三、每一個程序都是藝術品
有人認為程序員沒有什麼了不起,不過是一種熟練工種而已;也有人把編程說成是藝術創作,捧上天。這兩種意見爭論比較激烈,甚至可以說針鋒相對。
我們換個工種來看,石匠應該是熟練工種,跟藝術似乎沾不上邊。;但正是這些石匠,給我們留下了數不勝數的文物古迹,如樂山大佛、莫高窟等等。應該說這此石匠給我們留下了無窮的文化財富。我認為編程的工作和石匠比較相似,是技術,也是藝術。
現代軟體工業已具相當規模,很多軟體的完成需要的是大兵團作戰。一名精通程序員接受編寫某一塊的任務後,往往只是寫代碼,發揮的餘地很小。在大項目中,很多程序員只能了解到和自己所編模塊相關的很局部的細節,另外還受到開發環境的限制,真的很難體會到自己在從事「藝術」創造,更多的時候是感到自己在從事重體力勞動。有的時候還擔心自己苦苦參與的這個項目究竟有沒有意義,是不是在同類產品中有競爭力,會不會開發出來以後就因為硬體的發展、操作系統的換代而過時......
編程是技術活,才有可能大規模進行,才會有軟體工程的理論。也正是編程具備藝術創作的特點,我們的生活才會有如此多的好軟體產品。寫一個程序需要付出腦力和體力,當我—我們—某個群體完成一個程序之後,在我們的眼裡,每一個程序就都是藝術品。

程序員應具備的素質
前言
程序員是一種技術工作,在IT的發展中有相當重要的地位,從底層硬體通訊協議的建立, 到數據傳輸層的處理,到操作系統的建設,到資料庫平台的建設,一直到應用層上各種數 據營銷平台的搭建,程序員在裡面都扮演著舉足輕重的角色並為IT事業的發展做出了巨大 的貢獻。

中國有很多精於編碼的人,但是中國軟體行業,尤其是網路應用開發方面誤區很大,很難形成有規模的軟體開發力量和產品能力,不但比美國差距甚遠,和印度相比也是頗有不 如。這些問題不是在於中國程序員的智商和工作努力狀況,也不是在於國家和民間對開發 的投入程度,而是很大程度上,有一些對技術,對程序開發,對項目設計方面的思想誤 區,這些誤區,導致了軟體行業的產品化能力不足,缺乏規模化和大型復用系統研發能 力,可以說,改變認識誤區,是解決軟體行業小作坊模式和個體英雄模式所帶來的局限性 的重要工作。

中國有很多小朋友,他們18,9歲或21,2歲,通過自學也寫了不少代碼,他們有的代碼寫的很漂亮,一些技術細節相當出眾,也很有鑽研精神,但是他們被一些錯誤的認識和觀點左右,缺乏對系統,對程序的整體理解能力,這些人,一個網上的朋友說得很好,他們實際 上只是一些Coding fans,壓根沒有資格稱為程序員,但是據我所知,不少小網路公司的 CTO就是這樣的coding fans,拿著嚇人的工資,做著嚇人的項目,項目的結局通常也很嚇人。

一、程序員基本素質
作一個真正合格的程序員,或者說就是可以真正合格完成一些代碼工作的程序員,應該具有的素質。
1:團隊精神和協作能力
把它作為基本素質,並不是不重要,恰恰相反,這是程序員應該具備的最基本的,也是最 重要的安身立命之本。把高水平程序員說成獨行俠的都是在囈語,任何個人的力量都是有 限的,即便如linus這樣的天才,也需要通過組成強大的團隊來創造奇蹟,那些遍布全球 的為linux寫核心的高手們,沒有協作精神是不可想像的。獨行俠可以作一些賺錢的小軟 件發點小財,但是一旦進入一些大系統的研發團隊,進入商業化和產品化的開發任務,缺 乏這種素質的人就完全不合格了。
2:文檔習慣
說高水平程序員從來不寫文檔的肯定是乳臭未乾的毛孩子,良好的文檔是正規研發流程中 非常重要的環節,作為代碼程序員,30%的工作時間寫技術文檔是很正常的,而作為高級 程序員和系統分析員,這個比例還要高很多。
缺乏文檔,一個軟體系統就缺乏生命力,在未來的查錯,升級以及模塊的復用時就都會遇 到極大的麻煩。

3:規範化,標準化的代碼編寫習慣
作為一些外國知名軟體公司的規矩,代碼的變數命名,代碼內注釋格式,甚至嵌套中行縮 進的長度和函數間的空行數字都有明確規定,良好的編寫習慣,不但有助於代碼的移植和 糾錯,也有助於不同技術人員之間的協作。
有些coding fans叫囂高水平程序員寫的代碼旁人從來看不懂,這種叫囂只能證明他們自 己壓根不配自稱程序員。代碼具有良好的可讀性,是程序員基本的素質需求。
再看看整個linux的搭建,沒有規範化和標準化的代碼習慣,全球的研發協作是絕對不可 想像的。

4:需求理解能力
程序員需要理解一個模塊的需求,很多小朋友寫程序往往只關注一個功能需求,他們把性 能指標全部歸結到硬體,操作系統和開發環境上,而忽視了本身代碼的性能考慮,有人曾 經放言說寫一個廣告交換程序很簡單,這種人從來不知道在百萬甚至千萬數量級的訪問情 況下的性能指標是如何實現的,對於這樣的程序員,你給他深藍那套系統,他也做不出太 極鏈的並訪能力。性能需求指標中,穩定性,並訪支撐能力以及安全性都很重要,作為程 序員需要評估該模塊在系統運營中所處的環境,將要受到的負荷壓力以及各種潛在的危險 和惡意攻擊的可能性。就這一點,一個成熟的程序員至少需要2到3年的項目研發和跟蹤經 驗才有可能有心得。
5:復用性,模塊化思維能力
經常可以聽到一些程序員有這樣的抱怨,寫了幾年程序,變成了熟練工,每天都是重複寫 一些沒有任何新意的代碼,這其實是中國軟體人才最大浪費的地方,一些重複性工作變成 了熟練程序員的主要工作,而這些,其實是完全可以避免的。

復用性設計,模塊化思維就是要程序員在完成任何一個功能模塊或函數的時候,要多想一 些,不要局限在完成當前任務的簡單思路上,想想看該模塊是否可以脫離這個系統存在, 是否可以通過簡單的修改參數的方式在其他系統和應用環境下直接引用,這樣就能極大避 免重複性的開發工作,如果一個軟體研發單位和工作組能夠在每一次研發過程中都考慮到 這些問題,那麼程序員就不會在重複性的工作中耽誤太多時間,就會有更多時間和精力投 入到創新的代碼工作中去。

一些好的程序模塊代碼,即便是70年代寫成的,拿到現在放到一些系統裡面作為功能模塊 都能適合的很好,而現在我看到的是,很多小公司軟體一升級或改進就動輒全部代碼重 寫,大部分重複性工作無謂的浪費了時間和精力。
6:測試習慣
作為一些商業化正規化的開發而言,專職的測試工程師是不可少的,但是並不是說有了專 職的測試工程師程序員就可以不進行自測;軟體研發作為一項工程而言,一個很重要的特 點就是問題發現的越早,解決的代價就越低,程序員在每段代碼,每個子模塊完成後進行 認真的測試,就可以盡量將一些潛在的問題最早的發現和解決,這樣對整體系統建設的效 率和可靠性就有了最大的保證。

測試工作實際上需要考慮兩方面,一方面是正常調用的測試,也就是看程序是否能在正常 調用下完成基本功能,這是最基本的測試職責,可惜在很多公司這成了唯一的測試任務, 實際上還差的遠那;第二方面就是異常調用的測試,比如高壓力負荷下的穩定性測試,用 戶潛在的異常輸入情況下的測試,整體系統局部故障情況下該模塊受影響狀況的測試,頻 發的異常請求阻塞資源時的模塊穩定測試等等。當然並不是程序員要對自己的每段代碼都 需要進行這種完整測試,但是程序員必須清醒認識自己的代碼任務在整體項目中的地位和 各種性能需求,有針對性的進行相關測試並儘早發現和解決問題,當然這需要上面提到的 需求理解能力。
7:學習和總結的能力
程序員是人才很容易被淘汰,很容易落伍的職業,因為一種技術可能僅僅在三兩年內具有 領先性,程序員如果想安身立命,就必須不斷跟進新的技術,學習新的技能。
善於學習,對於任何職業而言,都是前進所必需的動力,對於程序員,這種要求就更加高 了。
但是學習也要找對目標,一些小coding fans們,他們也津津樂道於他們的學習能力,一 會學會了asp,一會兒學會了php,一會兒學會了jsp,他們把這個作為炫耀的資本,盲目 的追逐一些膚淺的,表面的東西和名詞,做網路程序不懂通訊傳輸協議,做應用程序不懂 中斷向量處理,這樣的技術人員,不管掌握了多少所謂的新語言,永遠不會有質的提 高。
善於總結,也是學習能力的一種體現,每次完成一個研發任務,完成一段代碼,都應當有 目的的跟蹤該程序的應用狀況和用戶反饋,隨時總結,找到自己的不足,這樣逐步提高, 一個程序員才可能成長起來。
一個不具備成長性的程序員,即便眼前看是個高手,建議也不要選用,因為他落伍的時候 馬上就到了。
具備以上全部素質的人,應當說是夠格的程序員了,請注意以上的各種素質都不是由IQ決 定的,也不是大學某些課本里可以學習到的,需要的僅僅是程序員對自己工作的認識,是一種意識上的問題。

二、高級程序員/項目設計者還需具備的素質
那麼作為高級程序員,以至於系統分析員,也就是對於一個程序項目的設計者而言,除了應該具備上述全部素質之外,還需要具備以下素質:
第一,需求分析能力
對於程序員而言,理解需求就可以完成合格的代碼,但是對於研發項目的組織和管理者, 他們不但要理解客戶需求,更多時候還要自行制定一些需求,為什麼這麼說呢?
一般而言,進行研發任務,也許是客戶提出需求,也許是市場和營銷部門提出的需求,這 時候對於研發部門,他們看到的不是一個完整的需求,通常而言,該需求僅僅是一些功能 上的要求,或者更正規些,可能獲得一個完整的用戶視圖;但是這都不夠,因為客戶由於 非技術因素多一些,他們可能很難提出完整和清晰,或者說專業性的性能需求,但是對於 項目組織者和規劃者,他必須能夠清醒認識到這些需求的存在並在完成需求分析報告的時 候適當的提出,同時要完整和清晰的體現在設計說明書裡面,以便於程序員編碼時不會失 去這些準則。
程序設計者必須正確理解用戶需求所處的環境,並針對性做出需求的分析,舉例而言,同 樣一個軟體通過ASP租用方式發布和通過License方式發布,性能需求可能就是有區別的, 前者強調的是更好的支撐能力和穩定性,而後者則可能更強調在各種平台下的普適性和安 裝使用的簡捷性。
第二,項目設計方法和流程處理能力
程序設計者必須能夠掌握不少於兩到三種的項目設計方法(比如自頂至下的設計方法,比如快速原型法等等),並能夠根據項目需求和資源搭配來選擇合適的設計方法進行項目的 整體設計。
設計方法上選擇不當,就會耽誤研發周期,浪費研發資源,甚至影響研發效果。
一個程序設計者還需要把很多功夫用在流程圖的設計和處理上,他需要做數據流圖以確立 數據詞典;他需要加工邏輯流圖以形成整體的系統處理流程。
一個流程有問題的系統,就算代碼多漂亮,每個模塊多精緻,也不會成為一個好的系統。 當然,做好流程分析並選擇好項目設計方法,都需要在需求分析能力上具有足夠的把 握。
第三,復用設計和模塊化分解能力
這個似乎又是老調重談,前面基本素質上不是已經說明了這個問題嗎?
作為一個從事模塊任務的程序員,他需要對他所面對的特定功能模塊的復用性進行考慮, 而作為一個系統分析人員,他要面對的問題複雜的多,需要對整體系統按照一種模塊化的 分析能力分解為很多可復用的功能模塊和函數,並針對每一模塊形成一個獨立的設計需 求。舉個例子,好比是汽車生產,最早每輛汽車都是獨立安裝的,每個部件都是量身定做 的,但是後來不一樣了,機器化大生產了,一個汽車廠開始通過流水線來生產汽車,獨立 部件開始具有一定的復用性,在後來標準化成為大趨勢,不同型號,品牌甚至不同廠商的 汽車部件也可以進行方便的換裝和升級,這時候,汽車生產的效率達到最大化。軟體工程 也是同樣的道理,一個成熟的軟體行業,在一些相關項目和系統中,不同的部件是可以隨 意換裝的,比如微軟的許多桌面軟體,在很多操作模塊(如打開文件,保存文件等等)都 是復用的同一套功能模塊,而這些介面又通過一些類庫提供給了桌面應用程序開發者方便 掛接,這就是復用化的模塊設計明顯的一個佐證。

將一個大型的,錯綜複雜的應用系統分解成一些相對獨立的,具有高度復用性的,並能僅 僅依靠幾個參數完成數據聯繫的模塊組合,是作為高級程序員和系統分析員一項最重要的 工作,合適的項目設計方法,清晰的流程圖,是實現這一目標的重要保證。
第四,整體項目評估能力
作為系統設計人員,必須能夠從全局出發,對項目又整體的清醒認識,比如公司的資源配 置是否合理和到位,比如工程進度安排是否能最大化體現效率又不至於無法按期完成。評 估項目整體和各個模塊的工作量,評估項目所需的資源,評估項目可能遇到的困難,都需 要大量的經驗積累,換言之,這是一種不斷總結的累計才能達到的境界。在西方一些軟體 系統設計的帶頭人都是很年長的,比如4,50歲,甚至更老,他們在編碼方面已經遠遠不 如年輕人那樣活絡,但是就項目評估而言,他們幾十年的經驗積累就是最重要和寶貴的財 富。中國缺這麼一代程序員,主要還不是缺那種年紀的程序員,而是那種年紀的程序員基 本上都是研究單位作出來的,都不是從專業的產品化軟體研發作出來的,他們沒有能積累 那種產品化研發的經驗,這也是沒有辦法的事情。
第五,團隊組織管理能力
完成一個項目工程,需要團隊的齊心協力,作為項目設計者或研發的主管人,就應當有能 力最大化發揮團隊的整體力量,技術管理由於其專業性質,不大同於一般的人事管理,因為這裡面設計了一些技術性的指標和因素。
首先是工作的量化,沒有量化就很難做到合適的績效考核,而程序量化又不是簡單的代碼 行數可以計算的,因此要求技術管理人員需要能真正評估一個模塊的複雜性和工作量。
其次是對團隊協作模式的調整,一般而言,程序開發的協作通常分為小組進行,小組有主 程序員方式的,也有民主方式的,根據程序員之間的能力水平差距,以及根據項目研發的 需求,選擇合適的組隊方式,並能將責權和成員的工作任務緊密結合,這樣才能最大發揮 組隊的效率。
一個代碼水平高的人,未必能成為一個合格的項目研發主管,這方面的能力欠缺往往是容 易被忽視的。

綜上可以看到,作為一個主管研發的負責人,一個項目設計者,所需要具備的素質和能力 並不是程序代碼編寫的能力,當然一般情況下,一個程序員通過不斷的總結提高達到了這種素質的時候,他所具有的代碼編寫能力也已經相當不簡單了,但是請注意這裡面的因果 關係,一個高水平的項目設計者通常已經是代碼編寫相當優秀的人了,但是並不是一個代 碼相當優秀的程序員就可以勝任項目設計的工作,這裡面存在的也不是智商和課本的問 題,還是在於一個程序員在積累經驗,逐步提升的時候沒有意識到應當思考哪方面的東 西,沒有有意識的就項目的組織和復用設計進行揣摩,沒有經常性的文檔習慣和總結習 慣,不改變這些,我們的合格的項目設計者還是非常欠缺。

另外,為防止有無聊的人和我較真,補充一點,本文針對目標是作商業化的軟體項目和工程,那些科研機構的編程高手,比如演算法高手,比如圖象處理高手,他們的工作是研究課題而非直接完成商業軟體(當然最終間接成為商業產品,比如微軟研究院在作的研究課 題),因此他們強調的素質可能是另外的東西,這些人(專家),並不能說是程序員,不能用程序員的標準去衡量。

三、軟體項目研發的設計流程
最後補充一點東西,一個軟體項目研發的設計流程是怎樣的呢?以通常標準的設計方法為例,(不過筆者喜歡快速原型法)。
第一個步驟是市場調研
技術和市場要結合才能體現最大價值。


第二個步驟是需求分析
這個階段需要出三樣東西,用戶視圖,數據詞典和用戶操作手冊。
用戶視圖是該軟體用戶(包括終端用戶和管理用戶)所能看到的頁面樣式,這裡面包含了 很多操作方面的流程和條件。

數據詞典是指明數據邏輯關係並加以整理的東東,完成了數據詞典,資料庫的設計就完成 了一半多。
用戶操作手冊是指明了操作流程的說明書。
請注意,用戶操作流程和用戶視圖是由需求決定的,因此應該在軟體設計之前完成,完成 這些,就為程序研發提供了約束和準繩,很遺憾太多公司都不是這樣做的,因果顛倒,順 序不分,開發工作和實際需求往往因此產生隔閡脫節的現象。
需求分析,除了以上工作,筆者以為作為項目設計者應當完整的做出項目的性能需求說明 書,因為往往性能需求只有懂技術的人才可能理解,這就需要技術專家和需求方(客戶或 公司市場部門)能夠有真正的溝通和了解。
第三個步驟是概要設計
將系統功能模塊初步劃分,並給出合理的研發流程和資源要求。 作為快速原型設計方法,完成概要設計就可以進入編碼階段了,通常採用這種方法是因為 涉及的研發任務屬於新領域,技術主管人員一上來無法給出明確的詳細設計說明書,但是 並不是說詳細設計說明書不重要,事實上快速原型法在完成原型代碼後,根據評測結果和 經驗教訓的總結,還要重新進行詳細設計的步驟。

第四個步驟是詳細設計
這是考驗技術專家設計思維的重要關卡,詳細設計說明書應當把 具體的模塊以最』乾淨』的方式(黑箱結構)提供給編碼者,使得系統整體模塊化達到最 大;一份好的詳細設計說明書,可以使編碼的複雜性減低到最低,實際上,嚴格的講詳細 設計說明書應當把每個函數的每個參數的定義都精精細細的提供出來,從需求分析到概要 設計到完成詳細設計說明書,一個軟體項目就應當說完成了一半了。換言之,一個大型軟 件系統在完成了一半的時候,其實還沒有開始一行代碼工作。
那些把作軟體的程序員簡單理解為寫代碼的,就從根子上犯了錯誤了。

第五個步驟是編碼
在規範化的研發流程中,編碼工作在整個項目流程里最多不會超過1/ 2,通常在1/3的時間,所謂磨刀不誤砍柴功,設計過程完成的好,編碼效率就會極大提 高,編碼時不同模塊之間的進度協調和協作是最需要小心的,也許一個小模塊的問題就可 能影響了整體進度,讓很多程序員因此被迫停下工作等待,這種問題在很多研發過程中都 出現過。編碼時的相互溝通和應急的解決手段都是相當重要的,對於程序員而言,bug永 遠存在,你必須永遠面對這個問題,大名鼎鼎的微軟,可曾有連續三個月不發補丁的時候 嗎?從來沒有!
第六個步驟是測試
測試有很多種:
按照測試執行方,可以分為內部測試和外部測試
按照測試範圍,可以分為模塊測試和整體聯調
按照測試條件,可以分為正常操作情況測試和異常情況測試
按照測試的輸入範圍,可以分為全覆蓋測試和抽樣測試
以上都很好理解,不再解釋。

總之,測試同樣是項目研發中一個相當重要的步驟,對於一個大型軟體,3個月到1年的外 部測試都是正常的,因為永遠都會又不可預料的問題存在。

完成測試後,完成驗收並完成最後的一些幫助文檔,整體項目才算告一段落,當然日後少 不了升級,修補等等工作,只要不是想通過一鎚子買賣騙錢,就要不停的跟蹤軟體的運營 狀況並持續修補升級,知道這個軟體被徹底淘汰為止。

寫這些步驟算不上賣弄什麼,因為實話講我手邊是一本《軟體工程》,在大學裡這是計算 機專業的必修課程,但是我知道很多程序員似乎從來都只是熱衷於什麼《30天精通VC》之 類的,他們有些和我一樣游擊隊出身,沒有正規學過這個專業,還有一些則早就在混夠學 分後就把這些真正有用的東西還給了老師。
網上現在也很浮躁,一些coding fans亂嚷嚷,混淆視聽,實際上真正的技術專家很少在 網上亂髮帖子的,如筆者這樣不知天高地厚的,其實實在是算不上什麼高手,只不過看不 慣這種對技術,對程序員的誤解和胡說,只好挺身而出,做撥亂反正之言,也希望那些還 沉迷於一些錯誤人士的coding fans們能認真想想,走到正途上,畢竟那些聰明的頭腦還 遠遠沒有發揮應有的價值。


如果把「程序員」定義為「會寫程序的人」,那技能要求不多:

  1. 會打字;
  2. 會用搜索引擎;

如果把「程序員」定義為「能夠編寫高效、可靠、可維護的代碼並以此為生的人」,那技能要求可以就海了去。

  1. 計算機組成原理;
  2. 數據結構和基礎演算法;
  3. 離散數學;
  4. 組合數學;
  5. 某種編程語言;
  6. 資料庫;
  7. 網路協議;
  8. 代碼可讀性訓練;
  9. 溝通能力;
  10. 表達能力;
  11. 計劃能力;
  12. ……

當然,最後還是要有「使用搜索引擎」的能力。

正好前陣子我司面試了一個同學,這個同學以前學的不是計算機,等於是轉行來幹這一行,所以上面說的1、2、3、4、6、7、8肯定不行,5湊合著算會,但是9、10、11還不錯,「使用搜索引擎」能力也不差。

對於要不要hire這位同學,內部還有激烈的討論,有的認為可以招,有些技能可以將來學習,有的認為不能招,因為學習成本太大,一個人缺失了幾年的計算機科學教育,除非特別努力不然是補不回來的。

這個討論不是純嘴炮,大家擺出了自己的觀點,最後還是拿實證說話,讓兩個完全中立態度的同事去面試了這位同學,最後的結論依然是——不能hire

因為,在面試中,同事發現無法和這位同學就技術問題溝通,時間複雜度、鏈表結構、如何組織代碼這些問題根本說不到一塊去,這樣當然無法一起工作了。

所以,別真的以為會使用搜索引擎就行,不會基礎知識也許能找到一個程序員工作,但是找不到專業的程序員工作

了解更多程序員大道理請關注 @程墨Morgan


不請自答。有謬誤之處歡迎指正 :)

先做個簡單的自我介紹。國外大學研究生畢業後,入職一家公司做IT Consultant。學過C, .NET, java, DB(僅僅是學過 XD)。入職後才接觸的PHP。一路上因為工作需要,又會了CSS, JS, photoshop。現在是Branch Manager,不寫代碼 XD

如果單純的說技術,那我覺得,這個問題的答案是「無限多的技術」。現在光是語言就有多少種,C, C++, C#, java, Object C, PHP, python。。。而且隨著時間的推移,會有更多的語言出來(Object C好像就要被Swift取代了,貌似。。。)。所以說,單純的說技術,這是個無底洞。活到老學到老。

但是作為管理層,我卻看到了曾經作為程序員時看不到的景象。如果從「程序員應該擁有的素質」這個層面,我覺得就你的問題,我可以給出一些答案:

1. 學習能力
2. 思維能力
3. 主動性

首先說說學習能力。舉個栗子,我招聘了一個人做.NET,但是他原先只有3年的java經驗(請不要糾結於為什麼我會做這個決定。這只是個栗子 XD)。但是他在未來的兩周,以非常驚人的速度get了.NET,而且已經可以進入到正常的開發中。雖然代碼還有點拖泥帶水,但是這些足以顯示出他驚人的學習能力。一個努力而且可以快速學習的人,在企業中是金子(至少我是這麼覺得的 XD)。因為至少有兩點我可以肯定:他肯接收新事物;他能夠接收新事物。其實不管你去什麼公司,做的東西都未必是你學過的,你想做的,你會做的。一開始的這一段時間往往都是黑暗期。但是等你以積極的心態熬過了這段時間,那麼你的光芒就綻放出來了。肯認真做事的人才能委以重任(不同公司不同文化,不要直接照搬啊 XD)

接著是思維能力。這裡大概可以分成兩點:代碼的靈活度,客戶的需求理解。
首先說說代碼的靈活度。我們在學校里寫的都是最死的代碼,一頁代碼基本就是為了完成作業上寫的要求。也沒有什麼人來讓你改,只要完成就好。所以多少會養成「代碼沒有結構「,「只有自己看得懂」等這些問題。但是靈活的代碼就意味著你可以靈活的應對change。這是一種把代碼全部模塊化的能力。還是拿那一頁代碼的作業來說,如果你能把所有的可以分離出來的代碼全都做成一個個function,並且可以通過傳遞parameters來達到重複使用的效果,那麼你就會發現,自己在面對change的時候,生活會愉快很多。可能說的有點難理解,那我打個比方。市面上有出售普通的筆記本和活頁筆記本。普通的筆記本,如果你想調換兩頁紙的位置,那麼很遺憾,可能你做不到。但是活頁筆記本就不存在這種問題。他們可以非常靈活的來應對change。所以回到代碼的靈活度,你在編程的時候就要有意識的去把代碼模塊化。這樣應對change可以遊刃有餘,而且別人看你的代碼也會非常清晰。
再說對客戶需求的理解。這個就有點超越「程序員」的範疇了。「程序員不是只要坐在那裡寫代碼就可以了嗎」?好吧。是,也不是。這裡牽扯到一個題外話,「客戶知道自己想要的是什麼嗎?或者客戶知道自己在說什麼嗎?」答案往往是NO。很多客戶不是IT人士,他們只會用人類的語言來描述需求。比如「我想讓所有人都可以看到我的信息」 - 他其實想說「這條DB記錄需要對所有用戶可見」。再比如「為什麼我的機器這麼慢」 - 她其實想說「可以優化一下DB query的查詢語句以及查詢邏輯嗎?」 等等諸如此類的「翻譯工作」,程序員都要有一個更深層次的理解。記得以前看到過一個故事,有一個客戶說,「我希望在我的系統里,只有我和會計才可以使用這個功能」。如果你只是單純的理解為「為這個客戶和會計製作這個功能」,那麼我只能祝你好運了。因為一旦哪天這個客戶突發奇想想再加一個諸如「HR」的用戶進來,那麼試問,你的結構可以靈活應對嗎?其實以上的這個例子的正確理解,應該是「有某個標識的用戶,會擁有這個功能」。那麼你只要在存放用戶名單的DB裡面加一個column就可以了。這是個1分鐘就可以做完的任務,儘管看起來很麻煩。

最後說說主動性。主動性就是一種從別人角度來識別出他將會需要我做什麼的能力,以及我能想到他沒想到的方面的能力(我的理解 XD),這個不只局限於IT領域。其實說白了,以上提到的兩點都是主動性的表現,主動去學習,主動去把代碼優化。其實沒人要求你那麼努力去兩周學好.NET, 也沒人要求你去把代碼寫的那麼漂亮。你完全可以慢慢學,寫寫僅滿足功能的代碼。但是當你選擇趴著的時候,站著的人自然就被別人看到了。而且更重要的是,你的努力是會給你回報的。特別是當大change來的時候,你一分鐘就做完了。然後看著那些把代碼寫死的人加班。。。套用《火影》里的一句話,「努力是不會背叛自己的」。

一點見解,見笑了 :)


個人覺得陳皓前輩給的東西非常值得看,從技術方面來講推薦幾篇:
1、程序員需要具備的基本技能 http://coolshell.cn/articles/428.html
2、程序員技術練級攻略 http://coolshell.cn/articles/4990.html
3、軟體開發的「三重門」 http://coolshell.cn/articles/6526.html
4、Web開發中需要了解的東西 http://coolshell.cn/articles/6043.html

其他個人非專業素質方面,邏輯能力,溝通能力等也是非常重要的。


介紹下我的想法:
大學裡學的是計算機專業,所以順道學了不少計算機系的基礎課程,總體來講學得很不好,直到大四畢業,我才勉強下定決心要以寫代碼為生(現在想想,可能是當時實在想不出其他出路)。大學4年,很遺憾的事情就是我沒有弄清楚該去真正學些什麼東西。
畢業後第一份工作,在一家小公司寫servlet/jsp,說實話,我寫的很爛,當時帶我的人對我的工作很不滿意,直到有一次,項目經理跟我談說,你的工作表現你也看到了,差點就被開掉了,不過我覺得還是要在給你機會。。。當時,我真的是自信心崩潰到極致,覺得自己這段時間其實很努力,但為什麼還不入門路。。這次經歷給了我非常大的影響,之後的不久,我終於明白了怎麼去寫那些servlet/jsp,於是我努力的寫那些代碼,不久,我就成了公司新員工裡面,做東西最快的人。當時還發了個公司的什麼最快進步獎給我。我想第一份工作給我最大的感受是,想要做為一個程序員,你得先明白,程序是個什麼東西。
一年多以後,servlet/Jsp實在不想寫了,於是換到另外一家公司,做聊天軟體的J2ME客戶端。其實我當時不懂J2ME,在剛入職的一個月里,啃完CLDC和一些會用到的JSR的英文文檔,然後每天去看項目的代碼,有任何問題就去問周邊的同事。不久,我也慢慢能寫一些J2ME的代碼了。接著,我加入了新版客戶端的項目組,開始做一些UI組建。最開始,我寫一個Text組件,就是把文字顯示到屏幕上,還要根據屏幕可顯示區域的寬度、高度對文字做調整。沒幾天,我就信心滿滿的寫完了這些代碼,原來寫客戶端代碼也不難啊。不過不久,當同事要用我的組件時,問題百出,以至於同事跟經理抱怨說,這麼基礎的組件應該給有經驗的人去寫啊。。 這次,雖然我的工作做的很爛,可自信心倒沒受多少打擊,因為已經工作一年多了嘛,臉皮厚了不少。但是我心裡知道,我的工作肯定哪裡出了問題,否則我的組件應該能經受住使用者的考驗的啊。這份工作中,我學到了不少東西,首先呢,臉皮要厚一點,不會就追著去問,其次,沒有想清楚的話,寫出來的東西經不住考驗的。再次,英文資料好像更準確啊。當然還有一些具體的編程技術。
大概又過了一年多,大家都說J2ME快完蛋了,android已經開始大興其道,公司裡面也有人在做android客戶端,可我還在寫沒有前途的J2ME.恰好,qq群里有人發消息說招人,我腦子一熱,扔了份簡歷過去。於是,一個多月後,我就到了新的公司上班,這家公司是一個做手機的廠商,而我也可以參與android的開發。在這個公司的前3個月,基本啥活沒幹,除了學習android之外,就是各種培訓和等待。大概待到5個月的時候,我實在坐不住了,我去跟經理說,有沒有活可以給我干。經理說我考慮下,不久便安排給我一個項目,讓我去把它維護好了,然後集成到產品裡面。可當我拿到代碼時,傻眼了,2w多行代碼,而且很多地方寫的很複雜,看了好幾天也沒看懂。好吧,不管了,這件事既然是我負責,那怎麼都應該挺住。在接下來的快2個月里,我每天都撲在這兩萬多行代碼里,解決裡面的bug,理解裡面的設計思路、代碼風格、編程技巧,使用公司的工具鏈,從發布、審核到持續集成等等。我了解到了很多我平時不知道的東西,我解決了發現了的所有的bug。可是最終,我並沒有把這個項目維護到可以發布的程度,最後一關的AT&T的穩定性測試宣判了我的這個項目的死刑,隨後這兩萬多行代碼慢慢的從我的提交列表裡面消失掉了。我第一次明白了,竟然還有如此嚴格的質量測試,也明白了什麼叫風險與代價,雖然這些代碼,我已經用monkey模擬跑過了5個鐘頭,但是依然被ATT測試蹂躪2個鐘頭之後掛掉。我也明白了,要預防風險,你就必須提前考慮到,否則,等到那個不好的事情發生,你已經沒有機會了,你的努力會白費。
在這家公司我還做了另外一個項目,做的很辛苦,甚至於項目後期了,我們還加班加點把整個項目的結構重寫了一遍。這個項目被人重視,甚至被當作新產品的一個賣點寫到宣傳海報裡面去。可我們真的搞出很多事情,有一次,軟體部門的頭頭報給我們幾個軟體崩潰的bug,於是這些小頭頭們著急了,整天拉著我們解決各種各樣的問題,整天壓著我們要把bug list裡面的問題儘快搞定。幸好,我們最終都搞定了。軟體成功發布,雖然它不如預期的那麼完美,但是至少,在新產品里有它的身影,而我自己每天也在用。。這個項目最大的感受是,決定必須有實踐結果的支持,我們剛開始的方案,因為最終不能滿足性能要求,不得已,在項目後期加班加點換實現方案。而且,我也第一次感受到一個好上司,真的很重要。因為最後公司部門重組,我們幾個給某些領導帶來麻煩的人,好像不是很受歡迎啊。我想,如果一個只為自己考慮的管理者,應該是這樣的吧。

年初,我覺定去一家小公司發展(也看了一些關於大小公司工作之間的爭論文章 http://www.dbanotes.net/jobs/howto_choose_company_style.html 和 http://robbin.iteye.com/blog/730223 等等)。於是通過獵頭介紹,到了現在這一家。這幾天,我帶領的團隊終於完成了一個移動互聯網的項目,老闆拿著最近的版本去給他的朋友看去了,可我自己在想,還不完善啊,我們需要在努力下,好讓老闆(主抓市場)去賣我們的產品的時候更有面子一點。。這段時間裡,我學到最重要的東西是,老闆也不容易,有時候得替老闆想想;執行力很重要;在小團隊里,你自己的技術視野和細節都很重要,因為出了問題,肯能需要你去解決;學會激勵別人;除了學會快速學習之外,還要能幫助團隊成員快速學習;不要逃避問題,因為你就要是那個問題解決者(任何問題,不管技術和其它)。。等等
昨天跟第一家公司帶我的朋友聊起,他說,你現在太拘泥於細節,你現在要從代碼的層面出來,站在更全面的角度去把握整個團隊的工作,建立框架,建立模式,這樣你的團隊才能高效執行。。。。 總之,他說的話我也不是太理解,也許需要時間。不過我想,自己一個人走的太累的時候,可以找找周邊的朋友幫你分析和指導下,因為可能,在一年多以前,我也在看stackoverflow上那篇,技術人員應該讀什麼書,是的,那些書我會去讀,可我現在更重要的是要解決工作中所碰到的問題。

也許我的廢話太多,也沒有上面毛小毛貼出來文章那麼深刻。而我也只是一個非常普通的程序員,我得先學會蹲馬步才能去學鐵布衫啊。也許,我想說是,具體要學什麼我不知道,沒有定論,但是得從環境中分析出,需要學什麼,也許剛開始分析的不對,走了錯路,分析對了,沒執行對,也走了彎路,可那有什麼辦法呢,成長的代價,不是理所當然的嗎。


要學習「學習技能」這個技能.


我認為以下幾門課比較重要(排名分先後)

  • 面向對象的程序設計
  • 數據結構
  • 網路
  • 軟體工程
  • Web程序設計
  • 編譯原理

事實上,我覺得畢業後的工作中大概也就這些課程是有用的。
或者說,隨便找一個三流大學計算機專業的以上課程的期末考試卷,能閉卷做到80分以上,應該已經是個好程序員了。


作為一名程序員需要學習多少技能?

如果是成為一名程序員,那隻需要學習一門語言就踏入了程序員的行列,被稱為程序員了。

如果要成為一名優秀的程序員,從大的方面從頭到尾需要的就是學習能力吧。
在平時工作中會有各種各樣的需求產生,這就需要程序員不斷地學習。工作中需要什麼,那就學習掌握並將之應用到工作中,解決現有的問題。 遇到什麼難題,就需要多研究學習,或者向同事請教,自己再領悟解決。周而復始,慢慢地自己就會成為一個小小牛人,至少能獨當一面吧。

現在語言那麼多,技術也是層出不窮,作為一名程序員想掌握太多是很難的。很多大牛也都不是全能,只是在某一領域而已。所以技能不在於多吧,還是在於深入。


總的來說四大塊吧

  1. 編程思想 具體的編程語言 具體的一個組件
  2. 你所在領域的業務
  3. 職業技能:測試調試 presentation
  4. 演算法、os、編譯、圖形學等高大上的領域選一個

看你是抄還寫

抄...會google就好

寫...會多少都嫌少


多且雜,樓上大佬說得很全了。
個人覺得核心的技能:學習能力和皮實的身心。


1.一顆對新知識好奇的心
2.英語閱讀能力
3.快速學習掌握新知識
4.積累,沉澱,有自己的知識體系

不可能都會,需要在需要的時候能主動去學


哦,天啊,這個問題夠大,我只說說我的一點看法吧,供你參考

基本上,我將一個程序員看成是一個作家,只不過作家用自然語言來描述世界,而程序員用的是編程語言來描述世界。除此之外 ,我認為兩者基本上是相通的。

那麼,我們可以先來看看作家想要寫出一部好作品,需要哪些技能,通過作家需要的技能,來類比看看一個程序員需要的技能。
首先,作家至少需要精通一門語言吧,所以,作為程序員,至少需要掌握精通一門編程語言。當然,如果你能夠精通更多那當然更好,然而,人的精力是有限的,最理想的狀態是,精通一門,涉獵其他。
其次,只是精通一門語言,還無法保證寫出偉大的作品,作家們還得懂得如何布局謀篇,如何起承轉合,類比到程序員這裡,即使需要掌握如何設計你的程序,大的方面,設計到面向對象或者面向過程的設計思想,小的方面,涉及到設計模式,重構等等
掌握了以上這些技能,一個作家只是能寫出一些小文章而已,不能算是偉大的作品。要寫出偉大的作品,作家們還得從整體上進行設計,確定作品的主旨立意,確定作品的實現步驟,類比到程序員這裡,我們需要了解的,一方面是程序架構方面的知識,常用的架構模式,系統特性等等,另外一個方面,就是項目的實施。編程序是一個非常複雜的工程,我們必須了解一些軟體工程的知識,才能保證程序被正確及時地編寫出來。在這一點上,有傳統的軟體工程模型(比如瀑布模型),也有很多新的軟體開發的方法(比如極限編程,測試驅動開發等等)

可以看出,這實際上是三個層次,從最基礎的語言,到中間的模式,再到最頂層的架構,包含很多需要了解和掌握的技能。當然,要想全部掌握和精通,對我們來說,那太難了。不要妄圖去掌握以上這些所有技能,我們能做到的,只能是根據自己的定位(程序員,項目經理,架構師等),選擇與之匹配的技能來學校和掌握,那就足夠了。

需要掌握這樣一個原則,可以學習的技能很多,我們是根據自己的需要而學習,而不是因為他存在而學習。

以上,是我的一點認識,希望對你有所啟發。


其實你靜心想想,啥技術好、會架構、演算法強、精通語言、數學好、英語好、設計模式編程思想要牛掰,這些個,不都是老生常談嗎?每個程序員都夢寐以求追求的目標莫過於此。

但是我想說年齡越來越大了你就會發現「懂溝通」、「懂冷靜分析看待問題」這兩個方面是最重要的。技術牛逼的人多了去,大多覺得「登高一呼」的技術領袖風光無限,可是,真正掙得「里子」的人卻是那些極其精通社交溝通及社交導向的人,而非天天秀技術、撕語言的「技術大牛」們。

程序員是個職業,但你眼裡千萬不能只有程序員。否則就成了人眼裡的「格子衫、雙肩包」的固化印象了。


騷年,你還沒覺悟嗎,學習本身才是最重要的技能啊…
我特么見識太多不會學習的了,遇到問題,從來不主動思考,也不會谷歌不會百度,缺了資料也不會收集……對於初學者來說,當前你們是不會遇到你解決不了的問題的,什麼程度的人才會遇到什麼程度的問題,你們在這個初學過程遇到的問題絕大多是有千千萬萬的人遇到過,他們共享了他們的思路與方法,然而你在苦苦思考無果之後不知道從網路上獲取自己需要的,可是,我,以及別的初學者都做到了!!你為什麼不可以!!你只是著急的截了圖,著急的加群問,我們看到之後都沒勇氣回答你,你造嗎??我們都怕我們的回答會讓你變得更懶,我有時候真希望這些門檻級別的問題過濾掉那些沒有自我學習能力的人_(:_」∠)_
只要你知道怎麼學習,剩下的那些還有什麼學不會的_(:_」∠)_


推薦閱讀:

TAG:程序員 | 編程 | 計算機技術 |