[转译] CheatGPT

本文为计算机科学教授大卫·汉弗莱 (David Humphrey) 撰写的关于 ChatGPT 及其对核心学习的潜在负面影响的文章。这是一本关于在教育环境中使用生成式 AI 的陷阱的好书。

原文由David Humphrey 发布于 2023年2月19日

本周,我走出了一个世界,进入了另一个世界。这一切始于我在几门编程课程中批改作业时。

我所阅读的代码质量令人惊叹!我的学生们做的事情与我的开源同行们相似:使用现代语法,采用函数式方法而不是创建大量不必要的状态,组合深度嵌套的函数调用,并采用有趣的模式来解决问题。

我在多份作业中赞扬了我所看到的代码。但随后我开始注意到我写这些相同评论的频率。尽管教授们喜欢认为自己随着时间的推移变得更好,但很难想象我自上个学期以来,或之前的学期,或我教授这门课程的数十次中有了如此大的进步。

我认为我没有改变,课程内容也没有改变。也很难想象这些学生的水平提高了一个数量级。是的,学生群体可能有很大不同;但如此不同?我认为还有另一个解释。

很长一段时间以来,我一直在思考高等教育将如何应对ChatGPT、Copilot和其他AI工具的复杂性。好吧,不用再想了,因为这就是我现在所处的地方。

“戴夫,你在做假设。你能证明这一切吗?”其实我可以,因为一些需要截图的提交中也包含了ChatGPT浏览器标签,里面恰好包括了提示的初始文本。显然,这甚至不是学生们觉得需要隐藏的事情。

我喜欢GPT,并且我已经使用Open AI的GPT-3 API编程很长时间了。它一直在打破我对可能性和不可能性的理解,迫使我思考解决技术问题的新方法。我明白为什么每个人都对使用它感到兴奋。

然而,我不确定如何将其理解为学生学习的一部分。我的女儿们也在大学中看到同样的现象,鼓励我在自己的课程之外思考这个问题:“你在课堂上所做的事情不会改变正在发生的事情——这是一个全球现象。”

当然,她们是对的,所以让我们明确:这正在发生。人们正在使用大型语言模型(LLM)来编写代码。根据GitHub自己的营销:

在2022年6月,我们报告称GitHub Copilot已经生成了27%的开发者代码。今天,我们看到这一现象越来越普遍,所有编程语言中平均有46%的代码是使用GitHub Copilot构建的,而使用Java的开发者中这一比例为61%。

想想节省了多少时间!但如果我稍微改述一下:“平均有46%的学生在线测试和作业[是]使用GitHub Copilot构建的。”如果我们将ChatGPT加入其中,我们可以用“论文”和“报告”替代“代码”。这好还是坏?是创新还是倒退?是在帮助还是伤害我们的学生?

许多不必在日常生活中处理这一实际影响的人给了我各种_有用_的想法:使用没有互联网的口头或纸质测试;“只需”停止使用人们可以作弊的评估;或者,让学生写关于AI响应的内容,讨论它们的好坏。

第一个解决方案因多种原因而困难,尤其是当前高等教育机构的资金模式并不优先考虑日益个性化或实时评估方法所需的师生比例。越来越大的班级使许多这些好主意变得不切实际。教职员工对此没有任何控制权,但请务必与我们的高级领导沟通。这将是很好的。

第二个解决方案在学生学习初期也很具挑战性。我教两类学生:1)一些在第一年学习编程的学生;2)其余的在最后一年,已经学习了半打语言并编写了许多程序。

在我看来,学习编程的学生并不受益于AI帮助“消除编程的繁琐”。在某个时刻,你必须学会编程。你不能通过避免学习编程的必然挣扎而达到目的。“戴夫,也许你必须那样学习,但那个世界已经消失!”这是真的。我已经连续编程约40年。今天遵循我低效、曲折的路径将没有任何好处。回不去了,我也不想回去。现代工具,包括AI的潜力太重要了。我们不能在教育中忽视或禁止AI。但让学生用它来字面上写作业也行不通。

第二组学生,即最后一年的学生,处于不同的位置。我(通常)并不试图让他们理解面向对象编程、枚举集合的不同方法,或何时写函数。我也不在评估这一点。在他们发展的这个阶段,假设他们能够编程。

对于这些学生,AI提供了一些有价值的东西。例如,本周我在审查一位开源学生编写的代码时。阅读时,我需要了解API的使用情况。我在谷歌上搜索答案,唯一返回的结果是这位学生的博客文章(在这个层次上很常见)。我的问题让我遇到了“搜索”的局限性,这已经不再足够。因此,我去ChatGPT询问我的想法,以及是否有更好的方法使用这个API。果然,ChatGPT输出了25行代码,确认了我的想法,并展示了另一种编写此代码的方法。

只是其中一半的代码是虚构的。它使用的一个API调用并不存在(我希望它存在!)。这对我来说并不重要,因为我并不打算按原样使用这段代码(我去阅读了官方文档):我只想了解其他方法。我想勾勒出一个想法。

从LLM返回的文本需要极高的辨别力和细致的阅读。你有时可以直接从ChatGPT复制/粘贴内容,这可能会误导人们认为你总是可以这样做。你不能。但如果这就是你所要做的呢?对于那些不太清楚自己在做什么,只是需要在晚上11:59之前提交这个该死的作业的学生呢?我向你保证,这种用例比人们意识到的要普遍得多。

我不知道正确的答案是什么。我不想像我曾经遇到的许多老师那样,他们对学生安全地将计算机、然后是CD-ROM、然后是互联网融入学习的能力持怀疑态度。

弄清楚这一点是一个沉重的负担,过去20多年的教学中没有其他变化能与之相比。学生从Stack Overflow复制粘贴相比显得微不足道。我们进入了一个新世界,这需要一种深思熟虑的方法。

我很感激像Ethan Mollick这样的人写关于如何在教育中拥抱而不是恐惧AI的文章。这绝对是我想要的方式。然而,正如我上面所写的,对于我来说,看到如何与所有学生一起做到这一点并不容易。

我在考虑的一件事是,我可能需要开始教学生如何在编程中使用GPT/Codex和其他LLM。与其说“你不可以”,我可以尝试展示一些AI在编程中的伦理和务实用途。后GPT时代的编程和学习编程是什么样的?我们需要讨论这个。我希望我的更多同事能在教育和行业中写关于这个问题的文章。

原文:CheatGPT

作者:David Humphrey

[转译] 别相信任何告诉你编程很简单的人

原文发布于 太平洋夏令时间下午 6:00 • 2014年5月24日

告诉刚开始学习编程的人编程很简单,这是我见过最危险的事情之一。

这是你的大脑做的反应:

rage-programming2

我的画作。(我编程比画画好。)

大多数编程并不需要特殊的大脑,但比起别人让你感觉的样子,它更让人沮丧且更混乱。有成千上万热情洋溢的博客文章、课程和应用程序,它们旨在以学习编程有一套简单明了的过程来吸引你。但它们很少提到设置环境的乏味过程(相信我,即使是你最善良的程序员朋友也不愿帮你,因为那东西太让人沮丧,没人记得自己是怎么搞定的)。

它们没告诉你,很多编程技巧其实在于培养在Google上提问的能力和知道哪些代码最适合复制粘贴。它们也没有告诉你一个大秘密:没有真正的掌握,没有最终级别。感觉迷失和愚蠢的焦虑不是你学会征服的东西,而是你学会共处的东西。

这个冬天我决定学习iOS。我在大学暑假自学了编程,所以我对自己学新语言的能力非常自负。我忘记了这有多难。在超越了我对Xcode的怨恨之后(这个“Storyboard”看起来像给小孩的,这不是真正的编程),我开始了一系列对我来说太高级的项目。结果iOS和网页开发不同;我预期会难的东西很容易,而那些应该容易的却很难。我对自己不耐烦和恼火。

我忘记了,对于程序员来说,最常见的状态是自我不满。作为一个程序员,有无限的东西要学。你可以成为某种语言或框架的专家,但如果你的工作是有效地构建东西,你会不断学习新工具,感觉不断被淹没。心理准备好感觉愚蠢会有所帮助。

心理学家Mihaly Csikszentmihalyi 提出了一个可视化学习过程的洞见方式(适用于任何学科):

anxiety-boredom-3

来自“Flow: The Psychology of Optimal Experience”一书中的图片改编

我发现我的经历与这条线非常接近,并提出了这个递归编程学习食谱:

  1. 按部就班地跟随教程,即便你并不总是理解自己在做什么。我喜欢把这部分比作Hunter S. Thompson 用打字机抄写伟大大师的书。你在感受用新的语言/框架如何完成事情。这部分应该很容易但有些无聊,因为你只是在照做。 [乐观之坡]
  2. 重建你刚做的东西或是它的稍许变体。尽量不依赖教程。意识到你理解得非常少。 [恐惧牵扯,拖慢你的上升]
  3. 尝试做一些你真正想做的简单项目。发现你完全不知道自己在做什么。 [绝望之海]
  4. 找一个与新项目相关的新教程。(希望你的教程能逐步提供你对语言的背景知识。)按步骤操作。 [微弱的理解感,自我价值提升]
  5. 自己重建那个东西。 [恐惧]
  6. 开始一个新项目。 [绝望]
  7. 重复步骤1到6。

我是教程的忠实粉丝。在这个过程中,我做了一个应用来收集最好教程的推荐,这些都是程序员们用过并推荐的。希望它能缩短你在摸索阶段的时间,帮助你快速找到好的内容。

只要你学会在沮丧中磨练,你就会爬上山坡,看到自己的进步。接受自己无法理解一切,信任自己即便看不到进步也在变得更好,并且不要急 。祝你好运。

特别感谢Shuttleworth Foundation,他们的神奇快速资助促使我踏上学习新事物的道路,并给了我时间来做Teach Yourself To Code。也感谢Cody Brown,他在这篇文章上的帮助。

来源: Don’t Believe Anyone Who Tells You Learning To Code Is Easy 作者: Kate Ray

[转译] 如何增加休息时间来提升你的工作效率

原文作者:Saeed Gatson

软件开发者生活在一个有趣的悖论中。一方面,我们很懒。这就是为什么我们喜欢自动化那些无聊的重复任务,比如运行单元测试或部署新环境。与此同时,开发者常常因记录大量工作时间而受到赞扬。典型的咖啡因驱动的通宵达旦工作场景屡见不鲜。

不休息地工作是一种坏习惯,这可能会危及业务、健康和你所追求的生活。10、12或14小时以上的工作日只能在心理和身体极限到来之前维持。

显然,我们应该保护我们的高效编码时间,但不清楚的是,我们也应该保护我们的休息时间。

软件开发者很容易过度工作。从管理的角度来看,这是有道理的。如果你有一个高效的编码者,分配给他们更多的工作将使整个项目更有可能成功。问题在于,这只是短期思维,通常会导致倦怠。

你可以休息两种类型。我喜欢将它们称为宏观休息和微观休息。宏观休息是通常发生在几天内的长时间休息。想想周末或几周的假期。微观休息则短得多。比如水冷器聊天或短暂的午餐休息。在这篇文章中,我们将讨论为什么软件开发者应该多进行微观休息。

为什么你应该休息?

很少有人意识到,当你退后一步,给大脑和身体充电时,你往往能做得更多。研究表明,所有时长的休息后,表现都会提高:从长假到30秒的微休息。

多伦多大学管理学副教授约翰·特鲁加科斯表示,工作相关的压力会扼杀你的生产力。他建议,“与工作断开联系对人们的精力和心态有奇效。”为了证明他的观点,他引用了一项研究,其中59%受访者表示,更多的休息会提高他们的工作幸福感。

约翰继续说,心理集中类似于肌肉。经过持续使用后,它会感到疲惫,需要休息才能恢复。就像健美运动员在健身房需要在组间休息一样。

为什么你认为没有时间休息?

如果你认为没有足够的时间进行短暂的休息,你可能花了很多时间在不生产的事情上。重要的是退后一步问自己:“我在做真正重要的工作吗?”许多软件开发者,包括我自己,最终会做一些不必要的忙碌工作。 对于大多数人来说,有很多时间是在不知不觉中浪费的。找到时间休息,这将对你长期有帮助,归根结底在于管理优先事项。有关此主题的更多细节和想法,请查看这篇文章:为什么你没有足够的时间(以及如何拥有更多)。

如何确保你有时间充电:番茄工作法

确保你有时间充电的最简单方法之一是将休息时间纳入你的工作系统。这可以通过使用番茄工作法来实现。

番茄工作法是一种简单而有效的工作组织方式。主要思想是你设定一个定时器,设定一个时间段。在这段时间内,你应该专注于完成一个目标。定时器响后,你再设定另一个定时器,代表短暂的休息。就这样。一个工作时间段后跟着一个休息时间段。

番茄工作法的6个高级技巧

关于番茄工作法有很多信息,你可以深入研究这个主题。要查看一个示例,可以看看约翰·索尼梅兹的书《软技能:软件开发者的生活手册》。他有一整章讨论番茄工作法。以下是我认为在使用番茄工作法时能给你带来最大收益的一些高级技巧。

  1. 监测完成任务通常需要多少个番茄(工作时间块)。
  2. 学会保护你的工作时间不受外部干扰。
  3. 估算一个任务需要多少个番茄。
  4. 在番茄期间花几分钟回顾和复习当前任务。这可以在最初的几分钟内进行。
  5. 根据完成目标所需的番茄数量来组织你的工作时间。
  6. 每几个番茄中,抽出一个时间段为自己留出一些个人时间。

每个人的工作方式都不同,因此,最终你需要不断测试,直到找到最适合你的方法,但牢记这六点肯定会有所帮助。

使用不同的时间分配

番茄工作法中常见的变量是设定的工作和休息时间段。这些可以在一天中变化,或者更有规律。这也是个人偏好的另一种选择。然而,有一些常见的时间分配。

  • 25分钟工作,5分钟休息。最常见的分配是25分钟工作后休息5分钟。这连续进行四次,然后休息时间延长到15或20分钟。这是经典的番茄时间分配。
  • 50分钟工作,10分钟休息。扩展的番茄工作法是50分钟工作10分钟休息的策略。与其他技术非常相似,但对于软件开发来说效果很好,因为在开始编写代码之前可能需要较长的准备时间。在投入了那几分钟后,你会想充分利用它,避免上下文切换。
  • 52分钟工作,17分钟休息。一种更不常规但成功的策略是52分钟的高强度工作后跟随17分钟的完全放松。关键在于在52分钟内100%专注于工作,在17分钟内100%放松。通过完全专注于工作或放松,员工能够充分利用他们的时间。根据这份报告,生产力最高的10%员工采取了这种方式。
  • 20分钟以上工作,10分钟休息。不打断工作流的策略。这是我个人的有效方法。我在开始时有困难,但使用定时器可以帮助我开始。例如,我可以说我只需做这个困难的任务20分钟,然后就可以停止。然而,如果我进入状态,定时器响了,我会继续工作,直到遇到瓶颈或失去状态。因此,个人而言,短时间有助于我建立动力。我发现三分之二的时间我会继续工作。

并不是每种时间分配都适合每个人。尝试不同的时间段,直到找到最适合你的方法,因为最终这才是最重要的。

如何跟踪工作和休息时间

我发现使用应用程序是跟踪休息和停止的最佳方式。作为软件开发者,我们大部分时间都在电脑前,因此使用网络应用程序非常方便。我目前使用的应用程序叫Moosti,但还有数百种其他易于找到的选项。你也可以使用一个鸡蛋计时器、手机上的秒表应用程序或其他任何东西。不要过于复杂化。只需选择一个并开始使用。

如何处理工作中的意外情况

并非我们作为软件开发者所做的一切都能很好地适应番茄式的时间分配。会出现软件更新、长时间构建或系统故障等情况。一个常见的问题是,在意外情况下你应该怎么做。约翰·索尼梅兹在一段视频中回答了其中一些问题,他讨论了关于番茄工作法的一些问题。 主要的收获是你必须务实。

当发生超出你控制范围的事情时,你必须制定一个最适合该情况的新计划。你不必盲目遵循规则。想出适合你的方法。这里没有错误的答案。

“你只能为自己设定能够完成的工作,所以不要试图控制世界,你只能控制自己。” – 约翰·索尼梅兹

休息期间该做什么

另一个常见的问题是我在休息期间应该做什么。这可能听起来很傻,但休息可能很困难。尤其是对于面临紧迫截止日期的软件开发者来说。因此,想出在休息期间可以做的事情(而不是继续工作)可能很棘手。以下是一些想法,帮助你激发灵感。

  • 听音乐。演奏或听音乐是提升创造力的好方法。它也可以增强生产力,并以不同的方式影响每个人。
  • 写日记。通过写日记,你可以表达自己的想法并放松。你不必与任何人分享你写的内容。仅仅这个活动就可以提升你的创造力。
  • 涂鸦。就像写作一样,绘画可以起到治疗作用,并帮助你在几分钟内将注意力从工作中转移开。另一个好处是,这可以在你的桌子上进行,大多数人不会注意到。
  • 尝试引导冥想。这是一个流行的想法,但冥想可以通过放松你的思维来提高你的生产力。冥想可以帮助降低血压和减轻压力,是休息期间的好选择。
  • 玩一个快速游戏或解一个谜题。休息期间并不意味着你不能思考。在休息室放置一些批判性思维问题和脑筋急转弯是鼓励员工以新方式思考的好方法。
  • 离开你的桌子。你可以尝试走动、在另一个房间阅读书籍或进行重要的午餐休息,仅举几种选择。

总结

需要休息的想法似乎是反直觉的。希望这篇文章不仅解释了在一天中休息的好处,还提供了如何将其融入你日常生活的策略。

记得像保护你的工作时间一样保护你的休息时间,因为这样做可以帮助你的生产力飞速提升。

选择一个目标,选择一个时间分配,设定你的定时器,然后开始。我们可以在你的休息期间再聊。

你目前在一天中进行战略性休息,还是计划在未来尝试一下?请在下面的评论区告诉我。

来源: How Taking More Breaks Will Boost Your Productivity

[转译] 如何成为一个好的开发者?

原文 发表于2013年5月10日星期五

这应该是一个能吸引注意力的好标题。我最近一直在思考这个问题。在 HMB 参与招聘过程的一部分是思考人们是谁,他们在我们为他们考虑的角色中表现如何,以及他们是否会对此感到快乐。

什么是一个好的程序员?兴奋 。这基本上就是无论你是在谈论一个初级开发人员还是高级架构师/技术负责人。区别在于:对什么感到兴奋。

优秀的初级开发人员

一个优秀的初级开发人员因为对创造事物的兴奋而在他的同龄人中脱颖而出。无论是网站、桌面应用、手机上的东西还是其他什么,好的初级开发人员会说:

“OMG OMG 我刚刚把这个东西变成蓝色了。嘿,大家看看这… HOLY CRAP JQUERY!!!”

Sackboy

大多数真正优秀的初级开发人员刚刚发现制造可以与之交互的东西是多么令人兴奋。他们对战术问题解决和设计更具战略性的解决方案感到兴奋,但这肯定是次要的:

初级开发人员工作分解

当你是一个新开发人员时,一切都是通过构建东西来学习新思想。你不知道你不知道什么,而且你不知道很多!每一个新概念都应该让人兴奋,并感觉像是改变人生的。

我相信有例外情况,但对于刚刚毕业的人说他们对中间件感兴趣,我有点怀疑。有一些非常优秀的初级开发人员是硬核代码极客,他们想要构建语言和数据库。这些开发人员未来可能会变得很棒,但在大多数环境中,他们的前几年会很艰难。要对建设东西充满热情! 初级开发人员对于需要活力的团队来说是很好的,但他们需要更有经验的人来担当锚。

优秀的中级开发人员

中级开发人员应该有更广泛的让他们感到兴奋的事情。这部分是因为开发人员接触到了更多的东西,并且擅长新的类型任务。另一部分是简单的厌烦;如果你已经构建了9次小部件,第10次构建它就不那么令人兴奋了。一个好的中级开发人员会说:

“我们去年解决的那个库,今年用它来建造一个巨大的杀手机器人。我相信我们已经解决了所有的bug。” 1

中级开发人员开始思考业务问题,不再把所有问题都看作代码问题。他们意识到,解决问题是我们所做的,而不是编写代码。然而,代码仍然是他们关注的焦点:

中级开发人员工作分解

中级开发人员应该仍然对构建事物充满激情,但他们应该开始看到大局。他们仍然会低估需要的时间,并且会陷入第一个看到的兔子洞。

这些开发人员对有一个高级人员可以让他们集中注意力和参与度的团队来说是非常有价值的。没有这种聚焦,他们往往会过度。一名初级开发人员不知道TDD是什么。一名中级开发人员希望一直TDD所有东西!

优秀的高级开发人员

软件开发的老牌大胡子(或非胡子的情况)是一个极其重要的群体;许多组织低估了他们的价值,甚至如果他们足够老还会对他们进行歧视。不过那是另一篇博文的话题。

灰袍甘道夫 胡子里满是知识

一个好的高级开发人员可以构建东西并仍然喜欢这么做,但对一个团队来说非常重要,因为他或她提供了方向、稳定性以及偶尔的直觉感到有什么不对劲。有时候,唯一能看到问题巴士的方法就是过去被它撞过。

“我很确定巨大的杀手机器人不是个好主意。我们20年前在用COBOL做这个的时候几乎丢了加拿大。让我们改建一个Web应用吧。”

一个真正优秀的高级开发人员在编写代码时可以跟上年轻人,但真正的价值在于找到解决方案。他们生活的目的就是了解系统并弄清楚如何对齐关键部分:

高级开发人员工作分解

一个好的高级开发人员或两个在团队中帮助教初级开发人员如何做新事情,并防止中级人员过于使用他们的技术锤子。他们知道什么时候使用工具,什么时候不用。他们意识到代码不是解决方案,找到其他方法解决问题。

结论

优秀的高级开发人员和初级开发人员之间的最大区别在于全局和战略性的东西。无论哪种情况,一个好的开发人员都对构建东西和解决问题充满激情。随着经验的增长,他们感兴趣的事物的宽度应该增加。

你同意还是不同意?请在评论中告诉我我哪里错了:)

来源:What Makes A Good Developer?

1. 你应该始终有100%的目标识别代码覆盖率。你真的不想通过艰难的方式得知这一点。

解决 archlinux fcitx5 中文输入错漏乱序问题

不知道配置了什么,突然输入中文经常出现错漏乱字,

类似这样:输入“dacheng” 变成 edachng

拼音顺序混乱,导致乱字。

最后在 deepin 找到一个解决方法,尝试后确实有用:

即关闭 fcitx5 — 全局 — 关闭“在程序中显示预编辑文本”

这样就可以了。

References

虽怀念必前行

感觉当下的状态不是最好,可能是一种常态。

虽然感觉不是最好的状态,但或许这已经是最佳的状态。

甚至过去这段时间回看,还不如这个状态。

再过一段时间,会发现, 虽然状态不是最好的,但或许是走在上坡路。

公司创业初期,需要一些门槛略低但可靠的人。 这些人虽然可能知识没有这么多, 但一旦确定是可靠的,就极其珍贵。

公司有一些起色, 就回进来组多“半吊子”。 上不上下不下, 而且大都有着亮丽的牌子没有真材实料。

虽然怀念此前的光景, 但又必须前行。

公司的发展意味着不得不招来这样的人。 随着时间的推移, 如果能处理好这些事情, 会进入下一个阶段。

好久没有写毛笔字了

好久没有写大字了,突然想起来高中的时候。周末经常不回家,就在宿舍里写几页毛笔字,写完以后冲一冲砚台和毛笔,把文具放好在抽屉的角落。

IMG_20240908_122110.jpg

写完毛笔字,再写小毛笔字就很轻松了。 IMG_20240908_115344.jpg

大学以后也会时常写一写,难忘的记忆。

写写毛笔字,整个人都能够沉静下来。

网站上线一周不到就被全站克隆

重构了自己的博客,整合了文章,上线不到一周,就出现内容完全一致的克隆站,文字变成繁体中文。

我的网站是这样:

刚刚提交谷歌没几天,还没收录几个页面,首页搜索我的网站名称就已经出现克隆站:

网站内容整体文字变为繁体,去除了页面,其他的一模一样:

这也太离谱了吧。