2005-1-14 09:21
loranrowe
挖个坑,嗯~~
发信人: Dieken (风催草低), 信区: Programming
标 题: 为什么编程入门不要从Java,Python,Delphi,C++等开始
发信站: BBS 水木清华站 (Thu Jan 13 18:58:56 2005), 站内
(浮躁的人总是有的,这篇文章应该还有用处)
为什么编程入门不要从Java,Python,Delphi,C++等开始
//这篇东西是给想做程序员的人写的,是给乐于编写代码的人看的,
//如果你只想弄弄HTML, ASP之类弄个网页就了事那就不用看了。
//最适合的就是刚开始学习编程的xdjm们,呵呵。
//申明:我不是反对OO, Pattern, C++, Python, Java, C#等等,
//相反,我都喜欢,呵呵。
前几天重读Eric S. Raymond的How to become a hacker,看到
他推荐编程入门选用Python,突然觉得很压抑,有了些想法。
我建议编程入门的人学C或者Pascal,如果够狠的话可以用
汇编语言,用这些语言的目的是更清楚了解底层。
下面针对一些支持选用Java, Python, C++(指用了非C特性的C++)等
高级的OO语言入门的人可能的原因作些说明。
1. Pascal, C太老了,过时了,平时用得很少,现在流行Java等等。
标准Pascal的确是比较老了,不过有Delphi后继呢,说C老恐怕就是
无知了,C现在用得很广泛,似乎sourceforge.net上的项目还是C的最多。
推荐Pascal不是因为Delphi。
选择Pascal, C是觉得两个现在很常见,语法很有代表性,简洁明了。
不要动不动觉得什么东西过时了,COBOL还有OO版本面世,还有FORTRAN,
LISP,好古老的语言吧,现在还用得很广呢。
2.入门要从OO开始,培养用OO方式思考的习惯。
首先要说明,OO是方法,不是语言,初学者一入门便摆弄Java, Python, Delphi
等很容易形成误解,似乎OO=Java, Python, C++...
其次,过程式语言(或者说结构化方法)的精髓不会消亡,OO里面也不可能
摆脱掉一条条的语句、函数调用,结构化方法还是需要提倡的。OO方法不是那么
容易学会的(OO语言的语法弄得很熟练不代表你懂OO),而结构化那套方法,自个
写个千把行的程序就很能体会了,我是说写个实用点的东西,比如试着自个实现
一些数据结构和算法,写几个小游戏等。写个一千行Hello world等于没写。
我觉得方法是实践中体会出来的,不是看看书就能学会的,你看Design Patterns
等把模式背的滚瓜烂熟很可能会陷入过度设计的泥潭,你写了几千行代码,然后再
去读一读,改改调试调试,慢慢增加功能,你就会发现自己代码写的有多么臭了,
然后看看书听听别人意见你就知道什么叫Best practice了,最好的经验就是在
焦头烂额之际得到的。
过程式语言的代码一般比较简练,我们编程序最终的目的是要解决问题,是要计算,
是要获取信息,不要被OO, pattern, EJB, Web Services等迷糊了(我不是反对这些技术).
强烈建议各位多读代码,你去看看莱昂氏的那本UNIX v6源码分析,仔细看,慢慢看,你就
能体会到什么叫精致的代码了,然后尝试按照那个风格写代码。
3.过程式语言弄久了,很难转入OO的思维模式。
我以前也没有深想过这个理由,不过时间久了,发觉自己不过是把数据和方法集中在一起
而已,看着方便,其实有很多不合理的东西,这里头就需要OO的理论指导了,还是需要时间
来体会。我相信有很多用OO语言的人也不过是在框架里头添添代码,调用来调用去而已,把
类当作数据和操作的打包器。
个人觉得只有在用过程式方法做了十来年,编码上十万行后才有思维定势,难以习惯用OO的
眼光看待系统,然而这个转变,我仍觉得比改变一个人的恶习容易许多。
OO方法不是学了个Java, Python, C++等就能掌握的,需要实践,需要时间。
过程式语言也容易培养一个人严谨的做事态度,比如用Pascal, C等写代码,没有namespace,
没有function overload, 没有reference(Pascal有,呵呵,我喜欢),没有template, 没有
exception, 你要花很多心思处理一些细节,比如警惕数组索引越界,悬挂指针,野指针等等,
请不要觉得麻烦,这个就是计算机啊,底层就是这样的啊。
4.别用C, Pascal了,看我用Java, Python, Delphi, CB, VC等轻轻松松就写了个PP的GUI,
NB的分布式应用...
这篇文章是给初学者看的,也可以给一些浮躁的人看看(我也反省,呵呵),初学编程的人
精力应该放在数据结构、算法上面,尽量多看一些底层的东西,数字逻辑,操作系统,编译
原理,计算机组成、体系结构,计算机网络等等基础知识。
编写GUI拖几个控件有什么好吹的,你懂界面设计的原则么,你知道窗口消息怎么回事么,你
编的界面是把易用放在第一位呢还是把漂亮放在第一位呢,你的GUI程序容易修改吗?比如我
一会要加个button,一会去个listbox,你会不会改的疯掉呢?你是不是在OnClick里头写了大段
大段的代码,做类似“从edit1.text中去掉不是数字的字符,搜索xxx再转成16进制,再复制到
edit2.text”的事?
嗯,你socket弄得熟练,recv来,send去,可是如果你不懂tcp/ip协议那就有点可笑了,除了
用别人做好的函数库你还能搞出什么新花样?弄分布式应用的知道“分布式”怎么回事吗,
你是否只是在用API堆砌代码呢?倘若有一天这个函数库没人支持了,你是不是就傻眼了?
比如编游戏,没看过3D图形学便搞DirectX,也是比较可笑的。
我并不是说你编比较高层的东西就必须先得透彻了解底层怎么实现的,我只是建议你好歹把
底层的东西混个脸熟,遇到问题时心里有个谱,查查资料,别动不动扑某个论坛求救。以前
在BBS上看到某人的话,说BBS不是学习的地方,是开拓眼界的地方。深以为然。
学习还是找纸版的书老实的看比较好,想想你积攒了多少电子书而又看了多少。
底层不了解,仅多也就飘在别人上头,别人一闪身,你就得摔下来。
初学编程的人一来就IDE, GUI, Network啥的猛搞,能不浮躁么?还是沉下心来研究一下
基础知识吧,我以脑袋担保你有生之年会觉得他们有用的(呵呵,你转行我就没辙了),别看着
别人弄JFC, Socket了你还在头大这个quick sort怎么就不对呢就心里惶惶的,你要知道在一批
API不被支持后不少人心里空空的没个着落:天啊,我除了那个就啥都不会了,郁闷啊,花了我那
么久时间钻研那套API,呜呜。。。。
5. C好难啊,我入门还是从Java,Python开始吧
首先,是自个要做程序员的吗?是想编程还是想赚钱啊?
其次,我们来比较一下难易:
C: k&r那本书真的不算厚,经典的C的书很少,说C难,大概是传说中C的指针很难吧,
C的语法很简明的,就是指针,只要你认真看看书,写几个程序试一试,那几个指针的用法
不难掌握,另外大家千万不要去死钻*++ ++*之类的语法,关于这点在《开发高手》最后一期
上裘宗燕老师有一篇精彩的文章。大家记住写代码是要维护的,别耍弄语法技巧给自己或后人
制造麻烦,你想想自己看别人写的天书代码是赞叹还是咒骂?
Java: 书太多了啊,就说Gosling(没拼错吧)那本,相当厚,学Java的人一开始都被classpath和
package的问题烦过吧,还有Java的关键字,语法,Sun鼓捣出来的一堆堆Java技术名词,是不是
有点晕了?
C++的确有难度,你可以看看C++语言的设计和演化,就可以知道C++怎么这个德行了,呵呵。有意思
的是Java现在加入模版,而且因为伪模版的实现被人诟病,还有那个EJB的转变,有意思,大家
可以思考一下“复杂”、“实用”这些词。
Python的确比较清爽,不过深入一点后其内部对象模型也不简单,想想操作一个列表有多少方法,
各种功能强大的操作符,而且现在的OO语言逼着你OO, 结果往往是语法OO而已,没多大新意,我
还是欣赏Perl, C++这类语言,你想怎么就怎么,重要的是要用合适方法,趁手的工具,最少的时间
做有价值的东西,把你钻研语言的语法的时间拿来锻炼一下身体,泡杯茶看看小说我觉得更好一些。
[color=red]语言只是表达思想的工具,不要只局限于一种语言,不要狂热于某一门语言。[/color]
学编程时选书最好先看一看书中的代码,是取自实际应用中的吗?写的漂亮吗?(指代码自身的
精致,以及排版是否工整)代码中有语法错误吗?(鄙视某些没编译试试就把代码copy到书里的
作者)
有本Essential C#,取的是.Net类库的代码,很棒,讲delegate(希望没拼错,好久没弄这个了)
时举的例子很清楚地让人看到这个东西该怎么用。
另外推荐Learning Perl,我个人觉得是我看过的最好的关于编程的书,该讲什么,不该讲什么,
按什么顺序讲,很好,也许是Perl的精神的感染吧,当初看这本书很有震惊的感觉,原来程序
设计语言还可以这么使!爽!
断断续续写了这么长,xxx的xx布,又x又长,呵呵,希望大家踏实一些,不要浮躁。
2005-1-14 10:51
kingofworl
oo是何意
2005-1-14 10:59
loranrowe
[quote]原帖由[i]kingofworl[/i]于2005-01-14, 10:51:02发表
oo是何意 [/quote]
object oriented
国内一般译为面向对象
2005-1-14 11:12
Maxwell
文章的面向对象应该是hacker,那样的话我赞成这个观点,如果只是想会编程,没有必要搞得这么麻烦,分清自己到底想到什么层次再决定怎么学。
2005-1-14 11:15
kingofworl
[quote]原帖由[i]loranrowe[/i]于2005-01-14, 10:59:33发表
object oriented
国内一般译为面向对象
[/quote]
惭愧,竟然没反应过来
2005-1-14 11:15
金圭子
非常同意maxwell的观点…………
不过maxwell还有另外两位版主有没有想过在这个版面开科普课的想法?
还是任其自然?只做“已经在学的人的回答”?而不是主动去教??
不过看上次我的帖子的回复,我感觉似乎是后者。
2005-1-14 11:25
Maxwell
[quote]原帖由[i]金圭子[/i]于2005-01-14, 11:15:58发表
非常同意maxwell的观点…………
不过maxwell还有另外两位版主有没有想过在这个版面开科普课的想法?
还是任其自然?只做“已经在学的人的回答”?而不是主动去教??
不过看上次我的帖子的回复,我感觉似乎是后者。 [/quote]
惭愧惭愧,初级的教学文章就写了一篇,因为水平问题还有缺乏足够的时间思考整理思路,一直没继续下去,这也要怪无翼 写单篇文章好写,他非要我写连载,不过我争取过年前再拿出两集来吧
2005-1-14 11:32
Maxwell
[quote]原帖由[i]金圭子[/i]于2005-01-14, 11:15:58发表
非常同意maxwell的观点…………
不过maxwell还有另外两位版主有没有想过在这个版面开科普课的想法?
还是任其自然?只做“已经在学的人的回答”?而不是主动去教??
不过看上次我的帖子的回复,我感觉似乎是后者。 [/quote]
想起个问题来,金兄不也要科普吗,金兄也快点筹划,我等着看呢
2005-1-14 11:35
loranrowe
[quote]原帖由[i]Maxwell[/i]于2005-01-14, 11:12:58发表
文章的面向对象应该是hacker,那样的话我赞成这个观点,如果只是想会编程,没有必要搞得这么麻烦,分清自己到底想到什么层次再决定怎么学。 [/quote]
说明一下,这篇帖子发在水木的programming版
面向的对象是程序员
我转过来,一者因为它比较新,二者想借此以说明
基础一定要打好...
至于手段是什么,可以见仁见智
2005-1-14 11:44
Maxwell
水木的programming版水平有点超出程序员的。我不太赞同一切都要懂底层,其实不是越底层越代表水平高的,如果下定决心一辈子做应用软件,底层的东西基本可以不学的,只要把自己涉及到的领域研究透就可以。
打好基础是非常重要的,不过不一定底层的东西才是基础。一上来学java并无大错,不过现在一般流行搞明白语法就行了,不去学习oo的思想,这种是要不得的。
2005-1-14 11:54
kingofworl
我个人理解作为在别人提供的工具基础上二次开发的程序员,似乎没有必要太研究底层的基础原理
2005-1-14 12:50
kingofworl
有个小问题在这里问一下,定义变量 link 是不是以后就可以直接使用link[]数组了,所有开发工具都支持这样吗
2005-1-14 18:44
金圭子
[quote]原帖由[i]Maxwell[/i]于2005-01-14, 11:32:52发表
[quote]原帖由[i]金圭子[/i]于2005-01-14, 11:15:58发表
非常同意maxwell的观点…………
不过maxwell还有另外两位版主有没有想过在这个版面开科普课的想法?
还是任其自然?只做“已经在学的人的回答”?而不是主动去教??
不过看上次我的帖子的回复,我感觉似乎是后者。 [/quote]
想起个问题来,金兄不也要科普吗,金兄也快点筹划,我等着看呢 [/quote]
我现在想不到怎么个科普法啊,有点后悔了…………
先发给RM2的东西给大家看看,看看有没有人动心吧。
2005-1-14 18:49
Maxwell
[quote]原帖由[i]kingofworl[/i]于2005-01-14, 12:50:08发表
有个小问题在这里问一下,定义变量 link 是不是以后就可以直接使用link[]数组了,所有开发工具都支持这样吗 [/quote]
动态语言一般都支持,静态的一般都不支持。
页:
[1]
Powered by Discuz! Archiver 5.0.0
© 2001-2006 Comsenz Inc.