典型的 C++ 程序员成长经历

From:http://blog.csdn.net/breakerzy/article/details/7399872

一个典型的 C++ 程序员成长经历:

1.  完整的学一遍 C++ 所有语言特性,典型书籍 "The C++ Programming Language" Part1, Part2, "C++ Primer"

    感觉 C++ 像大杂烩(多编程范型),各种精妙的语法特性 (friend, virtual/RTTI, const/mutable, exception, template),太多精妙的东西容易导致记忆琐碎化,学了又忘了,尤其是那些很少用的部分

    实践:编写一些带 class 和 virtual 字眼的所谓的 C++ 程序

2.  树立 C++ 的规则,明确在 C++ 世界“合法的并不一定是合理的”,典型书籍 Effective C++ 系列

    有些东西可用 C++ 写,但一般情况下并不合理,如 protected 成员数据, 覆盖 non-virtual 成员

    实践:发现 C++ 有强烈的语义约束,和次语言 (sub-language) 范畴,开始写一些规矩的代码

3.1 为了使上述的约束更加形式化,开始使用设计模式,典型书籍 "The C++ Programming Language" Part4, "Design Patterns"

    实践:教条的套模式,与人协作,编写真实规模的程序

    开始想:有时传统的设计模式对 C++ 很难看 (OO),有没有一种原生化的 C++ 模式实现思路(以便利用 C++ 的高效性),开始对静态类型系统和模板推导着迷 (GP)

3.2 为了开发快捷,开始使用标准库,典型书籍 "The C++ Programming Language" Part3, "The C++ Standard Library", "Effective STL"

    光用标准库是不能满足真正的 C++ 程序员的好奇心:auto_ptr, iostream 这些精妙的东西是怎样实现的?string 的开销究竟有多大?functional/alogrithm, iterator, container 这三者是怎样分离的?

    于是开始阅读某个标准库实现(典型的是 HP-SGI 的实现,但建议 Windows coder 读 MSVC 的),并尝试自己的等价实现,虽然可能只是标准库的一部分功能。这里一个很大的驱动力是重视 C++ 的高效性

    至此,已经知道如何在 raw/smart pointer, char*/string, static/dynamic bind, array/STL container 之间抉择

    实践:编写可稳定工作的程序,重视模块的复用性和扩展性,并理解将书本模式(学院派)实化为优质的 C++ 代码之间的鸿沟

4.  插曲:3.1 和 3.2 过程会交替重叠进行,并导致重学 template C++ 这个次语言,典型书籍 "C++ Templates: The Complete Guide"

5.1 玩转 template C++ 和 GP,发现它是超强的代码生成器,和模式塑型器,典型书籍 "Modern C++ Design"

    开始进入一种偏执狂式的 GP 和模式应用状态:
    1. 把所有的实体都对象化, wrapper hell
    2. 把所有的概念都抽象化, abstract class/factory
    3. 把所有的行为都策略化, 动态的: strategy, 静态的: traits, policy
    4. 把所有的实现都向标准库靠拢, Think in STL: every IO is iostream, every algorithm uses iterator, every container is type-safed and nonintrusive with specialization for optimization

    成也萧何败萧何:炫技和实用只在一念之间

    至此,几乎每个 C++ 程序员手上都有自己的一个 semi-STL 的私人库,那是多年的积累

    实践:编写工业强度的 C++ 程序,你的一部分代码(库)可能以开源或闭源的形式供他人使用

5.2 开始使用一个 Think in STL 的叫做 Boost 的东西,于是你对 Boost 做了和上面 STL 同样的事,典型书籍 "Beyond the C++ Standard Library", "Boost Docs", "Boost 程序库完全开发指南"

    也许还对 C++11 感兴趣,现在可用即 TR1,典型书籍 "The C++ Standard Library Extensions"

    实践:以较高的效率编写工业强度的 C++ 程序

5.1 和 5.2 过程会交替重叠进行

6.  过度的玩 template C++ 将会导致元编程,典型书籍 "C++ Template Metaprogramming"

    尽管它很炫耀,但生产环境中却很少用

    补充:既然认为 TMP 是 turing-complete 的,并且秉持 handy coding 和 compiling is running 的理念,实际上你是需要一个动态语言(把 C++ 编译器当解释器用,而且还不能调试)。再将范围缩小:从目前 C++ 社区工作来看结合最成熟的 interop 语言是 Python

    实践:地球很危险,回火星去吧


7.  一个高质量的 C++ 程序所在的商业项目失败了,导致你 陷入沉思

    考察失败的可能原因:
    1. 商业决策,和 C++ 无关
    2. 其实是部分高质量 C++ 程序,高质量的模块由优秀程序员编写,其它人的很烂
       办法 1. 你很喜欢现在的团队:循循善诱那些新手,让他们经历你的至少 2-3 阶段,短时间领悟是不可能的,你很清楚
       办法 2. 离开去找和你水平相当的人,记住:C++ 是真正懂它之人的利器,而是一知半解者的绞绳,还不如完全不会用 C++
    3. 过度的个人炫技,导致代码复杂度过高
       不易理解、难维护、开发时间长
    4. 需要一个度
       1. 实现复用性和扩展性的难度不宜超过团队的平均水平
       2. 团队的平均水平不宜低于同类产品开发的市场竞争者的平均水平
    5. 需要一个目标和态度
       1. 以制作可交付使用,可工作的产品为终极目的
       2. 做最好产品,而不一定用最好的技术

8.  返璞归真

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

类头注释生成

1. 打开VS2013的安装目录 2. 找到Common7文件夹,接着打开 Common7\IDE\ItemTemplatesCache 3. 在这里我们会看到VisualBasic文件夹,依次打开 VisualBasic\Code\2052\Class ,找到Class.vb文件并且以记事本方式打开,在其中加入以下的…

在java中添加源_关于Java:如何在Android Studio中添加链接的源文件夹?

在Eclipse中,我可以将源文件夹作为"链接的源文件夹"添加到我的android项目中。 如何在Android Studio中实现同一目的?或者是否可以添加外部文件夹以构建gradle?在您的build.gradle中将以下内容添加到android节点的末尾android {...…

ant design datepicker处理日期范围操作

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣学习前端知识 1需求 此刻日期之前的不能选择 当天日期结束时间比开始时间打 基本样式 <Row gutter{12}><Col span{12}><Form.Item label"活动开始时间">{getFieldDecorator(startTi…

proe2001安装指南

1.系统环境设置:安装PROE2001的硬盘必须是NTFS格式,所以操作平台最好是WINDOWS2000,WIN-XP,或NT4.0,必须附带一张网卡,普通的以太网卡也行(当然,PROE2001已推出可以在WIN98的FAT格式下安装的版本,但由于其不稳定性,且运行速度极慢,笔者建议最好不要安装此版本).我以WIN-XP为例.…

第二十三天 how can I 坚持

今天一90后小伙管我叫大神。。。小菜鸟一枚&#xff0c;哎。遗憾啊。不能很好的利用碎片时间&#xff0c;时间都去哪儿了。今天同学给我共享了他买的智能插座还有小米空气净化器&#xff0c;小米啊&#xff0c;节奏好快。感觉中国现在能和小米竞争的就只有360了&#xff0c;乐视…

深入react技术栈(11):样式处理

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣 基本样式设置 样式中的像素值 使用className库 Css Modules css模块化遇到了哪些问题 css模块化方案 样式默认局部 使用compose组装样式 class命名技巧 实现css与js共享 外部如何覆盖局部样式 设置样式共存we…

python .center用法_Python Pandas Series.str.center()用法及代码示例

Series.str可用于以字符串形式访问系列的值并对其应用几种方法。 Pandas Series.str.center()函数用于在系列/索引中的字符串的左侧和右侧填充其他字符。该功能等效于Python的str.center()。用法&#xff1a; Series.str.center(width, fillchar’ ‘)参数&#xff1a;width:产…

点到点链路上的OSPF协议

点到点链路上的OSPF协议 OSPF的几个术语&#xff1a; 链路&#xff1a;路由器用来连接网络的接口&#xff1b; 链路状态&#xff1a;描述路由器的接口及其与邻居路由器的关系。所有链路状态信息构成链路状态数据库&#xff1b; 区域&#xff1a;有相同区域标识的一组路由器和网…

BASH中字符串的处理

BASH中字符串的处理 得到长度: 源码: %x"abcd" #方法一 %expr length $x 4 # 方法二 %echo ${#x} 4 # 方法三 %expr "$x" : ".*" 4 # expr 的帮助 # STRING : REGEXP anchored pattern match of REGEXP inSTRING 查找子串: 源码: …

用css实现三角效果

CSS border原理 一个div或者元素的border并不是我们直观意义上的一条有高度的线&#xff0c;而是一个等高梯形或者三角形&#xff08;宽高为0时&#xff09;&#xff0c;可以看一下效果&#xff1a; HTML: <div class"arrow1"></div> CSS: .arrow1{ font…

java响应很慢排插_服务响应时间慢:Java SecureRandom和/ dev / random - java

我正在尝试调试Tomcat上部署的应用程序提供的一些慢速响应。现在&#xff0c;我主要关注SecureRandom和/dev/random(其他一些可能的原因已被调查并排除)。模式如下:第一个调用恰好在Tomcat重新启动后(即使请求在启动后4分钟到达)也仅需30.0 xy秒稍后&#xff0c;某些调用恰好需…

广播多路访问链路上的OSPF

通过本实验可以了解&#xff1a; 1、 路由器OSPF的启动过程&#xff1b; 2、 启用路由接口&#xff0c;并通告网络所在路由&#xff1b; 3、 DR选举的控制&#xff1b; 4、 广播多路访问链路的特征&#xff1b; 实验拓扑图&#xff1a; 实验步骤&#xff1a; 配置各个路由器fa0…

最实用DOS命令参数的中文详解

From: http://hi.baidu.com/moodmusic/blog/item/888856ed309605d7b21cb141.html 一、DIR 命令的格式&#xff1a; dir [D:][PATH][NAME][[/A][:attrib]][/o:[sorted][/s][/l][/c[h] (1)dir /a:attrib 缺省包含所有文件(系统文件.隐含文件) attrib[:][h/-h]只显示隐含文件…

React开发(174):ant design按钮确认删除

<Popconfirmtitle"确认删除?"onConfirm{() > {this.handleDelete(row.code);}}><a style{{ marginLeft: 16 }}>删除</a></Popconfirm>

Android:生命周期案例

在学习Android应用生命周期章节中&#xff0c;书本上写的有点笼统&#xff0c;较难理解。为了理解的更深&#xff0c;写了个程序测试一下。 1、在layout文件夹中建一个dialog_layout.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout x…

vim cscope taglist 使用

From: http://blog.csdn.net/skywalkzf/article/details/5009329 一 . 安装 apt-get install exuberant-ctags cscope global cppcomplete 和 taglist 要到www.vim.org的扩展列表中下载 taglist 的下载地址: http://www.vim.org/scripts/script.php?script_id273 cppcom…

java面试没有全部答对_十道java基础面试题,你能保证全答对吗?

java初级开发面试中经常被问到的问题有好多&#xff0c;下面总结一下常见的问题&#xff0c;先给问题&#xff0c;大家思考一下再看答案。1.JDK 和 JRE 有什么区别&#xff1f;2. 和 equals 有什么区别&#xff1f;3.说说final在java中的作用。4.String类的常用方法有哪些&…

VMworld 2010旧金山胜利闭幕

一年一度的VMware的用户大会VMworld 2010上周在旧金山胜利闭幕&#xff0c;今年的VMworld&#xff0c;创造了有一个神奇&#xff0c;超记录的参加人数&#xff08;达到了17000人&#xff09;&#xff0c;超记录的实验数量&#xff08;超过15000个实验&#xff09;&#xff0c;超…

暂时停止更新博客

由于本人最近身体有恙&#xff0c;做了个小手术&#xff0c;暂时卧床休息&#xff0c;不能继续更新博客&#xff0c;还请他人谅解&#xff01;转载于:https://www.cnblogs.com/accordion/p/4458562.html