關於程式設計的一些個人感想
參加工作有一段時間了,在不斷的工作中對於程式設計有了新的體會,在這裡記錄並跟大家分享一下,也希望大家可以留言探討。
為什麼需要程式設計?
站在公司的角度上,它需要提供一種產品可以滿足客戶的需求,而程式設計就是為客戶製造產品的一種手段,其終極目的還是為了解決客戶的問題。也就是說,程式設計並不是目的,只是一種手段,如果存在一種更加便捷有效的方式可以解決問題,就沒有必要去進行程式設計。
為什麼要強調程式設計不是目的呢?
因為大多數初入職場的人,尤其是應屆畢業生,總是會在做產品時陷入對技術的過度追求。對技術有追求是一件好事,但是更要時刻謹記技術的意義。當前很火爆很牛x的一些開源技術,它們的存在難道單純是作者為了炫技嗎?真正牛x的大佬應當是即具備了技術的深度,又能尋找到商業價值與技術價值的平衡點,過度的濫用技術只能說明其對技術的把控力不足,不能恰當合理的使用技術。
如何進行程式設計?
程式設計的目的是完成既定的需求,程式設計的過程就是一個不斷遇到問題、解決問題最終滿足需求的過程。這些在完成需求的過程中所遇到的問題被稱之為風險,一名程式設計師如果可以提前識別風險,並會在真正開始編碼之前解決掉風險,他就算是邁入了架構師的門檻。
解決複雜問題的一個重要途徑是對問題進行拆解,將其轉換為簡單問題或已知問題,並逐一解決。
人類目前所有的知識體系,都是建立在人類對這個世界的認知中,計算機的整個知識體系也不例外。這也就意味著在程式設計中所遇到的問題,基本上都是在我們認知範圍內可以解決的,甚至可以借鑑一些特別樸素的生活經驗,來幫助你尋找解決問題的方向。
以效能優化為例,怎麼做才可以加快網路中資料的傳輸速度呢?
這個問題可以轉換為,在生活中如果我們想快速的運輸一批貨物到異地,應該怎麼做才好?
依據經驗,想要更快的運輸速度,首先肯定選擇更高速的運輸裝置,畢竟飛機快於高鐵,高鐵快於火車。
進一步的,我們可以多租幾架飛機,同時進行貨物的運輸,也能加快貨物運輸的速度。
再進一步的,每次運輸的貨物體量有限,我們要想盡辦法利用運輸工具的每一分空間運送貨物,在不損壞貨物的前提下使勁擠壓貨物,向有限的空間內塞進去更多的貨物。
回到問題本身,如何加快網路資料的傳輸速度?我們可以得到一些答案:
1. 使用更高速的傳輸介質,光纖的傳輸速度總是好於五類線。
2. 對資料進行並行傳輸。
3. 先對資料進行壓縮,再進行資料傳輸。
這種思路甚至可以推而廣之,譬如如何對資料庫效能進行優化?
1. 使用更高速的裝置。
SSD比普通的機械盤肯定是要快的。
大記憶體,資料庫可以儘量的將資料快取在記憶體中。
更高運算頻率的CPU,每秒運算更多的指令。
2. 並行處理
配置開啟更多的工作執行緒。
叢集多節點部署,將讀或者寫分散到多個節點上,並行處理。
3. 資料壓縮
此處的資料壓縮,不僅僅是單純意義上的壓縮資料。
資料的本質是什麼?是資訊!我們儲存資料,處理資料都是為了能夠按需從資料中提取需要的資訊。
在儲存資料時,對資料進行篩選、處理,儘可能的只儲存所需資料,減少資料冗餘,是資料壓縮的一種形式。在讀取資料時,只讀取特定範圍滿足特定條件的有效資料,減少對資料的檢索範圍,也是一種資料壓縮的特殊形式。合理的使用索引,對資料進行分庫分表,或者類似ES的叢集形式,資料被分散到多個節點的多個分片內,每個節點只儲存部分資料,這些都是資料壓縮,可以讓你在較小的資料集範圍內get到自己想要的所有資訊。
怎樣學習程式設計?
解決問題的思路離不開豐富的知識儲備,以及對知識的歸納與演繹,無論是提升知識的廣度還是深度其實都是殊途同歸。
有些人比較具備鑽研精神,對技術的深度有狂熱的追求,在學習的過程中遇到了什麼技術問題一定要摳的明明白白。首先,我要對這種做事方式進行肯定,好的技術離不開鑽研精神,但是從我個人角度來講我不建議大家在學習程式設計時這麼做。計算機軟體是一個非常寬泛的學科,它的知識棧囊括了各類作業系統,網路,以及各種各樣的程式語言。並且,這些知識棧並非都是完全獨立的個體,它們所使用的技術,解決問題的思路有好多都是大同小異。
我建議在初學程式設計時,應當儘量多的去接觸各類技術,將學到的知識互相印證理解,最大可能的開拓自己的視野。這麼做的好處在於,第一不會因為某個極其困難的點而喪失掉對學習程式設計的興趣,第二視野的開拓可以學習到更多解決問題的思路,讓你瞭解到同一種技術原來存在這麼多的可利用方式,對以後的工作生活有所啟發。
如何學習的一些建議:
我個人對於程式設計的學習經歷了幾個階段:
1. 視訊學習
現在視訊教學網站很多,我當時主要是在淘寶購買相關的視訊教程。
視訊教學比較適合完全什麼都不懂的小白階段,不好的地方就是學習進度太慢,自己思考的會比較少,現在我個人已經完全放棄了這種學習方式。
2. 看書
對於新人來講,有些技術書籍還是值得一看的。有很多國外的經典著作,都可以一覽。目前國內的技術書基本上是魚龍混雜,我目前也很少會去看技術書籍了,因為我發現書裡的內容手冊中基本上都可以找到,手冊裡有的內容,往往因為篇幅的原因書籍中卻無法全量的覆蓋。
另外,目前技術的更迭速度還是很快的,書籍裡的內容往往都是一些技術幾個版本之前的老東西了,即便學習了很多時候也無法完全適用於新版本,還可能會給你帶來一些困擾。
3. 官方文件+google+stackoverflow
這是本人目前獲取知識的主要途徑。在學習一種新技術時,鑑於本人的英語水平不是很高(目前好很多了),多數情況下會首先使用搜索引擎閱讀一些部落格對新技術的一些概念進行快速入門。之後,再進行文件閱讀(瞭解了一些概念,在進行翻譯時才能更準確的理解原文的意思)。
對於一門技術的學習,最好的途徑是使用它,如果當前沒有環境去使用它,那麼就去了解別人是怎麼使用它的!《開發者頭條》是一個挺不錯的技術站點,我經常可以在上面找到一些別的公司在生產環境對某個技術的應用實戰,這些生產環境的真實應用讓我受益匪淺。
不喜歡看春晚,又沒有別的事情可做,年三十晚上隨便寫點東西,希望能給大家帶來一些收穫。
最後,祝大家新年快樂啊!豬年發大財!