一句话,上面这些书没有什么用处,其思路非但没有太多的指导作用,其中的案例还会影响诸位的思路。
关于软件设计,我不希望诸位走我走过的弯路,不要花我曾经花过的冤枉钱。作为设计而言,经典的书《Java 设计思想》、《C++设计思想》、《设计模式》、《UML理论》等等,已经有数10本了。就需要诸位去消化,剩下的,诸位就要利用google了。不过,记住一个原则,弄清楚Why,而不是How。对于基础理论,哪怕不懂,吃的不透,也要强迫自己每天都翻看一下;对于技巧性的技术,应该可以放到最后考虑。
一、天分和努力
我相信天分的说法,无论是玩和做事,到了极至,就是天分。诸位到我家,我已经介绍给你们全国封顶的吉他手认识,你们也听过他的演奏。作为学计算机转而因为爱好改变职业成为音乐人,并且取得如此高的成就,这就是天分。
但我同样不相信天分的说法,你们接触的这位音乐人,是唯一一个当面和我比勤奋的人,起因是因为我说他有天分。
是的,天分和勤奋,是成为极至的因素。
但是,我和诸位一样,不是软件领域的科学家,目前还没有人在任何一个领域敢说自己封顶。
作为普通人的我们,更需要努力。而努力是需要找到方法的。
在高二,我获得全省软件设计第二名,我做的计算平均分和排名次程序比我的老师做的还好,很多人认为是天分,实际不是。尽管老师只教了我17个命令,我有条件可以到气象局、学校长时间的上机试验,我的同学是没有这种条件的,甚至是我的老师;包括老师在内,没有一本书,全是老师的笔记,但是,我有一本书。努力,才是我和他们的不同。
大一,在LF16500型机器上,我做出了全校的第一个游戏-赌马,赢同学的菜票。这在今天看很简单,当时却是让老师都觉得很难想象的。你想,同学需要10分钟录入的程序,我3分钟就搞定,每周2小时上机时间,这是很宝贵的节省。不是我聪明,而是我高中就有基础,我可以问老师更多问题;为了提高录入速度(不可以存盘),我做了一个木头键盘进行练习。努力,才是其中的不同。
大二,在同学还在为小型机如何登录、如何交作业等问题吵闹的时候,我已经学会盗用同学的打印纸,可以做更多的事。不是有天分,而是大一的基础,使得我可以缠着老师教我更多的东西。
对于我们普通的智商,努力是关键。
二、基础和方法
有了努力,就有了基础。从大二下学期,我的恩师(之所以说是恩师,是对我有莫大的影响)带着我和另外的几个同学用了2年的时间读完了DOS3.3的反汇编代码,那个时候,很多同学忙着学习FoxBase,甚至丢了学校教的Pascal, C 。舍本求末,在毕业时,问题就显现出来了。
大四的毕业论文,很多同学是用Foxbase帮一些学校设计学生档案管理,包括我的几个牌友(桥牌),3年半中,我没有看过Foxbase的任何东西,但是朋友来求助的时候,我花了2周时间,给我朋友做出他们的毕业论文,结果,班里几乎所有这类毕业论文的同学都用了这个程序。
这里面的差别是思考问题的方法和基础。
《软件工程》、《数据结构》我都没有参加考试,两门功课都是免考,我帮老师改卷。
有一个问题值得关注,当时很多同学在忙着Foxbase中“窗帘式打开”等等界面设计方式时,我帮牌友设计时不考虑这些东西。因为软件工程教会我关注主要矛盾,我总结了一句话:整体错了,局部做的再好,也是没有用的。
有一个结论:理论很枯燥,但是却是行动的指南。我个人认为,最好的方法,就是依据理论,然后去分析。
三、面向对象的设计和学习
影响我关注面向对象是Pascal 5.5提出支持面向对象设计(因此我当时没有学习turbo c 2.0),其中有一句话,深刻的影响了我。
“给树浇水,树会长大;给汽车浇水,汽车不会长大”。我认为,这是非常简单和经典,值得深刻理解的一句话。
自以为掌握了很多面向对象,但直至98年,从网上下载到《Thinking in Java》,后来中文翻译为《Java编程思想》,才发现自己以前原来是用面向对象的工具,开发面向过程的程序。直至99年《Design Patterns》一书被我下载到,才有了入门的感觉。
我发现过去受到很多“宝典”、“编程大全”的影响,积累了很多错误的观念和不好的编程习惯。
以下代码就是这类书籍典型的写法:(这是我发该帖时从一本书上重新找的代码)
string strConnection ="server=test;database=Northwind; uid=sa;pwd=";
SqlConnection conn=new SqlConnection (strConnection);
string strSQL = "SELECT * FROM Customers";
DataSet ds = new DataSet();
SqlDataAdapter adapter = new SqlDataAdapter(strSQL, conn);
adapter.Fill(ds, "Customers");
DataView objDataView = new DataView(ds.Tables["Customers"]);
dgNameList.DataSource=objDataView;
dgNameList.DataBind();
作为例子,无可厚非;但是作为商业化软件设计,上述就值得商榷了。但是,作为学习者,不就是先入为主,看到上述的设计吗?
曾经用这种结构设计程序,而偿到各种后来的苦果的同行们,在这里响应一下。
98年,当时我所在的公司以四层结构开发为主,( browser -- web server -- application server --db server)我受命将Netscape公司的Application Server中提供开发的Runtime 部分分离出来,(当时Application Server,其前身Netscape收购的Kiva,太贵,一个CPU,要100多万)虽然分离工作最后失败了(4.0版前的核心部分是C写的,被Sun收购后,名字改了),但我感受到他们的程序结构、设计结构。因此,我终于在网易的论坛上发了帖子,我入门了。
后来,当我将JRun整个系统反编译,并花了半年的时间阅读学习。我得到了如下的结论:
设计最重要,但好的设计是对最基础的概念深刻理解的产物。
“单一对象完成单一功能”,这几乎是每本面向对象的书中都提到的,多么简单。这就是JRun的最大
因此,爱上了诸如设计模式、UML之类的东西。重新非常仔细的阅读什么是对象等等最基础的理论,很多东西才恍然大悟。
面向对象的设计,基础最重要。也许,从这句话中可以看出“寻找对象,没有对错的分别,只有好坏之论。因为没有对错,所以考验设计者的功底。”
四、教育和学习的误区
IT程序员确实过了几年好日子,其实我们的这点东西,学的时候并不比其它专业难,所以自然也不会高档到哪里去。
技术的发展,使得编程学习变得容易,而且越来越容易掌握,这是技术发展的必然。
现在的学院课程设计也是比较突出适用,这是非常好的。
但是,从应聘的学生口中,我觉得很多学生是走入了一些误区,而且这种误区还有很多种。
有一类看似很钻研的人,应聘书中提到基于LDAP(轻量级目录访问协议)研发,看得我眼睛一亮,这是系统级的思想,能够理解这个概念并研发的人,是人才来着,大有潜力可挖。面谈后才知道,其实不是这样的,知道了一个名词,调用了几个函数而已。
有一类是受社会风气影响,认为学习J2EE就可以走遍天下。写个jsp程序,就是J2ee?基础没有,谈何架构。
大多数的人都希望自己的东西能够马上跑起来,变成钱。这种想法对一个已经进入职业领域的程序员或者项目经理来说是合理的,而且IT技术进步是如此的快,不跟进就是失业。
但是用了解Why的心态,而不是How的思路,才是寻求更大发展的基础。
因为,搞设计久了,会发现,语言不重要、局部的代码技巧不重要等等。而是每次学习、每次设计中共同的基础理论是最重要的。
学校要设计很好的课程,是很为难的。不作实际的练习,何谈基础理论的理解,这是“鸡和蛋的问题”。所以很多学校很典型的开设了以语言教学为主的课程,特别是大专、中专为甚,为何?毕业容易找工作,应聘书上可以写会什么什么语言、开发了什么什么系统。
其实包括我在内的很多同行,对于新手,更多的是看潜质而不是看其会什么。而潜质是什么?有一点,对方的思维模式,也就是观念的问题。
五、否定和肯定
对于我们普通的技术员,相信1+1=2,在学习、实践的过程中不停的肯定和否定自己,让实践中调整。我个人有时候会觉得自己入门了,一段时间后,又觉得自己不懂了。但是每次有这种疑惑后,技术是有很大进步的。
1+1不等于2,是科学家的事情。我们做不了,也没有必要。
作为非科学家级的我们,要做的就是相信他们给我们的理论,去学,去用。
先做好一件事,因为很好的做好一件事是很困难的,需要毅力的。
举个例子:有个WinPM的软件,管理联系人的,这个软件有一定的知名度的,这个老兄做了几年,从一个很简单的软件,发展到国内比较好的软件的行列,不容易。
真的认真做一件事后,所获得的提高和感受是不一样的。
每天找的新东西太多容易让人迷失。努力使用现在已经掌握的技术和理论去制作具有一定新意的东西,同时了解未来的应用,我想,这是技术员学习的一种方法吧。