程序員是壹個技術性的工作,在IT的發展中起著非常重要的作用。程序員在其中扮演著重要的角色,從底層硬件通信協議的建立,到數據傳輸層的處理,到操作系統的搭建,到數據庫平臺的搭建,到應用層各種數據營銷平臺的搭建,為IT的發展做出了巨大的貢獻。
中國擅長編碼的人很多,但是中國的軟件行業存在很多誤區,尤其是在網絡應用的開發上。難以形成大規模的軟件開發力量和產品能力,不僅遠遠落後於美國,也相當不如印度。這些問題不在於我國程序員的智商和努力程度,也不在於國家和人民在開發上的投入,而很大程度上在於對技術、程序開發、項目設計的壹些思想誤區,導致軟件行業產品化能力不足,大規模、大規模復用系統的研發能力不足。可以說,改變認識誤區是解決軟件行業小作坊模式和個人英雄模式帶來的局限性的壹項重要工作。
中國有很多孩子。分別是18,9歲或者21,2歲。他們也通過自學寫了很多代碼。有些寫得很漂亮,有些技術細節也相當出眾,也很好學。但他們受到壹些錯誤認識和觀點的影響,缺乏對制度和程序的整體認識。這些人,壹個網上的朋友,說的很好。他們實際上是。我根本沒有資格做程序員,但據我所知,很多小網絡公司的CTO就是這樣壹個編碼迷,工資嚇人,項目嚇人,項目的結局通常都很嚇人。
程序員的基本素質:
做壹個真正合格的程序員,或者說真正能完成壹些代碼工作的程序員,應該具備的素質。
1:團隊精神和合作能力
把它當成壹種基本素質,並不是不重要。反而是壹個程序員安身立命最基本最重要的基礎。說高級程序員是獨行俠,那是廢話。任何個人的力量都是有限的。即使是萊納斯這樣的天才,也需要通過組建強大的團隊來創造奇跡。那些全世界為linux寫核心的高手,沒有合作精神是不可想象的。獨行俠可以做壹些能賺錢的小軟件,發個小財,但是壹旦進入壹些大系統的R&D團隊,進入商業化和產品開發的任務,缺乏這種素質的人就完全不合格了。
2.記錄習慣
可以肯定的是,高級程序員從來不寫文檔。良好的文檔是正式R&D流程中非常重要的壹環。作為壹個代碼程序員,30%的工作時間用來寫技術文檔是正常的,但作為壹個高級程序員和系統分析師,這個比例要高得多。沒有文檔,壹個軟件系統就會缺乏生命力,在以後的檢錯、升級、模塊重用等方面都會遇到很大的麻煩。
3.標準化和規範化的代碼編寫習慣
像國外壹些知名軟件公司的規則,對代碼的變量命名,代碼中註釋的格式,甚至嵌套行的縮進長度,函數間的空行數量都有明確的規定。良好的寫作習慣不僅有助於代碼移植和糾錯,也有助於不同技術人員之間的合作。壹些編碼愛好者叫囂,高級程序員寫的代碼,別人永遠看不懂。這種叫囂只能證明他們根本不配自稱程序員。代碼可讀性好,這是程序員的基本素質要求。讓我們看看整個linux的構造。沒有標準化和規範化的代碼習慣,全球R&D合作是絕對不可想象的。
4.理解需求的能力
程序員需要理解壹個模塊的需求。很多孩子在寫程序的時候往往只關註壹個功能需求。他們把所有的性能指標都歸結於硬件、操作系統和開發環境,而忽略了自己代碼的性能考慮。有人曾經誇口說,寫壹個廣告交換程序非常簡單。這種人永遠不知道在幾百萬甚至幾千萬訪問量的情況下,業績指標是怎麽達到的。對於這樣的程序員,即使妳給他深藍的系統,他也做不到太極鏈的並行訪問能力。在性能要求中,穩定性、並行訪問支持能力和安全性非常重要。作為程序員,需要評估模塊運行的環境,將要承受的負載壓力以及各種潛在危險和惡意攻擊的可能性。在這壹點上,壹個成熟的程序員至少需要2到3年的項目開發和跟蹤經驗,才能有任何經驗。
5.可重用性,模塊化思維能力
我們經常能聽到壹些程序員抱怨自己寫了幾年程序,成了技術工人。他們每天都在重復寫壹些沒有任何新意的代碼。這其實是中國軟件人才最大的浪費,壹些重復性的工作成了熟練程序員的主要工作,其實是完全可以避免的。
可復用設計,模塊化思維就是要求程序員在完成任何壹個功能模塊或功能時,要多思考,不局限於完成當前任務的簡單思路,而是要思考該模塊是否可以脫離本系統而存在,是否可以通過簡單修改參數在其他系統和應用環境中直接引用,這樣就可以大大避免重復開發工作。如果壹個軟件R&D單元和工作組能夠在每壹個R&D過程中考慮到這些問題,那麽程序員就不會在重復性的工作中浪費太多的時間,就會有更多的時間和精力投入到創新的代碼工作中。
壹些好的程序模塊代碼,甚至是70年代寫的,現在在壹些系統中也可以作為功能模塊使用,但是我現在看到的是,很多小公司只要軟件壹升級或者改進,就把所有的代碼重寫,大部分重復性的工作都是無謂地浪費時間和精力。
6.測試習慣
至於壹些商業化、標準化的開發,專職測試工程師是必不可少的,但並不意味著程序員可以不用專職測試工程師進行自測;作為壹個項目,軟件研發的壹個很重要的特點就是發現問題越早,解決問題的成本越低。程序員通過仔細測試每壹段代碼和每壹個子模塊,可以盡早發現和解決壹些潛在的問題,從而保證整個系統構建的效率和可靠性。
其實測試需要考慮兩個方面。壹方面是正常調用的測試,即看程序在正常調用下能否完成基本功能。這是最基本的測試職責。可惜的是,它已經成為很多公司唯壹的測試任務,其實遠非如此。第二個方面是異常調用的測試,比如高壓負載下的穩定性測試,用戶潛在異常輸入下的測試,整個系統局部故障下模塊受影響狀態的測試,頻繁異常請求阻塞資源時的模塊穩定性測試等等。當然,程序員沒有必要對自己的每壹段代碼都進行如此完整的測試,但程序員必須清楚自己的代碼任務在整個項目中的位置以及各種性能需求,有針對性地進行相關測試,盡早發現並解決問題。當然,這需要具備上述理解需求的能力。
7.學習和總結的能力
程序員是人才很容易被淘汰和掉隊的職業,因為壹項技術可能只領先三兩年。程序員要想安身立命,就必須跟上新技術,學習新技能。
善於學習是任何職業的必要動力,對於程序員來說這個要求更高。但是學習也需要找準目標。壹些小編碼迷也說說自己的學習能力。他們學了壹段時間的asp,php,jsp。他們以此為炫耀資本,盲目追逐壹些膚淺的、表面的東西和名詞,在不懂中斷向量處理的情況下做網絡程序,做應用程序。這樣的技術人員,無論掌握了多少所謂的新語言,也絕不會。
善於總結也是學習能力的體現。每完成壹個研發任務,壹段代碼,都要有目的地跟蹤程序的應用狀態和用戶反饋,隨時總結,發現自己的不足。壹個程序員只有逐步提高,才能成長。
壹個沒有成長的程序員,即使目前是高手,也建議不要選,因為是他落伍的時候了。
具備以上所有素質的人都應該是合格的程序員。請註意,以上素質不是智商決定的,也不是某些大學課本上能學到的。需要的只是程序員對自己工作的理解,這是壹個意識問題。
那麽,作為壹個高級程序員,甚至是壹個系統分析師,也就是對於壹個程序項目的設計者來說,除了以上所有的素質之外,妳還需要具備以下的素質:
第壹,需求分析的能力。
對於程序員來說,了解需求可以完成合格的代碼,但是對於R&D項目的組織和管理者來說,他們不僅要了解客戶的需求,還要自己做壹些需求。為什麽這麽說?
壹般來說,R&D任務可能由客戶提出,也可能由營銷部門提出。此時,對於R&D部門,他們看不到完整的需求。壹般來說,需求只是壹些功能性的需求,或者更正式地說,他們可能會得到壹個完整的用戶視圖。但這還不夠,因為客戶可能會因為更多的非技術因素而難以提出完整清晰或專業的性能需求,但對於項目組織者和計劃者來說,他必須能夠清楚地認識到這些需求的存在,並在完成需求分析報告時恰當地提出,同時要在設計規格書中得到充分清晰的體現,這樣程序員在編碼時才不會丟失這些準則。
程序員必須正確理解用戶需求所處的環境,有針對性地進行需求分析。例如,通過ASP租賃和許可發布的相同軟件的性能要求可能不同。前者強調更好的支持和穩定性,而後者可能強調在各種平臺下安裝和使用的通用性和簡單性。
二、項目設計方法和流程處理能力。
程序員必須能夠掌握至少兩到三種項目設計方法(如自頂向下的設計方法,如快速原型法等。),並能夠根據項目需求和資源配置,選擇合適的設計方法進行項目的總體設計。設計方法選擇不當會延緩R&D循環,浪費R&D資源,甚至影響R&D效應。
壹個程序員還需要花費大量的時間在流程圖的設計和處理上,他需要制作數據流程圖,建立數據字典;他需要處理邏輯流程圖以形成整個系統處理流程。壹個有流程問題的系統,即使代碼再漂亮,每個模塊再精致,也不會成為壹個好系統。當然,要做好流程分析,選擇好的項目設計方法,需要在需求分析能力上有足夠的把握。
第三,復用設計和模塊分解能力。
這好像又是老壹套了。基本素質不是已經說明這個問題了嗎?
作為壹個從事模塊化任務的程序員,他需要考慮他所面對的具體功能模塊的可重用性,而作為壹個系統分析師,他所面對的問題要復雜得多,他需要根據壹個模塊化的分析能力,將整個系統分解成許多可重用的功能模塊和功能,並對每個模塊形成壹個獨立的設計需求。比如像汽車生產。起初,每輛車都是獨立安裝的,每個部件都是量身定制的。但是後來就不壹樣了,是機器批量生產的。某汽車廠開始通過流水線生產汽車,獨立零部件開始具有壹定的可重用性。後來標準化成了大趨勢。不同型號、品牌甚至不同制造商的汽車零部件也可以很容易地更換和升級。這時候汽車生產效率最大化。軟件工程也是如此。在壹個成熟的軟件行業中,在壹些相關的項目和系統中,可以隨意替換不同的組件。比如微軟的很多桌面軟件都是在很多操作模塊(比如打開文件、保存文件)中復用的同壹套功能模塊,通過壹些類庫把這些接口提供給桌面應用開發者方便掛鉤,這就是復用模塊設計的明顯證明。
將壹個龐大復雜的應用系統分解成壹些相對獨立、復用性高的模塊,僅通過少數幾個參數完成數據連接,是高級程序員和系統分析師最重要的工作。合適的項目設計方法和清晰的流程圖是實現這壹目標的重要保證。
四、項目整體評價能力
作為壹個系統設計師,妳必須能夠從大局出發,對項目整體有壹個清晰的認識,比如公司的資源配置是否合理到位,比如項目進度是否能最大化發揮效率,不能按期完成。評估整個項目和每個模塊的工作量,評估項目需要的資源,評估項目可能遇到的困難,都需要大量的經驗積累,換句話說,這是壹個需要不斷總結和積累才能達到的境界。在西方,壹些軟件系統設計負責人年齡很大,比如4、50歲甚至更老。他們在編碼方面遠不如年輕人靈活,但就項目評估而言,他們幾十年的經驗積累才是最重要最寶貴的財富。中國缺少這樣壹代程序員,主要是因為缺少那個年齡段的程序員,但是因為那個年齡段的程序員基本都是研究機構做出來的,不是專業產品軟件研發出來的,也沒有積累那種產品研發經驗,這也是無奈之舉。
第五,團隊組織管理能力。
要完成壹個項目,團隊的齊新需要齊心協力。作為R&D的項目設計師或總監,他應該能夠最大限度地發揮團隊的整體力量。由於其專業性,技術管理不同於壹般的人事管理,因為設計了壹些技術指標和因素。
首先是工作的量化。沒有量化,就很難實現恰當的績效考核,程序的量化也不是簡單的計算代碼行數。因此,需要技術經理真正評估壹個模塊的復雜性和工作量。
其次,團隊合作模式的調整。壹般來說,程序開發的合作通常是分組的,主要是程序員的方式和民主的方式。根據程序員能力水平與項目研發需求的差距,選擇合適的團隊組建方式,使責權利與成員的工作任務緊密結合,實現團隊組建效率的最大化。
壹個代碼水平高的人不壹定是壹個合格的項目研發主管,這方面能力的缺乏往往容易被忽視。
綜上所述,可以看出,作為壹個R&D的負責人,壹個項目設計師,所需要的素質和能力,並不是寫程序代碼的能力。當然,壹般情況下,當壹個程序員通過不斷的總結和改進達到這種素質的時候,他的代碼編寫能力是相當簡單的,但是請註意因果關系。壹個高水平的項目設計師通常是壹個非常擅長代碼編寫的人。但是,並不是說壹個代碼優秀的程序員就能勝任項目設計,也不存在智商和教材的問題,或者說是壹個程序員在積累經驗逐步提高的時候沒有意識到要思考什麽,沒有自覺地去琢磨項目的組織和復用設計,沒有規律的文檔習慣和總結習慣。不改變這些,我們合格的項目設計師還是非常缺乏的。
最後,壹個軟件項目研發的設計流程是怎樣的?以通常的標準設計方法為例。
第壹步是市場調研,技術和市場要結合起來才能體現最大的價值。
第二步是需求分析,需要三樣東西,用戶視圖,數據字典,用戶操作手冊。用戶視圖是用戶(包括終端用戶和管理用戶)可以看到的頁面樣式,包含很多操作流程和條件。數據字典是指出數據的邏輯關系並對其進行排列的東西。當數據字典完成後,數據庫的設計就完成了壹大半。用戶操作手冊是指示操作過程的說明。請註意,用戶操作流程和用戶視圖是由需求決定的,所以要在軟件設計之前完成,為程序研發提供約束和準則。可惜太多公司不這麽做,而且因果顛倒,順序不分,所以開發工作和實際需求往往是割裂的。
需求分析,除了以上工作,筆者認為作為項目設計人員,要對項目做壹個完整的性能需求陳述,因為往往性能需求只有懂技術的人才能理解,這需要技術專家和需求者(客戶或公司營銷部門)之間真正的溝通和理解。
第三步是總體設計,初步劃分系統的功能模塊,給出合理的R&D流程和資源需求。作為壹種快速原型設計方法,完成輪廓設計後可以進入編碼階段。通常采用這種方法是因為所涉及的R&D任務屬於壹個新的領域,技術總監壹開始無法給出壹個明確的詳細設計規範,但這並不代表詳細設計規範不重要。實際上,快速原型法在完成原型代碼後,需要根據評估結果和經驗教訓,再次進行詳細的設計步驟。
第四步是細節設計,這是考驗技術專家設計思維的重要關口。詳細的設計說明應該以最幹凈的方式(黑盒結構)向編碼人員提供具體的模塊,以最大化系統的整體模塊化;壹個好的詳細設計規範可以最小化編碼的復雜性。其實嚴格來說,壹份詳細的設計說明書應該詳細提供每個功能的每個參數的定義。從需求分析到概要設計,再到完成詳細設計說明書,壹個軟件項目應該是完成了壹半。換句話說,壹個大型軟件系統在完成壹半的時候,實際上還沒有開始壹行代碼的工作。那些把做軟件簡單理解為寫代碼的程序員,從根源上就犯了錯誤。
第五步是編碼。在標準化的R&D過程中,整個項目過程中的編碼工作最多不會超過1/2,通常為1/3。俗話說,設計過程完成得好,編碼效率會大大提高。編碼過程中不同模塊之間的協調合作是最重要的。也許壹個小模塊的問題可能會影響整體進度,以至於。編碼時溝通和應急方案非常重要。對於程序員來說,bug永遠存在,妳必須時刻面對這個問題。大名鼎鼎的微軟有沒有連續三個月發不出補丁的時候?絕不!
第六步是測試。
測試有很多種:根據測試執行者,可以分為內部測試和外部測試;按測試範圍可分為模塊測試和整體調試;根據測試條件,可分為正常運行測試和異常情況測試;根據測試的輸入範圍,可以分為全覆蓋測試和抽樣測試。以上都很好理解,就不解釋了。
總之,測試也是項目研發中非常重要的壹步。對於壹個大型軟件來說,3個月到1年的外部測試是很正常的,因為總會有不可預知的問題。在測試、驗收和最終幫助文檔完成後,整個項目將告壹段落。當然,未來還會有升級,維修等等。只要不想壹錘子買賣騙錢,就必須持續跟蹤軟件的運行狀態,持續修復升級,直到徹底淘汰軟件。
打好專業基礎
學習編程語言:C,C++,Java,Perl,Python。
參加課外活動。
加入電腦俱樂部或社團。
參加編程競賽
盡可能多的爭取實習機會。
參與開源項目(別忘了參與——谷歌代碼之夏)。