test

posted @ 2012-02-02 14:19 pasu 阅读(8) 评论(0) 编辑

“能当海盗,为什么还要当海军?”

      我相信乔布斯说这句话的时候肯定没有看过《海贼王》,因为当时这部漫画还没有问世,但起码,在乔布斯眼中的开发团队,具有一种海盗气质,相比微软公司大规模团队的开发模式,更倾向于精英般的小团队。2011,本应该是平凡波澜不惊的一年年份,却因为乔布斯的英年早逝而变的不再平凡,一个伟大的公司可能会有很多伟大的产品,但其伟大的灵魂却独一无二,乔布斯改变的世界,让很多人享受到了科技带来的价值。相信,这如同神一般的传奇经历,必将载入史册,仍将激励众人不断创新,推动文明的不断进步。想起了《三个傻瓜》里面的台词:吾王真伟大,请接受我卑微的献礼。在乔布斯逝世之际,谨此表达我的哀伤。

      2011对于我来说,或许也是人生的一个转折,我不得不承认,也许几天之后,我就将来到一个全新的城市,开始我人生新的旅程。对于一门用了将近十年的语言,C++,自然有着深厚而复杂的感情,怀念之前文章中主人公小C的点点滴滴,多少也都有一些自己的影子,就要离开组件团队了,作为主要开发语言的C++,个人也结合自己的经验,也算对自己C++知识体系的一次再总结吧。

RoadMap

一个由A+级人才组成的小团队,完全可以与B级和C级人才组成的超大型团队抗衡。”

      回顾个人的C++经历,个人感觉主要有如下几个阶段:

  1. 面向对象思想&语法
    需要相当长的时间来积累和沉淀,作为目前程序开发主流的思想,培养一个合格的面向对象的思考方式,如果合理的划分、封装数据结构,形成一个个人的面向对象的思维,需要长时间的开发和经验;而C++语法也博大精深,小到指针引用、数据冗余高低端、临时变量,大到数据公私有、继承、多态;细节上的智能指针、内存池、垃圾回收,整体上的设计模式、动态库模块化。开源库的取舍;再加上实际中要了解的字节编码、图形引擎、多线程等实践知识。作为一个合格的C++开发人员,诸多的知识需要理解,还有诸多知识是你不知道需要了解的,这就要看自身的努力和造化了。
    C++语言设计的这种大而全的主旨也导致了一个严重的弊端:C++难学难精通难应用。这种过于追求理论完整的语言,并不能很好的胜任各种细化领域的要求。因此,在很多细化领域,Java、Python这类特色语言能够更好的吻合使用者的需求。
    当然,很多C++的问题并不是C++自身的问题,更多的是C++使用者自身能力所限,使用不当导致的。而C++在面向对象、跨平台、高性能、面向对象这几点要求上具有无可比拟的优势,几乎是满足这些条件的唯一语言。因此学好C++,深入理解C++,即使作为一门教学语言,C++在实践和思想上都有很多价值。而在应用中,则需要在不同语言的使用上做合理的取舍和通信。
  2. 设计模式
    当程序开发积累到一定程度,语法和面向对象的设计思路基本了然于胸,无论你是否是C++的开发者,也无论你是否学习的足够深入或精通,大部分的细节问题和语法都不再成为障碍,这时都会上升到一定的高度来思考问题,整理出一些统一的规则,好让我们以后能以一个合理的方式来思考问题,避免问题,更严谨的手段来解决问题。
    最常见的23个设计模式,基本涵盖了一般应用中的多数问题,这些划分也更好的将概念分类,同时也让人意识到“软件中可以分类的设计模式”的存在,好让我们可以结合自己的情况总结出更多更好的设计模式,并调整到适合自己应用的方式。
    这个阶段并不复杂,关键取决于自身对之前学习的扎实程度,也需要一些相关书籍的指导和自我思考总结,形成一个自我认知的设计模式框架,方便以后的运用。
  3. 数据结构&算法
    STL:对vector、list、map数据结构的了解,对内存管理的了解,对常用函数的内部实现的了解,要有一个扎实的数据结构基础,还有常用算法,也是有必要深入理解,主要是在思想上要有一个优秀的思考问题的方式,才能保证高效的实现方式。
    泛型编程:目前的面向对象思想已经基本成熟,而泛型编程则是一个很好的进阶内容,对语言的演化和语言哲学的思考也很有意思,在库函数设计中,泛型都或多或少也会用到。
    在这之上还有很多衍伸,如何设计好内存池解决内存碎片,64位,多线程,垃圾回收等等这些C++能够胜任的方面,都可以进一步深入研究
  4. 其他
    学习C++的一个好处就是你更有机会更需要了解很多其他方面的知识,比如一个程序的运行:编译器,汇编,寄存器,VHDL,算术逻辑单元,如此的一个繁杂的过程,可以了解一个语法的解析,汇编与寄存器之间的指令操作,算术逻辑单元是如何将汇编指令解析成01的单元,还有在硬件设计中如何应用VHDL来抽象问题,这些并不需要深入,但了解之后你会有种如梦初醒的感觉
    再比如字符编码、TrueType字体、正则表达式,每一个方面都够你喝一壶的
    然后呢,C++世界里面还有很多优秀的开源库可以学习,大到boost和OGRE,还是小到Fox、AGG、FreeType
    还有很多不同语言之间的不同语法,不同的语言设计意图,都值得我们思考和总结,也有很多收获
    羡慕自己吗,还有这么多事情可以做

      如上是我结合个人体会,总结的一个学习进阶,其实并没有明显的界限和先后顺序,看了都会有收获,只是合理的顺序可能会有更好的体会和收获,大不了再来一次温故知新也好。

C++规范

要做质量的准绳。有些人还不习惯在一个追求完美的环境里工作

      写到这里,我首先想到的是质量,质量问题并不直接取决于技术能力,跟环境,态度都有很直接的关系,有一个质量意识强烈的团队,负责任的心态,这是很客观的一个因素,甚至起到关键作用。

      C++的强大不可避免的导致它的复杂,而且一般C++主要负责核心模块或大规模开发,而每一个人的开发风格或多或少会有一些不同,如此下去必然会容易出现bug,难于阅读和维护。而一个合理的规范,不仅能规避这些问题,还能有效发挥C++的能力,易于管理。

      个人感觉大致有几个大的层次(细节部分还需要完善):

  1. 规范完善机制
    好的制度和流程,都可以提供建议,审核并加入,规范能够与时俱进,有生命力和约束力
  2. 架构规范
    明确架构划分,功能职责划分清晰,接口标准统一(工厂模式,单例模式等)
  3. 依赖库
    依赖库明确,稳定,有合理的审核(协议,提供方式)
  4. 核心模块使用准则
    容器类标准使用接口
    字符编码
    系统函数使用添加准则
    xml格式规范
  5. 数据库引擎使用准则
    风格存储
    Geometry接口规范
    记录集使用规范
    ……
  6. 二维显示使用准则
    风格准备
    显示引擎规范
    ……
  7. 三维使用准则
  8. 代码规范&语法
    1. 代码注释
    2. 命名规则
    3. 指针引用
    4. 跨平台注意
    5. 头文件宏注释
    6. 类添加
    7. 内存管理

语言之美

佛教有一句话,叫做初心,或初学者的心态,拥有初学者的心态是件了不起的事情”

      每一种语言的设计,都夹杂着语言发展的点点滴滴,都体现了作者,甚至是这个民族的思想和风格,而我们不仅是语言的使用者,还应尽到语言的主人的职责,这就要求我们能够欣赏不同的语言,有自己的品味,享受语言的优雅,把握语言的瑕疵。

      C++也有其典型的时代特点,不是最早的面向对象语言,借鉴自SmallTalk,但也具有过程化的特点,同样也不是最流行的面向对象的语言Java,也区别于目前时髦的动态语言Python、Ruby,尽管C++有如此多的不足,但仍然难掩我对它的喜爱之情,这种感情很难描述,还是让每一个人自己去发掘和体味吧。

  1. 面向对象
    面向对象的设计思想在语言发展史中举足轻重,目前也属于基本成熟阶段。面向过程在发展过程中出现了很多问题,比如典型的goto语句,最后通过逻辑语句和模块化的方式,实现了对功能函数的分解,大大简化的问题,但这种过程封装并没有实现对数据结构的封装,数据本身并没有得到解决和管理,正是在这种情况下,面向对象的语言得到了发展,并逐渐成熟,成为主流。
    面向对象的特征主要有三点:公私有、继承、多态。而其中多态的作用较为核心,通过语法规则和设计,满足的程序设计的一些常见问题,完善的面向对象的设计方式,正是这三个核心特征,让面向对象的设计方式成为了当前的主流设计思想。
    C++作为面向对象的语言,其多态通过虚函数和虚函数列表来完成,也基本成熟。
    目前主流面向对象语言:C++/Java/Python/Ruby
  2. 继承
    继承机制很好的满足了代码的重用,在软件设计中应用也很广泛。C++的继承机制,成员变量的内存分布,函数重载,虚函数的内存分布,这些实现机制都可以很好的理解继承的解决思路
    另外就是C++的多继承功能,在Java和C#中并不直接支持,而是以接口(interface)的方式来间接支持,这保持了继承的线性关系,但是缺弱化了继承的功能,这种简洁是有不少代价的。而多继承的支持会导致网状结构的继承关系,导致关系复杂,比如变量冲突,函数冲突等。Ruby提供的Mix-in方式,支持多继承的同时增加了对多继承的限制,通过语法避免的多继承的复杂度
    多继承的核心在于如何控制复杂度的规模,无论是通过语法还是开发者的规范,C++则比较直白,提供了尽可能的功能,但里面的限制和隐患都需要开发人员自己来把握,犹如一头脱缰的悍马,就看你是不是伯乐,是否有足够的能力驾驭了
    多继承问题的关键:控制规模
  3. 静态语言&动态语言
    编译型or解释性
    各有优劣
    DuckTyping(有无数据类型)
    核心区别是设计思路的不一致:动态语言专注解决什么问题,简化如何解决问题这个层面,代价是效率的取舍
    不同领域不同问题语言的取舍
  4. 效率
    优化的核心是等待时间而不是花费的总时间

      这部分就写到这吧,主要是自己也没想清楚怎么写,也是水平有限不知道如何表达,还有写到这有点写累了的味道,就点到为止,不再铺开了吧,呵呵。

总结

“Stay hungry, stay foolish”

      技术发展的现在,每一种语言都显得不如以前重要,比如Java、C#、C++这些传统语言或者Python、Ruby这些新宠,关键还是针对产品,对多种语言的取舍和各自使用范围的界定,特别是技术领域的多样性,这就要求我们有一个更宽容的心来对待不同的技术,把握发展动向。

      当然,关键还是你对你所做的事情的一种热情,那种纯粹的激情。因此,我把Jobs最经典的座右铭留在了这里,激励每一个人,包括我自己。

再次缅怀Jobs,这个时代如同神一般传奇的人物!

Farewell,Jobs。

clip_image001

posted @ 2011-10-10 09:51 pasu 阅读(13) 评论(0) 编辑