Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

通过中文命名将少儿编程与核心学科结合起来 #97

Open
nobodxbodon opened this issue Oct 20, 2018 · 27 comments
Open

通过中文命名将少儿编程与核心学科结合起来 #97

nobodxbodon opened this issue Oct 20, 2018 · 27 comments
Labels
active 不一定活跃,但没有弃坑 推广 not only 中文编程
Projects
Milestone

Comments

@nobodxbodon
Copy link
Member

昨天发现日本教育界有将编程与核心学科结合的思路, 如2017年的小学校におけるプログラミング 教育実践上 の 課題, 感觉和之前自己一些想法有些共鸣.
最重要的是, 只有依靠母语命名, 才可以做到这样的结合. 毕竟不可能在少儿时期就用第二语言教学核心学科.

screen shot 2018-10-18 at 3 20 45 pm

打算研究一下日本官方今年刚发布的小学编程教育指导第一版 (在知乎文章引用), 总结一下可以借鉴的部分.

哪位日语水平在线的童鞋欢迎一同, 靠在线翻译啃还是挺费劲的.

@4b5ent1 4b5ent1 added 推广 not only 中文编程 中文化 labels Oct 20, 2018
@4b5ent1 4b5ent1 added this to the 2018戊戌 milestone Oct 20, 2018
@nobodxbodon
Copy link
Member Author

借助在线翻译略读了一下官方教育指导, 初步理解是以类似Scratch的日文版为编程环境(可以另选环境). 下一段有点意思:

また、文字により記述する言語(テキスト型プログラミング言語)にも様々なものがあります。キーボード操作が多く、それぞれの言語の文法の理解も必要となりますが、英数字だけでなく日本語で記述できるものや、文法的な誤りがあった場合には間違いを指摘してくれるものなど、児童でも比較的取り組みやすい言語もあります。ある程度の授業時数を確保して取り組む場合や、プログラミングに強い興味・関心を示す児童については、こうした言語を活用することも考えられます。

阐述了其他还有很多基于文字的编程语言, 粗体部分大概是"不仅可以用英文/数字, 也可以用日语表述". 如果理解无误, 这应该是明确点出了在主流编程语言中进行日语命名的可行性.

下面几个与核心学科结合的例子:
画多边形, 感觉是类似LOGO的功能, 也许是扩展了Scratch:
screen shot 2018-10-21 at 10 52 24 pm
通过测量到物体的距离的传感器控制通电创建连接的发光二极管的照明电路, 应该也添加了日语的物理学相关API(图中文字不认识):
screen shot 2018-10-18 at 3 02 21 pm
下面好像还有个模拟自动售货机的例子.

另外看到一个日本少儿编程课程的实例, 几点:

  • 目标是创造一个偏游戏化的故事. -- 也许与 @jeffreybaoshenlee 之前提到的接近.
  • 它并不用计算机, 而是使用纸笔+道具进行推演. -- 很有共鸣, 因为编程思维本身可以脱离电子设备. 而且实体化的操作更接近真实生活, 类似于桌游 vs. 电游.

之前的一个想法, 将尽可能多的教科书知识(从小学开始)用程序+数据整理表达, 比如梯形定义,面积, 主谓宾语法, 电流公式, 煤矿富集的省份, 1930年发生的历史事件等等. 感觉与上面的学科结合手段有点接近, 范围也许更广.

@ZoomQuiet
Copy link

@nobodxbodon 是也乎,( ̄▽ ̄)

Blockly 是 Google 开源出来的通用可视化开发界面,
也早已完成过 周蠎 的版本,
甚至于有可以配合智能硬件随身携带的服务运行设备...

简单说, 类似 Scratch 的可视化编程,只是教育可用,
只能帮助形成编程的基本概念,
根本无法支持实用化的应用开发,
最多能支撑简单的益智游戏开发....

如果有学校配合, 类似编程猫的社区组织线下活动,
那么这类工具,作为辅助道具是有意义的,

即, 入门前的玩具.

@ZoomQuiet

This comment has been minimized.

@nobodxbodon
Copy link
Member Author

@ZoomQuiet 近来少儿编程逐渐兴起, 感觉此类拖拽式编程被普及不少. 前不久看到的编程猫IDE体验:对Scratch的改进, 在关键词和API中文化的基础上还增加了一些功能. 对比之前对实用编程语言/IDE的特性讨论, 感觉它现在比较欠缺的是对团队开发/代码重用(API封装)/版本控制/测试/调试的支持, 以及功能API的欠缺.

个人认为, 此类编程环境虽然现在仅以教育用途为主, 但也许有潜力由非专业IT人员开发使用. 从最近看到的财经应用和之前的游戏脚本设计例子看, 拖拽式开发可以满足不少小应用的流程控制和复杂度, 而且有语法出错相对较少的优势.

这帖主要探讨少儿编程与核心学科的结合. 对于楼上的想法, 在现在的编程工具中, 感觉似乎用Python3实现最有可行性, 不知有没有其他建议?

之前的一个想法, 将尽可能多的教科书知识(从小学开始)用程序+数据整理表达, 比如梯形定义,面积, 主谓宾语法, 电流公式, 煤矿富集的省份, 1930年发生的历史事件等等. 感觉与上面的学科结合手段有点接近, 范围也许更广.

@nobodxbodon
Copy link
Member Author

尝试从人教版小学数学一年级上册开始, 但已经觉得也许从更高年级开始更有可行性(更容易程序化). 感觉这样的项目做大了就会接近wolfram知识库, 区别似乎只是开源和中文化.

准备课

认知部分, 如认识上下左右前后, 算法识别不现实.
比多少的部分, 在没有加减能力的前提下, 通过将两组物品进行1:1的摆放, 定义了"同样多", "A比B多/少"的概念. 因此也模拟此过程, 避免使用加减法和数字大小比较, python3实现如下:

from enum import Enum

class 比较结果(Enum):
   = "多"
   = "少"
  同样 = "同样"

def 比较(组1, 组2):
  for 序号 in range(10):
    if 组1:
      if not 组2:
        return 比较结果.
      else:
        组1.pop(0)
        组2.pop(0)
    else:
      if 组2:
        return 比较结果.
      else:
        return 比较结果.同样

print(比较([1,2], [1,2,3]))
print(比较([1,2,3], [1,2]))
print(比较([1,2,3], [1,2,3]))

@ZoomQuiet
Copy link

@nobodxbodon 是也乎,( ̄▽ ̄)
讲真, 直接在 wolframe 上套个中文界面还真的有谱...

@nobodxbodon
Copy link
Member Author

@ZoomQuiet 虽然wolfram提供API, 但并不免费. 而且, 毕竟数据不是开放的, 而且查询结果也是全英文(翻译量会非常大). 刚试了不支持中文查询(不过拼音可以:cao cao):
screen shot 2018-10-24 at 9 41 54 am
暂时没有发现开源的知识库(数据), 尤其是中文的应该更少. 个人觉得和中国相关的部分特别值得数据化, 比如历史/地理(之前打听过此类数据库, 唯一一个发现的也是国外维护的). 在此基础上可以衍生出很多周边项目, 比如基于历史史实的互动类游戏.

@nobodxbodon
Copy link
Member Author

尝试了一下用Python3编写历史数据, 感觉有几个优势:

  • 数据都是文本格式, 易于合作编辑
  • 易于扩展和重构, 相比数据库, 可以更方便地增减/修改数据之间的关系
  • 编辑时可以借助IDE的自动补全, 语法错误等功能, 减少笔误
  • 易于编写自动测试以保证一些基本检验规则, 比如朝代没有重合部分, 先辈出生日期肯定早于后辈, 等等.
  • 易于直接使用数据进行分析:
    比如这样:
消失国家 = list(set(国家所属时期[朝代.春秋]) - set(国家所属时期[朝代.战国]))
print("春秋消失的国家: " + 消失国家)

输出:

春秋消失的国家: [<地点.越: '越国'>, <地点.晋: '晋国'>, <地点.吴_春秋: '吴国'>, <地点.宋: '宋国'>, <地点.鲁: '鲁国'>]

下面是源码, 仅作原型演示之用, 如果正式开始项目需要更官方的史实参考来源. 非常不成熟, 请多指摘, 尤其是TODO部分.

# 来源: 中国少儿百科全书-历史大观: 河姆渡文化-郑和下西洋

from enum import Enum

class 朝代(Enum):
  新石器 = "新石器时代"
  东周 = "东周"
  春秋 = "春秋时期"
  战国 = "战国时期"
   = "秦朝"
  西汉 = "西汉"
  东汉 = "东汉"
  三国 = "三国时期"
   = "隋朝"
   = "唐朝"
   = "元朝"
   = "明朝"

class 社会类型(Enum):
  氏族社会 = "氏族社会"
  母系社会 = "母系社会"

# TODO: 添加地点关系, 如国-地区-省-市-镇, 以及行政区划改变(村->镇等)
class 地点(Enum):
  浙江 = "浙江省"
  余姚 = "余姚市"
  河姆渡 = "河姆渡文化"
  长江下游 = "长江下游地区"
  黄河中游 = "黄河中游地区"
  陕西 = "陕西省"
  西安 = "西安市"
  半坡 = "半坡遗址"
  长安 = "长安"
  洛阳 = "洛阳"
   = "齐国"
   = "晋国"
   = "宋国"
   = "秦国"
   = "楚国"
  吴_春秋 = "吴国"
   = "越国"
   = "燕国"
   = "韩国"
   = "赵国"
  魏_战国 = "魏国"
   = "鲁国"
  匈奴 = "匈奴"
  大月氏 = "大月氏"
  西域 = "西域"
  官渡 = "官渡"
  赤壁 = "赤壁"
  魏_三国 = "魏国"
  蜀国 = "蜀国"
  吴_三国 = "吴国"
  吐蕃 = "西藏"
  蒙古 = "蒙古国"
  中亚 = "中亚"
  东欧 = "东欧"
  西洋 = "东南亚和印度洋沿海"

# TODO: 更多人物信息, 如原名, 性别, 小名等等
class 人物(Enum):
  周平王 = "周平王"
  齐桓公 = "齐桓公"
  晋文公 = "晋文公"
  宋襄公 = "宋襄公"
  秦穆公 = "秦穆公"
  楚庄王 = "楚庄王"
  吴王 = "阖闾"
  越王 = "勾践"
  孔子 = "孔子"
  老子 = "老子"
  墨子 = "墨子"
  孟子 = "孟子"
  秦王 = "嬴政"
  汉景帝 = "汉景帝"
  汉武帝 = "刘彻"
  卫青 = "卫青"
  霍去病 = "霍去病"
  张骞 = "张骞"
  袁绍 = "袁绍"
  袁术 = "袁术"
  曹操 = "曹操"
  孙坚 = "孙坚"
  刘备 = "刘备"
  孙权 = "孙权"
  曹丕 = "曹丕"
  汉献帝 = "汉献帝"
  唐太宗 = "李世民"
  李靖 = "李靖"
  尉迟恭 = "尉迟恭"
  李建成 = "李建成"
  魏征 = "魏征"
  文成公主 = "文成公主"
  松赞干布 = "松赞干布"
  武则天 = "武则天"
  唐高宗 = "唐高宗"
  成吉思汗 = "铁木真"
  忽必烈 = "忽必烈"
  郑和 = "马和"
  朱棣 = "朱棣"

class 年号(Enum):
  贞观 = "贞观"

class 路线(Enum):
  丝绸之路 = "丝绸之路"

class 群体(Enum):
  儒家 = "儒家"
  道家 = "道家"
  墨家 = "墨家"

class 行为(Enum):
  栽种 = "栽种"
  制作 = "制作"
  结婚 = "结婚"
  求教 = "求教"
  消灭 = "消灭"
  出使 = "出使"
  出击 = "出击"
  击败 = "击败"
  效力 = "效力"
  称帝 = "称帝"

class 植物(Enum):
  水稻 = "水稻"

class 物件(Enum):
  陶器 = "陶器"

国家所属时期 = {
  朝代.春秋: [地点., 地点., 地点., 地点., 地点., 地点.吴_春秋, 地点., 地点.],
  朝代.战国: [地点., 地点., 地点., 地点., 地点., 地点., 地点.魏_战国],
  朝代.三国: [地点.魏_三国, 地点.吴_三国, 地点.蜀国]
}

# 数字为公元纪年, 如-5000即公元前5000年, 221即公元后221年
# TODO: 很多年份如秦代-200需更正
时间跨度 = {
  地点.河姆渡: range(-6000, -5000),
  地点.半坡: range(-4400, -4300),
  朝代.东周: range(-770, -221),
  朝代.: range(-221, -200),
  朝代.西汉: range(-200, 0),
  朝代.东汉: range(0, 229),
  年号.贞观: range(626, 650)
}

# TODO: 此表仅在人物无具体生卒年月时有用
所属时期 = {
  地点.半坡: 朝代.新石器,
  地点.河姆渡: 朝代.新石器,
  人物.孔子: 朝代.春秋,
  人物.老子: 朝代.春秋,
  人物.卫青: 朝代.西汉,
  人物.霍去病: 朝代.西汉
}

所属地点 = {
  人物.孔子: 地点.,
}

人物所属群体 = {
  人物.孔子: 群体.儒家,
  人物.孟子: 群体.儒家,
  人物.老子: 群体.道家,
  人物.墨子: 群体.墨家
}

属性 = {
  地点.河姆渡: 社会类型.氏族社会,
  地点.半坡: 社会类型.母系社会
}

# 行为方向为: 前者对后者
# TODO: 加入事件发生时间, 地点
事件 = {
  行为.结婚: [(人物.文成公主, 人物.松赞干布), (人物.武则天, 人物.唐高宗)],
  行为.栽种: [(地点.河姆渡, 植物.水稻)],
  行为.制作: [(地点.半坡, 物件.陶器)],
  行为.求教: [(人物.孔子, 人物.老子)],
  行为.消灭: [(地点., 地点.), (地点., 地点.), (地点., 地点.魏_战国)],
  行为.出使: [(人物.张骞, 地点.西域), (人物.郑和, 地点.西洋)],
  行为.出击: [(人物.卫青, 地点.匈奴), (人物.霍去病, 地点.匈奴)],
  行为.击败: [(人物.曹操, 人物.袁绍)],
  行为.效力: [(人物.魏征, 人物.李建成), (人物.魏征, 人物.唐太宗), (人物.李靖, 人物.唐太宗), (人物.尉迟恭, 人物.唐太宗), (人物.郑和, 人物.朱棣)],
  行为.称帝: [(人物.曹丕, 地点.魏_三国, 220), (人物.刘备, 地点.蜀国, 221), (人物.孙权, 地点.吴_三国, 229)]
}

名言 = {
  人物.唐太宗: ["民, 水也; 君, 舟也. 水能载舟, 亦能覆舟"]
}

@ZoomQuiet
Copy link

@nobodxbodon
Copy link
Member Author

@ZoomQuiet 文中提出的几个要素基本上是往对开发者更可读, 在基本概念上更与核心知识(比如数学)一致的方向走. #33 (comment) 中的设想有点相似. 不过这个issue关注的重点并非编程语言本身, 而是构建基础知识库. 文章最后一句很应景:

Unlike the languages that come and go with the fashion, the things that matter do deserve constant reinvention.

无论人机交互方式如何变化(编程语言只是其中一条途径), 核心知识是相对稳定的(公理/自然规律/历史/地理等等).

@ZoomQuiet
Copy link

@nobodxbodon 是也乎,( ̄▽ ̄)

所以, 尝试通过将文本界面变成中文, 并不能本质的提高这类相对稳定的工程经验获得效率...

学习的核心过程, 是自身知识树的重构...信赖大量的专注的有结构的训练...

所以, 可能中文编程 这个概念本身的提出以及实现, 受益最大的, 不是学习者, 而是实现者...

@nobodxbodon
Copy link
Member Author

@ZoomQuiet

所以, 尝试通过将文本界面变成中文, 并不能本质的提高这类相对稳定的工程经验获得效率...

楼上演示, 这里首先要积累的是中文知识库, 相关查询语言/界面只是副产物

学习的核心过程, 是自身知识树的重构...信赖大量的专注的有结构的训练...
所以, 可能中文编程 这个概念本身的提出以及实现, 受益最大的, 不是学习者, 而是实现者...

如果对"中文编程"本身有疑问, 请移步#44 . 如果对知识库或者中文知识库本身的作用有疑问, 也许可以参考各种英文知识库的使用情况.

@Akimotorakiyu
Copy link

Akimotorakiyu commented Dec 2, 2018

我觉得JS+H5+Vue+Canvas编程比较好,所见即所得,很快就能创造出有意义的很Cool的东西,这会很吸引小孩子.

@nobodxbodon
Copy link
Member Author

@silverleaves 之前做过中文版logo的原型. 但这里针对的是传统学科/基础知识, 主要目的是义务教育阶段的辅助学习(编程只是工具而非目的), 而不是像现在市面上多数少儿编程采用的从游戏中学基本编程(基本与传统学科无关).

@Akimotorakiyu
Copy link

@silverleaves 对呀, 义务教育阶段最有用的就是 数学和物理了, 数学就是画函数图像以提高象形思维能力, 物理就是动力模拟以提高分析思维能力. JS+H5+Vue+Canvas这一套刚好啊!

@nobodxbodon
Copy link
Member Author

@silverleaves 这里关注的是对基础知识本身的程序/数据化. 利用形成的知识库(如楼上例子: #97 (comment), #97 (comment) )来实现衍生应用可以有很多形式, 比如教学软件/类似wolfram的搜索引擎等等. 至于用何技术实现是确定了应用形式之后再探讨的问题.
你觉得哪种衍生应用比较有需求? 在哪种平台(单独网站, app-PC/移动端/小程序, 浏览器插件等等)着手实现较适合?

@Akimotorakiyu
Copy link

Akimotorakiyu commented Dec 6, 2018

@nobodxbodon

  1. 简单说,大学学习Matlab,C语言的时候, 我和我同学都不愿意学. 真的乏味. (相比计算机语言,Matlab简单多了.)
  2. 我看了你上面提到的那两段代码, 概念真的不是大多数孩子愿意接受的
  3. 知识本身就不是大多数人喜欢的的东西, 更何况让小孩子接受.

我觉得关键是趣味, 我现在会写C/C++, JS等完全是以一个兴趣点相干图形生成驱动起来的.

哪种衍生应用? 我的回答是有趣味的, 最好是像王者荣耀那样简单有趣, 伴随无限可能的趣味.

相干图形生成 算一个. 顺便说一句,我不是计算机相关专业的.

@nobodxbodon
Copy link
Member Author

@silverleaves 上面的代码不是给少儿看的. 举个例子, 三国志系列游戏也是基于了史实和地理知识, 比如城市/人物/大事件年代/兵种相克等等. 这里希望积累的中文知识库就是作为各种衍生应用的基石(游戏只是衍生应用的一种), 性质与这里的各种知识库相同, 只不过是用某种编程语言实现, 而非常用的RDF/OWL格式.

@Akimotorakiyu
Copy link

Akimotorakiyu commented Dec 7, 2018

@nobodxbodon 可以开发一种这样的新的计算机语言吗?

像这样

事物 渣渣辉
事物 古添乐

渣渣辉 的 攻击力 = 5
古添乐 的 血量 = 10

动作 砍
{
    宾语 的 血量 = 宾语 的 血量 - 主语 的 攻击力
}

渣渣辉 砍 古添乐
// 结果 : 古添乐 的 血量 现在是5

等价于,js语句

let 渣渣辉={}
let 古添乐={}

渣渣辉.攻击力=5
古添乐.血量=10

function 砍(aim){
    aim.血量=aim.血量-this.攻击力
}

渣渣辉.砍 = 砍

渣渣辉.砍( 古添乐 )
// 结果 : 古添乐 的 血量 现在是5

运行示例

default

@4b5ent1 4b5ent1 added active 不一定活跃,但没有弃坑 session-archive todo 自然语言NLP labels Dec 8, 2018
@4b5ent1 4b5ent1 added the nV-非冯 非冯诺依曼架构/体系 label Dec 8, 2018
@nobodxbodon nobodxbodon removed nV-非冯 非冯诺依曼架构/体系 session-archive todo labels Dec 8, 2018
@nobodxbodon
Copy link
Member Author

@silverleaves 技术上做的到. 可以看看一个开源的日语编程语言(最新版也是JS实现), 就挺接近自然语言(包括无空格等): https://zhuanlan.zhihu.com/p/30800689
这个项目的主要目标是知识库本身, 后续的查询语句也许会衍生出一套简单的DSL, 但不打算打一开始就创造一个通用编程语言.

@4b5ent1
Copy link
Member

4b5ent1 commented Dec 8, 2018

12月份总结:我打算用flash+typescript+haxe+openFL,实现小游戏开发的闭环。让小屁孩也能自己做4399小游戏

@Akimotorakiyu
Copy link

Akimotorakiyu commented Dec 8, 2018

@Absente adobe flash 的那个 flash???
adobe flash不是已经废了麽

@4b5ent1
Copy link
Member

4b5ent1 commented Dec 8, 2018

@silverleaves adobe flash 的那个 flash???
adobe flash不是已经废了麽

并没有,如果你是学传媒或者数媒的(假设你也去过中传),你就会发现,flash只是在html5可以替代的地方被替代了而已,仅此。

@nobodxbodon
Copy link
Member Author

nobodxbodon commented Jan 3, 2019

#123 (comment) 所述, 打算先从度量衡开始. 与某历史地理群讨论之后, 发现的确有类似需求. 功能初步设想如下:

  • 从现代的日常常用中文单位开始, 长度: 千米-毫米等; 质量: 吨-克等; 面积: 平方公里等; 体积: 立方米, 升等. 以及市制单位.
  • 支持同一度量之间的换算, 比如公制长度单位之间, 市制长度单位之间, 公制与市制长度单位之间

初版粗略API设计:

  • enum 单位类型 {长度, 质量, 体积, 容积)
  • List<单位> 获取所有单位(enum 单位类型): 返回该度量下支持的单位, 比如所有长度单位
  • double 换算(double 值, 单位 原单位, 单位 目标单位): 只对同一度量进行换算

之后的扩展:

  • 科学常用单位(如微米/纳米), 专业单位(如海里, 节), 英制单位 (英亩, 英里等)
  • 古代单位(与朝代相关, 如, , 也许某些还是约数)
  • [决定不在此库完成] 支持不同度量之间的计算/换算, 比如: 1米×1米×1米=?升, 千米/小时=?米/秒

待定问题:
精确度保持?

参考现有类似功能库:
JS: https://github.com/gentooboontoo/js-quantities
Java:

1/6/2019 发现JSR 385 Units of Measurement API. 打算基于此实现, 以减小重复工作量.

@nobodxbodon
Copy link
Member Author

得知数学 app GeoGebra支持中文函数:
GeoGebra支持中文函数

@nobodxbodon
Copy link
Member Author

nobodxbodon commented Apr 22, 2020

已开始一些文史、自然方面的常识库:中国历代纪元中医药方
还有一些想法:

参考:

@nottellyou
Copy link

 有点意思,有人要少儿编程学院域名吗:sebcxy.com

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
active 不一定活跃,但没有弃坑 推广 not only 中文编程
Projects
E2030
Awaiting triage
Development

No branches or pull requests

5 participants