一开始接触编程的学习,犹豫不知道怎么学习,容易使人丧失兴趣,为此,以下是全查网分享给大家的系统有效的学习编程知识的方法,希望可以帮到你!
一、基础篇(理论与硬件)
这一部分关注的是计算机的基本理论与基本实现。包括硬件结构理论,以及软件与硬件的交互。以理论开篇,在机器语言部分深入,最终在操作系统部分达到高潮。
1、计算机实现计算的原理。这包括门电路是如何实现计算的,时序电路是如何实现存储的,冯诺依曼体系结构是如何将二者结合实现了真正的现实世界的计算机的,以及它是如何反映图灵机这一理论计算模型的。其间会学习布尔逻辑。
2、如何控制计算机硬件。这部分使用的“工具”就是机器语言和汇编语言。我们需要理解机器语言的本质,以及它如何以“汇编语言”这种更容易理解的形式为程序员提供了控制硬件设备的机会。这部分可以学习到很多非常低级但是本质的内容。
3、操作系统是如何工作的。如果你理解了上一部分的计算机硬件相关的问题,那么理解操作系统的工作原理将不会那么困难。另外你将明白操作系统作为硬件和上层软件的中间层次,是如何大大简化了人们对硬件的操作过程的。
二、进阶篇(软件系统)
1、编程语言。这包括结构化编程语言以及面向对象编程语言。因为有很多选择,其实以一门语言开始即可,如果你在前面正确的理解了硬件与机器语言,那么C语言入门真是太简单了,如果你运气不好,觉得C很困难,那么即使是从Python、Javascript开始学习也没问题。重点在于理解编程中和语法相关的基本概念,并了解一些简单的算法知识。
2、数据结构与算法。说白了就是如何合理的组织数据,通过其结构特点来简化编程或者提高计算的效率。这里的内容是模式化的,所有人都需要学习无序结构、有序线性结构、树结构、图结构等。另外,排序算法、查找算法必须学好,特别是算法策略如递推、递归、蛮力(穷举)、分治、动态规划等也必须有所实践和了解。切记不必深陷其中,这里是个大坑,你不可能真的“精通”他们。
3、编程语言是如何实现的。这里主要涉及编译原理。当你站在高级编程语言实现者的角度再来认识编程语言本身的时候,许多问题豁然开朗。这会深刻的改变你的编程观。可惜的是即使是很好的学生在这里也会遇到很大的阻力。真正的问题不是这方面理论性有多强,而是教材都很烂——包括国外教材(什么龙书虎书鲸书都根本不是为初学者准备的),而且语焉不详。这导致大部分人都感觉莫名其妙高深莫测。如果你不是有志攀登软件设计的最高峰,可以绕行。否则从表达式运算解析开始,逐步引入变量,类型,控制结构,函数,再到对象,一步步构建出解析器,然后结合前面学习的硬件接口知识,将其转换为低级表示,最后你会发现没有那么可怕。
三、基础领域篇(必备领域知识)
1、互联网络是如何构成的。这部分包括网络的基本知识,主机间通信的原理,转发设备的实现,以及互联网络的构成。这是网络编程所需的基础知识。除了理解低级协议,也要花一些时间了解应用层的协议,特别是 SMTP、POP3、FTP、HTTP 等,重点是了解他们的基本原理,而不是每个细节。因为每个协议都有自己的标准,光 HTTP 协议就够你研究 6 个月以上了。这里注重的是原理。
2、如何管理大量的数据并在其上建立信息系统。数据库是一个很好的例子。包括数据库系统的基本理论,实现原理,以及设计原则。同样,这里不是真的在教你如何构建一个数据库系统,而是在学习他的核心原则,重点是学会如何合理的设计表结构,以及实现效率良好的SQL查询语句。
四、扩展领域篇(特定领域知识)
1、基于特定平台的软件开发。如何在Windows平台、Linux平台、Mac OS平台或者手机、平板、电视机、微波炉上完成开发?这需要学习特定的软件平台提供了哪些编程接口,如何编译并部署,如何调试和测试等知识。这部分就是软件工程师职业生涯中最耗费时间的部分。
2、有效的软件研发是如何实现的。这包括软件结构的设计知识,软件实施流程的管理知识,以及一些细微而繁杂的内容。人们通常用软件工程一词来概括。但事实上软件工程站的角度要更高一些,这里只是涵盖软件工程的一小部分。
五、科技领域篇(研究性知识)
如果你对人工智能、科学计算、图像处理感兴趣,这里还有大片的区域等待你探索。
事实上,上面的描述有些吓人。每一个领域都够耗尽去很长的时间。不过好消息是大部分知识都只要求在理论上理解。真正的耗费时间的部分还是在与编程、编程、编程。不是每个人都会用到数据库系统,也不是每个人都需要懂得汇编语言。但是这些背景知识会对你有帮助。让你不再害怕,对自己更有自信。
如果你希望自己成为一个很棒的开发人员,那么上述知识都是必须的。但是却依然远远不够。
学无止境,计算机科学尤其如此。
我说的实在太多了。思考和打字差不多耗费了我一个小时。我不太确定这些对你是否有帮助。我希望有,至少有那么一些。但我有点害怕,似乎我的描述不是在帮助你克服困难,而是制造了更多看似难以逾越的高山。
但我想说:走入编程,然后走出编程。编程是为解决问题服务的,我们应当多思考想要解决的问题是什么。这会在我们迷茫的编程生涯中起到指南针的作用。它会告诉我们需要学习什么,然后由我们自己来回答如何学习。
我的一位朋友是做生物科技的,他需要在海量的DNA序列里快速的进行基因片段的比较。为了完成这一任务,他学习了 Python,并着重学习了数据结构和算法相关的内容。虽然最后他写出来的程序外表看起来很简单,但是却速度飞快,为他的事业贡献了无形的资产。
这就是他的起点。但是他并不满足。他继续学习如何增强程序的稳定性,如何编写更好的界面等等。现在他的软件真的非常棒,一些关键的效率相关部分已经替换为C++实现,界面也做得很专业。
天啊,真的无法相信,这就是一位生物领域的研究人员自己亲力亲为的成果。即使是用苛刻的眼光来看,现在他的软件也相当不错。
我举这个例子,想说明的核心在于,知识的学习,要想高效,一个广为大众所接受的观点就是应当围绕一定的具体的目标来进行。如果我们知道我们想要解决的问题是什么,那么我们进一步确定要学习哪些编程知识就会比较容易。相反,为了学而学,泛泛而看,效果通常都是很差的。只能给你留下一些大致的印象,而无法成为你真正的可用的知识。
先有一个想法,像学钢琴也有一开始想弹奏的曲子,提出一个想用生产出来的产品,或者买一本评价好的入门书,做出书中提出的“产品”为目标
将这个目标细化,可以找专业人士帮忙,梳理出知识的“切入点”以及周围的“关联点”,然后开始计划第一次迭代(做出第一样东西),可以是一段很短的程序或者一个作品,但必须有具体的产出
每次产出后都重新调整计划,重要的是自己或者专业人士要能具体地评估这次产出的价值。如果是跟着书就自然容易了,就是跟书上对一下就是了
如果要具体给到一个切入点,那么我的建议是两个选择:
从C语言开始,然后学习算法,走科班路线
从网页制作开始,然后学习网站工程,走产品路线,这是产品中最好入门的了
不必太担心学错,因为到达工程级别,你学过的八成知识都不会被作为工具使用,而它们的只是实现了它们的历史使命——成为你现有某个实用知识的中间点/桥梁、为你现在的学习效率做了一次铺垫。
实际一点地说,对于一个“毕业了”的程序员,学习一门新的编程语言,可能只需一周,而熟悉需要三周,熟练地用于开发是三个月,精通只需一年。这也是大概而已,严谨地说,不同的语言所关联的知识点的数量是不一样的。这也不影响举例,因为在这之前,一个大学生在学习他们的第一门语言,通常是C/C++,用了一个学期,还可能挂科呢(那是态度问题或者是Dota的问题)。
首先吧,别想速成。这要能速成,那么我们专业人士不就该喝西北风去了?
所以要真解决了学习范围的问题后,你下一个问题应该是“要实现**应该具备那些知识”一类的了。等你在某个点扎根后,想的就是利用这个学习能力,去另一个自己更喜欢的领域,还是就此为据点扩充范围,亦或者深入这个领域(也是扩充的一种吧,方向不同)。
最后重申的一点,就是软件开发本身就是一个学习的过程,只是产出的代码具备不同的价值而已。软件的特殊性已经导致了难以重复地写出两段相同的代码,一般只会改写重写,或者重用原来的代码(就是复制黏贴或者引用调用)。
然后要延伸一下时代问题。
从面向对象开始,互联网时代兴起,到现在的移动互联网时代,编程绝大部分的目的是在于创造“软件”,而创造软件也由于世界上最聪明的人群高速集中涌入,以及时代的需求压力,已经形成了一整套工程学,也就是“软件工程”了。
现在“编程”被集中在“软件工程”的需求中,产生的一个结果就是“工程化”,而“工程化”就是整个生产体系开始逐步分化以及逐步专业化,从而出现了这个领域中的各种针对性专业,比如“前端工程师”、“测试工程师”、“算法分析师”、“.NET软件工程师”。
在整个软件的开发周期中,我们都需要跟不同的人在不同程度的合作。即使是个人开发者,都会用到开源的代码、各种下载的人家做好的工具。
这就是工程化后的结果,也就是“编程”被和其他不同的专业,比如数学、医学、建筑、人文等科学结合在一起然后具体地分化成了各个关联的模块。这些模块有一个特点,就是整体上“临近相连”。
这什么意思呢?
举例说明就是,但从(某个)网站开发而言,就有客户、老板、美工、前端工程师、服务端工程师、数据库管理员、网络推广等等。这些角色两两间可能有工作上的直接关联,单指这个软件项目的开发工作的话。
无论哪个是因,哪个是果,现在的情况都是没两个角色间的知识必定关联和有交集。在往广度上看,整个软件工程领域以及世界都如此,只是软件工程领域如建筑领域一般,有比较大的定量的专业化,一切都是有根据有标准的。
而至此,形成的一个结果就是,没有人能掌握所有知识;所有知识都是有关联的,追寻着关联的路径学习产生的效果普遍情况下是最大的。
后面那条可以简单地证明,假设两样知识八竿子打不着,那么你就要等很久它们才能连起来,发挥加成效用。虽然乔帮主说过,总有一天这些dots总会连起来的,但是嘛......靠谱点也不是不好。