程序員成熟的標志《程序員成長路線圖:從入門到優秀》

對好書進行整理,把好內容共享。

我見證過許多的程序員的成長,他們很多人在進入成熟期之后,技術上相對較高,一般項目開發起來比較自信,沒有什么太大的困難,有的職位上也有所提升,成了項目經理、設計師,有的甚至是到了管理者的位置。又經過很長時間,這些程序員卻在也沒有什么變化和發展,工作穩定、情緒穩定,好像一切都在按部就班地進行著。有的程序員滿足于現在的收入和職位,安于現狀;有的程序員卻在安于現狀的同時,苦苦思索,卻找不到自己的上升空間。

我想說的是,滿足于現狀的程序員并不能成為優秀的程序員,永遠也不會實現程序員最初那個夢想。而對于那些思索于未來的程序員來說,探索自己的上升空間是一個非常重要的事,有上進心的人始終是這個社會追捧的對象。那么這個階段程序員的上升空間在哪里呢?這個問題是仁者見仁,智者見智的問題,同時也是和程序員個體情況相關的問題。因此,我們可以用嘗試的心態,提出自己的看法和建議:

1、 技術上的反思和提高

無論程序員個體之間差異有多大,我認為程序員上升空間在于技術上的反思和提高。程序員到了成熟階段,往往有一種狂奔到終點后的那種感覺,身體疲乏無力,特別需要休整再戰。要知道程序員在“奔跑”的時候,一般是在使用自己的體力,很少用到跑步的技術和技巧。尤其是到最后,更是依靠體力來支撐。從技術提高的曲線來看,新手的技術提高速度最快,無論從時間還是急迫性兩個方面對新手的壓力挺大的。而到了成熟階段,其編程時間也大大縮短了和學習技術的迫切性也降低了,所以技術提高速度就慢下來許多。在現實中,我們真的看到有些年輕的程序員還看不起那些程序員的技術水平呢,就是這個道理。

因此,成熟的程序員在安頓之后,一定要坐下來反思自己,看看自己的技術發展之路,哪些走的比較踏實,哪些走的比較急促;哪些是自己的技術特長,哪些是自己的技術薄弱環節。反思后一定要抽出時間抓緊學習,把自己的技術上明顯不足的地方給補上,這樣程序員的技術水平加上豐富經驗和工作能力會使得自己更加具有實力,可以應付各種挑戰,為今后的發展鋪平道路。

而那些順其自然的思想,使得程序員缺少技術提高的主動性,程序員有明顯的技術上的問題,也不主動去解決,而是拖之再拖,從而使得程序員的成熟度大打了折扣。

2、 走向軟件設計師

其實很多程序員走到這個階段已經在做軟件設計師工作了。這是絕大多數程序員發展的必經之路。因為,程序員在編程序的時候,一方面會實現設計的功能,另一方面也在對設計有一個理解、認識、熟知的過程。進而慢慢地從學習別人設計,轉向到自己參與或獨立設計。如果這個程序員真的非常非常喜歡程序員這個職業,則可以轉向軟件設計師。這個轉變很大程度是程序員意識的轉變,就是說要把編程的時間,逐步分攤到軟件設計上,要把重點從編程實現轉變到項目的功能設計上。我這里強調的是“逐步”的一個過程,程序員要逐步減少編程的時間,增加設計的時間,要克服編程的強大吸引力,要主動地攀上設計這個臺階。很難有一個設計師是完全不編程的,而且我認為,會編程的設計師才是真正的設計師。一般這種轉變需要花上一到兩年時間。

3、 走向項目經理

也有一些程序員工作機遇比較好,不但負責了項目的設計工作,而且負責了項目管理工作。對項目經理這個工作有了一定的嘗試。因此,這類程序員可以審視一下自己,是否合適這項工作。如果自己對這種工作比較滿意,而且具備項目經理的要求,則可以向項目經理這個方向發展。項目經理承擔著項目管理的職責,對項目負主要責任。它和程序員的作用也不相同,項目經理的重點已經從編程轉移到對人、對技術、對進度、對項目的管理。由于軟件的項目經理與軟件項目的相關性太大,因此,他必須要了解軟件開發的各個環節、了解開發的各種技術和運用、了解開發隊伍人員的水平和特點。所以他依舊和程序員脫不了干系。從程序員到項目經理可以使得項目經理更好地理解程序員在項目中的地位和作用,了解軟件開發的各種規律性的東西。從而保證項目的正常完成。而且,項目經理的收入在公司中的地位也是比較高的。因此,我認為走向項目經理是程序員的另一個發展空間。我想提醒一下,程序員在擔任項目經理之前最好要把軟件設計工作做好,這樣在做項目經理的時候,就會有很好的基礎。

4、 走向管理者

很多程序員希望自己能成為公司中的主管、經理、老總、老板,這樣無論是收入和在公司的地位都相對比較高一些。另外,一方面程序員可能厭倦了年復一年的編程工作,對工作產生了抵觸情緒,希望能擺脫這種步步緊逼的工作狀態。走向管理者其實要求程序員要比一般人做更多的準備,要做更多的轉型工作,并不是想當管理者就能成為管理者的。但是,如果程序員有這個志向和愛好,有積累了這方面的工作經驗,自己也感覺在這個方面能夠發展,更重要的是有這樣的機會,走向管理者也是可能的。由于軟件公司的管理者畢竟不同于一般公司的管理者,專業能力越強,管理起來就越得心應手的,沒有專業能力的管理,遇到的問題很多,也很難解決。因此,我的建議程序員最好要把編程、項目設計、項目管理等基礎打打好。這樣轉型到管理者成功率就會高一些。

5、 走向軟件營銷

我一直說,程序員最大的缺點之一,就是眼光只盯在技術上。程序員在入門階段和成長階段,這種情況還是屬于正常的。但是,到了成熟階段這種缺點將嚴重影響了程序員的發展。程序員在工作中不免會接觸到用戶,不免會了解到用戶的需求。從而了解到軟件實際發揮的作用,進而了解了自身的工作價值所在。有的程序員則固步自封,不愿意和外界打交道,從內心里堅守技術底線。有的程序員則喜歡和外人交流,喜歡把自己的軟件推薦給用戶,而且用戶也樂意接受這種專業的介紹,用戶的接受是程序員價值的直接實現,程序員因此獲得了工作成就感。這類的程序員可以將自己的專業知識和產品營銷結合在一起,推動軟件的銷售和服務,轉向軟件營銷職業。這個職業將是一個比程序員更有發展的職業,它可以直接反應程序員的工作能力和工作成果,程序員的收入和銷售會直接掛鉤。因此,可以讓有才華的程序員獲得更高的收入,接觸到更大的軟件市場,看到更廣的個人發展空間。

6、 原地發展

當然也有一些程序員惰性比較大,滿足于現狀,享受著眼前的勝利果實,也無可非議。對待這些程序員,我們不要強求他們改變自己的想法,我建議是原地發展,把本職工作做得更好,把自己的技術水平往上再提高一步。在這個過程中他們的能力和自信心都會得到提高,他們的想法不會一直一成不變的。磨刀不誤砍柴功,刀快了自然會去砍柴的。

7、 跳槽走人

還有一種情況,程序員工作很努力,技術水平也有很大的提高,工作成績也很突出,但是,公司的工作環境讓他感覺不好,例如,收入和付出差距很大,而且短期內看不到加薪的可能;自己的技術水平已經超出公司開發所需,英雄無用武之地;公司的經營狀況比較差、看不到公司未來;公司的人際關系緊張,小人當道,自己得不到重用等。他可以選擇跳槽走人。要說明的是,這個時候跳槽走人你是有本錢的,這個本錢就是你積累的工作業績、技術水平和工作能力。

程序員在成熟期面臨著上升空間的選擇,是上還是不上往往決定了程序員今后的發展。水往低處流,人往高處走,只要程序員有向上的意識,不滿足于現狀,根據自身的特點和資源選擇發展方向,我想程序員一定會有很好的發展前途。



打工的是指被發工資的人,“老板”是指發工資的人。很多人有這樣一個邏輯:老板是有錢人,當了老板就有錢了。于是乎當“老板”就成了許多人“脫貧致富”的一種理想、一種追求。

程序員經過了一個成長期發展之后,慢慢地成熟起來,原來那種單純地把技術學學好,把工作做做好的想法也有了一些變化。尤其是那些發展較好的程序員(最好是一個人能獨立開發軟件的程序員),他們一方面從編程技術上提高很快,另一方面在項目設計、項目管理上也開始了嘗試。最重要的是他們看到了軟件銷售的金額和軟件銷售的市場。他們發現只要能把軟件開發出來,然后把軟件賣了出去,自己也能開公司當老板。尤其是當自己的報酬和自己創造出的價值相差巨大的時候,這種當老板的念頭更加強烈。

我記得“不想當將軍的士兵不是好士兵”這句名言,對于程序員去當老板,我舉雙手贊成。在中國就是缺少那些有理想,有闖勁的創業精神。看看全國那么多人熱衷于報考公務員,我們就可以想象這個國家人們在追求的是怎么樣的生活了。從這個角度上來說,程序員無論是在心中想當老板的,還是真正邁出當老板一步的,都是值得那些不想當老板的程序員尊敬的。畢竟,我們更崇尚那些有理想、有勇氣的人。

很多人認為這個人當老板是不會成功的,但這個人卻成功了;很多人認為這個人當老板一定會成功,但這個人卻失敗了。這些例子比比皆是。這說明當老板并沒有一定的要求,每個人去當老板都可能有其當老板的理由;不是局中之人是沒法體會的。所以,對自己不了解東西,不要輕易地給出自己的判斷。市場之中,一切皆有可能。

在我身邊的程序員也有去當老板的,有成功的,也有失敗的。在這么多年IT歲月里,我也特別留心各種程序員當老板的各種報道,總想從中悟出什么道理出來。很多人就是從軟件單價*銷售個數得出的巨大金額而動心去當老板的。例如,程序員預計這個軟件單價為2萬元,可能的用戶有100個,2*100=200萬。程序員就會為這200萬而下定決心去當老板了。

我認為程序員當老板應該注意以下幾個問題:

1、 要有堅定的信念

要想當老板,不能只想不做,或者今天想做,明天又不想做了,反反復復,猶猶豫豫,當老板的機會就會喪失了。要做,那就要堅定信心,精心準備。準備越充分,信心就會越充足。

2、 要有獨立開發能力

當軟件公司的老板,并不需要太多的資金。開始的時候,一般只有一個人,或是幾個人就能開張了。正是因為如此,當老板的一定要具有獨立的開發能力,有了開發能力,才能保證開發周期,才能保證按時向客戶提供軟件。否則,依靠創業伙伴或招收新員工都有很大可能在規定的時間內完成不開發任務的,或保證不了軟件質量的。這樣會造成創業的失敗。

3、 要有強烈的市場意識

當老板首要的條件就是要具備市場意識,具備市場意識,意味著程序員要把工作重心轉移到軟件用戶在那里?軟件能賣多少錢?軟件能否銷售出去?成本是多少?利潤是多少?是賺是虧?諸多方面。如果這種意識不強烈,腦子里還是考慮到程序怎么編?程序要采用什么新技術?,程序要有什么技術含量?這些技術問題上,那這種程序員真的不能當老板。因為當老板應該把絕大多數時間放在市場上,這樣市場上才有可能給你回報。就如同程序員把大部分時間放在程序上,程序員的編程技術才會提高。

4、 要有客戶資源

很多創業者一般都會有一兩個客戶的,他們會理所當然地認為,同類的客戶都可能是自己的用戶。其實這是一個很大誤區。潛在的客戶并不是很容易地成為自己的用戶的。不少創業者做了一兩單子后,就是缺少持續的用戶而堅持不下去了。所以,當老板一定要首先考慮你的客戶在那里,要營銷多少客戶公司才能維持下來,怎么樣才能營銷出這么多的客戶。

5、 要有克服困難的準備

從現實的角度上來問題,開公司當老板并非易事,我和軟件公司的老板們有過交談,他們的苦衷、苦水、苦頭。

6、 要有凝聚力

凝聚力是非常重要的,在創業初期,除了要明確合作伙伴與公司之間的承諾、開發人員與公司之間的用工協議之外,還要把他們凝聚在一起,使大家為了一個目標而共同奮斗。這種凝聚力取決于領頭者要具有那種素質,那種能力,給與同伴以信心,給以同伴以信任,給以同伴以支持,給以同伴以榜樣。

7、 要有管理能力

當老板要有管理意識和管理能力,開始的時候,程序員的角色還沒有轉變。以前是別人要自己干什么,自己處于一種被動和等待狀態;現在則是要求別人干什么,自己處于一個主動和積極的狀態。管理意識則要在創業前就要有所準備,管理能力是逐步提高的。隨著企業的發展,管理越來越重要,不重視管理、不具備管理能力,企業就會很快垮掉的。

8、 要有溝通能力

這里的溝通能力,主要是創業者的外部溝通能力。程序員由于長年和計算機打交道,客觀上和主觀上與外部人員接觸比較少,因此,其溝通能力是比較弱的。但是,當老板必須要有溝通能力,才能了解到市場信息、才能把自己的產品介紹給客戶,才能進行商務談判定下合同。

總的來說,程序員在成熟之后,未嘗不可去當老板。但是,在此之前,要做些當老板的準備。準備越充分越好。即使失敗了,也可以重新去找工作,也可以再一次等待當老板的機會。


程序員在經歷了若干年編程工作之后,很想知道自己水平到底如何?自己是否已經成為成熟的程序員?雖然程序員會對自己有一個自我評價,但是,自己的評價和社會的評價、專業的評價會有差異,所以程序員自己并不能肯定這個評價。現實中,除了各種證書之外,很少有人會專門給出一個程序員的成熟度的評價。人們往往是偶發性地就事論事地對程序員的工作作出好與不好,行與不行的評論。因此,程序員對此感到很茫然,不知道要從那些方面去評價自己的能力。

一個程序員到底成熟不成熟,我想從以下幾個方面談談自己的看法。

1、技術標志

如果程序員不會編程序那決不是程序員,程序員至少要掌握一門程序設計語言,要能夠用這種語言去編寫程序去解決他想解決的問題。但是,成熟的程序員往往掌握不止一種程序語言,三到四種語言的掌握是必須的,一種二種語言的精通也是必須的。

除了從掌握程序設計語言個數之外,我們還可以從其他幾個方面去看看程序員在技術上水平。例如,函數編寫能力(命名、格式、大小、分類、參數、復用等),面向過程的能力,面向對象的能力,數據庫技術能力,效率處理能力,安全處理能力,網絡處理能力,軟件構架能力,人機交互能力,通用軟件能力,軟件文檔能力等等。尤其是面向對象技術的掌握和運用,以及面向服務的技術都是成熟程序員所必需掌握的。

2、時間標志

雖然程序員的天資、素質、基礎知識各不相同,所經歷的工作內容以及環境也不相同,但是,時間也是程序員成熟程度的標志之一。一般程序員需要經過三到五年的時間才能日趨成熟。其中入門需要一年,成長需要兩年。這是我經過長期觀察得到平均數據。我并不認為成熟時間越短程序員就越聰明,就越了不起。享受每個階段充分的時間,會讓自己成長更加充實、更加成熟。當然,也有超期而不成熟的情況,這也是很正常的。

3、項目標志

程序員的社會性是程序員成熟的標志之一。沒有參加過項目的程序員,程序編得再好,只能是純程序類的程序員,是一個孤獨的高手,是一種個人型的程序員,遠沒有成熟。項目作為社會性活動,體現了項目的社會價值。所以項目能力也是程序員成熟的重要標志之一:項目能力包括參加項目的個數、項目的大小、在項目中承擔的角色等等。就項目承擔的角色而言,主持開發(項目經理)3個以上項目是必須的,這是一個必要條件。一個程序員如果沒有主持過開發,無論參加過多少項目的開發,無論是在程序編寫或項目設計上發揮了多大的作用,是很難被稱之為成熟的,因為項目的組織、協調和管理是反映一個程序員成熟程度的又一個標志。就如同一個程序員能參與過10個以上大大小小的項目或能參加或能主持兩個以上大型項目的開發,其成熟程度是可以信賴的。若低于此數,則說明程序員離成熟還有相當的空間。“我們在項目中成長”可見項目對于程序員的意義是多么的巨大。

另外,一般程序員只是為一個企業客戶進行開發一個或多個項目,或同行業的企開發項目,如果程序員能夠如果程序員能夠開發過多個行業的項目,其成熟度要比一般人要高一些。

4、思維標志

幼稚和成熟在思維方式上還是有很明顯的區別的。就程序員而言,不成熟的程序員邏輯性不強,程序編得沒有條理,即使程序員自己進行了解釋也沒人能看懂。而成熟的程序員應該具有很強的邏輯性,程序編得井井有條,不用解釋別人也能看得懂。這種邏輯性還體現在軟件的構架設計、數據庫設計、算法設計等多個方面。程序員通過全集子集概念、時間概念、順序概念、重點非重點概念等對各種事物進行邏輯分析。例如,以順序概念為例,不成熟的程序員往往會采用自底向上的思維方式來開發程序。他們先考慮程序的具體實現,然后再考慮功能設計、最后考慮構架設計。而成熟的程序員則采用自頂向下思維方式,先考慮構架設計、再考慮功能設計、最后才考慮編程的具體實現。前者思維方式主要是出于工作慣性,只適合入門階段,而后者思維方式反映了后者的進步,適用于各種項目開發或大型項目的開發。

除了在思維內容上的邏輯性之外,程序員還應該處理好動腦和動手的關系。重視思維本身就是一種成熟的標志。成熟的程序員的思考時間要大于動手編程時間,想好之后只要一次就編程成功,而不成熟的程序員往往動手編程時間要遠大于思考時間,而且是邊做邊想,通過反復來逼近最終目標。

另外,在思維范圍上,成熟的程序員要比普通的程序員有更開放視野。他們更容易去接受新的東西,更容易不受各種約束去考慮問題,更勇于去挑戰自己和高手。

5、與人交往

很多人認為程序員是和計算機打交道的行業。這只是這個職業的特點。但是,只要是工作必然就是一種社會勞動。而社會勞動則必須和人進行交流和溝通。盡管程序員的勞動工具是計算機,但并不意味著程序員只想著這個工具。從這個工具的下游來看,程序員還是要考慮用這個勞動工具生產出來的軟件產品是否有人購買,是否有人使用,是否運行正常,從這個工具的上游來看,是誰讓程序員了解設計方案的,是誰讓程序員編程序的,是誰讓程序員程序通過驗收的等等。因此程序員在軟件制作各個環節都會與其他人打交道。只有和人進行有效的交流和溝通我們的工作才能進行下去才能做的更好。

如果一個程序員還沉浸在個人勞動的意境之中,對外界持有冷漠、無奈、恐懼的心理,內心里不愿意和外界打交道,無論自己感覺自己的技術水平有多高,還是一個不成熟的程序員。而成熟的程序員一定是特別重視與人的交往,無論是上級領導、外部客戶、項目經理、團隊同伴這些與自身工作密切相關的人還是那些非同單位同行朋友、網友等他們都會認真去聽取別人的闡述、要求、意見、建議、反饋等。從中得到更多的工作上的、技術上的、生活上的好的想法,以便自己參考和吸收。與此同時,與人交往也反映你有好的想法和好的技術水平交流出去,而這些想法和技術水平也是你成熟度一種反映。那些沒有想法和技術水平的程序員的確是怕和別人交流的。

與人交流的有兩個基本能力,一個是理解能力,一個是表達能力。兩者缺一不可。例如,有的程序員理解能力差,不能理解項目經理提出的要求,有的程序員表達能力差,無邏輯,無重點,啰里啰唆,讓別人不知所云。這都是不成熟的表現。

6、別人評價

別人的評價尤其是單位同事以及對自己工作情況比較了解的人對自己的評價是有參考價值的。一般而言,評價差的,一定是不行的,是不成熟的。評價好的要看情況而定,單位同事對人的評價會從兩個方面來考慮,一個是這個人的為人情況,一個是這個人的工作能力。如果兩者都不錯,我們有理由認為這個程序員是成熟的。反之,無論是工作能力強,但為人不好,為人很好,工作能力不強,我看都不能算一個成熟的程序員。

所以,程序員要注重別人對自己的評價,在提高自己技術水平的同時,學會做人,做好人,學會與他人分享,這樣別人才會給自己更好的評價。

無視別人評價其實,也是一種不成熟的表現。只有自己感覺好,大家感覺好,那才是真的好。

其實,別人的評價如果僅限于自己單位的話,恐怕這種評價的價值會打折扣,如果這個單位技術人員的人數很少,水平普遍很低,即使你鶴立雞群,大家對你的評價很好,但是,你和其他公司和單位的程序員來比,你真的不一定的成熟。所以,我說別人的評價僅僅是一個參考。

7、收入標志

收入也是成熟程序員一個參考標志。收入的大小往往是對程序員社會價值的認可度,表明程序員的勞動值這個價錢。一般而言,成熟的程序員能夠掙得軟件業平均收入的中上水平,或者在一個單位或部門中能夠掙得比80%左右員工要高的收入。而剛參加工作不久的程序員收入應該與其相差很大的。另外,單位的項目獎金發放也可以看出程序員在項目中的地位和作用。

現實中,我們知道程序員的收入和其付出是不是正比的,而且,越是能力強的、貢獻大的程序員,可能不一定比那些不如其它能力不如他的程序員高出許多。這不是軟件行業的通病,幾乎所有行業都存在這種情況。通過分析我們認為程序員成熟度應該是和其收入高低掛鉤的。如果,我們知道我們能力和貢獻大大超出我們的收入,我們就有理由向上級領導提出自己的收入要求。

8、心理素質

程序員常常面對各種各樣的成功和失敗,尤其是失敗更是多于成功,這也是程序員這個職業特點之一。以編程為例,幾乎沒有一個人一次就能把程序給編好的,它總是要遇到各種語法錯誤,總要遇到各種遺漏,一個程序要反復多次修改調試才能完好。有的程序員因找不出來程序的bug,束手無措,哀聲嘆氣,心里極其不爽。以工作為例,有的程序員因工作進度和程序出錯常常受到別人的批評和指責,心里極其不滿,認為批評人不了解造成這個結果的客觀原因,批評錯了人。從而對人產生意見,甚至對工作造成了影響。面對失敗和挫折,成熟的程序員會坦然面對:編程時出現問題不可怕,有什么問題就解決問題,解決不了的問題可以想其他方法進行解決,不在一棵樹上吊死。面對別人的批評和指責,首先從自身查問題,是自己的問題,那就要主動承擔責任,并盡快改正。不是自己的問題,應該換位思考,理解批評人的焦急心態,并找機會給予說明。良好的心理素質在面對困難和挫折的時候,就會很坦然,很堅強,很自信。

程序員也會面對成功的。有些程序員因開發了某個項目,因編寫了某個程序而感覺良好,在不自覺中表現出我最牛,我最好的樣子,面對他人夸夸其談,而對其他人不屑一顧。而更有甚者并其無成果,表現平平,卻依然會擺出一個高手的樣子,有的僅僅參與了某個項目,而且不是項目主要開發者,卻會貪天之功,歸其所有,好像這個項目是他主持開發的。這些其實也是心理素質不成熟的另一種表現。成熟的程序員面對成功并不會感覺到高人一等,該是自己的功勞就是自己的功勞,該是別人的功勞就是別人的功勞,即使自己比別人水平高出許多,他還是在想還有更高的技術頂峰等待攀登,不可自傲,看到別人取得的成績首先感到去祝賀,然后去學習,而不是心懷嫉妒,從中挑刺,盡量貶低。

良好的心理素質使得程序員更加理性地處理好各種成功和失敗帶來的各種問題,更有利于程序員超越自我,以平常之心去迎接更大的挑戰。

當然一個程序員是否成熟是一個仁者見仁,智者見智的話題。有的人強調程序員的個人能力方面,有的人強調是程序員的社會能力方面。我認為從以上8個方面綜合地去評判一個程序員是否成熟應該能說明些問題了。我們標志成熟,一個目的是對程序員前面成長過程給與一個肯定和鼓勵,讓程序員認清自己的所處的階段,讓自信找出依據。另外一個目的是對程序員未來成長提出更高的要求。走向優秀是程序員面臨的更大的挑戰。


很多程序員到了成熟階段后,就會處于一個停滯狀態。技術上已經駕輕就熟,工作上已經按部就班,心里雖然感覺有些不甘,但是何去何從他們顯得很茫然很無助。我認為程序員到了成熟階段后,如果還想要向優秀階段發展,一定會遇到這個瓶頸的,穿過這個瓶頸就會走進另一片開闊的前景,穿不過則會停留在原地止步不前。

1、技術瓶頸

技術上的瓶頸是很明顯的,主要表現在,對學習缺乏熱情,對技術缺乏鉆研,對新技術發展缺乏了解等三個主要方面。其中原因主要是:第一,成熟的程序員編程技術已經能夠滿足開發軟件的要求,很多人認為只要能編出來就行了,至于編得更好,那就要看興趣了,看時間允許了。第二,由于成熟程序員承擔著比一般程序員更多的工作,比如軟件設計和項目管理,比如和用戶打交道、和領導打交道,很多時間精力無法放在編程上面。第三,由于軟件開發任務一般都比較緊,工作起來必須加班加點才能完成,因此,沒有時間再做技術上的深入。第四,很多程序員處于一個自發的發展狀態,自己的成長完全取決于自己工作內容,工作內容強度和復雜程度決定了其技術水平的高低,因此,他自己根本不知道自己技術發展的方向是什么,技術上的差距是什么,也就無從談起自己的努力的方向。

因此,成熟的程序員應該有更上一層樓的意識,千萬不要固步自封,夜郎自大。首先要對自己在技術上有一個客觀的分析,看看自己的長項在什么地方,弱項在什么地方。對自己的弱項就要想辦法進行克服,千萬不要留在那里,日后必然會影響自己的進步。比如,很多人弱項在面向對象的設計方法,人機界面交互,大數據量處理,處理效率等,如果有這些方面的問題就要想盡辦法去解決。其二,要注重編程基礎技能的深入掌握,很多時候程序員只是拿來主義,知其然不知所以然,把基礎缺失的那個部分再補回來,為今后向更高的技術境界打下基礎,比如像操作系統,網絡知識、程序設計語言、數據庫、系統構架、軟件工程等基礎知識,要重新審視,把其中有用的知識掌握好,并且要學會把各種基礎知識給串聯起來,加深對基礎知識的認識。其三,要逐步把編程技術從功能實現方面轉向參數化設計、軟件構架等高級階段方面的研究,在共享、通用、標準化方面有所建樹。

2、工作上瓶頸

程序員在工作上也存在向上的瓶頸。就一般而言,很多程序員在這個階段工作上比較穩定:領導對自己相對比較了解和信任,同事對自己的工作能力和技術水平也比較認可,軟件用戶對自己的服務也相對比較滿意。因此,在充滿工作上的滿足感的同時,工作上日復一日,沒有什么新意,疲倦感油然而生,而以往那種激情很少有地方釋放了。所以,程序員有時也會思考自己在工作上究竟要在什么地方進行突破,究竟怎么才能更上一層樓。

程序員在工作上的現狀,還是來自于軟件公司或部門上級的安排所致,盡管自己在具體工作上付出很多,編程上有很大的自主權,但是從總體上來看,程序員只是企業經營過程中的執行人員,是一個被動的角色。因此,程序員要改變工作上的現狀,程序員必須要有主動意識,盡可能主動地規劃好自己的發展方向,主動地向上級反映自己的想法和打算爭取上級的理解和支持,在工作條件許可的情況下,把自己的時間和精力以及主點放在自己關心的方面。例如,程序員感覺自己編程方面已經滿足工作要求了,但是自己與客戶打交道的能力,市場資源的積累很差。他就可以向主動上級提出自己想做售前工作,如果領導同意,則可以在這個崗位上,提高自己這方面的能力。在崗位不調整的情況下,可以根據自己的工作范圍,盡可能多多和客戶打交道,了解客戶的需求,從而為自己開發的項目做好基礎,同時通過與客戶打交道和客戶交朋友,為自己的市場資源做些積累。其實在工作層面上可以有很多值得改進的地方的。

3、收入上瓶頸

說到底程序員最大得瓶頸在于收入上的瓶頸,雖然經過多年的努力奮斗,收入也有了一定得提高,有的甚至達到了社會平均收入的中上水平。但是,面對中國的生活現實,買一套房需要花光幾十年得收入(即使按揭還是要每月償付本息的),而且工作很難穩定到幾十年不變(除非是公務員)。因此,絕大部分程序員的收入是很難滿足那種程序員向往的生活,尤其是過上中等生活的要求和過上穩定生活的要求。當然,例外總是有的,極少的程序員收入也是相當高的,生活過的很滋潤。就普遍情況來看,我們付出的和得到的是不成比例的,這不能不說是社會的一種悲哀。回到某個程序員具體情況來看,程序員的收入一般比較穩定,有的一年動一次,有的幾年動一次,這要看所在各公司情況和所在單位部門情況而定。程序員和其他職業的員工一樣很少在工資收入方面有自己的話語權。

程序員經歷了成長過程的風風雨雨之后到了成熟階段,收入應該比過去高了許多。但是程序員的預期和實際收入的反差是程序員內心最大的煩惱,因此,增加收入或大幅度增加收入是程序員無法突破得瓶頸。

面對收入瓶頸,程序員應該調整心態,光靠埋怨是絕對無用的。要解決這個問題,程序員可以從以下幾個方面來考慮。第一,程序員可以本公司部門進行收入增加的挖潛,可以主動提出調整到收入高的崗位,可以參加高獎金的項目開發,凡是能夠增加收入的各種工作都可以考慮去做。第二,在這個基礎上,如果程序員感到自己的收入還是無法達到自己的預期,不妨可以考慮離開這個公司或部門,通過應聘高薪工作的方式來提高自己的收入,當然這種選擇還是要慎重的,要考慮多方面的影響,很多情況下收入不是唯一的因素,未來收入和現有收入很小的差距更是忽略不計的因素。第三,程序員在條件和精力的許可的情況下,可以從事一些第二職業,由于程序員這種職業特性,程序員可以獨立完成某個編程任務,也可以和其他人共同完成編程任務的,通過從事第二職業,程序員可以增強市場意識,可以比本公司、本部門知道更多的軟件的價值,結識更多的軟件同行,學習更多編程技術,并且獲得相應的勞動報酬。更重要的是在此期間可能會遇到自己發展的機遇。

滿足現狀的程序員就不可能遇到這些瓶頸,他們會在一個自己的世界中得到滿足,他們會在這種滿足下持續自己的工作,求得一份平靜的生活。而那些不滿足現狀的成熟程序員,那些追求優秀的程序員,因追求而困惑,因瓶頸而求突破。程序員只要不甘于現狀,只要認定一切要靠自己,只要準備付出比過去能多精力,只要準備克服比過去跟多的困難,只要求新求變,最終都會破繭成蝶的。那絢麗的天空下,那自由飄飛的彩蝶正是他們未來的身影。


從技術層面上來看,優秀程序員和一般的程序員相比,其中一個重要區別就是重心從程序制作轉變到構架制作。絕大部分程序員關心的是如何將各種各樣的需求通過計算機語言進行編程實現。因此他們有三個方面的重點:需求、編程、需求到編程那個過程。所以他們的主要精力在用于需求是什么?需求怎么變成功能設計?如何實現功能的程序編寫?他們的出發點是需求,終點是程序。

隨著我們編寫程序的數量增多,我們慢慢地會發現有兩條主線同時在運動,一條是用戶需求,一條是程序編寫。就用戶需求而言,我們就會發現不同用戶的項目之間的需求比較類似,做的越多我們看到相同的需求或類似的需求就越多。在程序編寫方面,我們面對相同需求或類似需求的時候,就會自然用原來的程序或用原來的程序進行修改來完成了。同理,程序編寫的越多,我們用到的原來的程序的次數就越高。這種現象是和需求趨同的規律是一致的。在項目開發過程中,我們就會自然而然地將相同的需求用相同的程序來完成。于是,我們就會產生了需求和程序之間的對應關系。例如,我們想要在A項目中檢查一下用戶的權限,我們自然就會想起以前在B項目編寫過的check_usr_right這個函數。于是我們就會把這個函數拷貝過來用在A項目之中。雖然,拷過來的函數并不能完全滿足項目A檢查用戶的權限要求,我們可以對check_usr_right函數進行改造,這樣就成了新的check_usr_right函數了。如此一來,我們就會積累出很多相同的程序,這些相同的程序表現為公用函數、控件、類庫等。這種編程方法和最初一心實現需求、采用原始的連續性編程方式相比,開始考慮了軟件構架問題了。

那么什么是軟件構架?軟件構架就是站在軟件自身角度上(而不是站在需求角度上)編制軟件的技術方法。通俗地說是軟件之上的軟件。如果我們一個窗戶看作一個項目,那么窗框就可以看作成構架,而窗框里的小框和玻璃以及玻璃上的貼花和貼膜,則可以看作小構架和構架下的各種功能。我們可以看到,窗戶的形狀(方形,長方形、半圓形、異形等)是由窗框決定的,而窗框中的小框和玻璃等是在窗框范圍之內的。因此,我們可以這樣認為,軟件構架決定了這個軟件的大范圍和構架,而其中的功能軟件則是在這個構架之下的功能實現。

既然我們知道軟件構架是軟件之上的軟件,那么軟件構架和我們一般程序有什么不同呢?我認為其不同之處在以下幾個方面。

1、 抽象和具體之間的差別

一般程序主要是解決具體的需求,形成一個具體的功能。比如,要計算1+2等于幾,非常之具體,程序員容易理解。而軟件構架并不針對一個具體的需求,比如,要進行算術表達式處理。當然這個算術表達式的處理,也可以處理1+2等于幾的需求,但是,這個算術表達式是抽象的,并沒有具體的需求,但是能處理具體需求。

2、 大和小之間的差別

一般程序主要是解決具體的需求,程序很小,功能點也比較直接,并不復雜。而軟件構架則是軟件之上的軟件,考慮問題比較多。例如,它要考慮軟件的整體的一個構架,構架中的各種模塊的功能,構架中的模塊之間的關系和接口,構架怎么與具體程序相聯系等各種問題。因此,構架程序量是很大的,功能也相對復雜。

3、 高和低之間的差別

一般程序在解決需求時并不會去給軟件分層,最多是按B/S,C/S,或者是按表示層、邏輯層、數據層三層構架來進行程序分層。另外,一般程序只要能滿足具體需求就OK了,其技術上的并沒有硬性的要求。但是,軟件構架就不同了,它是將軟件進行了分層處理,最上面是構架,最下面才是具體功能。因此,軟件構架對技術要求相對是比較高的,比如程序的結構,程序的效率,程序的通用性和擴展性,程序的并發處理、程序的例外處理等等。這樣有了軟件構架概念之后,軟件就分為構架軟件和具體軟件兩個部分了。構架軟件處于上層,可以應用于各個項目,而具體軟件或稱具體程序則處于下層,這個具體程序和我們現在所說的一般程序很接近,這兩者結合形成了具體的項目或系統。

4、 全面和局部之間的差別

一般程序主要是解決一個項目的某個具體需求,因此,它體現出程序的局部性,所以一個項目可以給不同的程序員去完成。軟件構架在設計時或者在制作時,則是站在全局的高度來審視整個抽象的項目,一方面要考慮構架本身的功能,另一方面要考慮到如何向具體程序提供合適的接口。這兩個方面都需要對項目或軟件有一個整體認知,而不僅僅限于某個局部。

當然以上的差別是非常宏觀的,并不很具體。但是,有一點是可以肯定的,那就是軟件構架制作是和一般程序編寫不同的。這一點需要程序員去細心地體會的。如果一個程序員沒有軟件構架的意識,只是滿足于停留在一般程序編寫的優劣之中,那是很難進入優秀程序員行列之中的。那么什么是軟件構架的主要內容呢,程序員應該關注那些問題呢?

1、 構架意識

意識,我仍然在強調意識的重要性。沒有對某個事物重要性的意識,就不會關注和研究這個事物,就不會去主動掌握這個事物,就不會利用這個事物去創造更大的價值。同理,如果我們的程序員沒有構架意識,就會在普通程序員中求得那種優越感,時間一長就感到自己在軟件中沒有可以發展地方。而有了構架意識,我們的程序員就可以在原有的編程基礎上,向更高層面發展,那里有更大的空間需要我們去學習和展示自己的才華,可以說構架領域中的學識和技術是沒有止境的。

2、構架制作

光有構架意識還不夠,還要讓構架從設計走向程序,這就需要進行構架制作,也就是說我們要編制構架程序。而編制構架程序,就涉及到具體的程序設計語言,涉及到具體程序語言的特性、涉及到具體程序設計語言的編程技術和技巧。這些編程需要程序員要有很扎實的編程基本功,很高的程序設計的技巧,以及程序編制的豐富經驗。構架制作絕大部分都是面向對象、面向抽象功能、面向通用、面向參數化的編程。

3、 構架應用

我們不能為構架而構架,我們編制構架的其中目的,就是可以更快、更好、更節約地開發出我們的應用系統。如果我們編制的構架不能運用到具體項目開發中,或者編制的構架反而比普通的編程效率更差,質量更差,達不到我們預期的目標,那么我們的構架只能是失敗的構架,失敗的構架比沒有構架更加糟糕。因此,我們要編制那些有用的構架,并且通過具體項目的開發來驗證構架的正確性和有效性。可以這樣說,開發的項目越多,構架的積累也就越多。只有這樣我們才能讓我們的構架更加具有實用性和實用價值,在開發和運用中發揮越來越大的作用。

4、 構架研究

構架一方面是一個實用的程序,另一方面也是一門學問,它需要理論和實踐的不斷地結合和完善來體現其價值。例如,我們如何劃分構架程序與具體程序之間的界限;我們面對各種應用系統是采用統一構架方式,還是采用多構架方式來完成項目的開發;我們在應用構架時如何設計和應用參數,并使得參數運用更加簡便合理;我們在采用不同程序語言在制作構架時應該注意什么問題;我們如何處理構架與具體需求之間的關系;我們怎么利用具體程序與構架之間的接口實現動態程序的掛接等等話題都是我們可能要面對和解決的。因此,我們要靜下心來,要學習構架各種知識,要大量積累項目開發經驗,區分那些是屬于構架方面的功能,那些是屬于具體程序方面的功能,研究采用什么樣的編程技術才能達到構架的最佳效果。理論和實踐的結合才會讓我們長成騰飛的翅膀。

采用構架的方法開發程序可以讓你的程序技術上個檔次,讓你的項目結構更加清晰,讓你的項目開發更快更好,讓你的項目更具有可維護性和具備可擴展性。

沒有構架的約束,我們可能更加自由,但是,有了構架的約束,我們可以讓自由更加有價值。追求價值才是我們最終的目標。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452536.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452536.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452536.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Diango博客--1.Django的接客之道

文章目錄0.思路引導1.實現最簡單的HelloWorld2.實現最簡單的HelloWorld(使用Templates)0.思路引導 django 的開發流程: 即首先配置 URL,把 URL 和相應的視圖函數綁定,一般寫在 urls.py 文件里,然后在工程的 urls.py 文件引入。 …

c語言is int number,C語言中NSInteger,NSNumber以及Int的區別

NSInteger和NSNumber首先:NSInteger,NSNumber并沒有什么關系,更不要想當然的以為二者還有什么繼承關系,甚至還有人問NSInteger是不是NSNumber的子類?答案當然是NO!!!NSInteger只是一個基本的數據類型,而NSNumber是OC的對象,并且NSNumber繼承自NSValue,NSValue又繼承自NSObject…

Git的GUI工具sourcetree的使用

一、Git的學習這部分學習廖雪峰的git教程,參加以下鏈接:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b0001、首先是git的基本概念,如下圖所示:整個git管理主要分為工作區、版本庫&#xff0…

YY一下,扎克伯格做了一個什么樣的AI家居助手?

對于這款令小扎太太抓狂的AI家居助手,難道就沒人好奇嗎? 據說,扎克伯格每年都要給自己定個目標,而他也即將完成今年的目標——打造一個AI家居助手。 當初,在定下這個目標時,小扎為我們簡單描述了一下&…

Diango博客--2.博客從“裸奔”到“有皮膚”

文章目錄0.思路引導1.更改視圖函數,從數據庫中獲取數據2.網上下載模板,添加靜態文件3.修改模板Templates中css、js文件的加載路徑4.修改模板,引入模板變量,獲取數據庫數據0.思路引導 前文的Hello World 級別的視圖函數特別簡單&a…

抽象

人類在認識復雜現象的過程中使用的最強有力的思維工具是抽象。人們在實踐中認識到,在現實世界中一定事物、狀態或過程之間總存在著某些相似的方面(共性)。把這些相似的方面集中和概括起來,暫時忽略它們之間的差異,這就是抽象。或者說抽象就是…

程序員的成長從開竅開始系列 一、如何擺脫低級錯誤的困擾

最近,有兩位Google Maps API的初學者向我請教他們按照最簡單例子寫的程序為什么不能正常的運行。 其中一位用GTalk跟我交流,我仔細了看了他的代碼,沒看出問題,把代碼保存在本地,打開Firefox的錯誤控制臺,用…

脈沖時間寬度c語言,什么是脈沖寬度_脈沖寬度是什么意思

脈沖寬度是個很廣泛的詞,在不同的領域,脈沖寬度有不同的含義。脈沖寬度從學術角度講就是電流或者電壓隨時間有規律變化的時間寬度,平時研究主要是方波,三角波,鋸齒波,正弦函數波等等,這些波形變…

HDU - 5919 Sequence II

題意: 給定長度為n的序列和q次詢問。每次詢問給出一個區間(L,R),求出區間內每個數第一次出現位置的中位數,強制在線。 題解: 用主席樹從右向左的插入點。對于當前點i,如果a[i]出現過…

Django博客--3.創作后臺開啟

文章目錄0.創建admin后臺管理員賬號1.在 admin 后臺注冊模型2.漢化應用的標題3.漢化應用下各個模塊的名稱4.漢化應用下各個模塊的屬性的名稱5.文章列表顯示更加詳細的信息6.簡化新增文章的表單7.自動設置文章作者為當前用戶8.設定創建時間為當前時間9.設定修改建時間為保存時的…

逐步求精

逐步求精定義為為了能集中精力解決主要問題而盡量推遲對問題細節的考慮。 逐步求精最初是由NiklausWirth提出的一種自頂向下的設計策略。按照這種設計策略,程序的體系結構是通過逐步精化處理過程的層次而設計出來的。通過逐步分解對功能的宏觀陳述而開發出層次結構…

raid-6磁盤陣列損壞導致數據丟失的恢復過程(圖文教程)

一、故障描述機房突然斷電導致整個存儲癱瘓,加電后存儲依然無法使用。經過用戶方工程師診斷后認為是斷電導致存儲陣列損壞。整個存儲是由12塊日立硬盤(3T SAS硬盤)組成的RAID-6磁盤陣列,被分成一個卷,分配給幾臺Vmware…

編寫登錄注冊

const readline require(readline-sync);let error 3;let user [{username: 001,password: 123}, {username: 002,password: 456}, {uesrname: 003,password: 789}]//登錄let denglu function () {while (true) {console.log(請輸入您的登錄賬號:);let username…

android將字符串轉化為json,將字符串轉換為JSON數組

將字符串轉換為JSON數組我從Web服務獲得以下字符串的JSON,并嘗試將其轉換為 JSONarray{"locations": [{"lat": "23.053","long": "72.629","location": "ABC","address": "D…

談新技術學習方法-如何學習一門新技術新編程語言

學習一門編程語言或者編程技術的方式基本上是這樣一個流程: 1,對學習這門語言或者技術的必要性進行評估。比如你是工作需要,或者興趣所至,甚至是為了把妹。這個必要性關系到你要學多深入,需要學習多長時間。 比如我想…

信息隱藏和局部化

信息隱藏原理:應該這樣設計和確定模塊,使得一個模塊內包含的信息(過程和數據)對于不需要這些信息的模塊來說,是不能訪問的。 局部化是指把一些關系密切的軟件元素物理地放得彼此靠近。 如果在測試期間和以后的軟件維護期間需要修改軟件&#…

圖像識別自動化android,Android自動化測試

寫在開頭:Android UI 自動化測試推薦網易的Airtest,也是谷歌推薦的,操作簡單,而且基于圖像識別根據用戶操作界面自動生成Python測試代碼JUnit單元測試testImplementation junit:junit:4.12image.pngimage.png使用gradle命令進行單…

如何重構“箭頭型”代碼

本文主要起因是,一次在微博上和朋友關于嵌套好幾層的if-else語句的代碼重構的討論(微博原文),在微博上大家有各式各樣的問題和想法。按道理來說這些都是編程的基本功,似乎不太值得寫一篇文章,不過我覺得很多…

Django博客--4.開發博客文章詳情頁

文章目錄0.思路引導1.設計文章詳情頁的 URL2.獲取文章的URL3.編寫 detail 視圖函數4.編寫詳情頁模板5.更改主頁中跳轉詳情頁的地址鏈接6.模板繼承--抽取base.html7.模板繼承--修改 index.html使其繼承base.html8.模板繼承--修改detail.html使其繼承base.html9.結果展示0.思路引…

10、并發容器,ConcurrentHashMap

Java 提供了不同層面的線程安全支持。在傳統集合框架內部,除了 Hashtable 等同步容器,還提供了所謂的同步包裝器(Synchronized Wrapper),我們可以調用 Collections 工具類提供的包裝方法,來獲取一個同步的包…