学习C语言需要时间和精力,一年是否能够学完取决于学习的难度和个人的学习效率。对于有编程基础的人来说,学习C语言可能会比较容易,但对于初学者来说,可能需要更长的时间。
C语言在计算机科学领域中非常重要,许多操作系统、编译器和应用程序都是使用C语言编写的。因此,掌握C语言技能可以为未来的职业发展带来好处,但并不能保证一定能够赚到钱。
关于编程语言我一直都很赞同的一个观点:编程语言没有好坏、优劣之分,只有什么语言适合什么样的应用场景,它们都可以在各自擅长的领域发挥作用和价值。
比如外部开发用PHP比较合适,java它适合做安卓、大数据,C和C++它比较适合做底层开发,像游戏引擎、系统软件之类的,python它比较适合做人工智能,go语言它是区块链的主力开发语言,也可以适合做外部后台等等。
至于自己学什么编程语言比较好就得看你的兴趣、想要从事的职业发展目标或者项目要求用哪种语言更合适,这就得靠你自己去摸索判断了,没必要过多的去纠结哪门编程语言最好。
问题的重点在于:你学完这个编程语言你想干什么,然后你再决定学什么编程语言。
对于一门技术的喜厌程度来自很多方面,从个人习惯到项目需求,毕竟任何东西都没办法做到人见人爱。
一、JAVA
Java拥有跨平台、面向对象、泛型编程的特性,非常受企业的喜欢,广泛应用于企业级Web应用开发和移动应用开发。
Java发展到现在,按应用来分主要分为三大块:J2SE、J2ME、J2EE。三块应用范围不同,但却相互补充。广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
Java伴随着互联网的迅猛发展而发 展,逐渐成为重要的网络编程语言。
二、C/C++语言
C语言
C语言是一种通用的命令式编程语言,它起源于19世纪70年代,是大学里面计算机专业学的第一门编程语言,使用相当广泛,并且深远地影响了其后的几乎每一种语言。
C++最初是作为C语言的增强版出现,C++是一种静态数据类型检查的、支持多重编程范式的通用程序设计 语言。C++被用在一些知名软件中,比如Firefox、 Winamp以及Adobe programs。
目前而言,C语言主要用来开发底层模块(比如驱动、解码器、算法实现),服务应用(比如web服务器)和嵌入式应用(比如微波炉里的程序)。C++也可以做这些,不过由于C++的复杂性和标准问题,人们还是更愿意使用C来做。
C++语言
C++更适合比较复杂但又特别需要高效率的设施,可以用来开发系统软件、应用软件、高性能的服务器、客户端应用程序以及视频游戏。
C++对程序员的要求较高,前至各种客户端,后至网络编程,硬件底层。
C++的主要应用领域有游戏开发、嵌入式开发、桌面开发、操作系统开发(要配合C语言)等,这些领域都是对很接近系统底层、对运行效率要求很高。
如果你对游戏开发很有兴趣,那C++是一个优秀的入门语言。不过,C++在最初阶段对初学者来说可能颇具挑战性,C++要比C难学一点。
C更适合广泛应用于计算机的底层开发,例如系统软件:编译器,JVM,驱动,操作系统内核,还有各种嵌入式软件,固件等。
C#
语法基于C,启动时间相当短,只要下载Visual Studio Express,即可全面安装所有必要的元素,比如SQL Express。C#可以用途很多,从Web开发到控制台应用程序等等。
全面集成.Net 库,C#更多的是它背后所依附的.Net平台,它的许多特性只有在.net中才能发挥威力。
C#目前更适合于Windows的桌面应用开发,在web开发也有市场。
三、JavaScript
JavaScript是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言。听起来好像和java有些关系,然而却不是的,只不过名字像而已。
同时JavaScrip也是一种广泛用于客户端Web开发的脚本语言,常用来给HTML网页添加动态功能,比如响应用户的各种操作。JavaScript也可以用在游戏开发等方面。
js最广泛的应用毫无疑问是在web前端。简单的说,网站给你传过来的是一堆用各种标签表示格式的文档,而js负责操纵这些文档实现一些客户端动态效果。js的领地还不仅如此,现在的Node.js还可以用于服务器端的开发。
四、Python
Python是一门易读、易维护,并且被大量用户所欢迎的、用途广泛的语言。由于具有丰富和强大的库,又被称为胶水语言,Python 极其容易上手,主要源于Python有极其简单的说明文档。
Python 的应用领域分为系统编程,用户图形接口,Internet 脚本,组件集成,数据库编程,快速原型,数值计算和科学计算编程,游戏、图像、人工智能、XML 、机器人编程等等。
常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库。Python是做服务器开发与物联网开发。
信息安全,大数据处理,数据可视化机器学习,物联网开发,各大软件的api,桌面应用,都需要python。
五、Go
有C基础,学Golang会非常轻松;
语言层面支持并发,这个就是Go最大的特色,天生的支持并发。服务器编程用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等,网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用。
一个有动态语言感觉的静态语言,写起来效率很高,更适合高并发的网络程序和本地程序;
其实编程语言它从逻辑语法上其实都是非常相似的,只要学会了或者精通了一门语言,你再去学别的编程语言上手就会非常快。
比如java、C、C++或者其他编程语言,其实逻辑语法和结构其实都大同小异。
但前提是你要先学会或者精通一门编程语言,在这个基础上才有可能可能说上手容易;
个人建议直接学C++语言,百度自动驾驶系统、华为服务器、腾讯网易的游戏…我敢肯定都用到C++了。
任何一家公司,但凡追求效率的软件和系统,都会采用C++开发,C++的一些优越性是其他语言无法比拟的。
只要操作系统还是用C来写,C就永远不会被淘汰,这个问题想都不要想。国内的C岗位主要是做内核相关的开发,以及一些嵌入式的需求,当然嵌入式的也有用C++的。
C++不会被淘汰的原因之一是C不会被淘汰,因为C++抱紧了C的大腿,C++最基础的定位就是better C。也有一些领域是C++专属的,比如说游戏引擎、高频交易。
业界很多声音 : C++ 过于复杂?
“过于复杂”指的是加入了冗余的部分,使得本该简单事情变复杂了。
然而啊。。。C++的复杂并不是如你所想。
C++的核心设计哲学是Zero Overhead。啥意思?说人话就是:你没有用到的特性,不应该给你带来任何负担。这个哲学的好处在哪里?当你没有学到/用到一个知识点的时候,你不需要为它付出代价。
当你不明白左9值右值的时候,单纯地传值就可以玩的很Happy,而当你想要榨取性能,避免拷贝复制的时候,你才需要和复杂的左右值,std::move, 标准swap&和对象内建swap等听起来就有点晕的概念搏斗一下。
当你不需要自己设计内存分配机制,就完全不需要理会allocator9这个听起来就不是很简单的东西,放心地使用STL内置的default部分。但是你在嵌入式环境下或者近实时操作系统里想要确保内存分配的速度和效率,就可以看看怎么重载- -下operator new之类的方法。
当你不需要使用模板工作时,大可以把C++当成一个带 类的C玩得飞起。不需要为各种偏特化,类型萃取,integral, std::tuple等 高阶咒语头疼不已。但是你需要构建一套 需要非常灵活拓展的framework,又不想受限于复杂的继承体制时,variadic template和concept就是你最好的朋友。
在你不熟悉FP的时候,完全可以不去考虑lambda表达式,不去考虑std::function,不去写那些高阶函数。但是当你觉得想把Lisp和Haskel中有些概念比如闭包、monad等搬到C++时,你会觉得其实这些东西蛮顺手的。
这多么人性化! C++为不同的能力阶段的人提供了不同层次的工具,而且它们几乎完全正交!但是就是有些人要跳出来“太复杂啦!我们需要简单的语言!”
爱因斯坦说过一-句话“科学要简单,但不是过于简单。”简单的是概念和概念的层次,却不是概念的数量和概念本身的复杂程度。狭义相对论可以把麦克斯维方程组用一个简单的张量公式表示,却不能避免张量概念本身的复杂性。
经典力学是不是太复杂啦,我们需要简单的!有啊,牛顿力学9。只要你不涉及到速度、质量足够大的场景,就不需要相对论;
流体力学9是不是太复杂啦?我们需要简单的!有啊,简单流体力学。只要你不涉及湍流,就不要考虑数值求解内维尔-斯托克斯方程。
量子力学是不是太复杂啦?我们需要简单的!有啊,普通量子力学。只要你不涉及复杂多体交换关联势,你就不需要学习高量和重正化群。
C++是不是太复杂啦?得啦,当你面对的问题还都不涉及到你暂时用不到的内容时,C++够简单啦。。。
985CS专业的老学长谈下学习C++的一些感受吧。
学习C++的大抵都听过这句话:
一年精通,三年熟悉五,年了解,十年用过
说说我的体验吧
本科开始就开始学C++,当然只是皮毛,研究生开始看大量C++书籍,什么c++primer effective系列 modern系列,深度探索C++对象模型等,C++书籍看了不下50本,自以为对C++算很了解了。 于是,开始找工作,第一次参加了某歌在学校的笔试+面试,看了我的简历,精通C++?然后问了我一些C++相关知识,发现自己连听都没听过,随便说一个,std::string能否被继承,为什么?
这个问题看起来很简单,但是里面涉及大量的知识,比如对STL中string的实现是否了解,以及是否了解内存泄漏等等。
然后去了第一家公司做网络开发,涉及大量的TCP底层知识以及重构Linux下API
第二家公司开始做推荐系统
第三家公司负责广告引擎
也就是在这家公司,负责的项目,动不动就OOM,造成了千万损失,能体会到当时什么感觉吗?使用简单的排除法之后,发现问题跟glibc有关,所以在临时解决问题之后,用了一个月的时间,分析glibc内存管理源码.
说实话,C++我现在已经学不动了,新知识越来越多了,hold不住了,哈哈哈
最近网上看到很多人都自诩精通C++,斗胆一说,真不敢说精通,怀着一腔热血研究C++,掉进去搞了七年。C++ Primer,C++ 程序设计语言,翻来覆去看了n遍,其他的诸如Thinking in C++,Effective C++,C++ 程序设计与演进…市面上能买的到的基本都通读过。最大的一点感受,C++太博大精深了,有多少精力都能耗进去。实际项目开发中20%都用不到,模板乃至模版元编程,即使你敢写,也要掂量下你的同事能不能跟上节奏。
一度怀疑花了那么多精力学习C++是否值得,直到后面有机会专攻Webkit内核代码,里面有些对性能有变态要求的模块,诸如JavaScript解析引擎,内存池管理,C++的高级玩法都玩到了,C++的优势得得到了充分的展现。在Webkit里面浸淫了两年,在实际层面理解了C++的价值,她在复杂性管理和效率之间的有着完美平衡,但是前提是你能驾驭它。
再往后就不写代码了,回顾下C++的学习过程与我而言是一门修行,作为一个合格的程序员,深入理解一门语言是必须的,一通百通,后面Java,C#,OC基本上都是一周上手,轻轻松松。但是回顾学习本身,还是值得商阙,
1.语言光看是没用的,看了不实践,分分忘光,很多Effective C++提到的问题,只有实际犯错后才会真正记住,多看,多练。
2.语言只是知识体系里面很小的一部分,其他诸如算法,设计模式,计算机体系结构,编译系统的理解,同样重要,缺了就是短板,把读C++设计新思维,More Efftive C++的时间拿去读APUE,敏捷软件开发与实践,收获会更大。
3. 书先读厚,再读薄,看Webkit最大的感受是,里面的C++用得很克制,只是在必须使用时才会用到高阶技术,而这种场合无非是一些基础数据结构,一些对内存和性能有极致要求的地方,否则不光维护难,哪天出问题了,debug多层模版时想死的心都有…。建议看一篇Google写的C++编码规范,如果只是达到这个要求,精读三四本书就够了。
4.既然学深了就多去理解他背后的设计逻辑和哲学体系,为什么引入一些特性,抛弃一些特性,原因是什么。看看STL的一些源码,那是精髓中的精髓,最后试着自己写一套自己的基础数据结构和算法出来,比光看书有效多了。
你可能会问:C++难在哪?
C++之难不在于其语法的复杂性,也不在于二进制层面上语义的杂乱无章,更不在于玄妙得不食人间烟火的模板推导(模板元编程),这些都只是表象。本质上讲,C++跟任何语言比,它很独特很怪异(废话,任何一种语言那个不特异)。
很多时候,C++给人的感觉就是,好像任何一种语言的特性(这话有点夸张),都可以在C++王国中,通过令人发指的奇技淫巧,罄竹难书的花样作死,最后终于可以在一定程度上模拟出来,但是模拟后的结果,又总是存在这样那样的不足,要么因为内存管理,要么因为反射的原因,总之,就是好像可以做一切事情,但最后终于做得不好。
这个时候,猿猴要么就直接扑上原生带有这种特性的语言,要么干脆就完全舍弃,放弃治疗,啥技巧也不用,返璞归真,就老老实实一行代码一行代码、不厌其烦、不畏枯燥地一再写地重复类似的功能。而C++自身的优秀特性(析构函数、内存管理、模板、多继承等等),没有任何一种语言整的出来,当然,也可以说,这些玩意都是为了解决C++自身制造出来麻烦,other语言s完全不care这些杂碎。难道,这些好东西就没有一丁点价值了。
这里详细谈下C++ 的学习路线,按照这个路线去学习C++,每个阶段都帮你规划好了学习时间,只要你努力且认真的去学了, 保证帮你既高效又扎实的学好C++:
【这个知识图谱总结基于零声教育的c/c++Linux服务器开发架构教程,经过数万名学员学习的反馈,不断迭代技术知识图谱,贴合市场实际岗位就业需求,以项目为核心,通过30+的大小项目学习理解c/c++后端开发技术。目前已更新至第13版,需要的朋友,可以点击领取】
1.精进基石
①数据结构与算法
- 红黑树(应用场景、进程调度cfs、内存管理、左旋与右旋等)
- B树和B+树(定义证明、插入、删除、遍历、查找、指针等)
- Hash与BloomFilter,bitmap(函数实现、应用场景、布隆过滤器等)
②设计模式
- 创建型设计模式(单例、策略、观察者、原型等设计模式)
- 结构型设计模式(适配器、代理、责任链、状态桥接、组合模式)
③c++新特性
- stl容器,智能指针,正则表达式
- 新特性的线程、进程、原子操作、lamda表达式
④Linux工程管理
- Makefile/cmake/configure(工作ipcs原理、文件编译、cmake的写法等)
- 分布式版本控制git(工作流程、分支管理、服务器搭建等)
- Linux系统运行时参数命令(ipcs、uptime、iostat、sar、mpstat等)
2.高性能网络设计
①异步网络库zvnet
- 网络io与io多路复用epoll,kqueue(项目)
- 事件驱动reactor的原理与实现(项目)
- http服务器的实现(项目)
②网络原理
- 服务器百万并发实现(实操)
- redis,memcached,nginx网络组件(理论)
- posix API与网络协议栈(理论)
- UDP的可靠传输协议QUIC(项目)
③协程框架NtyCo的实现
- 协程设计原理与汇编实现(项目)
- 协程调度器实现与性能测试(项目)
④基于dpdk的用户态协议栈的实现
- 用户态协议栈设计实现(项目)
- 应用层posix api的具体实现(项目)
- 手把手设计实现epoll(项目)
⑤高性能异步io机制 io_uring
- 与epoll媲美的io_uring(项目)
- io_uring的使用场景(理论)
3.基础组件设计
①池式组件
- 手写线程池与性能分析(项目)
- 内存池的实现与场景分析(项目)
- MySQL连接池的实现(项目)
②高性能组件
- 原子操作CAS与锁实现(项目)
- 无锁消息队列实现RingBuffer(项目)
- 定时器方案红黑树,时间轮,最小堆(项目)
- 手写死锁检测组件(项目)
- 手写内存泄漏检测组件(项目)
- 手把手实现分布式锁(项目)
③开源组件
- 异步日志方案log4cpp(项目)
- 应用层协议设计ProtoBuf/Thrift(项目)
4.中间件开发
①redis
- redis相关命令详解及其原理
- redis协议与异步方式
- 存储原理与数据模型
- 主从同步与对象模型
②MySQL
- SQL语句,索引,视图,存储过程,触发器
- MySQL索引原理以及SQL优化
- MySQL事务原理分析
- MySQL缓存策略
③Kafka
- Kafka使用场景与设计原理
- Kafka存储机制
④微服务之间通信基石gRPC
- gRPC的内部组件关联
- 基础http2的gRPC通信协议
⑤nginx
- nginx反向代理与系统参数配置conf原理(实操)
- nginx过滤器模块实现(项目)
- nginx handler模块实现(项目)
5.开源框架
①游戏服务器开发skynet
- sky net设计原理
- sky net网络层封装以及lua/c接口编程
- sky net重要组件以及手撕游戏项目
②分布式API网关
- 高性能web网关 Openresty
- Kong动态负载均衡与服务发现
③高性能存储spdk的文件系统实现(项目)
- spdk的工作原理与文件系统架构分析
- 文件系统的posix api实现
- 文件系统的性能测试
④高性能计算CUDA
- gpu并行计算cuda的开发流程
- 音视频编解码中的并行计算
⑤并行计算与异步网络引擎workflow
- workflow的应用场景
- workflow的组件实现
⑥物联网通信协议mqtt的实现框架mosquitto
- mqtt的高效使用场景
- mqtt的broker
6.云原生
①docker
- docker风光下的内核功能
- docker容器管理与镜像操作
- docker网络管理(项目)
- docker云与容器编排(项目)
②kubernetes
- k8s环境搭建
- pod与service的用法
- k8s集群管理(项目)
- k8s二次开发与k8s API(项目)
7.性能分析
①性能与测试工具
- 测试框架gtest以及内存泄漏检测
- 性能工具与性能分析
- 火焰图的生成原理与构建方式
②观测技术bpf与ebpf
- 内核bpf的实现原理
- bpf对内核功能的观测
③内核源码机制
- 进程调度机制
- 内核内存管理运行机制
- 文件系统组件
8.分布式架构
①分布式数据库
- kv存储rocksDB的使用场景
- TIDB存储引擎的原理
- TIDB集群方案与replication原理
②分布式文件系统
- 内核级支持的分布式存储Ceph
- 分布式ceph存储集群部署
③分布式协同
- 注册服务中心Etcd
- 协同时间 用户态文件系统 fuse(项目)
- 快播核心技术揭秘 P2P框架的实现
四、项目实操
1.dkvstore实现
- KV存储的架构设计
- 网络同步与事务序列化
- KV存储的性能测试
2.图床共享云存储
- fastdfs架构分析和配置
- 文件传输和接口设计
- 产品上云公网发布/测试用例
3.微服务即时通讯
- IM即时通讯项目框架分析和部署
- IM消息服务器/文件传输服务器
- 消息服务器/路由服务器
- 数据库代理服务器设计
- 文件服务器和docker部署
- 产品上云公网发布/公网测试上线
项目这一个板块是由零声的讲师所总结的,自己在学习的课程中可以结合上述的详细技术细节点与自己过往工作的项目经验相结合学习提升。
需要获取c/c++后端服务器开发相关视频技术:https://jq.qq.com/?_wv=1027&k=6oU0m6B8