点击上方“CSDN”,选择“置顶公众号”
关键时刻,第一时间送达!
二十岁时,我获得了微软软件开发的实习机会。虽然没有做好准备,但又不甘心放弃这样难得的机会,于是我还是硬着头皮进去了。后来,我纠正了一位高级开发人员的代码错误,这为我的整个职业生涯上了最重要的一课。
事件回顾
去微软实习之前,我在一家公司负责过编写工具软件,工厂的工作人员使用这个软件进行固件安装、设备配置和运行自动化测试,以确保设备正常工作。软件开发团队只有3个人,总的代码量大约10,000 - 50,000行——这是我在微软工作之前的所有编程经验。
刚刚进入微软时,当时微软的项目主要使用 C++ 编写,因此我首先需要熟悉这些项目,以及了解 C++ 这门编程语言。C++ 是一种相对低级的编程语言,它需要你了解很多复杂的概念,比如内存分配与释放、指针的合理运用等。这些是其他大多数编程语言中并不需要担心的事情。
2008年时我在微软的集体照,高亮的两人分别是 Ray Ozzie(微软的前CTO)和我(一个不太重要的员工)
微软实习的第一天
首先,我花了几个小时的时间用我不太熟悉的编程语言编写了一些测试项目。之后,公司的高级开发人员 Ransom,即我的上级,为我展示了项目的源代码,大概有1000 万行代码,差不多 70 或 80 位开发人员共同开发。
在一些简单的项目中,如果更改了代码,只需要3-4秒就能进行测试。但在微软,对代码的任何小改动都需要8-10分钟的时间来进行测试。另外,整个项目的全部重建需要4-5个小时,而且开发人员通常在下班之前进行重建。
在6个月的实习期间,我一直怀疑自己是否能够真正为公司带来价值。另外,我还是一名在校大学生,这意味着我还得担心毕业后的工作问题。况且,其他的开发者估计也并不希望我继续待在这。
我能够独立编译、运行和启动应用程序,并建立我的开发环境。Ransom 给了我一个简短的源代码,他的工作内容则是接下来我将要涉及到的产品。
我负责的是微软的 Groove 产品
Groove 是一个针对企业的点对点共享系统,当时我们正在加紧与 SharePoint 的紧密集成,一是在 SharePoint 之上提供点对点同步功能,二是需要提供一个客户端,使人们可以更轻松地同步工作内容。
我所在的团队被称为“存储和同步”团队,团队中的一名成员建立了项目的数据库和文件存储系统,另一位成员构建了与 SharePoint API 的集成。总体而言,我们负责点对点同步技术。
点对点同步相当复杂,比如:
人员1添加文件并断开连接。
人员2同步第一个文件,断开连接并离线更改。
人员1对文件进行其他更改。
人员3添加了一个新的文件。
当三个人中的任何一个连接到中央 SharePoint 站点时,同步引擎需要整理系统的状态。
Ransom 是这个产品的专家,他的工作是让我在 6 个月时间内,从一个没有经验的开发人员变成一个有能力、有影响力的团队成员。
Ransom 分配给我的第一个任务
我们对同步引擎进行了一些内部自动化测试。他说:“我希望你来改进我们同步引擎的内部测试,虽然目前还不能达到一些测试的边缘情况,但是最终目标是能够执行这种特定类型的测试。”
对 Ransom 来说,完成这项任务可能用不到一天,但我花费了整整一个月的时间。以下是我的工作流程:
我用三天时间进行构思,然后清理代码,让编写测试变得容易,使它更接近于我在 C++ 书籍上阅读的代码格式。
Ransom 要看我写的代码。
虽然我感觉自己还没有做好准备,但还是硬着头皮向他展示了代码。
他逐行阅读我的代码,并指出了其中的每一项错误。
Ransom 指出了错误的具体原因。
我按照 Ransom 的意见修改代码。他告诉我有很多人都出现了和我类似的问题,因此我毫不犹豫地修改了代码。
多次修改代码
我内心暗下决心不再犯同样的错误。之后我继续工作了一些时日,然后我将我的新代码展示给 Ransom,他表扬了我代码中的一些优点,这让我感觉非常有成就感。
然而,他又指出了我的一些错误。代码还得修改,我依然按照他的指引更改,因为他确实说得很有道理。
我再次回顾了这段时间的工作。在此过程中,我也拉取了同事近期新增和修改的代码。通过对比,我觉得自己可能不擅长编写代码。我唯一觉得自己擅长的事情就是不断修改错误代码。
那段时间,我被介绍给另一位名叫 Dana 的开发者。Dana 也是高级开发者,并且非常聪明。
我想做出点成绩让 Ransom 刮目相看,所以我不想从他那里得到太多的帮助。但是我逐渐发现,独立工作老是出错,不得不多次推翻重来。于是我开始向 Dana 请教。甚至有些问题可能是非常愚蠢的,但是为了自己少走弯路,我硬着头皮也要问。
我每天都会向 Dana 请教一两个看似愚蠢的问题
面对我提出的问题,她会花费一两个小时耐心解答,以便我真正理解。事情总是比我想象的更复杂,但我开始变得更加自如。通过对这些愚蠢问题的了解,我逐渐开始对自己从事的开发工作有了深入理解。
几天之后,我再一次与 Ransom 一起浏览我的代码。他依然非常细心,逐行阅读,依然发现了很多问题。但这一次我的代码可以运行了!虽然距离完美很遥远,但我感觉自己已经走上了一条正确的道路。
最后,我对项目的自动化测试系统进行了一些小的改进。当然它还是有问题的:
我的代码在产品中的重要性很低。
老员工需要花费大量的时间来回答我的问题,实际上如果让他们开发这套系统,那么花费的时间比回答我的问题的时间更少。
我很高兴自己的代码有资格正式加入到主代码库中,但是我仍然觉得自己没有为公司增加太多价值,我仍然只是遵循上级的指示编写代码。
在接下来的几个月里,我开始研究测试系统之外的事情,并且接触了项目的真实代码。我的经理给了我几个非常简单的 bug 让我修复,每一个花费的时间都比我想象的要长。
我承担的工作量慢慢地增加,但我仍然不觉得自己给公司带来了很多价值。我觉得任何人都可以做我正在做的事情,只是他们没有时间而已。
当比我有经验的人会告诉我怎么做时,我会按照他们说的做。毕竟,他们比我有经验。
直到一件事情改变了一切
我还记得弹出的内存泄漏窗口。
我们使用了一个工具,用来告诉我们是否可能存在内存泄漏,内存泄漏问题在 C ++ 中是非常糟糕但却很常见的问题。
当时,我很困惑为什么这个工具触发了通知窗口。
过去我没有接触过内存泄漏的问题,主要是因为我仅仅只是遵循团队提出的想法进行工作,缺乏自己的思考。窗口上弹出了一些我正在编写的代码,我询问如何调试这类问题之后得到了一些宏观的调试建议,然后就开始着手解决这个问题。
几天之后,我找到了问题的根源,这是由于其他的开发人员在方法签名中写了一个指针而不是智能指针的方法。这意味着内存释放将不会像我们的代码中的其他地方一样工作。在这种情况下,代码导致智能指针不再操作。最终,内存永远不会被释放。这是一个糟糕的问题。
我被这些代码搞糊涂了,于是我去查看代码的历史,发现它是由另一个团队的开发人员编写的。不久之后,我发现这位开发人员实际上很高级,而他恰巧在一个离我很近的办公室里工作。我小心翼翼地敲开了他的门然后问道:
“嘿,我可以问你一些关于你写的代码的问题吗?我对你的一些代码比较好奇。“
我向他展示了我使用他的代码的方法,同时展示了我认为可能有问题的地方。根据我过去的努力,我期望得到一个相当详细的答案,说明为什么另一种方法行不通。但他的回应真的让我非常振奋:
“确实,你是对的,它应该是另一种方式。如果你愿意的话,我可以把它切换出来,但是你来做的话可能会比较容易,因为你正在使用它。“
此时此刻,我非常激动,感觉一瞬间一切都变了。我不再觉得自己像一个没有经验的实习生,不再因为他们比我有经验而老老实实遵循他们的指示。事实上,此刻我意识到自己可以做出比上级更好的事情。而这正是我能够以别人无法做到的方式为公司带来价值的原因。
我可以在代码中发现一个问题,找出一个解决方案对代码进行改进,这个问题可能是高级开发人员、代码审查人员或者其他使用该代码的人员疏忽的。这是一种很酷的感觉,我希望自己能够再次体验到。
我花了大约3个月的时间才得到这种体验。但一旦发生一次,就会越来越频繁地发生。不久之后,我觉得几乎每一天都有这种感觉。
新人将有经验者奉若神灵是正常的
你不好意思去询问那些看起来很愚蠢的问题,而是乖乖地按照指示行事。当你陷入这个循环时,就感觉自己仿佛是按照 Google 地图的导航来工作。你盲目遵循而不思考事情的原因和本质。如果你这样做,你可能觉得自己像机器中的齿轮,你不清楚如何让自己变得对公司有价值。
但是如果你开始批判性地思考和提问,并在一些很酷的工作中错误并总结,所有的事情都开始改变。你开始意识到,你前面的人并不完美。事实上,他们负责的事情有很多,其中的一些可以做得更好。通过将你所学到的东西与你自己独特的视角相结合,你可以比你的上司做得更好。这就是你真正增值的地方。
永远不要怀疑自己,相信自己可以比上级做得更好。这一点是唯一可以让自己真正为公司增值的方法。
当我离开微软时,我已经修改了核心产品中的数千行代码。我对后端、文件系统、同步和 SharePoint 集成等代码进行了更改。这些事情最初看起来是遥不可及的,但事实上我最终还是做到了。而这一切都始于我大胆纠正了以为微软高级开发人员的错误。