在设计C++/CLI语言中涉及三个方面问题,这同样贯彻于所有的其他程序开发语言:一是语言级的语法向底层通用类型系统(简称CTS)的映射;二是向程序开发人员提供的CLI的底层细节结构的级别选择;三是超越CLI的直接支持,提供额外的功能性函数的选择。
第一条对于所有的CLI语言来说都大致相同,第二条和第三条对于不同的CLI语言来说是不同的,相互区别的。根据你需要解决什么样的问题,你将选择这种或那种语言,也有可能混合使用多种CLI语言。学习C++/CLI涉及到了解它在设计过程中的所有这些涉及方面。 ⒈ Visual C++ 2008 大学教程(第二版)(英文原版:Visual C++ 2008 How to Program,Second Edition)
⒉ Visual C++ 2008入门经典 (英文原版:Beginning Visual C++ 2008)
⒊ C++/CLI in Action
⒋ Foundations of C++/CLI The Visual C++ Language for .NET 3.5
⒌ Pro Visual C++/CLI and the .NET 3.5 Platform
⒍ Expert C++/CLI:.NET for Visual C++ Programmers 使用C++/CLI编程时间了解底层的CTS非常重要。CTS包括以下三种常用类的类型:
1、多态引用类型,这正是对于所有继承类所要使用的。
2、非多态值类型,这用于实时高效的具体类型,例如数值类型。
3、抽象的接口类型,这用于定义一个操作集,也可以用于实现接口的引用或值类型集合。
这个设计方面的问题,即将CTS映射到语言内建的数据类型集合,通常同样贯穿于所有的CLI语言,虽然不同的CLI语言语法不同。所以,在C#中你可能这么写:
abstract class Shape { ... } // C#
来定义了一个Shape基类,从该类将导出几何对象,然而在C++/CLI你将这么写:
ref class Shape abstract { ... }; // C++/CLI
上述代码说明了底层的C++/CLI引用类型。这两种声明在内层代表的意思是一样的。相似地,在C#中你这么写:
struct Point2D { ... } // C#
来定义一个具体的Point2D 类,然而在C++/CLI中这么写:
value class Point2D { ... }; // C++/CLI
C++/CLI支持的类型集合代表了CTS与本地设备的综合,这决定了你的语法选择,例如:
class native {};
value class V {};
ref class R {};
interface class I {};
CTS也支持与本地列举类型稍微不同的列举类类型。当然,对于上述两者CTS是都支持的。例如:
enum native { fail,pass };
enum class CLIEnum : char { fail,pass};
相似地,CTS支持它本身的数组类型,并且它再一次将其与本地数组在行为上区分开来。同时,微软再次为这两种类型提供了支持。
int native[] = { 1,1,2,3,5,8 };
array^ managed = { 1,1,2,3,5,8 };
那种认为一种CLI语言比其他CLI语言在向底层的CTS映射中表现的更出色或更完美都是不确切的,相反,每种不同的CLI语言代表着对CTS底层对象模型的不同理解,在下一节你将更清楚地看到这一点。 设计一个CLI语言时第二个必须要考虑的问题是将CLI的底层执行模式融入到语言的细节级别。这种语言用于解决什么问题?这种语言是否有必须的工具来解决这些问题?这种语言可能吸引什么样的程序开发人员?
例如,值类型存在于托管堆上,在很多情况下值类型可以看到它们自身的存在。
1、通过隐含的加箱操作,当一个值类型的实例被分配给一个对象或当一个虚拟的方法通过一个值类型来调用;
2、当这个值类型被当作应用引用类类型的成员时;
3、当这个值类型 被当作CLI数组成员时;
需要指出的是,这种情况下开发人员是否被允许操作值类型的地址是CLI语言设计时必须应该予以考虑的问题。 在垃圾收集器扫描紧缩状态下,位于托管堆上的任何对象非常可能面对重新定位问题。指向对象的指针可以实时跟踪并修改。开发人员不能自己手动跟踪,所以,如果你获许取得一个可能位于托管堆上的值类型的地址时,除了本地指针外,还需要有一个跟踪形态的指针。
销售商考虑的是什么?那就是需要简单和安全,在语言中直接提供跟踪一个对象或集合的指针使语言复杂化,没有这种支持,将减少复杂程度,可资利用的、潜在的程序开发人群可能会增加,此外,准许程序开发人员操作生命短暂的值类型,增加了错误产生的可能性,程序开发人员可能有意无意地对内存进行错误操作,不支持跟踪指针,一个潜在的更安全地实时环境产生了。
另一方面,效率和灵活性也是必须考虑的一个问题,每一次向同一个对象分配值类型时,一个全新的数值加箱操作发生了,准许存取加箱值类型允许在内存中进行更新,这可能在性能上产生了一个非常巨大的进步。没有跟踪形态的指针,你无法用指针算法重新声明一个CLI数组,这意味着CLI数组不能使用标准模板库进行重新声明,也不能使用一般的算法。准许操作加箱数值使设计具有更大地灵活性。
微软在C++/CLI中选择地址集合模式来处理托管堆上的值类型。
int ival = 1024;
int^ boxedi = ival;
array^ ia = gcnew array{1,1,2,3,5,8};
interior_ptr begin = &ia[0];
value struct smallInt { int m_ival; ... } si;
pin_ptr ppi = &si.m_ival;
典型地C++/CLI开发人员是一个复杂的系统程序员,承担着提供下层内部构造和有组织的应用程序的任务,而这些恰恰是未来商业发展的基础。C++/CLI开发人员必须兼顾可测量性和可执行性,所以必须在系统的高度级上来看待CLI下层结构。CLI细节水平反映了开发人员的脸色。
复杂性本身并不代表对质量的否定,人类比单细胞细菌复杂的多,这当然不是一件坏事,然而,当表达一个简单的概念变的复杂化后,这常常被认为是一件坏事。在C++/CLI中,CLI开发团队已经试着提供一种精巧的方法来表达方式一个复杂的事情。 第三个设计方面是特定功能性的语言层,它远远超过CLI所提供的直接支持,虽然这可能需要在语言层支持和CLI底层执行模式间建立一个映射。但在某些情况下,这恰恰是不可能的,因为语言无法调节CLI的行为。这种情况的例子就是在基类的构造及析构函数中定义虚函数。根据ISO-C++在这种情况下的语言学,需要用每一个基类的构造和虚构函数重新设置虚拟表,而这是不可能的,因为虚拟表句柄是实时管理的,而不是某一个语言来管理。
所以,这个设计方面是在完美性和可行性之间的妥协产物,C++/CLI提供的额外功能主要表现在三个方面:
1、获取资源的一种形式是对于引用类型的初始化,此外,提供一种自动化工具,用于占用较少资源、所谓的可确定性自动消亡的垃圾收集类型对象。
2、一种深度拷贝形式的语法与C++拷贝构造函数和拷贝分配操作符相一致,但其并不适用与值类型。
3、除了最初的一般性CLI机制外,还有对于CTS类型的C++模板直接支持。这些是我第一篇文章中讨论的主题。此外,还提供了针对CLI类型的可校验STL版本。
让我们来看一个简单的例子,一个确定性消亡问题。在垃圾搜集器重新声明一块与对象相关联的内存之前,一个相关的消亡方法,如果存在的话,将被调用。你可以认为这种方法是超级析构函数,因为它与对象的程序生命期无关。这就叫做终结。终结函数是否调用以及什么时间调用都没有明确规定,这就是垃圾收集器的非确定性终结。
在动态内存管理的情况下,非确定性终结工作非常好,当可用内存变的越来越少时,垃圾收集器介入并开始着手解决问题。然而,非决定性终结也有工作不好的时候,当一个对象维护一个重要资源,例如一个数据库连接、锁定某些类别、或者可能是本地的堆内存。在这种情况下,只要是不需要,应立即释放资源。目前CLI所支持的解决问题的方法是,对于一个类通过执行IDisposable接口提供的Dispose方法释放资源。这里的问题是执行Dispose方法需要一个清晰的声明,所以它也就不可能存在调用。
最基本的C++中的设计模式是上述的通过初始化来获取资源,这意味着类使用构造函数来获取资源,相反,类使用析构函数来释放资源。这些行为由类对象在生存期内自动管理。
下面是引用类释放资源时所做的顺序动作:
1、 首先使用析构函数来封装所有与释放类有关的资源时所必须的代码;
2、 析构函数自动调用后,结束类对象的生命期。
对于引用类型来说,CLI没有类析构函数的概念,所以析构函数不得不映射为在底层执行的其它代码。此时,在内部,编译器执行以下操作:
1、 类让其基类列表继承自IDisposable接口;
2、 析构函数转换成IDisposable的Dispose方法。
以上实现了目标的一半,一种实现析构造函数自动调用的方法仍然需要,对于引用类型,一种特殊的基于栈的符号得到支持,也就是说,一个对象的生命期与它的声明范围有关。在内部,编译器将符号转换为在托管堆上分配引用对象。随着作用域的终结,编译器插入一个Dispose方法-用户定义的析构函数。与对象有关的内存的收回在垃圾收集器的控制下得到执行。
C++/CLI并不是将C++拓展到一个托管的世界,更确切的说,它代表一个完全综合的范例,某种程度上就象当初将泛编程模式和多重继承综合进该语言一样。我认为C++/CLI开发小组做了一项非常卓有成效的工作。
Newsela:探索自适应学习之路
摘要:本文简要介绍了个性化阅读学习平台Newsela,它基于分级阅读测评为K12用户量身打造个性化阅读内容和方式。目前,它已在美国教育界产生了相当大的影响,约四分之三的教师正在使用该平台。然而,Newsela的野心并不止于此。打造线上追踪、分析和反馈学生数据,线下教师据此制定个性化教案的自适应学习场景,才是它的目标所在。此外,为了提高研发能力,给用户提供更优质的服务,Newsela探索出独具特色的分级付费的盈利模式。
关键词:个性化阅读 分级阅读模式 自适应学习 分级付费模式
新闻阅读有助于人们了解周遭世界发生的事情,对于培养现代公民意识也不无裨益。但孩子们往往缺乏理解新闻资讯所必需的背景知识,要理解某些专业术语也存在困难;而且,大多数新闻本身读起来也有些索然无味。一家成立于2013年,总部位于美国纽约的初创公司正在改变这一现状。这家名为Newsela(见图1)的教育科技公司开发了一个个性化阅读学习平台,其特点在于针对不同年龄段孩子的阅读能力对新闻内容进行改编,以提高他们对新闻资讯的兴趣和阅读能力。从诞生之初,Newsela便专门为K12用户量身改编实时新闻资讯。其创始人马修·格罗斯(Matthew Gross)说:“如果我们能够把新闻故事当作教学工具,从而改变孩子们的学习阅读方式,结果会怎样?那会帮助孩子们成为新闻故事更好的读者。”打造个性化阅读内容和方式正是Newsela成立及运营的宗旨所在。目前,Newsela已经在教育界产生了相当大的影响,超过75%的美国教师使用该平台,注册用户达1200万。
图1 Newsela公司标识
一、分级阅读模式
“孩子的阅读水平达到了什么程度?应该给他买什么样的书?”这个问题不仅孩子们自己无法确定,同时也困扰着孩子们的父母。而若想实现个性化新闻阅读,其前提是对孩子的阅读能力进行评定。
Newsela有其独特的解决方案——分级阅读模式,其基础和核心是基于完善的分级体系判定学生的阅读水平。针对K12各年级的用户,该平台首先根据年级(Grade Level)将阅读难度分为9个等级,学生可根据自己所处的年级选择阅读等级。但是,同一个班级和年级的同学还有“学霸”和“后进生”之分,其阅读能力和水平很可能差距悬殊。为此,Newsela自行创立了“定锚标准”(Anchor Standards)进行阅读分级。“定锚标准”是让用户根据阅读目的进行难度选择,然后为其匹配文章。其阅读难度由易到难共分8个等级,学生可根据自己情况对阅读难度进行选择:①读懂文章大意;②读懂中心思想;③弄清人物、事件和观点;④弄清词汇含义及词汇选择;⑤弄清文章结构;⑥弄清文章观点和立意;⑦区分多媒体;⑧理解论据和主张。
对于既不是K12学生,又无法根据“定锚标准”判别阅读能力的人,Newsela使用蓝思分级阅读测评体系(The Lexile Framework for Reading)将文章难易度分为五级:最难、难、中等、简单和最简单。在美国,蓝思分级阅读测评体系是比较常见的阅读分级系统之一,主要从语义和句法两个维度衡量阅读难度系数,难易程度从0级至2000级。例如,《奥兰多守望报》(Orlando Sentinel)2016年2月9日刊载了一篇题为《海洋世界不繁殖而是替换异常海豚》(Sea World won’t Breed, Replace Unusual Dolphins)的文章,全篇共902字。根据蓝思分级阅读测评体系,其难度系数为1140级;Newsela将其分别改写为阅读难度系数较低的《异常的海洋世界海豚们,不会被繁殖,而是被替换》(Unusual Sea World Dolphins won’t Be Bred, Replaced),全篇728字,难度系数为990级;《Sea World won’t Keep as Many Dolphins》,全篇575字,难度系数为730级;以及更加容易阅读的《海洋世界不保留那么多海豚》(Unusual Sea World Dolphins won’t Be Replaced),全篇263字,难度系数为440 级。为方便手机端用户调整文章难度,用户只需将两指在文章页面上下滑动即可在五个难易度之间自由切换。图2为Newsela的手机端页面,用户将两手指放于屏幕中间,向上滑动,即可将文章难度从460级提高到1250级;向下滑动,则可以降低阅读等级。
图2 Newsela手机端页面
根据学生选择的测评分级系统,Newsela平台开发了独特的算法来判断每个学生的阅读水平,并据此为其提供个性化的新闻内容。值得注意的是,它不只是将互联网上的新闻简单搜罗起来,而是请专家对每篇文章进行不同难度的编辑改写。格罗斯说:“对于一些低年级同学来讲,阅读一段长文还相当困难。我们会重新改编故事内容,调整段落长度,添加小标题,简化标题内容,并根据孩子们的理解能力重写并解释复杂的专业术语,从而使内容更适合孩子们阅读。”该公司拥有来自《名利场》杂志、彭博社等各大媒体的150名新闻从业者,他们为该平台编写了超过4000篇新闻,内容涉及科学、财经、法律、健康以及体育等各个栏目。新闻从业者们在自然语言处理技术(NLP)软件的指导下对新闻内容进行改写。该软件能够帮助他们选择与阅读等级相匹配的词汇,以及简化文本。此外,Newsela还聘请教师和课程专家编写自测题以及开放式问题等。
Newsela的做法似乎颇见成效。2016年下半年,Newsela对平台上阅读水平低于50%的学生用户进行了跟踪调查。仅仅在3个月时间内,这些学生的阅读水平就平均提高了一个等级。显然,阅读的量化分级环节是解决学生阅读问题的关键。Newsela的分级阅读模式独具匠心,激发了孩子对新闻资讯的阅读兴趣,提高了学生的阅读能力。
二、自适应学习场景
如果你认为Newsela的目的仅仅是一场阅读模式的变革,那你就错了,它还有更大的野心:变革教育方式,打造自适应学习场景。
2016年,培生集团发布了研究报告《解码自适应学习》(Decoding Adaptive Learning)。该报告对自适应学习进行了定义:自适应学习是一种教育科技手段。它通过自主提供适合每位学生的独立帮助,在现实中与学生产生实时互动。近年来,中外教育科技界对“自适应学习”的关注度一直很高。2016年初,美国著名的自适应学习平台Knewton完成了迄今为止最大的一笔5200万美元的F轮融资,并继续推进其针对每一位学习者的需求提供个性化教学内容的模式。放眼国内,有关自适应学习的应用也越来越多。比如猿题库通过智能算法对学生的学习数据进行分析和挖掘,利用自适应学习工具准确评估每一位学生的能力,从而满足其个性化学习需求。可以说,在线教育领域已经进入了“自适应”时代。
将计算机科学领域的自适应理念用于教学方式的变革,是Newsela的最终目标。格罗斯说:“现有的教材和相应练习都是固定的,并不会根据孩子们理解能力的不同而调整。这种一概而论的方式正在使孩子们失去对内容的兴趣和注意力。我们需要唤醒他们的注意力。”Newsela打造了这样一个自适应学习场景(见图3):老师在Newsela平台上注册一个以班级为单位的学习小组,并对小组中每位学生的阅读能力进行测评;然后在平台上对每位学生阅读文章的难度进行设置;最后,学生在平台上完成阅读任务。在这个过程中,Newsela独有的技术和算法能够实时跟踪每位学生的阅读进度,并将收集到的数据进行分析。根据数据分析结果,老师掌握了每位学生的阅读进展,于是便可在线下课堂中调整教学方式,制定更有针对性的教学方案。自适应学习场景因此得以实现。
图3 Newsela自适应学习场景
“我们的目标是给老师们最好的工具,让阅读变得有趣,也让班里的每个学生受到重视,”格罗斯说:“我们想让老师们一直梦寐以求的场景变成现实,即转变教育方式,让孩子们都对学习兴致勃勃。”
三、分级付费的盈利模式
最初,格罗斯自己拿出3万美元创办了Newsela公司。为了吸引用户主动使用该平台,Newsela推出了面向学生、老师及家长的免费试用版。免费试用版和付费版本的功能相同。但是,一个月的试用期限过后,用户便无法使用部分功能;用户再使用就需要升级到付费版本。这种免费试用模式的优势在于直接将产品呈现在目标用户面前。正因为这样,Newsela的成长速度惊人。创办后短短几个月时间,用户已经遍布全美50个州,且每天都有400个新教师用户和2000个新学生用户进行注册。
但这种模式仍面临一个问题:即使老师想升级到付费版本,但缺乏学校的财力和政策支持,仍然无法实现班级购买的愿望。于是,Newsela面向学校机构,推出了分级付费模式。付费版本Newsela Pro分3个级别进行收费:班级范围按照每位学生18美金收费;年级范围共收取2000美金;学校范围根据自身规模的大小向Newsela支付每学年4000-7000美元的费用。付费版Newsela Pro能为教学管理者提供更全面详细的数据分析报告。与其说Newsela是一个个性化新闻阅读平台,不如说它是一个学生阅读学习的大数据平台。Newsela Pro在每篇文章后设置相应的自测题。平台收集学生的阅读和测评数据,反馈给老师;老师针对不同学生的学习情况制定个性化教学方案。此外,学校管理层也可查看基于学校范围或学区范围的学生阅读数据。
Newsela深知仅仅依靠风险投资不是长久之策,只有找到互利共存的盈利模式才是长远之道。分级付费的盈利模式是一种良性闭环,不仅保证了学生和老师免费使用的权益,还为平台获取收益提高数据分析和机器学习能力提供了资金保障,从而可以持续地为用户提供更优质的服务。
参考文献:
1.Roniesha L.Copeland.Lanching a Leveled eBook:Assessing the Market Opportunity and Developing a Business Model[EB/OL].,2014-9.