㈠ 為什麼有的程序員的代碼結構混亂
程序員都有一顆工程師的心,所以當他們到一片新的場地想做的第一件事就是,將舊的一切推倒重來。是的,他們決不會滿足於簡單的增量勞動。
或許這種微妙的心理定位可以解釋:為什麼程序員進入新項目組後寧願丟掉舊代碼重新寫,也不願意修修補補。他們認為舊代碼簡直一團糟。
但是,事實上真是這樣嗎?你之所以認為舊代碼一團糟,其實是由編程的一個基本定律決定的,那就是:寫代碼容易,讀代碼難。
為什麼你覺得舊代碼異常混亂?因為讀代碼更難。
這大概就是代碼Reuse難以實現的原因。 這就是你組里的每個人都喜歡用不同的功能將分割的字元串轉換成一個數組。比起猜測舊的功能是怎樣實現的,重新寫一個自己的功能要簡單和有趣多了。
作為這個公理的推論,你可以問問身邊的程序員他們正在奮戰的代碼怎麼樣?「簡直是一塌糊塗!」他們肯定會這樣說。「我簡直想推倒重來!」
為什麼認為代碼這么糟糕呢?「額,看看這個功能,竟然有兩頁長!完全不知道這些東西為什麼在這里!完全不知道這些API是干什麼的。」他們會這樣回答你。
漫畫:讀別人代碼是一種怎樣的體驗?
曾經,Borland的創始人 Philippe Kahn當初就是向記者們吹噓:Quattro Pro會比Microsoft Excel要好用得多,因為它是從頭開始編寫的,全部都是新的源代碼!
但是,認為新代碼比舊代碼好簡直就是荒謬。舊代碼是已經運行過的,測試過的。無數的bug在被發現前都上線運行過,發現之後程序員們可能在花了好些日子才修復了這些bug。這種修復可能是一行代碼,也可能是幾個字元,無數的時間和精力都花在了這些bug修復上。
當你決定拋棄這些舊代碼從零開始的時候,你也丟掉全部前任努力的結果。
新代碼一定比舊代買好?NO,重寫可能會帶來更大的風險。
對技術領導者來說,重寫項目的代碼也是一個異常艱難的決定。因為從公司層面說,重現代碼甚至會威脅產品的市場競爭力。一旦決定重寫代碼,那麼與競品相比,你可能落後了2~3年——在軟體行業,這時間可夠長的。
你理想中的新代碼會帶來產品功能的提升▼
但事實上,即便重寫的新代碼可以實現舊代碼的所有功能和需求,但是為產品帶來的市場競爭力只有邊際提升。因為重寫用的新技術、新語言、新框架並沒有給產品帶來質的飛躍。
更不用說在重寫的漫長過程中可能會遇到一些意外情況,比如:
1、缺錢:資金鏈的斷裂▼
2、缺人:核心程序員離職
最終導致效果不佳:達不到原產品應有的所有功能和需求,白白浪費了時間和金錢,也丟掉了市場競爭力。▼
所以重寫代碼意味著,你在把自己置身於非常危險的境地,可能幾年後你也寫不出比以前更好的代碼。你只是花了一大筆錢把已經存在的代碼又寫了一遍。
當你覺得眼前的舊代碼很爛時,該怎麼辦?
你覺得舊代碼寫的很爛,那又怎樣呢?它們已經上線,已經在實際運行中經受住了考驗。所以當你發現前任留下的代碼亂七八糟的時候,不妨冷靜下來,從以下三個方面入手理解代碼、改善代碼:
1、代碼的結構有問題
如果一段網路代碼突然彈出了自己的對話框,應該是UI代碼需要被處理。這些問題可以被解決掉,你要一次次小心地移動代碼,重構,改變介面。還需要一位細心的工程師立馬仔細地檢查這些改變是否有問題,從而不打擾到其他人。事實上,甚至比較大的結構變化也可以不扔掉代碼來完成。
大牛程序員Joel Spolsky回憶說,曾經在某個項目中,他和他的團隊花了好幾個月重新架構在一點上:把代碼動來動去、清理、創建有意義的基類,並創建了模塊之間的完美介面。但是他們始終非常小心翼翼,並沒有產生新的bug、也沒有丟掉任何舊代碼。
2、代碼的效率不高
曾經,Netscape的渲染代碼被傳非常緩慢。但事實上,這只會影響該項目的一小部分,這部分是你可以優化甚至重寫的。你完全不必重寫全部代碼。優化速度的1%工作量,會讓你獲得99%的爆炸性提高。
3、代碼寫得很醜
有些代碼真的寫的很醜,比如Joel曾參與一個項目,開始用下劃線做開始的成員變數約定,但後來改用更標準的「M_」。所以一半的功能用「_」開始,一半用「M」開始,這看起來真的很醜陋。但這個問題5分鍾就能解決,而不用從頭開始寫全部的代碼。
最後,你要記住,從頭開始再寫一遍並不意味著你會寫出比以前更好的代碼。因為你沒有參與到上一個版本的創建,所以你其實根本就不算有經驗。一旦你准備推倒重寫,你可能會再犯一遍版本一犯過的錯,甚至會產生更多的新問題。
一個總結:
面對糟糕的舊代碼,Keep Calm & Carry On !
在大型商業項目中,推倒重來是非常危險的行為。當然,如果你是在做實驗,想到新演算法可以隨時重寫。
㈡ 作為一個程序員需要學多少技能
作為一個程序員到底要學多少技能呢?我看了好多的資料大概的總結了幾點:
1、學好"物理" 基礎演算法和數據結構。是計算機世界的基本定律,是程序問題的終極答案。
2、學好「化學」 各類系統和語言的關鍵性質,提供能寫出優秀程序的原料。
3、學好「生物」 不同的技術構成不同的生態系統,不同的生態系統有不同的規則。程序符合生態系統環境,才能長成參天大樹。
4、學好「歷史」 技術從哪裡來,要到哪裡去。
5、學好「文學」 寫明白文檔,表達好邏輯,起得好名字,用得好隱喻。
6、學好「建築」 鋼鐵,水泥,腳手架,防災,抗壓,無單點,架構是系統的核心。
7、學好「藝術」 寫程序對得起自己的眼睛,做產品對得起用戶。
8、學好「經濟」 成本、收益和時間幫助你做編程時的主要決策。
責任就是程序員們的方向,經驗就是資深程序員的資本。把及其復雜是的事情簡單做,就是專家;把簡單的事情重復做,就是行家;把重復的事情用心做,就是贏家。
㈢ 如何成為一個牛逼的程序員
如果要想成為一個厲害的程序員,涉及到的方面比較多。
首先要了解計算機的組成原理、結構體系,還要熟練掌握多種編程語言,以及常見的演算法。
還需要熟悉各種軟體知識:網路、圖形圖像、數據結構、編譯原理等
同時熟悉相關的專業知識,這個得看所在行業了。如在電力行業的軟體需要對電力調度、保護設備等了如指掌。
這些,需要投入大量的時間進行學習。需要毅力才可以實現,不是說說就行的。
㈣ 按時是什麼意思用造句
'「按時」是指依照約定或規定的時間去做事情,與「准時」含義相同。.
1、你務必要按時到達那裡。
2、你必須按時到達那裡。
3、如果你不能按時到達,應該預先通知他們。
4、讓我們替孩子們穿衣服吧,否則我們決不會按時到達。
5、達到你的潛力並不是按照計劃在你的所要做的事情清單上按時地劃掉每一項。
6、所以一定要按時做該做的事情。
7、他想要按時工作,所以他把需要做到的都寫下來:起床、淋浴、更衣、准備早餐、吃飯、開車上班、停車和買咖啡——所有的這些都要在早晨9點之前完成。
8、按時參加會議和約會也是信守承諾,如果你在參加宴會時遲到了,要打個電話告知,不辜負自己的任務和責任。
9、在某些情況下,可能需要向構建構件應用緊急修補程序,以便能繼續進行測試或保證按時投入生產環境。
10、我的父母甚至還為我支付了四年的房租,而我所要做的就是按時畢業而已。
11、我們明天能按時去那兒。
12、但是,我仍然在尋求更好的方法來運作項目,以及按時和在預算內交付可靠和可伸縮的應用程序。
13、當然你必須按時的加點肉,水果,麵包;但是有了水和蔬菜你已經有了至少一半。
14、這條定律說的是一個任務將按時展開並且它看起來的復雜度取決於你為他預留的時間。
15、在業務領域,輕量級開發讓您可以按時完工,積極響應客戶,從而節省時間和金錢。
16、這些團隊想要作出傑出的工作並開發高質量的軟體,按時並按合約的規定來完成項目。
17、然而,程序員肯定總在回答同樣空泛的問題,而人們也在問:為什麼軟體很少按時並在預算內交付。
18、擁有任務的詳細步驟不僅有助於確保正確和按時地完成任務,而且還有助於讓那些工作人員暫時替代其他人員。
19、雖然無力償還的消費信貸已經備受關注了,但是,消費者並非唯一無法按時還貸的人群。
20、這讓一切都發生了改變。鮑勃該接管該部門,那個部門能按時完成的項目不多。
21、你已經把一切計劃安排妥當,也分派了小任務,整個項目應當可以順利地按時完成。
22、但發卡商可通過新的或有良好信用記錄的客戶彌補喪失的收益,其中包括三分之一通常都按時還款的持卡人.
23、我們的主要聚焦點是使重要的代碼按時完成。
24、許多人都說他們的學業被找工作影響,而21%的人發現他們一直在玩命以便能按時完成他們的工作。
25、首先,如果他們正在抄襲一家網站,他們就有見不得光的想法而且很可能你將因此不能得到按時發放的或全部的薪水。
㈤ 程序員為什麼是吃青春飯,而不是像醫生律師一樣越老越值錢
程序員也是越老越吃香,問題是大多聘不起和工資吸引力不夠了。中國程序沒幾年,很多工作10年後就有500萬以上資產了,靠程序理財和偶爾接外快輕松年入50萬以上,一些創業元老級更是手握億元資產靠分紅理財就能年入千萬。所以很多企業工資對程序員沒吸引力了,加上孩子需要陪伴之類,程序員選擇退休。財富自由後每天在家陪孩子,偶爾做做外快,和對象秀恩愛享受生活,工作還有什麼吸引力?順便說一下,程序員財富自由不是中國個例。美國前幾個月因為有一個上古程序,因為年輕的會的人太少發愁,有些老人去幫忙~都看不上人家的錢了。
程序員一般消費慾望也低。像明星,漏稅9億的還要賺錢,因為鬧離婚手裡剩幾百萬的就喊生活拮據的,因為消費慾望高。程序員大多出身理工科,消費慾望只比普通人高一些,不會名牌包,化妝品等買上一堆當擺設,互相攀比也沒娛樂圈嚴重,所以不工作後收入完全能滿足他們的消費慾望。
㈥ java應該注意什麼,經常編碼錯誤在哪
如果你用ide例如Eclipse來開發,如果你的代碼不符合java語法和邏輯的話,它會提示你錯誤的。如果你的代碼可以正常通過Ide的檢測,那就只剩下運行時異常了,例如NullpointerException啊什麼的。
㈦ 青蛙扒了皮還會跳,程序員呢
hacker 們天性上是反對獨裁的. 任何一個給你命令的人就能給你一個獨裁式的工作,並且可以給你一些笨的可以的理由, 停止你解決任何吸引著你的問題. 所以任何獨裁式的行為都會被挑戰, 以免會危害到你和其它的 hacker 們.
Hacker 們(有創造力的人也是一樣)永遠不該做一些無聊而單調並且愚蠢的反復性工作. 因為, 如果這樣的事情發生的話, 這表示他們正在做一些不是他們該做的事-- 解決新的問題. 這樣的浪費對任何人而言都是一種傷害. 無聊單調的工作不只是無趣而己, 而且是一種有害的物質.
要做為一位 hacker 要能盡可能的自動避免無聊, 對此你必須有相當的認知. 這不只是為了你自己而已, 也是為了所有的人(尤其是其它的 hacker).
(這有一些例外. 有時侯 hacker 們會去做一些被認為無聊或重復性的工作, 當做腦力的訓練, 或是為了要學習得某種技能或某種你所沒有的特殊經驗. 不過這是一種選擇, 任何人都不該被強迫面對無聊事. )
作為一個 hacker 是充滿快樂的, 但這是一種因為努力得到成果所帶來的快樂. 努力的成果則帶來動機. 成功的運動家的動機則來自於, 使他們的身體不斷進化,並把自己推向物理上的極限所帶來的快樂. 類似的情形, 要成為 hacker, 你必須要能從解決問題, 精進技術, 和運用知識的過程中感受到一種悸動.
如果你不是天生就能感受到這種悸動的人, 那麼, 為了要成為 hacker, 你必須使自己變成這樣的人. 否則, 你會發現你的 hacking energy 就會像性, 金錢, 和社交活動一樣, 因為分心而被消磨掉.
(你也必須為你的學習能力建立一種信念直到你完成你的工作 -- 即使你只處理一小部份, 而你也不知道你到底還要學些什麼東西才有辨法解決你的問題, 但是你會努力學習, 准備充足, 以應付下一個問題.)
㈧ 一個程序員所要經歷的步驟
程序員應具備的12種能力
畢業四年來,感覺自己也是從一名不合格的程序員一步步走過來的。回頭反思一下,合格的程序員有很多標准和要求,下面是我總結的一個合格程序員應該具備的12種能力。中國軟體行業的崛起,靠的是合格的程序員。任何華麗的管理制度都不能保證軟體項目的成功交付,合格的程序員就是有力的保證,是項目成功的基礎。寫下這些,是為了給剛剛進入程序員這個職業的新同學們一點參考。我一直以為,當程序員是很辛苦的,如果不是真正的喜歡,很難堅持下去。如果真的不喜歡這個職業,也該尊重這個職業,尊重自己,趕緊改行。
1. 編程語言能力
不用多說,作為合格的程序員,精通一門語言是必須的。這種精通,不是說看了一本《24小時精通XXX》,抄了幾個程序就能說精通的,要靠長時間的積累和浸淫。
2.編碼能力
我曾經看多很多程序員寫的代碼,在同一個jsp或者java源文件里,出現了三種以上的對方法的命名方式,有下劃線間隔的,有全大寫的,有拼音首字母的。就像一個菜市場,雜亂無比,估計10天後,他自己都無法看的懂。遵守編碼規范,是一個程序員最基本的要求,可悲的是,很多程序員根本沒有意識到這個問題的嚴重性。隨意堆砌網上搜來的代碼,根本不管可讀性和可維護性,只要能實現功能就行了,心想做完這個項目,就拍拍屁股走人了,缺少最基本的職責素養。我經常把代碼必須成程序員的孩子,你就是是孩子他爹,孩子他媽,是有感情的。對你自己的孩子,你能不仔細呵護嗎?你是稱職的父母嗎?這是我編寫的一個Java編碼規范,供大家參考,這里可以下載http://gurudk.javaeye.com/blog/111734
另外一個就是注釋,要注意不是為了注釋而注釋。對類,以說明職責為主;對方法,以說明意圖為主;對方法體,以說明實現思路為主。對於大段大段的代碼,要分段,使用空行隔開,並使用行內注釋進行說明。
思維的條理性,寫代碼之前,先簡單計劃一下,用自然語言把流程寫下來,用於整理實現思路。不要看了需求或設計之後,馬上就敲代碼了,敲完代碼馬上就debug。花點時間思考,敲代碼只是最後一個很簡單的工作,不要把自己變成一個代碼打字員,編寫邊想,寫了刪,刪了寫。安安靜靜把實現過程想清楚,在腦子里先實現一遍。再去敲代碼,水到渠成。
3.面向對象思維能力
如今,多數編程語言都是面向對象的編程語言。而這些面向對象的編程語言的共同的精髓就是面向對象的思想。掌握這些比面向對象語言本身更重要,比如對繼承,多態,重載的理解。對面向對象基本原則的理解,比如開閉原則,介面隔離原則,單一職責原則等。在此基礎上,應該掌握常用的設計模式,比如工廠模式,策略模式,觀察者模式,模板方法模式,命令模式等等。我面試過很多程序員,沒有一個能說得上幾句的。
4.利用工具能力
工欲善其事,必先利其器。有了趁手的傢伙,工作效率可以提升數倍。你編程序,有沒有選擇一個很好的IDE,以前聽說編程高手都用記事本寫程序,我覺得那是一種自虐。就像以前看到的一篇文章,說一幫戶外旅行愛好者,出去旅遊,背了重重的旅行包,裡面裝著什麼壓縮餅乾等快速食品。他們寧可就著礦泉水啃壓縮餅干,也不肯去1里路都不到的快餐店,農家菜館吃飯。工具是為目的服務的,好用,提高效率就行,形式無所謂。
另外一個常用的工具就是日記本,好聽點可以稱為知識管理工具,我用的是myBase,感覺非常好用,在之前,我的所有的片段內容都是記錄的單獨的文本文件里的,非常不好找,管理也很混亂。
經常上互聯網,看到好多好的資料想保存下來,作為日後查看之用.一開始,我用的是firefox自帶的書簽,但是自己分類太累,多了之後不便於查找,很麻煩。後來用了得樂書簽(del.icio.us)的firefox插件,非常方便,現在成為了我必備的一個工具。
還有一個最重要的工具就是搜索引擎了,我裝了google forfirefox插件,感覺不錯,還有英文翻譯功能。按照我同事的說法,內事用,外事用google。很多技術資料都是英文的,用google搜索效率高一些。搜索引擎用好了,就等於打開了一扇通向知識寶庫的門,使用搜索引擎,關鍵字選擇很重要。
經常去瀏覽大牛的blog,逐個網站訪問很麻煩,去看了又可能沒有更新,可以藉助於RSS訂閱工具,我是用iGoogle桌面工具,每天早上花半個小時掃一下,大牛的最新文章盡收眼底了。
5. 英語能力
新的技術資料都是英文的,英語國家的IT技術走在我們前面至少10年(這是我自己估計的數字,可能正在縮小)。就連印度,一個連基礎設施建設都不太完善的國家,因為其英語基礎較好,其在軟體外包領域的發展也非常迅猛,遠遠超過了我們。學英語,首先是有信心,其次就是花時間。多閱讀英文資料,使用金山詞霸,google的firefox插件等工具配合,貴在堅持。
6.學習能力
在IT也混飯吃不容易,整個環境進化的太快,你不學習,就等於落後了。學習要有針對性,別今天學ruby,明天學python,後天php的。首先要認清自己的目標,自己短期目標是什麼,1年後,3年後,5年後的目標是什麼。結合這些目標,確定自己的學習計劃,人的精力畢竟是有限的。當然,多掌握幾門編程語言也是好的,可以擴充自己的知識面,重要的是為自己的目標服務。
要想系統的學習一門技術或工具,看書是最好的方法。看完後,然後上網找相關資料,進行深入學習。學習要抓緊一切可以利用的時間,比如電腦啟動要花1分多鍾,旁邊放一本書,可以看上幾頁了。公交車上,地鐵上也可以看。
當然,不能只學習技術,要經常聯系自己的軟技能,比如溝通能力,表達能力。你可以把自己學到的東西,解釋給自己的同事聽,既加深了理解,又增進了同事之間的交流。學習的最高境界就是你能夠把學到的東西解釋給別人聽,這才說明你理解了。在學習心理學上,稱之為構成主義。
我學一樣東西,總是先上網了解有沒有相關書籍,如果想學,就買一本或者去圖書館找相關的書來讀。我買的書,家裡快放不下了(到目前位置,我買了1萬多塊的書)。我多半是把目錄看完,了解這本書講解的主要內容,然後需要的時候,我就可以立即補充它進入到我的知識結構。每個人可能都有自己的學習方法,意識到學習的重要,並能夠根據需要補充自己的知識,這種能力更重要。
7.創造能力
普遍認為,東方人模仿能力很強,但創造能力差。我見過很多這樣的程序員,經常說,「這個只能這么解決了,我想不出有什麼別的方法。」可能他根本都沒想過別的方法,或者懶得去想。對任何一個問題,找出兩種以上的解決辦法都是非常容易的,簡單的google一下,可能就是數十種。悲哀的是,有些程序員經常止步於自己構建的狹小領地之內。對待客戶也是這種態度,不是積極的幫助客戶解決問題,而是推脫這只是唯一解決方案。
打破這一思維定勢的首先的一個辦法就是在面臨一個問題時,首先想到的是「沒有不可能」,或是「一切皆有可能」,前面那個是阿迪的廣告語,後面是李寧的。只有這樣去想,才能尋找解決問題的別的出路,即使最後我們試了很多種辦法,還是只有著一種解決方案,但我們在這種尋找解決方案的過程中,常常會產生很多好的想法,這樣才會使我們真正深刻思考一個問題。建議大家看一看《水平思考》這本書,他提供了一些進行創造性思考的方法和工具。
但我認為,堅持認為存在另一種解決方案的信念是第一位的,方法和工具都是其次。
8.文檔能力
也許有人會質疑,程序員跟寫文檔有什麼關系。大家開源軟體也用過不少,看看Spring,hibernate,Struts等最流行的開源軟體的文檔就知道,他么的tutorial,他們的getstarted,他們的reference文檔寫的多麼的易懂。其實寫代碼也相當於寫文檔,只不過用的是編程語言。同樣,寫文檔,用自然語言,也相當於寫程序,簡單明了,清晰易懂,這樣的「程序」誰看誰舒服。同樣,對於想進階到設計師或者需求分析員角色的程序員,文檔能力更是非常重要。
word是一個最實用的工具,很多程序員,多級編號都不會用,索引目錄也不知道如何生成,更別靈活應用樣式了。很多排版都是所謂的dirty work。垃圾樣式一大堆。其實,靜下心來,稍微學習一下,就能寫出一篇格式漂亮的文檔。
9.抽象能力
抽象能力是認識事物從現象到本質的能力。如果你只是停留在「見山是山,見水是水」的層次,客戶說什麼,你就做什麼,設計怎麼做,你就怎麼實現,從來不過問為什麼,也不去想他是滿足了用戶哪些方面的需求呢。這樣可能只解決了表面的問題,可能會引起返工。認識到本質,才能讓你的程序具備更大的靈活性和可擴展性。在做企業應用軟體開發中,抽象能力體現為對問題域的理解能力,對領域模型的抽象。合理的抽象也是代碼重構的前提,每一次重構,都是向更好的抽象邁進了一步。
10.代碼評審能力
代碼評審和單元測試是保證代碼質量的兩種常用手段之一。代碼評審能力,說明了你的審美標准,知道什麼是好的,什麼是不好的,什麼是優雅的代碼,什麼是糟糕的代碼,你才能讓自己做的更好。
11.單元測試能力
沒有單元測試的代碼,只能說是半成品。因為沒有什麼能證明你的代碼是可以運行的。測試驅動開發是一個非常好的敏捷過程的最佳實踐。單元測試還可以作為回歸測試,在修改代碼時,起到警戒線標志的作用。是否具有單元測試的意識是區分程序員是否合格的重要標准。寫不寫單元測試是區分平庸程序員和優秀程序員的重要標桿。
12.DRY
DRY是一種原則,就是Don't RepeatYourself.出自《程序員修煉之道-從小工到專家》。這條原則可以用到很多地方,比如你經常要編譯,打包,部署應用程序,供集成測試用。每次你都在重復你自己,寫一個自動化腳本(比如用ant,批處理命令)來將這些工作自動化,以提高效率。
還有一個就是我們經常在不同的地方切換IP,如果每次手工做,也非常浪費時間,寫一個bat命令可以解決,找一個小工具也可以解決。
編碼時,對代碼的復用也是在重復你自己,雖然拷貝過程很爽,但是維護一致性就要付出巨大的工作量,特別是將來維護的人不是你的時候,使用代碼生成工具可以解決這個問題。類似的例子太多了,如果你發現你經常做一些重復的工作,就要警惕了,是否違背了這個原則,想一些辦法將他們自動化。