为什么会选择深度学习C++呢?目前互联网那些开发虽然很成熟,但代码的稳定性与电脑系统硬件相关的接口还是由C++开发,Python在大型项目上看文章说的是不稳定,maybe,还有看了一下绵阳附近招收的算法工程师、C++软件工程师等、都对C++有强烈的要求,工资都在10k-15k左右(九洲集团),所以打算系统的学习C++,并开发一些项目。
C++能做些啥? //建议入坑的小伙伴,在学习一门编程语言的时候先考虑学习它的目的,这样会有激励机制在里面,虽然不建议任何学习都一定具有强烈的目的性,但现状博主所处的阶段属于要恰饭的阶段,忘理解。
PPT来自B站阿婆主 ”编程发际线" 。感谢提供。
//顺便讨论一个经常讨论的话题,从技术学习和实际运用的角度来看,C语言、C++、Java 到底区别在哪呢?
C、C++、Java风格确实不太一样,C与C++ 尤其是C++ 它的语言粒度非常细,机制很多,#k
性能确实很高,但是语言本身的包袱也确实很重,我们所以称它为”造轮子“的语言嘛
也正是因为C、C++ 性能好,粒度细,所以它什么都能做。但Java却是有一个明显的”生态圈“的概念,它本身就是一个服务于互联网软件开发,主要是用作于后端开发、客户端开发居多 ,所以说,它的学习应用领域相对就非常清楚。但是C于C++它就不是,因为它毕竟是那种什么都能做,它是偏底层一点的语言,当然C于C++,我觉得还是比Java要难一些,因为Java毕竟是纯应用层的东西。
C语言和C++主要还是做后台开发比较多,也就是服务端开发比较多,我就不谈及嵌入式了(Embeded System),比如后台开发与服务端开发,比如像那些通信公司、互联网公司后台开发,包括一些游戏平台的后台开发岗位也是用这个C、C++
总之:C && C++ 偏后端
当然,后台开发具体职责有很多细分,比如有做那种什么数据处理和分析的,有做基础协议和通信的,也有做服务端底层应用优化的,甚至还有做后台系统的一些驱动和内核的等等【这个比较深邃了,感兴趣也可以弄弄嘛,怕什么真理无穷···】,确实C&&C++应用比较广泛,所以它确实不像Java这种,应用领域那么清晰是吧!
在编程的世界中,什么是粒度?
我们在了解这一段历史以前,首先给大家介绍一个概念:“粒度”,什么是粒度?作者认为所谓粒度其实就是一个程序中使用代码单元的组合尺度,我们可以举一个例子,沙砾??砖块??房屋模板,我们设想去修建一座房子,其实有很多种修筑方法,如果你不嫌麻烦,可以使用沙砾一点点地建筑,或者将沙砾烧制为砖块,用砖块来砌,甚至直接从工厂购买房屋的门,窗,墙组件来堆砌。这三种不同的方法代表了三种不同的组合尺度。沙砾是最小的单位,使用它搭建小的房子说不定还可以,但是毫无疑问,我们必须使用很多很多“沙砾”,不便于管理;砖块比沙砾聚合了一层,可以用来修建较大的房子了;房屋模板是最高的尺寸,使用它可以快速地搭建大规模的房屋。这三种尺度的区别和联系,与我们编写程序概念是有很大的相似之处的。
在早期学习Pascal,老师告诉我们这种面向过程语言的最基本的单元是过程和函数,它们是程序中的最小的组件。过程和函数可以实现最基本的代码重用,当我们把某些固定功能的代码使用过程和函数编写后,我们可以在程序中调用它们而不必在任何需要的地方都写上这样一段代码,这样的好处是显而易见的。在一些小型的程序里面,使用过程和函数是合适的,但是在大中型程序中,它们的弊端就显示出来,过程和函数的粒度太低了,如果我们一个系统,有10000个函数和过程,我们的程序员将不得不花费大量的时间去寻找和维护它们,10000个没有任何关系的函数和过程的管理难度是显而易见的,就好像10000个人的企业一样,如果没有部门和职务,这还不乱了套?!
#
granularity
n. 粒度;(颗,成)粒性;
granular 英[ˈɡrænjələ(r)] 美[ˈɡrænjələr]
adj. 由颗粒构成的; 含颗粒的; 似颗粒状的; [例句]Concept granular and its distance computing based on information system
基于信息系统的概念粒及其距离计算
学习路线:
一、语言本身学习
C语言本身,除了那种最基础的语法,比如什么:变量、条件、循环、字符串、数组、函数、结构体、等等 这些都是C语言的基础,C语言最最最最最最重要的当然就是:指针、内存管理。
可以说以后企业里开发就靠它们吃饭!!!所以说检验大家C语言学得好不好的唯一标准就是看
指针和内存管理学的怎么样。
C++与C确实是不同的语言,但是C++确实是对C语言的扩充、延伸,可以理解为在C语言里面加入了一些面向对象的特性,因为只有面向对象的特性加持,代码才能更好的复用、扩展和工程化,这也是大型项目所必备的要素,所以除了上面所说的C语言所有的底子之外,像C++新加入的面向对象的特性,封装、继承、多态,还有一些C++里面更高级点的主题,比如说泛型、模板、STL库等等。所以呢这就是语言本身,好像也就这些东西,是吧?
语言学完之后你感觉是玩具,我觉得这非常的正常,我在没有工作之前也是这么感觉的,顶多可以敲一敲书上的一些代码例子,或者说做一点想:俄罗斯方块,贪吃蛇 这种小example练练手,这在语言本身学习的阶段也就够了。
然后,最后一个给大家的建议就是:语言这部分的学习,我是建议大家不要拖得太久,一定要规划好时间,高强度的给它压下来,否则你一天看一页、两页,我觉得很容易自己看泄气,一定要一鼓作气地去看,这样地话效果好一些。
二、基础四大件
首先直言不讳,我当年校招,吃亏,其实就是吃亏在这基础四大件上,当时也就主要是去学语言去了。
这个与你以后从事什么编程方向或者编程岗位,都没有什么关系,只要你想搞编程,这四个理论基础死活都得掌握。 这些弄完之后,大家一定要高强度得去刷LeetCode的题目!!刷题特别重要。
①推荐书籍配合C&&C++《大话数据结构》
如果你是Java的话呢 《算法》第四版 红色的
当然找工作的还有必看的《剑指Offer》
②计算机网络 大白话就是 TCP/IP 协议 ,我们所有的互联网通信都是基于TCP/IP的,无论如何一定要对TCP/IP协议栈了如指掌,主要就是原理,记住原理,包括一些具体的协议,ARP协议、IP协议、ICMP协议,包括TCP、UDP协议,还有DNS协议,还有HTTP协议和HTTPS协议,主要就是这几个,推荐的书籍,《TCP/IP 详解》
③操作系统 大家可能学的都没什么概念,我自己学的也不好,OS在面试的时候,频次比较高的几个问题就是
第一个当然就是所谓的叫:进程 和 线程
当然由此引发出来的很多关于并发和多线程的一些东西,比如什么原子性、并发,锁 等等这些东西,这都是OS里面比较重要的部分。
第二个当然就是: 内存
包括一些什么 内存分布,内存调度的算法。推荐书籍:《深入理解操作系统》
④设计模式 这个稍微好一些,倒不是说23种设计模式全部都要熟悉,常见的几个,
比如什么:单例、工厂、代理、策略模式、包括模板方法,这几个用的比较多,这几个熟练就行了,当然推荐的书籍就那本《大话设计模式》可以这么说。
可以这么说,基础四大件比语言本身重要很多。一定要好好学习。
三、应用与编程实践
这部分会涉及到一些工具、编程环境,还有一些具体的编程实践,就是偏代码的。
实践这部分我也是结合之前在通讯公司的一些工作经历和他们所用的一些技术、所听所见来谈一谈
第1个当然就是所谓的叫:Linux 操作系统的学习,我知道很多的童鞋,老师学习C语言、C++基本都是在Windows操作系统上进行的,但实际企业级开发,尤奇是后端开发或者说服务端开发几乎不可能,所以说Linux OS 必须要会使用,我们先谈使用 ,常见的一些Linux 操作系统 指令,
还有一个比较重要的所谓的,基本Shell编程要熟悉,因为shell编程是一个生产力工具,有一些什么批处理,还有一些自动化的脚本,还是要用Shell写, 这部分资料网上不懂搜就行了,个人不喜欢太死板的看书。
不管怎样,以上都是讲Linux OS 使用层面的东西,第二个东西所谓的叫:编译/调试工具,我知道很多人,包括学生,学C语言或者C++都在类似于什么Visual Studio里面进行编译 是吧? 那个其实也用到了编译器(Compiler)对不对?只不过用的是微软自己的MS-compiler,而且所有操作全都是可视化的,但是你要知道企业里面开发很少会基于Windows系统进行开发,尤其是服务端开发,几乎没有,一定是在Linux系统上进行C语言和C++开发,所以说Linux平台上的一些编译器就必须掌握,最重要的当然就所谓的:GCC,甚至有些公司,比如就像有些通讯公司,他们有自己的这种定制过的那些交叉编译工具,但是没有关系,你只要GCC比较熟悉,其他的问题都不大,然后大家自学C&&C++都是借助类似于VS这种IDE是吧,点击按钮,就可以对源文件进行编译,是吧,但实际企业里面C语言开发也不是这个样子的,实际项目的编译动作叫Make, 编译的动作过程都是写在一个叫makefile的文件中,大家应该也都听过是吧,所以makefile要自己会写,讲白了,整个编译过程自己去设计,所以说makefile我建议大家一定要学一下,在以后实际企业工作里,这个东西也是吃饭的工具,然后最后一个就是调试,这个也特别重要,打击平时用vs调试 打断点、运行,下一步 等等这些都是按钮操作,这在实际开发里也不是这样子,企业级开发里面,尤奇是这些通讯公司,包括互联网公司的那些C语言、C++的这种后台开发,也是在LinuxOS上用的,主要是GDB这个调试工具,所以说GDB调试工具,会借助于它进行代码调试,这个也特别重要,关于这部分,推荐资料是这样。推荐材料:陈皓的《跟我一起写makefile》
最后一个就是所谓的叫:Linux编程环境,还是那句话,企业里面C&&C++几乎都是基于Linux平台,所以这一部分主要学习Linux平台上的一些编程,
1、Linux系统编程:我们都知道Windows编程有各种各样的Win API是吧,同理Linux OS系统上也有它各种各样的API它的使用,它的使用更佳重要,所以说大家要去学习LinuxOS的一些API的使用。
2、多线程编程:因为既然叫做服务端开发、后台开发,服务端它的任务量一定是比较大,所以说多线程相关的东西跑不掉,这地方当然是多线程编程实践这一块的东西,不是理论,包括什么线程、资源、信号、同步、互斥、锁 等一些具体问题的编程实践,一些具体实践
3、网络编程:四大件里面讲了计算机网络这部分是理论知识,但是我们这个地方讲的网络编程是具体的LinuxOS上的一些网络编程的API,还包括一些IO函数的一些具体的代码编程,是这样哈。
这三部分中和在一起,推荐一些书:①《Unix环境高级编程》这本数是必看的、②《Linux高性能服务器编程》这本也是非常不错的、③第三个关于多线程编程这一块的还有一本不错的《POSIX多线程程序设计》,所说收这一部分的书籍推荐,这基本就够了。
PS:想以后搞C语言开发、或者C++开发,看这么多基本就够了,也是比较系统和全面的,其实梳理完后,发现东西也没有那么多,只不过每一部分,都不是那么容易,都比较难啃,童鞋们需要学得精一点是吧,这样的话,面试才能hold主,以后进企业开发也就比较能轻车熟路了,是吧。
学完这些,能拿到40W的Offer