学习笔记_我该如何学好编程 20220418

# 学习笔记_我该如何学好编程 20220418
## 动机
### 不指望依赖编程找工作,而主要是为了高效实现想法,并在实现时,可以提升运行速度(如提升我的MATLAB程序效率)。
### 需要高效率学会编程,或者提高当前编程效率
### 进而,希望自己能站在更高的维度去学习编程。
### PS:每个人的目的不一样和时间不一样,对应的学习思路也不一样。比如我,没办法像别人说的,每天刷题,我觉得会很没有成就感。此外,这也意味着,对于我不不太需要的内容,我了解的不够准确。
## 区分学编程和编程语言的区别 【9】
### 前者核心是借助计算机去解决问题的一门学问,后者是学习一种语言,一种工具。
Eg. 学习编程语言就像在学习木工之前学习如何使用木工锯、锤子等工具。而会编程则是指,木工会注意到想法、可行性分析、度量、测试、用户使用习惯、检查工具和材料质量等工作。
PS:大多数课程就只是教编程语言。扼杀兴趣。
- 这里可以用木工图,根雕图什么的去理解
### 学会编程实质是种思想办法。而学不同的编程语言,是为了掌握更多的工具,让自己在解决某一个问题时,尽可能不受限,进而依据不同工具的特性决定了如何灵活使用他们。
### 再次提醒:学习编程的核心是,借助计算机去解决问题。
## 学编程语言具体内容 [5]
### * 程序语言本身
语法
语言特性
使用技巧
最佳实践
内存管理
设计哲学
编程范式
常用类库
编译/解释机制和运行环境
* 计算机科学
程序语言如何控制计算机
计算机是如何工作的
网络是怎样通信的
* 编程思想
编程语言发展史,各门语言的起源和历史
人类如何利用计算机解决问题
编程和计算的关系
抽象思维
逻辑思维
### 上述很多话,我只能做到粗浅的理解。等以后理解深了再修改。先记着
## 如何算掌握一门语言?
### 【5】
## 学哪一个?
### https://www.tiobe.com/tiobe-index/
### 【7】
### 底层语言
- C
- (1)操作系统内核,如Linux 内核。
(2)运行速度总是最快的几种
(3)「中级语言」,既可以编写上层应用,也可以完成底层内存地址操作的任务。
(4) 32个key words 容易学
(5)学C会知道地址和指针、字节这些概念,进而对计算机数据存储和指令执行有更深的理解。学了C可以让你理解计算机世界,以及彻彻底底控制计算机。
所以对于学编程有一定要求的。C 语言在当代无疑是第一选择。
- 应用场景
操作系统
加速运行效率
理解计算机
- 学习建议:
听些经典的课程,掌握基本语法。
<<C How To Program>>提供很多可口PROJECT,熟练。
- 汇编语言
- 最接近机器语言的就是它了
### OOP 面向对象??
- 学一类这种语言,是为了理解OOD/OOP。面向对象是指,这个语言是基于对象、数据的集合及数据的操纵来构建的程序的。面向对象的概念在诸如C++,Java, Objective-C, 和PHP广泛应用。
- 不够理解
- 一个对象只承担一种责任,所有服务接口只通过它来执行这种任务。
程序实体,比如类和对象,向扩展行为开放,向修改行为关闭。
子类应该可以用来替代它所继承的类。
一个类对另一个类的依赖应该限制在最小化的接口上。
依赖抽象层(接口),而不是具体类。
- 不够理解
- Objective-C
- 专门用来开发 iOS 和 Mac 应用的语言,虽然是编译型语言,但它具备动态特性 【5】
- 已经有往 Swift 上转型的趋势,但还是比较流行的(安卓似乎都用 Java,苹果似乎都用这个)。【1】
- 应用场景:
专门用来开发 iOS 和 Mac 应用的语言
- JAVA
- 优点:
(1)被广泛应用在服务端的开发中(Android 开发,Web 应用程序设计等)。Java 入门,便代表可以完成基础的项目了,基本你就不用担心找不到工作。【1】
(2)Java拥有可能是所有语言中最强大的虚拟机平台JVM,在其上诞生了无数优秀的软件,为了JVM,Java还是值得学习一下的,不过这门语言也是实在太简单了,假设一个人学习Lisp或C需要一个月,学习Python或Ruby或Perl需要一周,那么学习Java,也许只需要一天就可以,因为就语言本身来说实在没那么多可学的【6】
缺点:
(1)环境配置复杂,有一定门槛。【1】
(2)我一直认为这是一门由聪明的人设计,用来控制一帮智力平庸的码农,让他们不至于捅出什么篓子的语言,基本上所有的设计特性,都是为了压抑创造力,让程序员变成按部就班拧螺丝钉的机器来考虑的。【6】
- 应用场景和应用成果:
Android 开发
Web 应用程序设计等
- 学习建议:
初期找一个事无巨细的老师指导,节省入门时间。【1】
- C++
- 优点:
(1)C++ 是目前的主流语言之一,也是一门使用率很高的语言,不用担心找工作。(现在的四大主流语言一般理解为C、C++、Python 和 Java)【1】
(2)C++ 几乎是 C 的超集,C++ 相比较 C 而言,最明显是引入 面向对象的概念.【1】
(3)C++ 是一门非常自由的语言,同时随着深入的学习,C++ 可以给你带来对栈与堆、内存管理等知识点更深刻的理解【1】。是一种宽容的语言 —— 你可以做一切技术上可能的事情,即使在逻辑上不正确
(4)C++ 对指针、变量定义,多态等定义非常灵活,同时有大量标准库,是一门很难让人在简历上写上精通二字的语言。【1】
特点: 好入门、难精通,同时也是一门使用率很高的语言,不用担心找工作 【1】
(5)跨平台,性能优越。
- 应用场景和应用成果:
谷歌 Chromium 浏览器
摩根斯坦利的金融建模
开发游戏引擎
浏览器引擎这些底层库
开发windows 桌面应用
- 学习建议:
最好由已经有 C 语言编程基础的人学习
### 动态语言
- 学一类动态语言,也是为了扩宽思路,不让自己思维受到限制。
- Python
- 主旨:“做一件事情只有一种显而易见的方法”。
优点:
(1)动态语言,有丰富的库作为支持,进而非常适合* 数据统计* 面向对象编程* 写一些帮助到自己生活的脚本* Web 应用程序编程【1】
(2)易学,且比较快有产出。学会它,新手也可以很快发挥他的效果【1】。语法简单、轮子多、开发效率高。
(3)除了底层硬件驱动和 极其 追求效率的开发目前还需要 C 以外,淘汰类 C 语言指日可待。【1】
缺点:
(1)动态语言从根本上就决定,程序写的越大,你需要“自己记住”的东西就越多。等你“记不住”的时候,你的程序就写不下去了。进而大型项目使用少。【?】
(2)不推荐通过把Python作为第一语言二区找工作,除非你是本身需要用到,且学历足够。【?】
- 应用场景:
简单的爬虫 到 复杂的网络开发,又或者是与其他语言进行协作,都可以通过调用库很好的完成。
- 学习建议:
利用Django平台
不追求程序员这个职业,但希望能利用上编程解决问题的人,可以学。
- Javascript
- 特点:
(1)简称 JS,理解基本原理,就可以使用已经编写好的库和方法实现很炫的动画效果。【1】
(2)web 时代的王者,动态性,依托于浏览器引擎的“跨平台”能力 【5】
(3)另一种网页风格。不希望页面过于 HTML + CSS 或者 BootStrap 风格的话,可学它
- 应用场景:
网页设计
表白
### swift
- 特点:
用于解决了一个 Objective-C 中最主要的语法问题。
(1)相比较 Objective-C 而言,Swift 将不再严格区分头文件(即 .h 和 .m 文件将不再区分,而是统一被称为 .swift),避免 #import 的繁琐。
(2)Swift 还有很多 handy 的语法特性,如模式匹配、更严格的 Optional 类型、强大的范型支持、可 Immutable 的原生类型、更方便的 String、闭包语法的优化、元组等,优点非常多。[1]
- 应用场景
MAC IOS??
### Golang
- 特点:
(1)可直接编译成机器码,不依赖其他库,glibc 的版本有一定要求,部署的话只需要扔一个文件上去。
(2)内置 runtime,有丰富的标准库,类似 Python,可以通过调库完成许多功能由于以上特性,Golang 便非常适合后端开发,服务器编程等。[1]
- 应用场景:
后端开发
服务器编程等
### Rust
- Rust :有替代 C/C++ 的趋势【?】
### Flutter
- 前端新语言【?】
### 本质还是基于目的 ,以下举例几个目的【7】
- 工作之余,学个编程语言实现自己想要的功能
- PYTHON
- JAVA
- 有志于做优秀的程序员
- 每一类语言都要学,此外还要学习计算机的工作原理
- 制作软件应用程序开发
- java C++
- 网页设计:JavaScript && HTML CSS
- 网络安全 : PHP
- 机器学习:Python
- ......
## 如何提升我的学习效率?
### * 有目标的同时,有即时反馈。
*目标最好还是对你实际有直接帮助的。比如,我试图用于加速MATLAB程序,或者编写个小游戏。不要盲目为了深入而深入。
最重要还是理解核心思想:本质是为了利用计算机解决问题。
- 理想情况:利用空余时间,听完C。而后去一些靠谱平台刷题。差不多熟练。再学个C++基本语法。之后再用于MATLAB程序加速。未来再学Python,用于深度学习和当下学科的融合。
### 利用一些学习平台,实现入门
- MOOC网等网络课程资源。
https://www.codecademy.com/ 在线练习网站 N多人推荐他是学习编程的好网站
https://teamtreehouse.com/
https://www.pluralsight.com/codeschool 存在一些try Ruby训练开阔思维
HackerRank、CodeWars、CoderByte、TopCoder、LeetCode、牛客等其他刷题网站
### 利用工具
- Shell 能够单步执行你的编程语句并给出即时反馈,这种交互式编程方式非常适合初学者,所见即所得,所以凡是提供 shell 工具的语言,推荐大家优先使用shell学习。
如果你在学习 Python,那么python shell,bpython 和 ipython 都是不错的选择;
如果你在学习 Ruby,那么irb就是 ruby 的 shell;
如果你在学习 Shell,打开终端(Terminal)就是 shell;
如果你在学习 Java 或Objective-C,对不起,这些语言没有 shell。
[10]
### 后期直接看gitHub带星的开源代码
- 初期阅读带来的困难:当你怀着崇敬的心情,打开扔给你的网址,看着满屏幕的代码时,你会对自己问出那三个经典的哲学问题。这是什么东西?它是怎么做到的?为什么要这么写?搞不好某些人还会因为惊吓过度,从而失去了学习下去的信心。【3】
- 看别人代码,估计也是为了理解别人的解决问题思路。
- 你在软件开发过程中可能会犯下的最大错误就是孤军奋战。软件开发基本上是靠众包的力量。我们一起制定标准,一起去犯错误,然后慢慢才知道什么东西管用(通过大量失败)。花时间去看熟练的开发人员的代码永远都会有回报。只需确保它是好的代码。
我能提供的最好建议就是永远不要为因为自己还不知道的事情而感到羞耻。就像我所提到的那样,这个行业规模庞大,语言数的数量极多,内容很密集。要想了解需要花费大量的时间和精力,而要想熟练还需要付出更多,而精通甚至需要付出更多。当我达到那种程度时,我会告诉你的。【11】
### 有大牛带肯定是最快的。
### 输出:比如做视频,比如做开源项目
### 辅助技巧
- 善于打断点,从而学习代码的执行过程
- 需要学习的良好的编程习惯
- 缩进
- 变量命令规则的一致性
- 代码注释
### 假设未来我有对计算机本身有更多渴望,可以听些课,《计算机基础》《数据结构与算法》《操作系统原理》《编译原理》《计算机图形学》
## 总体感悟
### 学编程核心还是学思想,如何巧妙的利用计算机解决问题。学会这种思想,学不用计算机语言也就快了,也就发觉大同小异了。
### 有一个明确的目的且能有及时的反馈,这样可以及时获得成就感,进而也能学的快。比如写一个小游戏,并且不断改进。也可以做视频写博客输出啥的。
### 对于程序员,不断更换编程语言是种很正常的现象。一方面对于资深程序员,学习其他语言不难。另一方面,扩宽解决问题的思路。
## 主要参考资料
### 【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) 《我应该学习哪种编程语言?解码的基础知识》https://www.cho-design.com/degrees/technology/blog/which-programming-language-should-i-learn/
【8】 A闪的BLOG 《如何成为一个通晓多种编程语言的程序员》https://max2d.com/archives/913(提供了很多学习的资源链接)
【9】zooboole 《Learning programming is different from learning a programming language我今天才知道:学习编程和学习编程语言是两码事》https://www.cnblogs.com/xueweihan/p/13578261.html
【10】神译局 (2019)《资深软件工程师:应该学那种编程语言?怎么学?》https://www.36kr.com/p/1724246999041
[11] MacTalk《如何学习一门编程语言》https://macshuo.com/?p=703
【12】闫令琪《计算机图形学》https://www.bilibili.com/video/av90798049 (需要C++基本语法基础)
【13】(2021)刘利刚《如何自学<计算机图形学>和C++面向对象编程》http://staff.ustc.edu.cn/~lgliu/Resources/CG/How_to_Learn_CG&Coding.htm
【14】外刊IT评论《如何学会600多种编程语言》https://www.aqee.net/post/what-it-means-to-know-programming-languages.html