我建议编程入门的人学
C
或者
Pascal
,如果更进一步的话可以用汇编语言,因为这样能更清楚的了解底层。
前几天重读
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, VB, 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++
这类语言,你想怎么就怎么,重要的是要用合适方法,趁手工具,最少的时间做有价值的东西,把你钻研语言的语法的时间拿来锻炼一下身体,泡杯茶看看小说我觉得更好一些。
语言只是表达思想的工具,不要只局限于一种语言,不要狂热于某一门语言。
学编程时选书最好先看一看书中的代码,是取自实际应用中的吗?写的漂亮吗?(指代码自身的精致,以及排版是否工整)代码中有语法错误吗?(鄙视某些没编译试试就把代码
copy
到书里的作者)
有本
Essential C#
,取的是
.Net
类库的代码,很棒,讲
delegate(
希望没拼错,好久没弄这个了
)
时举的例子很清楚地让人看到这个东西该怎么用。
另外推荐
Learning Perl
,我个人觉得是我看过的最好的关于编程的书,该讲么,不该讲什么,按什么顺序讲,很好,也许是
Perl
的精神的感染吧,当初看这本书很有震惊的感觉,原来程序设计语言还可以这么使!爽!
断断续续写了这么长,
xxx
的
xx
布,又
x
又长,呵呵,希望大家踏实一些,不要浮躁。