本文来自一篇博客:How to really learn Go。作者不仅讲述了学习 Go 语言的方法、方向、目标,还分享了一些人生哲学。读完很是受用,故此想翻译过来,翻译的如有不好,请读者指出,建议读者看看原文。
学生手册
1. 每天练习
“37 年来,我每天练习 14 小时,现在他们居然叫我天才。” ——帕布罗·德·萨拉萨蒂
译者注: 帕布罗·马丁·梅利顿·德·萨拉萨蒂-纳瓦斯库埃斯(西班牙语:Pablo Martín Melitón de Sarasate y Navascués,1844年3月10日-1908年9月20日),西班牙小提琴演奏家、作曲家。
每位音乐家或武术家都知道这一点,任何成功学习了一些艰难的工艺或技能的人也都知道。你需要每天练习。如果你这样做了,你就会得到更迅速的进步,并且可能比那些三天打鱼两天晒网的人走得更远。
(你每周学习一次仍能取得一些进步,但进步过程会非常缓慢。而且你将花费大量时间才能弥补你在两次学习之间的损失。如果你每周学习时间少于一次,那就算了:看电视吧。如果你打算一事无成,不如少花点功夫。)
"每天练习":当然说起来容易,但在现实中却很难实现,至少对于我们这些生活繁忙的人(也就是我们所有人)来说。《小习惯》一书建议我们在尝试建立一个新习惯时要 "采取小步骤"。这是个好主意。
比如说,不要一开始就想每天做一小时,这是不可能持续的。我们没有人在一天中拥有一个空闲的小时,仅仅为了等待一些像学习 Go 语言这样的活动来填补它。相反,可以从每天15分钟开始。这听起来可能不足以学习任何有用的东西,但这不是重点。重点是要建立每天练习的习惯。
选择一天当中你可能拥有最多精力和注意力的时间(通常是一天中的上午,而不是晚上)。在你的日历中为自己设定一个重复的约会,进行15分钟的 Go 练习;如果可能的话,每天在同一时间。这使得这个习惯更容易建立。
当设定的时间到来时,让自己进入 "Go模式":坐在电脑前,打开你的代码编辑器,并加载你当前的项目。你可能觉得根本不想做什么。这很正常。你的目标可以简单到 只是在可以学习或练习 Go 的情况下度过这15分钟。
如果你所做的就是盯着你的程序看15分钟,然后把电脑关掉,那也没关系。你已经做到了。你已经赢了。只要每天坚持这样做。你的唯一目的是让你的大脑相信这些定期的时间是重要的,是它需要做的事情。
如果你能坚持两个星期的日常训练,你几乎肯定会发现,开始每一次训练的努力和需要的意志力都会大大减少。最终,这将成为正常和自然的事情,而不是你需要努力的事情,你会发现你在规定的15分钟后,仍真的不想停止(没关系,你不一定要停止!)。
2. 写代码
取出包装纸,张开嘴,放入松饼,吃。—— 7-11 松饼说明
学习像 Go 这样的编程语言有很多方法:你可以看书、看视频、看教程和博客文章;所有这些都很有价值。但是到目前为止,学习写 Go 最有效的方法是写 Go 代码。不是要做测试或限时的面试挑战,不需要回答多项选择题,相反,而是写一个程序。
从字面上看,程序是关于什么的并不重要。事实上,你甚至不应该担心要挑选有用的项目;只要写一些能做任何事情的 Go 程序就可以了。关键是要锻炼你敲 Go 代码的肌肉记忆。即使你每天都在工作中写 Go 代码,你也应该这样做;你需要有一个没有利害关系、没有期望、没有最后期限的项目,在那里你可以做任何你想做的事情,这在真正的工作项目中往往是不可能的。
这里有几个建议:
- 简易计算器
- 小小书店
- CPU模拟器
- 一款冒险游戏
- 一个网站链接检查器
你的项目不需要是独特的、创新的、具有挑战性的、有用的,甚至是有趣的(好吧,如果它是有趣的就有帮助)。只要做一些事情。打印出质数,或计算一个目录中的文件数量,或玩井字游戏(tic-tac-toe),或康威生命游戏(Conway's Game of Life),或画曼德博集合(Mandelbrot set)。你会明白的。选择一个项目,然后开始。
左图:康威生命游戏 右图:曼德博集合
3. 阅读代码
有效的程序员敏锐地意识到他自己的头的尺寸有限。——埃兹格·迪杰斯特拉
很少有成功的作家写的书比他们读过的书多。这同样适用于程序员。写好代码在很大程度上是一个具有良好品味的问题,而培养良好品味的方法是阅读其他人的程序,无论是好的还是坏的。
探索 GitHub 上的 Go 项目;随机挑选看起来有趣的东西,然后开始阅读。阅读文档,阅读代码。理想情况下,克隆仓库并使用你自己的编辑器来浏览它,使用特定于 Go 的工具来导航和注释代码。
阅读大程序,如 Kubernetes,或 Terraform,或 Go 本身。阅读初学者的小程序。阅读标准库中的代码。阅读编程难题的解决方案。阅读命令行工具、网络浏览器或操作系统的源代码。了解项目是如何组成的,代码是如何组织的,以及函数和类型是如何命名和分组的。
与朋友或同事成立一个代码俱乐部,你们每人读一段 Go 代码,然后讨论。它有什么有趣的地方?对你来说什么是新的?有什么不明白的地方?你认为哪些地方可能是错的,或者可以改进?你可以在自己的程序中借鉴哪些想法?是什么向你介绍了一个你以前从未听说过的全新的话题?
学生们有时会问:"但是我怎么读代码呢?我是否从第一个文件的第一行开始,然后依次阅读?我是略读还是逐行读?我是跟随每个函数的调用,还是先理解高层次的东西,然后再深入研究?"
基本上,做任何适合你的事情,但一个好的起点是找到主函数 main
(如果有的话)或库的入口点,然后按照程序的正常执行从那里开始。
仔细阅读每一行代码。如果你完全理解这一行,就继续读下一行。如果你不明白,就再看一遍,想一想。如果你不明白发生了什么事,请查阅文档或语言规范。如果你完全卡住了,把有问题的函数或行记下来,然后继续前进。稍后再跟进你的笔记,问问同事或导师,他们是否能理解这个棘手的部分并向你解释。
你读的代码越多,你能写的就越多。没有任何想法是新的或原创的;所有东西都是从别的地方借来的。你正在建立一个概念、技术和窍门的仓库,当涉及到你自己的程序时,你可以借鉴。不要阅读书籍,阅读代码。(当然,也要看书,但不要自欺欺人地认为这可以代替仔细、全面周到的代码阅读)。
4. 管理你的时间
事实上,人们一般都能为自己选择的事情腾出时间;缺少的其实不是时间,而是意愿。——约翰-卢博克
这可能看起来很奇怪;时间管理与 Go 有什么关系?答案是,有很大关系。简而言之,时间管理就是学会如何把时间用在你想做的事情上,而不是用在你不想做的事情上。
有没有曾经对人说过,"我真的很想学 Go,但我就是没有时间"?这里有一个问题:你一周看多少个小时的电视?(是的,Netflix 和 YouTube 也算作电视。)现在,我不是在贬低电视(或播客,或电影,或有声读物,或 Facebook ,或 Hacker News,或任何其他形式的点播娱乐);这很棒。有时你只是需要放松一下。但是要多久呢?
试试这个实验,为期一周:记下你花在看电视、滚动浏览社交媒体或新闻网站,或以其他方式被动消费娱乐的每一个小时,并在一周结束时回顾。它加起来是多少?十五、二十个小时?更多吗?你真的打算把这些时间花在娱乐上吗,还是只是偶然发生的?
比如说,你能不能每周只用其中的两个小时,而把它们用在每天15分钟的学习课程上?回顾一周的学习与一周的狂欢相比,会有多大的收获?
一周有 168 个小时(有趣的事实)。你如何度过这些时间,至少部分取决于你。当然,你很忙;每个人都很忙。正如梭罗所说,蚂蚁也很忙。问题是,我们在忙什么?
要准时,不仅是你的学习课程,而且是所有事情。如果你在这里迟到5分钟,在那里迟到10分钟,这一切都会增加。迟早你会比你的目标晚几个小时,而你不能失去这些时间。迟到是一个典型的信号:这意味着你没有正确地管理你的时间。
5. 选择一个方向
在驾驶和软件开发中,转向比速度更重要。——罗恩·杰弗里斯
你为什么想学习Go?你想找到一份开发人员或基础设施工程师的工作吗?你想在你目前的公司里转到一个更有趣的角色吗?你想在现有的工作中感到更有信心和更有成效吗?你想为开源项目做贡献吗?或者你只是把编程作为一种爱好,享受精神上的挑战和乐趣?
这些都是正确的答案,关键是要提出问题。一旦你知道你为什么要学习 Go,你就可以弄清楚该走哪个方向。你永远不可能完全学会 Go,也就是掌握了这门学科,没有什么是你不知道的。相反,我们都在学习的路上,这将持续一生。你现在需要回答的问题是你要去哪里?
如果你正在申请或准备申请 Go 开发工作,请找到五个或十个你能切实看到自己面试的空缺职位。他们需要什么具体的技能或知识?你有吗?什么经验是必要的?你有这些经验吗?如果没有,你怎么能得到它?如果他们要求相关的技能,如网络、数据库或云计算,你是否觉得你已经掌握了这些东西?你可以做什么来提高你在这些领域的知识?
如果你想以写程序为乐,什么样的程序?你在哪里感到不自信或缺乏知识和经验?什么样的项目能帮助你获得它?是否有你可以贡献的现有项目?
我们都没有我们想要的那么多时间或精力;关键是知道如何确定我们所拥有的优先次序。在今天的 15 分钟里,你打算学习什么?准备好一份主题、任务和项目清单,这样你就可以直接进入工作状态。在你涉及到的事情上打勾;每一个勾号都使你离你想去的地方更近一步。
6. 做计划
我努力地想用心珍惜和享受眼前的每一天,无奈有时候,好几天的事情会在一天内向我袭来。——阿什利-布利特
当你确定了你想学习这一大事,或者你想获得的能力后,把它们分解成更小的步骤。例如,你可以说 "到 1 月底,我想让自己真正有信心了解 Go 并发"。为如何实现这一目标制定一个计划:一周又一周,日复一日。假设事情不会按计划进行。这很正常。你需要不断地重新评估、调整和更新你的计划;重要的是要有这个计划。
计划好每一天。这真的很有帮助。好吧,某些事情已经被挡住了:工作、会议、带孩子去学校。但你的日程表中仍有一些空位;如果你不填补这些空位,别人就会。在每天的开始,第一件事,在一天能干预你之前,做一个粗略的计划。"上班前我要学习 Go,午饭后我要做这个工作项目,从 2 点到 2 点半我要赶写电子邮件",等等。计划你一天中每小时要做的事情,这听起来有点像强迫症,但相信我。它是有效的。
全天检查计划,提醒自己在这个时间段打算做什么。你不可能做完所有的事情。会有突然的事情发生;这只是一个必然。但是,如果你能把它推后到多出半个小时或一个小时的有意工作或学习的程度,你就赢了。明天再做同样的事。
在一周结束时回顾你的计划。你的表现如何?哪些方面做对了?哪些方面使你偏离了方向?下周你将如何做得更好?
每个月,回顾你打算实现的目标。你实现了吗?(可能没有完全实现,但不要紧张,你会比没有制定计划的时候多做一千倍。)
7. 学更多东西
以最无纪律、最无礼和最原始的方式努力学习你最感兴趣的东西。 ——理查德·费曼
学习 Go 的学生中一个常见的问题是 "我应该学习什么?" 是的,Go,但具体是什么?你不可能什么都学,那么你应该从哪里开始呢?
如果你是一个初学者,首先要集中精力,尽可能多地练习简单地编写 Go 代码。一旦你觉得对 Go 有足够的信心并能熟练使用,就开始填补知识空白。阅读 Go 规范,探索你不知道的东西,或者你没有信心向别人解释的东西。学习和练习这些东西。
看看 Go 的标准库。你对它的所有内容都熟悉吗?如果没有,请深入了解。阅读文档。你认为你了解 fmt 库吗?继续阅读,直到你发现至少有一个你不知道的东西。在一个程序中使用它。
练习建立更大的项目,设计包的 APIs,和编写库。弄清楚什么使程序可读、灵活、可扩展、可维护、可扩展。研究其他人的项目。他们是如何工作的?你可以把哪些经验应用到你自己的代码中?
围绕这个主题进行阅读。积累你的一般技术知识。了解编译器如何工作,CPU 内部是什么,TCP/IP 从何而来,HTTP 协议是什么。了解 HTML、JSON、Unix shell、计算机图形、磁盘、数据库。研究算法、数据结构、数学、编程语言设计、调试器、SQL、操作系统、分布式系统、基础设施。
从字面上看,对软件工程不可能了解太多。我们很容易被那些写着听起来很有学问的书或博客文章的人吓倒,但不要这样。他们和你的起点完全一样,他们只是坐下来学习东西。你也可以。
8. 适当锻炼
一日游山,胜过一车书。 ——约翰·缪尔
等等,什么?运动怎么会对你的学习有帮助呢?如果你的时间已经很紧了,你不应该把每一分钟都用来编码或阅读,而不是到处甩壶铃?
不,那会导致倦怠。理查德-斯蒂尔(Richard Steele)写道:"阅读对心灵的作用就像运动对身体的作用一样",这两件事是一起的。如果你忽视了身体,头脑就会受到影响,反之亦然。
体育锻炼对你的情绪、精力、动力、睡眠质量、注意力和精神敏锐度有强大的影响。作为一名学生,你需要做出特别的努力,定期进行锻炼;它是你学习课程的力量倍增器。
每天做一些强度锻炼,无论是步行、爬楼梯、举重、慢跑、骑自行车、瑜伽、武术、运动,还是......好吧,发挥你的想象力。任何能让你的心脏跳动和出汗的运动都是好的。你不需要太多。每天半小时就可以了,这比绝大多数人的运动量多半小时。
不要费心加入健身房;你不会去的。相反,让世界成为你的健身房。走路去上班或去商店,而不是开车。走楼梯而不是坐电梯。使用站立式办公桌。买一些重物或阻力带,在看电视时用它们锻炼。如果你看到一座山,就走过去。当你在开一个冗长的放大会议时,做跳远运动(先把自己调到静音状态)。
9. 注重饮食
吃饱了:那是快乐。知道什么时候吃饱了:这就是智慧。 ——邓明道
吃好的食物,但不要吃得太多。不要让自己挨饿或暴饮暴食;在你的饮食中要有一些平衡。你不必以糙米为生;这不是你的身体所需要的。相反,要合理地、适度地吃,并学会如何倾听你的身体。它知道自己需要什么。
饿了就吃,累了就睡。知道什么时候要推动自己,什么时候要休息。你不会以每小时 100 英里的速度开着你的车到处跑,直到它坏掉;不要试图对你的身体做同样的事。
做饭而不是吃加工食品。是的,烹饪需要时间、准备和计划(学习 Go 也是如此)。但它也很有趣,特别是当你在公司也采用相同的流程时。当你做饭时,要足够为三餐做准备。吃一个,冷藏一个,冷冻一个。今天你赢得了你的晚餐,但明天和后天,神奇的饭菜就会出现,就像从哪里来的一样!
10. 人生静坐
心灵只是一个载体。当我们不需要我们的腿时,我们不使用它们。同样,在不需要时让心休息。 ——吉恩·克莱恩
每一天的每一分钟,我们都被噪音、人、交通、谈话、电话、短信、电子邮件、干扰、哭泣的婴儿、突发新闻等全方位的攻击。这种不间断的攻击对我们的精神健康产生了严重的影响,这直接关系到我们的思考、研究和学习能力。
你是否曾经想做一些研究或编程,但只是觉得你没有精力?你的大脑就是不愿意合作。相反,它渴望 Twitter、短信或电视的含糖刺激。你和我都是如此。
人类的大脑实际上需要一定(不能为 0)的和平与安静,以便正常运作。但是,除非你住在山顶上,或者在海底,否则真正的安静是很难实现的。每个人都想分得你的注意力,除非你狠狠地推回去,否则他们就会不停地索取,直到什么都不剩。
好消息是,你可以为自己留出空间,让自己成为一个人。每个人都可以。称之为 "冥想"、"安静时间"、"静坐",或任何你想要的。你怎么称呼它并不重要:唯一重要的是你每天花几分钟时间静静地待着。
有些人觉得坐着,或站着,或躺着,都是有利的。有些人喜欢长时间的散步。对有些人来说,慢跑或骑自行车是他们的冥想。你的里程可能有所不同。重点是给你的大脑一个机会,让它慢下来,冷静下来,而不是不断地被指责和指责。
起初,你会发现远离其他人是很有帮助的:把自己关在一个房间里(浴室也可以,只要你不占用太久)。如果做不到这一点,就坐在你的车里,或去公园,或找一片树丛。
关掉你的手机,或把它丢在一旁。大多数手机都有一个 "请勿打扰 "模式,你可以屏蔽所有的电话和信息,但仍然允许特定的人联系你(你的伴侣、你的孩子、你的手术医生)。使用它。
如果你有伴侣或家人,告诉他们你需要安静的时间,并让他们帮助你保护它。也许他们也想要一些安静的时间。你可以尝试一起安静,这实际上是一种乐趣。
这里有一个非常重要的提醒:前几次你尝试安静和静止,这将是非常困难的。你的大脑只是不习惯于自己的运作。各种疯狂的想法会不断涌入你的大脑。你会感到厌烦、焦躁、不舒服,甚至焦虑。你会有难以置信的强烈冲动,想放弃,做别的事情(特别是看手机)。不要失落。这很正常。
所以还是那句话,一开始不要尝试做太多。以 15 分钟为目标。设置你的手机闹钟或厨房定时器(最好不是那种非常苛刻和刺耳的),并在规定的时间内静坐。如果你真的做不到 15 分钟,那也没关系(大多数人一开始可能做不到)。看看你能做多少分钟(也许是 5 分钟),明天,试着多做一分钟,后天,比这多做一分钟。
不要试图让自己平静下来,或清空你的思想,或以某种方式呼吸,或类似的东西。不要使用冥想 APP,或环境音乐(ambient music),或鲸鱼歌(whale song,由鲸鱼制作的旋律)。只是坐着,让自己和自己相处一会儿。这真的没什么(这就是重点)。如果你在努力,你就做错了。这是生活中一件你无法成功或失败的事情,因为你根本没有做任何事情。如果你在坐着,你就赢了。
思想会进入你的脑海,转来转去;你越是想推开它们,它们就越是大惊小怪,所以不要再推了,让它们来。你会发现,如果你不与它们抗争,它们就会越过你,飘走,就像天空中的云彩。一段时间后,你的大脑会耗尽思想而放弃,你会发现你自然而然地变得平静,没有任何挣扎或努力。取胜的唯一方法是不争。
如果你想到了非常重要、紧急或有价值的事情,不要开始想它,也不要试图记住它:只要把它写下来。(一旦你的大脑知道这个想法已经被保存起来,它就不会再浪费精力去想它了。
如果你每天努力为自己挤出几分钟的安静时间,你会发现它很快就会变得更容易,而且你不再有无法控制的戒烟欲望。尽管你的大脑不习惯安静,但这是它想要的,是它渴望的。
你的大脑已经被剥夺了这种和平和安静,也许你的整个生命都是如此。一旦它开始得到它,就像上瘾一样:你会想要更多,而且还会更多。最终,你将不需要为安静安排专门的时间和地点。你会发现生活中充满了小型冥想的机会:当你在等待灯光变化,或会议开始,或巴士到达时。而当你确实有一些属于自己的时间时,你会很舒服地只是走路,或只是坐着,没有任何形式的外部刺激或分心,与自己独处。
你会发现你有更多的精神能量,会更容易激励自己去学习,当你学习时,你会取得更大的进步,保留更多的东西。你会睡得更好,更久。当你在工作时,你会更有效率,而当你不工作时,你会更放松。
你会想把冥想的好处传授给你遇到的每一个人。(不要这样做,这很烦人。与其告诉每个人沉默的快乐,不如自己来做。迟早,他们会得到这个想法,并自己尝试,或者他们不会。这都是好事)。