及时行乐|算法工程师福利:超实用技术路线图( 三 )


  • 自我考核:能够读懂 LightGBM 里对于 tweedie loss 的相关定义代码 。
操作系统
基本概念
我们所编写的算法应用 , 都是通过操作系统的环境运行在物理硬件之上的 。 在实际运作过程中 , 会碰到不少相关的问题 , 例如为什么程序报了资源不足的错误 , 为什么 notebook 在浏览器里打不开 , 为什么进程 hang 住了没有响应等等 , 都需要一些操作系统的知识来帮助理解和分析问题 , 最终排查解决 。 操作系统涵盖的内容比较多 , 建议一开始只需要了解一些主要概念(例如硬件结构 , CPU 调度 , 进程 , 线程 , 内存管理 , 文件系统 , IO , 网络等) , 对于整体图景有一些感觉即可 。 后续碰到了实际问题 , 可以再在各个部分深入学习展开 。 优秀的学习资料也有很多 , 基本都是大部头 , 重点推荐《深入理解计算机系统》 , 《Operating Systems: Three Easy Pieces》 , 以及《现代操作系统》 。
  • 自我考核:能够基本明确运行一个模型训练任务过程中 , 底层使用到的硬件 , 操作系统组件 , 及其交互运作的方式是如何的 。
Linux 基础
平时工作中最常用的两个操作系统 CentOS 和 macOS , 都是 Unix/Linux 系的 , 因此学习掌握相关的基础知识非常重要 。 一些必须掌握的知识点包括:Shell 与命令行工具 , 软件包管理 , 用户及权限 , 系统进程管理 , 文件系统基础等 。 这方面的入门学习资料推荐《鸟哥的 Linux 私房菜》 , 基本涵盖了 Linux 系统管理员需要掌握知识的方方面面 。 进阶可以阅读《Unix 环境高级编程》 , 对于各种系统调用的讲解非常深入 , 可以为后续性能调优等高级应用打下基础 。
  • 自我考核:开发一个 shell 小工具 , 实现一些日常工作需求 , 例如定时自动清理数据文件夹中超过一定年龄的数据文件 , 自动清理内存占用较大且运行时间较久的 jupyter notebook 进程等 。
深入应用
工作中碰到的疑难问题排查 , 性能分析与优化 , 系统运维及稳定性工程等方面 , 都需要较为深入的计算机体系和操作系统知识 , 感兴趣的同学可以针对性的进行深入学习 。 以性能优化为例 , 可以学习经典的《性能之巅》 , 了解其中的原理及高级工具链 。 像其中的系统调用追踪 (strace) , 动态追踪(systemtap, DTrace, perf, eBPF) 等技术 , 对于操作系统相关的问题排查都会很有帮助 。
  • 自我考核:能够分析定位出 LightGBM 训练过程中的性能瓶颈 , 精确到函数调用甚至代码行号的级别 。
软件工程
算法与数据结构
暂时先把这块放到软件工程模块下 。 这里指的算法是计算机科学中的经典算法 , 例如递归 , 排序 , 搜索 , 动态规划等 , 有别于我们常说的机器学习算法 。 这块的学习资料网上有非常多 , 个人当年是通过普林斯顿的算法课 (需要有 Java 基础) 入门 , 后来又上了斯坦福的算法分析与设计 , 开拓了一些视野 。 书籍方面推荐新手从《算法图解》入门 , 然后可以考虑阅读 Jeff Erickson 的《Algorithms》 , 或者选择上面提到的网课 。 另外像《编程珠玑》 , 《编程之美》等也可以参阅 , 里面有不少问题的巧妙解法 。 除了从书本中学习 , 还可以直接去 LeetCode 等网站进行实战操作进行练习提高 。
  • 自我考核:能够设计相关的数据结构 , 实现一个类似 airflow 中点击任意节点向后运行的功能 。
代码规范
从初级程序员到中高级程序员 , 其中比较大的一个差异就是代码编写习惯上 , 从一开始写计算机能理解 , 能够运行成功的代码 , 逐渐演化到写人能够理解 , 易于修改与维护的代码 。 在这条学习路径上 , 首先需要建立起这方面的意识 , 然后需要在实战中反复思考和打磨自己的代码 , 评判和学习其它优秀的项目代码 , 才能逐渐精进 。 推荐的学习书籍有《编写可读代码的艺术》 , 一本非常短小精悍的入门书籍 , 后续可以再慢慢阅读那些经典大部头 , 例如《Clean Code》 , 《Code Complete》 , 《The Pragmatic Programmer》等 。 这方面 Python 也有一本比较针对性的书籍《Effective Python》 , 值得一读 。