【简单介绍】
毕业于南京航空大学(NUAA),多年从事信息学竞赛教学(noip、csp、usaco等),中学期间曾获数学奥赛省一等奖、信息奥赛省二等奖
【授课科目】
AP计算机A,AP计算机P,IB计算机,A-LEVEL计算机,USACO
【教学成果】
带出过多名noip/csp省二、三等奖及usaco银组以上同学
近几年来,计算机行业可以说是国内外最热门行业之一,而在计算机行业中,编程可以说是一切的基础,也是令无数程序员沉醉其中又抓狂头秃的存在。很多同学包括家长对编程的印象还停留在不明觉厉的阶段,但是如果愿意耐心接触一下编程,会发现编写程序其实是很简单的事情,并没有想象中难。
第一次接触编程是在初中,学校的计算机老师开设了一个课外编程班,挑选了一些初中和高中的同学参加,目标是参加noip(信息学奥林匹克联赛)。编程班中老师教大家学习Pascal语言,一门很经典也很古老的编程语言,编程的时候要在DOS系统下运行,运行起来是图中这样子。
可能是当时老师也没什么经验,我们学习基本就是自己看一本Pascal教材,懵懵懂懂中学了些算法之类的,不知道到底学的算法是什么原理,也不知道能用来做什么,有疑问也只能自己不停尝试(当时网络还不发达),印象最深的是当时写一个四则混合运算的程序,整整调试了一整个通宵才搞定。在进行过一段时间的学习并参加了一次比赛之后,突然觉得好像编程学起来太过迷茫,不知道怎么学,也不知有什么用,于是计算机编程渐渐地淡出了中学生活。
之后大学时学的是工科材料方面专业,计算机主要作为学习辅助工具而不是主要学习对象,专业方面也几乎用不到编程。大学毕业之后一度从事的是专业相关工作(工科材料)。机缘巧合之下来到了计算机编程教育行业,重新学习了一遍计算机和编程相关内容,在这期间接触并教过C++、Python、Java等各种语言,内容也五花八门,有单片机嵌入式编程、算法竞赛、机器人编程等,中间有过很多快乐,也遇到过很多困难,经历过无数“头秃”的时刻。在这些学习和教学过程中也渐渐总结了编程学习的几个重要因素:
早期流行的Pascal等语言虽然比较经典、规范,但随着时代的发展,渐渐跟不上行业需求,很早就不是一线开发所用语言,对图形化和网络编程缺乏支持,学了很久依然只是跟控制台窗口打交道,学生很容易觉得所学跟平常电脑和手机上见到的应用软件和网页完全是两个世界东西,找不到学习的意义从而失去学习动力,所以选择合适的入门语言是很重要的。现在比较流行的语言主要是C++、Java、Python等几种,各有特点。
C++语言从创造迄今已有近40年,但是一直跟随时代需求改变和扩展内容,在软件开发、网络编程等主要方面都有成熟的体系,很多大公司比如腾讯公司主要开发语言就是C++。C++的最大特点是运行效率比较高,同时代码规范严谨,所以目前国内想参加信奥竞赛的学生大多会学习C++语言。
Java晚于C++出现,很多基础语法和C++很像,继承了C++的规范严谨,但是去除了一些C++中一些复杂的内容,比如指针、内存管理等内容,并拥有一些其它优势,尤其在网络应用方面有很多优势,比如淘宝等高访问网站主要就是由Java编写。同时国外很多学校计算机相关专业编程入门课程都是教授Java,所以国外很多比赛主流语言是Java。
Python和Java出现的时间差不太多,但是风格思路完全不同。Python的优点是代码简洁、容易上手,并且在科学计算、图像识别、人工智能、大数据分析等领域拥有很多扩展库,因此很适合工程、科研人员用来处理数据等。如果想快速通过自己编程制作简单的应用、网页甚至小游戏等,Python也是很合适的选择。
很多学生在学习编程之前可能对计算机行业和编程几乎一无所知,懵懵懂懂的参加了编程课程的学习。比如有些同学可能学习编程目的只是课外想用编程做些有趣的软件、网页或者小游戏,但却参加了竞赛课程,到后期可能就很难坚持下去;有些同学就是为了参加比赛挑战自我、获得奖项,并且有相应的能力,那么如果参加的是项目制作之类的课程,那就南辕北辙了。所以在学习编程初期,一定要多了解各种编程课程的区别,确定自己的目标。
不管学习什么东西,良好的课程体系总能让人事半功倍。针对不同的学习目标,合理地规划设计课程顺序和衔接逻辑,可以让学生更平滑顺畅地接收知识。举个大家都知道的例子,很多大学生都对高数这门课深恶痛绝,被打击到怀疑人生,其实就是因为课程规划中高中数学和高等数学的内容没有衔接好,高中数学刚教会了学生1+1=2,高数上来就教学生解一元二次方程,太多学生因为缺乏中间过渡而无所适从。编程也是一样,需要一个设计成熟的课程体系。
目前计算机入门课程体系主要分三种:
(1)兴趣爱好课程,主要学习scratch(图形化)、python等语言,制作简单的应用、网页或者小游戏之类,内容比较有趣生动,也能比较快的看到学习成果;
(2)留学计算机专业预读课程的,比如A-Level 计算机、AP计算机原理,这些课程偏向计算机软硬件基础知识、软件开发流程和简单编程原理,设计知识范围比较广,但很少涉及到具体的编程语言学习,没太大难度,大部分知识理解记忆一下就能通过;AP计算机A课程相对难点,主要学习Java语言的基础语法类的各种特性等内容,难度上略有提高,但几乎不学习Java以外的东西,也能用Java编写一些有趣的小项目。这些课程考试形式都是笔试,不需要上机实际编写程序运行,有这方面意向的同学基本只要认真学习难度基本不大。同时在学习过程中可以通过对计算机的进一步了解,确定自己以后的专业具体方向。目前比较热门的计算机专业方向很多,有软件工程(Software Engineering),主要学习如何完整的开发软件系统;计算机网络(ComputerNetwork),学习网络相关知识;人工智能(AI),研究人工智能方面内容;计算机架构(ComputerArchitecture),研究各种计算机底层运行原理;算法(Algorithm),研究各种解决问题的算法等等。
(3)计算机编程竞赛(国内noip,美国usaco等)的课程,主要学习C++或者Java语言,内容为各种算法和数据结构,从学习内容上来说难度属于比较大的。国内外编程比赛需要掌握的知识点其实差不多,比如各种贪心、搜索、动态规划、分治等算法,以及栈、队列、树、图等数据结构,两者区别主要在赛制上。国内的noip比赛一年只有一次,只有达到每个省前几十名的选手才有资格参加省队选拔等后续比赛流程,比萨斯会用到的知识点范围相当广。并且noip必须现场准时参加,比赛现场更像传统考试,针对提出问题编写程序,最后统一提交代码,统一评测分数再统一公布成绩。这样的形式对学生的考验和心理压力很大,在编写测试代码过程中很难验证自己的代码是否正确或者遗漏,每年都有很多学生因为一些细节问题有时可能就是一个符号错误丢掉该得的分数甚至爆零;usaco每年有3次月赛和一次公开赛,都是线上的,机制类似于王者荣耀中的段位选拔,第一次参加在青铜段位,如果拿到比较好的成绩就可以升到白银段位,下次月赛就直接参加白银,依次类推慢慢升级到白金(目前最高),后续再参加国家队选拔,每个级别主要考察的内容也有区分,整个流程更加平滑,竞争压力小一些,并且对很多大学而言,达到白银以上级别就能证明你的编程能力。比赛过程也相对友好,月赛时允许当场提交编写的代码,实时反馈代码的正确错误情况,同时可以多次修改代码并提交直到通过,更能反映学生的真实编程能力。
现在网络很发达,很多计算机和编程知识网上搜索一下都能找到,是否意味着老师就不重要?答案当然是否定的。自学是一个很艰难和缓慢的过程,计算机学习中涉及到大量的软硬件问题,同时也会有很多的发展方向,如果是没有经验的人,会将大量时间浪费在解决这些问题上,又或者在某些细节上迷失,偏移整个学习路线,从而事倍功半,中途而废。而一个好的老师,能根据学生特点和学习目标制定合适的教学计划,让学生循序渐进的学习,同时也能因材施教,控制不同学生学习的进度快慢和深度广度,降低学生学习的阻碍,轻松跨过入门的各种门槛。 |