program-in-chinese / overview

中文编程的历史、现状和展望。issue 中进行相关问题的讨论.
https://zhuanlan.zhihu.com/codeInChinese
GNU General Public License v3.0
383 stars 34 forks source link

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

Open nobodxbodon opened 5 years ago

nobodxbodon commented 5 years ago

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

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

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

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

nobodxbodon commented 5 years ago

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

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

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

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

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


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

ZoomQuiet commented 5 years ago

@nobodxbodon 是也乎,( ̄▽ ̄)

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

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

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

即, 入门前的玩具.

ZoomQuiet commented 5 years ago

是也乎,( ̄▽ ̄)

Blockly 是 Google 开源的通用可视化编程环境,

和 Scrach 类似, 可以可视化的完成交互游戏,辅助建立编程概念, 但是, 无法支持实用工具的构建,

所以, 这个方向上结合中文, 可能有帮助, 但是, 对于接下来真正编程, 帮助实在有限....

除非有学校配合, 或是有 编程猫之类的社区组织线下活动, 否则, 作为入门前的准备玩具, 也只能有可能有作用.

nobodxbodon commented 5 years ago

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

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

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

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

nobodxbodon commented 5 years ago

尝试从人教版小学数学一年级上册开始, 但已经觉得也许从更高年级开始更有可行性(更容易程序化). 感觉这样的项目做大了就会接近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 commented 5 years ago

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

nobodxbodon commented 5 years ago

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

nobodxbodon commented 5 years ago

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

下面是源码, 仅作原型演示之用, 如果正式开始项目需要更官方的史实参考来源. 非常不成熟, 请多指摘, 尤其是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 commented 5 years ago

If I were to invent a programming language for the 21st century

nobodxbodon commented 5 years ago

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

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

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

ZoomQuiet commented 5 years ago

@nobodxbodon 是也乎,( ̄▽ ̄)

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

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

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

nobodxbodon commented 5 years ago

@ZoomQuiet

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

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

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

如果对"中文编程"本身有疑问, 请移步https://github.com/program-in-chinese/overview/issues/44 . 如果对知识库或者中文知识库本身的作用有疑问, 也许可以参考各种英文知识库的使用情况.

Akimotorakiyu commented 5 years ago

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

nobodxbodon commented 5 years ago

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

Akimotorakiyu commented 5 years ago

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

nobodxbodon commented 5 years ago

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

Akimotorakiyu commented 5 years ago

@nobodxbodon

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

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

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

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

nobodxbodon commented 5 years ago

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

Akimotorakiyu commented 5 years ago

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

像这样

事物 渣渣辉
事物 古添乐

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

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

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

等价于,js语句

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

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

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

渣渣辉.砍 = 砍

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

运行示例

default

nobodxbodon commented 5 years ago

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

4b5ent1 commented 5 years ago

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

Akimotorakiyu commented 5 years ago

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

4b5ent1 commented 5 years ago

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

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

nobodxbodon commented 5 years ago

如https://github.com/program-in-chinese/overview/issues/123#issuecomment-450545686 所述, 打算先从度量衡开始. 与某历史地理群讨论之后, 发现的确有类似需求. 功能初步设想如下:

初版粗略API设计:

之后的扩展:

待定问题: 精确度保持?

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

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

nobodxbodon commented 4 years ago

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

nobodxbodon commented 4 years ago

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

参考:

nottellyou commented 1 year ago

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