软件开发能力的本源讨论

简介:

这是发到我邮箱里面的一封信,感觉这位同学的问题有相当的代表性,其实代表了一大批想学计算机,还没有迈过编程开发这道“门槛”的,更谈不上能以一个较高的高度,“俯视”计算机软件开发科学的总揽,无法系统看待编程开发这件事的朋友的迷茫。
我不敢说自己已经达到了这个高度,就我自己评价,我也仅仅是“入门”而已,能混饭吃,就这么个水平。因此,这个问题我不一定回答得好,但是,我想,作为过来人,我努力答答看,能说多少说多少,大家能理解多少就理解多少,如何?
呵呵,还是那句话,一家之言哈,欢迎拍砖。
原文如下:
肖老师你好:
     我是一位大四的学生,不是计算机专业的(就读食品科学与工程),我很喜欢计算机,很期望在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,如需转载请自行联系原作者

相关文章
|
1月前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
2月前
|
测试技术 持续交付 UED
软件测试的艺术与科学:平衡创新与质量的探索在软件开发的波澜壮阔中,软件测试如同灯塔,指引着产品质量的方向。本文旨在深入探讨软件测试的核心价值,通过分析其在现代软件工程中的应用,揭示其背后的艺术性与科学性,并探讨如何在追求技术创新的同时确保产品的高质量标准。
软件测试不仅仅是技术活动,它融合了创造力和方法论,是软件开发过程中不可或缺的一环。本文首先概述了软件测试的重要性及其在项目生命周期中的角色,随后详细讨论了测试用例设计的创新方法、自动化测试的策略与挑战,以及如何通过持续集成/持续部署(CI/CD)流程优化产品质量。最后,文章强调了团队间沟通在确保测试有效性中的关键作用,并通过案例分析展示了这些原则在实践中的应用。
75 1
|
2月前
|
测试技术 UED 开发者
软件测试的艺术:从代码审查到用户反馈的全景探索在软件开发的宇宙中,测试是那颗确保星系正常运转的暗物质。它或许不总是站在聚光灯下,但无疑是支撑整个系统稳定性与可靠性的基石。《软件测试的艺术:从代码审查到用户反馈的全景探索》一文,旨在揭开软件测试这一神秘面纱,通过深入浅出的方式,引领读者穿梭于测试的各个环节,从细微处着眼,至宏观视角俯瞰,全方位解析如何打造无懈可击的软件产品。
本文以“软件测试的艺术”为核心,创新性地将技术深度与通俗易懂的语言风格相结合,绘制了一幅从代码审查到用户反馈全过程的测试蓝图。不同于常规摘要的枯燥概述,这里更像是一段旅程的预告片,承诺带领读者经历一场从微观世界到宏观视野的探索之旅,揭示每一个测试环节背后的哲学与实践智慧,让即便是非专业人士也能领略到软件测试的魅力所在,并从中获取实用的启示。
|
6月前
|
敏捷开发 持续交付 项目管理
【软件工程】走近演化过程模型:软件开发的不断进化之路
【软件工程】走近演化过程模型:软件开发的不断进化之路
|
4月前
|
敏捷开发 算法 搜索推荐
软件测试的演变:从传统方法到敏捷实践
本文深入探讨了软件测试领域的发展轨迹,从早期以代码为中心的测试方法,到今日强调快速迭代和持续集成的敏捷测试实践。文章通过分析历史数据、行业报告以及权威研究,揭示了测试自动化、跨功能团队合作以及质量保证在现代软件开发中的重要性。进一步地,本文还讨论了如何将科学严谨性融入测试过程,包括采用基于证据的测试策略、利用统计方法评估软件质量,并提出了逻辑严密的测试案例设计原则。
学习总结(人不成熟的五大特征、时间管理法)
学习总结(人不成熟的五大特征、时间管理法)
93 0
|
架构师 UED
【设计思维框架】为现代企业重新设想的设计思维(上)
【设计思维框架】为现代企业重新设想的设计思维
|
安全 数据可视化 测试技术
【设计思维框架】为现代企业重新设想的设计思维(下)
【设计思维框架】为现代企业重新设想的设计思维
|
设计模式 消息中间件 架构师
如何成为更好的软件架构师?
如何成为更好的软件架构师?
|
敏捷开发 架构师 项目管理
架构师才能看懂的大型网站架构面临的挑战:业务架构的基本思路
业务架构的基本思路 大型网站系统有很多功能,一次性明确所有的功能需求并设计出一个庞大的业务架构是一件费力不讨好的事情。因为在项目前期,难免会忽视一些琐碎功能,而随着开发的进行,也会有很多新的想法产生,基本上不会存在完全按照最初的业务架构设计完成的软件产品。因此,业务架构不仅要做到“规整功能模块,厘清产品业务逻辑”,更重要的是如何做到“有规划性地应对项目过程中的需求变更”。
下一篇
无影云桌面