我自己的一位大二学生,由参加ACM不安心,后来体会了应用的核心在算法,能在竞赛中坐住了。但现在,又有新问题了。
【来信】
贺老师,我想问一下,如果打算考研,在这四年里只搞算法不搞应用,或者说只是懂一点应用,这样合适吗。
【回复】
算法在计算机和软件工程中都很重要,但不是全部。大学期间的学习,是专业教育中的基础阶段,其他的也要好好学。研究生开始,要钻研具体的研究方向,需要对专业全面的了解作为支撑。对于应用,可以理解为要从事这方面的工作,但我认为更重要的作用在于,为理解基础理论提供一个介质,让理论生动起来,感悟知道理论的价值。搞搞应用,让学习生动起来。马上大三了,可以在一段时间内,专注某个技术,做个小应用,认真对待各门课的课程设计,这样的学习也会更好玩一些。不搞应用,或只懂一点(不做是达不到懂一点的),远不够。
【学生答复】
老师讲解的很详细 跟我的想法也有很多相似之处,我也想做一些小的应用,练练手,老师你说的研究生开始钻研具体的研究方向是什么呢,是具体的开发技术吗?
【我的长文回复】
这是一个很好的问题。我发现我应该为你和广大同学普及一下关于研究方向和开发技术方面的一些常识了。
下面一段的阐述来自《逆袭大学——传给IT学子的正能量》第2.3节“搞计算机的人干什么”的缩写,你们班有同学买了,你可以借阅深入了解。
对于主修计算机类学科的学生,以及从其他途径要进入到这个行业中的人员,学有所成之后要从事的本行业的工作范围很广,却需要放开我们的视野,在科学、工程、技术和应用四大领域中搜索一番了。
按照传统的说法:
工程和技术的关系有些复杂。技术是人在改造自然、改造社会,以及改造自我的过程中所用到的一切手段、方法的总和。技术人员是创造者,是开发、发现这些手段和方法的人。工程师作为制造者、实现者,与发现者、创造者有很大的不同,他们的工作目标就是产品,要为用户负责,在一定的制度与规范约束下开展合作。技术对工程起着支撑作用,工程的立项必须要在技术可行性分析的前提下开展。
最后说到应用。按照CC2004中对计算机学科中划分的方向,信息系统和信息技术两个方向划分为应用型。信息系统方向的任务是负责建立和维护信息系统,这是让计算机技术和工程直接发挥作用的环节,是信息化社会的基本保障。从事“信息技术”应用,是要在各个不同的专业领域内用计算机去实现特定的计算需求。
科学、技术、工程和应用不仅需要不同的知识和技能背景,更重要的是他们具有不同的思维方式和工作模式。在不追求成为一个通才的前提下,搞清楚这里的差别,明确作为一个“搞计算机的人”,要做什么样的选择。
在《逆》书第5.2节“我们要什么样的知识和能力结构?”中,又讲:
计算学科,是研究计算机的设计、制造和进行信息处理等的理论、原则、方法和技术的学科,包括了科学、工程和技术:计算科学侧重于研究现象揭示规律,计算技术则侧重于研制计算机和使用计算机进行信息处理的方法和技术手段,计算机工程利用相关的方法和技术,生产出产品。这三方面互为依托,相互推进,计算科学中的研究成果转化为了技术,而计算技术的发展促进了计算科学研究的深入。用计算技术指导工程实践,而工程实践的发展转而作用于技术进步。因此,计算学科就是这样一门科学性与工程性并重的学科,其理论与实践也常常紧密地结合在一起。计算机要解决现实世界中的各种问题,模型构建和测试、评价,需要采用的是科学研究的方法,而设计和构建软硬件系统的过程,则属于工程范畴,采用工程学的方法。
所以在研究生培养阶段,要在专业下面分研究方向,高校教师和科研单位的研究人员,也有研究方向,企业里的高级技术人员,也有研究方向。
举例说明,“计算机科学与技术”下面再细分“计算机系统结构”、“计算机软件与理论”、“计算机应用技术”三个二级学科,这是我们常说的研究生招生的专业,是由国家规定的,而研究方向的设定很灵活,由招生学校自己确定。下面是从网上搜索得到的描述(应该是某校介绍其研究方向的材料,见《计算机专业研究方向详解》):
(1)计算机应用技术
研究方向:计算机网络、实时计算机应用、CIMS、计算机图形学、并行计算、网络信息安全、数据库、情感计算、 数据挖掘、分布式计算、知识工程、计算机视觉、自动推理、机器学习、草图理解、网络性能分析与协议设计、网络管理与安全、计算机图形学、信息可视化、基于 GPU的高性能计算、复杂系统(应急、物流、海洋)领域工程、基于SOA的空间信息共享与业务协同、语义搜索引擎、自然语言处理、机器翻译、搜索引擎、空中交通信息系统与控制、民航信息与决策支持系统、智能交通系统理论与技术等。
专业特点:计算机应用技术是针对社会与各种企事业单位的信息化需求,通过对计算机软硬件与网络技术的选择、应用和集成,对信息系统进行需求分析、规划和设计,提供与实施技术与解决方案,创建优化的信息系统,并对其运行实行有效的技术维护和管理的学科。
培养这方面人才所涉及的知识面包括:数学与信息技术基础、程序设计基础、系统平台技术、计算机网络、信息管理与安全、人机交互、集成程序开发、系统架构与集成、Web与数字媒体技术、工程实施、职业操守等。培养目标是为企事业单位和政府机构提供首席信息官及承担信息化建设核心任务的人才,并提供为IT企业提供系统分析人才。
(2)计算机软件与理论
研究方向:计算理论、算法理论; 软件工程、中间件、智能软件、计算环境;并行计算、网格计算、普及计算;密码学、信息安全、数据理论;图形图象算法、可视化方法;人工智能应用基础;理论计算机科学其他方向
专业特点:计算机软件与理论专业涉及计算机科学与技术的基本理论和方法,强调计算、算法、软件、设计等概念,主要的领域包括计算理论、算法与复杂性、程序设计语言、软件设计与理论、数据库系统、人工智能、操作系统与编译理论、信息安全理论与方法、图形学与可视化计算、以网络为中心的计算等。
就业方向:本专业培养的研究生具有坚实的计算机科学与技术的理论基础,全面掌握计算机软件的理论方法,以及软件工程、信息系统、并行计算、普及计算等等的软件系统开发技术,能很好地胜任高等院校、科研院所、大型企事业单位、高新技术产业等的教学、科研、系统设计、 产品开发、应用系统集成等工作。
(3)计算机系统结构
研究方向:分布式计算机系统、计算机网络系统与全球个人计算系统、真实感图形生成与虚拟现实技术
专业特点:计算机系统结构(原名计算机组织与系统结构)专业全面研究各种类型的计算机系统(从单机到网络)的构 成、硬件与软件的联系与功能匹配、计算机系统性能评价与改进等。该专业的研究课题涉及高性能处理机系统结构、多机系统、并行计算与分布式计算系统、计算机系统性能评价、VLSL设计、容错计算技术、计算机接口技术、计算机网络系统与通信系统、移动计算、全球个人计算系统等。
就业方向:本专业培养的研究生具有坚实的计算机科学与技术的理论基础,全面掌握计算机系统结构、计算机工程、网络工程、嵌入式系统等的应用开发技术、能很好地胜任高等院校、科研院所、大型企事业单位、高新技术产业等的教学、科研、系统设计、产品开发、应用系统集成等工作。
广义地讲,上面所提的各个研究方向中,都包含着开发技术的成份。所谓研究,并不全是所谓纯理论,这样的理论没有生命力。不少的研究,直接针对的,就是要制造出产品来。在制造产品的过程中,关键的科学问题和技术难点,需要的是“研究”,而在制造出样品的过程,那就是开发,需要开发技术的支撑。开发技术,本身也可以是研究方向,其中的门道,需要专业技术人员去掌握和拓展。
在广大的本科学生中间,对开发技术的范畴往往是狭义化了,将开发技术限定为是最终实现产品的时候所用的具体技术。例如谈到社交网络,研究人员脑中会想到这样的网络中蕴涵着怎样的规律;高级技术人员关心的是,海量的数据和用户同时访问,瓶颈问题如何解决,这里有开发技术的成份;在我身边的不少同学,关心的是用PHP开发Web应用,还是用Android开发出移动应用,这也是开发技术。
想与更直观些的土木工程做一个对比。在工程设计阶段,考虑采用什么样的结构、计算受力,目标在于设计出工程图纸的活动,需要开发技术;在设计方案的约束下进行施工,需要施工技术;而一线的建筑工人,钢筋工、木工、泥水工、外架工、水电工,他们最终实现工程任务,我们也常说需要技术,其中技能的成份更多一些。
讲这些,是想引出一个话题,我们面对IT行业,和传统的工程行业有区别。开发技术和施工技术以及实施技能之间的区分淡化了。在《逆》书第5.2节“我们要什么样的知识和能力结构?”中还讲:
在传统工业领域,产品设计和产品制造、生产之间的形态有比较大的差别,在生产链的不同环节需要的人员在知识结构方面差别较大。比如土木工程、规划、勘测、设计、施工、养护等技术和研究工作,往往由性质不同的单位实施,但在计算学科中,很多时候学科的理论、技术和工程之间的界限十分模糊,理论探索、技术开发和工程应用之间的周期很短,实验室产品和最终投放市场的产品之间几乎没有太大的差别。许多产品,尤其是软件产品,一经开发、测试完成,就可以通过复制或者通过在线的方式进行销售。计算机领域,科学与工程素质兼具的人才也更常见,科学家和工程师之间有比较明显的分工,但也有少数人既是科学家,也是十分出色的工程师。很多顶尖的公司,如谷歌公司,鼓励研究人员的成果在自己的主导下进行开发,快速变为产品,极大地缩短了新产品问世的周期,表现出的是一种强大的竞争力。
传统行业中的好工程师,能够完成高级的设计工作,而一下工地,一进车间,干工人的活也不逊色。作为一个IT行业的高素质人才,需要具备能完成各层次工作的能力。
大学中设置的课程,除了对应“通识教育”的部分外,专业基础课和专业课,最终的落脚点就在这些技术上。不要因为那些课程的形态与最终的技术呈现的形态不同就忽视它们。例如,程序员最终的工作是代码,而学习和研究算法,其表现形态却不是代码。而算法在编程中的重要性,是不需要多说的事。这是大学中奠定技术基础的任务。
【来信】
贺老师,我想问一下,如果打算考研,在这四年里只搞算法不搞应用,或者说只是懂一点应用,这样合适吗。
【回复】
算法在计算机和软件工程中都很重要,但不是全部。大学期间的学习,是专业教育中的基础阶段,其他的也要好好学。研究生开始,要钻研具体的研究方向,需要对专业全面的了解作为支撑。对于应用,可以理解为要从事这方面的工作,但我认为更重要的作用在于,为理解基础理论提供一个介质,让理论生动起来,感悟知道理论的价值。搞搞应用,让学习生动起来。马上大三了,可以在一段时间内,专注某个技术,做个小应用,认真对待各门课的课程设计,这样的学习也会更好玩一些。不搞应用,或只懂一点(不做是达不到懂一点的),远不够。
【学生答复】
老师讲解的很详细 跟我的想法也有很多相似之处,我也想做一些小的应用,练练手,老师你说的研究生开始钻研具体的研究方向是什么呢,是具体的开发技术吗?
【我的长文回复】
这是一个很好的问题。我发现我应该为你和广大同学普及一下关于研究方向和开发技术方面的一些常识了。
1 科学、技术、工程
科学、技术、工程是工科学生常见的关键词。除了这三个词,我还想加入管理。随着工业(包括化工、建筑等传统工业,也包括IT类的新型工业)的发展,对科学、技术、工程方面的管理日益重要。下面一段的阐述来自《逆袭大学——传给IT学子的正能量》第2.3节“搞计算机的人干什么”的缩写,你们班有同学买了,你可以借阅深入了解。
对于主修计算机类学科的学生,以及从其他途径要进入到这个行业中的人员,学有所成之后要从事的本行业的工作范围很广,却需要放开我们的视野,在科学、工程、技术和应用四大领域中搜索一番了。
按照传统的说法:
- 从事科学的人是“发现者”,他们试图发现自然、社会等方面存在的规律。
- 从事技术工作的人是“创造者”,他们利用已发现的规律试图创造新的物品、工具、方法来满足人类的需要。
- 从事工程的人是“实现者”,以合理的成本建造或生产稳定可靠的结构或产品满足大量人群的需要。
- 从事应用的人是“推广者”,将工程师创造的产品,普及到需要的地方,为社会大众服务。
工程和技术的关系有些复杂。技术是人在改造自然、改造社会,以及改造自我的过程中所用到的一切手段、方法的总和。技术人员是创造者,是开发、发现这些手段和方法的人。工程师作为制造者、实现者,与发现者、创造者有很大的不同,他们的工作目标就是产品,要为用户负责,在一定的制度与规范约束下开展合作。技术对工程起着支撑作用,工程的立项必须要在技术可行性分析的前提下开展。
最后说到应用。按照CC2004中对计算机学科中划分的方向,信息系统和信息技术两个方向划分为应用型。信息系统方向的任务是负责建立和维护信息系统,这是让计算机技术和工程直接发挥作用的环节,是信息化社会的基本保障。从事“信息技术”应用,是要在各个不同的专业领域内用计算机去实现特定的计算需求。
科学、技术、工程和应用不仅需要不同的知识和技能背景,更重要的是他们具有不同的思维方式和工作模式。在不追求成为一个通才的前提下,搞清楚这里的差别,明确作为一个“搞计算机的人”,要做什么样的选择。
在《逆》书第5.2节“我们要什么样的知识和能力结构?”中,又讲:
计算学科,是研究计算机的设计、制造和进行信息处理等的理论、原则、方法和技术的学科,包括了科学、工程和技术:计算科学侧重于研究现象揭示规律,计算技术则侧重于研制计算机和使用计算机进行信息处理的方法和技术手段,计算机工程利用相关的方法和技术,生产出产品。这三方面互为依托,相互推进,计算科学中的研究成果转化为了技术,而计算技术的发展促进了计算科学研究的深入。用计算技术指导工程实践,而工程实践的发展转而作用于技术进步。因此,计算学科就是这样一门科学性与工程性并重的学科,其理论与实践也常常紧密地结合在一起。计算机要解决现实世界中的各种问题,模型构建和测试、评价,需要采用的是科学研究的方法,而设计和构建软硬件系统的过程,则属于工程范畴,采用工程学的方法。
2 研究方向
在了解了上面的背景之后,要知道对计算学科(包括了计算机科学、技术、软件工程等相关专业),谈“研究”,研究内容包括计算科学,以及围绕着产品的开发技术、工程、运行维护当中的问题,以搞清楚问题,并提出解决方案为主要目标;而“开发”,则意味着为了做出产品,让产品更好地运行所做的更直接的工作。所以在研究生培养阶段,要在专业下面分研究方向,高校教师和科研单位的研究人员,也有研究方向,企业里的高级技术人员,也有研究方向。
举例说明,“计算机科学与技术”下面再细分“计算机系统结构”、“计算机软件与理论”、“计算机应用技术”三个二级学科,这是我们常说的研究生招生的专业,是由国家规定的,而研究方向的设定很灵活,由招生学校自己确定。下面是从网上搜索得到的描述(应该是某校介绍其研究方向的材料,见《计算机专业研究方向详解》):
(1)计算机应用技术
研究方向:计算机网络、实时计算机应用、CIMS、计算机图形学、并行计算、网络信息安全、数据库、情感计算、 数据挖掘、分布式计算、知识工程、计算机视觉、自动推理、机器学习、草图理解、网络性能分析与协议设计、网络管理与安全、计算机图形学、信息可视化、基于 GPU的高性能计算、复杂系统(应急、物流、海洋)领域工程、基于SOA的空间信息共享与业务协同、语义搜索引擎、自然语言处理、机器翻译、搜索引擎、空中交通信息系统与控制、民航信息与决策支持系统、智能交通系统理论与技术等。
专业特点:计算机应用技术是针对社会与各种企事业单位的信息化需求,通过对计算机软硬件与网络技术的选择、应用和集成,对信息系统进行需求分析、规划和设计,提供与实施技术与解决方案,创建优化的信息系统,并对其运行实行有效的技术维护和管理的学科。
培养这方面人才所涉及的知识面包括:数学与信息技术基础、程序设计基础、系统平台技术、计算机网络、信息管理与安全、人机交互、集成程序开发、系统架构与集成、Web与数字媒体技术、工程实施、职业操守等。培养目标是为企事业单位和政府机构提供首席信息官及承担信息化建设核心任务的人才,并提供为IT企业提供系统分析人才。
(2)计算机软件与理论
研究方向:计算理论、算法理论; 软件工程、中间件、智能软件、计算环境;并行计算、网格计算、普及计算;密码学、信息安全、数据理论;图形图象算法、可视化方法;人工智能应用基础;理论计算机科学其他方向
专业特点:计算机软件与理论专业涉及计算机科学与技术的基本理论和方法,强调计算、算法、软件、设计等概念,主要的领域包括计算理论、算法与复杂性、程序设计语言、软件设计与理论、数据库系统、人工智能、操作系统与编译理论、信息安全理论与方法、图形学与可视化计算、以网络为中心的计算等。
就业方向:本专业培养的研究生具有坚实的计算机科学与技术的理论基础,全面掌握计算机软件的理论方法,以及软件工程、信息系统、并行计算、普及计算等等的软件系统开发技术,能很好地胜任高等院校、科研院所、大型企事业单位、高新技术产业等的教学、科研、系统设计、 产品开发、应用系统集成等工作。
(3)计算机系统结构
研究方向:分布式计算机系统、计算机网络系统与全球个人计算系统、真实感图形生成与虚拟现实技术
专业特点:计算机系统结构(原名计算机组织与系统结构)专业全面研究各种类型的计算机系统(从单机到网络)的构 成、硬件与软件的联系与功能匹配、计算机系统性能评价与改进等。该专业的研究课题涉及高性能处理机系统结构、多机系统、并行计算与分布式计算系统、计算机系统性能评价、VLSL设计、容错计算技术、计算机接口技术、计算机网络系统与通信系统、移动计算、全球个人计算系统等。
就业方向:本专业培养的研究生具有坚实的计算机科学与技术的理论基础,全面掌握计算机系统结构、计算机工程、网络工程、嵌入式系统等的应用开发技术、能很好地胜任高等院校、科研院所、大型企事业单位、高新技术产业等的教学、科研、系统设计、产品开发、应用系统集成等工作。
3 开发技术
开发技术,是为了做出产品,让产品更好地运行所需要的技术手段。广义地讲,上面所提的各个研究方向中,都包含着开发技术的成份。所谓研究,并不全是所谓纯理论,这样的理论没有生命力。不少的研究,直接针对的,就是要制造出产品来。在制造产品的过程中,关键的科学问题和技术难点,需要的是“研究”,而在制造出样品的过程,那就是开发,需要开发技术的支撑。开发技术,本身也可以是研究方向,其中的门道,需要专业技术人员去掌握和拓展。
在广大的本科学生中间,对开发技术的范畴往往是狭义化了,将开发技术限定为是最终实现产品的时候所用的具体技术。例如谈到社交网络,研究人员脑中会想到这样的网络中蕴涵着怎样的规律;高级技术人员关心的是,海量的数据和用户同时访问,瓶颈问题如何解决,这里有开发技术的成份;在我身边的不少同学,关心的是用PHP开发Web应用,还是用Android开发出移动应用,这也是开发技术。
想与更直观些的土木工程做一个对比。在工程设计阶段,考虑采用什么样的结构、计算受力,目标在于设计出工程图纸的活动,需要开发技术;在设计方案的约束下进行施工,需要施工技术;而一线的建筑工人,钢筋工、木工、泥水工、外架工、水电工,他们最终实现工程任务,我们也常说需要技术,其中技能的成份更多一些。
讲这些,是想引出一个话题,我们面对IT行业,和传统的工程行业有区别。开发技术和施工技术以及实施技能之间的区分淡化了。在《逆》书第5.2节“我们要什么样的知识和能力结构?”中还讲:
在传统工业领域,产品设计和产品制造、生产之间的形态有比较大的差别,在生产链的不同环节需要的人员在知识结构方面差别较大。比如土木工程、规划、勘测、设计、施工、养护等技术和研究工作,往往由性质不同的单位实施,但在计算学科中,很多时候学科的理论、技术和工程之间的界限十分模糊,理论探索、技术开发和工程应用之间的周期很短,实验室产品和最终投放市场的产品之间几乎没有太大的差别。许多产品,尤其是软件产品,一经开发、测试完成,就可以通过复制或者通过在线的方式进行销售。计算机领域,科学与工程素质兼具的人才也更常见,科学家和工程师之间有比较明显的分工,但也有少数人既是科学家,也是十分出色的工程师。很多顶尖的公司,如谷歌公司,鼓励研究人员的成果在自己的主导下进行开发,快速变为产品,极大地缩短了新产品问世的周期,表现出的是一种强大的竞争力。
传统行业中的好工程师,能够完成高级的设计工作,而一下工地,一进车间,干工人的活也不逊色。作为一个IT行业的高素质人才,需要具备能完成各层次工作的能力。
4 对计算机类专业大学生的建议
对本科毕业生而言,能够在诸多具体的开发技术中能“有一手”,包括各种语言(C/C++/Java/Python)、各种应用技术(如桌面应用、Web开发、移动开发、网络工程、运行维护、系统测试等),是基本的要求,这是大多数的人在就业时能够向人出示的名片,也是不少在入职后起步做的初级技术工作中,能够直接使到技术。这可以归结为专业技能能的层面。大学中设置的课程,除了对应“通识教育”的部分外,专业基础课和专业课,最终的落脚点就在这些技术上。不要因为那些课程的形态与最终的技术呈现的形态不同就忽视它们。例如,程序员最终的工作是代码,而学习和研究算法,其表现形态却不是代码。而算法在编程中的重要性,是不需要多说的事。这是大学中奠定技术基础的任务。
而立志在学术上往前要走一走,想将自己塑造成高级研究人员和技术人员的同学,上面的两项要求只是基础。进一步知道一些关于研究方向的事,在报考研究生的决策之前能够据此定方向、定学校、定导师,不要再重复高考报志愿时的盲目,这也是一件需要做的事了。