`
zhangziyangup
  • 浏览: 1085877 次
文章分类
社区版块
存档分类
最新评论

C++之路 坚持

 
阅读更多
一个典型的 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. 返璞归真

分享到:
评论

相关推荐

    高速上手C++11/14/17

    那些还在坚持使用传统 C++(本书把 C++98 及其之前的 C++ 特性均称 之为传统 C++)而未接触过 C++11/14/17 的 C++ 程序员在见到诸如 Lambda 表达式这类全新特性 时,甚至会流露出『学的不是同一门语言』的惊叹之情。

    (C++11) the_c++_standard_library_2nd_edition.rar

    最新版C++技术经典系列,融浸C++11技术新标准。 不必等印刷品呈现,也不必担心等来的是那些跟自己差不多的中式翻译,英语是我们的工作用语,坚持突破第一本影印原著,便可收获风雨后的流畅英文阅读能力,顺带享用...

    effective+C++.doc

    对每个人来说,习惯C++需要一些时间,对于...在面对这么多的选择时,许多C程序员墨守成规,坚持他们的老习惯。一般来说,这也不是什么很大的罪过。但某些C的习惯有悖于C++的精神本质,他们都在下面的条款进行了阐述。

    C++ Primer 5th笔记200.pdf

    C++ 在我多年以来断断续续学了好几遍,之前用《C++ 编程思想》也学过,但那本书过于陈旧了,用《C++ Primer 4th》也学过一段时间,由于书本过于沉溺细节,导致最终没法坚持下来。第五版我去年已经看过一遍了,对于...

    深度探索c++对象模型(侯捷)part1

    他也是Bjarne Stroustrup领导的Bell实验室Foundation项目的成员之一,负责C++程序设计环境中的对象模型部分。Lippman还撰写了许多关于C++的论文。目前Lippman已受雇于微软公司,负责Visual C++项目。  译者侯捷:...

    Accelerated C++源代码

    Peter Gordon——我们的新编辑,他坚持更新和精简本书内容,极大地改进了这一版本;Kim Boedigheimer——他保证了我们所有人能按进度工作;还有Tyrrell Albaugh、Jim Markham、Elizabeth Ryan和John Fuller,他们和...

    以例子来说明c++17新特性的一本书

    可以看看例子,感觉C++17语法接近了python,希望能坚持看完

    Accelerated C++ PDF 中英文版

    Peter Gordon——我们的新编辑,他坚持更新和精简本书内容,极大地改进了这一版本;Kim Boedigheimer——他保证了我们所有人能按进度工作;还有Tyrrell Albaugh、Jim Markham、Elizabeth Ryan和John Fuller,他们和...

    C++语言程序设计

    开始是非常痛苦的,一定要坚持,不懂,赶快加大时间去搞懂,否则会越来越多,然后整个放弃,就完了,千万别指望补,它需要更多的精力,否则很难通过。 何洁月教授是为教学经验非常丰富的老师,在细致入微的80讲...

    cocos2dx-是男人就坚持20秒

    cocos2dx-是男人就坚持20秒 一个简单的demo

    c++编程思想

    c++经典书籍,坚持啃下来,收获还是很大,推荐大家下载阅读

    C++酒店管理系统源代码

    C++酒店管理系统C++酒店管理系统C++酒店管理系统C++酒店管理系统

    c++简单代码桶排序

    c++桶排序的代码,当初我学排序的时候也用了一些时间才想通,所以,如果一时想不通的话也别放弃,要一直坚持下去。

    空战c++源代码

    c++游戏源代码,欢迎大家下载交流。可以把游戏改造成《是男人就坚持20秒》。

    C++实现灰度图像的边缘检测、提取及轮廓跟踪

    C++实现灰度图像的边缘检测、提取及轮廓跟踪;包括Roberts算子、Sobel算子、Prewitt算子、Krisch算子;hough变换;轮廓提取;种子填充。(bmp灰度图片),vc6.0运行无误

    c++类接口。实现

    里面有c++代码,有类的接口与实现!这考研叫你怎么写接口,实现!

    Visual+C++数字图像处理pdf 谢凤英

    Visual+C++数字图像处理pdf 谢凤英,高清pdf

    Linux驱动,C,C++

    手有余香,本着助人为乐的思想,花了一周时间把收集的资料整理好奉献给大家,希望大家选择性的学习,循循渐进,里面所有链接均可下载,不需要积分,全部高清图书,国内外经典,包括Linux操作系统,C语言,C++语言,...

    cppunit C++单元测试框架 源码+Demo+使用手册

    测试驱动开发(TDD)是以测试作为开发过程的中心,它坚持,在编写实际代码之前,先写好基于产品代码的测试代码。开发过程的目标就是首先使测试能够通过,然后再优化设计结构。测试驱动开发式是极限编程的重要组成部分...

    effective c++ 3rd 英文版

    高效c++ c++进阶必看数目 这个是英文的,坚持看英文,对学习是很有帮助的

Global site tag (gtag.js) - Google Analytics