最新消息:

[Discovery] 聊聊编程语言的选择和入门及提高,电工及想学习编程的进,已更新JS和Regex 作者: figure9@hi-pda.com

学习 林夕 858浏览 0评论

[Discovery] 聊聊编程语言的选择和入门及提高,电工及想学习编程的进,已更新JS和Regex
作者: figure9@hi-pda.com

聊聊编程语言的选择和入门及提高

经常看到编程入门求助或是编程语言选择这样的帖子。我试图用这个帖子来解决这类问题。
从07年完成了第一个5k行+的项目到现在,差不多有五年的开发经历,其中用过的语言大概十来种,读研后,自己也写过两个实验性的编程语言,因此对编程语言还算有些了解。解答一些编程入门者或是语言纠结者的困惑应该没问题。
下面,我把我觉着不错的、或是很主流的语言挑出来,然后一一评价,然后给出这些语言的学习方法。最后,给出推荐阅读书单,均为良心推荐,无须怀疑
这里再多下嘴,其实学编程,无非就是看书动手仿代码:
1,从书里面学习理论
2,完成书上的练习,编写满足自己和他人需求的程序
3,阅读优秀的代码并仿照甚至超越。
当然,如果仅仅是兴趣并非职业,那么能够编写满足自己需求的程序就已经相当不错了。
接下来介绍的语言包括:C、C++、Objective-C、C#、Python、Scheme、Haskell、JavaScript、Regex

C

很多人都会推荐C作为入门编程语言,20年前的入门编程语言也许是C,不过在这个时代,C绝逼不适合初学入门。
如果你是一个计算机专业的学生,或有意在计算机行业发展,请继续阅读。
如果你感觉无聊,想学点能用的东西,请直接跳到C#。

学习C的问题:
你不会有任何的成就感,你无法使用C做一些让朋友同事所羡慕的东西。
你需要相当长的时间才能运行你第一个程序,而这个程序往往就是在一个黑布隆冬的窗口里打出一行字,然后一闪而过。
绝大多数的时间你都会在苦逼的黑布隆冬的命令行控制台里折腾,当别人问你在做什么,你告诉他你在找10000以内的质数。

学习C的好处:
理解计算机系统。玩C就必须要用指针,用好指针,理解计算机系统是前提。
帮助你找到工作。但牛逼公司的面试、笔试,还是围绕着C展开的。
写出紧凑高效的代码。C在底层机器上建立了一层很薄的抽象,强制你不得不在机器的层面上思考问题——尽管这很累,但你会锻炼出编写紧凑高效代码的能力。

入门
阅读Pointer on C,这本书为C和C里的指针提供了绝好的介绍。
如果你自认为IQ很强,那么可以直接上K&R的The C Programming Language,总之这本书你早晚都得阅读。
然后完成K&R的The C Programming Language里面的所有习题。
找一本Data structure and algorithm analysis in C,完成里面的习题。

提高
阅读C Interfaces and Implementation,学习里面的C编码技巧,这本书采用Knuth的Literate Programming风格编排,非常适合阅读。
阅读The C Standard Library,数值计算之类的“特别数学”内容可以忽略,但不要忽略每篇最后的test suite。
在完成了若干个non-trivial project之后,阅读Writing Solid Code,学习如何编写工业级代码。

C++

个人很反感,也很惧怕C++,因为C++的语言特性实在是太繁杂了,一句简单的 a = b; 在C里面就是纯粹的赋值,而在C++,它可能是赋值,也可能是拷贝构造,还可能是单参数默认构造,也许涉及到析构和引用计数,甚至涉及到内存泄露。总之,C++给我一种很不踏实的感觉,尤其在阅读他人代码的时候。因为我不知道这一句代码的意义是什么,会导致什么。
尽管C++的一部分是C,如果选择C++入门,从非C的那部分开始,就像Accelerated C++一书里面所做的那样。
学习C++的问题和好处可以参见C,尽管C++可以编写不错的图形界面应用,但初学者就不要想了。

学习C++的问题:
参见学习C的问题。
语法的复杂度高的令人发指,尽管有人说可以使用C++的一小部分来解决这个问题,但初学者很少拥有这个能力。
尽管类库很强大,但对初学者来说仍过于复杂。

学习C++的好处:
参见学习C的好处
不同于C,C++是一个多范型(multi-programming paradigm)的编程语言,集procedural、object-oriented、functional、generic于一身,许多C++程序员在学习Java、C#等其它语言时非常轻松,抛开语法的相似性,这是因为Java之类的语言所属的编程范式本身就是C++所支持的编程范式的一个子集,学会了C++,Java、C#之流自然不在话下(这里抛开类库框架)。
随着Java、C#之流语言把程序员的智商拉的越来越低,C++程序员将会越来越值钱(我自己的预言)

入门
Accelerated C++:绝佳的C++入门教材,而且篇幅精悍,该书绕开了C++中的诡异语法,集中讲解了C++最有用的部分,并提供了实用的练习。
Programming: Principles and Practice Using C++:C++创始人Bjarne编写的教材,用他自己的话说:这是一本利用C++来教导学生编程入门的书籍。尽管篇幅很长,但实属良心之作,毕竟有Bjarne数十年的经验在里面。

提高
The C++ Programming Language:C++创始人编著的C++百科全书,篇幅很厚,含金量很高,涉及到了C++以及软件设计构建的各个方面
The C++ Standard Library:STL使用必备,无须通读,使用时参考即可
Inside C++ Object Model:理解C++是如何在C的基础上实现其对象模型,以及继承、多态等OO特性的实现机理
The Design and Evolution of C++:抛开语言的发展史,重点是理解C++为什么会有现在这么多的特性,以及何时该使用这些特性
Exceptional/Effective C++ series

Objective-C

苹果设备的发展使Objective-C这门曾经非主流的语言一跃进入语言排行榜TOP 5。
去年10月我和同学合伙开发iPhone App,才开始接触Mac和Objective-C。因此对这门语言的了解不多,所以这里就简单介绍下。
具有C或C++的开发经验的话,Objective-C很容易上手,就是其语法很迥异,一堆的方括号加上@号,初次看到的时候还以为是火星文。
如果是零开发经验,不推荐Objective-C,尽管可以用它来做一些图形界面应用,但它迥异的语法会让你对编程语言产生一种错觉。

学习Objective-C的问题:
仍然需要相当长的时间,才能运行你第一个程序
需要一台Mac,除非专业电工,否则很少会有人为了学编程而去买一台Mac
迥异的语法,应用面很窄,Mac平台独占
由于其最近才开始流行,故缺乏优秀书籍,此外,官方的支持文档也没有中文

学习Objective-C的好处:
可以较为方便的编写大家都能用的应用,这里主要体现在iOS上
编写iOS App:无论是自己编写iOS App,还是求职,都异常火爆,而且很来钱

入门
Programming in Objective-C:尽管废话很多,但不失为一本不错的Objective-C入门书籍,这本书面向的是编程零基础读者。
Cocoa and Objective-C Up and Running:拥有一定编程经验的话,阅读这一本。
Programming iOS 4: 编写iOS App必备,很详细

提高
这方面看的书不多,大家可以自己去Amazon上找,也可以在Stackoverflow上开贴询问。

C#

如果反感微软,大可以跳过C#。但你会错过一门非常优秀的语言:无论是语言,还是类库的设计,相对于C#,Java完败。
C#拥有一个强大的变态的开发环境(Visual Studio),以及一个丰富到变态的支持文档(MSDN),如果英文够好,Channel 9提供了大量高质量的微软技术(也包含一些非微软技术)教学视频,可以在线观看,或直接下载。
相对于前面的三种语言,C#屏蔽了指针这个让初学者很困窘的概念,以C++和Java为基础,并从函数式程序设计语言和动态语言中吸收了大量的实用特性。尽管C#提供的语言特性数量不比C++少,但归功其语言设计者的努力和开发环境的强大,C#的语言复杂度被控制的相当低。

学习C#的问题:
运行第一个程序仍需要相当的努力。
微软变态的更新速度,致使你需要不断地学习吸收新东西。
单一平台,难以在微软以外的环境下进行开发。

学习C#的好处:
大量的学习资料,易用的开发环境。
C#是一门多范型(multi-paradigm)的语言,在学习C#的同时,你也在学习其它语言的编程模式,比如说C#里面的LINQ和高阶函数,直接映射了函数式编程里面的概念。
很容易利用C#编写一个大家都能用的Windows应用。
编写WindowsPhone App:尽管现在不火,但不代表它没有潜力。尤其是来钱的潜力。

入门
Programming C#:我接触这本书的时候还是C# 2.0,现在应该出到4.0了吧。系统而不繁琐的介绍了C#语言的各个方面以及常用的类库,值得入门一读。
Pro C# 2010 and the .NET 4.0 Platform:很好的入门书籍,尽管篇幅很大(1500页+),但可以选择性的阅读。后面的框架介绍(WPF、WCF之类)可以跳过,重点阅读前面C#语言及CLR环境部分。然后,根据自己的需要,选择性阅读(比如说要编写Windows窗体,就阅读Winform部分)。
LINQ to Objects Using C# 4.0:LINQ是C#提供的绝逼方便的语言特性,学习它有助于编写更紧凑易读的代码,此外也可以为函数式编程打一点基础。
Effective C# Series

提高
CLR via C#:任何学习C#的人都应细读的书籍,以C#语言为依托,讲述了.Net的基础——CLR中的各个技术细节,作者在第三版中增加了大量并发和并行的内容,非常值得阅读。
Framework Design Guidelines:微软内部的编码规范书籍,从基本的变量命名,到高级的API设计,一应俱全。
Essential .Net:相对于CLR via C#又向下了一个层次,更深入的介绍CLR,缺点是有些旧(讲的是CLR 1.1)。

Python

在推荐初学者编程语言的时候,除去人云亦云的C,剩下的以Python居多。事实上Python就是最好的编程入门语言,没有之一。
前面提到的C系列语言有一个共同的特点,就是从编写到运行第一个程序,往往需要相当长的时间,不仅要处理各种各样的语法错误,而且还要研究开发环境的用法,打了十余行,仅仅就是为了在一个黑布隆冬的一闪而过的窗口上打一行字。之后还要研究半天,为什么这个窗口闪一下就没了?
打个比方,学习弹钢琴,如果只能在正确的弹完整首曲子之后,才能听到自己弹的曲子,你觉着会有多少人能学会钢琴?
学习弹琴需要即刻知道按下这个按键的效果,学习编程也是一样,况且初学者,往往没什么耐心。
Python有效的解决了这个问题,安装了Python之后,打开自带的IDLE,可以非常方便的进行交互式编程,只要按下按键,你就会即刻看到效果。
同样的任务,C#和Python比较:

C#需要编写很长的代码来实现简单的功能,而且编译出错的提示也令人费解:啥是Identifier?

Python代码,一目了然。

就语法而言,Python提供的语法非常直观、简洁。无论是编写还是阅读,都有其它代码所不具备的美感(相比之下C++之流就是write-only,更别提Perl了)。就类库而言,Python的类库非常丰富,使用简单且功能强大。受益于list comprehension、lambda、closure等特性,python的表达能力极强,往往C++、Java需要上百行才能搞定的task,Python十余行就可以完成。

学习Python的问题:
难以编写图形界面
Python 2.x版本存在字符编码问题,此问题已在3.x中解决
缺乏官方的中文文档

学习Python的好处:
易于上手,可以毫无压力的编写自己的第一个程序
代码风格规整,语法简单优雅
同时支持procedural、object-oriented、functional编程范式

入门
Beginning Python: From Novice to Professional:尽管Python很简单,但系统的学习仍必不可少。相对于网络上的教材,这本书的内容更详细全面,且提供了10个实用的task,以便读者联系
Learning Python:注意,不推荐此书,萝莉啰唆,屁话极多。
Python Howtos:http://docs.python.org/howto/,源自官方的文档,均值得仔细阅读,每一篇文章介绍Python的一个特定的方面(包括函数式编程、正则表达式、网络编程等)。下面的文章为必读:
Idioms and Anti-Idioms in Python
Functional Programming HOWTO
Regular Expression HOWTO
Sorting HOW TO

Python in a nutshell:前200页简明扼要的介绍了Python语言,后面的600余页涉及Python库的各个方面,可作为案头的快速参考。

提高
PEP8 Style Guide for Python Code:事实上的Python的编码规范
Code Like a Pythonista: Idiomatic Python:编写更”Python”的Python
Python Cookbook:涉及到Python的各个方面,包含大量实用的Python技巧和trickz。此书第三版即将推出。
Python Enhancement Proposal:一系列Python的文档,其中包含Python的风格规范、改进建议、编程技巧等内容,挑选适合自己的内容阅读即可。
Python源码剖析+Python 2.7 Source Code:国人的良心之作,系统的注解了Python 2.5的源代码,深入了解CPython实现机制的必读作品。配合Python 2.7源代码阅读。

Scheme

不同于C、C++这些主流语言,Scheme是一门函数式编程语言(一些回复提到Lisp,Scheme其实就是Lisp的一个方言),尽管Scheme在国内的知名度很低,但它在国外,N多国外高校采用它作为入门编程语言(MIT的编程入门课6.001就选择了Scheme)。因为Scheme语法非常简单,10分钟内就能学会它的大部分。同时,类似于Python,Scheme也提供了一个交互式的编程环境,输入代码执行即刻就可以看到结果。
尽管Scheme语法已经非常简单,但MIT的几个教授为了用尽可能少的语法,教导学生学习编程技巧,编著了How to design programs这本书,与此同时,搭建了一个由浅入深编程环境drScheme,便于初学者使用。
之所以说drScheme是一个由浅入深的编程环境,是因为它里面包含了Scheme的若干个从初级到高级的版本。初级的Scheme环境下不包含高级Scheme特性,这样初学者就不会被莫名其妙的错误所困扰,从而可以专注于编程的技巧,而非语言的语法。
初学者学习编程的一大瓶颈就是理解递归,以及利用递归思想处理问题,Htdp这本书用了二十多章(超过全书一半的篇幅),讲解递归以及递归衍生的各个问题,并详细的阐述了如何利用递归解决实际问题。与此同时,Htdp的课后题也值得一做。

学习Scheme的问题:
大量的括号,反人类的前缀表达式(举例来说,1+2*3在Scheme里会写成 (+ 1 (* 2 3)) )。
学习资源很少,难以用它处理日常任务。
尽管functional的思想很前卫,但其并非当前的主流编程范式(当前的主流编程范式仍是procedural和object-oriented)。

学习Scheme的好处:
语法极其简单,即便零基础,也可以在10分钟内学会它的大部分语法。
拥有一个由浅入深的开发环境DrScheme,结合Htdp一书,由浅至深的逐步学习程序设计,可以获得非常好的学习效果。
所有的主流语言都在吸纳函数式编程特性,学习functional语言会让你站在更高的高度。

入门
How to design programs:绝好的编程入门书籍。前面已经介绍,这里不再赘述。从头读到尾,并完成书中的课后题,你会对程序设计有一个非常清晰的理解。

提高
Structure and Interpretation of Computer Programs:又名Sicp,MIT的程序设计教材,难度很高,其目的是在不教授语言的前提下教授你程序设计技巧。课后题道道经典,事实上,如果把此书的课后题搞一遍,基本通杀it公司的面试,即便是微软。

JavaScript

随着网络的普及,浏览器成为了个人电脑上使用率最高的应用;随着高速3G网络的普及和移动终端计算能力的增强,移动终端上的上网体验早已超越以前简单的链接文字,甚至与桌面上网终端不相上下。而JavaScript,作为统治浏览器端的语言,其重要性不言而论。
尽管JavaScript本身如此重要,但它自身却缺陷百出。为什么会是这样,还得从它的历史说起。
上个世纪末,也就是互联网爆发那阵,由于当时上网大多采用拨号上网方式,速度有如蜗爬,为了减轻服务器的负担,当时浏览器的统治者Netscape决定搞一个小语言,对网页的表单是否填写此类问题进行检查,编写这门语言的任务就落在了苦逼程序员Brendan Eich的身上。出自程序员的天性,Brendan才懒得从头搞起,他把Self的原型对象机制,Scheme的头等函数对象,Perl的正则表达式搅和到了一起,花了几天就弄出了这门语言,鉴于当时Java横空出世,大红大紫,为了跟风,Netscape就把这个语言命名为JavaScript,实际上JavaScript和Java完全不搭边。
之后,Netscape就被MS搞掉了,然后MS就懒得再弄IE了,反正竞争对手挂了(这也导致任何前端开发者提起IE6都会绝逼苦逼)。
总之,正因为浏览器标准的不统一,以及JavaScript语言本身的错误百出,直接使用JavaScript有如梦魇,因此没有哪个语言像JavaScript这般依赖第三方框架。学习JavaScript的话,必须要学会一个或多个第三方框架,对于初学者,推荐jQuery。
此外,由于JavaScript的绝大多数任务都是在操纵HTML节点或是CSS,了解HTML和CSS是很有必要的,这里推荐W3School的在线教程。

为了运行并调试JavaScript,你需要一个不错的浏览器(重点推荐Chrome,其次安装Firebug插件的Firefox)。

学习JavaScript的问题:
不同浏览器之间存在很大差异
必须学习一个第三方框架作为辅助
JavaScript本身错误百出(尤其是其诡异的等价规则,见下图)
weird.png

学习JavaScript的好处:
编写炫丽的网页
同时面向桌面终端和移动终端

其它好处:
聊天室踢人(不知道还有多少人记得聊天室这东东)
网络订票(12306.cn)

入门
W3School:提供了不错的在线教学,按照HTML->CSS->JavaScript->jQuery的学习顺序学习效果最佳。
DOM Scripting:很好的JavaScript入门教材,这本书的特色在于花了很多篇幅来讲解如何编写跨浏览器的JS,新版对jQuery进行了简要介绍。
Pragmatic JavaScript Guide:牢记前6个Tip,根据附录,学习JS的调试方法,并选择一个库,然后阅读后面的Tip。

提高
JavaScript the Good Parts:绝逼狠的JavaScript书籍,全是干货,一句废话没有,需多读。
Professional JavaScript for Web Developers:中文名为JavaScript高级教程,全面细致的介绍了JavaScript的各个方面,以及语言的内部机理,深入理解JavaScript的必读物。
High performance JavaScript:书如其名,介绍了一些提升JavaScript性能的方法。

Regex

Regex即正则表达式,REGular EXpression的缩写,以下简称正则。
严格来说,正则不算一门编程语言,因为除了操纵字符串文本,它啥都搞不了。但在实际使用中,短短的一行正则,往往可以起到数十行甚至上百行程序代码的效果。
举一个简单的例子:搜索诸如“高高兴兴”,“开开心心”此类的词汇
不用正则的话,几乎无从下手,编写程序又得花很长时间。
使用正则的话,只需要输入 ((\w)\2){2} 就能定位到所有词汇。

regex.png

所有的主流编程语言和所有的主流文本编辑器,你都会看到正则。会用正则和不会正则,处理文本,完全是天上地下的区别,即便你并非程序员。

还是刚才的例子,比如说我有个文件file,需要统计里面诸如aabb此类词汇的数量。
在OS X或是其它Unix环境下,输入 perl -n -e ‘print if /((\w)\2){2}/’ file | sort | uniq | sort -nr > report,就可以直接找出file中的所有词汇,进行归并,统计出现的次数,按次数从高到低排序,然后把统计结果输出到report文件。

无论什么样的工作,一行搞定,这就是正则加管道的威力。

学习正则的最好的工具就是RegexBuddy,请自行寻找下载。
顺便推荐Sublime Text,Windows下面异常方便的文本编辑器,支持正则,自带python console,方便的一塌糊涂。

学习Regex的问题:
需要花时间适应其诡异的语法
不同语言的Regex之间存在差异

学习Regex的好处:
学习曲线很短,但收效奇高
大大提升编辑、搜索文本的效率

入门
正则表达式30分钟入门教程:国人编写的正则表达式入门教程,我就是从这篇文章入门的,适用于.Net。
Regular Expression HOWTO:Python版的正则表达式入门教程,位于python.org。

提高
Mastering Regular Expressions:正则表达式的权威书籍,从里到外把正则表达式剖析的清清楚楚,并包含Perl、Java、.Net和PHP这四大平台的正则表达式使用指南。深入理解正则必读。

作者: figure9@hi-pda.com
作者博客: http://lucida.me

转载请注明:一秒钟的梦 » [Discovery] 聊聊编程语言的选择和入门及提高,电工及想学习编程的进,已更新JS和Regex 作者: figure9@hi-pda.com

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址