编写五子棋程序时如何添加下棋时的音效_干货:如何提高编程能力
注意!!本文字數較多!都是干貨!
很多初學者都會遇到各種各樣的問題,比如下面這些類型的:
1、只會像高中一樣跟著課程學習
2、怎么可以脫離課本和教學視頻自己編寫一個小項目?
3、停于理論,不知道如何實戰
4、就算跟著教程安裝軟件,搭配環境幾乎每一步都會有這樣那 樣的錯誤
5、知識遺忘得快,理論沒有形成體系,自己計算機的學習只局 限在刷了一些慕課上的題,做了學校要求的實驗
6、學完一門課程不知道能干什么
7、畏難情緒嚴重
8、焦慮、擔心找不到工作
首先,看似抽出了很多條的問題,但是我把所有問題都歸為一個,那就是 「如何提高編程能力」。
只要編程能力、實戰能力提高,上面一長串的問題自然也就不成問題了,更不用擔心找工作的問題。
所以今天就來聊聊如何提高編程能力這個話題。
要說提高,總得先明確下什么是 「編程能力」 吧~
一、什么是編程能力
在我看來啊,所謂的編程能力其實說到底就是用代碼解決問題的能力,無論是 Leetcode 上的還是現實世界的問題。
能夠從問題本身或是業務邏輯提煉出解決方案,并且用代碼去實現,編程就是在干這樣一件事:
現實世界的問題 -> 抽象出解決方案/建模 -> 計算機語言表達
可以看到,寫代碼只是最后一步,而我們常常說自己不會寫,真的是不會寫代碼嗎?
不會寫代碼,也許是你連解決問題的思路都沒想明白,就是說你的腦海里沒有形成「第一步該做什么,第二步該做什么」這樣的流程。
這其實是最重要的,編碼實現反而是相對簡單的事情。
很多大廠,一般都是高級工程師或者架構師進行領域設計、架構設計,初級工程師進行編碼實現各種接口。
其實編程的核心就是,你需要在心中對整個實現流程有一個大致的思路,然后用代碼去一步步的實現。
在實現過程中,你會遇到很多細節問題,比如數據結構的選擇,用 set 還是 list,存儲結構的選型,以及如何 bug free的實現。
更進一步,怎樣寫出高性能、易讀、易維護、易擴展高質量的代碼,當然這都屬于編碼能力了。
二、編程究竟難在哪
“編程一點都不難,它只是和你十幾年來在學校受的教育格格不入而已。”
第一次看到這句話,是在知乎問題“編程究竟難在哪里?”里一位名叫@ invalid s的高贊回答。
與也是這兩年才開始半路學編程的我,所感所悟不謀而合。
從小到大,我們受到的教育終極目的是有一個:考取理想的學校。每一張張考卷都是一個個堆砌起來的知識點:三角函數,解析幾何,數列,函數…...
這么多知識點,你需要做的是背下它們,或者說的更高級一點,理解它們。
即便是強調思辨和分析的“文科類”,也可以靠死記硬背答題模板拿分,就連作文都要有統一的標準。
(圖片源自網絡)絕大部分人,難以形成系統的學習方法論的意識,以至于很多人一旦脫離試卷,在社會中面對實際問題的時候,完全沒有一套行之有效的方法論支撐其解決問題。
而編程的核心,不是編程,不是語法,甚至不是算法或數據結構本身,恰恰是如何分解問題——發現規律建立解決問題模型,映射到合適的數據結構和算法上,最后才根據算法寫程序實現。
基于此,卡耐基梅隆大學計算機的一名華裔教授提出「編程思維」這個概念。
(圖片源自網絡,編程思維的四個組成模塊)他定義編程思維——能夠把現實生活中的復雜問題,逐步拆分成可理解的小問題。
1、Decomposition,即拆分。根據已有的知識和經驗,把問題拆分。
比如我想喝咖啡,那我可以請求你:“可以幫我倒杯咖啡嗎?”但這句話如果想讓電腦聽懂,我得先告訴它哪個是“杯子”、哪個是“咖啡”、什么是“倒”,然后再告訴它怎么去倒,比如先直走5米,左轉75度,左臂下放50度……
現實生活,每一個復雜問題,都是基于解決一個個被拆分的小問題而被解決的。
(圖片源自網絡)比如說,超級計算機感覺很復雜最后無非是解決一個帶寬問題、一個存儲問題;
比如說,解決碳排無從下手,實際上是解決人口、服務、能源、單位能源的碳排放這幾個問題。
2、Pattern Recognition,即模式識別。根據新問題和以前解決過的問題的相似性,舉一反三琢磨出規律。
假如你需要畫100只貓,你會怎么辦?找100只貓來挨個臨摹?
對于計算機來說,你需要找出貓的“模式”。
(圖片源自網絡)你要知道貓是專屬的毛,眼睛,尾巴,四條腿等,按照這個“模式”,你才可以“批量”畫貓——你不用每次畫一個新動物,只需要變換局部特征:黃白條的貓還是黑貓,長尾巴的貓還是短尾貓。
3、Abstraction,即抽象,將問題里涉及的數據,抽象到數據結構(變量,數組,鏈表等),把數據處理過程可重復執行部分抽象成函數模塊。
聽起來很復雜吧?這是一個過濾的過程,整個過程你要聚焦重要的關鍵信息,忽視無用細節,這樣才能通過認知問題的核心本質,幫助我們形成解決問題的構想。
比如,當我們看到這一房子,我們看到的是:
(圖片源自網絡)但在建筑師的眼中,它可能是這樣的:
(圖片源自網絡)建筑師通過自己的經驗,抽象出房子里面具體的構造。
這一步,我們雖然幾乎難以在應試教育的學習方法中獲得,但我們能從不斷地編程訓練中去培養抽象思維。會編程的人,往往能透過一個應用表象,看到背后實現的步驟。
4、Algorithms,即算法。通過循環執行,根據前三步的分析成果,設計步驟,寫出算法,從而解決問題。
這一整個過程,我們看到所謂的編程語言和語法,在最后才發揮出作用。
所以當我們覺得學編程難,是因為我們還未從過去根深蒂固的學習習慣中抽離出來,凡是需要打破習慣的事,必是不易的。
就像很多剛剛出國讀書的孩子,常常在面對外國老師問出「why」的問題時,馬上一種驚慌失措的表情,滿腦子想著自己是不是又說錯答案了,不知道老師這樣問僅僅是為了引導他們拓展思維。
我們真實的社會和生活也是不易的,它們沒有標準答案,許多人終其一生沒有追尋問題的能力,無法理解世界的復雜。
而編程,是你找出解決方法的能力,把現實問題轉換為代碼邏輯的能力。只有認清這一點,你才能更好地攻克它。
三、如何提高編程能力
提高編程能力,我自己總結了以下幾點:
- 多實戰,做項目,用需求倒逼輸入
- 善用工具,尤其是搜索引擎
- 看優質資料,特別是經典的計算機書籍
- 養成自學習慣,提高自學能力
- 看一些小而美的源碼
一、實踐
learning by doing
是的,我們都知道編程是一門實踐的學科,不動手永遠學不會,看懂了和學會了之間差了上萬行代碼。
或者說:看懂了 + 上萬行代碼 = 學會(此公式未經證明,純碎自己拍腦袋想的
剛學完一門語言,想必大家都想做點有用的東西,而不是天天寫練習題,但是呢,又不知道從何下手,尤其是 C 語言。
我大一上完 C 語言課,就處于這種狀態,但是我隔壁一個室友就不一樣的。
他在學習 C 語言的過程中,剛學到動態內存分配(malloc),就去摸索著寫貪吃蛇、坦克大戰,而且完成度都挺高的,那時候是我們眼里妥妥的大神。
但是大神和我上的課,學的東西都完全一樣呀,況且都是上了大學才開始接觸編程,為什么差別這么大呢?
以至于那時候,我和學妹一樣,常常懷疑自己沒有編程天賦,覺得別人天生就是這么強。
這種狀態一直持續到大一下,那時候剛學完 Java,而 Java 也比 C 友好了不少,所以總想寫點什么。
于是自己就選擇寫一個類似 QQ 的聊天工具,其實功能就很簡陋,就是一個簡單的 GUI + Socket 編程,然后在加上用戶信息管理就完了。
但是,當我用這個簡陋的軟件,分別在室友和我的電腦上跑起來并且成功發送消息的那瞬間,我覺得我的編程世界被點亮了。
原來編程這么好玩,原來我也能做一些有趣的東西!似乎找到了一絲編程的感覺,但還說不上到底是什么感覺,畢竟這個程序總共也就幾百行。
緊接著,趁熱打鐵,我又寫了一個聯機五子棋,實現上依然是 GUI + Socket 傳輸數據。
但是寫這個又遇到了不同的問題,比如棋盤在我的實現里是一個 N*N 的數組,棋子是用對象表示,對象里有坐標、顏色這些屬性。
當時我就疑惑了,當一方落子后,該怎么把棋子對象通過網絡傳輸給對方呢,再從網絡接收的數據恢復到對象?
起初自己的想法是手動的把對象轉換成字符串,然后像聊天工具一樣發送給對方,比如:
{x: 12, y: 13, color: black .......}。
這種做法沒問題,但是總感覺不夠優雅完美,于是上網一番搜索之后發現,原來我想的這個就叫「序列化」和「反序列化」。
并且在 Java 里直接實現 Serializable接口就好了,甚至可以直接使用ObjectOutputStream類就能完成序列化和反序列化對象。
這些問題在現在看來,根本就不是問題,更像是“常識”。甚至序列化這塊,還會選擇一些兼容性更好、性能更高的協議,比如 Protobuf、Thrift、Avro 等等。
但是對大一時的我來說,在這個過程中不斷的遇到問題并且去解決,就是實打實的編程能力上的提高啊。
在我解決掉一系列問題之后,順利的和隔壁室友用自己寫的聯機五子棋對戰了幾局,這個五子棋還支持不少諸如悔棋、暫停、自動判斷輸贏等功能。
界面風格和下面這個很相似(這是網上搜的)
Java版五子棋但是由于當時沒有存 Github 的習慣,代碼在換電腦之后沒能留下來。
通過寫這些項目,我像打通了任督二脈一樣,不是學了什么厲害的算法、也不是高深的設計模式、更沒有分布式這樣高級的東西。
那是什么呢?
我感覺到編程就好像搭積木一樣,基本的函數、庫、組件就是一個個的積木塊,寫的代碼就是膠水。
只要我們心中有設計圖紙,那就能通過膠水把這些積木搭建成想象的模樣,缺少什么積木塊,用到的時候再去搜索就行了。
在程序的世界,只要你想,你就能。
這段時間大概是我編程能力提升最快的一個階段之一。
關于這個五子棋,還有個小插曲:
我寫的不是聯機五子棋嘛,然后啟動的時候輸入對方的 IP 和 Port 就能連上對戰。
后來,我找了一個在其它城市上大學的高中同學,讓他和我一起玩五子棋,但是呢,我傻乎乎的讓他用 ifconfig 查看自己 IP 后告訴我,然后我在這邊連接。
那個 ip 呢,大概長得像 http://192.168.1.xxx,熟悉的同學都知道,這個就是局域網內使用的 IP 了,并非公網上的 IP。
局域網內的 IP 只能在內網才能使用,所以我用這個 IP 是永遠連不上的他的電腦的。
但是那時候我才大一,沒學過計網,根本不懂這里面的原理。
為啥我和室友能連上呢(因為在一個局域網)?為啥和其它學校的同學就不行?
別看現在這個東西在我看來是常識,但我那時候是一點計網知識都沒,就是硬著頭皮學的 Socket 編程,去理解 IP 和 Port。
那是怎么解決的呢?
當然是找谷歌呀!
在網上一番查詢后,大概明白了,如果想讓不同局域網內的主機進行 P2P 通信,需要一個公網中轉服務器輔助進行 NAT 打洞。。。后來,我就又去嘗試 NAT 打洞了,其中細節就不再描述了。
其實把我個人編程經歷上寫這么多,就是想展現我是如何一步步去實踐的,遇到了什么問題,又是怎么解決的,把這個過程展現出來。
你看我沒學任何計網知識,還不是通過邊學邊用,完成了網絡相關的項目。
所以你離項目只差一個開始。
說到這里,不少同學又會說,我知道要多實踐、多動手,道理我都懂。
可我還是不知道如何開始去寫一個五子棋、貪吃蛇之類的東西。
那我們以貪吃蛇為例拆解一下,看看是如何從問題到代碼的。
首先,貪吃蛇是一個個的節點組成的,節點肯定有橫縱坐標吧?一個個的節點組成了一條蛇,那自然應該想到鏈表吧?
蛇還有什么屬性?當前移動的方向
還要食物位置吧?那這些屬性在 C 語言中用結構體表達出來就是這樣:
typedef struct node{int x;int y;struct node* next;// 單向鏈表 } SnakeNode;typedef struct snake {SnakeNode *pHead; // 蛇頭SnakeNode *pFood; // 食物int direction; // 方向 0-3 依次表示:上、下左、右... }接下要考慮的就是如何去繪制蛇,這個簡單呀,就把整個鏈表從頭開始把每個節點打印出來。
每個節點可以是一個圓點,也可以是方形。
那如何讓蛇動起來?所謂的動,其實就是不斷的將蛇打印出來,然后又清除。
并且不斷的根據移動方向更新蛇的位置,只要這個過程夠快,快過人眼能夠分辨的幀率,那看起來蛇就像是在連續的動一樣。
然后這個過程你還要去考慮如何檢測碰撞,如何判斷吃到了食物,還要隨機產生食物。。。這些東西首先你得想清楚邏輯,代碼實現其實if、else 、for 就足夠了。
做項目的過程總會遇到不會的東西,也會遇到問題。
但是要相信,所有的問題在你之前基本上都已經有人遇到過了,只需要把問題準確的描述出來,然后去搜索引擎上搜就肯定能找到解決的線索。
如果你要等學會所有東西,才去開始做項目,那估計等到本科畢業也沒機會。
本科上的就那幾門課,Java/C/C++、操作系統、計網、編譯原理、離散、數據結構......
可能沒有學校會單獨開一門課教你 Java Web、Python 寫爬蟲等等。
學完這些理論課,等到畢業,你會發現,依然好像什么都做不了,所以說,要動手,趁早。
并且理論上,學完一門語言,掌握了數組、鏈表、 if、for、函數這些編程最基本的概念,就有能力去實現一些諸如貪吃蛇、五子棋、掃雷這樣的小玩意了。
這種通過項目去學習,以解決問題為導向的學習才是更加精準和高效的。
課堂上的學習大多數是老師灌輸知識、學生記住,然后考試就能拿高分。
實際上有多少知識能轉化為解決問題的能力呢?
不好說。
還是那句話,編程就像搭積木,學完基礎的,積木塊都給你了。
你能搭出房子、車子、還是火箭這全靠自己。
二、善用工具、學會搜索
學會用工具,更要用好的工具。什么是好的工具?
諸如 VSCode,Github、Stackoverflow、Google、知乎、Jetbrains 全家桶都是不錯的編程工具,有的提高生產力,有的能解決問題。
都 2020 年了,就不要在機房裝著 VC6 寫練習題了。
不要等到大一結束了,還沒上過 Github,更不知 issue、pull request 為何物。
計算機專業的學生,如果還在用百度搜索技術問題,送給你一段陳皓(左耳朵耗子)前輩的話:
coolshell截圖當然,在沒法使用谷歌的情況下,百度還是可以用的,但是這對計算機專業的同學,不應該是一個問題。
很多時候,你把遇到的問題準確的復制到 Google/Stackoverflow 搜索框,大概就能找到答案。
而百度會將你帶向培訓班的課堂,嘿嘿,刺激不。
3. 看優質資料
現在處于信息大爆炸的時代,互聯網上充斥著各種博客、學習資源,這是對學習者最好的時代。但是資源太多,就存在一個選擇的問題,在這里我給你幾個建議:
1.把網盤里屯的那 500G 視頻/資源 刪掉,你永遠不會去下載來看的
正所謂,收藏從未停止,學習從未開始,當你不再習慣的收藏資源了,你就成長了。最好掌握獲取/搜索資源的方式,自己需要什么資源再去搜就完了。而不是讓資源白白的占據你的網盤。
2.當需要學習某個東西的時候先去知乎/Google 搜索 「xx學習路線」
然后根據高贊/優質回答,選取大 V 們都提到的資源,這大概是這個領域比較經典的,然后去搜集資料,開始學習。
B站、mooc、網易公開課、Coursera等視頻網站上有很多優質免費的課程
答應我,不要再被那些關注送 500 G 學習資源的騙了好嗎?資源都在網上公開著,直接打開 B 站就能看,不香么?
學應用框架,官方文檔是最適合入門的,并且很多都提供了「快速入門」的指引
比如 Vue、Hadoop、Requests 這些官網的指引都非常的清晰易懂,真的不要再去看七零八碎的博客,博客的定位應該是補充。
少看博客,多看書
很多博客其實就是博主自己讀完書,然后復述一遍的筆記,你再去看他的博客那就是等于學二手知識,他的高度就決定了你的高度。
當然有些優秀的博主能夠概況性的總結,或者把某些原理講得特別清楚,這是值得看的。
總的來說,系統性的看書是你成長最快的方式。
4. 最后最后
我精心挑選了Java小白必備的電子書和詳細的學習線路圖,以及小白到大牛的文檔說明。
微信搜索公眾號“微編社”,菜單欄即可領取。
每天“游戲式”地學習30分鐘能帶你輕松掌握“難搞的”Java
總結
以上是生活随笔為你收集整理的编写五子棋程序时如何添加下棋时的音效_干货:如何提高编程能力的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python queue模块_Pytho
- 下一篇: python ssh登陆模块_Pytho