优秀程序员手册

上传人:xzh****18 文档编号:34597531 上传时间:2018-02-26 格式:DOCX 页数:10 大小:31KB
返回 下载 相关 举报
优秀程序员手册_第1页
第1页 / 共10页
优秀程序员手册_第2页
第2页 / 共10页
优秀程序员手册_第3页
第3页 / 共10页
优秀程序员手册_第4页
第4页 / 共10页
优秀程序员手册_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《优秀程序员手册》由会员分享,可在线阅读,更多相关《优秀程序员手册(10页珍藏版)》请在金锄头文库上搜索。

1、 优秀的程序员382 点击 | 4 回复 MOP 美女联盟在看这份 FAQ 之前,你必须先读完 ESR 的如何成为一名黑客 (本文末尾附有中译版),该文所讲过的道理我不再重复。该文用很大的篇幅讲什么是黑客文化,虽然态度和信仰的确是成功的最关键因素,但是你肯定会想,做不做黑客跟我没关系,我只是想学个一技之长,找个好工作而已,对吧?那么肯定更希望获得一些具体的可操作的指导。 1、各种软件技术之间是怎样的关系? 我把软件技术分为三个层次: 问题域:计算机图形学、音视频编码、信息安全、模式识别、信息检索、自然语言分析、人工智能、科学计算等; 系统集成:C+和 Java 等面向对象语言、 Python

2、等解释型语言、LISP 等函数式编程语言、GUI 、中间件、编译器与解释器、虚拟机、数据库、网络服务、并行计算、集群、Peer2Peer、系统管理等; 系统功能:硬件描述语言、计算机体系结构与编程模型、指令集与汇编语言、C 语言、内核、文件系统、设备驱动、网络协议、POSIX 等。 计算机最终是做什么用的呢?最终是通过问题域的各种技术为用户解决问题的,这些技术都包含很高深的算法,然而它们必须在一个平台上运行,它们需要利用平台提供的各种基础设施,比如计算能力、I/O 能力和网络互联能力。系统功能和系统集成层就是用来实现这个平台的。系统功能层实现计算、I/O 和网络的基本功能,系统集成层对这些基本

3、功能做一些抽象和包装,提供更方便灵活的接口。 2、为什么要学习嵌入式技术? 在亚嵌的学习期间,你将详细了解系统功能层的各部分是如何工作的,也会在面向对象编程、GUI 、数据库、网络服务等系统集成层的技术方向进行探索。嵌入式系统可说是麻雀虽小五脏俱全,虽然没有 PC 和服务器那么复杂,但计算机系统的各种组成一样也不缺。因此,以嵌入式系统作为切入点开始学习软件技术是非常好的选择,避开不必要的复杂性,把握计算机系统最根本的概念和技术要点。打下扎实的基础之后,你的职业发展则完全不必局限于嵌入式领域,即使你日后做 PC 或服务器开发,在亚嵌所学的知识和技能同样使你终生受益。正如庖丁解牛,心中有全牛,自然

4、就能游刃有余。 另一方面,你一定见到各大网站都有大量的宣传,说现在嵌入式行业前景空前的好,嵌入式人才紧缺,有几百万职位空缺等等。这些说法也是对的,但我们需要更深入地理解这说明了什么问题。刚才我们说,嵌入式系统也是一个完整的计算机系统,和 PC 或服务器没有本质的区别,事实上,嵌入式、PC 和服务器的界限已经越来越模糊了。以前的嵌入式就是单片机,只能做简单的运算处理,现在的 ARM 处理器性能比从前的奔腾还强,打游戏、看电影都没问题,谁能说它不是 PC 呢?另外有些专用的嵌入式系统已经在充当服务器的功能了,而集群技术更是可以使许多廉价的处理器组合在一起发挥大型服务器的作用。由于嵌入式越来越多地应

5、用到电器、汽车和各种设施上,无处不在,并且与PC、服务器呈融合的趋势,所以嵌入式行业前景空前的好。 那么,为什么说嵌入式人才紧缺呢?其实,学嵌入式系统就是学计算机系统,本质上并没有什么特殊的只有嵌入式系统才有的技术。说嵌入式人才紧缺,其实质上是说真正懂计算机的人才紧缺。现在很多学校的所谓“软件学院” 培养的软件人才都是一叶障目不见泰山的:只懂 J2EE 和.NET,没学过 C 和汇编;只会调库函数 sort(),而对各种排序算法一无所知;设计模式、软件工程讲得头头是道,却不知道好的软件还是要靠牛人靠智商来做的。培养人像蒸包子一样一屉一屉地出,靠软件工程搭一条生产线,然后让熟练工人站在生产线上拧

6、螺丝,幻想着这样就能生产出好的软件,那是把软件工程和程序员的作用本末倒置了。现在嵌入式开发对程序员的素质要求更高了,以上这类“软件人才” 不能胜任了,因此说嵌入式人才紧缺。亚嵌的就业班虽然只有几个月,但培养目标是有完整的计算机系统概念的软件人才,而不是只会拧螺丝的软件工人,这正得益于我们始终坚持做嵌入式培训而不是 Java 或 .NET 培训。 3、有人说软件技术变化太快,现在学的东西过两年就要完全淘汰,是吗? 你知道这话是什么人说的吗?必然是已经被淘汰的人说的。比如Delphi、BCB、PB 这些开发工具和语言,都曾经很是风光了一阵,但现在已经完全被 Java 和.NET 取代了。那么 Ja

7、va 和.NET 会不会被取代呢,也许在相当长的时间内还不会,但是我看好 Python。 这些被淘汰的程序员有一些共同的特点:只会用鼠标拖拽控件,离开 IDE 就不知道如何工作,学点儿花拳绣腿的功夫就想吃一辈子,对学习新技术不感兴趣,做一天和尚撞一天钟。现在请回头看看 FAQ1,在整个软件技术领域,这些变化快的技术其实只占了很小的一块,却成了这些人的全部看家本领,这样的人能不被淘汰吗? 与这些流行的开发工具和语言相反,很多技术和思想是很少变化的。比如,POSIX 和 SUS 标准规定了一套系统函数接口和基本命令的语义,只有实现了这些才可以称作 UNIX,因此今天的 Linux、Solaris

8、跟 20 多年前的 UNIX 在系统功能层上是基本一致的。而指导计算机科学发展的数学理论,甚至是老祖宗们在计算机还没诞生的年代就替我们想好的:布尔代数发表于 19 世纪,直到一个世纪后发明了计算机和数字电路才有了用武之地;数论在 17 世纪就出现了,一直都被数学家们当成一套好玩的理论,但只是好玩而已,直到计算机密码学诞生后才发现它的实际用处。 各种流行的开发工具和高级语言虽然变化很快,但是底层的编程语言却非常稳定,各种操作系统的内核都是用 C 语言写的,以前是这样,以后也不会改变。另一方面,各种编程语言的设计思想也是非常稳定的。其实世界上只有两种编程语言,一种是 C,一种是 LISP,前者是

9、imperative 的,是对计算机模型的抽象,后者是 functional 的,是对数学函数模型的抽象。面向对象是一种重要的软件工程思想,却算不上一种新的语言模型,应该归在 C 的一类。属于同一类的各种语言其实都大同小异,一个精通 C+的人学习 Java 需要多长时间?熟悉语法一个星期,熟悉类库三个星期,一个月足矣,以往的经验都可以套到新的编程语言上。然而要想习得深厚的算法功底、逻辑思维和抽象思维修养,能够真正说清楚“系统”是什么,如何分析和设计“系统”,需要多长时间?恐怕要数十年。 4、C 和 Java 哪种语言更好? 计算机科学与编程语言无关,甚至与计算机本身也没太大关系,它研究的对象并

10、不是计算机,而是人分析问题解决问题的方法论。程序写出来最主要不是为了给计算机执行的,而是为了给人看的,使用编程语言和使用自然语言一样是为了表达和交流,只不过程序还可以顺便给计算机执行而已。 以上这些话并不是我说的,而是一位著名的计算机科学家说的。所以,在编程语言的层面上争论是没有意义的。很多初学者错误地认为掌握了编程语言就等于学会了计算机,一种编程语言都还没有掌握好,更没有上升到方法论的层面,只有这种无知的人才会去争论哪种语言好的问题。掌握了编程语言远远不等于学会了计算机,而只是最开始的一步,最简单的一步,到了工作中,用到什么语言就去学什么语言,什么语言过时了就丢掉,编程语言不需要积累因为它太

11、简单了,真正需要积累的是方法论。 很多人喜欢参与到这类争论之中,毫无例外,每个人都在为自己熟练掌握的编程语言辩护,就是“我会的语言最好,我不会的语言都不好” ,其实这些人真正想说的是“我会的语言最好是千秋万代,我就不必学新的语言,不必适应新的变化了”,概括起来说就是一个字,懒。真正的高手都是会很多编程语言的,国外有些做技术咨询的,每年都要学好几门新的编程语言,这样才能应对市场的变化。不断丢掉旧的编程语言学习新的,看起来好像完全是白费力气,没有积累,其实,每种编程语言的设计都有独到之处,体现了每种语言的精髓,在融汇百家之后积累下来的正是方法论。 争论哪种语言能做的事情更多、功能更强是没有意义的。

12、从理论上说,任何一种符合图灵机模型的编程语言,加上适当的 I/O 扩展都可以做任何事情,用shell 脚本也可以写出很像样的游戏来。只不过各种语言的设计目标不同,表达能力不同,做不同的事情所需的代码量不同而已。 另外一种错误认识是:哪种语言的市场最大,开发人员最多,哪种语言就最好。单从这种意义上说,Java 的确比 C 更好,所以往届有学员问我们为什么只教 C语言。请你注意,操作系统内核是用 C 写的,各种底层的应用程序包括 Java 虚拟机也是用 C 写的。如果你想学 Java,在亚嵌的学习完成后你将有能力分析Java 虚拟机的实现,站在计算机系统的高度来学 Java 才会使你成为真正的Ja

13、va 高手。如果你只想速成,想早点学成一门技术去做拧螺丝的工作,那么亚嵌不适合你。 在 FAQ3 里说过,世界上有 C 和 LISP 两种编程语言,你现在学了 C,以后学了C+、Java 、 .NET 等等,也仍然只认识了半个世界。LISP 和 Haskell 构成了另外半个世界,现在很常见的 Python 和 Java 脚本等解释型语言也借用了functional programming 的思想。如果你只管闷着头写代码,而不去广泛涉猎,那么你将错过很多精彩。 5、我听说编程编到三十五岁就没人要了一定要转行找出路是吗? 这个观点虽然很流行,但根本不值一驳。现在三十五岁转行的那些人,都具有前面所

14、说的那些特征,对学习新技术不感兴趣,对探索计算机的本质不感兴趣,得过且过,下了班就是打游戏、看电视,总之就是懒。如果是开出租、摆摊,勤快人懒人都有饭吃,而 IT 这一行对懒人是非常无情的,懒人就不该入 IT 这一行,不从自身找原因,却到处散布这种言论,怪社会不好,打击新人的信心,着实可恨。 另外一种情况,编程编到三十五岁,进入公司的管理层,或者自己创业,这都是很勤快的人,如果他们把这种勤快用在技术上肯定也可以做得更好,所以也无法证明编程编到三十五岁会因为没有出路而转行。 编程不是个体力活,需要高强度的思考和智力投入,分析能力、思考能力都需要时间积累起来,所以并不是越年轻干得越好。相反,我认为三

15、十岁以前写的代码都是垃圾,三十岁以后才能写出像样的程序来。如果希望一辈子走技术的道路而不会被迫转行,就要不断地把自己的工作性质从“体力活” 变成“脑力活”。什么叫“不断地”变呢?这里的“体力活” 并不是指种地、盖房子这种劳动,而是指简单重复地编写代码,这时你会感觉,派给你的工作都能凭以往的经验轻松应付了,但是千万不要满足于现状,就像温水煮青蛙一样,这是危险的处境!要摆脱这种处境就需要学习、思考、提高,让公司派给你更有挑战性的工作,在工作中应用新学到的知识和技术就是“脑力活” 了,但是用得久了又会变成简单重复的“体力活”,这时就需要再学习、再提高,所以叫做 “不断地”把自己的工作性质从“体力活”

16、变成“ 脑力活” 。如果有一天你发现,自己长期陷于简单重复的劳动之中,并且业余时间非常少,无法学习提高,这说明公司不会用人,你就该考虑跳糟了。 从另外一个角度来说,如果希望一辈子走技术的道路,就要有自己的核心竞争力,这个核心竞争力决不是凭以往的经验能够做某些工作的能力,而是学习能力、思考能力和解决有挑战性的新问题的潜力。在 IT 这一行,凭借以往的经验干重复的活是干不长久的,原因很简单,一个问题不会被解决两次,当你发现你的经验能够解决一类问题时,别人早把解决这一类问题的套路编写成framework,新上手的人即使不具备你的这些经验也可以调用 framework 中的类和函数来解决问题,然后在这个 framework 的基础上积累新的经验解决新的问题。正因为如此,全世界开发人员的经验才会积累起来,促使软件技术发展得如此迅速。这并不是说经验完全没有用,最关键的,学习和思考也是建立在以往经验的基础之上的。另一方面,现有的 framework 并不一定是某方面开发经验的完美整合,也需要不断发展,用新的办法重新解决老问题,以 Web

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 理论文章

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号