自学C/C如何入门,这个问题困扰着很多准备自学的初学者,也是很多自学初学者问得最多的问题。我自己也是从初学者过来的,经历过很多,也踩过不少坑,到现今已经10年开发经验了,想想说说自己的心得和体会,当然不一定全部都对,但我相信还是很参考价值的。
首先,学习技术性的东西,我认为目标是很重要的,然后再根据这个目标来制定自己学习的学习计划,同时用这个目标来检验自己的学习是否已经完成或已经掌握。但是这个目标这个东西并不是随随便便定出来的,这个目标应该基于自己现在的认知和对这个目标应有的理解而定出来,并且是具体的和可达的。那什么是“基于现在认知”?,这个认知就是你这个东西是什么,做什么的,例如说,你想学习C/C++编程语言,那么你就要知道C/C++是什么,他们是用来做什么的,当你对这个东西有一个认知的时候,你才会理解你“学习C/C++编程语言”这个目标有所理解。而所谓“具体的”就是说这个目标一定是有边界的,可以量化的,没有边界或不能量化的目标是不可能完成的,同时这个目标也是不可达的。举个例子:你想学好英语,或你想学好C/C++ 编程语言。类似于这些目标就是没有边界的,因为你无法定义怎么样才算是“学好”。但如果你的目标是 - "我要背完3000个单词",“我要学会C/C++的while循环语句”。那么这些目标就是具体的,同时对于大多数人来说也是可达的。那什么是具体的,又不可达呢?例如:在30年内,我要拿到诺贝尔物理学奖!这个目标是具体的,但它对于大部分人来说是不可达的。 所以,学习C/C++也是一样的,你不知道怎么学习,那是因为没有目标,或者说话你要学习C/C++的目标不够明确或清晰。当你没有目标的时候,就没有计划,没有计划,就没有执行,没有执行就没有反馈,没有反馈就不知道自己当前的状态,然后这样就会导致迷惘,不知所措,这种状态进一步导致学习上的困难,周而复始。
同时作为新手学习,我的个人首先给出的建议是不要贪(贪多,贪快),要专一,先把基础夯实,然后再博览各方的教程和实践,基础不牢,杂而不精,到最后是很有所建树或成绩的,同时你还要记住:当你想达到一个目的,就一定要做和这个目的指向性一致的事情,然后疯狂地执行,这就要求你有很强的自律性。
那么如何确立目标呢?要确立目标就得从大到小的来分析,从领域方向再到具体的技术栈,一步一步来明确自己想要什么,想做什么,当然这个只是局限于我自己的经验。从我自己的开发经验中,C/C++在实际的应用当中,我认为一般有三个分界线比较明显的方向。它们分别是:一、系统级编程,二、应用级编程、三、界面编程。
一、系统级编程
什么是系统级编程?顾名思义,系统级编程肯定是跟操作系统相关性非常大的,一般有网络通信栈、网络IO、磁盘IO、内存管理、系统驱动,系统内核编程等具体的技术,而系统编程又分为类Unix系统的编程(例如:Linux、MacOS),Windows系统编程两个方向。每个方向都对应着不同的技术主线。 系统级的编程中,往往需要对硬件、操作系统系等的相关原理、概念、数据结构及算法、基础知识要非常的了解和熟悉。
统编程往往以C语言为主,C++为辅,所以在实际的应用中,真正涉及到编程技巧和编程方法的几乎是微乎其微,做的大部分工作就是硬件驱动编写(例如:USB驱动、网卡驱动等),除了驱动还有系统级的组件等,(例如网络协议堆栈、虚拟化等),当然还有很多其他,但这种开发大多数涉及的是硬件架构、硬件特性、操作系统等相关知识。
二、应用级编程
其实大多数程序员都在这个领域工作。但并不是说应用级编程就不需要系统级编程的相关知识,只是相对来说需要的程度没有系统级编程那么高,大多数时候了解计算机机的基本原理、操作系统的API如何应用就行了,例如:如何创建线程、如何读写文件等,当然这些很多时候有现在的第三方库可以使用。应用级编程往往涉及到很多软件理论及软件方法,这个学习起来也是头痛的事情,例如:群集技术及集群技术衍生出来的理论及方法、软件的生命周期、软件的开发方法、设计模式、架构设计理论等一大堆,可谓是包罗万象。
然而,这个应用级编程大致又可以分为三个过程或方向,一个是业务功能开发,二是做设计、做架构,三是写工具、做算法。业务功能开发简单来说就是根据需求功能来写代码实现需求需要做的事情,这个基本上需要的C/C++知识不是很多,大多数毕业生就是做这些东西,基本上处于一边实践一边学习的阶段。但是做设计、做架构就不一样了,这个需要的知识面是很广的并且要具有一定的深度,还需要熟悉并深入理解各种理论及方法,还要熟悉很多工具的应用,例如:架构设计的基本理论及方法、熟悉使用OFFICE三件套,数据建模软件 、UML建模软件、各种库、框架的特性都需要了解、以及各种技术都要有所涉足,这就是为什么架构师往往需要10几年以上工作经验的原因。至于工具及算法这个,相对来说就比较简单了,基本上精通《算法导论》、《离散数学及其应用》然后熟悉C++编译器提供各种特性并会应用就行了就行,因为很多时候这些东西都需要性能。例如写标准库,工具库就是这个方向的。
三、界面编程
界面编程就容易理解了,就像Windows上的一个桌面软件,像QQ、钉钉这些应用软件。界面编程基本上是根据原型来画,原型基本上产品经理和UI设计来确定,我们编程主要根据原型来写代码就行了,所以我们的责任也就是写出比较炫酷,用户体验好、易维护、易修改的界面,这也也是界面编程的宗旨,界面编程往往需要十分的熟悉系桌面的API的使用,像WIN32 API这些。当然也有一些现成的库可以用,你QT、WxWidgets,这些库只是做了一个封装,要真正做出好的界面还是需要深入到系统的API才行的。
以上这些都是我自己工作过程中自己得出的总结,可能不完全正确,但我认为还是很有参考意义的。基于以上我的总结,首先要确定自己想做的事情(例如:我要学习C/C++编程语言,写出一个什么东西),这个事情一定是明确的(例如:写图书管理系统),并且要对你所做的事情必须要了解清楚,然后看看完成这些事情需要学习那些内容。当然我这个只是一个例子,要自己实践起来,肯定要去摸索一番,很多人在这个过程就放弃了。
最后就是一口是吃不成胖子的。很多时候很多刚开始学习C/C++的新人,总是以为在网上看了一部视频教程就以为自己已经掌握了C++的开发,可以做出自己想要或别人想做的东西。网上的视频教程基本都是不完整的,所谓的不完整不是说他们讲解C/C++这些基础知识点不完整,而是相对于“C/C++编程”这个技术所要做的事来说不完整,真正的“C/C++编程”不是只学了C/C++这个编程语言就能去做的,“C/C++编程”涉及的知识可以说是很广的。C/C++说到底只是一种工具,既然是工具,那肯定是基于实际需要而使用的,作为工具那同样也其使用方法和适用范围。了解完这些,学习起来都会事半功倍,水到渠成。
当然,要学习,总得有书,网上的学习资料过于碎片化了,推荐下面几本书来看看,我也老实说,单看下面的书,你也是很难入门的,即使你全部看完也不能说入门,我给出入门主的标准是:首先你知道C/C++是什么,并在认知范围内能用C/C++做你想做的事情。一定要记住-所做的事情一定为目标服务。如果你感觉为难,可以找本人付费咨询或指导。
《计算机组成原理》是一本相当不错的基础入门书,建议学习C语言之前先看看这本书。该书共三部分,第一部分介绍了计算机体系结构的基本内容;第二部分介绍指令集体系结构,这是本书的核心,包括指令集的概念、计算机体系结构的一些重要问题,ARM系列微处理器,处理器适应视频编辑和现代多媒体应用的方法;第三部分介绍计算机是如何工作的,以及它在内部是如何组织的。
《操作系统概念(原书第9版)》本书是面向操作系统导论课程的经典书籍,从第1版至今被国内外众多高校选作教材。全书共六部分,不仅详细讲解了进程管理、内存管理、存储管理、保护与安全等概念,而且涵盖重要的理论结果和案例研究,并且给出了供读者深入学习的推荐读物。这一版新增了多核系统和移动计算的内容,每一章都融入了新的技术进展,并且更新了习题和编程项目。本书既适合高等院校计算机相关专业的学生学习,也是专业技术人员的有益参考。
《深入理解计算机系统(原书第3版)》本书是将计算机软件和硬件理论结合讲述的经典教程,内容覆盖计算机导论、体系结构和处理器设计等多门课程。本书的大优点是为程序员描述计算机系统的实现细节,通过描述程序是如何映射到系统上,以及程序是如何执行的,使读者更好地理解程序的行为为什么是这样的,以及造成效率低下的原因。
《C语言程序设计现代方法》,当你有一定计算机基础的时候,再来看这本书。这样书相当详细了讲解了C语言基础知识及C语言的各种基础和高级特性。本书主要目的就是通过一种“现代方法”来介绍C语言,书中强调标准C,强调软件工程,不再强调“手工优化”。书中不仅有C99中的新特性,还与时俱进地增加了C11和C17中的内容。本书分为C语言的基础特性、C语言的高级特性、C语言标准库和参考资料4个部分。每章末尾的“问与答”部分给出一系列与该章内容相关的问题及答案,此外还包含适量的习题。