【转载】C/C++语言分析 & 每年学一种编程语言 & git历史

http://blog.csdn.net/turingbook/article/details/1778867

《程序员修炼之路》英文注释版

作者提出的经营之道是:
——Invest Regularly,不断投资,积少成多。
——Diversity,扩大知识面,多元化,减少风险,增加潜力。
——Manage Risk,控制风险,这点与上呼应,要注意结合学习短线和长线技术。
——Buy low,sell hign,低买高卖,寻找潜力股。
——Review and rebalance,多总结。

 

作者提出的8大目标,可能更有实践意义:
——每年学习一种新语言。

 

http://blog.csdn.net/turingbook/article/details/1775488

Linus和Dmitry关于git源代码的C/C++之争:

”如果你想用更花哨的语言,C++绝对是最糟糕的选择。如果想要真正的高级特性,那就选择有垃圾回收或
                  者好的系统集成的,而不是既缺乏C的简约(sparseness)又缺乏C的直接而且没有重要概念的高层                  
绑定(high
-level bindings to important concepts)的东西。 “一言以蔽之,C++正处在困境当中,它既无法帮助原型化或者简单的GUI编程足够简化从而真正可用,又
不是C那样积极地鼓励你使用简单和直接的语言构造的精益系统编程语言。 (另一位同学插了一句:这还没有提到很难找到两个C
++编译器支持同样的特性。)

作者刘江的按注:

Dmitry有一点是肯定正确的,语言之争更多的是一种类似宗教信仰上的,所以很难有结果,也没有太多实际意义。这种争论因为出自高手之间,所以还是会透露出很多重要的信息。比如:

1. 对于要求性能高的系统编程领域,C++其实未必胜过C,而且事实上,也确实有很多此类项目是选择C作为主要语言的。C的生命力目前仍然毋庸置疑。更多的信息可以读这里。

2. C++目前确实处于一种被夹攻的态势,一方面在企业级系统开发(数据密集、业务规则复杂多变)中,C++已经基本被Java和C#等淘汰出局,另一方面在系统编程和嵌入式等更接近硬件的领域,又遭到C的强烈狙击。

3. OO技术并非one-size-fits-all。
C语言作为一种古老的语言,其局限性也是很明显的,比如已经成为安全问题渊薮的缓冲区溢出。C的标准库也存在各种各样的问题。对于更加贴近现实世界的众多项目,没有面向对象机制,显然会影响开发效率。

C++目前的困境,很大程度上是由于此前的图书和文献曾经一度倾向于炫技,陶醉于对语言各种细节的深入探索,有华丽化、复杂化的趋势,语言设计者们苦心设计出来各种丰富的特性和多范型的编程风格,却成了学习者和使用者的负担

老人毛病多多,新人青黄不接,C++社区的确面临危机。

注:我也下载了文章提到的《C++必知必会》

里面还提到一个Compact的概念,参考 http://www.faqs.org/docs/artu/ch04s02.html#compactness

Compactness is the property that a design can fit inside a human being's head. 
A good practical test for compactness is this: Does an experienced user normally need a manual?
If not, then the design (or at least the subset of it that covers normal use) is compact.
“在通用编程语言中,C和Python是半紧凑的;Perl、Java、Emacs Lisp和shell则不是(尤其是真正的shell编程要求你知道半打sed和awk这样的其他工具)。
C++是反紧凑的——语言的设计者承认,他并不指望任何一个程序员能够完全理解这一语言。”

 

 

http://blog.csdn.net/myan/article/details/1777230

时至今日,在一般的场合下,C和C++语言的主要用途就是系统级软件的开发。具体地说,C/C++写平台、工具和基础库,支持高层的语言来完成应用逻辑。 
在9月份《程序员》杂志上刊登的一篇《微软架构师谈编程语言发展》的文章里,Brian Beckman直截了当地说,C++语言主要是用来开发别的语言的。
这话片面一点,如果改成 “C++语言主要是用来支持别的语言的”,那就大体没错了。

做系统软件开发的时候,重要的是理解系统的运作方式,那些漂亮的抽象手法和高级特性是次要的。

那些高级的抽象结构往往是 不必要的,反而是由于抽象层次的提高,使得开发者要弄清楚“下面实际发生的事情”变得不太容易了。
所以很多老手实际上觉得用C语言控制力更强一些,更得心 应手一些。真正的C语言高手,对于语言和编译器都很熟悉了,
基本上在写C时候就已经知道编译器优化以后产生汇编代码是个什么样子,甚至可以改变C代码来引 导编译器产生最优化的机器码。
而C++的机制很丰富,很多机制是为了满足高层应用和框架的需求而准备的,在这个层次上发挥不出来,反而把清晰性给牺牲掉 了。
很多时候,一个简单的语句,到底背后会发生什么,即使是老手也说不清。
std::string s(“Linux Torvalds");
     std::string scopy = s;

     上面这段代码不过是创建两个内容相同的字符串副本,但是没有任何一个人能够在不了解更多信息的情况下清楚地描述背后所发生的事情,
因为不同的STL对于 string的实现方式不同,因此在copy assignment时表现也不同,有的可能是简单地复制字符串对象,有的可能具有ref
-counting机制,
需要创建对象、设定对象值、增加引用计 数,有的没有考虑线程安全性,有的考虑了线程安全性,还得加锁解锁,对不起,加解锁也还有很多做法。
创建新的string对象时,有时还需要调用内存分配 器,而这个东西的实现又五花八门,有的直接new char[],有的从内建的memory pool申请,
memeory pool是不是线程安全的?对不起,这次可能又要涉及加解锁问题。memeory pool会不会已经满了?要不要次第调用new/malloc申请新的内存块?
总之,后面的事情够多够复杂,没有相当功力,对平台了解不够深入,很难说出个子午卯酉来。

写算法程序的时候,不用STL就觉得不爽。

一个transform 就可以搞定的事情,非要用for循环,这会让我感觉浑身不自在。所以一般情况下,拿到一个什么问题,我还是会用C++去解决的。
对我来说, Torvalds的话其实是很中肯的,即使是用C++,也要尽可能搞清楚其背后发生的事情,这样在写low level程序的时候才会有把握。

如果是设计应用级别的程序,就尽可能不用C/C++,把底层的事情都忘掉,专心专意做好应用层的设计才是正道。

 

http://blog.codingnow.com/2007/09/c_vs_cplusplus.html#more

好了,让我再引用 Linus 的一句说到我心坎里的话。“字符串/内存管理根本无关紧要。这不是重要的部分,而且也不复杂。唯一真正重要的部分是设计。”

设计!这才是重中之重。

http://blog.csdn.net/myan/article/details/1778843

 这里面的道理是这样的,反正现在C和C++都是来做系统级开发,那些华丽的抽象机制用不上,思考解决方案的时候,就以C的方式。
注意,C也是可以做基于对 象甚至面向对象甚至组件级别的设计的,但是在C的层面上思考问题,设计能够更精益(lean,现在这是个时髦词),更轻便,更直接。
我支持STL是基于同样的理由。很多时候,你从C出发得到的设计,也无非就是STL已经实现得很好的东西。在这个时候,当然可以用STL。
尤其是那些算 法,针对C array也是适用的,用accumulate求和,用transform映射,用adjacent_find寻找相等的毗邻项,
用 lower_bound和equal_range做二分查找,等等,这不是比手写要爽多了吗?当然,使用STL,还是必须熟悉其背后的机理,没有这个底 子,还是规规矩矩用C算了。
一般性的编码实践准则,以及基本的编程能力和基本功,乃至基本的程序设计理论以及算法设计。才是真正需要花时间掌握的东西。
C++中众多的细节虽然在库设计者手里面有其用武之地,但普通程序员则根本无需过多关注,尤其是没有实际动机的关注。
学习最佳编码实践比学习C++更重要。看优秀的代码也比埋头用差劲的编码方式写垃圾代码要有效。直接、清晰、明了、KISS地表达意图比玩编码花招要重要…
十年学会编程不是指对每门语言都得十年,那一辈子才能学几门语言哪,如果按字母顺序学的话一辈子都别指望学到Ruby了;
十年学习编程更不是指先把语言特性从粗到细全都吃透才敢下手编程,在实践中提高才是最重要的。
C++的书,Bjarne的圣经《The C++ Programming Language》是高屋建瓴的。《大规模C++程序设计》是挺务实的。《Accelerated C++》是最佳入门的。
《C++ Templates》是仅作参考的。《C++ Template Metaprogramming》是精力过剩者可以玩一玩的,普通程序员碰都别碰的。
《ISO.IEC C++ Standard 14882》不是拿来读的。Bjarne最近在做C++的教育,新书是绝对可以期待的。

P.S. 关于如何学习编程,g9的blog上有许多精彩的文章:这里这里这里这里 实际上,我建议你去把g9老大的blog翻个底朝天 :P

学C++”和“不学C++”这个二分法是没意义的,为什么?因为这个问题很表面,甚至很浮躁。重要的不是你掌握的语言,而是你掌握的能力,借用myan老大的话,
“重要的是这个磨练过程,而不是结果,要的是你粗壮的腿,而不是你身上背的那袋盐巴。”。

对此大嘴Joel在《Joel On Software》里面提到的漏洞抽象定律阐述得就非常漂亮。

这是Joel在2002年提出的,所有不证自明的抽象都是有漏洞的。抽象泄漏是指任何试图减少或隐藏复杂性的抽象,其实并不能完全屏蔽细节,
试图被隐藏的复杂细节总是可能会泄漏出来。 抽象漏洞法则说明:任何时候一个可以提高效率的抽象工具,虽然节约了我们工作的时间,但是,节约不了我们的学习时间。 代码生成工具如ORM等Hibernate都是这种思路,它抽象了一些东西,但是,所有的抽象机制都是有漏洞的。唯一可以处理漏洞的方法就是知道抽象的原理,
都抽象了些什么东西。所以,在你了解抽象原理的过程中,时间之神将讨回你之前节约的时间。
所以,答案是,让你成为高手的并不是你掌握什么语言,精通C++未必就能让你成为高手,不精通C++也未必就能让你成为低手。
按照一种曹操的逻辑,“天下语言,唯imperative与declarative耳”。C++是前者里面最复杂的一种,支持最广泛的编程范式。
借用当初数学系入学大会上一个老师的话,“你数学都学了,还有什么不能学的呢?”。学语言是一个途径,如果你把它用来磨练自己,可以。
如果你把它用来作为学习系统底层知识的钥匙,可以。如果你把它用来作为学习如何编写优秀的代码,如何组织大型的程序,如何进行抽象设计,可以。
如果掉书袋,光啃细节,我认为不可以(除非你必须要用到细节,像boost库的coder们)。

然后再借用一下g9老大的《银弹和我们的职业》中的话:

银弹和我们的职业发展有什么相干?很简单:我们得把时间用于学习解决本质困难。新技术给高手带来方便。菜鸟们却不用指望被新技术拯救。
沿用以前的比喻, 一流的摄影师不会因为相机的更新换代而丢掉饭碗,反而可能借助先进技术留下传世佳作。因为摄影的本质困难,还是摄影师的艺术感觉。
热门技术也就等于相机。 不停追新,学习这个框架,那个软件,好比成天钻研不同相机的说明书。而热门技术后的来龙去脉,才好比摄影技术。为什么推出这个框架?
它解决了什么其它框架 不能解决的问题?它在哪里适用?它在哪里不适用?它用了什么新的设计?它改进了哪些旧的设计?Why is forever.
和 朋友聊天时提到Steve McConnell的《Professional Software Development》里面引了一个调查,说软件开发技术的半衰期20年。
也就是说20年后我们现在知识里一半的东西过时。相当不坏。朋友打趣道:“应 该说20年后IT界一半的技术过时,我们学的过时技术远远超过这个比例。
具体到某人,很可能5年他就废了”。话虽悲观,但可见选择学习内容的重要性。学习 本质技艺(技术迟早过时,技艺却常用长新)还有一好处,
就是不用看着自己心爱的技术受到挑战的时候干嚎。C/C++过时就过时了呗,只要有其它的系统编程 语言。Java倒了就倒了呗,未必我不能用.NET?
Ruby昙花一现又如何。如果用得不爽,换到其它动态语言就是了。J2EE被废了又怎样?未必我们就 做不出分布系统了?这里还举了更多的例子。 一句话,只有人是真正的银弹。职业发展的目标,就是把自己变成银弹。那时候,你就不再是人,而是人弹。

 

http://blog.csdn.net/turingbook/article/details/1775488

刚知道git也是Linus开发的。git诞生于2005年,由于Bitkeeper停止和Linux源码库合作,Linus自己开发的一套分布式代码管理系统,特性有:

速度
简单的设计
对非线性开发模式的强力支持(允许上千个并行开发的分支)
完全分布式
有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)

下面这个解释的很好:

http://www.open-open.com/lib/view/open1339575112974.html

 

 

https://www.zhihu.com/question/21994269

Linus Torvalds为什么能称为大神:

作者:Copter
链接:https://www.zhihu.com/question/21994269/answer/19966256
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

抽象总结:当一个人的影响力远超过他的能力时,他离人们心中的神位已经不远了。

开源世界中,你的贡献决定了你的地位。Linus 作为程序员,无可争议地属于顶尖级别。他不仅是现如今广泛应用于各领域的 Linux 内核 The Linux Kernel Archives 的创始人(不必说当时他还是个大学生),也是多年来成功管理 Linux 内核开发 kernel/git/torvalds/linux.git 的核心人物。仅凭这两点,被网友称为“大神”一点不为过。

他同时也是 Git 原始作者。Git 版本管理工具正在被越来越多的项目采用,逐渐统一了开发管理市场。

另外,他本人的一些观点得到了程序员的广泛赞誉,比如他认为批评就应该直接了当地说出来,以便快速地消除误会并修正错误(大意)等。著名的 "So, Nvidia, fuck you!“ 以及对 C++ 语言设计的抨击 Re: [RFC] Convert builin-mailinfo.c to use The Better String Library. [LWN.net] 都是践行这一观点的有力代表。还因为此人无不良嗜好,行事低调,相妇教子,家庭美满。容易获得程序员们的一致肯定。

至于他获得的一些官方认可,我想就不必列举了吧。顺便说,抛弃百毒,题主你又离大神近了一步。:P

你可能感兴趣的:(git,c/c++,java)