随笔 - 44  文章 - 78  trackbacks - 0
<2009年2月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567

 Happy 牛 Year
一、一周至少写一篇博文;
二、每天至少学习半个小时。
三、奔向小牛!

常用链接

留言簿(6)

我参与的团队

随笔分类

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

题记:最近看了《 java 夜未眠》这本书,感觉很不错,里面将当时(包括现在)的一些现状,以及一些知识点分析的很清楚、很透彻,而且浅显易懂,写作风格幽默风趣,读起来也不费力;虽然有些地方比较偏激,但那是不可否认的事实,确实感同身受啊,如果大家没有看过,推荐大家有时间也看一下;下面是书中一些不错的片段,当然,整本书都是不错的,这些只不过是我更感兴趣的。

 

培养兴趣
把程序设计当成兴趣可以让你学得更快乐,学习效果自然会更好。在我到一个单位面试时,主管看了我的履历之后问我:「你怎么有这么多时间学会这么多东西、做这么多事?」 我的回答是:「把工作、学习、和娱乐结合在一起,时间就会是别人的三倍。」
   
我承认我很幸运,可以把程序设计当作赚钱的工作,学习的题材,以及茶余饭后的休闲活动。不是每个人都像我这般幸运,但是我相信至少大家都可以把它当成兴趣。相信我, 调整你的心境,把它当成是兴趣,而非苦差事,你非发现你的「程序功力」与日俱增。

慎选程序语言
   
慎选程序语言很重要,一开始就学太难的程序语言很容易让你遭遇到挫折而放弃。你可以挑比较容易且有趣的语言下手,建议您可以从下面的语言中择一:
    VB
:简单,好用,书籍多。
    Java
:比 VB 稍难,比 C/C++ 简单,书籍多,用途非常广,相当有前途。可以当作学习 C++ 的跳板。
    Python
:简单,好用,各个平台都支持(包括 Windows Linux MacOS BeOS ... )。国外很红,国内较少人用。原文书不少, 但中文书目前只有一本(欧莱礼出版)。我预期 Python 会是下一个热门的程序语言。
   
这三个语言只是我给各位的建议,你也可以多听听别人的意见。在选定一个程序语言之后,就要执着,不可以很快放弃,又改学另一个程序语言,否则永远都只懂皮毛。有句谚语是 这么说的:「 A jack of all trades is master of none 」。如果你号称会 C++ Java 等十种程序语言,只不过每种程序语言都停留在 Say Hello 的阶段,相信面谈主管很快就会 对你 Say Goodbye
   
当你学精某程序语言,然后想再学另一个程序语言,你会发现有了前一个程序语言札实的根基,学任何新的程序语言都很快。

 

程序与香鸡排片段

在台湾的软件公司内部,有许多非科班出身的程序员,他们的薪资低廉,通常又很努力。软件公司就算聘到了这种便宜又努力的程序员,也不要太高兴,因为这样的程序员,通常都只是把目前的公司当一个学习的过渡阶段,等到学得差不多,拍拍屁股就走人了,才没打算一辈子接受这样的低薪。但可悲的是,大部分的公司都没有良好的程序员生涯规划制度,反正大家互相利用。所以这些程序员很可能在做计画的过程中,学不到东西又磨得身心俱疲。 所以,何苦来哉!不如我们通通去卖香鸡排吧!但是你们只能到通化街夜市和士林夜市卖,不可以到我属意的饶河街夜市和我抢生意(我打听过,饶河街的摊位租金是三者中最便宜的)。我的摊位名称要取做什么呢? ... 嗯!就叫做 “Java 鸡排 好了,以纪念我曾有过的 Java 程序员身份。我打算把鸡排分成三种大小,最大到最小分别叫做 J2EE J2SE 以及 J2ME 。哪天你到饶河街夜市,发现了一个乾乾瘦瘦、看起来营养不良的少年头家用著生硬的台语在吆喝著: 来呦!来呦!好呷的香鸡排, J2EE 一块 50 J2SE 一块 40 J2ME 一块 30......” 请你也来光顾一下吧! ... 看在 Java 的份上。

 

关于职业生涯

生涯规划会随着年纪增长和生活经验的累积,以及人生观的改变而有阶段性的差异,所以生涯规划不宜过于长期。生涯规划应该以渐进的、多样的方式来进行。渐进的,才不会好高鹜远;多样的,才可以分散风险。而且,生涯规划要及早,因为有越充分的时间准备,越有可能实现。即使你想潇洒地背着吉他到异乡旅行弹唱,你也得好好地练吉他吧!

把握时间朝着你所规划的生涯迈进!时间过得很快的,浪费不得。你不会希望有一天你在床上醒来,睁开眼后盯着天花板,你发现你已经五十岁了,昨晚五十大寿 birthday party 的宿醉使得你现在头痛欲裂。你发现这些年来你依旧是浑浑噩噩的度过,生涯规划依旧只是「规划」,没一个实现。你在床上抱头痛哭,就在你五十岁生日当天。

信息应用领域变动快速,许多软件人员欠缺判断能力,不能及早学习妥相关的技术以为因应。特别是在这几年的光景,许多新应用领域的窜起,相当程度地撼动了原有的软件霸主,以往那些唯唯诺诺、以微软技术马首是瞻的人难得压错了宝,这次也算是让他们学到了教训,这何尝不是一种领悟。啊!多么痛的领悟,你(微软)曾是我的全部。

许多软件人员缺乏自我学习的能力。软件人员应该问问自己:这半年来技术能力精进了多少?技术飞快地在进步,如果你没跟着进步,在相对坐标看来就是退步。我以前很变态,只要一天没看技术书籍就会觉得今天真是白活了,然后有一股冲动想要「做傻事」;现在我虽然比较没这么逼迫自己了,但看书还是看得很勤快。

软件人才培养不易,折损率高。一些我认识的优秀软件人才,最近常 forward 一些「过劳死」、「人生的意义」之类的文章给我,显示了他们工作上的厌倦感。他们在电话中告诉我,他们忙得没时间接触新技术,技术已经跟不上别人了。这厢大叹人才难寻,那厢努力折损人才。

 

关于知识的等级

专业知识是一种无形的资产,不容易评估其价值。但是大致上,专业知识可以分成四个层次,价值由低而高分述如下。

Know-What

受过训练,通过认证,而精通某领域的基本知识,这类的知识就称为 know-what ,也称为认知性的知识( cognitive knowledge )。 know-what 是一切知识的根基,但是有了 know-what ,并不表示有能力可以活用这些知识。许多软件人员在通过专业认证之后,就开始学会狮子大开口了,其实他们的知识可能还停留在 know-what 的阶段,而 know-what 阶段的知识对公司来说是没有太多生产力的。此阶段的软件人员应该努力地提升自己,以进入下一个阶段,也就是 know-how

Know-How

know-how 阶段的知识也称为进阶技能( advanced skills ),指的是可以活用书本上学来的知识、理论,以解决实际的问题。 know-what 的知识或许可以透过「填鸭」方式生硬地吞下去,但是 know-how 的培养一定要透过实务经验的累积与体会。如果有一个好老师或 leader 的引导, know-what 可以很快地提升成 know-how ,靠自我的培养则通常会比较辛苦。不过,当我要引导学生由 know-what know-how 时,往往会有许多「不识货」的学生嫌我啰唆。

Know-Why

know-why 阶段的知识指的是对整个系统的掌握度( system understanding ),也就是了解各种知识背后复杂交错的因果关系。有了 know-why 的知识,软件人员除了能顺利地进行软件计划之外,还能进一步解决更大、更复杂的问题,因为一切的知识都是有条理的。具有 know-why 的软件人员对整个计划具有强烈的「第六感」,可以直觉地做出正确的判断,预先知道可能会遇到的问题。计划的 leader 必须具备 know-why ,才能全盘掌握计划。

Care-Why

care-why 指的是自发性的创意( self-motivated creativity )。有了源源不绝的创意,才能保持高度的竞争力。软件产品相当需要创意和洞烛先机的能力,在大家一窝蜂抢做某软件或某服务之前,就已经先完成深度的耕耘,技术自然比别人来得扎实,也能迅速地迎合市场需求,为公司创造最大的利益。

 

关于买书读书

如果你最近是个大忙人,有一堆事情要做,就先别急着买计算机书籍。计算机书籍更新的速度很快,可不比四书五经,可以祖传父、父传子, 代代受用不尽。以前我也常冲动之下买了好书回家,然后忙得没空读它,等到空闲下来时,新版本也已经出现了,懊悔不已!如果不急着用的书, 千万别急着买,不然可能还没来得及看这本书,新版本又出来了,信息界不流行考古的。

 

Java 学习之道

认识 Java 的原理
*
学会 Java 语言
*
对象导向的思维
* API
*
开发工具的用法

下面分别就这几点详细阐述。
学习 Java 的原理
了解 Java 的原理,才有可能真正体会 Java 的一切,学习任何事情,只要能掌握原理,就会比较顺利。我发现许多人使用 Java 已经逾年,却连 Java 最基本的特质都不清楚。

一般来说,信息系毕业的学生,对于信息的新事物学习的速度,会比其它科系来得快,就是因为四年的教育为他们奠定了学习新事物的基础,这也是信息系课程的价值所在。

除非你受过的基础训练够扎实,否则在学习或使用 Java 的过程中,你一定会需要参考到这些信息系学科的知识。我建议各位可以在闲暇之余,把信息系课本的书拿来读一读。这是治本之道,绝非立竿见影的特效药,必须要有耐心。

学习 Java 语言
学习 Java 语言很简单,毕竟 Java 语言也只包含五十多个关键词( keyword )与几十个算符( operator ),再加上 Java 语法( syntax )也很简单,所以一般人可以很快就学会 Java 语言。危险的是,很多人认为已经完全掌控 Java 语言,但其实对于内部的运作机制仍不能掌握,这些盲点有时候会让你无法完全掌控 Java 语言。克服这些盲点的方式是看「 The Java Language Specification, 2nd Ed. 」(没有中文版)来彻底弄懂 Java 程序语言,并看「 Inside the Java Virtual Machine, 2nd Ed. 」(有中文版,但翻译得@#%$)来彻底掌握 Java 虚拟机器的运作方式。

学习对象导向的思维
学会了语言,并不代表就可以设计出好的对象导向系统架构。想要成为对象导向的专家,往往需要:

*
多看相关的书,特别是 Design Pattern Refactoring 的书。
*
多观摩别人的程序(例如 Java API design implementation
*
多写程序

学习 API
学会 Java 语言之后,还需要学会一些 API 才能写出有用的程序。 Java API 非常多,必须规划好一个学习路径,才不会在浩瀚的 API 大海中迷失。必备的 API 包括了: IO New IO Collection Framework Network RMI JAXP... 等。至于其它的 API ,就看你的需求而定,大致上分成:

* GUI
类: JavaBean -> Swing -> JavaHelp -> Java2D -> Image IO -> JAI -> Java 3D ...
* Enterprise
类: JDBC -> JDO -> Servlet -> JSP -> EJB -> JMS -> JTA/JTS...
* J2ME
类(这一类不是我的专长,无法提供学习顺序建议)

学习开发工具的用法
只用 JDK ,是很难写出大型程序的,所以通常程序员会使用 JBuilder/VisualAge/ VisualCafe 等工具,这些软件卖这么贵,一定有它的价值,值得花一些时间好好学习这些开发工具的使用方式,你将会发现开发工具所提供的许多功能,可以让你在开发过程中生产力大增。

 

Static 的意义与实作方式

 

Class(static) field :共用一块记忆体
class(static) method
:共用一块记忆体
instance(
static) field :随着每个 instance 各有一块记忆体
instance (
static) method :共用一块记忆体
    instance method
为什么不是随着每个 instance 占有一块记忆体,反倒是共用一块记忆体?其实,让每个 instance method 如同 instance field 一样,随着每个 instance 占有一块记忆体,这么做当然是可以的,只是 Java 编译器和 JVM 都不这么做,因为太浪费记忆体空间了。一个 field 少则占用一个 byte ,多则占用数百 Byte ,但是 method 少则数个 byte ,多则数百 Kilo Byte Mehtod 耗费的记忆体是 field 的数百倍,甚至数千倍,当然是能共用就尽量共用,比较不会消耗记忆体。既然 JVM 让一个 class 的所有 instance 共用相同的 instance method ,下面两行程式码在 instanceMethod() 内部时,如何区分是 instance1 instance2
instance1.instanceMethod();
instance2.instanceMethod();
因为编译器会帮我们在把 instance1 instance2 个别传入 instanceMethod() 中当作第一个参数。也就是说,任何 instance method 参数的实际个数都会比表面上多一个,这个多出来的参数是由 Java 编译器帮我们加上去的,用来代表对应的 instance 。此参数的变数名称为 this ,也是 Java 的一个关键字( keyword )。
   
当调用某个 instance method 或使用某个 instance field 时,你必须在前面加上该 instance 的名称,如果该 instance method/field 相关的 instance 和当时程式码所在的 instance method instance 指的是同一个 instance 时,该 instance 的名称就是 this ,这种情况下,你也可以选择不在前面加上「 this. 」。
   
然而,在某些状况下,非得在前面加上「 this. 」不可。例如,当 method 中的参数或区域变数和 instance field 名称完全相同时,如果不在前面冠上「 this. 」,那么指的是参数或区域变数;如果在前面冠上「 this. 」,那么指的才是 instance field

posted on 2009-02-06 15:29 Tiger1102 阅读(5075) 评论(4)  编辑  收藏 所属分类: 每日进阶

FeedBack:
# re: 关于蔡学镛前辈《Java夜未眠》的一些摘要 2009-02-06 16:03 徐尧
不错,很好  回复  更多评论
  
# re: 关于蔡学镛前辈《Java夜未眠》的一些摘要 2009-02-17 18:47 belltoy
程序语言建议从C学起(同时了解汇编,以及其它基础知识)
编程工具从纯文本编辑器开始,不要一开始就用IDE
《程序员修炼之道》值得一看  回复  更多评论
  
# re: 关于蔡学镛前辈《Java夜未眠》的一些摘要 2011-02-06 00:24 朱少军
如果倒过来,先学C++,再学JAVA,是不是可以这么说,如果C++吃透了,JAVA一看就会?  回复  更多评论
  
# re: 关于蔡学镛前辈《Java夜未眠》的一些摘要 2014-06-19 17:39 古今
@朱少军
@朱少军
我是一名大四通信工程毕业生,跟着学校课程学习了C和C++的基础部分,然后自己寒假去看了JAVA语言(JDK的基础),至少我感觉要看懂很容易。但是到了提高和运用部分,光是看书不够,程序语言还是需要大量的项目经验来促进自己边用边学,而不是学完了去用。但在打基础阶段还是建议从C和C++入手(开发工具推荐VS2012)  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: