我的一个朋友前几天问我,如果我在编程时只是查看数字列表,或者它是如何工作的.我试着解释一下,它通常更像是数学公式,奇怪的英语单词被抛入,并且它通常大部分都是可读的.但这是一个非常模糊的解释,并没有真正解释给非程序员.
但它让我思考什么会成为一个好榜样.不是因为我想教她的编程或任何东西,而只是让她知道什么程序代码"看起来像".
这让我想知道实际上会有什么作为一个好例子.事实证明这非常困难.
我的第一个想法显然是一个简单的"Hello World"计划.但它确实没有显示任何有用的东西.它并没有真正展示我们如何使用函数或变量,或控制流程结构,if
或者while
使程序实际执行某些操作.这没有逻辑.该程序对任何事情都没有反应.
所以像计算素数这样的东西可能是一个更好的例子.但话又说回来,这可能过于理论化和不切实际......(这有什么用呢?它与编写"真实"程序有什么关系?)而且,其中没有重要的控制流逻辑.这只是一个直接的数学序列.
还有,应该使用哪种语言?
理想情况下,我不认为它必须是一种非常"干净"的语言.但相反,它应该可以使结构清晰.如果它这样做,那么一定量的噪音和杂乱可能没问题.也许像C++这样的东西实际上是比Python更好的例子.显式花括号和类型说明符是明显的"钩子",可以帮助解释程序的结构,或者强调它不仅仅是简单的语句,几乎可以读作英语.
但是使用C++,我们也会遇到一些彻头彻尾的奇怪语法.为什么std::cout << x
习惯打印x?为什么不用"普通"函数调用语法?并printf
没有更好的,它具有神秘的格式字符串,并且缺乏可扩展性(我是否想通过使用char*
字符串使程序复杂化?或者我是否使用std::string
并解决这个看似不必要s.c_str()
的字符串可以打印出来的字符串?printf
?
也许更高层次的语言会更好.但是哪一个?为什么?
我知道这里有很多类似的问题,用于教授编程的语言/示例程序.但我认为这里的要求是不同的.在教授编程时,我们比任何事情都更简单.我们希望避免任何尚未教授的内容.我们希望确保学生能够理解屏幕上的所有内容.
我对简单本身并不感兴趣.而是给"外人"一个"程序看起来像什么"的想法.程序并不简单.但他们也普遍表现出一定的结构和方法可以解决这一难题.哪种语言/程序最能突出?
编辑
感谢您到目前为止的所有建议.你们中的一些人对它的看法与我想要的有些不同.
也许一个例子是有序的.我无法驾驶飞机,但我已经基本了解驾驶舱的样子,以及驾驶员在飞行时"做什么".
而且我不是一个训练有素的木匠,但是当我看到一个时,我知道一把锯子或一把锤子.
但是当你看到与电影中的编程有关时,它通常只是充满垃圾的屏幕(如矩阵中的绿色文本).它看起来不像普通人类实际上可以做的事情.它没有什么可辨认的.不是程序员的人只是认为这是黑魔法.
我不想教她飞行,也不想编程软件.但我想给她一个基本的参考框架.只是一个想法"啊,这就是你正在使用的东西.所以它不仅仅是屏幕上的随机符号和数字".if
与矩阵式随机符号和数字相比,即使只显示一个简单的陈述也是一种启示.
你们有些人建议解释一个算法,或使用伪代码,但这就是我想要避免的.我想要的东西只是简单地显示实际的代码是什么样的,就像你不必是一个木匠来看一看锯,并基本了解它是什么以及它是如何工作的.
当我还是个孩子的时候,我们曾经去过意大利度假.在下来的路上,飞行员让我进入飞机的驾驶舱.当然,我没有学习如何驾驶飞机.但我确实看到了飞行员的世界.我知道他们如何让飞机走了,飞行员实际上做了什么.
这就是我想做的一切.我的朋友没有兴趣学习编程,我也不想强迫她理解源代码.但她很好奇我与哪种工具或实体合作.矩阵式符号是否在屏幕上滚动?纯数学?散文形式的英语?
我有兴趣传达的是对"工作时的样子"的高层次理解.
BASIC
10 PRINT "Sara is the best" 20 GOTO 10
更新:当我12岁时,我的表弟(他14岁)带来了Turbo Pascal 7.0并将其安装在我的电脑中.
他从零开始编写了一个tic tac toe游戏(在BGI模式下,对于那些知道的人).
我一步一步观察/观察程序是如何发展的,直到它成为一个完整的应用程序.
在那之前,我只知道如何在BASIC中打印字符串:-B
你可以做类似的事情.结对编程.嗯,实际上你的朋友将是观察者,但她会得到一个想法;)
为什么不考虑一种不存在的语言(或者,如果您相信的话)并使用伪代码?我认为,取决于你想要达到的目标 - 我会考虑这个人熟悉的任务的例子,但是我将其分解为一个伪代码示例.
在向非程序员解释事物时,我通常会发现"烹饪"或"食谱"的想法非常合适.
我要求这个人想象他们的配方相当复杂 - 例如咖喱和米饭.然后我建议他们应该尝试把它写下来给那些完全不知道他们在做什么的人,这样他们就可以做饭了.
有一个非常明确的阶段涉及:
收集工作的成分和工具.
准备成分.这很复杂.例如
得到3个小红辣椒.
对于每个红辣椒,将其切成约1平方厘米的块.
将红辣椒块放入碗中以备后用.
单独对此,调用准备米功能,并在继续烹饪时在后台异步工作.
我相信你能看到它的发展方向......;)
与烹饪和编程有许多相似之处(因为有许多东西,但更多的人对烹饪有所了解而不是建造房屋).有阶段/相似之处(我认为)是:
收集 :(声明实现目标所需的内容并将它们组合在一起).
水面浮油:切碎的成分或准备好数据连接对象等,为第一次使用.
异步:在另一件事情发生时让一件事情发生的能力.
功能:米饭制作,鸡肉烹饪和咖喱烹饪都需要单独的过程,只有最后才能有makeCurry(chickenMeat,rice)功能.
测试:确保随着您的进展,您不会错过任何一点并且一切顺利 - 例如,确保在您进入下一阶段之前烹饪鸡肉.
垃圾:一旦你完成,你必须确保你整理.;)
最佳实践的原理:有一些有效的方式来做烹饪,开始程序员除了代码之外还要学习 - 有时候很难让你理解.例如DRY,如何用刀切割,不吃生鸡肉;)
基本上,我认为将编程教学作为一般性主题 - 除非你有令人信服的理由,否则我不一定会用语言教学.相反,最初从摘要中教导,直到他们至少理解事物可能如何融合在一起的基本原理.然后他们可能会发现坐在显示器和键盘前更容易.
我想这个可能没有一个"正确答案".但我想也许一些非常好的想法,你可以从所有的东西中取出一些东西.
我会解释编程正在给出详细的说明,以便计算机可以完成复杂的任务.
如何制作两杯咖啡?
装满水壶
烧水
杯中的咖啡
倒水
加糖
加牛奶
再做3到6次
为了直接回答你的问题 - 编程"看起来像什么",我会向他们展示一个大型应用程序的打印件.玩具应用程序或像haskell中的qsort这样可爱的东西确实给出了错误的想法.
它看起来有点像这样.有时.
也许每个人都过分关注代码而不是工具.可能最好在IDE中向她展示一个项目,以及它如何包含各种源文件以及一些图形化的东西,如数据库模式或可视化用户界面设计器.Visual Studio,Eclipse或Xcode与大多数人在黑色背景上快速滚动发光绿色符号的心理形象相差甚远.
我想你应该下载一些用AT&T汇编语言编写的大型win32应用程序,然后在记事本中向她展示,然后告诉她,"正如你所看到的,需要像我这样的超人来编程."
编写对非程序员具有任何可理解价值的东西.如果我向我的母亲展示Quicksort,它将没有任何用处.
询问这个人他的兴趣.例如,如果他/她进入证券交易所,那么将一个脚本从一个适当的网页上读取一些股票统计数据并将它们编译成一个excel表(使用csv,以避免重大的脑损伤^^)或者可能成为一个不错的图表.
如果该人使用Twitter,则编写一些可以计算其关注者的追随者或其类似内容的内容.
这些任务非常简单,可以在很短的时间内完成,并且它们已经使用了许多程序员使用的基本工具,比如循环,库(对于所有涉及的http内容),也许是递归.
在你完成或编码(甚至更好)之后,你可以解释你的程序如何发挥其魔力.
保持简单,用人类语言交谈.如果你向他们展示兆字节的代码并谈论原型继承这样的事情,那么你只是恐吓他们,他们会立即失去兴趣.
为了让我的妻子知道我做了什么来带薪(这是真正的工作!我保证!我们不只是整天浏览网页!)我和她一起坐了一晚,并向她展示了几个基本概念:调用函数(打印),分配和读取变量,以及if语句的工作原理.既然她是老师,我把条件的概念比作与学龄前儿童一起工作:)
IF you hit Jonny THEN you're in time out OTHERWISE you can have a snack.
在回顾了几个非常高级的概念之后,我向她展示了一个简单的数字猜谜游戏的代码,并让她在看代码的同时播放它.
# Guessing Game import random print("Guess a number between 1 and 100: ") target = random.randint(1, 100) guess = 0 guess_count = 1 while guess != target: guess_count += 1 guess = int(input()) if guess == target: print("Correct!") if guess < target: print("Higher...") if guess > target: print("Lower...") print("Congratulations! You guessed the number in " + str(guess_count) + " guesses!")
除了有点抽象的"导入"概念之外,这是一个非常简单的例子,很容易理解并"连接"到屏幕上发生的事情,更不用说它实际上做了一些有趣和互动的事情.我认为我的妻子离开了整个概念不那么神秘的体验,而不需要在代码方面知道太多.
我认为关键是能够让某人看到代码并且它的最终结果是并排的.
有一个名为LOGO的CLI图形包,以Turtle Graphics而闻名,用于在屏幕上使用类似命令绘制形状LT 90, RT 105
.看看你是否能找到它,尝试绘制中等复杂度的东西将是一个不错的体验.
LOGO - 面向逻辑的图形编程语言.
REPEAT 360 [FD 1 RT 1] -- draws a circle, etc.
在logothings或维基百科上查看更多内容,其中还包含现代徽标解释器的链接.
计算机程序员编写程序.
虽然没有编程,但计算机程序员在工作场所惹恼了有魅力的女性.
然后:http :
//markharrison.net/stackoverflow/univac-1110-500-unisys.jpg
现在:http :
//markharrison.net/stackoverflow/codemonkey.png
当我的5个女儿问我这个问题时,我让她"开发"了一个小箭头"机器人"的程序,它将使用类似流程图的纸片将他带入棋盘的左上角,表示移动,转动和条件.我认为它也适用于成年人.
不过,我并没有声称发明了这个答案.
关于你的编辑:我担心,程序员对其他人对编程的想法更不了解.;-)人们认为编程是一个类似矩阵的绿色视频卡腐败,就像他们认为间谍都配备了詹姆斯邦德的高科技玩具一样多.任何领域的任何专业人士在观看有关其工作的电影时通常会感到烦躁.因为电影制作人不知道!另一方面,我们是否知道如何正确描绘电影中的节目?;-)
我发现"教别人编程是什么而不教他们编程"的最佳方法实际上就是放弃与特定编程语言相关的任何东西.
相反(假设他们真的感兴趣),我会通过在程序中实现一个函数来谈论它们,比如简单的银行贷款申请(大多数人在某个阶段必须处理贷款,如果他们超过一定年龄) ,然后在所有假设中挖洞.
比如,如果用户输入负贷款金额会发生什么?如果用户负担不起贷款怎么办?贷款申请如何知道?贷款申请如何知道要检查哪个银行账户以及要检查哪个支付历史(即谁实际上是用户)?如果用户试图在贷款金额字段中输入他的名字怎么办?如果用户试图贷款超过75年怎么办?我们应该将选择限制在可用长度列表中吗?
然后最后:编程正在采用所有这些规则,并用计算机理解的语言编写它们,以便遵循这些规则.此时,如果认为有必要,我会提取一些简单的代码,以便可以查看整体语言,然后用该语言写出其中一条规则.
如果你可以让你的朋友做出反应,可以获得奖励积分:但是如果我们忘了什么呢?那么,我们有bug,现在你知道为什么没有软件程序也是无bug的:)