在线客服
扫描二维码
下载博学谷APP扫描二维码
关注博学谷微信公众号
众所周知,Java一直是编程开发的主流语言,学习起来不难,门槛要求也不高,但是高端的和底层的开发还是主要C与C++的天下。比如开发驱动程序,系统服务,高效的网络通信程序(比如大型网游),甚至开发象SQL SERVER这样的软件。C++的执行效率也是最高的。可惜的是,C++并不是每个人都适合开发,它的复杂度和难度是远远超过Java,C++对比其他语言到底难在哪里?有人对C++异常推崇,除了性能优势,还有什么优点,怎么学好C++?
第一:能力上限要求高
C++的能力上限非常高,可以说在软件领域没有C++做不好和做不到的事情,只是开发者水平和成本问题,而C++之后出现的语言都有些无论如何都做不好或根本做不到的事情。
C++虽然能力上限高,但是达到这个上限对开发者的要求也很高,不是普通程序员可以做到的。
其它语言虽然上限低,但是只要不去碰那些极端要求的领域,在各自的优势领域里还是能超越C++的,对工程师要求也没那么高,但是在全领域超越C++的目前还没有。
C++的难点在于给开发者的自由度太高了,什么都可以做,限制很少,导致水平不够的人也可以胡搞瞎搞,把代码写的乱七八糟,然后怪C++太难太复杂。
学好C++,最重要的是你要有学C++的需求,就是个人目标是要成为顶级程序员,成为开发基础设施,设计构建软件平台的人,没有宏大的理想不会有足够的动力去学C++的,过程中太多困难会导致放弃的。
长期来看,C++还是会被取代的,只是这个长期非常长,可以入选有生之年系列。
可以看到在最近几年新出现的软件项目里,C++的使用率已经在下降了,但是很多历史悠久的基础设施类的项目基本都是C++,这些项目生命周期都很长,不会轻易被淘汰。
第二:项目架构难度大
项目构建看上去似乎是个拦路虎,不过结合现代cmake之后,很复杂的工程也其实可以构建得很简单。
难在范式多。范式多其实并不难,真正难在各范式的最佳实践相当不明确。过程式和传统c with class的最佳实践还是比较明确的,多看看GTK和QT就差不离。但是现代C++偏重于静态决定和半函数式,而且本身还在剧烈演进中,这两个方向上,最佳实践比较匮乏,尤其是大规模工程化的最佳实践。我看过微软、facebook的几个现代C++开发框架,还是感觉过于玩具化,跟我自己的开发方式也区别很大,当然我自己是简单至上的,不算完全的通用化方案。
那么真正的难度就在于取舍。如何做业务抽象,以何种形式来做抽象,如何平衡复杂与简洁度,如何确认各技术和模块的边界,如何综合运用多范式就很考验经验和性格。
说点性能以外的优势吧。C++ 11之后,一向是我认为最佳的工程语言,控制力极强。重点在于静态决定和操作简化。
C++尽量少搞动态OOP,理论上不成问题,但是实际语法相当麻烦,而且弄多了就很容易出现像python一样的问题,重构困难。所以基于极强的类型化体系和模板体系,在开发体系的抽象和重构性上,可以达到一个相当舒服的地步。尽可能的静态决定可以避免很多手工错误。
C++写库那是各种手段都可以用上的,但是写完了,可以做到使用极其简单。我个人就觉得和typescript比较像,用起来有时候还要简单一些。
再结合C++20的concept这种前置类型条件,constract这种前置边界后置边界,写代码就更舒服了。
第三:C++概念多
C++对比其他语言到底难在哪里?概念多;
未定义行为多,编译通过不表明你可以那么写;
存在大量语言之外的东西。语言本身只定义到编译单元,但后面还有静态库、动态库、工程化的一堆事情。
最重要的,你不得不学会绝大部分概念。所谓“只使用语言的一部分特性”在稍微大点的工程里是做不到的,因为第三方库会强制你使用那些你原本不打算用的概念。
除了性能优势,还有什么优点?
性能优势不是特点,因为有太多的语言是注重性能的:不论是更老的C、Objective C,还是比较新的C#、Rust。
C++的关键特点,是有性能优势的同时提供了足够多的抽象能力,使得它有能力构建比较复杂的系统(vs C);同时又出现得足够早,有足够的历史包袱:大量已存在的SDK使用C++,于是你不得不用C++(vs C#、Rust)。
怎么学好C++?
按照小谷的经验,我总结出了你需要掌握几点要素:
裸奔概念(比如class无非就是有行为的结构体,method无非就是函数,template无非就是某种代码生成规则)。
业务系统的分割、组织,这对于所有的编程都是需要的。
从项目中学习。没有项目就自己做点小游戏之类的。
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
没有基础可以转行学Java web吗?
没有基础可以转行学Java web吗?这个问题很多想入行的同学都会提问!相对于原本大学教育学习过Javaweb知识的同学,转行的同学会有一定劣势,但是这就意味着这部分同学不可以转行吗?答案必然是否定的。下面博学谷老师就为大家分享一下没有基础的情况下如何学习Java web!
8139
2019-08-07 18:11:08
UI设计目前就业市场饱和了吗?
UI设计目前就业市场饱和了吗?在高速发展的互联网经济催生下,大部分互联网企业不断优化产品形态,对用户的需求以及用户体验更加重视,导致UI设计师高端人才需求不断的扩大。因此UI设计师目前互联网中的紧俏人才,高达几十万人才缺口刺激UI行业前景发展更加广阔。
7039
2019-08-08 11:56:44
C++ 内存管理学习笔记
大家好呀~我们又见面啦,本期我们详细讲述下C++内存管理的相关内容,以下是小谷老师整理的相关笔记哦,大家跟着我拿起小本本努力学习哦
3262
2021-08-20 18:32:16
C++的校招的面试题,看看你能答对几个?
嗨~大家好呀,最近后台有人问小谷,C++校招的话,需要了解哪些内容,大家知道的,小谷有求必应的,那么之后我就来周期性更新一下作为一名C++开发工程师要掌握的知识,本期主要介绍一下C++基础知识吧!
4776
2021-09-16 16:39:50
MongoDB开源数据库系统你了解多少?
MongoDB开源数据库系统你了解多少?MongoDB 由C++语言编写,基于分布式文件存储的一个开源数据库系统,在高负载的情况下添加更多的节点仍可以保证服务器性能,为WEB应用提供可扩展的高性能数据存储解决方案。
2688
2022-04-01 15:49:29