3.6 为什么学习Drupal这么难?(上)
这是乔.辛德拉在DrupalCon上针对“为什么Drupal如此难学”发表了一些自己的经历和观点。乔.辛德拉是大家都熟悉的一位Drupal导师,他的发言非常值得我们学习和思考。
我的名字是乔.辛德拉,我为Drupalize me工作。这家公司提供一些在线的Drupal视频培训课程,他们还做现场培训。我做Drupal培训做了很久,经验丰富。我对人们的学习能力以及人们通过什么样的方式方法来学习Drupal很感兴趣。我对这类问题也有很多自己的观点。我曾经看到一些人在Drupal的工作中受挫然后甩手不干了,我想帮助大家找出解决问题的办法。
在此之前,我先要感谢Drupalizeme给我机会让我在这里谈论我工作中的事情,让我有机会实现这个令人钦羡的小目标,在巴尔的摩的Drupalcon和大家一起谈论问题并尝试回答一些问题。
今天我的这一小时的演讲,将尝试回答以下问题:
- 是什么让drupal这么难学?
- 核心开发者和社区做了哪些努力来降低Drupal的学习门槛?
- 我们为此还应该做些什么?
- 你、我、我们大家如何行动,以使得drupal更容易学习?
- 我们是否有必要建议一个关于学习的Drupal项目组,如果是,我们应该做什么?(Drupal有很多项目组,这里是在探讨新建一个项目组的意义,但是作者也不知道应该怎么做,所以在后文中只是提了一句)
为什么聊这个话题
我认为谈论这些问题对于那些drupal开发者和贡献者是非常重要的,因为他们有能力改变Drupal。如果这些人能更好的理解那些新人和菜鸟们刚刚遇到Drupal时的窘迫,他们就知道如何把Drupal改造得更加容易学习。而且,即使作为一个多年的开发者或者贡献者,你依然可能会需要去学习一个新的模块,而这个过程也有可能会让一个老手觉得精疲力尽。对于那些已经做了很长时间的人来说记住这样的经历是有益的。
我还认为我们作为一个社区,越是降低Drupal的学习难度和门槛,社区越是会变得更大,Drupal项目会走得更远,我们能完成更多的事情,Drupal的市场占有率也会更大。
我认为谈论这个很重要,也是因为在将来的某个时候,你和我可能会不得不学习关于Drupal的新东西,而这些学习过程当然是越容易越好的,这对于我们大家都有好处。
学习难度是难以度量的
我发现当我准备这场演讲时,以及以前想到类似问题的时候,总是会提到某个东西的学习难度。但是,这种学习难度往往是难以衡量的。至少就我个人而言,我没有什么好的方法去用一个确切的数字来衡量学习难度,我不知道学习难度的KPI应该怎样计算。关于这个,我认为可能有人是有经验的,如果你有这方面的经验,我很愿意听你来分享。
我认为这方面有一些客观的事情,例如静态代码分析,你可以运行一个工具,他会告诉你,这个Drupal应用的所有可能的执行路径。如果结果是一个非常大的数字,那么我觉得,较大的数字意味着这个应用就会更复杂。
同时,还有一些主观的东西,是你不能真正的去衡的。比如,对于某些人来说,理解node(即节点)这个概念是很难的,但是对于另外一些人来说,却非常容易。他们有过一些经验教会他们什么是节点,他们带着类似这样的经验去学习Drupal。因此对于他们来说,理解什么是一个节点并不是什么大不了的事情。
总之,我认为这使得衡量一个东西是否容易学习是一件很难的事情。
不过,Drupal确实很难学,这个是真的,sorry。
当你决定开始学习Drupal的时候,我认为,社区以及我们自己,可以做的更好的一件事是让新手们对于学习内容设置一个更加明确的期望值。
你刚开始学习的时候可能会想“我会成为一名Drupal开发人员,这会很好,我会得到一份工作”,但是你可能没有意识到学习Drupal会涉及到很多其他的东西,你不能只学习Drupal,你需要学习PHP,需要学习mysql,html和css,你还要学习linux系统管理,你可能并不需要懂太多,但你至少需要学会部署一个本地环境,这与部署服务器环境基本类似,所有这些都是我们需要学习的东西,他们和Drupal的关系并不大,但是作为背景知识却不得不学。
而对于老手和Drupal培训者来说,不要忘记新手在学习Drupal的时候必须去学习那些和Drupal没有太大关系的背景知识,是很重要的。这是他们学习的一部分,他们不仅仅学习如何写模块他们也学PHP。
Drupal的错误学习曲线
所以我听过很多人说:当你学习Drupal的时候,学习曲线是这样的。这张图在Drupal社区中已经存在了很长时间了。这里的笑话是Drupal有一个非常陡峭的学习曲线,特别是与mod X和Joomla和WordPress相比。在广泛的CMS使用群体中,Drupal有着非常难学的声誉,如果你想学习WordPress,开始很容易入门,然后变得有点难,沿着这个方向走你能够找到一份Wordpress的工作;但如果你想学习Drupal,你需要爬上悬崖,有一个悬垂,甚至可能有人在悬崖顶部把你踢下去,迫使你再试一次。如果你最终可以通过所有的挑战,那么你真的很棒,你可以用Drupal做很多东西,你的努力和付出最终会得到补偿。
看到这张图我总是想笑,不过它也真的让我觉得沮丧,因为这在社区中很常见,很多人都知道这张图。我觉得它错误的描绘了人们学习Drupal的经历,Drupal难学的原因只是因为我们在动手做之前就被告知:如果你要去学Drupal,那将是非常有挑战性的,你可能应该考虑一下使用Wordpress来代替Drupal。
Drupal永远都不会是简单易学的
所以,我认为,必须指出的是:像Drupal这样的系统,在某种程度上有着无限的灵活性,能做出的东西那么多,它永远都不会是简单易学的。
它不像你只是在HTML文件中写个Hello world并上传到服务器这么简单——而这本身可能对于一些人来说也是一件困难的事情。但一个像Drupal这样可以做那么多事情的工具,并且所有这些能力都意味着你需要去学习相应的只是。它不像学习说一门语言或是高深复杂的数学或科学,这些东西很难学习,因为他们被用于解决难的问题。但是,一旦你知道怎样使用他们,你就可以做一些很酷的事情,比如写诗或是写一本小说。但是,Drupal却要求你不停的学习。
Drupal的真正学习曲线
所以,和之前的图片相比,我认为Drupal的学习曲线看起来更像这样,这个曲线更现实,它反映了人们学习Drupal时所真正走过的旅程。这张图来自于一个名叫Eric Troutman的人为Viking code 学校写的文章。题目是《为什么学习写代码这么难》。他所讲述的经历正是我要在这里谈论的事情。我尝试把他的一些想法应用到如何学习Drupal当中。
这张图的底部是你的能力,也就是横坐标,它表示的是你完成某件事情的能力。纵坐标是你的自信心,它表示的是你认为你能完成的事情。能力是你可以做的事情,自信心是你觉得你可以做到的事情。当你学习Drupal的时候你的自信就像一场疯狂的旅行,天哪,我能,我不能,我真的不能,也许我可以让事情变得更好一点......而你的能力,则渐渐的越来越强,虽然有些时候你自己的感觉并不是如此。
第一阶段:蜜月期
我认为可以把这幅图分解成几个更小的阶段:在开始的时候,当你第一次去学习Drupal的时候是亲密阶段或是蜜月阶段,如果你学习了一些基本概念比如什么是节点,怎样登录到后台,你的自信就会迅速增加。通过学习各种靠谱的教程,你可以一步一步的跟随教程的步骤,最终你得到的结果和教程中的截图一样,你会说:天哪,我建立了一个视图。到这里,你做的很好,你的自信也随之快速增加。
不过,在这个阶段,我认为Drupal还可以做得更好一些。我们有大量的资料来学习Drupal,比如讲解什么是钩子或了解如何添加一个钩子或是学习怎么给一个站点添加字段。但是这些概念还有讲解这些概念的资料,都不够直观。一个直观的用户界面能够让用户更快的接受和了解系统的基本概念。
2015年的时候,我们对Drupal8做了一些可用性测试,我们发现的事情之一是对于很多人来说Drupal有一个非常奇怪的模型,在用户界面中,我们倾向于公开所有这些实现细节的东西,比如当你想为一个内容类型添加一个新的字段时,你需要选择字段的类型,你的选择很多,比如一个数字、一个引用或一个子文本。但是,你可能会想,这些并不是我想要的,我想要一个复选框;我不知道我想要的是数字还是文本,我想要一个复选框可以表示yes或者no——所以Drupal倾向于将各种细节以低级别的面向后端开发的方式来呈现;而用户尤其是新用户则期望看到的是更高层次的东西,比如,在添加字段的时候,用户其实不太在乎它是如何存储的,也许他们真的想要仅仅是一个表单,可以让其他人能够填写。
在Drupal8的代码中你可以看到很多类似这样的语句,它们做的事情看起来很简单,比如从数据库加载一个节点。你必须首先了解所有这些其他概念,首先,你必须获得一个实体类型管理器服务的副本,这意味着你必须至少要知道什么是一个实体类型管理器服,然后你需要选择特定的实体类型存储方式,在这里是一个node,然后你最终能够通过ID加载节点。类似的系统工作方式非常重要,因为这样是的系统具有很大的灵活性,但是,这样也意味着有很多相关的东西需要学习,然后人们才如何在页面上打印一个标题。
有时Drupal暴露了太多的实现细节,有时它暴露的却太少。就像我在某一天发现了这几行代码,我就好像掉进了一个大坑里。在这里,先得到了一个值,然后又使用了一个get value 的方法,这真的很混乱,让人感到疑惑,你应该也能看得出来我在说什么。
第一个get方法返回一个当前对象的属性,然后你得到它的值。一旦你去深读代码,你会发现,噢,这样做应该是合理的!但是,这让我非常烦恼,因为我不知道这个语句是做什么的。所以,我就掉到了坑里,花费了几个小时去研究它,然后我学习并理解了Drupal的数据类型和实体系统,但实际上我只是希望能得到这个字段的值,(听众大笑)你认为这很有趣,但其实并非如此。(晴空注:现在你知道云客的源码分析是多么有用了吧?)