聊聊编程语言的选择和入门及提高,电工及想学习编程的进,已更新JS和Regex

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


    经常看到编程入门求助或是编程语言选择这样的帖子。我试图用这个帖子来解决这类问题。
    从07年完成了第一个5k行+的项目到现在,差不多有五年的开发经历,其中用过的语言大概十来种,读研后,自己也写过两个实验性的编程语言,因此对编程语言还算有些了解。解答一些编程入门者或是语言纠结者的困惑应该没问题。
    下面,我把我觉着不错的、或是很主流的语言挑出来,然后一一评价,然后给出这些语言的学习方法。最后,给出推荐阅读书单,均为良心推荐,无须怀疑
    这里再多下嘴,其实学编程,无非就是看书动手仿代码
    1,从书里面学习理论
    2,完成书上的练习,编写满足自己和他人需求的程序
    3,阅读优秀的代码并仿照甚至超越。
    当然,如果仅仅是兴趣并非职业,那么能够编写满足自己需求的程序就已经相当不错了。
    接下来介绍的语言包括:C、C++、Objective-C、C#、Python、Scheme、Haskell、JavaScript、Regex
  • f
    figure9
    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,学习如何编写工业级代码。
  • f
    figure9
    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
  • t
    ticat
    马克,另外Regex是什么语言?
  • _
    _Jm
    感谢楼主的无私奉献
  • s
    shannon_sdu
    占位xiao习,当年c都没学好,面向对象的就更甭提了
  • M
    Mario.L
    没插楼把?LZ你是我的savior~谢谢
  • R
    R32
    正则表达式
  • 大青山
  • b
    byelims
    搬把凳子听讲座
  • i
    ishmael
    严重关注中⋯
  • w
    westup
    继续啊,怎么没有php、java这样的语言
  • z
    zibbo
    搬把凳子排队听讲座
  • p
    pepsin
    唯一熟练的两门语言楼主都没说, Ruby Java。

    不过这两个抽象程度太高了,导致哪怕写出几个程序了对于计算机是怎么运作的估计都不清楚
  • s
    sakjsak
    这个我需要马克一下。
  • q
    qty51confdnt
    拜读下
  • f
    fire_3c
    一期么?关注.
  • 金陵老游侠
    马克一个
    语言只是工具,学专两三种即可,其他的触类旁通,看应用选合适的吧
  • s
    slv
    我很奇怪,既然有涉及到计算机专业,为什么没有ASM?
  • k
    kkzxak47
    好帖要mark
  • c
    caisy
    想学编程 需要什么基础?
  • c
    codewarrior
    学好ANTLR~~
  • d
    dgv036
    一期mark...
  • o
    onexz
    想写植物大战僵尸或者愤怒的小鸟,该学会什么?
  • 涤烦子
    这个必须马克
  • R
    R32
    我觉得#2说的很好,要想很快拥有编程的成就感,学C#是最佳选择
    地球上最容易上手的IDE,类C语法,丰富的lib,让你快速的编写出看得见摸得着的应用程序
  • m
    mikylu
    占位占位。。。。。
  • f
    figure9
    Python


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


    csharp.png

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

    python.png

    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源代码阅读。
  • b
    beyond923
    现在要学习,就html5吧,chrome市场有用这个编写的游戏,有rpg,也有类似愤怒的小鸟这样的。
  • w
    webkid
    mark学习
  • 0
    0117
    想做专业电工就学c,否则就学java,其它的都是看应用场合
  • b
    bigbing
    曾经想当个程序员的人儿马克
  • o
    onexz
    回复31#beyond923


    这个html5也能象PHP一样写个论坛什么的么?
  • 踏雪无痕
    mark一下,楼主请继续...
  • y
    yp99974600
    现在能用上ASM的还真不是计算机专业,自动化、电子之类的反而多点。
  • t
    tuzky
    C+确实已经很值钱了。。
  • f
    figure9
    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公司的面试,即便是微软。
  • s
    siweilinux
    大学学过c
  • 0
    0117
    单片机也是计算机好不好
  • y
    yp99974600
    当前口语中泛用的“计算机专业”一般指CS好不好?
  • 0
    0117
    只有C++才能派得上用场的项目相对太少了
  • 有点搞笑‘
    现在只会c的初级伪电工路过~
  • y
    ysr1023
    看看 占位
  • 禾唐笑枫
    占位听讲座
  • m
    monkeyfunc
    MARK一下,虽然没什么天分,看哪天学一下,说不定也可以当当码农,嘿嘿。
  • s
    shangyu7
    学习一下
  • 死亡小号
    一期占位。