当前位置: 首页 > 科技观察

如果C++是一支箭,你会用它射哪只老鹰?

时间:2023-03-16 00:11:41 科技观察

这张照片是我上周末在上海动物园拍到的一只环尾狐猴(还好没去野生动物园)。这是一只比较年轻的猴子,眼睛还像是没有深入涉足这个世界的样子。大家好,我是最近有点飘的安江。本来这篇文章会继续分享操作系统的硬核,不过由于硬核的文章还没有出,先说其他容易的话题吧。看到标题,你可能不明白什么意思。别担心,最后你会明白的。相信很多人接触编程都是从大学时期的C++语言编程课开始的,但是这门课只是告诉你什么是编程语言,并没有告诉你如何熟练掌握编程。因此,难免有很多人发现,虽然自己学了C++,但是自己似乎并不知道自己能做什么,能找到什么样的工作,能去什么样的公司。所以本文从C++的角度出发,谈谈我对C++这门语言的理解。这次不谈什么复杂的应用场景,也不谈语言底层的优化特性,只谈大学学完C++能做什么。当然,由于C语言和C++关系密切,我们将它们混为一谈,放在一起说,道理是差不多的。1实验室开发我不敢说C++是世界上最好的语言,但我敢说C++绝对是工科学生的第一语言。撇开计算机专业不谈,很多工科专业,比如电信、电气、通信等专业,平时的学习基本都是用C++。就连我这种学医的,几年本科硕士基本都是写C++,最后校招也是靠C++的大厂offer。可以说,我对C++的感情还是很深的。据说C++兼具面向过程和面向对象的特点。不仅有比较好的运行速度,也有很好的大型项目开发能力。它可以简单地主宰大学实验室。当然,我们知道另一种在大学实验室中也能与C++媲美的语言就是Matlab。比如我读研究生的时候,左手用Matlab测试,右手用C++优化。论文和专利依赖于这两种语言。还记得在实验室里,基本上所有的算法都是用C/C++写的,包括各种图像处理、信号处理、数据分析算法。刚开始学C++的,大部分都是老理工科的。不管指针多么难懂,虚函数表多么无情,都不会挫伤我们工科学生编程的热情。2后端开发但是当你真的要找工作的时候,并不是这样的。据说Algorithm岗位已经是万神黄昏,导致一大批人涌向后端开发。后端开发主流语言就那么几种,Java和C++为首,其次是Python和Go。作为一个写了这么多年的C++老码农,怎能不凑热闹。所以,学完C++,第一选择当然是面试后台开发岗位。只是我们都经常说一句话,语言并不是最重要的。那么学过C++,想找后端开发的同学,最重要的是什么?其实,软件开发工程师需要掌握的技能就那么几点,各种经验分享和面试都已经讲过了。但是这些只是大概的方向,涉及的概念和技术点太多了,这里不可能一一列举。总的来说,如果你想通过C++找到一份合适的后端开发工作,我建议你可以从以下几个方面来提升自己:第一,扎实的编程基础。这个基础扎实首先意味着你对C++语言比较熟悉,知道不同版本的语言特性(比如C++11和新的C++20的区别),了解通用的语言机制(比如多态、虚函数表、模板等)对底层都有自己的理解。虽然使用什么语言无所谓,但至少要熟练使用一门语言。如何精通,大概需要了解C++的底层机制,多线程编程,跨平台编程。另外,编程能力的素养还体现在对算法思维和数据结构的理解上。毕竟程序的基础是算法和数据结构。所以一些基本的数据结构,比如链表、数组、二叉树、队列等,以及一些基本的算法思想,比如贪婪、分治、动态规划等,最好都掌握。二是系统的理论知识。这就是学科类和非学科类的明显差距所在。很多非专业班的同学其实编程能力很强,但是因为没有接受过系统的理论学习,所以会在理论学习上吃亏。后端开发涉及的东西很多,从网络到性能再到架构,都需要系统的计算机理论来支撑。所以,如果没看过计算机网络、操作系统、计算机组成原理、汇编原理等书籍的同学,需要买几本书回来压抑一下自己的震惊。三是后端基础。如果你想做后端开发,你至少要知道后端是什么。这意味着你必须了??解一些基本的软件工程、软件架构、设计模式等知识。同时,有后端怎么能不了解数据库,非要学习一些MySQL、Redis等数据库的基本操作呢?当然,这也算是入门级了。当真正入门后端开发时,微服务、中间件(Kafka/Zookeeper/Hadoop等)等相关概念和技术的学习就不得不提上日程了。当然对于校招来说,由于缺乏大型线上项目的经验,对后台基础的要求不会太高,更多的还是靠编程能力和计算机理论。但是,如果是已经工作的学生,想要转行,后端基础还是比较重要的。在我看来,这三点是目前互联网公司比较看重的。大家可以对比一下,反思自己是否具备这样的能力。如果还没有,请花时间做好准备。3客户端开发毕竟C++已经是一门非常成熟的语言了,所以除了后端开发之外,其实还有很多其他的开发岗位可以选择。自然是客户开发。相信大部分学习C++的同学都用C++写过桌面软件。那时候估计还在用MFC,敲代码本就能写出一个比较简单的界面。所以如果不想做后端,可以靠C++找一份客户端开发的工作。然而,这对客户来说并不容易。做客户端还需要扎实的编程和计算机理论基础,可能还熟悉Windows/C++编译链接机制、QT客户端开发技术体系、Windows消息机制等技术。所以,如果你是学C++的,不在意这个行业莫名其妙的工作歧视链,找个客户端开发的工作也是很不错的。只是相对于后端开发,你可能需要重新审视客户端的角色。在我看来,client和back在职业发展上的区别主要有以下几点:1.技术天花板这是职业歧视链中讨论最多的一点。一般认为,客户的天花板低,在市场上的长期竞争力不高。甚至有人用CTO基本都是后端开发出身的例子来验证这个歧视链。怎么说呢,我觉得对于大部分人来说,client的天花板确实比back的天花板要低。因为客户端是两级分化严重的技术,厉害的人天花板可以冲破天际,而普通人真的很普通。相比后端,职业身高的分布确实稍微均匀一些。但是当客户端开发到一定深度的时候,难度绝对不低于后端开发。相反,有时为了获得更好的终端体验和更快的用户响应,所涉及的技术会更底层、更硬核。请记住,客户端开发并不像更改UI或文案那样简单。所以我不是特别喜欢这种歧视链,从非常片面的角度来论证某个职业或技术的好坏,甚至上升到歧视的地步。我认同的是兴趣爱好理论,而不是这个天花板理论。2、发展方向Client客户端显然是面向用户的。这意味着客户端的开发是直接与用户接触的,这也是与后端开发的主要区别。简单来说,客户端开发就是为用户服务,优化用户体验,让产品更好用。所以客户端有一个天然的优势,就是离用户很近,知道用户想要什么。问问自己,你认为自己能做技术几年,能写代码多久?身体能活下来吗,还剩下多少头发?做技术还是需要天赋和意识的,尤其是真正顶尖的技术高手。不是每个人都能一直走在科技的道路上。走不下去怎么办?转型。所以,客户端的开发从来就不是单纯的技术,而是双手的业务技术,当然会有一些侧重。业务能力就是产品思维,放大就是互联网思维。这是客户端的一大优势。3.就业选择这确实是当前客户端开发的一个痛点。开拓到二三四线城市,对后端的需求确实大于客户端。因为在小公司,往往不需要这么复杂的客户支持。在很多情况下,后端开发程序员被用作全栈。很多人会认为,做client的话,跳回老家就找不到合适的公司了。虽然这确实很有可能,但也没有那么夸张。只要你基础扎实,善于学习,其实在哪里都能找到类似的工作。但在一线城市,后台和客户端并没有明显的区别,各大互联网公司对这两个岗位的需求都很大。4音视频开发/多媒体开发我们知道基本上各大平台都在做短视频,同时也在不断接入各种直播模式。在这种趋势下,对音视频/多媒体的开发需求也越来越广泛。比较成熟的互联网公司通常会把音视频/多媒体技术方向分开,作为公司所有产品线的支撑。然后将相关的处理算法打包成SDK,在各个业务中调用。这说明音视频/多媒体开发是一项非常重要的工作,在处理音视频或流媒体时,算法效率是一个重要的评价标准。这不就是C++擅长的场景吗。所以,学完C++,你也可以选择做音视频开发。这个方向更偏向于特定的场景,比如播放器,比如直播平台,比如音视频特效等等。当然C++更多的是算法实现的方向。很多多媒体的开发还是基于平台,比如Android、iOS或者Windows,来满足平台特性的开发。但是,如果想在这个方向找到定位,就必须掌握音视频开发的基础理论知识。这里面还包括很多理论知识,比如图像、音频、视频的采集、渲染、处理、传输等问题,图像和音视频的处理、裁剪、编解码等处理。一些基本的处理库,比如图像处理的OpenGL、OpenCV等,视频编解码的x264、OpenH264、ffmpeg,音视频处理的speexdsp、libfaac、opus等库想必都不陌生。还有音视频传输协议,直播推/拉协议,如RTMP、RTSP等也能掌握。哈哈,别被吓倒,毕竟会C++只是基本的编程能力,但具体职位肯定有业务能力要求。5游戏开发游戏开发也是C++可以进入的领域之一,很多游戏引擎都是基于C++开发的。只是游戏开发确实需要兴趣和热情。如果不是因为喜欢游戏,建议不要选择游戏开发岗位。并不是说游戏开发的前景不好,而是对这件事没有足够的热情是很难走得很远的,而且因为方向不是很火,到了换方向的时候,选择的余地也不多。国内知名的游戏厂商寥寥无几,但是做游戏的人却很多。这也导致这个行业的竞争非常激烈,所以在招聘的时候你的游戏开发经验会更加看重。如果你被学校录取,你很少会有更多的游戏开发经验,但是你可以通过很多方式来弥补这个不足,比如参加游戏开发比赛,比如开发自己的demo。至少你得知道或者用过一些游戏引擎,这样你的简历会更丰满。刚才说了游戏开发的业务能力要求,大概包括对游戏引擎的使用和理解,比如常见的Cocosa2d、Unity3D等,游戏引擎的实现原理和机制,基本问到的计算机图形学在面试中学习理论。计算图形学是游戏开发领域及其重要的理论基础。毕竟游戏离不开各种图像模型的渲染和处理。所以,如果你在大学期间有过一些基本的图形工作,比如一些模型绘制和3D渲染工作,你可以尝试游戏开发岗位。我以前有一个哥哥,研究生阶段是做医学图像处理的。他的主要工作是将人体器官和血管以3D形式显示出来,然后他开始从事游戏开发。快乐的。6、嵌入式开发以上的工作选择都是面向软件的,而C/C++也有一个非常大的就业方向,就是做嵌入式。Embedded本身可能更偏向于硬件一点,但是你现在做的是硬的和软的。嵌入式开发还涉及网络编程、并发编程等方面。一个流行的解释可能是嵌入式代码运行在其他小型系统上,而不是传统意义上的计算机上。因此,嵌入式开发更适合电信、微电子等专业。毕竟这个方向不仅需要编程能力,还需要基础的电路理论。一般招聘嵌入式开发岗位的公司多为专注于硬件产品的互联网+公司,如小米、华为等。我进的很多公司都在做物联网相关的工作,毕竟这是一个热点。当然还会有其他的业务方向,比如芯片、机器人等。7总结说了这么多,你有没有发现只懂C++好像找不到工作?不管是哪个位置,对于C++的基本要求都会有额外的东西。这其实很容易理解。毕竟,C++只是一种语言和工具。就好像只用弓箭射不中大鹰一样。你还需要很多额外的能力和知识储备,甚至需要一点预判感,才能在合适的时间以合适的力度射出箭来。而C++只是射出的箭。越熟悉,箭越发亮,破坏力也越大。同时,天空中盘旋的大鹰不止一只,你还需要选择机会最大的一只。良心还在作者简介:我是暗江,一个迷迷糊糊进了大厂的业余码农。分享全栈技术,目标架构师。关注我,一起向技术高手进发吧!本文转载自微信公众号“业余码农”,可通过以下二维码关注。转载本文请联系业余码农公众号。