C++!宇宙中最可怕的语言。自人类诞生以来,它可以对软件工程中的一切错误负责。如果你学习它,那么世界上没有足够的东西来保护您免受 C++ 的侵害!

抱怨一种编程语言可能会让你疯狂点击键盘,但它并不能真正改变什么,不是吗?

如果您想就 C++ 和一般编程进行更独立的对话,请继续阅读。如果已经很晚了,而您只是难以入睡,那么,也请继续阅读。

我是如何成为程序员的

在我进入我的观点之前,我认为分享我是如何到达那里的会很有用。此外,这是我的博客文章,所以很不幸,我想写什么就写什么。

我第一次接触家用电脑是在 1984 年,当时我父亲买了第一台 Mac。那年我七岁。1987 年,Hypercard发布,您可以使用 Hypertalk 编写小程序。通过查看提供的示例并编写自定义动画,我学习了一些语言。

计算机没有太多说服力就让我爱上了编写程序。

不久之后,我拿到了我的电脑,Amstrad CPC 6128。我通过阅读书籍和杂志上的文章学习了 Basic 和Z-80组装。请记住,当时互联网只是一个军事和政府网络,获取信息要困难得多。

当我得到我的第一台 PC 时,我想是在 1990 年,那时我 13 岁,我学习了 Pascal(Turbo Pascal!)和 x86 汇编。我总是被低级编程所吸引,因为我想了解软件在原子级别是如何工作的。

我不记得我是什么时候开始用 C 编程的,但我记得我是在 1997 年左右开始 C++ 的。那时,我无法获得正确的 STL 实现,因此逐渐(错误地)不喜欢 STL,以至于我编写了自己的“标准库”。

我在 1999 年得到了我的第一份工作,并获得了在MFC 中设计 Windows 应用程序的报酬。当时,C++ 是我正在处理的应用程序的明智默认值。这些应用程序今天可能是网络应用程序。

无论如何,我对内核编程更感兴趣,并最终转向了允许我这样做的工作。我还学习了大量其他语言,例如 Ruby、Python、PHP,但仍主要专注于 C++。

2006 年,我找到了一份新工作,认识了一个叫 Christophe Henry 的人。他正在用 Boost Lambdas 做一些很酷的 hack,并且在使 Visual Studio 2005 崩溃时玩得很开心。他在空闲时间开始研究Boost.MSM。

它让我意识到,你花多长时间做一件事并不重要;如果你不寻找矛盾,不遇到做事不同的有才华的人,你永远不会变得伟大。

Christophe 是通往更大 C++ 社区的门户,这帮助我取得了巨大进步。几年后,我甚至与 Joel Falcou合着了一本关于模板元编程的书。最后一点总是让我微笑,因为第一次向我介绍模板元编程时,我告诉自己“这是邪恶的,这就是为什么我需要更多地了解它。”

我用 C++ 构建了什么

在 C++ 中,我在团队中或由我自己编写和设计,而且通常完全从头开始:内存管理器、文件系统、加密设备驱动程序、交易系统,甚至是一个数据库管理系统,整个公司都从这里发展起来.

然而,我认为我对 C++ 编程语言或其历史没有很好的理解。我相信我的计算机科学知识充其量只是肤浅的:我知道的足以完成任务。如果我要评价我的 C++ 水平,我会说我是 10 分中的 2 分。

C++ 就像俄语;即使到了 80 岁,您仍然会通过创造性地将某人与人类生殖器进行比较来学习贬低某人的新方法。

这不是因为 C++ 是一种可怕的语言;这是因为它旨在解决软件工程中最复杂的问题(稍后会详细介绍)。不过没关系;并非每个人都需要成为 C++(或任何与此相关的任何编程语言)方面的专家;重要的是你能做好你的工作,并有正确的过程来学习新事物。

阅读本文后,您就可以理解为什么我对 C++ 抱有积极的偏见。尽管它有一些怪癖,但多年来它对我很有帮助,我认为它是最好的语言之一。

语言重要吗?

我的想法是与您分享我目前对 C++ 和编程的看法。

虽然这篇文章将重点放在 C++ 上,但我希望您会发现大多数见解并非特定于一种语言。C++ 恰好是我最了解的语言。

我喜欢它的表现力和它为您提供的完全控制,这对于我习惯于处理的事情来说非常棒。臭名昭著的“零成本抽象”。

如果我的工作是设计 Web 应用程序,我可能不会认为 C++ 是一种伟大的语言,因为它所有的古怪和花哨的东西对我来说都毫无意义。

编程语言只是我们用来提高生产力的抽象。您需要的抽象程度及其功能在很大程度上取决于您需要解决的问题。最后,一切都一样:0 和 1 通过处理器。

每个程序员的一些标准是不同的:个性、品味和认知能力。当然,要成为任何语言的优秀程序员,您都需要聪明。好消息是智能有多种形式,你越早发现自己的聪明程度,你的选择就越好。

这就是为什么大多数语言辩论都像“哪种武术最好”一样毫无意义:双方都假设他们有相似的想法,必须解决相同的问题。诀窍是确保您选择的工具不会成为您身份的一部分。换句话说:不要让你的技术选择成为一种信仰。

我个人的经验是,哪里有伟大的软件工程师,哪里就会有伟大的软件。语言是次要的。毕加索将绘制一幅您无法用铅笔和从笔记本上撕下的纸来模仿的杰作。

当然,选择一种语言是有客观原因的。例如,性能要求、环境支持、团队能力或您要使用的库仅支持有限的语言集。为了实现他心中的愿景,毕加索会寻找合适的材料、布景、颜料。

无论如何,我强烈建议您接受自己的偏见。你不可能对你做出的每一个决定都完全一致和理性。你,人类,是不一致和不理性的。

你选择 Rust 不是因为它比 c + + 好。你选择它是因为它是一个崭新的、令人兴奋的东西。是的,PHP 是一个恐怖的东西,但是它可以完成任务,而且随着时间的推移,它会越来越受你的欢迎。你用 Ruby on Rails 编写 web 应用程序是因为你认为 David Hansson 有一辆很酷的车,而不是因为它有“超级的元编程能力”

你知道吗?承认吧。

完美解决谬误

当你放弃认为有一个完美的解决方案可以解决你正在处理的问题,一个完美的“方式”的想法的那一天,你就朝着正确的方向迈出了一步

一旦您的问题不再是微不足道的,软件工程就变成了做出正确妥协的艺术。这不仅仅是选择数据结构和算法,还扩展到编程风格,甚至你猜对了,语言。

寻找完美的解决方案是一种拖延的方式。通常,我们拖延是因为我们觉得我们不会做好工作。

相反,我们会寻找创造性的方法来解决问题。或者我们骑自行车去感觉我们正在做某事。

当您努力认识到您正在解决一个难题时,它会有所帮助。尝试找出您正在处理的复杂问题类型,因为很有可能这是一个经过充分研究的领域。比如很多表面上看起来“简单”的问题,其实很难。我经常使用的一个例子是旅行商问题。确实,计算机应该能够解决它,不是吗?

口味问题

每种语言都有其哲学。Perl 有“有不止一种方法可以做到”,这意味着它有意能够以不同的方式做完全相同的事情。

Python 几乎完全相反。

其中之一更好吗?你可能有意见。我不。我更喜欢 Python,但我不认为它“更好”。当我们停下来思考“更好”当我们将自己从讨论中抽离出来时,更容易看出我们经常争论非常相似的事情(回到不要用你的工具制造宗教)。

当然,客观地说,有些工具比其他工具要好。使用穿孔卡片编写程序是一场噩梦。我很感激我们在短短几十年里取得的所有进步,你可能也是。

还有一个因素需要考虑,那就是你的世界受到你使用的语言的限制。更严格的语言可能会以某些方式限制你做事。这并不总是一件好事。

Just rewrite it in $new_language!

每次有人说,“我用 $new_language 重写了 $known_app,所以它会变得更好”,我的眼睛快速转动以致时空在我周围弯曲。它赞同换马可以解决马鞍上的问题的谬论。

John Carmack 以编写一个快速而肮脏的程序而闻名,该程序以最直接的方式解决问题,然后完全重写该程序。我喜欢这种方法并且已经成功地使用了它好几次。

另一方面,我们经常说,“我只是重写它”,因为编写代码比阅读代码容易一个数量级。

不幸的是,我无法提出什么时候重写有意义的指导方针,当它没有意义时,这是你通过时间和经验学到的东西。我尝试回答一个问题:“程序复杂是因为问题复杂还是因为程序员不称职?” 回答这个问题的正确方法是假设问题比你想象的要复杂得多,除非另有证明,否则原作者的判断是正确的。

编程语言注意事项

内存管理

内存管理是编程中最棘手的事情之一。您使用的语言可能会因为没有明确的内存分配或对操作系统的分配原语的完全控制而使您无法理解这一点。

一句老话是垃圾收集编程语言更易于使用且不易出错。这是对内存管理的肤浅理解。

程序的大小和生命周期使内存管理变得困难。

小的、短命的程序没有内存管理问题。例如,您可以选择不释放任何内存,这适用于短期程序。

你的语言的记忆策略会告诉你你会面临什么样的问题。垃圾收集语言有停顿和循环依赖需要解决。引用计数策略可能具有性能开销和循环依赖性。手动内存管理增加了开发的复杂性。

如果您的程序很庞大,那么内存管理将是您必须克服的挑战。如果您学习了您所使用的语言中可用的内存管理逻辑并有效地使用它,那将会有所帮助。

复杂

Scheme 的语法可以放在两页中​​。官方的 C++ 17 标准有 1605 页长。这两种语言都很难掌握。

语言的复杂性不能减少到其语法或库的复杂性。

如果您在家做基本的烹饪,您可能有一把刀、一个平底锅、一个抹刀和一些其他必需的配件。有了它们,您已经可以烹制各种精美的菜肴。人们可以得出结论,“做饭,你只需要一把刀、一把抹刀和一个平底锅。”

有一天,你想烤一个蛋糕。然后,当然,您需要打蛋器、烤碗和许多其他配件。

随着您继续烹饪之旅,您会发现一些罕见但必要的任务需要特定的工具才能完成。

当然,你可以不用,但你试过用普通刀打开牡蛎吗?如果是的话,你不会想念每只手上有五个手指吗?

正确性和安全性

许多语言被设计为“比 C++ 更安全”。您听说过Dvorak 键盘布局吗?Dvorak 旨在比 Qwerty 更高效。从理论上讲,确实如此。在实践中,事实并非如此,学习新的布局是一种痛苦,因此它从未获得任何吸引力(也永远不会)。

如果您认为您的程序会“更安全”,因为您使用的是 X 语言而不是 Y 语言,那么您将学到令人痛苦的课程。

我很确定,例如,Rust 可以捕获一些默认 C++ 编译器无法检测到的错误,但与威胁建模、测试和审计将带来的收益相比,收益将微乎其微。

这并不意味着你不应该使用 Rust;它只是意味着您需要对编程的正确性和安全性有现实的期望。

例如,纯 C 可能是地雷。但是通过适当的工具、严格的开发技术和流程,您可以编写极其安全的 C 程序。它可能不,也可能很乏味,但它会带来结果。

正确性是一样的。困难的是将解决方案转录成程序。我们编写不正确的程序是因为解决方案不准确,而不仅仅是因为转录工作很困难。在编写程序时,我们通常无法完全理解问题或解决方案的行为。

这就是瀑布开发技术如此低效的原因:他们假设您可以提前指定一切,如果您遵循规范,一切都会好起来的。根据我的经验,这是错误的。

构建软件既费力又昂贵。我们有工具来帮助评估解决方案的正确性。有时,编程语言具有帮助我们发现不一致但不会出错的功能;程序的正确性非常昂贵。

您必须问自己的问题是,我的用户愿意为正确性花费多少?你永远没有无限的时间和金钱。

表现

您程序的大部分性能将来自选择正确的数据结构和正确的算法。现代 C++ 拥有您在该领域超额交付所需的所有工具,但许多其他语言也是如此。

C++ 与性能相关,因为您对发生的事情的控制程度。它为您提供超精密镊子,以构建高效和精确的发条装置,并确保您已挤压它的每一小部分。它配备了强大的工具和一个环境来做到这一点。它是所有其他语言比较自己的基准。

这并不意味着您必须使用 C++ 来实现非常高的性能;这意味着使用 C++,您可以确信自己可以做到。

然而,这就是它的痛处,您的程序的性能将受到其他因素的限制:您,即程序员。您对所有移动部分、编译器、内存管理、操作系统、硬件的理解……您能够吸收问题的所有参数并选择一个好的解决方案。

这比语言更重要。

复杂性和遗产

C++ 的名声不好,我认为主要来自两件事

  1. Problems in C++ 03 that have been solved since C + + 03
  2. The considerable amount of features that make it look more complicated than it is

快讯:你不应该同时使用所有的东西!

以Excel为例;它具有的功能数量非常庞大。这是一个完整的操作系统。例如,我经常使用 Excel 来计算我在加密市场上损失了多少钱。为了完成这项任务,我使用了它的 1%。这并不意味着剩下的 99% 没用,我不需要它们。我不介意。

抱怨某些东西“太大”总是让我感到困惑。无论你在一生中积累了多少知识,都将是沧海一粟。追求完整性不是一种空洞的追求吗?

使用 C++(或任何大型语言)时,错误在于学习有关它的所有内容。别。而且,在 C++ 中,您无需为不使用的东西付费,因此没有缺点。

另一个陷阱是混入不同的范式。在 C++ 中,这是一个普遍的错误,可能会使您的代码非常拜占庭。尝试坚持一种方言并尽可能坚持下去。如果您尝试在单个代码库中混合样式,就会出现痛苦。还记得捉鬼敢死队吗?不要越过溪流。

人们经常争辩说,如果没有 C 兼容性,C++ 会更好。但是引导C++需要C兼容性,无缝集成是非常方便的系统内编程。

许多人都认为通过从头开始设计语言,他们最终会得到更好的语言,这是一种谬论。

与任何软件项目一样,您在开始时不必理会现有用户,而且很容易打破常规。在 QuasarDB,我们没有两年前的速度,因为当我们想要引入重大更改时,向后兼容性是一个问题。

C++也是一样,任何从头开始的语言最终都会有同样的问题。这并不是说我们应该停止发明新语言,只是再次说明,一切都是为了设定期望。

你不应该坚持使用 C 而不是 C++ 吗?我个人认为你在 C++ 中比在 C 中更有效率,但这需要更多的知识和纪律,因为语言更大。您是否同意这种权衡,取决于您。

为什么我为 Quasardb 选择 C++

让我们来看看让我为QuasarDB选择 C++ 的智力过程。

Quasardb 是在 2009 年我抓痒的时候开始的。我的 Visual Studio 只是一个空的 C++ 项目。问题是,我们需要的不是关系型数据库,它可以在没有任何内在限制的情况下处理数据:没有商业计划,没有清晰的想法,只是一种直觉。

我选择 C++ 的第一个原因是熟悉。我对语言和环境了如指掌,可以将其向我需要的任何方向扭曲。我认为,熟悉应该是选择工具的首要原因。我在 C++ 方面的工作效率非常高,比任何其他语言都要多,而且 STL 逻辑非常适合解决数据库问题。

第二个原因是库的可用性。无论我需要什么,我都知道会有一个写得很好的 C 或 C++ 库。这也很重要,因为虽然我是从头开始的,但我并不打算从头开始写每一件小事。

第三个原因是性能。等待。我在这里不是自相矛盾吗?嗯,是和不是。该程序性能不佳,因为它是用 C++ 编写的;它将是高性能的,因为当您知道如何使用C++ 时,它可以提供最高级别的性能。

最后一个是长期的。我有一种预感,这可能会变成一个长期项目。C++ 用于编写操作系统和编译器。但当时,也就是 2009 年,C++ 被认为是过时的,很快就会过时。

C++ 11即将发布(它被称为 C++ 0x 因为每个人都年轻而疯狂)。Quasardb 的第一个版本是使用 GCC 的测试版,因为 YOLO 对 lambdas 的实验支持。

我所看到的让我非常相信 C++ 会卷土重来。我知道 C++ 基础设施至少会在未来 20 年存在。

我今天会做出同样的选择吗?

毫不犹豫。由于复杂的内存管理问题或漏掉的愚蠢错误,我对着屏幕尖叫了好几次。不过,我知道我们在使用其他语言时会遇到不同的,甚至可能更糟的问题。

C++ 17 和 20 的最新更新使选择变得更加容易,并且即将推出的功能(例如范围和概念)是我们非常期待 QuasarDB 的东西。

你应该使用还是学习 C++?

我的建议(不仅限于语言)是:忽略时尚的影响。对于静止的心,整个宇宙都臣服了。

计算机科学中有许多流星,投资一种语言是一项巨大的承诺。因为这不仅仅是学习语法,而是了解图书馆、生态系统和特质。那需要时间。

截至 2021 年 1 月,Tiobe 索引列出了五种最多的编程语言,如下所示:

  1. C
  2. JAVA
  3. Python
  4. C++
  5. C#

如果您不知道从哪里开始,学习这些语言中的任何一种都是一项不错的、安全的投资。如果您冒险进入前 20 名,您可能仍然是一个不错的选择。是的,该列表有一些限制,但它是一种语言受欢迎程度的良好指标。

在那之外呢?您说了算。虽然技能可以从语言转移到语言,但您可能会意识到首先学习主流的东西更有效率。

需要明确的是:你永远不会浪费时间学习一门语言或一种做事方式,但如果你冒险尝试最流行和最常用的语言,你可能会感到沮丧。

如果您来自 Java 世界,那么您可以像编写 Java 一样编写 C++。这种体验可能会令人沮丧(虚拟周围的一些奇怪的怪癖会以错误的方式打扰您),但它会起作用。但是,不,您还没有学过“C++”。您刚刚学会了将 Java 音译为 C++。

这就是为什么通过“学习一门语言”,我不是说,玩一段时间看看它的感觉(那,你会做很多事情)。尽管如此,我的意思是获得对语言哲学的非肤浅理解,并且能够解决问题而不必每隔几行查看一次堆栈溢出。

那么你应该学习C++吗?如果您对高性能编程感兴趣并且喜欢 STL 哲学,我想您会发现投入的时间非常值得。

如果您对我们在 C++ 20 中设法构建的怪物感到好奇,请查看Quasardb

一个软件开发工程师选择C++的自述相关推荐

  1. 你为什么选择成为一个程序员,你适合做一个软件开发工程师吗?

    选择一个职业也许有许多理由,那你为什么选择做了一个程序员呢? 作为一个标准的80后老猿,我来说一下自己的亲身体会,也给想入门的小白一个心理评估. 本人开发15余年,随没有太大的建树,但也有自己的些许经 ...

  2. 网络综合-软件开发工程师个人年终工作总结范文】

    网络综合-软件开发工程师个人年终工作总结范文] 作为一个软件开发工程师(我也是一名软件开发工程师),所实在的如果每年只做那么一两个项目,年终工作总结写起来也应该得心应手的,我们只需要把本年度该项目的基 ...

  3. 什么是核心竞争力——源自半导体行业,一个上位机软件开发工程师

    到底什么是核心竞争力 ----来自半导体行业,一个上位机软件开发工程师 我的工作侧重于软件二次开发,因行业问题,软件需要对电机,泵等硬件进行通信,按照一定的顺序对其进行控制,对Wafer进行加工,以达 ...

  4. 我是一个尽量少用国产软件的软件开发工程师

    [作者] 网名: 猪头三 站点: http://www.x86asm.com Email: 643439947@qq.com QQ: 643439947 编程生涯: 2001-至今[15年] 职业生涯 ...

  5. 某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休 息日是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对 应月份的休息日,用中括号进行标记.同时,统计出本月有几天

    By 张旭CaesarChang                合作: root121toor@gmail.com ~关注我  带你看更多精品知识 某公司软件开发工程师孙工,作息规律为上三天班,休息一 ...

  6. 某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休息日 是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对应月 份的休息日,用中括号进行标记.同时,统计出本月有几天

    某公司软件开发工程师孙工,作息规律为上三天班,休息一天,经常不确定休息日 是否周末,为此,请你开发一个程序,当孙工输入年及月,以日历方式显示对应月 份的休息日,用中括号进行标记.同时,统计出本月有几天 ...

  7. 毕业后想成为一名软件开发工程师,应该如何学习,大牛给出建议!

    毕业后想成为一名软件开发工程师,应该如何学习,我整理了一下,觉得可以如下几个过程,逐步深入.希望对大家有帮助. 1.基础 这是每个开发者的起点.开发者刚刚学会了某种语言, 比如C语言,学习了基本的数据 ...

  8. 软件开发工程师:程序员的职业规划就像软件工程

    软件开发工程师:程序员的职业规划就像软件工程 [url]http://www.accp-teem.com.cn/ArticleView/2007-8-1/Article_View_1224.Htm[/ ...

  9. 想做C++软件开发工程师,我该如何去学习?

    想做C++软件开发工程师,我该如何去学习? 因为C++是一个兼具性能和抽象模型结合体,除了能够保证性能之外,还能用当今最流行的面向对象编程模型,而且生态系统由于这些年的积累,建设的也非常完善,所以在高 ...

最新文章

  1. Case study:在数据库网页中设计数据排序工具
  2. 初学Python的学习笔记7----偏函数、模块、重点是面向对象
  3. 解决ubuntu里面的sudo: /etc/sudoers is mode 0640, should be 0440
  4. c语言:输入两个正整数m和n,求其最大公约数和最小公倍数
  5. Mathcad Prime 下载 安装 与 和谐教程
  6. 面向切面编程AOP的最佳入门示例
  7. 微信小程序实现slideUp、slideDown滑动效果及点击空白隐藏功能示例
  8. Page.ClientScript、ClientScript、ScriptManager、ClientScriptManager等的详细解说
  9. [html] html5哪些标签可以优化SEO?
  10. python执行语句转换成str_python3.x,_python3.4.3如何转换str字符串?,python3.x - phpStudy...
  11. mysql 时间计算函数_MySQL时间计算函数DATE_SUB()用法简介说明
  12. FFmpeg实现将图片转换为视频
  13. Android网卡(Wifi/Lan)带宽测试
  14. 用三款评测证明,数学思维在线学习APP正在用游戏化打开数学之门
  15. MinGW-w64没有bin文件解决方法
  16. 对 Unity 动画系统 Mecanim 的调研
  17. ZOJ-1003-Jugs
  18. bitmap内存溢出
  19. 永远相信美好的事情即将发生。
  20. 查看从机状态 mysql_mysql常用操作命令

热门文章

  1. D3.js 01绘制BarChart
  2. 连载03:软件体系设计新方向:数学抽象、设计模式、系统架构与方案设计(简化版)(袁晓河著)...
  3. 我普通下载速度为2M左右,但是为什么从我的百度网盘下载东西,速度却为60k左右?从技术上来说,怎么做到服务器端限速?
  4. Win10重置网络后wifi没了
  5. 00001、如何在Windows7(x64)上安装 Sharepoint2010 Fundation
  6. web3js方法获取账户信息和余额
  7. 2019年互联网行业从业前景如何?
  8. flutter windows搭建ios开发环境
  9. Word办公文档批量添加水印
  10. 回望与展望,保持饥渴,不断学习,你对自己有多狠,世界对你就有多宽容