C++ 大神John Carmack的编程传说!还在抱怨C++难学吗?看大佬操作!

centos7安装Ambari 2.7.5 + HDP3.1.5 准备 1.安装包准备: Ambari2.7.5、HDP31.5、libtirpc-devel: centos7操作系统: 链接:https://pan.baidu.com/s/1vzvio5rAMsbYF0-0vBs5dw 提取码:xij9 阅读详情

  你是否也曾发现那些顶级球星常常能够轻松做出各种高难度动作,而其他球员却无法做到。你是否也在疑惑这其中的原因,为什么顶级球星看起来毫不费力?

  作为一名C++程序员,John Carmack 的源代码就像顶级球星的球技一样震撼着我。其代码简单而强大,我很想知道自己如何才能像他一样优秀。

  让我们来探索 Doom3(游戏:毁灭战士) 的源代码,深入其中,寻找这些代码简单但强大的原因。

  2011年11月23日,id Software(游戏软件公司)延续自己的传统,发布了他们之前引擎的源代码。这些源代码被众多开发者审阅,下面是其中一个针对 Doom3 的反馈信息:

       Doom 3 BFG由 C ++编写,C++是一门既强大又复杂的编程语言,它可以编写出无比优秀的代码,但同时也可能让你欲哭无泪。幸运的是,id Software的 C++子集(拥有类的 C 语言)可以让你轻松运用 C++ :

没有异常

没有引用(使用指针)

尽可能少使用模板

常量无处不在

拥有类

多态性

继承

  它仅仅是 c++ 98 标准的一个子集。以下是 Doom3 的一些特性:

1、提供一个强大的基类

  众多的类都从 idClass 继承而来:

  idClass 提供了下列服务:

  (1)实例创建

  (2)类型信息管理

  (3)事件管理

2、字符串操作非常简单

  通常来说,字符串是一个项目中最常用的数据类型,许多功能都需要字符串来完成,我们需要使用函数来处理它们。

  Doom3 定义了一个 idstr 类,它几乎包含了所有与字符串操作相关的方法,非常实用。这样一来,你就不必像其他框架那样需要根据不同的字符串类来定义自己的方法。

3、源代码与GUI框架(MFC)高度解耦

  在很多使用 MFC 的项目中,代码与它们的类型高度耦合,并且你可以找到任何代码在 MFC 中的类型。

  在 Doom3 中,代码与 MFC 高度解耦,仅有 GUI 类与之直接相关。如下面的 CQLinq 查询所示:

  这个特性大大提升了开发效率。的确,只有 GUI 开发人员必须关心 MFC 框架,而对于其他开发人员来说,则并不需要在 MFC 上浪费时间。

4、提供了一个非常强大的utility程序库(idlib)

  几乎在所有项目中,utility 程序类都是最常用的,如下查询结果所示:

  从以上查询结果可以发现 utility 是用得最多的。如果 C++ 开发人员没有一个强大的 utility 程序框架支撑,那么他们将不得不花费大量的时间自己编写。

  idlib 几乎提供了很多实用的类和方法,可用来处理字符串、容器和内存。这有利于提升开发人员的工作效率,让他们更加专注到游戏逻辑上。

5、容易理解

  作为 C++ 开发人员应该都知道开发解析器和编译器并非易事,而 Doom3 成功实现了一个硬编码的编译器。并且 Doom3 的实现代码非常简洁也很容易理解。

  下图展示了编译器使用的类之间的依赖关系:

  以下是编译器源码的代码片段:

  过去我也曾研究过很多解析器和编译器的源代码。但是,这是我第一次发现一个编译器的源代码如此易懂,除了编译器之外,整个 Doom3 的源代码也一样容易理解。这真的很神奇。当我深入研究 Doom3 的源代码时,发现这些代码真的写得太好了。

  Doom3 的源代码只使用了 C++ 标准的一个子集,它非常简洁并且易于理解和维护。它遵循代码设计、命名和格式化的基本规范,并没有使用高级技术。

  John Carmack 的编程秘诀是完全遵循维基百科定义的 KISS 原则:

KISS 是由美国海军在1960年提出的一项设计原则,KISS 是 “ Keep it simple, stupid ” 的缩写。KISS 原则指出,相比于复杂的系统,越简单的系统往往运行效果越好。因此简单性应当是设计过程中需要关注的关键指标,同时应当尽量避免不必要的复杂性。

  KISS 原则的核心思想是:相比于复杂的系统,越简单的系统往往运行效果越好。

采用新C++标准时的注意事项

  新标准引入了许多有趣的新功能。但是不要认为使用这些功能就可以让你的代码变得高效。实际上,许多新功能对开发通用库更为有用,特别是与通用编程相关的功能。

  不要强迫自己使用所有的新功能,在绝真正需要或者有助于提高代码效率时使用即可。例如,这篇文章就讨论了过度使用 auto 关键字的缺点。

       学习C/C++编程可以湫湫扫下方二维码,学习编程,码上开始!

 

华为防火墙介绍和原理,配置详细解析 在出向外网的流量中,我们使用默认路由来指定默认的出口,并且使用nat地址转换,而在外网中,我们使用ISIS协议来进行路由的学习和更新,让外网可以访问到dmz非军事化区域的server1服务器。并进行NAT转换,实现了内部IP地址和外部IP地址之间的映射,以便内部网络可以与外部网络进行通信。网络地址转换(NAT):防火墙可实现网络地址转换,将内部私有IP地址转换成公共IP地址,以隐藏网络拓扑结构,增加网络安全性。确定安全需求:根据企业的安全需求和策略,确定防火墙的配置目标和规则。 阅读详情

相关推荐

containerd镜像加速配置全解析:从host.toml到config.toml的演进与实践

本文全面解析了containerd镜像加速的配置方法,重点对比了传统的config.toml集中式配置与现代的host.toml模块化配置的演进与优劣。文章通过实战演示,详细指导如何为docker.io、registry.k8s.io等常见仓库配置host.toml加速,并提供了生产环境下的最佳实践、故障排查与性能优化建议,帮助用户显著提升镜像拉取效率与系统稳定性。

jenkins8butler的博客 698

C++ 20 来了,2020全球C++及系统软件技术大会大咖盘点

##C++ 20 来了,系统级软件开发的春天来了! 2020年是全球IT科技版图震荡和转折之年,系统级软件作为数字世界的核心基础设施,被视为“卡脖子”技术的关键,成为IT产学研“兵家必争之地”。C++语言一直被誉为系统级编程“皇冠上的明珠”。随着9月份C++20 国际标准草案获得一致通过,ISO C++20新标准在翘首期待中终于尘埃落定。C++之父Bjarne Stroustrup表示:C++ 20是自C++11以来最大的发行版,它将是C++发展的里程碑。业界相信C++ 20必将为系统级软件的开发、构建、设

seeitall的博客 931

避开奸商套路!手把手教你用Thaiphoon Burner和CPU-Z,一眼看穿内存SPD信息有没有被篡改

本文教你使用Thaiphoon Burner和CPU-Z工具,快速识别内存SPD信息是否被篡改,避免购买到虚标频率或假冒颗粒的内存条。通过详细步骤和实战案例,帮助用户掌握内存检测技巧,确保硬件购买的透明度和安全性。

weixin_32228501的博客 679

【想要成为C++大佬,必须要掌握的知识点】

本文系统介绍了成为C++专家的学习路径,从基础语法、面向对象编程到内存管理、STL和高级特性(模板、多线程等)。重点强调实践与理论结合,推荐经典教材和工具,并建议参与开源项目。文章指出持续学习和实战是掌握C++的关键,适合不同阶段的学习者参考。

深耕CV 1305

Ubuntu 20.04 系统备份和还原

最近大家Ubuntu开发环境,经常出现搭着搭着系统就挂了,于是开始琢磨了Ubuntu系统的备份和还原,以备不时之需,Linux环境搭建实在是有点太细,好多情况下,就算曾经搭建过一遍,再次搭建有些包还是忘了安装,做好备份是十分必要的。 经过了一番研究,Ubuntu备份有很多方式:根目录tar、dd、Systemback(1.0版本已经不维护了,2.0版本收费)等等,最终决定使用 —— Timesift, 因为方便一些。 文章参考:小马虎的救星——Timeshift Timeshift Timeshift,是L

Z_Paper的博客 2万+

VCS NLP 低功耗验证系列(六):功耗分析与优化——SAIF 报告与验证效率提升

本文是VCS NLP低功耗验证系列的第六篇,主要解决功耗数据采集和验证效率优化问题。文章首先介绍了SAIF(Switching Activity Interchange Format)文件在功耗分析中的作用,详细讲解了VCS的Region-Based SAIF功能,包括三个关键系统任务($saif_region_create、$saif_region_exclude、$saif_region_monitor)的使用方法和工程实践建议。接着从编译侧、运行侧和方法学侧三个维度提出了NLP验证效率优化策略,特别强

元直的博客 470

一个十二年的老C++程序员的自述

为什么写这篇博文,大家可以看到我写博客其实是从去年八月份开始的,我这人做事喜欢技术,对技术之外的事情不感兴趣。以前也没注意,直到自己已经38岁了,有人说程序员也要做好自己的品牌,我觉得貌似有道理,毕竟年龄大了,面临着失业和择业问题,有一个技术积累肯定是一件好事。所以才开始了自己的博客生涯。 一,十五年C++ ,现在有一种相望于江湖的感觉。 十年C++ 有人觉得我应该如火纯情,功力深厚。其实不是...

laziji的专栏 765

第七天 Labview进阶(7.4 NI Vision简单使用)

NIVision机器视觉软件使用指南 摘要:NIVision是National Instruments推出的高效机器视觉软件,具有硬件无缝集成、图形化编程和工业级部署等优势。本文介绍了NIVision的安装步骤(需Vision Acquisition和Vision Development模块)及三个典型应用案例:1)实物检测通过IMAQCreate等模块实现物体识别与坐标定位;2)OCR检测利用IMAQOCR系列模块完成字符识别;3)几何模板匹配使用IMAQLearnGeometricPattern等模块实

weixin_38637405的博客 771

那些C++牛人的博客

现整理收集C++世界里那些“牛人”的个人博客。凡三类:一是令人高山仰止的大牛,对C++语言本身产生过深远的影响的人;二是C++运用炉火纯青的高手,有原创性的技术干货;三是中文世界里的C++牛人。

fishmai的专栏 1287

Codex 的 AGENTS.md 到底怎么写?前端、后端两套实战模板,照抄就能用

文件名是大写AGENTS.md,放在项目根目录构建、测试、类型检查命令都是可直接复制执行的只写了 Agent 从代码里推断不出来的约定红线规则用了明确的否定句式(禁止/不要/Never)标注了自动生成目录和禁止修改的模块写清了交付要求(改动清单 + 验证命令 + 风险说明)没有任何密钥、密码、连接串整体一页能看完,核心要点 10 条以内每一条都能通过"删掉会不会更容易犯错"的测试一份短小精准的 AGENTS.md,比一份充斥模糊规则的长文件有用得多。

篮球界最会写bug的人;程序猿中打球最菜的人。 609

【100%通过率】华为OD机试真题 Java&Go 实现【水库蓄水问题】【2022.11 Q4 新题】

给定一个长度为 n 的整数数组height。数组的元素表示山的高度,选择两个元素作为水库的边界,求蓄水量的最大值并输出蓄水量最大时的边界下标(蓄水量相同时输出下标较近的)。

MISAYAONE的博客 1万+

高难度的c++源码

/在这段中的l是L的小写。只要熬过这篇,肯定能给初学者带来莫大的提升,给学c++的学者巩固知识。关注我的微信公众号好不好嘛?这是一篇文章,熬了很久才做出来的。您的关注是我们前进的动力。调试之后的运行结果为。

hashiqimiya的博客 1286

YOLO26-Quantized:面向国产AI芯片的全栈量化方案,适配昇腾310P与寒武纪MLU270

在算力国产化替代的行业趋势下,昇腾310P、寒武纪MLU270已成为工业边缘视觉、智能检测场景的主流国产AI芯片选型。针对原生YOLO26模型在国产芯片上推理效率低、算子兼容性差、量化精度塌陷三大核心痛点,本文提出YOLO26-Quantized全栈量化方案,覆盖训练感知量化(QAT)、离线静态量化(PTQ)、模型编译优化、芯片专属部署全流程。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 762

C++ 大神 John Carmack:我要去搞通用 AI 了,勿念!

今天,VR 大神、Oculus CTO John Carmack 在 Facebook 上发布了一条动态,他表示,接下来他将要挑战自己,投入通用 AI 的研究中。 原文大意如下: 从本周开始,我将转到 Oculus 的「咨询 CTO」职位。 我在开发工作中仍有发言权,但这只会占用我一小部分时间。 至于剩下的时间我将要做什么:当我回顾我在游戏、航空航天和虚拟现实(VR)领域所做的一切时...

喜欢打酱油的老鸟 698

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C++ 大神 John Carmack 的编程传说

点击上方“优快云”,选择“置顶公众号”关键时刻,第一时间送达!你是否也曾发现那些顶级球星常常能够轻松做出各种高难度动作,而其他球员却无法做到。你是否也在疑惑这其中的原因,为什么顶级球星看起来毫不费力?作为一名C++程序员,John Carmack 的源代码就像顶级球星的球技一样震撼着我。其代码简单而强大,我很想知道自己如何才能像他一样优秀。让我们来探索 Doom3(游戏:毁灭战士) 的源代码,深

优快云资讯 6805

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

传奇程序员John Carmack 访谈实录 (zz.is2120)

约翰卡马克介绍 //z 2012-10-06 09:57:04 IS2120@BG57IV3.T2508037555.K[T58,L515,R22,V686]   id Software的大名鼎鼎的约翰•卡马克(John Carmack)众望所归地入选了2001年度IASA“游戏名人堂”。   如果把诺兰•布什纳尔比作“电子游戏业之父”,那约翰•卡马克就是“第一人...

1648

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

用C++进行函数式编程

用C++进行函数式编程 作者: baiyuzhong分类:云计算, 高端视点  阅读:3,988 次添加评论 文 / John Carmack 译 / 王江平 《Quake》作者Carmack认为追求函数式的程序设计有着实实在在的价值,然而,劝说所有程序员抛弃他们的C++编译器,转而启用Lisp、Haskell,或者干脆说任何其他边缘语言,都是不负责任的。

Cloud-Datacenter-Renewable Energy-Big Data-Model 1506

Python 老程序员的建议:专心学好一门编程语言就行!

最近,著名游戏程序员、id Software 创始人之一John Carmack在采访中表示,程序员应该专心学好一门编程语言。这倒让我感到有点惊讶。虽然我个人非常赞同这条建议,但在如今的程序员圈子里,这种观点是有争议的。我猜,我就是大家所说的“老程序员”了。我的岁数不小了,一生都在从事编程工作,而且从步入社会之后就一直在从事这项专业工作。有时,我觉得自己是一名编程语言爱好者,亲眼目睹了许多编程语言的发展。回顾过去,这是一段激动人心的历史,我们会不由自主地得出一个(错误的)结论:多掌握几种编程语言总没坏处。编

m0_73720982的博客 174

转:代码之美——Doom3源代码赏析

背景介绍:Doom3是id Software于2004年开发的第一人称射击游戏,目前以GPL v3协议开源。其采用游戏引擎的是id Tech 4,由id Software创始人、首席程序员John Carmack领导开发。再做个简单的对比:作者刚刚完成的Dyad有193k行纯C++代码,Doom3是601k(2004),Quake3是229k(1999),Quake2是136k(1997)。以下是

costfine的专栏 1124

C++函数式编程(六)行动指导

原文:http://www.altdevblogaday.com/2012/04/26/functional-programming-in-c/ 作者:John Carmack -潘宏 译 -2013年1月 -email: popyy@netease.com -weibo.com/panhong101 研究研究你代码库中的一些别太简单的函数,

Popy007(Twinsen)的专栏 5981

C++开源游戏推荐,雷神之锤1/2/3

John Carmack是游戏程序员。 https://github.com/id-Software/Quake https://github.com/id-Software/Quake-2 https://github.com/id-Software/Quake-III-Arena John Carmack在1995年放出了德军总部3D的源代码,之后的1997年又放出了毁灭战士的代码。1996年时候,他放出了雷神之锤的源代码,Quake社区中的一名不太出名的程序员将其改写成了Linux版本,并且将

$firecat利白的代码足迹$ 2171

卡马克:用C++进行函数式编程

卡马克:用C++进行函数式编程 很喜欢John Carmack,ID software创始人,这篇文章是John Carmack对函数式编程的一些看法。 导读:《Quake》作者 John Carmack (卡马克) 认为追求函数式编程的程序设计有着实实在在的价值,然而,劝说所有程序员抛弃他们的C++编译器,转而启用Lisp、Haskell,或者干脆说任何其他边缘语言,都是不负责任的。或许本文的

u010099495的专栏 1369

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

C++!宇宙中最可怕的语言。自人类诞生以来,它可以对软件工程中的一切错误负责。如果你学习它,那么世界上没有足够的东西来保护您免受 C++ 的侵害! 抱怨一种编程语言可能会让你疯狂点击键盘,但它并不能真正改变什么,不是吗? 如果您想就 C++ 和一般编程进行更独立的对话,请继续阅读。如果已经很晚了,而您只是难以入睡,那么,也请继续阅读。 我是如何成为程序员的 在我进入我的观点之前,我认为分享我是如何到达那里的会很有用。此外,这是我的博客文章,所以很不幸,我想写什么就写什么。 我第一次接触家用电脑是在 198.

low5252的博客 1509

微软和开放——一段不得不说的往事(二)(转载)

2. Direct3D vs. OpenGL在Andre LaMothe游戏编程的经典著作《Windows游戏编程大师技巧》中介绍DirectX的时候,作者以其特有的LaMothian式幽默感叹道: “我开始感觉自己变成微软的传教士了,总在试图把我所有的朋友们都推向这个黑势力。但是有什么办法呢?微软这帮坏家伙总是能研究出更好的技术。” 这一说法集中体现了游戏程序员的矛盾心态。当

孟岩 1万+

心目中的编程高手zz

文献:http://www.verydemo.com/demo_c170_i14420.html (1)MIT BBS上说微软电话面试的一道题就是“Who do you think is the best coder, and why?”。我觉得挺有意思的,也来凑个热闹。排名不分先后。 Bill Joy, 前任Sun的首席科学家,当年在Berkeley时主持开发了最早版本的BSD。他

walkintherose1836的专栏 528
上一篇: 什么才算是“真正的”编程能力?不提升这些能力,你何时能拿高薪!
下一篇: 什么样的人适合自学编程?你以为你自学难是为什么?来看看答案吧!
CodingPs
博客等级 码龄7年 182粉丝 253原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值