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