迈进这层楼的门槛是很低的。基本上懂计算机的基本操作,了解计算机专业的一些基础知识,掌握一门基本的编程语言如C/C++,或者Java,或者JavaScript,...,均可入门迈进这层。
如计算机专业毕业生,大量的通信、自动化、数学等相关专业的转行人士。
这类人员不管是不是计算机科班出身,基础如何,他们对编程有着特殊的爱好,他们可能会是一些很有前途的学生或实习生。
他们完全是靠热情和承诺来编程。兴趣永远是最好的老师,也是最好的一件事,因为兴趣而引发的热情通常会让这些程序员成为“骨干程序员”。
所以,菜鸟们总是在努力学习,希望爬更高的一层楼去。
2、大虾从第1层爬到第2层相对容易一些,以C/C++程序员为例,只要熟练掌握C/C++编程语言,掌握C标准库和常用的各种数据结构算法,掌握STL的基本实现和使用方法,掌握多线程编程基础知识,掌握一种开发环境,再对各种操作系统的API都去使用一下,搞网络编程的当然对socket编程要好好掌握一下,然后再学习一些面向对象的设计知识和设计模式等,学习一些测试、软件工程和质量控制的基本知识,大部分人经过2~3年的努力,都可以爬到第2层,晋升为"大虾"。
3、牛人由于"大虾"们经常被一些疑难问题给卡住,他们只好继续学习,将原来所学的知识进一步熟练掌握。
以软件设计来说,光懂结构化设计、面向对象设计和一些设计模式是不够的,还要了解软件架构设计、交互设计、面向方面的设计、面向使用的设计、面向数据结构算法的设计、情感化设计等,否则是很难进到这个楼层的。
当然除了上面说的知识外,大虾们还需要去学习各种经验和技巧。当然这点难不倒他们,现在出版的书籍众多,网络上的技术文章更是不胜数,然后再去各种专业论坛里泡一泡,把这些书籍和文章中的各种经验、技能、技巧掌握下来,再去学习一些知名的开源项目如Apache或Linux操作系统的源代码实现等。此时对付一般的疑难问题通常都不在话下,菜鸟和大虾们会觉得你很"牛",你也就爬到了第3层,晋升为"牛人"了。
在国内, 一旦成为"牛人",通常可以到许多知名的公司里去,会被称为“架构师”"首席架构师"或者"首席xx学家"。
4、大牛从牛人进阶成为大牛并不容易,就像是百分制,到及格线比较轻松,但是60分到80分就会更难了。要成为大牛的话,你必须要能做牛人们做不了的事情,解决牛人们解决不了问题。比如牛人们通常都不懂写操作系统,不会写编译器,不懂得TCP/IP协议的底层实现,如果你有能力将其中的任何一个实现得象模象样的话,那么你就从牛人升级为"大牛"了。
要成为"大牛"并不是一件简单的事情,需要付出比牛人们多得多的努力,一般来说,至少要看过200~400本左右的专业书籍并好好掌握它,除此之外,还得经常关注网络和期刊杂志上的各种最新信息。
5、专家当大牛们真正动手做一个操作系统或者类似的其他软件时,他们就会发现自己的基本功仍然有很多的不足。这个时候就要求他们会进行基础研究,主要的内容就是研究非数值"计算"。
非数值计算可是一个非常庞大的领域,不仅时下热门的"多核计算"与"云计算"属于非数值计算范畴,就是软件需求、设计、测试、调试、评估、质量控制、软件工程等本质上也属于非数值计算的范畴,甚至芯片硬件设计也同样牵涉到非数值计算。如果你还没有真正领悟"计算"二字的含义,那么你就没有机会进到这层楼来。
在这个时候,牛人和大牛都要仰望你,但是到这里,你的知识来源都是别人的,是在别人知识的基础上改写。你自己并没有多少自己的知识和思想分享给别人,如果想要进入另一个阶段,还需要继续往上爬。
6、学者当"专家"们想继续往上一层楼爬时,他们会发现专业性的学习对于他们来说是很简单的,拦路虎是“创新”。像上面提到的,想要在专家的基础上更近一步,就需要产生自己的知识和思想。
但学习的都是一样的东西,怎么去创新呢?古人有一句话“温故而知新”,也就是工作当中说到的“复盘”。
以查找为例,并不是去天天盯着那些复杂的查找结构和算法进行研究,你需要做的是将二分查找、哈希查找、普通二叉树查找等基础性的知识好好地复习几遍。
对任何一种简单的东西,你需要考虑各种各样的需求,以需求来驱动研究。最后你将各种最基础性的查找结构和算法都了然于胸后,或许某天你再看其他更复杂的查找算法,或者你在散步时,脑袋里灵光一现,突然间就发现了更好的方法,也就从专家晋升为"学者"了。
学者所做的事情,通常都是在前人的基础上,进行一些小的优化和改进。
这层楼里所说的创新,是指学术层面的创新,是基础研究方面的创新。
7、大师成为大师必须要有较大的贡献。首先解决问题必须是比较重要的,其次你要比前辈们在某方面有一个较大的提高,或者你解决的是一个全新的以前没有解决过的问题;最重要的是,主要的思路和方法必须是你自己提供的,不再是在别人的思路基础上进行的优化和改进。
如,像Hoare一样设计出一个快速排序的算法;或者像Eugene W. Myers一样设计出了一个用编辑图的最短路径模型来解决diff问题的算法;或者像M.J.D. Powell一样提出了一个能够处理非线性规划问题的SQP方法;甚至设计出一个像C++或Java一样的语言......
以前在单核时代开发的各种算法,现在都需要改写成并行的。数据结构与算法、图像处理、数值计算、操作系统、编译器、测试调试等各个领域,都存在大量的机会,可以让你进到这层楼来,甚至有可能让你进到更高一层楼去。
8、科学家科学家向来都是一个神圣的称号,要成为科学家,你的贡献必须超越大师,不妨举一些例子。
如Dijkstra设计了ALGOL语言,提出了程序设计的三种基本结构:顺序、选择、循环,他是可以被称为科学家的。
类似的还有:
Don Knuth,奠定数据结构与算法这门学科的基础;
巴科斯,发明Fortran语言,提出了巴科斯范式,对高级程序语言的发展起了重要作用;
Ken Thompson、Dennis Ritchie,发明Unix操作系统和功能强大、高效、灵活、表达力强的C语言,对操作系统理论和高级编程语言均作出重大贡献。
......
看了上面列出的科学家的成就,你会发现,要成为“科学家”,通常要开创一门分支学科,或者是这个分支学科的奠基者,或者在某个分支学科里作出里程碑式的重大贡献。