⑴ 一個優秀的程序員必須學習什麼課程呢
怎樣評定一名軟體開發人員?這是一個頗為奇怪的問題。現在已經有了很多的理論和形式來做這件事,人力資源部門也試著幫你管理和反省自己的行為。然而,怎樣才是一個偉大的軟體開發人員,在今天,你該怎樣發展你的職業生涯?以下是我評定團隊中軟體開發人員的「軍規」。按照這些技巧和規則,你可以改善你的現狀,由一個優秀的程序員,成為一名偉大的程序員。 1、時間花在寫精彩的代碼上 這里說的不是數量,而是質量。對此,一種歪曲是:要數量,也要質量。你也許會很多次的遇到以下的兩種情境: 情境A:你有一個發瘋似的能寫代碼的程序員,事情似乎在進展中……然後,Bug開始不斷出現,你們也不知道為什麼,好像永遠補不完。補完十個,又出來五個,現在你手裡的,就是一大堆代碼…… 情境B:你現在有一個看起來很聰明的程序員,你面試他的時候,他似乎無所不知,能把理論說的頭頭是道。然而,你留給他三個任務,三個星期以後,他還在做一些三天就該幹完的事。這下該你困惑了,他這么聰明,他知道generics(詳見備注),多線程的一切事情,甚至還能給祖母級的人講解什麼是指針,讓老太太興奮的想去編程。可是——怎麼什麼都沒完成? 於是,在夢境中——你寫出了堪稱偉大的代碼,——偉大的代碼是偉大的程序員寫出來的,他睿智,明白代碼的真正品質所在。寫代碼就像托尼?霍克在玩滑板一樣自然優美,看上去就令人愉快。這些程序員以讓你眼花的速度搞定一切,他們知道每個問題應該處理多長時間,也不會追捧尋覓所謂的世界最好解決方案,弄很多線程很多層來寫一個簡單的游戲。他們寫的程序沒有Bug,因為寫的時候自己測試過了,在睡覺時也在寫代碼說的就是這樣的人。這些程序員太寶貴了。 2、闡明問題 可以明確的是:即使有問題暫時處理不了,還有成百上千的方法去解決。有些人反應很迅速,很快就能提出多種解決方案。然而,一個偉大的程序員應該在做出行動以前清晰闡明問題——創建文檔或用白板表達出來。他們寫郵件給項目的管理者,這樣表述:「我想和你說說我是怎麼理解這個問題的,我們能這樣處理嗎?」然後他們就會動手給你多種方案。 對,這些人明白自己看問題和闡明立場的方式,而這理解方式大概不會是問題創建者所想要被理解的。請牢記這就是關鍵所在。一名偉大的程序員在嘗試解決問題以前,一定要完全的理解它。你百分百搞明白了嗎?沒有?百分之九十九?——回去再多問些問題,確保百分之百理解清楚了。 3、怎樣著手解決問題 那一搞明白了問題,就開始動手寫代碼?錯!一個偉大的程序員應該按照規劃,開始思考面臨的多種選擇,基於問題開始考慮最好的解決方案。我覺的這像一場國際象棋比賽。你知道每個棋可以怎麼走,知道所有的游戲規則。但是你會馬上走棋嗎?不,你要審時度勢,制訂計劃,緊盯對手,分析其通常的做法。和這一樣,在你coding解決問題以前,你也要這么做。 看看問題,計算出需要怎樣的結果,你的時間能怎麼安排,預期的質量,你必須用的工具,……好了,開工吧!內容導航 4、對代碼的信任 作為項目管理者,你怎麼相信他們的代碼。有些程序員,你可以對他們說:「我星期五就要結果」。——星期五到了,你收到了這樣的Email:「代碼我都已經檢查過了,現在就等著測試了。」你很放心,只會有很少的瑕疵在質量確保的團隊被查到。當然,還有些輕率的例子,一些程序員在郵件里是這樣說的:「我還沒弄完,星期一上午我會最先完成它」。你不太確信這東西,發現很多Bug,很長時間基本上不能用。又得花上幾個星期清理代碼中的Bug。 關鍵:你對一個開發人員越有信心,他離成為一個偉大的程序員的距離就越近。想像你是你的管理者,如果他並不擔心你的代碼,會給你多少信心和勇氣! 5、對方案的信任 和對代碼的信任是一回事——如果你手上有偉大的程序員,你就會對解決方案有信心。這些程序員同時也是偉大的建築師。他們剖析整個問題,指出問題需要怎樣去解決。這就不只是用偉大的代碼編程的問題了,很大程度取決於你怎樣構築解決方案。這是關鍵,而且會讓你在軟體世界裡出類拔萃。 6、滿足客戶需求 一天下來,你寫出了最棒的代碼、用了最好的框架和最好的解決方案,但這真的能迎合用戶的需求嗎?恐怕根本不是那麼回事兒。你搞砸了。盡管現在多次失手,一個偉大的程序員還是會正中靶心,找出客戶需要的,給用戶逐步展示他們所需要的無bug的最終版本。需求正中靶心的同時,用戶滿意了。 7、不斷升級 偉大的程序員會積極主動地把自己的技術升級。他們對知識的態度就像餓貓見著了牛奶,他們從不用上級催促給自己設定目標、不用經理要求他們完成任務,因為他們自己就已經安排OK了。 他們發現自己想要參加的大會就會給公司寫Email「本人非常想參加今年的Tech-Ed大會。我將用心研習,並對作出貢獻。我預計這可節省<金錢/其他原因>。如果可行,不知公司是否幫我支付此行?」如果我收到這樣的郵件,我不僅會幫他支付參會費用,他的路費我也會全程買單。 偉大的程序員們永遠會關注例如.net用戶組或java用戶組的所有用戶群體。他們參加本地的技術會議,並從中汲取知識。你會看所有最新博客和最新的雜志嗎?現在列出你最喜歡的前5個開發博客。你能做到嗎?你應該像參加基督教青年會那樣輕松做到。做到這些,可以很好的幫助你延伸你的思路
⑵ 程序員如何自己創業
30歲,對於每一個程序員來說都是尷尬的年齡,彷彿舞台上不知不覺間已經謝幕,而自己仍在獨舞;創業,對於每一個程序員來說都是曾經或者正在憧憬的夢想,可是夢想與成功之間難以逾越的距離卻也讓多少人望而卻步……以下是我為大家整理的程序員如何自己創業相關 文章 。
周鴻禕談程序員創業
很多人都嚮往著有一天自己創業,程序員更是如此。如果你想創業,那麼該怎樣創業、需要有哪些准備、自己還有什麼不足等等這些問題你考慮過嗎?本文就跟大家分享周鴻禕在接受某媒體采訪時給程序員上的創業課。
程序員創業的特別之處
關於程序員創業,我之所以願意談我的觀點,是因為我是程序員出身,也是從小公司做起來的,我自認為對待很多程序員個人包括共享軟體作者和一些小網站還是很好的。我希望和他們分享一些 經驗 和體會。
首先,我想說的是聰明人不一定能成功,很多程序員很聰明,但我一看就知道他們不會成功。因為我看到了一些問題,而且現在太多程序員存在很多誤解。因此,我希望把我的觀點告訴程序員。或許有一些程序員能夠清醒,某個人可能因為我的某一句話有了感覺,對他以後的成長產生了幫助,這就足夠了。
要知道,程序員總是以為自己優秀所以就能成功,其實不是。中國的程序員大部分是盲目的:看看一些論壇就能夠感覺到,要麼有一群人自我感覺極端的良好,以專家自居,要麼就是一群藍領埋怨公司和社會環境不行,待遇不好。
應該說,中國程序員創業的成功率也是很低的。放眼望去,中國互聯網成功的人士有幾個是真正寫過十年軟體的。事實上,現狀和我們所能聽到的媒體宣傳的 故事 很不一樣。
很多程序員的最高理想就是寫一個共享軟體,一年可以掙幾百萬。但我希望談的不是告訴程序員如何掙錢,掙錢很容易,而是要告訴程序員如何去創業。比如雖然FlashGet的作者收入很高,衣食無憂,但從創業的角度看,它並沒有以商業公司的方式創業成功。
程序員在創業方面的欠缺
首先,我看到中國程序員的合作心態非常缺乏,我認為這是中國程序員最大的問題,當然這是有很多原因的。
大家經常說這句話:態度決定一切。但事實上好程序員基本上都比較傲氣,因為程序員往往會覺得自己在做世界上一件十分偉大的事情,這就是驅動機器,修改一行代 碼,機器就能夠工作,可以產生各種不同的行為。這很容易會讓程序員產生一種錯覺,認為自己可以Control Everything。程序員的自信在編程上是非常需要的,但不是適合一切場合。如果我們不說這些,可能很多程序員到現在還不知道自己錯在哪裡,仍然認為 自己是King of the World。
事實上,程序員的能力只是控制了一個機器。但創業僅僅具備了和機器打交道這一種能力是絕 對不夠的,他還需要和合作夥伴、競爭對手、投資人、員工甚至整個社會環境打交道。很多程序員因為已經習慣了和機器打交道,不善於也不願意 其它 的工作。很多程序員會內心認為“營銷不是很簡單嘛,市場很簡單啊,管理也很簡單啊,”我認為這種心態是非常害人的。
程序員還是一個很固執的人群,他覺得自己是機器的統帥,因此不會靈活,不會妥協。我當時也喜歡寫程序,但我知道如果自己沉迷於寫程序,肯定沒戲,所以是逼著自己改變角色。
優秀的程序員不要自負
這兩天,我收到幾封程序員的來信。有一封信中大意說“我是個如此優秀的程序員,為什麼我就不能成功呢,請你指點。這里有我的blog地址,看完你就 會了解我了。”我想說的是:如果真的希望別人幫忙,就要把情況真實的說出來,而不是上來就說自己很優秀,這種語言就會讓別人覺得很不舒服,不是很好的交流 方式。我還真看了那個blog,但看完之後,覺得這個程序員就是一個空想狂。
可以說,很多程序員實際上是優秀帶來了自負,這種自負使得其不要說創業,可能在在公司中工作也會遇到問題。所以,我甚至認為程序員在創業方面遇到的困難比其它類型的人員更大。如果程序員希望主導一個創業,可能首先就要逼自己不是一個程序員。
程序員應持開放心態,尋求團隊合作
程序員首先要學會和別人合作。提到這點,很多程序員都會說“我正在帶著其他程序員寫程序啊,我會合作啊。”但這種合作是片面的,我所談的不僅僅是程序員和程序員之間的合作,而是包括了程序員和其它各種角色之間的合作。程序員相親,他們的語言比較能夠容易理解。但作為一個程序員,你能不能商業人員、銷售人員很好的合作呢。
我這些年還看到很多這樣的例子:程序員動不動就把目標定為比爾·蓋茨。其實,比爾蓋茨不應該成為程序員崇拜的目標對象,這會讓程序員迷失方向,因為微軟另外一個創始人保羅·艾倫才是真正的程序員。再看其它一些例子,Google的第20名 程序員都可以獲得五億美元。Adobe公司兩個創始人也是一個精通技術,一個對商業精通,這樣的搭配才能夠更好的成功。因此,對於很多程序員來說,一定要找准真正的榜樣,不要被外界的故事迷惑了頭腦。如果剖開一些故事的外表,你會發現國外很多成功的程序員,背後一定有一個很強大的商業感覺的人或者一個團隊。
程序員的商業感覺其實並 不是很好。即便有商業感覺,其實這只是一個靈感,一個創意,但要要做成、做大還需要一系列的管理、市場、運營,這些對於程序員是不可想像的。程序員要明 白,在自己不擅長的領域,找到一個可以彌補自己缺陷的合作團隊才是出路。加入一個創業團隊,可能個人佔10%,但因為更容易成功,而且團隊可以做100分 的事情。而如果只是一個人做,很可能就失敗了。
這方面,國外的程序員對自己的長短比較清楚。在矽谷,很多程序員技術上都很牛,但他們 都非常知道自己只是在技術這個領域水平比較高,出了這個領域,自己什麼都不是。正因為有了這種心態,他們特別懂得與人合作。我認為國外的程序員已經普遍意 識到了這點,他們很願意成為創業團隊中的一員而並非自己創業。
因此,程序員需要調整心態,不要把自己當作精英人物,要承認自己在編程方面是優秀的,但永遠有人比自己更優秀,對於其它的領域,很可能自己很無知。要知道,其實程序員的選擇其實是最少的,因此抱有開放的心態是最重要的。
程序員與創業要求還有哪些差距
我認為現在的很多程序員經驗過於不足,他沒有認真踏實做過很多工作就奢談創業。如果一個程序員沒有在編程方面深入過,沒有積累,也就是半瓶子醋。這 樣的程序員我接觸過很多,他們自己也不清楚問題出在哪裡,讓人感覺又愛又恨。我認為程序員既然要憑借自己的技術,那就一定要踏實,要能夠實現任何創意。
但現在一些程序員自己沒有商業意識,卻又很自負,不相信別人,不理解的事情就不做。我遇到過很多程序員,他們對公司做什麼方向都質疑。他 們希望自己先想清楚,可是一想就浪費了很長時間。很多程序員就可悲在這里,積累的不多,看不到方向,但他也不相信自己的公司和老闆,這是一個悖論,需要程 序員深刻反省。要知道,每個公司都有懂商業的人。
就這樣,一些程序員極端自負,另外有一些程序員碰了很多釘子之後,感覺很自卑,於是便認為國內軟體業不行,最後 出國 或者打工,很少有程序員能對自己能做公正的評價。
國內環境是否造成程序員浮躁的因素
我以前沒有仔細考慮過這點。但我想,不管怎樣,程序員需要先從自身找問題,因為大環境就是這樣了。我承認一個現實:程序員生存狀態並不是很好,但程序員很多報怨其實是一種不切實際的期望值和自身的缺陷產生的反差。
首先,產品沒有大小,只有市場的大小。很多人總是覺得這也小,那也看不上。認為公司做的產品很無聊,要做就要像某些人宣揚的那樣:做游戲一定要 做3D引擎,好像只有這樣才夠牛。這其實就是一種浮躁。很多程序員寫軟體總是很多bug,基礎知識也不牢固,沒有參加幾個項目,沒有寫過十萬行代碼,就奢 談做大項目,這有價值嗎?
而且我還發現有些程序員特別憤青,罵環境,罵老闆,其實這只能把自己的心態搞的很壞。很多人剛進公司時做的很差,雖然工資少,但他沒有想到給公司增加了很多bug,公司實際上是在給他出學費。論壇上大家都在討論哪裡活幹得少錢拿的多。甚至還有人列了一些黑名 單。這種做法的結果就是程序員自己將周圍環境搞的烏煙瘴氣了。
有的程序員還非常喜歡指點江山,指點公司。我個人覺得這不是不可以,但 指責別的公司對個人沒有什麼好處,因為存在就是合理的。如果看不到,恰恰證明是自己看不到。我看到很多程序員也寫blog,技術交流的我認為非常好,但有 些人是寫評論。我是覺得程序員不要做評論家,中國不缺評論家,最缺的是實幹家。
總之,程序員一般過於自我。總生活在自我的世界中,就不可能真正了解世界是什麼。我很早就意識到了這些問題,也努力的去客服。我的經驗就是看別人如何做的好,為什麼能夠做的好,什麼是我所不能理解。程序員要學會慢慢站在別人立場上看問題。
最後給希望創業的程序員一點建議
對程序員來說,現在要做的也很簡單,這就是需要大量的實踐,要慢慢培養對產品,對商業的感覺。我的建議說出來可能有些忠言逆耳。對絕大多數程序員來 說,自己一個人成功的機率是很小的,所以我認為加入一個創業的團隊可能更為合適。現在有很多初期創業的公司,也需要很多優秀的程序員加盟。如果有理想,可 以選擇加入一個團隊,也有相應的股份,這方面我可以充當一個橋梁。
看看前網路程序員是如何創業的?找合夥人已經OUT了!
“來吧,做我的CTO,給你股份,咱自己當老闆。”
因為同學的一句話,前網路研發工程師YK辭職創業。一群毛頭小子,技術能力過硬,但畢竟資源不足,經驗欠缺,不到半年,項目無疾而終。 互聯網創業 盛行的現在,一個好的技術抵得過一支團隊,更別說出身BAT了。
但很多人不知道的是,就是這一樣一支技術實力超強的團隊,最終竟然也輸在了人上——過於強調技術,沒有頭腦足夠清醒的團隊成員及時制止。這也是為什麼要選背景不同、經驗不同的一群人一起創業了。曾經和YK聊過很久,項目失敗的背後是他對創業更多的思考,特別是對於那些擁有好工作的人來說,拋下一切投身創業需要付出的成本太高,但如果只是給創業者打工,那還不如守著原有的工作,至少更體面、更有保障。
就在我以為他會重新安安穩穩工作的時候,卻意外的在創業大街再次見到了他。細聊起來才知道,他並非辭職重新開始創業,而是用自己擅長的技術加入到新的創業團隊中,以外部合夥人的身份幫助兩個不同方向的項目解決技術開發問題。這次來到大街,是專門和一支團隊開技術碰頭會的。
他的這個選擇意料之外,卻又情理之中。意料之外的是他居然理智的沒有辭職,情理之中的是他選擇了成為外部合夥人,用業余時間一邊做顧問、一邊寫代碼,實現了時間、能力價值的最大化。
其實,說到外部合夥人就不得不提智籌平台。去年3月,正是看到了毛大慶宣布 離職 但依舊擔任萬科外部合夥人的新聞後,智籌將“外部合夥”作為創業者&人才之間對接的一種新的合作關系。現在,創業者來智籌發布任務,除了能與互聯網高級人才建立長期顧問、短期兼職、駐場辦公、遠程協作等合作關系之外,也能通過部分現金+可回購股份的方式,與人才建立外部合夥關系。外部合夥人是一個沒有行政職位,但依舊為企業、團隊做貢獻的人。
對於創業團隊來說,外部合夥人解決了以下問題:
1.快速成長,度過難關。
按照原本的思路,YK服務的兩支團隊還陷在滿世界尋找CTO、找程序猿的泥沼中,但有了外部合夥人,更低的參與門檻吸引了更多人才願意加入,不僅解決了燃眉之急,更推動項目度過難關、快速前行。
2.滿足了人才的多樣性。
一個合夥人已經很難找了,更不用說基因不同、知識不同、經驗不同的一群人。外部合夥人大大降低了對人才的束縛,而這樣的一種合作模式,讓越來越多的人才願意加入到創業中來,組建這樣一支多樣化團隊更容易。
3.更快找到,成本更低。
外部合夥人是通過股權激勵撮合到一起的一群人,利用可回購股權讓人才把創業者的事當做自己的事,目標、利益一致,做事更用心、更高效。股權支付的方式又可以降低初創的資金壓力,創業者不用支付很高的現金,也能請到非常NB的人才來解決難題。
外部合夥人極大的緩解了創業找人難的窘境,但當創業者真正去尋找外部合夥人的時候,往往又會擔心外部合夥人的時間、效率怎麼保證?水平怎麼衡量?什麼人才適合做外部合夥人?
首先,時間自由是第一標准,至少是時間可控,能夠拿出足夠精力完成任務。否則,連時間都不能自由支配的外部合夥人也太不稱職了,CEO找你開會,你卻說你在公司加班,即耽誤了創業者的時間,又降低了自己的口碑。
其次,獨擋一面的能力絕對必不可少。做得了合夥人的,都是某方面十分擅長的專業人才,那麼做的了外部合夥人的,需要更高的水平。從一開始我就強調,外部合夥人一定是高級人才,不然沒資格幫助創業者解決問題,甚至指導方向。俗話說,沒有金剛鑽不攬瓷器活,想做外部合夥人,一定得先有過硬的水平。
第三個標準是認可股權模式。中國基金報曾發表評論稱,未來十年,如果你與股權無緣,可能無法實現財務自由。在如今樓市低迷、股市重挫的時候,股權投資卻異軍突起,特別是在大眾創業、萬眾創新的激勵下,全國創業氛圍濃厚,涌現了一大批優質有潛力的新興企業、互聯網企業。也許你不是土豪,沒有錢參與眾籌,而此時外部合夥人模式的出現,讓普通人也能參與,只不過是用能力和時間參與創業、解決任務,換取股權。
智籌在幫助創業團隊對接外部合夥人合作的過程中,通過實踐 總結 出了最適合做外部合夥人的群體:自由職業者、大企業主管級以上在職人才、工作室、外包團隊等等。這些人能夠站在實戰的高度,不只提供經驗分享,更能夠有針對的解決具體問題,融入到項目和團隊中。
對於很多創業小夥伴來講,找錢、找人是躲不開的兩座大山,有錢了當然可以請NB的人才加入,有人了事兒干好了錢自然不愁,先有雞還是先有蛋的問題永遠都在,找到一方的突破口自然事半功倍。這時,外部合夥人就是打破這一死循環的關鍵鑰匙,只是需要創業者用開放的心態接受、嘗試,畢竟改變原有習慣肯定難受,甚至懶得嘗試。但創業原本就是不破不立的事,只有打破舊有習慣,才能接受新鮮事物,才能有更多新的收獲。
從另一個角度來看,參與創業的門檻降低,意味著越來越多的人能夠將自己的智力換成股權,幫助推動創業的同時,也是對未來的投資。根據智籌平台的數據顯示,當 創業項目 獲得融資後,人才所持的可回購股權將會以最少3倍的價值兌現,這對於很多人來講也是不小的吸引力。外部合夥人模式,降低初創資金成本的同時,也讓越來越多的高級人才加入到創業中來,大大激發了創業活力,無論創業還是參與創業,用起來都是極好的。
⑶ 如何成為一個程序員
想要從零開始成為程序員,先不要著急的去學習,而是先要去了解程序員。
1.隨便在招聘網站搜索就會發現程序員會分有很多類型,那你就需要確定自己將來想要發展的方向,自己的職業規劃是什麼?
2.通過搜索可以看到,剛剛起步的程序員工資並不是很高而且學習階段也會比較忙,那這個時候你是不是靠考慮一下如何兼顧生活和工作?工資如何支配合理等問題(沒有經驗限制的工作相對較低)
php程序員崗位要求
關於學習建議你這樣試試看:
學習的方式基本可分為兩個類型,一個是碎片化的學習,一個是系統進修。
你可以從網路上各機構大量的視頻或者書籍得到相關的學習資料。從大量的資料中,發現真正的干貨,從而不斷學習,這屬於碎片化的自習。由於自學周期比較長,還有不少小夥伴選擇是一邊工作賺取生活費,一邊再利用閑暇時間學習,當然如果你的精力充沛,這也是一個好辦法。
如果要報培訓班, 一定要找正規的培訓機構學習,不然容易被坑。培訓機構裡面的課程都是現在工作中需要用到的,時間短,基本上是可以讓你快速上手工作的。但是要把所有的知識點都消化就沒那麼快了,所以需要自己私下更加的努力,鞏固學習。
注意事項:
1. 自學要注意的是:自學入門時會很枯燥,不要兩天打魚三天曬網!!!切記
2. 在培訓機構里學習要注意的是:勤加練習、主動自學、有問題提,不懂的盡管問老師(把交的錢發揮到極致),不然之後再有問題就沒有這么好的機會能夠直接得到老師的指點了。
最後,祝願想要成為程序員的小夥伴都能心想事成哦(*^▽^*)~
⑷ 高級程序員的 必修課是什麼呀
一門計算機語言(推薦C),數據結構,軟體工程,操作系統,計算機網路,計算機組成原理,離散數學,另外,英語和數學也不能太差。然後可以看深一點的面向對象程序設計,設計模式等等。耐心,縝密的邏輯思維,多上機實踐就OK了。
⑸ 作為程序員提高編程能力的幾個基礎演算法
一:快速排序演算法
快速排序是由東尼·霍爾所發展的一種排序演算法。在平均狀況下,排序n個項目要Ο(nlogn)次比較。在最壞狀況下則需要Ο(n2)次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他Ο(nlogn)演算法更快,因為它的內部循環(innerloop)可以在大部分的架構上很有效率地被實現出來。
快速排序使用分治法(Divideandconquer)策略來把一個串列(list)分為兩個子串列(sub-lists)。
演算法步驟:
1從數列中挑出一個元素,稱為「基準」(pivot),
2重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。在這個分區退出之後,該基準就處於數列的中間位置。這個稱為分區(partition)操作。
3遞歸地(recursive)把小於基準值元素的子數列和大於基準值元素的子數列排序。
遞歸的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞歸下去,但是這個演算法總會退出,因為在每次的迭代(iteration)中,它至少會把一個元素擺到它最後的位置去。
二:堆排序演算法
堆排序(Heapsort)是指利用堆這種數據結構所設計的一種排序演算法。堆積是一個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。
堆排序的平均時間復雜度為Ο(nlogn) 。
創建一個堆H[0..n-1]
把堆首(最大值)和堆尾互換
3.把堆的尺寸縮小1,並調用shift_down(0),目的是把新的數組頂端數據調整到相應位置
4.重復步驟2,直到堆的尺寸為1
三:歸並排序
歸並排序(Mergesort,台灣譯作:合並排序)是建立在歸並操作上的一種有效的排序演算法。該演算法是採用分治法(DivideandConquer)的一個非常典型的應用。
1.申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合並後的序列
2.設定兩個指針,最初位置分別為兩個已經排序序列的起始位置
3.比較兩個指針所指向的元素,選擇相對小的元素放入到合並空間,並移動指針到下一位置
4.重復步驟3直到某一指針達到序列尾
5.將另一序列剩下的所有元素直接復制到合並序列尾
四:二分查找演算法
二分查找演算法是一種在有序數組中查找某一特定元素的搜索演算法。搜素過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜素過程結束;如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。如果在某一步驟數組為空,則代表找不到。這種搜索演算法每一次比較都使搜索范圍縮小一半。折半搜索每次把搜索區域減少一半,時間復雜度為Ο(logn) 。
五:BFPRT(線性查找演算法)
BFPRT演算法解決的問題十分經典,即從某n個元素的序列中選出第k大(第k小)的元素,通過巧妙的分析,BFPRT可以保證在最壞情況下仍為線性時間復雜度。該演算法的思想與快速排序思想相似,當然,為使得演算法在最壞情況下,依然能達到o(n)的時間復雜度,五位演算法作者做了精妙的處理。
1.將n個元素每5個一組,分成n/5(上界)組。
2.取出每一組的中位數,任意排序方法,比如插入排序。
3.遞歸的調用selection演算法查找上一步中所有中位數的中位數,設為x,偶數個中位數的情況下設定為選取中間小的一個。
4.用x來分割數組,設小於等於x的個數為k,大於x的個數即為n-k。
5.若i==k,返回x;若i<k,在小於x的元素中遞歸查找第i小的元素;若i>k,在大於x的元素中遞歸查找第i-k小的元素。
終止條件:n=1時,返回的即是i小元素。
六:DFS(深度優先搜索)
深度優先搜索演算法(Depth-First-Search),是搜索演算法的一種。它沿著樹的深度遍歷樹的節點,盡可能深的搜索樹的分支。當節點v的所有邊都己被探尋過,搜索將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中一個作為源節點並重復以上過程,整個進程反復進行直到所有節點都被訪問為止。DFS屬於盲目搜索。
深度優先搜索是圖論中的經典演算法,利用深度優先搜索演算法可以產生目標圖的相應拓撲排序表,利用拓撲排序表可以方便的解決很多相關的圖論問題,如最大路徑問題等等。一般用堆數據結構來輔助實現DFS演算法。
深度優先遍歷圖演算法步驟:
1.訪問頂點v;
2.依次從v的未被訪問的鄰接點出發,對圖進行深度優先遍歷;直至圖中和v有路徑相通的頂點都被訪問;
3.若此時圖中尚有頂點未被訪問,則從一個未被訪問的頂點出發,重新進行深度優先遍歷,直到圖中所有頂點均被訪問過為止。
上述描述可能比較抽象,舉個實例:
DFS在訪問圖中某一起始頂點v後,由v出發,訪問它的任一鄰接頂點w1;再從w1出發,訪問與w1鄰接但還沒有訪問過的頂點w2;然後再從w2出發,進行類似的訪問,…如此進行下去,直至到達所有的鄰接頂點都被訪問過的頂點u為止。
接著,退回一步,退到前一次剛訪問過的頂點,看是否還有其它沒有被訪問的鄰接頂點。如果有,則訪問此頂點,之後再從此頂點出發,進行與前述類似的訪問;如果沒有,就再退回一步進行搜索。重復上述過程,直到連通圖中所有頂點都被訪問過為止。
七:BFS(廣度優先搜索)
廣度優先搜索演算法(Breadth-First-Search),是一種圖形搜索演算法。簡單的說,BFS是從根節點開始,沿著樹(圖)的寬度遍歷樹(圖)的節點。如果所有節點均被訪問,則演算法中止。
BFS同樣屬於盲目搜索。一般用隊列數據結構來輔助實現BFS演算法。
1.首先將根節點放入隊列中。
2.從隊列中取出第一個節點,並檢驗它是否為目標。
如果找到目標,則結束搜尋並回傳結果。
否則將它所有尚未檢驗過的直接子節點加入隊列中。
3.若隊列為空,表示整張圖都檢查過了——亦即圖中沒有欲搜尋的目標。結束搜尋並回傳「找不到目標」。
4.重復步驟2。
八:Dijkstra演算法
戴克斯特拉演算法(Dijkstra』salgorithm)是由荷蘭計算機科學家艾茲赫爾·戴克斯特拉提出。迪科斯徹演算法使用了廣度優先搜索解決非負權有向圖的單源最短路徑問題,演算法最終得到一個最短路徑樹。該演算法常用於路由演算法或者作為其他圖演算法的一個子模塊。
該演算法的輸入包含了一個有權重的有向圖G,以及G中的一個來源頂點S。我們以V表示G中所有頂點的集合。每一個圖中的邊,都是兩個頂點所形成的有序元素對。(u,v)表示從頂點u到v有路徑相連。我們以E表示G中所有邊的集合,而邊的權重則由權重函數w:E→[0,∞]定義。因此,w(u,v)就是從頂點u到頂點v的非負權重(weight)。邊的權重可以想像成兩個頂點之間的距離。任兩點間路徑的權重,就是該路徑上所有邊的權重總和。已知有V中有頂點s及t,Dijkstra演算法可以找到s到t的最低權重路徑(例如,最短路徑)。這個演算法也可以在一個圖中,找到從一個頂點s到任何其他頂點的最短路徑。對於不含負權的有向圖,Dijkstra演算法是目前已知的最快的單源最短路徑演算法。
1.初始時令S=,T=,T中頂點對應的距離值
若存在<V0,Vi>,d(V0,Vi)為<V0,Vi>弧上的權值
若不存在<V0,Vi>,d(V0,Vi)為∞
2.從T中選取一個其距離值為最小的頂點W且不在S中,加入S
3.對其餘T中頂點的距離值進行修改:若加進W作中間頂點,從V0到Vi的距離值縮短,則修改此距離值
重復上述步驟2、3,直到S中包含所有頂點,即W=Vi為止
九:動態規劃演算法
動態規劃(Dynamicprogramming)是一種在數學、計算機科學和經濟學中使用的,通過把原問題分解為相對簡單的子問題的方式求解復雜問題的方法。動態規劃常常適用於有重疊子問題和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解法。
動態規劃背後的基本思想非常簡單。大致上,若要解一個給定問題,我們需要解其不同部分(即子問題),再合並子問題的解以得出原問題的解。通常許多子問題非常相似,為此動態規劃法試圖僅僅解決每個子問題一次,從而減少計算量:一旦某個給定子問題的解已經算出,則將其記憶化存儲,以便下次需要同一個子問題解之時直接查表。這種做法在重復子問題的數目關於輸入的規模呈指數增長時特別有用。
關於動態規劃最經典的問題當屬背包問題。
1.最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質(即滿足最優化原理)。最優子結構性質為動態規劃演算法解決問題提供了重要線索。
2.子問題重疊性質。子問題重疊性質是指在用遞歸演算法自頂向下對問題進行求解時,每次產生的子問題並不總是新問題,有些子問題會被重復計算多次。動態規劃演算法正是利用了這種子問題的重疊性質,對每一個子問題只計算一次,然後將其計算結果保存在一個表格中,當再次需要計算已經計算過的子問題時,只是在表格中簡單地查看一下結果,從而獲得較高的效率。
十:樸素貝葉斯分類演算法
樸素貝葉斯分類演算法是一種基於貝葉斯定理的簡單概率分類演算法。貝葉斯分類的基礎是概率推理,就是在各種條件的存在不確定,僅知其出現概率的情況下,如何完成推理和決策任務。概率推理是與確定性推理相對應的。而樸素貝葉斯分類器是基於獨立假設的,即假設樣本每個特徵與其他特徵都不相關。
樸素貝葉斯分類器依靠精確的自然概率模型,在有監督學習的樣本集中能獲取得非常好的分類效果。在許多實際應用中,樸素貝葉斯模型參數估計使用最大似然估計方法,換言樸素貝葉斯模型能工作並沒有用到貝葉斯概率或者任何貝葉斯模型。
盡管是帶著這些樸素思想和過於簡單化的假設,但樸素貝葉斯分類器在很多復雜的現實情形中仍能夠取得相當好的效果。
通過掌握以上演算法,能夠幫你迅速提高編程能力,成為一名優秀的程序員。
⑹ 一個程序員需要有怎樣的自我修養
作為一名程序員,一個「程序員的自我修養」是什麼?
盡管我們不一定要像尹天仇那麼的認真對待自己的事業,但,一些基本的修養,作為一名新時代的碼農,總應該是要具備的吧。不過真要說修養,方面還是挺多的,技術自我提示自不必說。但我並不打算從這個大家都覺得理所當然的技術方面入手,而是談談,可讀性代碼,這個容易被大家忽視的基本素養。
1、遵從所在團隊的代碼規范。
一個高效、成熟的團隊,必定有一個屬於自己的代碼規范,這個規范是團隊的寶貴的財富,它是整個團隊從各種坑中爬起來後積累的經驗教訓。什麼是規范,它是人們從無數經驗中總結出來的規則,標准。而代碼規范,指導團隊成員如何以最短的時間寫成最高效,可讀性強的代碼。試想,如果成員不遵從規范,你用駝峰命名,他用下劃線,這對程序的可讀,將造成多大的影響。我想,應該沒有一個人願意去閱讀一段,各種變數命名形式都能見得到,private, public 方法隨意排序,甚至常量類都散落在各個角落的代碼吧。
代碼,一個作用是讓機器閱讀,另一個重要的作用是讓人閱讀!!!
2、遵從行業內通用的規范
在團隊的代碼規范未涉及到的,那請按照行業內的規范來編寫代碼。規范的一個好處是,可以明顯減少學習和交流成本。在java中,當我們看到全大寫的變數名時,我們就知道這是常量,而不需要去看注釋,不需要去看代碼邏輯。為什麼這么迅速,因為行業里大家都習慣把常量用大寫命名。但假如你用其他命名方式命名常量,比如team_nums命名常量,不僅不能讓人迅速知道這是個常量,而且可能讓人誤會這是個變數,增加了團隊成員學習和溝通成本,甚至可能誤導他們。就見過一位仁兄,明明用的是工廠模式,偏偏按模版模式的命名方式來命名,問他,他說他知道這是工廠模式,但他覺得,更應該叫模版模式。。。我的天,,你這么任性,以後還能做朋友么?
舉個例子,我們需要根據支付類型,來生產多個支付產品,於是,我們寫了個工廠類,命名為FactoryPay。當其他人看到一個類叫FactoryPay,他們會猜測,這應該是個工廠類,負責生產各種支付產品的工廠,然後按照這個猜測去閱讀代碼,就能比較快速的理解整個類的作用。但是,假如我取名PowerPay,別人還不知道是啥,看了半天,才明白,這是個工廠的作用。這就明顯增加了他人的學習成本和維護代碼的成本。
不管你是新手還是老鳥,務必了解施行行業規范,切勿為了標新立異而違反規范。這么低端的裝逼,就沒必要採用了,要裝也寫個高端的框架來提升逼格唄。
3、變數、方法命名要能表達變數作用
在程序員這個圈子很久了,就發現,程序員這貨,都喜歡這套,「這個介面幹嘛用的,有文檔么」,「自己看代碼去」。很多時候都是一臉黑。
盡管程序員閱讀別人代碼技術都是一流,不管你是有沒有注釋,不管你是怎麼循環嵌套,也不管你是怎麼命名,他們都能耐心的,把代碼分析個所以然來。但,對於程序員這個視時間寶貴如生命,分分鍾都能創造幾百萬價值的群體來說,您行行好,給我們省點時間吧,把變數是幹啥用的,說清楚唄,沒准節省的這幾分鍾,多賺個幾萬,還能請大家出去嗨呢。
每每看到部門的某大神,用一個神一般的變數名「flag」,我就有吐血的沖動,他還這個flag一直雪藏,不用,只是傳遞到第n個方法才使用,頓時心力交瘁,我的天,這個flag都是是幹嘛用的啊,後來才明白,是isPay的意思,用來標識用戶是否支付成功了。當時一口老血吐屏幕上,心裡狂吐槽,老兄,你命名個isPay會死么,我的腦細胞這么不值錢么。到後來看到,去魔法數字,用int NUM_7 = 7,而不是MAX_MEMBERS來表示最大成員、用x y z來命名變數名,各種只有作者,或者作者後來都忘了的獨特命名方式,都見怪不怪了。更有甚者,一個變數命名為passed,作用居然是「未通過」的意思,當時就石化了,作者還真是用心良苦,這都要考我細心不細心。
一個好的變數名,能幫助閱讀者了解變數的作用,也輔助了對整段代碼的理解。
4、不要show英語,鄉下的孩子傷不起唉
LZ所在的團隊,英語一直都是團隊的硬傷,但總是能看到,某位仁兄,加上大把大把的英文注釋,有些變數名也取些高大上的復雜的英語單詞。敢問,你這么高的逼格,以後我們怎麼和你玩啊。(那位仁兄其實就是LZ,年輕時唉,罪過罪過)
代碼是用來溝通的,傳遞作者意圖的,都看不懂,怎麼溝通交流。建議英語好的童鞋,英語能力可以放到閱讀英文書籍中展示,在代碼中,如果團隊英語能力很弱,避免使用英文,變數命名也盡量按照團隊英語水平來命名
5、添加必要的注釋
正如上面LZ說的,經常遭遇「你仔細看看代碼,就知道幹嘛用的」這樣的神回復。盡管閱讀代碼是每個程序員的強項,但必要的注釋,比如邏輯比較復雜的地方,添加必要的注釋,對提升團隊成員閱讀熟悉代碼的效率是有很大幫助的。試想,一個類,幾百行,沒有一行注釋,對於閱讀者來說,閱讀它將是一個多麼恐怖的事。
6、注釋保持簡潔,避免沒有必要的注釋
即看過一行注釋都沒有的代碼,也看過注釋比代碼還要多的程序。一個是讓人生不如死,一個是讓人痛不欲生。(唉,有時不僅感嘆,在程序員界混,真的是難)。
LZ就經常看過,一大段注釋,啰嗦了半天,要不就是沒表達清楚重點,要不就是只為說明它是個循環的作用!!!譬如i++這樣的代碼,有必要加個「每個計數增加1」這樣的注釋么,這完全是把讀者定位為非程序員啊,或者就是嚴重鄙視讀者的編程水平。
注釋是幫助閱讀的人更好的理解程序的邏輯,只是輔助,如果不重視通過命名等方式來傳遞代碼的作用,而是依賴於注釋,這就是本末倒置了。而且,冗長啰嗦的注釋,這到底是幫助人理解,還是阻礙人理解啊,是讀程序還是讀小說啊。
7、擁有自己的編碼規范
規范是為了讓團隊更快的理解、熟悉代碼的,同理,擁有自己的一套規范,就能幫助其他人更快的理解我們所寫的功能,減少學習和溝通成本。
8、代碼清晰簡潔的表達出作者的意思
在我們每次寫完一段代碼時,一定要問問自己,代碼是否表達清楚了我的意思,是否需要添加些注釋,名字取得是否恰當了,別人在閱讀時是否吃力。。每每看到別人一團糟的費解的代碼,就時刻提醒自己,一定要把代碼寫好咯,我也確實是這么做的,一遍又一編的檢查,看變數名、方法名是否表明了它的用途,是否有些不必要的、只是為了提升逼格的代碼,別人是否能在短時間內看懂。所有的這些,只是為了寫出一段更優美的代碼。
9、堅持並捍衛上面的准則
經常能聽到,有些公司是代碼行數來定義績效的,但作為一個有操守,並秉承基本自我修養的程序員,我們絕不能為了各種誘惑或者脅迫,甚至是自己的惰性、個性,而放棄寫出簡潔清晰,可讀的代碼。
以上的幾點,並不是嚴格的意見或者建議,只是提醒廣大程序員同胞們,在痴心與高端的技術時,千萬不要忘了,代碼不僅機器要閱讀,人也需要閱讀。就算你寫出再復雜的代碼,但它讓人完全無法閱讀,這有什麼用呢。這就如同,你很牛逼很牛逼,但別人聽不懂你說的話,還不是沒用。如果你真的寫出了可讀性強的代碼,但你也不應該鳴鳴得意,我覺得,寫出一段優美,健壯,可讀性高的代碼,是一個程序員最基本的自我修養。
⑺ 如何自學成為程序員
自學程序員的方法
對於初學者來說,可以採用視頻+書籍的方式進行學習,這兩種方式形成互補關系,另外閱讀代碼也可以幫助你解決問題,了解最佳做法,這里的閱讀代碼是書籍,博客文章,開源代碼等等。
編程教學視頻可以讓你迅速掌握編程語法等,但通常比較生動,淺顯,不成系統。而書本比較深入,系統,但是枯燥,但是最好的方法是書和視頻的結合。
在閱讀代碼後,你需要自己實際去寫代碼。可以是任何東西。可以是小的編碼任務或者一個小模塊,必須確保你能將之付諸於實踐,並用某種方式使用你學到東西。如果你不這樣做,你會發現你對編輯器無從下手,知識等待使用的時間越長,知識這把斧頭就越鈍,等待學習新知識的時間就越久,你就越難以將其融入到代碼中。
⑻ 如何成為優秀的程序員
首先是 來自自身內部的創造性的一面
雖然你可以從別人那裡學到很多東西,也可以已有的東西中得到靈感。但真正的創意靈感來自於你自己。例如喬布斯,他不是一名工程師,也不是程序員,但他很有創意,他推動蘋果公司創造了iOS,Siri。
或許你想問編程需要什麼創意?任何人都可以在線或離線學習一些課程,閱讀一些書籍就可以開始寫代碼了。但這些東西都是別人灌輸給你的,你需要有自己的一些想法和創意,想出自己的框架。例如Dennis Ritchie,他就創造性地編寫了C編程語言,而且目前這是使用最廣泛的語言。
它像任何口語一樣,每個人都知道一些語言,但不是每個人都是一個詩人或一個作家。你需要創造性的技能才能被稱為偉大的詩人或作家。
其次是技術方面
你需要從一些編程語言開始。過去很多人開始是以C語言開始編寫程序。然後很多人開始使用BASIC。現在人們從Python或PHP開始。其實從什麼語言開始不重要。重要的是一旦你掌握了這些概念,你就可以編寫演算法並繪制流程圖。
總的說來,如果你花太多時間做下面的事情,它可能會提高你的技能一點點,但你永遠不會是一個好的程序員:
只知道看書的程序員用永遠不會成為一個好程序員。俗話說All read and no practice makes Jack a ll boy,古人的話絕對是有道理的,不是說讓你不要閱讀,只是不要只有閱讀,你應該通過應用你學到的東西來構建簡單的應用程序。
通過記憶代碼和演算法。編程是思考而不是記憶。你可以擁有最好的記憶力,但是如果你沒有自己思考,你永遠不會是一個好的程序員。我們有計算機和互聯網為我們記住事情,你不需要記住任何東西 , 你只需要了解在哪裡以及如何找到你需要的信息。
通過編寫你看的書中的單個函數和演算法,即編寫愚蠢的冒泡排序函數和類似的無用演算法。
通過測試其他人的代碼。例如是否使用測試軟體或編寫單元測試等
通過閱讀和調試其他人的代碼。這可能會在短期內有所幫助,但是只是在對方的代碼寫得很好的情況下,你可以從中學到別人的一些良好的習慣;但閱讀不好的代碼作為例子會教你養成不良的習慣,而且你或許一直會記得這個錯誤的習慣。從長遠來看,花費太多時間閱讀和調試其他人的代碼將不利於你的成長。
讓別人來管理你。編程就是為自己思考,你需要自己管理自己,也就是上面所說的,要有自己創造性的思考。
成為優秀的程序員最好的打開方式就是:
你必須自己完整的完成一個項目。不要過多地把重點放在閱讀書籍,語法,演算法和功能上,也就是說,在開始時不要太關注細節。你可以簡單地坐下來思考一個你想為自己開發的應用程序/系統......如果實在需要的話,可以問你身邊的同事/老師的想法,但是你必須有自己的思考並且自己獨立去完成它。
一旦你想明白了,就把這個想法留在腦海,並且富有激情的去完成它,所有的一切都會慢慢地開始。你會想到你要實現的功能,你將開始研究如何實現這個或那個。
只有在這個時候,你才應該拿起一本書或在互聯網上搜索關於如何實現這個你認為可以做的很酷的功能的答案。隨著你的應用程序/系統的發展,你將會慢慢地開始考慮編寫更簡潔的代碼,以便在將來也可以派上用場,讓自己的工作更輕松。
只有通過把自己的想法帶入生活,你才能學會如何成為一名優秀的程序員。你應該把自己看成是一個藝術家,而不是像編寫代碼的人那樣去編譯和運行。如果你只是在別人的代碼上工作,或者只是閱讀書籍等,你將很快失去動力,你永遠不會發現或利用你的才華。
⑼ 剛踏入職場的程序員,如何快速踏實地提升自己的能力
程序員提升主要靠實踐,跟一個完整的項目能最大限度的提升項目能力,以後找工作不用愁啊,現實工作中很難達成,你可以去找找培養這方面人才的,提升一下自己,你看看願碼ChainDesk,有你需要的
⑽ 要做程序員需要學會什麼
其實簡單來說,程序員的工作就是使用編程語言,根據需求寫出一個程序。
但是,在這個過程中,涉及如下幾個方面:
使用的編程語言 程序員需要選擇一門或者多門語言來編程,不同的語言適合編寫不同的程序,目前主流編程語言包括,Java、JavaScript、Python、C++、php以及其他小語種等等,每種編程語言適合開發的程序有所不同。目前從程序應用分來,主要可以分為三類a 企業應用,主要用於解決企業業務。各種企業管理後台系統,銀行系統,公安系統,圖書管理系統等等。
b 互聯網應用,面向互聯網用戶,為互聯網用戶提供各類服務。比如現在的京東淘寶各類電商系統等。
c 移動應用,各類在移動端使用的APP,有面向互聯網用戶的APP,也有面向企業內部的APP。
目前相對而言,在移動應用和互聯網應用方面,資本投入比較熱的風口,程序員的薪資較高。企業應用,發展了很多年,相對平穩。
2. 明白需求,實現需求
需求就是編寫程序的要求。一個程序要編寫成什麼樣子,具備哪些功能,都是由需求來具體說明。程序員要需要能看懂需求文檔,並且能准確地使用編程語言,根據需求中的要求來編寫成程序。企業開發的項目,往往會由該程序的架構師提供一個程序框架,程序員在該框架的規范下進行編程,實現需求的功能,以確保程序的規范、可讀,以及可維護性。
3. 日常工作寫程序
一個軟體開發一般流程是產品經理根據用戶需求做一個項目出來,然後UI設計師做一些圖片設計,前端開發編寫頁面,後台開發編寫核心編程,然後介入一些大數據和人工智慧,通過測試之類上線實施,後期還有運維進行相關維護。
程序員一般大多指的是前端和後台寫代碼程序的開發人員,除了編寫代碼,可能還需要通過介面和其它系統對接,實現系統間的數據交換。像單體測試,是程序員對自己寫好的程序單元進行測試,檢測這個程序單元數據輸入和數據輸出是否符合預期等等。測試出來的問題,需要修改正確,然後再測試,直至沒有問題。和同事共同開發的時候也需要聯合測試,以及用戶測試過後如果存在BUG繼續進行修改。