程序开发观点杂谈
??
? ? ? ?1. ?思想與概念很重要
???????最近開始發(fā)現(xiàn)計(jì)算機(jī)科學(xué)思想與概念越來越重要了,這不是過時的說教。當(dāng)你使用?Java JDK時,如果不懂優(yōu)先級隊(duì)列的概念,可能就弄不明白PriorityQueue的行為;如果不懂哈希表的機(jī)理,也無法寫出好的?equals和?hashCode的方法,更不可能用好HashMap;如果不了解阻塞I/0和非阻塞I/0的概念,讀?I/0包的API文檔時也會云里霧里;如果不弄懂同步、并發(fā)的原理和方法,也不可能寫出正確的多線程程序。還有,WeakReference,如果不能理解垃圾回收機(jī)的原理,也鬧不明白這個東西是干什么用的。?雖然經(jīng)常做的是編程工作,計(jì)算機(jī)科學(xué)的思想、概念卻無處不在;如果閱讀源碼或API文檔遇到阻礙,很可能是相關(guān)的思想、概念不甚明了,需要好好補(bǔ)一下。
?
????????2.?學(xué)習(xí)要分主次有側(cè)重點(diǎn),掌握重要的部分
? ? ? ??學(xué)習(xí)應(yīng)該有側(cè)重點(diǎn),重點(diǎn)掌握影響編程工作或?qū)幊逃兄娴牟糠?#xff0c;而其他的部分則作為知識背景了解即可,在工作需要時再進(jìn)行深入理解。比如I/0部分,重點(diǎn)要掌握I/0流、緩沖、阻塞/非阻塞、同步/異步這些概念及其在編程中的應(yīng)用,而I/0設(shè)備特性、讀寫命令、磁盤調(diào)度這些東西屬于內(nèi)部實(shí)現(xiàn)的細(xì)節(jié),如果不專門做I/0設(shè)備、驅(qū)動程序開發(fā)這樣的工作,則大概了解一下就可以了。
????????總之,學(xué)習(xí)任何一樣技術(shù),最好能先有個整體的了解,提取出重要的部分進(jìn)行研習(xí)。所謂重要的部分,是針對具體工作角色而言,比如程序員,需要學(xué)習(xí)的是計(jì)算機(jī)系統(tǒng)、語言、應(yīng)用框架等提供給程序員的抽象,而不是其本身的所有細(xì)節(jié)。推薦閱讀:《深入理解計(jì)算機(jī)系統(tǒng)》("Computer System: a Programmer's Perspective ")。
? ? ????
?
? ? ? ? ?3. ?編寫可靠可信賴的代碼
?? ?? ??請停下來。多審視一下寫過的代碼,能夠讓它更可靠更值得信賴嗎?能夠讓它運(yùn)行更好嗎?能夠讓它更加安全嗎?在這方面的知識和技能的積累,同樣能夠讓自己的視野更加廣闊,也是一種前進(jìn)。以寫出可靠可信賴的程序?yàn)橐?#xff1b;不要貪多,要求精。多掌握一些系統(tǒng)可靠、安全性的知識;從系統(tǒng)整體上去把握開發(fā)活動。
? ? ? ? ?編程時,要多動腦寫避免bug的程序,多花點(diǎn)時間測試和進(jìn)行程序驗(yàn)證,使用成熟的算法;每走一次捷徑,懶一分鐘,可能會花1個小時甚至1天來補(bǔ)償。
?
? ? ? ? 4. 編程的兩個信念?
? ? ? ??萬事皆有因果。在出現(xiàn)程序錯誤時,要堅(jiān)信一定是什么地方出錯了。即便不是軟件邏輯錯誤,也可能是硬件一時“喘不過氣”來。每一個錯誤,都是通向新知的機(jī)會,搞清楚背后的緣故。多做對比實(shí)驗(yàn)(在其它機(jī)器上運(yùn)行相同的拷貝)、在任何值得懷疑的地方插入打印語句,查看結(jié)果是否如預(yù)期、耐心推敲,逐漸縮小排查范圍,直到最終查個水落石出。
? ? ? ? ?思從深而行從簡。這句話是從一位讀者對《編程珠璣》的評論借用而來的,我覺得非常貼切。一定不要急著下手去編程,將問題分析透徹,將實(shí)現(xiàn)方案規(guī)劃到比較成熟的地步,?先做什么,然后怎么做,如何去做每一步, 每一步有什么關(guān)鍵點(diǎn)、難點(diǎn),采用什么方法和技術(shù)去解決,在腦子里想清楚或者與別人討論,就像計(jì)算機(jī)一樣,絕大多數(shù)事情都可以分解為一系列的微小指令來完成。思從深而行從簡,真言也。
?
? ? ? ? 5.?編程語言:?程序員的隨身兵器
???????在看電影時,通常會發(fā)現(xiàn)那些高手都會有適合自己的奇奇怪怪的兵器,長槍、短劍、雙截棍、方天戟等。類比而言,編程語言就是程序員的隨身兵器。不同的兵器有不同的擅長領(lǐng)域。那到底應(yīng)該選擇哪一種呢?我個人覺得,先確定想從事的領(lǐng)域,??然后選擇最適合該領(lǐng)域的語言進(jìn)行學(xué)習(xí)和應(yīng)用。最好,面向過程語言、面向?qū)ο笳Z言、函數(shù)型語言、系統(tǒng)腳本語言、瀏覽器語言各掌握一種,比如C/Java/Lisp/python/Javascript. 此外,熟悉盡可能多的語言也是很有助益的。
?
? ? ? ??6. ?程序員的技術(shù)成長路線
? ? ? ??根據(jù)《軟件工藝》的說法(我是比較認(rèn)同的),?程序員可以分為三個階段:學(xué)徒,小工,專家。
? ? ????學(xué)徒:主要是學(xué)會編程。掌握一些專業(yè)基礎(chǔ)知識(主要是數(shù)據(jù)結(jié)構(gòu)、算法、操作系統(tǒng)、數(shù)據(jù)庫、計(jì)算機(jī)網(wǎng)絡(luò)),學(xué)會一門語言,使用一些框架做一些小型的項(xiàng)目,養(yǎng)成良好的程序設(shè)計(jì)習(xí)慣和素養(yǎng)。推薦書籍:《編程珠璣》和《程序設(shè)計(jì)實(shí)踐》。這兩本書都是教會人如何更好地編程,而不是簡單地敲入代碼。
? ? ? ??小工:主要是提高編程技藝,研習(xí)軟件設(shè)計(jì)與應(yīng)用架構(gòu)。這一階段,通過真實(shí)的項(xiàng)目開發(fā),磨煉更好的編程技藝,養(yǎng)成良好的開發(fā)習(xí)慣;同時,要注意多多研習(xí)軟件設(shè)計(jì)、應(yīng)用架構(gòu)的思想,了解系統(tǒng)性能、可靠性等更高層面的知識,積累經(jīng)驗(yàn)。小工階段通過熟悉和掌握各種框架的思想精髓,最終達(dá)到不依賴框架的地步。推薦:《程序員修煉之道:從小工到專家》
? ? ? ?專家:主要是利用已有的知識和經(jīng)驗(yàn)進(jìn)行軟件項(xiàng)目的開發(fā)、管理和咨詢,并不斷從中汲取教訓(xùn)。專家階段應(yīng)當(dāng)不再依賴于任何應(yīng)用框架,能夠根據(jù)具體的業(yè)務(wù)需求選擇合適的框架或者自己設(shè)計(jì)一個,即“無招勝有招”的境界。一旦達(dá)到專家階段,后面的故事應(yīng)該看各人造化了。
?
? ? ? ??7. ?如何成為專家:?做好職業(yè)積累工作
? ? ? ? [1] ?平時寫小程序時,盡量在設(shè)計(jì)上做更多細(xì)致考慮,做到實(shí)用化,并編寫良好的文檔;心中總是想著將要讀程序的人。
? ? ? ? [2] ?見到好的源代碼,就摘錄下來,做一個簡單實(shí)用的知識/代碼管理系統(tǒng)。
? ? ? ??[3] ?在開發(fā)過程中遇到的錯誤及解決方案,詳細(xì)地加以記錄,或?qū)懗刹┛团c更多人分享;
? ? ? ??[4] ?好的設(shè)計(jì)思想、技術(shù),詳細(xì)加以記錄,或?qū)懗刹┛团c更多人分享。
? ? ? ??[5] ?積累業(yè)務(wù)知識,樂于同客戶交流和溝通。
? ? ? ? [6] ?謙和有禮,永遠(yuǎn)懷著空杯心態(tài)。
?
? ? ? ??8. ?做好文檔化工作:?程序與文檔,其實(shí)就是一對孿生兄弟,不可偏心。
? ? ? ??程序員,從表面字義上理解,似乎能夠編寫好程序就足夠了;實(shí)則不然。耐心、細(xì)致地做好繁瑣的文檔化工作,其實(shí)也是大有裨益的。
? ? ? ??一個程序員在他一生的編程開發(fā)工作中,必然會遇到很多很多的問題及解決方案,如果不加以詳細(xì)記錄,那么,就很容易重蹈覆轍,或者做許多重復(fù)工作。此外,別人做好的工作,也非常值得借鑒;因此,好的程序員應(yīng)當(dāng)做好這些文檔化工作,將自己和別人的工作都詳細(xì)地加以記錄,以備后用。這些是程序員極其重要的職業(yè)財(cái)富之一。
? ?
? ? ? ??10. ?每周末抽出時間關(guān)心別人的工作,關(guān)注社會熱點(diǎn)問題
? ? ? ??不能埋頭只顧自己的事情。每周末抽出時間來關(guān)心別人的工作。在論壇里回答問題,關(guān)注開源項(xiàng)目的進(jìn)展,關(guān)注好友的動向,關(guān)注社會熱點(diǎn)問題,關(guān)注各行業(yè)領(lǐng)域的動態(tài)資訊等,給自己一個宏觀的非技術(shù)性的視角。
?
? ? ? 11. ??開發(fā)與學(xué)習(xí)
? ? ? ?程序員職業(yè)生涯中做得最多的一件事就是開發(fā)。而在開發(fā)的過程中,必然伴隨著更多的學(xué)習(xí)。如何協(xié)調(diào)開發(fā)和學(xué)習(xí)的關(guān)系呢?
? ? ? ?①開發(fā)的時候,盡量熟悉和選擇經(jīng)過嚴(yán)格測試的已有庫、軟件包、構(gòu)件等來完成開發(fā)任務(wù),避免做重復(fù)的事情,提高開發(fā)效率和軟件質(zhì)量;學(xué)習(xí)的時候,則要盡量重新發(fā)明輪子,弄清內(nèi)部原理和機(jī)制,同時也可獲得創(chuàng)造的樂趣。例如,?Java?應(yīng)用程序中要使用哈希表時,應(yīng)該直接使用HashMap等已有類,而在學(xué)習(xí)時,則要弄清楚內(nèi)部的原理與實(shí)現(xiàn)(貌似是紅黑樹),并寫出自己的實(shí)現(xiàn);
? ? ? ?② 在學(xué)習(xí)基本原理機(jī)制和選擇應(yīng)用框架進(jìn)行開發(fā)之間存在一個脫節(jié):如何應(yīng)用所學(xué)到的基本原理機(jī)制呢?答案是:理解應(yīng)用框架,增強(qiáng)學(xué)習(xí)力和洞察力。如果基礎(chǔ)積累扎實(shí),那么,第一二遍時就應(yīng)該能夠?qū)W會使用框架;第三遍就該是鉆研框架源碼的時間了。框架都是浮云,必須能夠以不變應(yīng)萬變。在鉆研框架源碼的過程中,一個必不可缺的技能就是閱讀已有代碼的技能,從別人的工作中獲益。
? ? ? ?③?永遠(yuǎn)都只是思想和技術(shù)。思想是如何做事的指南,技術(shù)是具體的代碼實(shí)現(xiàn)。沒有思想,技術(shù)會迷路;沒有技術(shù),思想只是空中樓閣。學(xué)習(xí)一樣?xùn)|西,首先要掌握其思想和工作機(jī)制,然后,采用代表不同視角的典型代表語言去實(shí)現(xiàn)它。?
?
? ? ? ??12. ?程序與軟件
? ? ? ??程序是小而美的,彼此可以互相協(xié)作,共同完成更復(fù)雜的任務(wù);程序只要完成自己的事情就足夠了;通過細(xì)致地設(shè)計(jì)和實(shí)現(xiàn),嚴(yán)謹(jǐn)?shù)仳?yàn)證和徹底的測試,可以獲得可靠可信賴的程序單元模塊;
????????軟件通常是龐大的,必須仔細(xì)規(guī)劃模塊之間的關(guān)聯(lián)和交互。如果不能有效地整合各種程序單元模塊,即便各個模塊經(jīng)過仔細(xì)的實(shí)現(xiàn),也可能導(dǎo)致笨重臃腫的軟件,費(fèi)時費(fèi)力。而且,軟件開發(fā)常常涉及到難以用技術(shù)進(jìn)行衡量的人員溝通、行政管理、以及成本、進(jìn)度等因素,因此,比程序開發(fā)更為復(fù)雜。
?
? ? ? ??13.??編碼與程序設(shè)計(jì)
? ? ? ??我更偏愛“程序設(shè)計(jì)”的說法。程序是用來設(shè)計(jì)的,不是純粹的編碼。在編碼之前,你可以有足夠的時間進(jìn)行純粹的思考和求精,深思熟慮,在吃飯時,在睡覺時,在走路時,在閉目凝神時,在一切可以停下來騰出空思考的時刻。程序員應(yīng)當(dāng)能夠“通過純粹的思考來預(yù)見結(jié)果,而不是依賴顯示結(jié)果來判斷程序的正確性”。把自己當(dāng)成一個程序設(shè)計(jì)師來看待吧,學(xué)習(xí)作為這樣一種角色所應(yīng)當(dāng)了解和掌握的知識、技能和素養(yǎng)。
?
????????14.? 程序員的六件利器
??????? 問題分析與估算 ;? 數(shù)據(jù)結(jié)構(gòu) ; 算法設(shè)計(jì) ; 設(shè)計(jì)模式 ; 正則表達(dá)式 ; 并發(fā)編程。?
?
????????15.? 在紙上寫代碼做設(shè)計(jì)
??????? 成為一名優(yōu)秀的程序員的基本要素有兩個:扎實(shí)的專業(yè)基礎(chǔ)和敏捷縝密的思維,而在紙上寫代碼特別有助于訓(xùn)練縝密的思維和設(shè)計(jì)能力。
??????? 在紙上寫代碼做設(shè)計(jì)有三個益處: 1.? 集中注意力;2.? 在紙上非常有助于做設(shè)計(jì);3. 盡可能地遠(yuǎn)離電腦輻射。
??????? 在紙上主要是適用于做設(shè)計(jì)和編寫重要的模塊函數(shù)。
????????
????????16.? 思想先行??
??????? 有所舍, 方有所成; 不以得喜, 不因失悲。最重要的是持之以恒, 可持續(xù)發(fā)展。一個程序員首先應(yīng)當(dāng)擁有豐富自由的思想;有了思想在先,你才能在計(jì)算機(jī)上文思泉涌,下筆千言。少上網(wǎng)多讀書,有空就靜心讀書、鍛煉身體、與人交流。
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/lovesqcc/p/4038434.html
總結(jié)
- 上一篇: Java开发知识点!mysql运行sql
- 下一篇: Mind+实例1——智慧农场