Friday, June 17, 2011

(旧文) 一个好的工程师应有的特点


怎样算是一个好的工程师? 做过工程的朋友想必都有自己的想法和标尺. 这份文档里我提供一些基于自己的经验, 观察和思考之后的心得小结, 欢迎指正 :)

1.学会聪明地提问

  • 提问前做好功课: 
    • 精读官方文档 (像我们华美汉盛大量使用开源技术, 可能的话, 自己看看源代码), 通常文档里有你想要的各种答案. 而且像 php/mysql 那样的站点文档都让用户可以直接参与讨论, 在这些讨论里有大量的有用的实例, 阐释, 经验可供释疑解惑
    • 善于搜索 - 懒惰的话, 直接上 google. 如果希望更有目的性, 建议先在其官方的论坛/邮件列表上搜索 (像我这个 gentoo 用户, 遇到 gentoo 问题的首选是上其官方论坛, 大部分的问题都能通过论坛的搜索得到答案; 又比如 django, 我通常在其官方邮件列表里搜索, 许多我们会遇到的问题都在这里被解答过了, 也就没必要问了:) (注: 邮件列表的特点在于发出去的都是邮件, 订阅了的才能看到, 这时我们需要一些邮件列表归档服务来协助我们进行搜索, 例如, Gmane 就提供了对许多开源相关邮件列表的归档, 可以在这里进行问题的搜索和查找)
    • 在搜索引擎里搜索时需要学会如何去 "narrow down" (缩小) 你的关键字范围. 假设你英文比较好, 那么就直接用英文描述你的问题 (或者直接拿错误输出往搜索引擎里贴); 如果英文不好, 那就先用中文关键字, 当你定位到某个帖子 (中文/英文的皆可), 可能的话, 从里面找到一些跟你问题更接近的一些关键字 (尤其是英文的), 然后以这些新的关键字带领你继续逼近答案. 例如, 之前我的笔记本在 linux 关机时硬盘会发出 "噔" 的一声, 十分异常, 于是我首先想到的关键字就是 "linux shutdown noise". 当时网上关于这个问题的讨论并不多 (现在不一样了:), 通过这三个关键字出来的资料里, 我大约猜到是因为我的硬盘是较新的 SATA 型的, 接着把它再加到关键字里, 更多的资料将我引向 kernel 中 libata, 于是 libata 也成为我的一个关键字... 最终我定位到内核的这个 bug report - 已经有人在我之前发现问题了 - 于是经过一段时间的等待, 现在, 这个 bug 也修复了. 这次搜索经历带给我很多知识, 比如我知道了声音从何而来, 因何而生, 内核又是最终如何处理这一问题. 尽管我之前对这些毫无概念, 最终我不需要任何提问就得到了问题的答案! 个人感觉是: Linux 下每个问题的发现和解决都是一次奇妙而快乐的历程! :D 
  • 提问前做好准备. 当上面的功课无法解决你的问题了, 说明你很可能真的遇到棘手的了, 那么, 我们在提问前要先做好一些准备工作, 以确保自己的问题够质量:
    • 精心准备好问题的标题. 切忌使用 "求救!!", "紧急!!!" 之类的毫无意义的, "吵闹" 的文字 (英文里切忌使用全部大写). 开源社区里许多工程师通常都在工作之余, 免费地为你做事情, 他们没有义务回答你的问题, 他们更讨厌嚷嚷的人 (工程师都爱安静, 是吧? 呵呵). 我们一定要抓住他们的一大心理特点: 喜欢有趣的, 有挑战的问题 - 因为前者可供娱乐, 后者可秀技能 :) 所以, 我们得让自己的问题变得很有吸引力 - 这就要求我们得做好前面说的 "功课", 使得我们对问题有深刻的理解, 然后通过精简到位的言语, 把问题总结成一句话, 问到点子上. 
    • 提供充分的, 但不冗余的信息. 在我们准备好 "诱人的" 问题标题之后, 就得把问题的内容填充实了. 其中要有条有理地说清楚自己的问题, 如果是 bug 的话, 务必描述清楚完整的重现步骤 (最好自己按这些步骤重现两次以上!), 还有相关的可能有用的系统环境信息, 程序出错时的日志, 命令行的 traceback, debug 程序抛出的信息... 切记把无关紧要的信息清理掉 - 这需要你的知识的判断, 通常各种日志或出错信息都是很长的, 而关键的, 便于定位问题的通常就是某几行 - 例如 gentoo 里 emerge 出错的日志, 通常是倒数 10~15 行内就带着关键原因 - 我们需要做好 "噪音" 信息的过滤工作 - 这也是我们要做的功课 - 信息提供得越精准, 问题得到快速解决的可能性越大. 最后要把自己曾经做过的努力和研究的 "路径" 给提供上 - 这表明你是个 "勤奋的蛋" - 有经验的工程师会喜欢这样的, 而且通过你的 "路径", 通常有经验的工程师可以快速给你指点正确的方向.
    • 怎样算是一个好的问题? 很简单, 好的问题让人一读就懂, 如果你的问题出来之后, 别人还得再找你反复问各个细节, 那么就是一个烂问题 - 别期待别人会免费地为你的问题来回折腾 :)
  • 公司中如何提问? 在公司中我们有个和在网络上生存不同的特点: 时间限制 - 公司项目中, 每个任务通常都得在一定的时间内完成, 不可能给你那么长的时间去慢慢查找/研究. 因而, 一旦我们遇到某个问题, 在着实做了一定研究之后, 仍旧毫无头绪, 这时一定要尽快寻找别人的帮助. 同时, 我们的 Senior Engineer 通常不会直接 "喂" 你答案, 更多是告诉你方向在哪里, 然后需要你通过自己的努力和勤奋, 最终学会解决问题之道 :) 根据我的观察, 经过几次这样的训练之后, 每个工程师最终都能成为自己解决问题的高手 :)
  • 提出问题的同时, 提供你思考过的可能的解决方案 (别等着别人喂你) 
  • 延伸阅读: 经典的 "How To Ask Questions The Smart Way".

2. Open-minded (思想开放)

公司的特点要求我们在有各自的专长之余, 还需要具备很强的学习欲望, 学习能力, 随时掌握新的知识技能. 在遇到新事物新技术的时候, 我们应该有足够开放的思想去接纳它, 学习它, 这里有关键的几点:
  • 先接受 - 相信比你有经验的人的判断和选择
  • 评价前先做足功课 - 先把新东西毫无成见地学习透了, 再和已知的, 自己擅长的技术进行比较 (@TODO: "要喝我的茶, 先得把你杯里的水倒掉"; 切忌以旧套新, 生硬理解)
  • "用什么说什么".

3. Eager to learn, be lazy, be creative, be patient, fear not for failure, be reliable/predictable

4. Good documenting for solved problems (don't repeat your mistake)

5. Always looking for better solution - I can do it better next time!

____

No comments: