《程序员》:非常谢谢您接受我们杂志的采访,在您十年的开发生涯中,曾经写了众多的软件产品,而3721中文网址系统更是拥有了广大的用户群,你一定对程序员这个职业有很多感触吧?
周鸿袆:是的,我一直很自豪曾经是程序员,但我所说的程序员并不是仅编程这个概念的程序员。从1990年开始写第一个商业化的程序,到现在已经有十年的时间了。在这十年期间,我既做过产品设计,也做过系统集成;既做过编码工作,也做过系统分析。我在方正期间还领导和管理过程序员团队,从很小的Team到后来负责方正系统集成部门近一百人的研发中心。在这期间,我亲自带过很多的程序员,把这些刚刚大学毕业的学生培养成为软件工程师。而在这个过程中,我也亲眼看到很多非常有天赋的程序员,有的在不断前进,而也有一些慢慢的平庸了下来。所以面对《程序员》杂志和所有的程序员,的确有很多心里话要讲。
《程序员》:经历就是财富,您有这么丰富的经历,那从您的经验讲,如何做一个好程序员呢?
周鸿袆:一个好程序员是很难定义的,但我认为要做一个职业化的程序员,需要几点。首先是要有兴趣从事这个职业。现在很多人是因为软件行业的薪资高才进入的,其实没有人不想挣钱。但我的看法是,程序员是没有办法一夜暴富的。甚至可以说如果你聪明伶俐的话,做程序员不如去做销售人员的待遇和收入上升得更快一些。我认为做程序员首先一定要从兴趣上爱这个行业,否则根本无法忍受成为一个真正程序员要付出的代价。虽然现在,像我和求伯君、王志东等,的确不用写也没有时间写程序了,但从内心来讲,仍然对开发有一种冲动和热情。第二点就是要打好基础。科班出身最好,如果不是也没有关系,我们公司也有一些不是科班出身的程序员,但我都让他们去购买一些诸如数据结构、编译原理之类的基础书籍学习,为什么这样呢?因为计算机分为两个领域:算法领域和编程领域。算法领域是数学家的事情,对他们来说,实现并不重要,重要的是找到一个算法,找到一个公式,建立一种模型。除去算法领域,其他的都属于编程的范畴。对于任何一个大型的系统,其实都可以把它分解成为若干最基本的数据结构和基本算法,而这些都是在大学本科的课程中能够学到的。我曾经剖析过很多操作系统,包括DOS、Windows、UNIX,其实里面很多基础就是数据结构、数据库原理和操作系统的基本原理。
第三点要做到不被周围纷乱的新名词、新事物所诱惑。现在新名词太多了,今天流行Java,明天就是C#,很多程序员便被这些东西所吸引,去追风。大家都知道"活到老,学到老",但学习要有正确的学习方法。有些程序员以自己知道一个新名词为荣,觉得很"酷"。但实际上任何一个新的技术如果你把它外表的新名词抛掉,去查看它的来源和历史,就会发现很多都是从老知识中派生出来的,本质并没有变。
第四点就是要学会领悟和超越。计算机中的基础知识太多了,每个课程都包含了很多深层的东西。要深入了解任何一门语言,都需要很长时间的积累,经过积累,才能领悟其中的道理。比如学习一种刀法,如果仅仅是会用刀,换成一把剑就不会用了,这不是真正的高手。高手就是要能够通过学习刀进而领悟到整个器械的用法,这时无论是给你一把剑或者匕首,都可以运用自如。
《程序员》:我们知道,您在学校的时候就取得了很多的成绩,而我们的读者也有很多是在校或刚毕业的学生。您有哪些学习方法和经验值得他们借鉴呢?
周鸿袆:首先还是学好自己的基础课程。我当时上的是西安交大的特种班,专业要求很严,使我不得不把基础课学好。除此之外还有一个原因,就是我在高中的时候就编程,但那时候没有理论指导,只是靠兴趣,凭感觉,因此遇到了很多问题。当我在大学开始学习后,所学课程让我明白了很多困扰已久、百思不得其解的问题,所以内心产生了学习的欲望。这样基础打得扎实,课程学得也好,而且不是为了应付考试。现在想来,我很多灵感都是来自于学校打下的坚实基础。
第二我花了很多时间去实践。当时没有现在这么好的条件,但我在学校一直利用任何一个机会在计算机上去做开发和实践,这些实践打下的基础使我这些年来受益无穷,这也是发自内心的感受。
第三是利用大量的时间读源码。因为写程序一方面要读别人的程序,一方面是模仿,一方面是自己写,三者缺一不可。通过读这些源码,对语言的本质有了很深的了解,进而才能超越语言本身。比如当时新推出了Pascal的图形工具箱,很多人只是为了用它,但我却将源码通读。大师级的软件作品就象唐诗三百首一样,读起来是艺术的享受。后来我还读过C语言的库函数源代码,研究它是如何写得精致和高效的。研究生做毕业设计的时候,又花了一个月的时间仔细研读新出的MFC类库。我还把Delphi的源码和类库研读了一遍。而且当时还做了很多程序,去看C编译器输出的汇编代码。这些听起来好像都是很笨的方法,但效果是非常好的,这个习惯至今未改。
第四是经常的思考。思考和学习是结合在一起的,看到别人的项目和软件,我首先会想它是怎样做的,为什么这么做?我个人非常喜欢电脑游戏,但很少上瘾,因为面对一个好游戏,我喜欢先思考这个游戏是如何制作的。比如Doom,我曾经仔细研究考虑它的三维图像和二维贴图是怎样处理的。除此之外,还有很多东西都可以让我去思考,其实在思考的过程中并不一定会得到答案,但重要的是你在思考,这样带着很多问题去看书,去听课,就会让学习变得有动力,有目的性。
《程序员》:很多刚毕业之后学生和程序员经常会产生一些疑问,比如"我做什么软件能够快速成功?做什么项目更有意义?"您对这个问题如何看待呢?
周鸿袆:我认为最重要的不是做什么,而是怎样去做。因为刚开始你根本做不了判断。做一个项目的成功与否完全取决于对这个项目的态度和投入,而不取决于项目本身。我有一个信条:一件事情,要么我不做,要么我就做好,做的有创意!因为如果不认真做,既浪费公司的时间,同时也浪费自己的时间。但如果认真做了,就会发现从这个项目得到的收获远远超过项目本身。下面我讲讲自己在方正工作的一些经历,从中你会发现,机会是自己把握的。
我在方正做了好几件很多人不愿意去做的事情。第一件是我刚到方正的时候被分派到新疆做银行系统集成开发。这是一个苦差事,但我想既然来做这件事情,就一定要做的最好。到达之后,我并没有立刻动手做事,而是花了一个星期的时间来思考如何用新的开发方式来提高工作效率。后来我以毕业设计时研究VC的基础,在UNIX字符模式下实现了一套VC的类库和软件开发的平台。这个界面编辑器能够在UNIX的终端下所见即所得的设计界面,自动形成程序框架代码,自动检测错误,使用这套工具可以提高开发效率十几倍。就是这样一个不是机会的机会,不仅仅轰动了整个建行系统,同时也奠定了我在方正的位置。
第二件是给国务院办公厅的领导培训电子邮件使用。其实本身这件事情是非常无聊的,就是讲述CCmail的使用,很多人可能就随便讲讲课,应付了事。那时Internet应用刚刚开始,但我从这次培训开始,找到了很多相关的资料,在学习过程中对电子邮件产生了浓厚的兴趣,并感觉做一套Internet的邮件系统会非常有前途。而且通过和学员的交谈,发现他们很难学会技术化产品的操作,于是产生了开发一套人性化的电子邮件系统的想法,这件事也奠定了我后来开发方正飞扬这个产品的知识基础和思路。
第三件就是在撤销方正飞扬这个项目之后,我再次被指派到新疆去解决银行系统无法处理大量数据的问题。因为当时一个省级银行每天要做数千万笔交易,这个访问量是非常大的,整套系统无法承受。要解决的就是如何在不升级硬件的情况下提高系统效率。这个事情没有人愿意去,一方面是远,更重要的是很难知道这件事情会做成怎样。当然我也不想去,但既然去了,就要做出成绩来。在新疆工作了一年半之后,我把这个问题解决了。而且在解决这个问题的过程中获得了很大的收获,比如对企业级软件如何利用中间件来提高性能,提高容错能力有了很好的认识,还研究了企业级软件的体系结构;最重要的是了解了数据库系统如何优化,尤其是在处理海量数据访问的情况下,仍然能够保证速度和性能方面收益菲浅。所有这些都为现在3721能够开发出高效率的搜索引擎打下了一个很好的基础,因此我说,如果当时我没有去的话,对于3721来说,即便我有了一个很好的想法,但是否能够做成一个成功的产品还很难说。
《程序员》:现在很多程序员被日新月异的新技术、纷乱的新名词搞的不知如何是好,那您在遇到过这种情况的时候是如何处理的呢?周鸿袆:人的生命和精力是有限的,如何在有限的时间中更好的学习和提高自己,这是一个很重要的课题。有些人喜欢追逐新名词,蜻蜓点水的学习新东西,我觉得这样做既浪费精力,又使自己很累,而且效果也不好。其实计算机所有的东西都是相通的,换句话说,好的程序员在Windows、DOS、UNIX下编程没有什么区别,体现的就是编程的功力,用什么语言也不重要,体现的是你对问题如何去解决及对算法和数据结构的把握,对语言本质的了解。
同其他的开发人员一样,我也遇到过很多的问题,我解决流程一般是:学习基础理论知识-聚焦-扎实的做事,而每个环节都要思考。我上大二的时候参与过学校课题组的一个项目,是国内的程控交换机检错系统,我分到了自动报警中的屏幕显示出错中部件和电路图的模块。在我之前,有毕业生准备把二千多张图纸输入到计算机中,可是毕业设计做了几个月,也就画了几张图,不了了之。虽然当时没有什么经验,但我首先花了很多时间思考这个问题。后来受苹果电脑上画图系统的启发,写了一个画图程序。这个程序可以画元件、连接元件并加标注。而且还可以把线路图按照数据库的形式存储到计算机里面,并能很方便的调用。最终这个项目取得了非常大的成功。同时也奠定了我的软件思维模式,就是如何创建通用的解决问题的方法。而当时我为了做这个产品,我花了一个月的时间研究了Turbo Pascal的图形库。
到了方正之后,接触到了刚刚兴起的Internet,同很多人一样,我对Internet带来新事物和应用感到迷惑和慌张,不知从何处下手,感觉新名词天天都学不完,又怎么可能掌握它呢?但我很快就从迷惑中清醒了出来,认识到现在看到的都是表面的事物,不是本质的东西。我首先要了解互联网的本质,了解互联网的思想。因此当时我分了三个阶段,第一阶段找了很多讲述互联网通讯技术理论的书籍,试图对整个互联网做技术上的把握。第二阶段我就选择了Email作为切入点,虽然当时互联网上有很多的应用,但我只选择了电子邮件作为主攻方向,而且先从邮件客户端开始去研究各种互联网标准。第三步就是花费了一年半的时间扎实的去做邮件系统。当我做完邮件系统之后,已经对网络有了深刻的感性认识。
《程序员》:您认为要做一个职业程序员,如何处理开发和市场之间的关系呢?
周鸿袆:做一个程序员,不能只埋头编程,一定要跳出开发者的狭隘的技术眼光,能够到市场和客户那里去看一看。
我比较幸运,因为做过的项目都有客户需求,这样就可以和客户建立很好的技术沟通。在我上研究生的后半年,我花了很多时间到公司中学习其他的各种技能,学习谈生意,接触客户。当时我对编程以外的很多事情都有兴趣,包括攒机器、装软件、做培训。这些事情看起来很无聊,但一方面提高了同他人沟通的能力,另一方面也让我知道了客户和企业的需求。后来做病毒卡的时候,又接触到了售后服务的问题。所有这些都让我清楚了做产品要从用户的角度出发,而不能从自己的角度出发。同时我也把这个思路带到了方正飞扬电子邮件和3721系统中。所以我建议程序员可以一段时间不写程序,出去走走。就象古代诗人只坐在房间里,写不出来很好的作品,而出去游历一下名山大川,感受一下大自然,回来之后自会有另外的一番感受和境界。
《程序员》:不知道您喜不喜欢足球?中国软件业近些年来就象中国足球一样,备受指责。那作为软件业主体的程序员也一定存在很多自身的缺陷,您认为主要表现在哪里呢?
周鸿袆:我个人很喜欢足球,我做开发时,业余时间经常踢足球,而且我比较喜欢踢前锋。而看比赛我一般只看高水平的国外联赛。
我觉得我们的有些程序员存在一些致命伤,比如好高骛远。这些程序员比较年轻,热血沸腾,总是对中国软件产业忧心忡忡。还有很多人提出要做中国的操作系统,要挽救中国软件业。其实他们没有看到,就美国来说,很多程序员是从五六十年代就开始编程的。没有发展了几十年的软件产业,没有众多程序员积累,不可能诞生像Windows这样的操作系统的。另外对于Quake 3,大家都觉着好玩,有人声称也要做一个,其实他没有看到,Quake 3前面还一代、二代的程序,Quake前面还有Doom,Doom前面还有Wolf 3D做基础,而做Wolf 3D的一群程序员也有数年的游戏开发经验。所以说软件就象文化一样,是一个需要知识积累和沉淀的。我们的程序员与其杞人忧天,不如扎实的把自己能做的事情做好。
另外我建议年轻的程序员不要急于搞软件工程。因为从另一方面讲是对自己没有信心的一种表现。我觉得要做一名职业的程序员,他的青春和职业生命也应该是比较长的。很多非常年轻的程序员很早就开始研究Rose,UML之类的,自己感觉比较时髦。可是作为一个专业的程序员,如果没有丰富的实践经验,脱离一个很扎实的基础,就算是学到了系统分析和系统设计的一个皮毛,那成功的可能性也是很小的。
想成大事的人要能够经受住各种磨难,要有韧性。任何一个产品都是用心血浇灌成的。我做开发的时候感觉最多的就是有很多的不眠之夜,经常工作到天亮,连轴工作,一个问题解决了,刚松口气,有了很大的成就感,突然又出现了一个新问题,就这样在希望和绝望的巅峰和谷底之间来回震荡,真的是很刺激,所以我喜欢做程序员。但当你把一个比较完美的作品做出来的时候,会感觉自己像被扒了三层皮一样,太累了。所以我送所有的程序员一句话:你觉得自己很聪明,是天才,但天下这种人太多了,你想在三到五年就把别人十年做的事情做一遍,那你也一定会把别人在十年中所受的苦难在这三到五年经历一遍,没有韧性是绝对不行的。
《程序员》:再次感谢您接受我们的采访,近来,世界杯预选赛中国队踢的不错,有一种脱胎换骨的感觉,但愿我们的程序员也能像中国足球队员一样,换一个新面貌。
(转载)把职业程序员进行到底(先前程序员杂志对360总裁的访谈)
最新推荐文章于 2021-10-26 00:00:00 发布