这是发到我邮箱里面的一封信,感觉这位同学的问题有相当的代表性,其实代表了一大批想学计算机,还没有迈过编程开发这道“门槛”的,更谈不上能以一个较高的高度,“俯视”计算机软件开发科学的总揽,无法系统看待编程开发这件事的朋友的迷茫。 我不敢说自己已经达到了这个高度,就我自己评价,我也仅仅是“入门”而已,能混饭吃,就这么个水平。因此,这个问题我不一定回答得好,但是,我想,作为过来人,我努力答答看,能说多少说多少,大家能理解多少就理解多少,如何? 呵呵,还是那句话,一家之言哈,欢迎拍砖。 原文如下: 肖老师你好:
这位朋友你好,你的问题,看似简单,其实已经涉及到程序设计最深层次的问题,可以说,算是程序设计的“世界观”,很不好回答,我只有尽量答答看,答得不好,请见谅。 简单点说吧,我觉得,软件开发,涉及的知识方方面面,内容很多,很多时候,我们给新人一说,就至少包括如下内容: 1、1~2门语言 至少要学会一门OP,即面向过程的语言,比如C,同时,也要学习一门OO的语言,比如Java,C++等。这很好理解,现代程序设计,要求高内聚,低耦合,没有OO思想,很难做到,但是,OO一般善于组织模块架构,具体到功能实做,还是OP的,Java和C++,函数内部还是OP的思想,大家想对不对? 2、数据结构,算法语言 程序设计就是“搬数”,这在我的新书《0bug -- C/C++商用工程之道》里面有专门章节论述,所有的具体计算工作,都可以视为“取出数据--计算--放回数据”这三步骤,那么,怎么搬数最快,如何组织数据来搬xxx,你说重不重要?这两门课就是回答这个问题的。 3、编译原理,操作系统,计算机组成原理 这些看似和程序开发影响不大,但是,这是内功,讨论的是计算世界最本质的构造特点,如果不了解这些知识,就无法“逆推想”别人的系统是怎么实现的,我见过所有的牛人级程序员,其实都是这几门课掌握很好的,才能从普通程序员中脱颖而出,成长为牛人,狠人。想想看,一旦这些本质的道理掌握了,别人的程序、系统在你面前,过眼就知道他是怎么实现的,如何重现,用了那种算法,有什么优缺点,如果我要做产品,怎么打他?。。。你说牛不牛? 事实上,这里多说一点,我的《0bug -- C/C++商用工程之道》一书里面提供的工程库之所以彪悍,可以实现高安全性,高可用性和高稳定性的跨平台并行开发,其实我是用写操作系统的功力在写应用程序库,内力上相当于提升了一个数量级,肯定效果好啦。其实这里面已经有点xx的嫌疑了,用写操作系统的功夫和写普通应用程序的朋友PK,肯定占便宜。呵呵。 这点,看过书的朋友应该有印象,大家想想看,操作系统提供什么服务?资源管理,IO访问,时间片管理,差不多主要就这么多吧,我的库同时也提供这些功能,而且更加安全,实际上,除了Boot loader和磁盘管理,大家可以认为我的库,是一个纯运行版的操作系统的雏形。 也正是因为我的库,相当于抽象了32位多任务操作系统的api服务特征,所以才能跨平台通用。比如哪{yt}出个新的操作系统,只要我从系统api中获得内存、锁、线程时间片的分配功能,我的库就可以移植上去跑的。我甚至前段时间还想,能不能在C51这种16位,明显没有操作系统的平台上跑我的库。 其实想想并不难的,C51虽然没有时间片概念,但是中断很多,我随便拦截一路中断,比如时钟中断,就可以抢到时间片,那么,我的库就可以开跑,至于锁和内存管理,连时间片都是我定义的,我当然可以自己做锁,我做个标志,来定义那个动作不可打断就好了,内存池说白了就是个大数组,划分一段二进制buffer而已,简单到要死。 请注意,这位朋友,我说这么多,不是想吹嘘自己,我只是想告诉你,这三门课如果学好了,就这么彪悍。明白吗? 嗯,总结一下吧,{dy}个问题,我想已经回答你了,学习软件开发,我的理解,不管以后用什么语言,在什么平台,做什么应用,上述几门课,建议好好学,这是你闯荡江湖的根本,吃饭的家伙,可不能马虎。 呵呵,好,我们再换个话题。 如果说就事论事,说一个年轻的朋友怎么学能学到计算数学的本源特征,我认为上面的回答就已经够了,下面,就请这位朋友回去自己慢慢K书吧。 不过,如果我自己来说,远远不够。即使掌握了上述所有知识,也不一定能写出程序的。 写程序,是创作,不一样的。 “熟读唐诗三百首,不会作诗也会吟”,听过没。 但是,还有一句话,“明清以来无诗人”。 唐诗宋词元曲,可以说代表了我国诗歌文化的{zg}{df},但近几百年以来,大家发现没,随着名作越来越多,后人的创造力,越来越少,佳作匮乏。近几百年,我{wy}欣赏的,还就是毛大爷的“北国风光,千里冰封,万里雪飘...”的《沁园村.雪》。 大家想过为什么没? 我认为问题就出在前面那句话。“熟读唐诗三百首,不会作诗也会吟”,都跑去Copy了,谁还玩真的,自己写啊?大家说是不是? 其实现在计算机界也有这个问题,目前软件界的风气,学术气氛很浓,重学习,轻创造,结果培养出一堆堆的“小学究”来,一到实际工作中就喊黄。嘴巴上说起来一套套的,实际手上一点真功夫没有,这哪成? 你不信,看看现在这么多培训班吧,为什么会存在?想过没?如果学校出来的人才真的那么好用,大学生还至于找不到工作吗? 这个我有切身感受,很多年轻的朋友,解决个问题,做个方案,一说就是找标准,找开源,貌似一个程序别人没写过,没定义过,自己就不敢做事了一样。你认为这样对不对? 其实,我这里要说句话,开源的流行,事实上限制了程序界的创造力。原因很简单,开放源代码,实际上是剥夺了对方思考的权利,人是有懒惰的天性的,有个不好的先用着,哪还会去想自己做个更好的。 别看那么多朋友天天跟我讲,“我一定要好好学习一下某个开源代码,争取做个程序比他还好”,我就笑。Linux够开源的了吧,10几年前就进中国了,可惜,到现在核心主干上,没有中国人一行代码。这说明什么?这十几年,中国人没有为Linux做过一点创造性的事情,光吃现成的了,因此,我这里说句话,大家别埋怨国外大师多,也别埋怨国外程序员收入高,咱们自己不争气,水平太低,创造不出人家那么大的价值,大家说对不? 我经常和小弟开玩笑,说我要是害你们,就直接给你源代码用,你要是想我真的帮你,就听我说原理,理解了自己想方案。大家能理解什么意思吗? 我的新书《0bug -- C/C++商用工程之道》为什么不给源代码?代码成熟度太高,拿来就能用,我一直就怕大家光用代码不思考,我本意是连代码都不想给全的,只说最重要的核心逻辑,后来编辑劝我,你要给还是给个完整的吧,毕竟是出书,要能切实帮到大家,所以才给全的。读者可以注意,中间有小部分代码我根本连注释都懒得加,那些都是1+1=2的东东,和本书说明的问题无关,仅仅是为了给一个完整的模块,才Copy上去的。我更多地还是希望大家能学到思想,而不是仅仅Copy一堆代码来用。 所以,我要说的第二个大问题,保持你的创造力,不人云亦云,善于自己思考,才是最关键的,我想,不仅仅是程序设计这门学问,任何一门学问,这个道理都是对的,大家说是不是? 嗯,再换个话题。 我前面有文章讲过,功夫在诗外,程序设计,其实和大多数行业一样,行业内部还是有高下之分。 刚开始大家是“学徒”,再后面,有点本事了,可以做点事,叫做“匠人”,这基本上养家糊口没问题了。但是,如果没有创造力,很可能终身就停留在这个阶段了。 只有不断思考,不断敢于创新,慢慢的,能跨越前人的限制,创造出属于自己的作品,就可以称之为“大师”。 如果再往后,不断努力思考,提升自己的系统化观念,提升自己的全局思维,进而,发现前人的弱点,发现业界的空白,自己创造出一些理论和方法,来填补这些空白,帮助整个业界进步,这时候,可以称之为“宗师”。 你想做哪种? 但是,我也说过,越往后,其实需要的本专业领域的知识,越少,更多的是向哲学在靠拢,逐渐提升自己的世界观,提升自己对这个世界本源问题的思考,还要学习美学、语文等一系列知识,慢慢地融会贯通,方能大成。 难不难? 我的回答是:慢慢做咯。 你说呢? ======================================================= 如果大家看了,觉得我的书好,有帮助,麻烦去这两家写点书评,我需要大家的鼓励,也希望这本书能帮助更多的人。 肖舸 如果您对我的文章感兴趣,请点这里添加我为好友:
|