Skip to main content

在谷歌如何开启新的项目,Senior工程师的一些个人总结

楼主毕业以后就在谷歌工作,已经6-7年了。现在是一个全栈开发小组的TL。来分享一下开启新项目的心得和自己的思考。

我个人成就感主要来源还是项目本身的成功和同事的良好关系,所以主要也是从这方面入手进行的思考。所以涉及维护人际关系的部分会比较少(?),如果以后有机会也可以单独分享。

1. 为什么要谈开启新项目

从个人发展而言,从头到尾参与新的项目的经历很重要。很多时候可以帮助理解公司的流程,组织结构的关系以及背后的原因。作为工程师,总会有自己的想法或者想做的事情,不论事情的大小,学会如何推进项目也能在工作中找到更多的快乐。

当我刚毕业加入公司的时候,所有的工作都是从老板或者mentor安排的。就算如此,其实如何完成这些工作也有不少的自由度,很多时候同时也能发现大大小小的机会改进现有的系统。但是大部分情况下也只限于个人的时间安排,如果改动过大或者影响到了别的组,我可能就会主动放弃。

但是随着时间的推移,工作的责任越来越大,想做的改变也会越来越多。如何有效率地启动这些项目,扩大影响力就决定了自己能发挥多大的价值。

2. 新项目的点子哪里来

我总结了一下日常容易获得点子的几个渠道

  • Top-down 来自大组的新计划,新项目 - 这个非常容易理解也非常常见,大的项目和计划总是需要分成小的部分来实现,参与其中自然也是开始新的项目。

  • 来自平时和领导,PM的交流 - 在日常交流中可能知道了目前需要解决的问题,而你(经过思考后)正好有合适的解决方案可以提供。

  • 来自平时工作中遇到的现实问题 - 在实现新的功能或者调研其他项目的时候你可能会找到当前系统中需要改进的地方,或者是用户/工程师的痛点。

  • 来自日常交流学习 - techtalk中了解到的新技术和发展方向,和别的组leader吃饭的时候了解到的新项目,可能都可以应用于自己的系统中

总的来说保持日常的交流和获取新信息的渠道畅通,了解业界的发展,公司和大组的最新进展,别的相关项目组的情况。保持良好的同事关系在我看来十分重要,有时候别的组的TL会主动告诉我他们最近的项目并且提醒我可以应用在我们的场景中。保持和老板以及其他领导的关系也可以帮助你获得新的灵感,因为老板们平时接触的信息最多,如果他们能联系到你现在的项目或者组里的情况也可以帮助你获得不同的信息。

3. 什么是好的点子

我认为一个好的点子可以从几个方面来考虑。

自己能否胜任

一个理想的项目点子是自己能够执行的。你自己可能会受到各种制约以至于无法先实现这个点子,比如:当前的工作负担太重,自己无法获得相关的技能或者人脉,别的组更适合推进这个项目,等等。自己不能胜任的话可以将点子推荐给合适的人选,你自己也可以选择成为其中一部分来获得经验以及credit。当然也有项目比较小你可以delegate给别人的情况。

能否获得支持和资源

领导是否信任你,让你来推进项目。软件工程师的时间某种程度上是属于你的老板的,如果不能获得老板的支持那最好不要轻举妄动。你能否从团队中获得需要的资源,比如别的依赖的组的支持,可能需要的PM和甚至UI designer。如果你获得了老板的支持他能不能帮你解决这些问题,如果不能的话你需要考虑是否有其他渠道。

能否组建团队

小的项目可能你自己就能够推进,但是大的项目一般都需要组建团队。你应该预估出需要的团队资源,如果可能的话最好是有自己的意见。比如你可以告诉老板我觉得我们组的XXX很不错,他有这方面的经验,并且最近的项目快要完结(或者我可以帮他快速完结)。大部分情况下你都不可能获得最理想的资源,你需要考虑在现有限制的情况下是否还能顺利推进。

是否与其他团队构成竞争/合作关系

如果新的项目点子和别的组有关,尽量做到合作共赢。维持良好的团队关系能帮助你的成长也能让自己的工作更加愉快。你也不希望别的TL在peer review或者calibration的时候给你下套对不。有些情况下冲突和分歧可能无法避免,这显然是一个考虑点子的扣分项,但是假设你还是需要推进的话一定要作为优先项目妥善处理其中的关系。

4. 如何开始(获得批准和必要支持)

假设你确定了一个点子有价值,并且希望继续推进,你需要获取必要的支持。我建议第一步是确定关键人物(stakeholders)。他们的最重要的作用是有权力批准你的计划,并且提供必要的支持。

确定关键人物

  • 团队老板 / TL

  • 相关组的TL(包括可能的冲突组)

  • PM / Designer

  • 技术专家

提前识别可能的问题,准备解决方案

常见问题:为什么?

  • 收集必要的数据

  • 总结历史问题

  • 了解相似问题的解决方案

  • 公司/大组能获得的收益

  • 预估成本(cost)

  • 人力成本

  • 其他成本

常见问题:怎么做?

技术问题 

  1. 提前准备可能的解决方案(构造性证明)

  2. design

  3. prototype

  4. 相似项目的成功案例(非构造性证明)

非技术问题

  1. 其他组的关系

  2. 了解项目依赖的需求,大致确定解决方案

提前获得反馈

  • 平时积累良好的同事关系能帮助你从多个渠道提前获得反馈,获得建议和可能的问题,提前做好准备。

  • 尽量收集多方面的意见,公开讨论自己的想法。

  • 不要害怕批评,对待批评和意见最好能做到主动接受。如果不是特别必要不用直接否定。保持反馈的畅通可以减少背刺。

处理分歧

  • 在讨论中遇到意见的分歧是很常见的(另一方面也证明了你工作的价值)。

  • 在处理分歧的时候最重要的一点是寻找大家共同的目标 - 如果有可能可以避免一开始直接切入不同点,以公司/大组的利益为基准,从共同的目标出发确定解决方案。

  • 讨论应该基于事实而不是情绪宣泄

    1、提前列出事实,收集数据和证据

    2、站在不同的立场上思考,了解双方的诉求和痛点

  • 沟通的重点是获得信息,细化问题 - 将大的分歧缩小,可以分类讨论或者分情况分析,获取冲突的真正原因。

  • 如果无法进行及时停止

    1、如果确实找不到合适的突破口,最好及时停止,认真思考以后再做打算。

    2、获取领导或者其他权力的支持

5. 总结

  • 保持良好的老板同事团队关系,不要一人对抗整个团队或者组织

  • 提前做好准备和预案,寻找合适的渠道化解冲突

  • 沟通是最重要的武器,很多一开始看上去无法理喻的问题都是可以通过沟通化解的。

Comments

Popular posts from this blog

CKA Simulator Kubernetes 1.22

  https://killer.sh Pre Setup Once you've gained access to your terminal it might be wise to spend ~1 minute to setup your environment. You could set these: alias k = kubectl                         # will already be pre-configured export do = "--dry-run=client -o yaml"     # k get pod x $do export now = "--force --grace-period 0"   # k delete pod x $now Vim To make vim use 2 spaces for a tab edit ~/.vimrc to contain: set tabstop=2 set expandtab set shiftwidth=2 More setup suggestions are in the tips section .     Question 1 | Contexts Task weight: 1%   You have access to multiple clusters from your main terminal through kubectl contexts. Write all those context names into /opt/course/1/contexts . Next write a command to display the current context into /opt/course/1/context_default_kubectl.sh , the command should use kubectl . Finally write a second command doing the same thing into ...

OWASP Top 10 Threats and Mitigations Exam - Single Select

Last updated 4 Aug 11 Course Title: OWASP Top 10 Threats and Mitigation Exam Questions - Single Select 1) Which of the following consequences is most likely to occur due to an injection attack? Spoofing Cross-site request forgery Denial of service   Correct Insecure direct object references 2) Your application is created using a language that does not support a clear distinction between code and data. Which vulnerability is most likely to occur in your application? Injection   Correct Insecure direct object references Failure to restrict URL access Insufficient transport layer protection 3) Which of the following scenarios is most likely to cause an injection attack? Unvalidated input is embedded in an instruction stream.   Correct Unvalidated input can be distinguished from valid instructions. A Web application does not validate a client’s access to a resource. A Web action performs an operation on behalf of the user without checkin...