C++之我见:重剑无锋,大巧不工

简介: 首先声明,编程语言没有银弹,要懂得因地制宜,随机应变。陷入语言之争是无意义的。但我也认为对于程序员而言,学习和使用哪门语言是有个人偏好的,偏爱哪个自然也无关乎对错。

首先声明,编程语言没有银弹,要懂得因地制宜,随机应变。陷入语言之争是无意义的。但我也认为对于程序员而言,学习和使用哪门语言是有个人偏好的,偏爱哪个自然也无关乎对错。

据我感觉至少80%的C++程序员不是为了找工作才学的C++,因为学习C++对很多人来说ROI难成正比。论就业,Java的市场需求肯定比C++的多。论学习速度,Go学习没多久,就能手撸一个性能还不错的网络库。而C++呢?学习时间长,旧语法还没精通,新语法又开始层出不穷。并且还有各种安全隐患,程序员一不小心就会踩坑。你以为我要劝退了?不不不。毕竟我也是C++程序员啊,虽然我不劝入,但还是想表达一下我对C++的观点,讲一讲我与C++的故事。


微信图片_20220528171552.jpg




我个人大学时期的编程语言学习经历是这样的:


C → C++ → Java → C++ → C → C++
刚上大学,课本里学的第一门编程语言就是C语言,本来我也没太感冒,后来我对刷题产生了兴趣,就用C语言在hduoj刷了很多题。这期间编程的基本功力大涨。后来感觉刷题的边际效益比较低了,因为我们学校也没有acm集训队什么的,自己好几天研究一道题太不值当的,容易走火入魔。然后就学C++,看了面向对象的部分,学语法倒也不难,只是没找到感觉。每天对着黑黑的控制台程序没意思,当时移动开发特别火,我就自学安卓编程了,这时候主要是用Java,学习安卓的过程之中,我自然而然地对面向对象理解更深刻了,然后回过头去看C++,感觉通畅了很多(好像学习C++都需要其他语言辅助……)。


这时候我突然想做点桌面端GUI的东西,Java的桌面太丑了,MFC的语法太烂,我就学习了一下QT。哇,开始叹服C++也可以这么优雅。但是后来,不管是我学习安卓开发还有QT开发,感觉很多时候都是在搭积木,遇到了如何实现XXX的问题,百度一下就能找到答案,然后照(拷)猫(贝)画(粘)虎(贴)就能做出来。时间久了我心里总感觉哪里不对,那就是太空中楼阁了。这和我内心的声音相去甚远,我想更多的了解一下底层,了解一下原理,而不是搭积木这般。然后我就又开始学C了,开始学Unix C编程,逐步逐步地了解操作系统,了解内存,了解网络,去探寻我心中的真相。


其实也不算深入啦,只是比之前深刻些了。然后再翻看专业课的课本,不同课程的知识和自己自学的串联起来了,豁然开朗,心中暗爽。学计算机不再像是集邮一样,把知识概念一件一件纳入进自己脑袋,而是发现知识本身可以有很多关联,自己揉搓在一起会产生奇妙的化学反应。


这个过程下来,颇有古人说人生三种境界的感觉:


看山是山,看水是水;
看山不是山,看水不是水;
看山还是山,看水还是水

看到这,你可能会觉得落脚点怎么到C了。不是说C++么?你喜欢C,那你选择C就好啦。

我想说:谈C++,谈C是绕不开的话题。C++对C的兼容是C++的包袱,但也是C++的亮点。我可以在C++中无缝地使用C的思想,去直面内存,直面OS,直面网络,且不需要在运行时经过虚拟机或者解释器什么的。另外当你了解了zero overhead的哲学之后会感受更深。在这基础之上呢,我还能享受到一些高层语言的便利。


再谈回C++本身。在对C慢慢了解深入以后,我对C++的学习也重新开始了。我在上大学时候说过一句话:C++给我一种上帝般的快感。比如别名、运算符重载,在Java中就见不到(当然python中也有),这给我以极大的舒适。除此之外你还能“自定义”关键字,比如QT中的Q_OBJECT(这其实是一个宏)。各种编程范式,你想用那种就用哪种(这可能也是被诟病的地方),面向过程、面向对象、函数式。平心而论,C++也并不是无所不包,比如就没有反射(虽然自己也可以手撸一个类似的),没有热加载(也可以用dlopen搞个类似的)。


除此之外呢?模板元编程。这个是一种非C++作者或者官方设计的,而是从C++模板语法中衍生的”,由于C++模板自己图灵完备,所以说其是另一门编程语言也毫不为过。然而这个玩法是“民间”发掘出来的(C++11及以后的标准在官方层面也给了元编程更多支持,这是后话了)。你还没感觉到自己是上帝么?


虽然我选择了C++,但是C++博大精深,并且新标准也在不停扩充,想精通是不可能了,这辈子都不可能了,要一直学习下去,虽然很多语法特性在工作中是用(不)不(让)到(用)的。但是这就是我们学习C++的乐趣吧。学Java的话,学完语言,就要学各种框架了,学习如何花式写XML。学Go的话,学完Go是不是就要学Rust了,学完Rust呢?其实我也不是在鼓吹C++啦,我讲的只是个人的感受。比如夏天的时候,别人都喜欢吃西瓜,但我不爱吃西瓜,也不能说我有问题是不?每个人都有自己的爱好。有些人就喜欢精通各种语言,在简历上写一长串,这样没有什么问题。请允许我自由地表达自己的观点。


说了这么多,好像还没点题。


微信图片_20220528171556.jpg


当年杨过断臂之后,偶遇大雕,邂逅剑魔独孤求败埋剑之剑冢。剑冢有四:

第一柄剑长四尺,锋利无比,剑下石片下写着:「凌厉刚猛,无坚不摧,弱冠前以之与河朔群雄争锋。」
第二片石片上没有剑,下面写着:「紫薇软剑,三十岁前所用,误伤义士不祥,悔恨无已,乃弃之深谷。」
剑魔独孤求败的第三把武器:「重剑无锋,大巧不工。四十岁前恃之横行天下。」外表黑黝,剑身深黑之中隐隐透出红光,三尺多长,共重八八六十四斤,两边剑锋都是钝口,剑尖圆圆的似是个半球。
第四个阶段才是渐入化境,第四柄木剑,石片上文字道:「四十岁之后不滞于物,草木竹石均可为剑。自此精进,渐入无剑胜有剑之境。」

从一到四,并非按照四剑本身之优劣排序,紫薇软剑未必胜过四尺长剑,同样玄铁重剑也未必会比紫薇软剑更能克敌机先,最后一把木剑更可谓四剑中最弱的。但是四柄剑依次排开,金庸老先生所要展示的并非是剑之高下,而是展示持剑人(也就是独孤求败)武功修为之变化。


杨过纵然有此奇遇,其实并没有得到武功秘籍,只是拿走了玄铁重剑。所谓『重剑无锋,大巧不工重剑无锋是说剑刃是钝口,而且剑尖都没有(只是一个半球)。大巧不工是说这柄剑并没有经过工匠的精心雕琢。这种剑本身杀伤力并不大,而且又因为是重剑,操作难度极大后来横行江湖被称为神雕大侠之时,所倚仗的却又并非此剑,而是自创的黯然销魂掌。最终玄铁重剑赠送给了郭靖夫妇,被融化成屠龙刀倚天剑了。对杨过而言,这并不可惜,因为彼时,他已然达到独孤求败的第四境界。

编程语言亦是如此,不同的编程语言,只是不同风格,不同特质的剑而已。初学者或者有经验的程序员们,常在剑冢流连忘返,而忽略了自身修为的提高。在我看来C++就是玄铁重剑,但是如果你能熟练地挥舞玄铁重剑,那么你自身的内(编)功(程)修为也会逐渐臻至化境,以致于后期能达到『不滞于物,草木竹石均可为剑』的境界,什么编程语言都可以快速掌握,各种逻辑抽象,编程范式都可以轻松应对。


微信图片_20220528171558.jpg




有趣的是,回看独孤求败给四柄剑留的字:三十岁前、四十岁前、四十岁后……这生命历程像极了程序员呢。希望我们能干到四十岁后


另外我真不是无脑吹C++的,Python也是一门很优秀的语言呢。不、不、不,我不能这么说话。Java和Go也都是很优秀的语言。


我认为学习什么语言这并不冲突。喜欢哪个就去学习就好了,谁都不会限制你只学一门啊。但是要是说工作语言的话,那就要再综合考虑了。以上表达的仅仅是我个人的观点。






相关文章
|
3月前
|
运维 安全 测试技术
DevSecOps来袭,传统软件安全模式OUT了?新思维让你眼界大开,看完这篇秒变专家!
【8月更文挑战第6天】近期深入探索了DevSecOps,这是一种革新软件安全的开发运维模式。它将“安全”全面融入“开发”与“运维”,构建自动化安全体系。不同于传统事后安全检测的方式,DevSecOps强调安全贯穿软件生命周期始终。借助CI/CD管道集成安全扫描工具,确保每次代码提交均符合安全标准。例如,在CI管道中加入静态代码分析工具SonarQube,自动执行安全检查。DevSecOps不仅是技术实践,更代表文化与管理的变革,促进跨职能团队协作,共同保障软件安全与质量。未来,DevSecOps有望成为软件开发领域的主流实践。
40 1
|
3月前
|
存储 分布式计算 大数据
惊了!大数据时代来袭,传统数据处理OUT了?创新应用让你眼界大开,看完这篇秒变专家!
【8月更文挑战第6天】在数据爆炸的时代,高效利用大数据成为关键挑战与机遇。传统数据处理手段难以胜任现今海量数据的需求。新兴的大数据技术,如HDFS、NoSQL及MapReduce、Spark等框架,为大规模数据存储与处理提供了高效解决方案。例如,Spark能通过分布式计算极大提升处理速度。这些技术不仅革新了数据处理方式,还在金融、电商等领域催生了风险识别、市场预测及个性化推荐等创新应用。
99 1
|
消息中间件 架构师 算法
好家伙!全网开源对标P5~P7程序员技术成长路线,阿里这次是真卷
今年的程序员可以说是最焦虑的一个群体了,面试找工作投简历没人理,有面试机会也面试不过,面试进去还干不长...于是,程序员们纷纷直呼:互联网寒冬又双叒叕来了,环境不好努力也没用躺平算了。
278 1
好家伙!全网开源对标P5~P7程序员技术成长路线,阿里这次是真卷
|
安全 Java 虚拟化
涅槃重生!字节大牛力荐大型分布式手册,凤凰架构让你浴火成神
从大型机到单体架构,从微服务架构到无服务架构,每一次架构模式的演进都是一次涅槃。每一个软件系统都是由大量服务构成的生态体系,个体服务的“死亡”和“重生”是整个系统能否持续可靠运行的关键因素。笔记从5个方面全面剖析了如何构建一个可靠的分布式系统,同时给出了Spring Boot、Spring Cloud、Kubernetes、Istio、AWS Lambda五种架构风格的样例工程。
|
运维 Kubernetes 负载均衡
使用K8s之我见
作为开发者,想必都对docker并不陌生,尤其是做后端开发的开发者更为熟悉。但是前段时间有个新闻关于docker马上要停止开源,这对于应用容器领域来说是一个晴天霹雳。但是docker停止开源,想必会让其他应用容器引擎能够有更好的发展。随着容器化的快速发展,关于集群管理、资源整合调度等相关领域的历史问题都得到了很好的解决,而且最为耀眼的就是谷歌开源的Kubernetes,那么接下来就来谈谈关于K8s相关的内容。
177 0
使用K8s之我见
|
存储 缓存 网络协议
一套互联网公司理想架构,快快收藏。。(3)
一套互联网公司理想架构,快快收藏。。(3)
152 0
一套互联网公司理想架构,快快收藏。。(3)
|
域名解析 负载均衡 网络协议
一套互联网公司理想架构,快快收藏。。(1)
一套互联网公司理想架构,快快收藏。。(1)
270 0
一套互联网公司理想架构,快快收藏。。(1)
|
缓存 负载均衡 监控
一套互联网公司理想架构,快快收藏。。(2)
一套互联网公司理想架构,快快收藏。。(2)
166 0
一套互联网公司理想架构,快快收藏。。(2)
|
算法 测试技术 API
热饭的测开成果盘点第二期:C/S架构的全端自动化
本期介绍的是一个c/s端的工具,即客户端工具。也就是需要下载安装的界面工具,相比较现在流行的B/S即浏览器平台来说,具有以下特点:
热饭的测开成果盘点第二期:C/S架构的全端自动化
|
存储 云安全 弹性计算