你好!今天我想谈谈——你怎么知道你在编程方面变得更好了?
一种明显的方法是:
- 制定目标
- 定期检查您是否实现了这些目标
- 如果你这样做了,庆祝
我有点讨厌目标
目标可能很有用,但很多时候我实际上发现它们有压力并且没有那么有用。例如,以下是我 9 年前为自己写下的几个目标:
- 编写大量可以工作并被实际人员使用的 C 代码
- 为 C 中的开源项目做出贡献
- 学习 C++
9 年后,我做了 0 件这样的事情。有了“目标”的框架,就认为这是一件坏事!就像,我想学习 C++,但我没有!我还是不能舒服地写C!不好了!我想我失败了!
我觉得这个框架令人沮丧和无益。实际上,当时我没有任何真正的理由去学习 C++,现在我仍然没有。所以我没学过是有道理的。
我喜欢考虑微小的里程碑,而不是目标。
什么是里程碑?
通常,当我们谈论里程碑时,我们指的是大事,比如“我从大学毕业”。
但在这篇文章中,我想从词源的意义上谈论里程碑——高速公路上每英里都放置一块石头,这样你就可以沿着一条路径追踪你的进度。
这些情况发生得更多——也许您是第一次使用新工具,或者您修复了一种您以前从未见过的新型错误,或者您了解了一个新概念!
我的一些小小的 C 里程碑
以下是过去 9 年中与我最初的“学习 C/C++”目标在精神上相关的一些微小里程碑的例子。
- 用C写了一个非常基本的shell
- 编写了一个微型 Linux 内核模块
- 了解了
strace
- 学习了 ELF 二进制文件的组织方式(符号、节等)
- 了解了 DWARF 调试符号是什么以及它们是如何工作的
- 发现了一个 Mac 内核错误并设法用 C 编写了一个重现它的程序
- 学习了如何使用
gdb
检查 C 程序的内存 - 使用
gdb
和strace
(对于 CTF)实现了缓冲区溢出漏洞利用 - 写了个电脑都快的游戏
- 获得了崩溃 C++ 程序的核心转储,并设法从中获取堆栈跟踪
- 为发生内存泄漏的 C++ 程序编写了准确的错误报告,导致维护人员修复了错误
- 了解了 RAII 模式(虽然是在 Rust 中,而不是在 C++ 中)
- 与朋友一起编程在 x86 汇编中实现一些代码出现问题
- 一般来说,只要它们不需要像“内存管理”这样花哨的东西,我就可以轻松编写非常基本的 C 程序
甚至还有一些重要的里程碑,比如我在 2018 年用 Rust 编写了一个Ruby 分析器。
当我这样想的时候,我对自己的技能感到非常好!我已经学习了与系统编程相关的各种东西,只是发生的方式与我最初预期的不同。
改变目标不是坏事
我仍然没有学习C的原因不是我很烂或者C是不可能学的。只是学习如何写好 C 语言从来都不是我真正有理由去做的事情。
相反,我学习了 Rust 和 Go 以及strace
和gdb
以及 C 结构和符号以及调用堆栈和堆以及许多其他东西。 (顺便说一句,我喜欢这篇论文Some are mean for C关于为什么 C 仍然如此重要)
效果很好!所以我认为对你的目标保持灵活性并庆祝你最终达到的里程碑而不是对你“失败”的目标感到难过要健康得多。
庆祝你的小里程碑
庆祝这样的微小里程碑对我真的很有帮助。我通过写博客文章庆祝了很多——我写上面的列表主要是通过查看我写的与 C 相关的旧博客文章列表。
如果你不写博客(绝对不适合所有人!),那么在你的吹嘘文档中写下这类东西会很有帮助。
但我确实认为在某个地方庆祝这些里程碑很重要。它让我真正感觉到我正在取得进步,它帮助我保持动力继续学习这件事。
来源: https://jvns.ca/blog/2022/03/13/celebrate-tiny-learning-milestones/