软件开发能力的本源讨论

简介:

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

本文转自 tonyxiaohome 51CTO博客,原文链接: http://blog.51cto.com/tonyxiaohome/253086,如需转载请自行联系原作者

相关文章
|
6月前
|
Cloud Native Go
软技能的重要性:在面试中展示团队合作与沟通能力
软技能的重要性:在面试中展示团队合作与沟通能力
66 0
|
7月前
|
存储 NoSQL 关系型数据库
重构之道:揭秘大规模系统重构的经验与挑战
重构之道:揭秘大规模系统重构的经验与挑战
144 2
|
9月前
学习总结(人不成熟的五大特征、时间管理法)
学习总结(人不成熟的五大特征、时间管理法)
60 0
|
12月前
|
设计模式 消息中间件 架构师
如何成为更好的软件架构师?
如何成为更好的软件架构师?
|
架构师 机器人 Java
测试理论-软件测试理论基础
软件测试的IEEE定义:使用人工或自动的手段来运行或测量软件系统的过程,目的是检验软件系统是否满足规定的需求,并找出与预期结果之间的差异。
154 2
测试理论-软件测试理论基础
《伟大的小细节:互联网产品设计中的微创新思维》——1.1 细节创新有没有门道?怎样借鉴创新?
本节书摘来自华章计算机《伟大的小细节:互联网产品设计中的微创新思维》一书中的第1章,第1.1节,作者:文哲著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1270 0
《伟大的小细节:互联网产品设计中的微创新思维》——第3章 3.0场景化设计
本节书摘来自华章计算机《伟大的小细节:互联网产品设计中的微创新思维》一书中的第3章,第3.0节,作者:文哲著, 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1228 0