學(xué)習(xí)筆記_我該如何學(xué)好編程 20220418

# 學(xué)習(xí)筆記_我該如何學(xué)好編程 20220418
## 動(dòng)機(jī)
### 不指望依賴編程找工作,而主要是為了高效實(shí)現(xiàn)想法,并在實(shí)現(xiàn)時(shí),可以提升運(yùn)行速度(如提升我的MATLAB程序效率)。
### 需要高效率學(xué)會(huì)編程,或者提高當(dāng)前編程效率
### 進(jìn)而,希望自己能站在更高的維度去學(xué)習(xí)編程。
### PS:每個(gè)人的目的不一樣和時(shí)間不一樣,對(duì)應(yīng)的學(xué)習(xí)思路也不一樣。比如我,沒辦法像別人說的,每天刷題,我覺得會(huì)很沒有成就感。此外,這也意味著,對(duì)于我不不太需要的內(nèi)容,我了解的不夠準(zhǔn)確。
## 區(qū)分學(xué)編程和編程語言的區(qū)別 【9】
### 前者核心是借助計(jì)算機(jī)去解決問題的一門學(xué)問,后者是學(xué)習(xí)一種語言,一種工具。
Eg. 學(xué)習(xí)編程語言就像在學(xué)習(xí)木工之前學(xué)習(xí)如何使用木工鋸、錘子等工具。而會(huì)編程則是指,木工會(huì)注意到想法、可行性分析、度量、測(cè)試、用戶使用習(xí)慣、檢查工具和材料質(zhì)量等工作。
PS:大多數(shù)課程就只是教編程語言。扼殺興趣。
- 這里可以用木工圖,根雕圖什么的去理解
### 學(xué)會(huì)編程實(shí)質(zhì)是種思想辦法。而學(xué)不同的編程語言,是為了掌握更多的工具,讓自己在解決某一個(gè)問題時(shí),盡可能不受限,進(jìn)而依據(jù)不同工具的特性決定了如何靈活使用他們。
### 再次提醒:學(xué)習(xí)編程的核心是,借助計(jì)算機(jī)去解決問題。
## 學(xué)編程語言具體內(nèi)容 [5]
### * 程序語言本身
語法
語言特性
使用技巧
最佳實(shí)踐
內(nèi)存管理
設(shè)計(jì)哲學(xué)
編程范式
常用類庫(kù)
編譯/解釋機(jī)制和運(yùn)行環(huán)境
* 計(jì)算機(jī)科學(xué)
程序語言如何控制計(jì)算機(jī)
計(jì)算機(jī)是如何工作的
網(wǎng)絡(luò)是怎樣通信的
* 編程思想
編程語言發(fā)展史,各門語言的起源和歷史
人類如何利用計(jì)算機(jī)解決問題
編程和計(jì)算的關(guān)系
抽象思維
邏輯思維
### 上述很多話,我只能做到粗淺的理解。等以后理解深了再修改。先記著
## 如何算掌握一門語言?
### 【5】
## 學(xué)哪一個(gè)?
### https://www.tiobe.com/tiobe-index/
### 【7】
### 底層語言
- C
- (1)操作系統(tǒng)內(nèi)核,如Linux 內(nèi)核。
(2)運(yùn)行速度總是最快的幾種
(3)「中級(jí)語言」,既可以編寫上層應(yīng)用,也可以完成底層內(nèi)存地址操作的任務(wù)。
(4) 32個(gè)key words 容易學(xué)
(5)學(xué)C會(huì)知道地址和指針、字節(jié)這些概念,進(jìn)而對(duì)計(jì)算機(jī)數(shù)據(jù)存儲(chǔ)和指令執(zhí)行有更深的理解。學(xué)了C可以讓你理解計(jì)算機(jī)世界,以及徹徹底底控制計(jì)算機(jī)。
所以對(duì)于學(xué)編程有一定要求的。C 語言在當(dāng)代無疑是第一選擇。
- 應(yīng)用場(chǎng)景
操作系統(tǒng)
加速運(yùn)行效率
理解計(jì)算機(jī)
- 學(xué)習(xí)建議:
聽些經(jīng)典的課程,掌握基本語法。
<<C How To Program>>提供很多可口PROJECT,熟練。
- 匯編語言
- 最接近機(jī)器語言的就是它了
### OOP 面向?qū)ο???/p>
- 學(xué)一類這種語言,是為了理解OOD/OOP。面向?qū)ο笫侵?,這個(gè)語言是基于對(duì)象、數(shù)據(jù)的集合及數(shù)據(jù)的操縱來構(gòu)建的程序的。面向?qū)ο蟮母拍钤谥T如C++,Java, Objective-C, 和PHP廣泛應(yīng)用。
- 不夠理解
- 一個(gè)對(duì)象只承擔(dān)一種責(zé)任,所有服務(wù)接口只通過它來執(zhí)行這種任務(wù)。
程序?qū)嶓w,比如類和對(duì)象,向擴(kuò)展行為開放,向修改行為關(guān)閉。
子類應(yīng)該可以用來替代它所繼承的類。
一個(gè)類對(duì)另一個(gè)類的依賴應(yīng)該限制在最小化的接口上。
依賴抽象層(接口),而不是具體類。
- 不夠理解
- Objective-C
- 專門用來開發(fā) iOS 和 Mac 應(yīng)用的語言,雖然是編譯型語言,但它具備動(dòng)態(tài)特性 【5】
- 已經(jīng)有往 Swift 上轉(zhuǎn)型的趨勢(shì),但還是比較流行的(安卓似乎都用 Java,蘋果似乎都用這個(gè))?!?】
- 應(yīng)用場(chǎng)景:
專門用來開發(fā) iOS 和 Mac 應(yīng)用的語言
- JAVA
- 優(yōu)點(diǎn):
(1)被廣泛應(yīng)用在服務(wù)端的開發(fā)中(Android 開發(fā),Web 應(yīng)用程序設(shè)計(jì)等)。Java 入門,便代表可以完成基礎(chǔ)的項(xiàng)目了,基本你就不用擔(dān)心找不到工作?!?】
(2)Java擁有可能是所有語言中最強(qiáng)大的虛擬機(jī)平臺(tái)JVM,在其上誕生了無數(shù)優(yōu)秀的軟件,為了JVM,Java還是值得學(xué)習(xí)一下的,不過這門語言也是實(shí)在太簡(jiǎn)單了,假設(shè)一個(gè)人學(xué)習(xí)Lisp或C需要一個(gè)月,學(xué)習(xí)Python或Ruby或Perl需要一周,那么學(xué)習(xí)Java,也許只需要一天就可以,因?yàn)榫驼Z言本身來說實(shí)在沒那么多可學(xué)的【6】
缺點(diǎn):
(1)環(huán)境配置復(fù)雜,有一定門檻?!?】
(2)我一直認(rèn)為這是一門由聰明的人設(shè)計(jì),用來控制一幫智力平庸的碼農(nóng),讓他們不至于捅出什么簍子的語言,基本上所有的設(shè)計(jì)特性,都是為了壓抑創(chuàng)造力,讓程序員變成按部就班擰螺絲釘?shù)臋C(jī)器來考慮的?!?】
- 應(yīng)用場(chǎng)景和應(yīng)用成果:
Android 開發(fā)
Web 應(yīng)用程序設(shè)計(jì)等
- 學(xué)習(xí)建議:
初期找一個(gè)事無巨細(xì)的老師指導(dǎo),節(jié)省入門時(shí)間?!?】
- C++
- 優(yōu)點(diǎn):
(1)C++ 是目前的主流語言之一,也是一門使用率很高的語言,不用擔(dān)心找工作。(現(xiàn)在的四大主流語言一般理解為C、C++、Python 和 Java)【1】
(2)C++ 幾乎是 C 的超集,C++ 相比較 C 而言,最明顯是引入 面向?qū)ο蟮母拍?【1】
(3)C++ 是一門非常自由的語言,同時(shí)隨著深入的學(xué)習(xí),C++ 可以給你帶來對(duì)棧與堆、內(nèi)存管理等知識(shí)點(diǎn)更深刻的理解【1】。是一種寬容的語言 —— 你可以做一切技術(shù)上可能的事情,即使在邏輯上不正確
(4)C++ 對(duì)指針、變量定義,多態(tài)等定義非常靈活,同時(shí)有大量標(biāo)準(zhǔn)庫(kù),是一門很難讓人在簡(jiǎn)歷上寫上精通二字的語言?!?】
特點(diǎn): 好入門、難精通,同時(shí)也是一門使用率很高的語言,不用擔(dān)心找工作 【1】
(5)跨平臺(tái),性能優(yōu)越。
- 應(yīng)用場(chǎng)景和應(yīng)用成果:
谷歌 Chromium 瀏覽器
摩根斯坦利的金融建模
開發(fā)游戲引擎
瀏覽器引擎這些底層庫(kù)
開發(fā)windows 桌面應(yīng)用
- 學(xué)習(xí)建議:
最好由已經(jīng)有 C 語言編程基礎(chǔ)的人學(xué)習(xí)
### 動(dòng)態(tài)語言
- 學(xué)一類動(dòng)態(tài)語言,也是為了擴(kuò)寬思路,不讓自己思維受到限制。
- Python
- 主旨:“做一件事情只有一種顯而易見的方法”。
優(yōu)點(diǎn):
(1)動(dòng)態(tài)語言,有豐富的庫(kù)作為支持,進(jìn)而非常適合* 數(shù)據(jù)統(tǒng)計(jì)* 面向?qū)ο缶幊? 寫一些幫助到自己生活的腳本* Web 應(yīng)用程序編程【1】
(2)易學(xué),且比較快有產(chǎn)出。學(xué)會(huì)它,新手也可以很快發(fā)揮他的效果【1】。語法簡(jiǎn)單、輪子多、開發(fā)效率高。
(3)除了底層硬件驅(qū)動(dòng)和 極其 追求效率的開發(fā)目前還需要 C 以外,淘汰類 C 語言指日可待?!?】
缺點(diǎn):
(1)動(dòng)態(tài)語言從根本上就決定,程序?qū)懙脑酱螅阈枰白约河涀 钡臇|西就越多。等你“記不住”的時(shí)候,你的程序就寫不下去了。進(jìn)而大型項(xiàng)目使用少?!荆俊?/p>
(2)不推薦通過把Python作為第一語言二區(qū)找工作,除非你是本身需要用到,且學(xué)歷足夠?!??】
- 應(yīng)用場(chǎng)景:
簡(jiǎn)單的爬蟲 到 復(fù)雜的網(wǎng)絡(luò)開發(fā),又或者是與其他語言進(jìn)行協(xié)作,都可以通過調(diào)用庫(kù)很好的完成。
- 學(xué)習(xí)建議:
利用Django平臺(tái)
不追求程序員這個(gè)職業(yè),但希望能利用上編程解決問題的人,可以學(xué)。
- Javascript
- 特點(diǎn):
(1)簡(jiǎn)稱 JS,理解基本原理,就可以使用已經(jīng)編寫好的庫(kù)和方法實(shí)現(xiàn)很炫的動(dòng)畫效果。【1】
(2)web 時(shí)代的王者,動(dòng)態(tài)性,依托于瀏覽器引擎的“跨平臺(tái)”能力 【5】
(3)另一種網(wǎng)頁風(fēng)格。不希望頁面過于 HTML + CSS 或者 BootStrap 風(fēng)格的話,可學(xué)它
- 應(yīng)用場(chǎng)景:
網(wǎng)頁設(shè)計(jì)
表白
### swift
- 特點(diǎn):
用于解決了一個(gè) Objective-C 中最主要的語法問題。
(1)相比較 Objective-C 而言,Swift 將不再嚴(yán)格區(qū)分頭文件(即 .h 和 .m 文件將不再區(qū)分,而是統(tǒng)一被稱為 .swift),避免 #import 的繁瑣。
(2)Swift 還有很多 handy 的語法特性,如模式匹配、更嚴(yán)格的 Optional 類型、強(qiáng)大的范型支持、可 Immutable 的原生類型、更方便的 String、閉包語法的優(yōu)化、元組等,優(yōu)點(diǎn)非常多。[1]
- 應(yīng)用場(chǎng)景
MAC IOS??
### Golang
- 特點(diǎn):
(1)可直接編譯成機(jī)器碼,不依賴其他庫(kù),glibc 的版本有一定要求,部署的話只需要扔一個(gè)文件上去。
(2)內(nèi)置 runtime,有豐富的標(biāo)準(zhǔn)庫(kù),類似 Python,可以通過調(diào)庫(kù)完成許多功能由于以上特性,Golang 便非常適合后端開發(fā),服務(wù)器編程等。[1]
- 應(yīng)用場(chǎng)景:
后端開發(fā)
服務(wù)器編程等
### Rust
- Rust :有替代 C/C++ 的趨勢(shì)【?】
### Flutter
- 前端新語言【?】
### 本質(zhì)還是基于目的 ,以下舉例幾個(gè)目的【7】
- 工作之余,學(xué)個(gè)編程語言實(shí)現(xiàn)自己想要的功能
- PYTHON
- JAVA
- 有志于做優(yōu)秀的程序員
- 每一類語言都要學(xué),此外還要學(xué)習(xí)計(jì)算機(jī)的工作原理
- 制作軟件應(yīng)用程序開發(fā)
- java? C++
- 網(wǎng)頁設(shè)計(jì):JavaScript &&? HTML CSS
- 網(wǎng)絡(luò)安全 : PHP
- 機(jī)器學(xué)習(xí):Python
- ......
## 如何提升我的學(xué)習(xí)效率?
### * 有目標(biāo)的同時(shí),有即時(shí)反饋。
*目標(biāo)最好還是對(duì)你實(shí)際有直接幫助的。比如,我試圖用于加速M(fèi)ATLAB程序,或者編寫個(gè)小游戲。不要盲目為了深入而深入。
最重要還是理解核心思想:本質(zhì)是為了利用計(jì)算機(jī)解決問題。
- 理想情況:利用空余時(shí)間,聽完C。而后去一些靠譜平臺(tái)刷題。差不多熟練。再學(xué)個(gè)C++基本語法。之后再用于MATLAB程序加速。未來再學(xué)Python,用于深度學(xué)習(xí)和當(dāng)下學(xué)科的融合。
### 利用一些學(xué)習(xí)平臺(tái),實(shí)現(xiàn)入門
- MOOC網(wǎng)等網(wǎng)絡(luò)課程資源。
https://www.codecademy.com/ 在線練習(xí)網(wǎng)站 N多人推薦他是學(xué)習(xí)編程的好網(wǎng)站
https://teamtreehouse.com/
https://www.pluralsight.com/codeschool? 存在一些try Ruby訓(xùn)練開闊思維
HackerRank、CodeWars、CoderByte、TopCoder、LeetCode、牛客等其他刷題網(wǎng)站
### 利用工具
- Shell 能夠單步執(zhí)行你的編程語句并給出即時(shí)反饋,這種交互式編程方式非常適合初學(xué)者,所見即所得,所以凡是提供 shell 工具的語言,推薦大家優(yōu)先使用shell學(xué)習(xí)。
如果你在學(xué)習(xí) Python,那么python shell,bpython 和 ipython 都是不錯(cuò)的選擇;
如果你在學(xué)習(xí) Ruby,那么irb就是 ruby 的 shell;
如果你在學(xué)習(xí) Shell,打開終端(Terminal)就是 shell;
如果你在學(xué)習(xí) Java 或Objective-C,對(duì)不起,這些語言沒有 shell。
[10]
### 后期直接看gitHub帶星的開源代碼
- 初期閱讀帶來的困難:當(dāng)你懷著崇敬的心情,打開扔給你的網(wǎng)址,看著滿屏幕的代碼時(shí),你會(huì)對(duì)自己?jiǎn)柍瞿侨齻€(gè)經(jīng)典的哲學(xué)問題。這是什么東西?它是怎么做到的?為什么要這么寫?搞不好某些人還會(huì)因?yàn)轶@嚇過度,從而失去了學(xué)習(xí)下去的信心?!?】
- 看別人代碼,估計(jì)也是為了理解別人的解決問題思路。
- 你在軟件開發(fā)過程中可能會(huì)犯下的最大錯(cuò)誤就是孤軍奮戰(zhàn)。軟件開發(fā)基本上是靠眾包的力量。我們一起制定標(biāo)準(zhǔn),一起去犯錯(cuò)誤,然后慢慢才知道什么東西管用(通過大量失敗)?;〞r(shí)間去看熟練的開發(fā)人員的代碼永遠(yuǎn)都會(huì)有回報(bào)。只需確保它是好的代碼。
我能提供的最好建議就是永遠(yuǎn)不要為因?yàn)樽约哼€不知道的事情而感到羞恥。就像我所提到的那樣,這個(gè)行業(yè)規(guī)模龐大,語言數(shù)的數(shù)量極多,內(nèi)容很密集。要想了解需要花費(fèi)大量的時(shí)間和精力,而要想熟練還需要付出更多,而精通甚至需要付出更多。當(dāng)我達(dá)到那種程度時(shí),我會(huì)告訴你的?!?1】
### 有大牛帶肯定是最快的。
### 輸出:比如做視頻,比如做開源項(xiàng)目
### 輔助技巧
- 善于打斷點(diǎn),從而學(xué)習(xí)代碼的執(zhí)行過程
- 需要學(xué)習(xí)的良好的編程習(xí)慣
- 縮進(jìn)
- 變量命令規(guī)則的一致性
- 代碼注釋
### 假設(shè)未來我有對(duì)計(jì)算機(jī)本身有更多渴望,可以聽些課,《計(jì)算機(jī)基礎(chǔ)》《數(shù)據(jù)結(jié)構(gòu)與算法》《操作系統(tǒng)原理》《編譯原理》《計(jì)算機(jī)圖形學(xué)》
## 總體感悟
### 學(xué)編程核心還是學(xué)思想,如何巧妙的利用計(jì)算機(jī)解決問題。學(xué)會(huì)這種思想,學(xué)不用計(jì)算機(jī)語言也就快了,也就發(fā)覺大同小異了。
### 有一個(gè)明確的目的且能有及時(shí)的反饋,這樣可以及時(shí)獲得成就感,進(jìn)而也能學(xué)的快。比如寫一個(gè)小游戲,并且不斷改進(jìn)。也可以做視頻寫博客輸出啥的。
### 對(duì)于程序員,不斷更換編程語言是種很正常的現(xiàn)象。一方面對(duì)于資深程序員,學(xué)習(xí)其他語言不難。另一方面,擴(kuò)寬解決問題的思路。
## 主要參考資料
### 【1】力扣(LeetCode)(2019)https://www.zhihu.com/question/20252436/answer/760728834
【2】https://www.tiobe.com/tiobe-index/
【3】思否小姐姐 (2018) https://www.zhihu.com/question/20252436/answer/438012009
【4】MD ove(2018)https://www.zhihu.com/question/20252436/answer/338697273
【5】某人Blog (2018) https://shannonchenchn.github.io/2018/09/01/how-to-learn-programming-language/
【6】李路 (2014)https://www.zhihu.com/question/22339358/answer/25488851
[7] Brianna Flavin.(2021) 《我應(yīng)該學(xué)習(xí)哪種編程語言?解碼的基礎(chǔ)知識(shí)》https://www.cho-design.com/degrees/technology/blog/which-programming-language-should-i-learn/
【8】 A閃的BLOG 《如何成為一個(gè)通曉多種編程語言的程序員》https://max2d.com/archives/913(提供了很多學(xué)習(xí)的資源鏈接)
【9】zooboole 《Learning programming is different from learning a programming language我今天才知道:學(xué)習(xí)編程和學(xué)習(xí)編程語言是兩碼事》https://www.cnblogs.com/xueweihan/p/13578261.html
【10】神譯局 (2019)《資深軟件工程師:應(yīng)該學(xué)那種編程語言?怎么學(xué)?》https://www.36kr.com/p/1724246999041
[11] MacTalk《如何學(xué)習(xí)一門編程語言》https://macshuo.com/?p=703
【12】閆令琪《計(jì)算機(jī)圖形學(xué)》https://www.bilibili.com/video/av90798049 (需要C++基本語法基礎(chǔ))
【13】(2021)劉利剛《如何自學(xué)<計(jì)算機(jī)圖形學(xué)>和C++面向?qū)ο缶幊獭穐ttp://staff.ustc.edu.cn/~lgliu/Resources/CG/How_to_Learn_CG&Coding.htm
【14】外刊IT評(píng)論《如何學(xué)會(huì)600多種編程語言》https://www.aqee.net/post/what-it-means-to-know-programming-languages.html