我对编程/计算机科学的一些看法和经验

软件和网站开发以及相关技术探讨
头像
anticlockwise
帖子: 2394
注册时间: 2007-03-01 20:46
来自: 湖南长沙

Re: 我对编程/计算机科学的一些看法和经验

#16

帖子 anticlockwise » 2009-03-02 18:34

pypcjs 写了:
anticlockwise 写了:一直没能闲下心来写这个,不过还是想写写底层/基础的东西。我个人很喜欢Java和Python,所以写一些Java/Python相关的常用问答,然后以这两门语言展开吧。

关于CLASSPATH
看到论坛里有这样那样的关于CLASSPATH的问题。的确,我见过的关于Java的书有些都不会细讲Java的CLASSPATH,而CLASSPATH又恰恰是学Java时最需要了解的东西之一。所谓CLASSPATH,其实就是指向Java Class的路径。学过Java的人都知道Java的基本执行单元是类,而它是如何找到他所需要运行的这些类呢?无非就是通过CLASSPATH。

CLASSPATH可以是一个目录,目录中包含包结构的.class文件,也可以是某个jar文件。有人问,我下载了一个jar文件,应该放在哪里我才能够调用其中的类呢?随便,只要你的CLASSPATH指向了那个jar文件就行。

指定CLASSPATH的方法主要有两种:1. 设置CLASSPATH环境变量;2. 如果你只是想执行一次这个CLASSPATH里边的Java类,可以用java命令的-cp参数。

编程环境
关于编程环境,我一直认为刚开始学请不要用Eclipse,因为它臃肿、花哨(让你不认为你在学Java)。我认为刚开始就是应该用最简单的 文本编辑+命令行:
1. 这样你能知道程序是怎么样得到的,其实源程序只不过是一堆字符。我看到网上很多人(甚至研究生),当他们没有集成开发环境的时候,他们竟然不知道怎么样打开源程序!!
2. 你可以接触到命令行的世界。我的帖子是针对”计算机科学人员“,而”计算机科学人员“,我认为是必须知道命令行的。我不是说图形界面不好,但作为一个现在的计算机科学人士,试着懂得命令行的巧妙是很重要的。
3. 当你理解了Java程序是如何编辑和生成,并且理解了CLASSPATH,我建议你看看Ant (http://ant.apache.org)这个工具。这是一个能够让你编程效率提高的工具。当然,学习这个工具是需要更多的知识,例如XML,但这也是学习过程中的其中一步。
4. 除了Ant这个工具之外,还有Maven (http://maven.apache.org)。Maven的好处在于它能够帮你管理你项目中的依赖。例如你如果需要某一个Java类库,可以在你项目的Maven配置文件中说明,然后Maven会帮你自动从它的源中下载。

如果你觉得你已经熟悉了Java编程,那么你可以试着用用Eclipse之类的IDE。这些集成开发环境还是有他们的好处。例如Eclipse,即使编译+错误显示,代码格式化,自动导入等等。所以至今,即使我编辑代码使用的是Vim,但其实是用Vim作为编辑界面,和后端的Eclipse服务器通信,调用Eclipse的许多功能。我用的是一个叫Eclim的插件。至今,我还是喜欢写Ant文件(我有自己可以重用的Ant文件),喜欢用Vim编辑代码,然后用命令行来编译、调试和运行代码。

只学Java不行!
每个程序员都不会只知道一种语言,只知道用Java写代码不行~~只看或者只学Java相关的东西会使你的编程思想过于局限。编程语言非常多,应该多看看,多学学,知道你所用的语言的优点和缺点。我喜欢用Java,不过并不是任何时候都用它,因为有些时候,我并不需要面向对象来完成我所需要的功能。这时我会用Python,几行代码就能完成,甚至用Shell~~Python,如同其他脚本语言,优点在于它能使你快速开发出程序的原型。有了原型,程序在你脑中的构架就会更加清晰。有了清晰的程序构架,如果真的有必要,你可以采用面向对象的思想开始设计你的整个系统。

Java语言里其实还缺少许多有趣的特性,而这些特性在类似Python这样的动态语言中就会体现出来。例如 方程的方程/高阶方程/Lambda Calculus,函数式编程,List Comprehension(Python特有的)。解除更多的编程语言,你的思想会慢慢的提高,不过也要注意不要产生混淆。更有趣的编程语言是Haskell,这们语言是一门完全的 函数式编程语言,即它的所有都是由函数所实现(它最有趣的一点就是:没有循环结构),呵呵,如果想了解,就去Google搜吧~~

不光是更多的编程语言,学习某种语言时所付带的知识也非常重要~~例如,当你学习写Web程序时,就会需要去了解HTTP,当然也会要去知道HTML、CSS、Javascript(不可能任何时候都让别人帮你制作网页吧,哈哈)。

学会搜索
信息检索其实是非常重要的一门知识,但我在大学的时候似乎没有被太重视,而且是一门选修课。如何知道关键词,是需要经验的,不过首先你必须清楚你的需求是什么。

理论知识
其实这个我觉得不需要多说,谁都知道理论知识的重要性。学计算机,首先就是看你数学功底如何。数学不好,稍微复杂一点的算法就不能理解。我研究生读的是人工智能,主攻自然语言处理。学到的无非还是数学,Bayes Network, Principal Component Analysis, Hidden Markov Model等等这些经典的模型、分析方法和算法都离不开深厚的数学功底。计算机基础的数学有高等数学,线性代数,概率统计,离散数学,组合数学,这些数学的知识不论是在实用中还是思维培养上都有很大的影响,所以必须学好~~

多写、多看
也许这是学编程最重要的一点。多写,就是让你多写代码;多看,就是让你多看资料。多写代码,很多大学生会想,我写什么。的确,刚开始是没什么好写,因为编程思想都没有形成,语法也不熟。给你们一条建议:如果想学编程,对编程感兴趣,不妨把大学的课程当成写程序的实践,用程序来写作业~~其实吧,也许也没那么多的时间,不过如果有,这样做还是不错的~~也不用拘泥于给课程写程序,只要是日常生活中你觉得需要解决的问题,而又能用程序解决,其实都可以作为写代码的机会。

多看,这是我想说的。四年大学下来,如果对计算机科学真的感兴趣,你看的东西绝对不比你人矮~~看的资料包括:计算机理论知识、各种教程、计算机新闻、计算机博客、别人的源代码、各种算法/类库/技巧。这么多的东西大学能看完?我说能,而且我认为很多人都这么做了(至少我这么做了,哈哈)。大学里边最好的地方是哪?图书馆(不论是找MM还是学习 :em09 )!

有一点,我认为也许也比较重要:看英文资料。这样,你可以获得更多的资讯,可以学习另一门语言。刚开始看英文资料的确有些痛苦。对于我来说,看英文的资料可能比较简单,因为我初中在英国渡过……但我还是看到我的几个大学朋友(本人一年前年在国内大学毕业,现在国外研究生毕业……)都在看英文资料,而且后来都非常顺畅。在这里,我推荐几本Java和Python书吧:
1. Java How to Program/Advanced Java How to Program(主要是它的练习不错)
2. Thinking in Java
3. Java Tools for Extreme Programming: Mastering Open Source Tools, Including Ant, JUnit, and Cactus
4. Java Design Patterns Applied
5. Refactoring to Patterns
6. Dive into Python(网上有)
7. Learning Python

其实好书实在太多,这里介绍的也只是我认为Java/Python这两门语言的书籍中对我有过帮助的书籍。至于网上的资料,那就更多了,在这里也介绍几个Java和Python相关的网站吧:
1. Google,哈哈,这可是百科全书,任何时候我需要什么东西都会用到
2. Apache Opensource Foundation (http://www.apache.org),许多优秀开源库/工具的家,例如Ant, Maven, Struts, Jakarta Commons, Velocity
3. The Serverside.com (http://www.theserverside.com),Java服务器端的网站,许多新闻,有一些好文章
4. Java.net (http://www.java.net),Java社区,博客不错,可以学到不少技巧
5. ActiveState Python (http://code.activestate.com/recipes/langs/python/),学习写Python代码的好地方,许多实用的例子
楼主的总结实在是不敢恭维。
1、不使用eclipse这样的IDE工具,只使用文本编辑器。
照你这么说,那IBM跟其它公司的钱是白花了。
对于一件事来说,干完成它是它的最终目的,使用IDE可以节省好多时间,百益无一害。不要跟我说用文本编辑器写的helloworld程序跟用IDE写的helloworld程序牛B的多。
2、只学java不行。
java大而广,IO,网络,线程等等方面的知识。用java写了一个helloworld程序,而又使用python写了一个helloworld程序,又有啥好说的呢。

一来就经验,看得恶心。
首先,我只是想写写我自己的感觉而已,如果让你觉得恶心,那抱歉了~~不过还是请你认真的看好我的帖子再说

1. 我没说不使用Eclipse这样的IDE工具,我在文中也说了Eclipse的各大优点,我当然也知道IBM这样的大公司的工具不会是乱盖的。但是,对于新手来说,一上来就使用IDE,你觉得合适吗?而且你用过VIM吗?用过ECLIM吗?光在文本编辑方面,Eclipse的确是没有类似VIM和EMACS这样的编辑器强。

2. 只学一种语言当然不行。光就语言本身来讲,你不能说JAVA大而广。通过学习不同的语言,我们可以学到不同的编程模式,不同的编程思想。学一门语言又不只学它的语法和库而已。例如Python、Ruby和Perl这样的脚本语言,在快速开发的时候,我写一个程序在几十行就能够构架出一个原型,这样一下就能看清楚程序的整体,这又何尝不可呢。再说,脚本语言里的各种语法结构都是值得我们参考的,例如这些语言里边都含有高阶函数/Lambda Calculus,还有就是Closure,在Java 7的开发中,也准备加入这些元素,难道不重要吗?
再说,不同的语言有不同的应用场合,例如Erlang,适合于云计算;Haskell,是和我这种研究的;Javascript,在网络客户端方面,它最强。当然,这些语言都是按照需求 才去学习的,如果真的有兴趣,是应该多去看看,融合多种思想,何尝不可~~
光学JAVA,只能将你禁锢,发展空间太小了~~你如果想说JAVA库很多的话,发展空间很大的话,呵呵,库是各种语言都可以实现的,不叫做发展空间~
beckharry
帖子: 1
注册时间: 2006-09-21 11:22

Re: 我对编程/计算机科学的一些看法和经验

#17

帖子 beckharry » 2009-03-03 16:17

辩论挺激烈的~
继续,受益良多。
头像
WenBin
帖子: 34
注册时间: 2007-02-15 18:14

Re: 我对编程/计算机科学的一些看法和经验

#18

帖子 WenBin » 2009-03-12 14:04

我现在是大四,正在实习,以前自学了java。后来给我们上课教java的是个外教,他跟我们讲时,让我们用记事本去写java,原因嘛,ide是给你提升效率的(代码提示,自动补全等等),基础的东西你一定要会,否则你脱离了ide就不会写代码了么?

编程语言不能束缚程序员的思想,面向对象的语言都差不多,想不会几种都难。
头像
lerosua
论坛版主
帖子: 8455
注册时间: 2007-11-29 9:41
联系:

Re: 我对编程/计算机科学的一些看法和经验

#19

帖子 lerosua » 2009-03-12 14:53

anyway, 分享经验总是好的。 :em03
头像
anticlockwise
帖子: 2394
注册时间: 2007-03-01 20:46
来自: 湖南长沙

Re: 我对编程/计算机科学的一些看法和经验

#20

帖子 anticlockwise » 2009-03-12 19:02

WenBin 写了:我现在是大四,正在实习,以前自学了java。后来给我们上课教java的是个外教,他跟我们讲时,让我们用记事本去写java,原因嘛,ide是给你提升效率的(代码提示,自动补全等等),基础的东西你一定要会,否则你脱离了ide就不会写代码了么?

编程语言不能束缚程序员的思想,面向对象的语言都差不多,想不会几种都难。
恩,是的,刚一开始用的应该就是文本编辑+命令行,这样才是真正学一门语言,如果一开始就用IDE,学的不是语言本身,而是如何用IDE~~这就是我在文中所提倡的,而且也一定要试着用用类似Ant这样的工具。

编程语言的确不会束缚程序员的思想,不过如果只学只看一门语言的话,就会使得你的思想禁锢,这是我个人的感觉~~面向对象语言的确差不多,不过都会有自己特点的。而且,这个世界上不光有面向对象语言,也没有人说面向对象语言就是最好的,把眼光放开,去看看各种语言,我们就能从各种语言中学到他们的精髓,知道这些精髓的用处,这些在解决问题的时候其实都是非常有用的~~ :em03
poet
帖子: 2841
注册时间: 2006-09-11 22:47

Re: 我对编程/计算机科学的一些看法和经验

#21

帖子 poet » 2009-03-12 20:04

xhy 写了: 中文版英文我觉得是无所谓的事情,重在理解思想,即使翻译得不好,自己心里清楚是什么意思就好
反对这个观点,很多中文版根本无法看懂,不对照英文原文完全不可能明白写的是什么意思,当你花了很多精力再回来看的时候才发现如果一开始就只看英文版可以少走很多弯路。

在计算机科学领域,中文英文绝对不是无所谓的,中文版只能看那种翻译质量非常上乘的,非常经典的版本,除此之外80%以上的书只能看英文版,中文版几乎是没法看懂,没法保证不误人子弟的。
poet
帖子: 2841
注册时间: 2006-09-11 22:47

Re: 我对编程/计算机科学的一些看法和经验

#22

帖子 poet » 2009-03-12 20:15

WenBin 写了:我现在是大四,正在实习,以前自学了java。后来给我们上课教java的是个外教,他跟我们讲时,让我们用记事本去写java,原因嘛,ide是给你提升效率的(代码提示,自动补全等等),基础的东西你一定要会,否则你脱离了ide就不会写代码了么?
编程语言不能束缚程序员的思想,面向对象的语言都差不多,想不会几种都难。
用文本编辑器不等于让你去用记事本。

不论用什么编辑器,基本的自动缩进/语法着色还是必须的,这可以使你养成良好的编程习惯。而记事本显然不能满足这个要求。直接用vi要好得多

我认识很多代码很糟糕的人,他们最初编程就是从一个不能很好支持自动缩进和全文排版的编辑器来的。这会对团队合作带来很多麻烦。

坦白的说我很不喜欢 Java ,但是实际上它比较实用,因为这个在欧美相当流行。英国大学普遍学它,这个我是知道的。使用 Java 相对来说比C/C++能够让你把更少的精力花在钻研语言上,而把更多的精力花在编程上。

不过如果对编程/计算机科学要有全局观的发言权的话,C的基础,尤其是指针操作,字节流操作的技巧还有熟悉任何一种RISC架构的汇编,是必须的。(x86汇编没有太大的学习价值)

一个程序员至少应当掌握6种语言:C, Java, Python, perl, lisp, xml/html. 这个很多大牛已经说过,我就不再重复了。
头像
anticlockwise
帖子: 2394
注册时间: 2007-03-01 20:46
来自: 湖南长沙

Re: 我对编程/计算机科学的一些看法和经验

#23

帖子 anticlockwise » 2009-03-12 21:50

poet 写了:
WenBin 写了:我现在是大四,正在实习,以前自学了java。后来给我们上课教java的是个外教,他跟我们讲时,让我们用记事本去写java,原因嘛,ide是给你提升效率的(代码提示,自动补全等等),基础的东西你一定要会,否则你脱离了ide就不会写代码了么?
编程语言不能束缚程序员的思想,面向对象的语言都差不多,想不会几种都难。
用文本编辑器不等于让你去用记事本。

不论用什么编辑器,基本的自动缩进/语法着色还是必须的,这可以使你养成良好的编程习惯。而记事本显然不能满足这个要求。直接用vi要好得多

我认识很多代码很糟糕的人,他们最初编程就是从一个不能很好支持自动缩进和全文排版的编辑器来的。这会对团队合作带来很多麻烦。

坦白的说我很不喜欢 Java ,但是实际上它比较实用,因为这个在欧美相当流行。英国大学普遍学它,这个我是知道的。使用 Java 相对来说比C/C++能够让你把更少的精力花在钻研语言上,而把更多的精力花在编程上。

不过如果对编程/计算机科学要有全局观的发言权的话,C的基础,尤其是指针操作,字节流操作的技巧还有熟悉任何一种RISC架构的汇编,是必须的。(x86汇编没有太大的学习价值)

一个程序员至少应当掌握6种语言:C, Java, Python, perl, lisp, xml/html. 这个很多大牛已经说过,我就不再重复了。
恩,我的观点和你基本一致,只是最后一项,不能说至少“掌握”(也许我对”掌握“的理解和你不太一样),我觉得这些语言里边,Python和Perl不需要全部掌握,因为都是动态语言,精通一门就行了,只是可以借鉴两种语言的特点,学习其中的精髓~~LISP我并不觉得每个人都需要掌握,这要看情况了,如果真的必须用或者感兴趣,那么可以去掌握,否则了解一下就好了。如果真的是做人工智能或者专家系统的话,PROLOG和CLIPS都行~~XML和HTML的确都需要知道如何使用~~
回复