5.1 教学计划——接下来的故事
褚小者不可以怀大,绠短者不可以汲深。
——《庄子·至乐》
关键词:编程范式;迭代学习法;程序员
摘 要:讨论下一步教学计划
预览
编程水平的提升之道是:在实战中演练招法,在招法中领会心法,心法反过来提升招法,进而提高实战水平,如此循环往复呈螺旋式上升。正所谓熟能生巧,巧能生通。
迭代学习法:即在具体知识与抽象理论之间进行折返式学习。
网页的迷人之处就在于,能够用精美的画皮来包裹冗长低效的代码。
无论干哪一行,要想胜任愉快,离不开四样东西:才能、兴趣、方法和努力。
提问
什么是迭代学习法?
一个合格的程序员须要学习和掌握不同领域的许多知识,如何能胜任愉快?
讲解
新课开始了,冒号一反常态,并没有直奔主题:“在谈论新话题之前,先请诸位畅所欲言,谈谈这段时间的学习感受。”
叹号表情有点复杂:“通过前面的学习,让我长了不少见识,只是——”
“但讲无妨。”见叹号有些吞吞吐吐,冒号鼓励道。
“只是觉得有点——纸上谈兵。”叹号鼓足勇气说出心里话。
引号不以为然:“我倒觉得应该更深入地去了解编程范式,现在有了一些感性认识,但还非常肤浅,希望以后能进一步展开。”
逗号挺实在:“有些地方似懂非懂,听起来挺费劲的,直到情景编程才觉得轻松了些。以后可不可以多谈些具体的编程知识、编程技巧和编程经验?”
句号拍了拍他的肩膀:“你想学的是招法,老冒传的是心法。”
逗号不服:“没有招法,再多心法也白搭——光说不练假把式。”
句号反驳:“只关注招法,境界永远得不到提升——光练不说傻把式。”
“二位请暂停争论。”冒号把头转向问号,“你怎么看?”
问号很干脆:“管它心法还是招法,能解决问题的就是好法。”
“你倒滑头,整个一白猫黑猫论嘛!” 冒号哈哈一笑,“首先,编程范式绝非中看不中用的屠龙之术,它有助于我们更快速地掌握、更深刻地理解、更纯熟地运用编程语言,故有心法之谓。其次,心法只有通过招法才能落到实处,也只有通过招法才能融会贯通。”
“那传说中的‘无招胜有招’呢?”引号问。
冒号哂道:“武侠小说看多了,容易想入非非,那种境界岂是一般人所能达到的?对绝大多数人来说,无招就意味着自己没招而将中他人之招。”
众人窃笑。
“还有一样是至关重要的。”冒号提醒道,“那就是实战。”
句号深有体会:“以前在学校里编程似乎还得心应手,到了公司就时感力有不逮。”
“花拳绣腿对付小喽啰绰绰有余,真碰到高手自然漏洞百出了。”冒号直言道,“编程水平的提升之道是:在实战中演练招法,在招法中领会心法,心法反过来提升招法,进而提高实战水平,如此循环往复呈螺旋式上升过程。正所谓熟能生巧,巧能生通。”
问号询道:“下面我们的主题是什么?”
冒号亮出他的一套学习理论:“软件工程中有个迭代开发法,本班则采用迭代学习法:即在具体知识与抽象理论之间进行折返式学习。当然这种迭代不是机械式的重复,而是增量式的循环。假定你们以前更关注具体的编程语言,那么遵循这种方式,先介绍抽象的编程范式是合适的。在初步了解范式之后,不妨重新回到编程语言上来。”
叹号唯唯连声:“是啊,在空中飘久了会染上恐高症的。”
冒号笑着警告:“不要高兴得太早,着陆后我们还会再次起飞的——别忘了我们的迭代式学习是周而复始的。至于眼下谈什么,还是先征求各位的意见,这样开放式教学才名副其实嘛。”
众人开始交头接耳、七嘴八舌地议论起来。
一阵商讨之后,大家似乎未能达成共识。冒号见状,便让他们一一道来。
问号再次充当急先锋:“能不能比较一些当今主流语言各自的优缺点?”
冒号笑言:“我怎么恍惚间又回到了第1堂课?你的潜台词还是那句话:到底学哪种语言好?”
问号被窥破心事,微露窘色。
“不过我非常理解你们的想法。”冒号体谅道,“虽然这是编程中最易提出却又最难回答的问题,但考虑到大家对它如此兴致盎然,我决定不顾引火烧身之危,铤而走险一回。”
众人鼓掌。
冒号故作疑惑:“你们这是对问题的答案表示期待呢,还是对我的勇气表示赞赏?”
众皆笑曰:“兼而有之,兼而有之!”
叹号提出:“近来动态语言非常流行,能说说它与静态语言到底有何不同,是否会取而代之?”
“嗯,这个问题总算简单了些。”冒号如释重负。
逗号坚持道:“我还是那个建议,希望学些具体的编程知识和技巧,比如将最流行的Java语言中的一些重点和难点分几个专题来讨论。”
冒号颔许:“这是个很好的建议,可以采纳。”
引号有不同意见:“Java没有C++来劲:要说难点,C++多得多;要说流行度,按照TIOBE的数据,C与C++之和还超过Java 6个百分点呢。”
逗号不服:“你没看到C和C++正在逐渐没落吗?”
引号冷哼一声:“开玩笑,什么时候操作系统、数据库、游戏软件和嵌入式系统都改用Java了再说这话。别忘了,Java的虚拟机都还是C或C++写成的呢。”
冒号忙止住干戈:“我还没来得及成为众矢之的呢,你们二位倒先掐上了。”
句号提议:“最好找一个项目实例,从头至尾演练一次,既能贯穿各个知识点,又能让我们对软件开发有个整体认识。”
“这个想法听起来非常不错。”冒号沉吟了一会又道,“只是一个真正企业级的项目,涉及面太广。比如一个完整的web应用,不论是采用重量级的Java EE或.NET技术,还是采用轻量级的Perl、PHP、Ruby、Python等动态语言技术,除了要掌握各自的主体语言外,还涉及到相应的框架、集成环境和各种工具,以及JavaScript、CSS、HTML和XML等技术,同时数据库的知识也是不可或缺的。”
问号奇道:“JavaScript、CSS和HTML这些不主要是网页设计人员的语言吗?”
冒号解释:“网页设计人员大多用Dreamweaver之类的工具来设计HTML页面,开发一般网站尚可勉力而为,若开发企业级软件则有些力不从心了。更何况web应用的趋势是具有更丰富用户体验的Rich Internet application (RIA),采用大量的AJAX、FLEX等技术,须要熟悉Javascript或Actionscript之类的语言,这些就更非一般网页设计人员所能胜任。”
引号插言:“据我所知,许多公司都是请网页设计师来编写HTML和Javascript等代码的。”
冒号指出:“网页的迷人之处就在于,能够用精美的画皮来包裹冗长低效的代码。出于软件开发的时间和成本的考虑,公司的选择无可非议,但如果要提高软件竞争力,这些代码至少要经过程序员的加工处理。”
逗号复言:“那数据库总该是数据库管理员的事吧?程序员至多用到hibernate、iBATIS之类的ORM[1]框架。”
冒号断然否定:“数据库绝不只是DBA的事,ORM也不能取代数据库的设计和SQL的使用。另外,复杂的应用需要编写大量的存储过程(stored procedure),故还应掌握PL/SQL或Transact-SQL等扩展数据库语言。换句话说,从web开发最前端的网页到最后端的数据库,都应该有程序员的身影。”
句号联想到:“借用前面餐馆的例子,不妨把接待员看作客户层(client tier),把服务员看作表现层(presentation tier),把厨师看作业务层(business tier),把收银员看作数据层(data tier),把厨工看作常用的辅助类(helper class)[2]。”
冒号微微点头:“比较靠谱。要说不当之处,就是服务器端的表现层不会如服务员那样直接与客户打交道,此外业务层常与数据层打交道,但厨师好像不会与收银员有什么瓜葛。”
叹号夸张地捂住脸:“天哪,程序员竟然身兼五职,太惨了吧?”
“当然程序员会各有分工,不过如果你总局限某一层的应用开发,今后凭什么谋取更高的职位?”冒号苦口婆心,“无论干哪一行,要想胜任愉快,离不开4样东西:才能、兴趣、方法和努力。没有才能则难以胜任,没有兴趣则难以愉快,没有方法则事倍功半,没有努力则一事无成。我相信好的方法最终能激发人的才能、兴趣和努力,这也是本班的一个理念。希望大家能通过各种问题的讨论,获得一些方法上的启示。”
问号急切地询问:“那么我们的下一步是什么?”
“综合各位的意见,我们从简到繁。”冒号公布计划,“先简单谈谈动态语言;再对主流语言作简评;然后范式上以OOP为主,语言上以C++、Java和C#为主,作一些专题讨论;最后如果时间允许,找一个项目来实践一番。”
“哦耶!”众人皆大欢喜。
总结
Ø 所谓迭代学习法,是指在具体知识与抽象理论之间进行增量式的循环学习。
Ø 一个合格的程序员不应只局限某一层的应用开发。
Ø 要想工作胜任愉快,才能 、兴趣 、方法和努力缺一不可。一套好的方法可以激发才能、兴趣和努力。
参考
[1] Deepak Alur,John Crupi,Dan Malks.Core J2EE Patterns: Best Practices and Design Strategies.Upper Saddle River, NJ:Prentice Hall PTR,2003.120-121
插语
[1]ORM(Object-Relational Mapping)是一种编程技术,能将OOP中的对象模型映射到数据库的关系模型。
[2]传统的三层架构为:表现层、业务层和数据层。其中表现层可进一步分为客户端的客户层和服务器端的表现层,数据层有时用集成层(integration tier)和资源层(resource tier)代替。