两天时间读完了 Apprenticeship Patterns: Guidance for the Aspiring Software Craftsman 中文版, 中译名叫《软件开发者路线图: 从学徒到高手》 (神翻译?).

Table of Contents

  1. Introduction
  2. My reading notes
  3. TL; DR

Introduction

书后面的中文介绍说适合程序员迷茫的时候看的, 结果我看完之后似乎更迷茫了? 感觉作者和译者他们自己的评价有点高了… 不过更可能是本人目前太菜的原因吧, 好书不同阶段读都有不同的感受. 而且毕竟此书不是代码大全, 代码小全等那些经典, 所以还是觉得稍微看看中文版就好.

My reading notes

总结了一下个人觉得比较有意思的地方 (引用大多为原文大意而非译文原话):

  • 太多有才能的人未经深思熟虑就接受了这种职位晋升, 然后在短短的几年内发现他们根本不热爱自己的工作, 并开始向往退休的日子. 而对那些拥有熟练的软件开发技能并热爱学习的人们来说, 软件开发将是持续一生的职业, 而且会是一次风光无限的旅程.

    My note: 个人觉得过于偏激. 这就和国内很多所谓的”资深 xxx”说的你到了xx岁还在写代码就是 loser 怎么怎么的观点一样, 是两个极端. 就像之前有人问我, 你学 CS 想好以后打算没, 是先做几年码农然后做管理 blahblah, 还是怎么. 虽然我并没有想好, 但是可以肯定不是这样. 是编程以及学习新东西的乐趣 per se 让我选择 CS, 而不是为了之后做到管理层 etc. 然而这并不意味着”软件开发是持续一生的职业”. 每个人每个阶段的兴趣随自身心态状态和环境的影响而不同, 比如年轻的时候有大量的时间和精力可以折腾在代码上, 但是当有了家庭, 年纪大了等各方面的因素, 事情就变的不同了. 这一点, 在 Coders at Work 一书中提到过很多次. 简言之, life is not just programming.

  • 早期职业生涯选择一门语言作为主要语言, 要找一个经验丰富的程序员带.

    My note: Java, 并没有师傅带… 这也一直是我的一大问题: 没有一个有经验的 mentor 来指路, 所以经常迷茫, 效率低.

  • 学新语言的一种改善学习体验的方法就是解决实际问题, 而创建较短的反馈回路 (feedback loop) 有利于测量进步.

  • 小 tip: 在 IDE 中始终放一个空的 Java 类 (Main), 用于学习研究新的 API 或 Java 特性的测试.

    My note: 简单但很实用的小 tip.

  • 要通过学习新的语言来学习一种思考方式, 选择语言还是要根据周围的人来定. 最好的情形是和一个这种语言的专家一起工作, 要有 code review. 另外, 选择了一种语言, 实际上就选择了一个虚拟的社区, 社区有倾向的工作类型, 偏见和信仰.

    My note: 还是之前强调的 mentor 的重要性以及语言选择 per se 的重要性… 总之还是缺 mentor.

  • 初入团队, 作为学徒, 主动完成简单无趣却又必须完成的任务, e.g., 维护构建系统, 产品支持, 响应维护需求, 改 bug, code review, 消除技术债 (technical debt), 搭建项目 wiki, 更新文档, 传达他人想法, etc.

    My note: 就像足球队从饮水机管理员做起一样, 期待实验室/实习从底层搬砖做起的生活…

  • Keep learning. 订阅博客, follow 软件大师 on Twitter, 订阅流量较高的在线邮件列表, 加入活跃的本地用户组, 参加技术大会, 邮件和书作者演讲者交流, etc.

    My note: 看完吓得我重新把 Reeder 上订阅的列表整理了一遍, 删了好多没什么价值的 rss.

  • 训练自己更善于那些占用日常工作时间更多的任务, 例如: 读他人代码的能力. 那些能直接从源码中快速汲取知识的人很快就能成为更好的程序员, 因为他们的老师就是世界上的每一位程序员写下的一行行代码.

    My note: 读的代码还是太少, 就像英文专业教材一样, 熟读才能生巧.

  • 教堂建造者: 团队中那些去调试, 反编译和反向工程的人, 那些阅读所用技术的 specification, RFC 或标准的人, 已经有新的视角, 对支持他们的工具有了纯熟的理解. 例如, 人们常常在使用正则表达式的时候遇到麻烦, 因为他们只求肤浅的理解, 没有理解确定性有限自动机 (Deterministic Finite Automation) 与非确定性有限自动机 (Nondeterministic Finite Automation) 之间区别. 然后, 突然有一天你的 wiki 不工作了, 结果是, 你的正则表达式引擎是递归实现的, 在遇到需要回溯的特定输入时, 它会运行很长一段时间, 最后 throws StackOverflowException.

    My note: 对知识还是要挖的深, regex 刚入门, 这个例子先 mark 下…

TL; DR

这本书的确给出了不少很 general 的建议, 也就是书中说的 apprenticeship patterns, 读的时候觉得有些感想, 但是读完发现实际并没有什么干货. 当然这只是我现阶段的看法而已. Career advice 方面不及 Coders at Work, 代码技巧干货方面不及代码大小全. 至于灯塔般指明道路的效果自然是没有的… 也难怪在SO 经典书单里(至少前几页)都没有…