新手该如何通过自学入门编程呢?
非零基础这里指的是高中以上学习经历。经过一定深度的数学,物理或者其他辩证学科以及语文和英语的学习经历,实际上你已经具有了学习编程的基础,所以已经不是传统意义上的零基础了。
如果你听说过学编程就是学JAVA之类的话,并且信以为真,那么向自己借几分钟,认真阅读下面的讨论将产生足够的价值使你改变这个想法:
全文4235个字,阅读约需6分钟,
每超过1分钟将带来+2%收益
低于1分钟负收益,浪费了你的精力让我很难过
正逢一位趣味相同的的网友想转行学习编程,他可能纠结于到底是JAVA还是C,所以我们讨论了这个问题。
出于尊重对方隐私的考虑,隐去了知乎网友的回复。
开篇
学编程来点方法论,明确它未来是你的职业,得快速入门不能等热情被消耗完。有规划+对比不同教程,教程不只是具体哪门语言,比如你说的java,还要补点必不可缺的好东西。我爱人零基础,最近她自学前端-规划三个月成,实际上时间大部分用在基础知识或者通识知识上。所以推荐阅读:知乎问题,“如何通过自学找到一份开发工作”。另我在做软件安全工作,大言不惭的说接触的计算机技术比较广泛。所以有什么相关问题欢迎一起讨论交流。一直有关注你关于XXXXXXX的讨论,为你点赞(。ò ∀ ó。)
第一封讨论信
以下讨论目的是让我们不要成为技术上的瘸子,能在一大堆技术中找出应当首先学习的一批,以及未来的学习方向。
如何通过自学找到一份开发的工作?
https://www.zhihu.com/question/26421707
不知你看了这些详细自学记录感受如何,照着似乎可行又不可行,但是到底听谁的呢?
分类
自认为比较好的归类,计算机自学内容无非如下四类+一类:
一:编程语言:
你需要一种编程语言和计算机打交道,几乎可以任选:
它们可以互换,而且掌握一种,其他的都是小菜,如果只是掌握语法,在你熟悉一们语言,1周一门新语言并不困难。
所以JAVA还是C++(不推荐C),同时学两门反倒可能更快。
二:算法-数据结构相关:
算法是编程的灵魂。别人的程序为什么总比我们的快一万倍呢?
别人一台机器能搞定,我们得花N台还搞不定。比如C10K问题。
三:通用系统原理的:
操作系统、数据库。
这些是整个软件环境的基础,在本项的探索深度将影响其他的发展深度。
四:现有组件的底层原理的:
例如,了解Java语法之后“Java虚拟机”这个底层知识就是你的突破口。
了解C++语法后,虚函数表的原理通常是一个突破口。
五:套路们
设计模式在JAVA中广泛使用,就是前人开发软件被坑时避免下次被坑想出的东西。
因为需求经常乱变,以往程序员被动变,现在程序员主动将可能变和不变的东西分开。
分析
以上五路,
学院派,一,二,三共修。四,五得靠个人兴趣自学或者工作后被逼学会或者最终都一知半解。
自学派,容易掉到一里面去,学一门语言,但是由于算法-数据结构学习不了解应该投入,投入过少而感觉学习太浅。
如果投入在“三:通用系统原理”方面过少,就会感觉整个系统就是一个黑盒子难度高,缺少大视角.我想学院派嘲讽自学派的原因之一就是,自学派没有开上帝视角,底层知识-重要的东西没投入不清楚要投入强调努力,而学院派自己因为有已经论证过的全面的课程安排,所以省心的同时路不歪.
投入“四:现有组件的底层原理的:”这个嘛不用急,很多初级程序员并不知道TA需要在该方面投入,所以初学不必在纠结于此。
“五:套路们”:设计模式得搞。
知乎的自学经历归类
如何通过自学找到一份开发的工作?
https://www.zhihu.com/question/26421707
善于总结向来是件好事:
我爱人对“如何通过自学找到一份开发的工作?”里面回答者提到学习内容的归类:
公开课:
1. 哈佛大学公开课:计算机科学cs50;
2. 麻省理工公开课:计算机科学和 Python 编程导论;
3. 斯坦福大学公开课:编程范式;
4. 麻省理工学院公开课:算法导论;(1-4都可以在网易公开课找到)
5、结合The Hardware/Software Interface公开课阅读《深入理解计算机系统》(时间不够,没做习题)
CSAPP偏硬件角度,学习操作系统看的是《现代操作系统》;
6、慕课网上完成了“Linux运维工程师”系列课程学习;
书籍:
《计算机程序的构造和解释》
《深入理解计算机系统》
《现代操作系统》
《算法导论》
《C语言编程》
《C++Prime》
《笨方法学Python》
《Flask web开发》
《计算机网络自顶向下方法》
《TCP/IP 核心卷一》
《APUE》
《UNP卷一》
《SQL必知必会》
《高性能MySQL》
《深入理解Nginx》
《Thinking in java》
《深入理解Java虚拟机》
《Linux多线程服务端编程 》
计算机自学分类:
一、语言层面学习:
C 语言:《C语言编程》,《C++Prime》,《笨方法学Python》,《effective c++》,《effective stl》
Java:《Thinking in java》;
二、框架:
SSM框架:《深入理解Java虚拟机》;
PyCharm搭建网站:《Flask web开发》
三、系统知识:
Nginx 源码:《深入理解Nginx》
操作系统:《现代操作系统》、《深入理解计算机系统》
《csapp》
四、计算网络基础知识:
《计算机网络自顶向下方法》,《TCP/IP 核心卷一》,
《算法导论》、《数据结构与算法分析》
{数据结构和算法:包括各种线性表,树(二叉树、AVL树、RB树的各种操作),
图(BFS、DFS、prim、kruskal、djkstra、floyd、拓扑排序、关键路径等)
查找算法,排序算法。}
五、学习记录:
编写:学习使用 markdown 编写方式;
代码:用git管理自己的代码,学习github上的优秀源代码;
命令:熟悉Linux的常用操作与命令;
貌似她归类清晰,值得鼓励,但实际上归类混淆
我们刚才总结了一下我们的归类:
一:编程语言:
二:算法-数据结构相关:
三:通用系统原理的:
四:现有组件的底层原理的:
五:套路们
将上面内容对号入座:
一:编程语言:
《计算机程序的构造和解释》
《C语言编程》
《C++Prime》
《笨方法学Python》
《SQL必知必会》
《Thinking in java》
麻省理工公开课:计算机科学和 Python 编程导论;
二:算法-数据结构相关:
《算法导论》书籍
麻省理工学院公开课:算法导论;(1-4都可以在网易公开课找到)
哈佛大学公开课:计算机科学cs50;
《数据结构与算法分析》
{数据结构和算法:包括各种线性表,树(二叉树、AVL树、RB树的各种操作),
图(BFS、DFS、prim、kruskal、djkstra、floyd、拓扑排序、关键路径等)
查找算法,排序算法。}
……
三:通用系统原理的:
《深入理解计算机系统》
《现代操作系统》
《Linux多线程服务端编程 》
《TCP/IP 核心卷一》
结合The Hardware/Software Interface公开课阅读《深入理解计算机系统》:完成它的习题;
CSAPP偏硬件角度,学习操作系统看的是《现代操作系统》;
《高性能MySQL》//数据库属于系统原理
《计算机网络自顶向下方法》
……
四:现有组件的底层原理的:
《计算机网络自顶向下方法》
《深入理解Java虚拟机》
……
五:套路们
《大话设计模式》有趣的书,里面用JAVA写的例子.反对推荐艰深到让人丢书的东西给新手.
……
自学最迷茫的就是不知道要看什么教材。 本来我是想从C开始的,但公司里说,刚好有个JAVA项目,结果我就开始学JAVA了。网上找到一套视频,现在才看了一半多一点。不知道看完这个后,还需要再看什么了。
现在答案已经很明显了,C还是JAVA开始并不重要,因为从编程角度看它们地位接近平等的,但你要掌握一门语言的语法。
明确自己无论是学任何语言都要恶补的东西:
二:算法-数据结构相关:
三:通用系统原理的:
四:现有组件的底层原理的:
这是所有合格程序员的必经之路.几百万人已经试过这条路.
高中之路,大学之路绝对会给我们学习新的知识带来更广的视野和助益.
你有提到,你的同学初中辍学,我看到可不是他很幸运,很遗憾他在计算机学习路上必定会比我们付出更多的代价.我也差点初中去读技校学计算机,但是由于我当时自学C#语言看不懂“数组”是什么意思,所以我去了高中。所以我们作为较高学历者只要转行优势非常大,只是你之前没有选择这行而已,但如果你灵活运用这些知识,包括你现在的职业的技能,这些技能都不会是白费的,一个精通会计的编程,总会在人生一些节点起到作用。赶超之日不会远的,除了赶超前人和改善生活(新手没见过低于5k的行情),我认为编程还能带来自由,这个或许将来会体验更深。
现在了解更多的编程自学的方向了吧?那么该好好考虑一下怎么分配时间啦:)
如果有其他疑问,欢迎讨论。
第二封讨论信
强调两个点,
- 不要慢,要快.
- 不要坚持学编程
初期要制定计划严格执行,如果学编程真的对你来说很重要的话.
你可以想想未来几十年你可能靠它提供主要收入,靠它完成一些别的梦想.比如之前缺钱完不成的梦想.
制作任意软件的梦想.
自己制作软件被成千上万人使用,并且做出更多贡献而得到应有报酬的梦想.
……
所以这不是一件痛苦的事,不需要坚持!(唯一的一个感叹号)
这么一件有趣的事,达成你人生梦想的事,不需要坚持,自然有动力,自然是越快越好,
换我的话,谁拦我学习我跟谁急.所以学编程这件事在头脑要主动.
给自己一个规划并尽快执行.
补充几种我个人在用的学习编程的小方法:
- 记笔记,尝试写博客记录学习成长过程.以及每日学习进度安排,及昨天完成程度.
方便圈子交流,成长回视.自我督促. 小技巧-虽然都听过,但每次都用起来效果必然不同:
- 跳出学习者思维,从设计者角度去看:为什么要设计垃圾回收机制?如果学习更深,可以尝试提出“如果我来设计垃圾回收怎么设计?”
- 多问为什么,例:JAVA申请,需要我们释放吗?难道不会出问题吗?它是怎么避免的?
- 举一反三,还是那个例子:JAVA的内存管理方式是XXXXX,那么还有哪些内存管理方式?
一下子就进入:“现有组件的底层原理”,“通用系统原理”的内容。这样知识点就连起来了。
找到这个圈子的聚集地-享受氛围
或者是QQ群或者是该技术的网站,那里有老手有新手,可以把自己的知识教给比自己新的新手,也可以向老手请教问题。和一群与自己一样成长进步的人交流会很爽的。享受氛围有时也蛮重要的。
也会给自己带来更广的视野和工作学习机会。
祝快乐编程!