分类：电脑/网络-程序设计
问题：学习程序学什么语言好一些呢我想学习编程语言可是不知道学习什么语言 
我想学习 可是不知道学习什么语言好一些 能否给些提示呢 ? 谢谢
回答：我的编程语言观关于编程语言的争论虽然此伏彼起，但事实上很少有人真的在做编程语言的比较，同时许多无价值或错误的观点却在真实的误导着许多程序员的认识，为此我决定写这篇文章。　　一、前提　　本文后述观点是基于这样一种前提：只关注语言特性，而忽略标准库和其他各种框架（虽然这些更大程度上决定着人们对语言的选择）。这必将使这篇文章的观点更具有理论意义，而非现实意义。但语言特性是编程语言的根本，无论是做语言比较，还是评论语言，都应该以此为出发点，否则将导致讨论范围的无限增大，进而导致讨论的无结果。为避免有人找碴，必须预先声明的一点是，由标准库实现的语言特性将被看作语言特性，进而列入考虑的范围。同时这里说的编程语言是指一些通用目的的高级编程语言，比如C/C++,Java,Python,Perl等。　　二、80% 与 20%　　我学习不同的编程语言时，更多的时候是感觉到其间的共性。于是我对此进行思考，发现这种共性的存在具有必然性。　　软件的根本特性是复杂性，对此Dijkstra告诉我们，“掌握复杂性的技巧早在古代就有了：divide et impera(分解和规则)”。当我们具体进行分解和设定规则时，我们要用到一些分析和设计方法。当代两大主流分析和设计方法是结构化和OO。结构化设计方法的三种基本结构是顺序，分支和选择。OO的三大基本特性是封装，继承和多态。各种设计语言通常都支持这两种分析和设计方法，其基本语言特性也必然涵盖上述六个要素。所以从这个角度看不同编程语言必然具有相当多的共性。　　可为佐证的首先是《The Art of Computer Programming》这本书。这本书中的算法用低级语言描述的，但其内涵被大多掌握不同编程语言的开发人员所分享。有人评论说，当今软件开发人员所掌握的绝大多数计算机程序设计的知识都来源于此，这意味着相当多程序设计知识可以具体实现在各种编程语言中。　　另一个是《设计模式》，你很难说那个设计模式是专属于那种语言的，大多的设计模式可以用各种编程语言来实现的。虽然具体的实现上会因为语言特性而做相当的调整。应该可以说不同的编程语言在某个确定的设计模式面前，体现的也是共性。　　把上面的内容总结一下就是：很多的场合下，不同的语言是可以互换的。互换的基础是不同种语言间的共性，而存在这些共性的基本原因是不同的编程语言要支持的根本思想中大部分是相同的。　　故老相传，学到高处，语言间切换是很容易的，很多人的经历也验证了这句话。上面说的正是这句话的所以由来。　　这里没有把各种语言等同起来的意思，但编程语言的个性同共性相比反倒是较小的部分。它们往往成为关注的焦点，同时也是存在这么多编程语言的一个主要原因。　　大多数人对此的体验大概来自基本语法，事实上这是让人非常懊恼的一个方面。基本语法的不同起源于什么无从考证，但根本事实是这种不同在浪费学习者的时间。我们来做个类比大家就知道这种浪费有多么不值得，UML出现前，OO表示法主流上有三种，他们表达意思差不太多，但他们不一样。学习的人，工作的人要为同一件事花近三倍的力气（要不然别人用另外的表示法写的文档你怎么看的懂），现在这些人得到了解放。但在编程语言领域这种糟糕的事仍然在继续，差不多每个人都要记住好多种if语句，虽然事实上它们可以统一。　　抛却基本语法不谈，其它的方面是真的不多。即使把C++和Python这两种差别非常巨大的语言放在一起进行类比。一时间能想起的主要差别也只有： ①Python内置了list及tuple等一些数据结构作为内置类型（当然还有与此相关的操作）。而C++中要用基本类型对此进行定义。②Python 支持函数生成器和函数嵌套定义。而C++不支持。③Python是动态类型语言，先天具有范型能力。而C++要通过模板的概念支持范型。这不是一个完整的列表，如果愿意，这个列表确实可以变长，但另外一张反映共性的标通常会更长。　　（注：我没有参考相应的书籍把两者的语言特性一一罗列，并彻底的比较其异同，仅是把平常使用时经常用到的语言特性想了一下，写了上面的东西。如果那位使用过两种以上的语言，我也建议能用这种方式来确定两种不同语言的常用部分有多大的重叠度。）　　这也正是题目所说的80%和20%的根本含义。不同的语言虽然看起来差别很大，但共性要大于个性。至于是不是4：1的关系，老天知道，那位感兴趣，可以统计出一份数据来。　　三、结论　　（事先声明，这里是从学习的角度来下这个结论，而非混饭的角度）　　好多年前就有这句话：编程语言并不重要，设计思想才重要。这几年在托鼠标即是编程的大潮中，这句话逐渐被遗忘了。　　在这篇文章的结尾，我想对这句话进行一些诠释。编程语言不是不重要，光有想法，基本语法都搞不清楚的人肯定什么都做不出来。但而后呢？不停的学习新的语言，接触新的语法么？从上面的分析看，如果你这样做，那意味着你在做重复劳动，并且没有实际的进步。真的程序员不该如此堕落，总要学些思想性的东西吧。总不能去研究怎么才能把一个钮拖到另一个地方的路径缩到最短吧？　　学习编程语言，熟悉基本语法后，一定要关注某些语言特性背后所承载的东西。但单知道这两样仍然是不够的，还要知道什么时候这些被承载的东西适合使用。这是远比前两者更难的东西。　　为避免结论过于抽象，举个例子来描述这三重境界：比如说学习模板的时候，第一步是要把基本语法搞清楚，要能够确保写出来的模板类、模板函数没有语法错误，能够通过编译。第二步要去理解泛型这种思想，去思考泛型存在的根本目的是什么？第三步是能够在碰到具体问题时，来正确的取舍是否需要使用这种特性，用的话又怎么去用。　　四、尾声　　程序员作为一个笼统的称呼，其真正的含义正在分化。Bjarne Stroustrup自称：“是的，我是一个程序员”。而一个只会拖拖鼠标，完成指定功能的新手，通常我们也称之为程序员。但事实上这同一个称呼，其内在含义是不一样的。　　可视化编程和RAD的快速发展所产生的一个明显后果就是，所谓的软件蓝领离我们是如此之近。并且越来越多的人以闪电般的速度切入这个队伍。这又是怎么样一场绚丽却虚假的繁华。于是许多谣言应势而生，最为让人哭笑不得的莫过一句“程序员是吃青春饭的”。这未免太小觑程序员这个职业了，这句话成立的前提是做程序员没什么难度，不需要什么积累，主要是力气活。诚然如果程序员只是一个拖鼠标的职业，那么年富力强者具有先天的优势。但很不幸大多时候他不是，或者说不应该是。　　在这里我姑且漠视许多公司对软件蓝领的呼唤，单从个人发展的角度提醒一句，实践实用主义的同时，莫要忘了什么是编程的根本，莫要忘了提升自己的境界。最近看到很多朋友问到如何学习编程这个问题，我想这个问题应该是所有初学者都非常关注的问题了，在论坛上回答了很多也讲了很多，但是总是无法让所有朋友得到一个解答，所以我想写一下自己的经验，希望对大家有所帮助，不过在此先声明，我并非什么高手，我也只是刚刚入门而已，也只是希望通过写一点个人的体会帮助一些和我遇到相同问题的朋友，高手就免看了，以免班门弄斧。　　在学习程序之前，我想大家首先应该对程序员这个行业熟悉一下，更加要对编程的语言以及所涉及到的工具有所了解。因为如何了解这些是很难去给自己一个明确的目标的。所以首先我想在这里先为大家介绍一下这个行业以及一些相关的内容。　　程序员，相信在很多人眼中是一个非常神秘，非常特别又或者说非常有趣的职业。因为在这个行业里面实在出现了太多的英雄，每一个英雄的事迹都足以让我们热血沸腾。但是，又有谁知道在这些英雄的背后，藏着多少辛酸，藏着多少的努力。程序员这个行业并非如大家所想象的那样美好。程序员是一个没有白天黑夜概念的行业，程序员是一个让人筋疲力尽的行业。你们看到的是一些英雄的光辉历史，但是却忽略了大多数程序员的艰辛。所以在这里我奉劝各位，如果你是为了这个行业充满传奇色彩而想加入，如果你是为了这个行业薪水高而想加入，那么请你现在退出吧，因为它不适合你。这个行业需要的是拥有努力、认真、坚持等品质的人。　　讲到如何学习编程，那么必不可少的就要讲到编程语言了，相信大家都知道编程语言有很多种，包括C、C++、BASIC、PASIC、ASP、 PHP等等，当中还分为很多不同的领域，所以在学习编程之前一定要为自己定下一个目标，一个自己即将要进入的领域。有些人想进行底层开发，有些人想做网站开发，有些人想做商业软件开发等等，由于计算机的普及，软件行业所涉及的领域也就越来越多，一个人是不可能涉及所有的领域的，所以必须在学习之前给自己一个定位，这个是很重要的，如果没有这个定位的话在未来学习编程的日子里将会很迷茫。　　目标的定位当然不能少了工具的因素，因为不同的领域使用的开发工具也不同，在这里想重新再次郑重的向所有朋友声明一次，不要把开发工具和开发语言混为一谈，语言是编程的基础，而工具是用来辅助开发的，例如VC、VB、DELPHI、BCB等等。每种工具都有各自的优势和缺点，至于每种工具的特点我就不再讲了，如果大家是有心学编程的话，我相信你一定会去看看关于这些工具的具体内容的，呵呵，让我偷个懒。还有在这里重要提醒一下大家，不要被现在的流行工具所迷惑，学好根本才是最重要。　　前面大概的准备工作已经做完了，对这个行业了解了，给自己定了一个目标后，接下来当然是全力向这个目标进发了。那该怎么做呢？看了很多朋友的帖子，都讲到 C语言是程序员必学的语言，如果程序员不学C就不算是真正的程序员，我个人认为这种说法有点偏激，当然，我承认学C是会对你有很大的帮助，但是并非一定要学C，大家之所以这样说，可能是因为C语言的影响太大了。但是你总不能要那些去学网站开发的人一定要去学C吧，呵呵。其实我个人认为，一开始学什么都无所谓，但是无论学什么，一定要努力和坚持，做不到这两点，你就注定会是个失败者。在这里我想讲一下学编程最关键的问题，就是思想。也许这是个很抽象的概念，但是没有办法，编程本身就是个很抽象的东西，呵呵。等你真正领悟到这一点的时候，恭喜你，你已经站在编程的门口了，呵呵，只是门口哦。那么编程的思想又该如何去领悟呢？要领悟其思想，那首先学习语言是必然的，语言是思想的一种体现形式，就像一个人的思想需要语言来表达一样，所以如果连一门语言都无法掌握的人是无法领悟其思想的。但是对于一个人，如果不经常说话，不经常使用语言，他又如何去使用语言来表达自己的思想呢？编程也一样，要领悟其精髓，必须先不断地看，不断地使用，才能在这种过程中慢慢有所体验，当然有的人可能快些，有的人可能慢些，但是不管快慢，能够达到就是进步。　　我记得在我仍然迷茫的时候，不知道自己该如何去学，每天就是机械式的看书写代码，根本都不知道自己是不是真的懂，但是就是这样不断的看不断的照着书写，终于有一天，好象突然开窍一样，一下子就把所有不明白的东西全都弄明白了，这个有点像佛家所说的顿悟，呵呵。我最初以C语言开始学习的，在我开始学C语言到顿悟这一刻，我可以告诉大家，我看C语言的书我一共看了5本不同的版本（不过都是像走马观花一样的看，千万不要学我），直到第5本看到指针那里，我才真正有种明白的感觉，也许我太笨了，相信大家看一本就够了，HOHO。自从那一次后，我接着看C++，学习pascal、basic、汇编这些东西，自己感觉都非常容易看懂，可能这就是所谓的一理通百理通的道理吧。呵呵，不过在这里要讲一下，上面所说的几种语言虽然看书都看过了，也看明白了，但是由于很少使用，现在大部分都还给书本了，呵呵。　　看到这里，包括我在内，我都感觉到自己很了不起，很厉害了。可惜，只有我自己知道，虽然看了那么多，学得也多，写得也不少，可是我却不知道如何运用。来来去去就是写一些书本上的题目，自己却感觉像windows那些程序却不知道如何去写，不知道该怎么办，相信很多人都有和我一样的体会吧，把C语言学了，题目也做了，而且都没有问题，可是却不知道如何去做开发，感觉自己学的东西一点用处都没有。这又是为什么呢？　　在这之前，我一直为这个问题烦恼，后来我终于找到了答案，那就是我所学的，所写的都是DOS应用程序，而我们现在所使用的是windows操作系统，当然也有使用linux系统的。后来看了一篇别人写的文章后，我才知道我所学的和实际运用相差太远了。现在大部分学习编程语言的书籍上的例题都是基于DOS系统开发的，所以我们所写的程序和windows上所运行的不一样，这就是造成我们迷茫的主要原因。那该怎么办呢？那还用问吗，当然就是去学习 windows开发啦。在第一次接触windows开发的时候，我真的是大吃一惊，这完全和我以前所学的很不一样，但是又息息相关，如果没有以前所学的，我根本就看不懂windows开发的内容。　　在这里给大家简单介绍一下，windows开发和DOS开发的区别吧。大家都知道，DOS是一个单任务执行系统，也就是说在DOS下只能在一个程序运行完成或者中断后才能运行其他的程序，而windows是个多任务系统，当然在本质上windows也只能一个时间内执行一个程序，但是由于其利用CPU的运算能力，让这些微妙的时间让人无法感觉到，再就是windows是一个图形界面系统，拥有着良好的用户界面，不像DOS是个指令界面。所有这一切的区别导致DOS和windows开发上也存在很大的区别。    所以现在的程序员首要的任务除了学习语言以外，就是要去学习windows开发机制。如果连这个都不懂，那是肯定开发不出一个好的windows软件的。在这里向所有朋友重点推荐美国人Charles Perzold所写的《windows程序设计》第五版，这本书可以说是经典中的经典，学习windows开发必看的书，适合有C语言基础的朋友看，它有多经典我就不想细讲了，总之就是绝对不会让你失望，呵呵。这本书市场价是160元整，分上下两册，如果有的朋友觉得太贵的话，我这里有他的电子版，需要的就找我要吧，随时欢迎大家找我要这本书，呵呵。　　说实话写到这里，我自己都不知道自己写了些什么，好象很乱，呵呵，希望大家能够看得懂吧。看完我介绍的这本书后，而且看懂的话，那么接下来自己该如何走，我相信我就不用再多说了，到那个时候你一定知道自己该如何去学习编程了。上面讲了下我个人是如何学习的，当然还有很多细节地方没有涉及到，不过随时欢迎朋友们跟我一起交流。而且我现在才发现上面所写的是从C语言开始学习的，呵呵，其实我并非要大家向我一样学习，我只是把自己学习的经过大概讲了下，当然还有以后该怎么办没有写，其实我也在摸索中，嘿嘿，我写了那么多废话，无非是想要大家明白几个道理：　  　第一、首先要给自己定一个明确的目标。　　第二、分清楚语言和工具的区别。　　第三、把思想放在首位，语言在精不在多，学好了一门语言再去学其他的，就易如反掌了。　　第四、工具是经常被淘汰的，不要被工具所迷惑，坚定自己的信念。　　第五、无论选择做什么系统开发，首先要去了解这个系统，只有了解了这个系统才能在上面为所欲为。　　大概也就差不多了，不全或者写得不好的地方请指正，呵呵，就这么多了吧，欢迎大家跟我一起学习，一起进步，一起交流。当然最后仍然是那句：　　    努力+坚持=成功