关于技能和学习的对话

90 阅读36分钟

要想在一家大型科技公司的一个有能力的重要团队中获得聘用并取得成功,哪些技能可能真的很难说。一些关于所需技能的陈规定型观念是真实的,但还有更多的故事。这篇文章是对从事.NET工作的人的一种内部看法,关于他们每天使用的技能,他们是如何发展这些技能的,以及他们是如何想出自己的个人方法来获得成功。

我们再次使用对话形式,这次是与.NET工程师讨论开发技能和学习方法。这次我们有一个庞大而伟大的阵容。

你是如何被聘用到.NET团队的?

**Elinor。**我以前工作过的一些人(很喜欢和他们一起工作)都在.NET团队。他们指出该团队正在招聘,并建议我可能会比当时的工作更喜欢它--于是我就来了。

**Aditya:**在2015年初,我听说.NET要跨平台和开源,我觉得这真的很令人兴奋。当时,我在Visual Studio工作,并与一些CLR的人合作,使AOT编译的代码的剖析工作,所以我利用这个机会了解更多的计划/挑战,并很快发现自己在CLR团队,努力实现跨平台的愿景。

**雷纳。**我是1ES团队的一员,致力于微软总体的工程生产力和其他技术(比如后来的BuildXL。MSBuild的主要维护者离开了,去尝试新的东西,而我是最了解MSBuild的人,随着.NET Core 1.0的开发速度加快,我最终接管了所有权。后来,MSBuild被重组,以便更接近我们在.NET SDK和Visual Studio团队中的合作伙伴,我可以选择留在1ES,但我选择来到.NET。

**坦纳。**我在2012年从一个供应商(通过另一家公司的合同工作)的职位开始,为Roslyn做测试工作,最终过渡到2015年被全职雇佣到同一个团队。作为一个全职员工,我从C#脚本过渡到实时单元测试,再到项目系统和SDK,最后到现在的.NET库团队。

**泰斯。**当时我的一个朋友在Mono团队工作,而我在巴西的一家公司工作,该公司有自己的专有语言,所以我在编译器、运行时和调试器方面工作。我的朋友认为从事Mono运行时的工作对我来说很有意义,所以他告诉我这个职位,我申请了。然后我就被Rodrigo Kumpera聘用,在wasm团队工作。

**何塞。**我曾经和很多曾经在这个团队工作的人一起踢过足球,其中一个是Peter Marcu,他当时曾经领导.NET库和运行时团队。当.NET开始专注于跨平台时,他们有一些职位空缺,我很幸运地申请到了一个位置。

**杰里米:**当.NET核心发布时,我看到了解决缺点的机会,特别是围绕长路径名称的缺点。我在GitHub上开了一些问题,然后意识到我可能真的能加入到团队中去工作。我联系了一个信息员,并被图书馆团队录用了。

**Kunal。**我对编译器领域有很强的倾向性,在过去,我曾在Javascript运行时团队工作。我想探索微软的其他运行时,这吸引了我加入.NET团队。这是一次内部调动,但我应该承认,面试的标准很高。

**Maryam:**在加入微软之前,我在另一家公司工作,该公司正在向.NET核心过渡,由于我们是.NET的客户,我对所有的.NET都很有热情。在一次微软的Build会议上,我在第二天联系了.NET的展位,提到了我的兴趣,事情就这样开始了。

**Maoni:**我想在.NET的perf上有所作为,perf团队有一个职位空缺。那是一个项目管理的职位,因为我以前从来没有做过项目管理,所以我想试试。结果发现我完全不适合做PM,所以9个月后我又转回了开发,但还是留在了团队里。

你最依赖的技能是什么?

**何塞。**疏通自己的能力,让自己变得富有成效。当面对一个棘手的问题时,能够选择一个适当的时间来尝试自己解决问题,这对我来说非常重要,如果时间过后我还没有找到答案,就能够向正确的人提出正确的问题,以获得帮助并解除自己的障碍。

**毛尼:**我过去主要依靠我的问题解决能力;现在,沟通能力也很重要。

**库纳尔。**在codegen团队中,阅读和理解汇编代码并将其映射到原始源代码是一项关键技能。除此以外,在调试跨平台问题时,快速提升不熟悉的工具并学会在它们之间切换是非常值得推荐的(今天我在windows上使用perfview,第二天我在Linux Arm上使用gdb)。最后,由于.NET产品非常庞大,有些文件的代码超过1万行,要了解每一种方法是不现实的。由于.NET的开发历时数年,往往你最终会在一段不熟悉的代码上工作。一个重要的技能是阅读遗留的代码并迅速了解它解决了什么目的。

**Rainer:**Debugging and problem-narrowing: 弄清楚如何从我们拥有的信息中找出问题所在,并选择下一步来弄清新的东西。沟通是为了能够提出好的问题(要么是 "这样我可以得到帮助",要么是 "这样我可以向别人描述问题",要么是 "这样我可以从问我问题的人那里得到更多关于事情的信息")。

**坦纳。**这是一个很难的问题,因为有这么多。我想我最依赖的不一定是我自己的技能,而是我的同事们的技能。.NET团队在技能和背景方面非常多样化,我们都帮助注意自己的专业,以帮助使产品达到最好。

**泰斯。**我想我主要是靠我的毅力来解决一个问题。

**雷纳。**坚持是个好问题。在我通过TEALS教高中生的时候,我很难让学生相信这一点是至关重要的,但它确实是。

**Maryam:**正常的调试技能,在github上保持关于问题和PR的对话(反应能力和让利益相关者了解最新情况),增加领域知识,时间管理。

**杰里米:**故障排除和研究是我依赖的主要技能。找到技术细节和相关人员是关键。

**Aditya:**从事像CLR(或.NET)这样庞大而复杂的工作所面临的挑战之一是很难了解所有的事情,所以能够专注于大系统中的一个小系统并迅速建立一个心智模型,对于调试和解决问题是非常有帮助的,而且还能够与那些专业领域与我不同的人进行富有成效的合作。

**Elinor。**提问--不知道该如何标注。我认为这包括寻求帮助,提出我可能有的担忧,指出需要更多调查的问题(无论是由我还是其他人),以及质疑为什么某些过程/设计/实施是某种方式,以及是否可以做得更好。也许这真的只是一般的沟通和协作。

阅读和调试其他人写的东西。我所有的工作都是建立在现有的系统上,所以我在很大程度上依赖于阅读和调试陌生领域的能力,以便理解一些系统并有效地对其做出贡献。阅读听起来很基本,但能够阅读一份文件、一些代码或提议的修改,并推理出它的含义,以及它如何融入一个更大的系统,确实很有用。

你希望自己在哪些方面有更强的能力?

**何塞。**对我要做的所有事情更有条理。我通常很容易分心去做一些新的任务,而在做另一个任务的时候,我发现我很难记住在中断后再回来完成我原来的任务。我真的需要努力发展和坚持一个系统,让我专注于手头的所有任务。

**埃莉诺。**在这里,我打算把自己限制在三个方面。

  • 提出问题=)
  • 分享信息--展示、公开演讲、技术写作
  • 处理听觉技术信息(特别是在快速发展的会议中)。

**毛尼:**更有条理。我在工作中要做大量的上下文切换,有时我很难保持对事物的跟踪。

**玛丽亚姆。**在不同的问题之间进行切换,特别是在专注于一个较长的任务时,确保让自己在不相关的小规模任务上也能取得进展。

**泰斯。**我想成为一个更好的C#程序员,我在过去的15年里一直使用C和C++编程。自从我开始在微软工作后,我的C#技能提高了很多,但我仍然希望能做得更好。我希望能更好地沟通,因为我不是以英语为母语的人,有时我在表达自己时有问题。

**坦纳。**保持对我兴趣之外的领域的关注。我在数字和低级别的工作方面有相当的背景,我可以围绕这些事情变得非常有激情和动力。我对网络开发、服务或数据库等更高层次的概念不是很熟练,所以我倾向于在这些领域失去焦点。

**杰里米:**在技术上,我一直希望我对汇编有更好的理解。人际交往能力是我一直在努力提高的东西,但从未满足过。

**Rainer。**沟通和授权。每一次联系,我都有一个关于 "减少随机性和在我的队友之间做更好的工作分配 "的条目。我也没有很好地把我的知识分配给团队中的其他成员,这没有帮助--这对面向公众的文档也是如此。

**库纳尔。**由于所涉及的复杂性,我们很容易迷失方向,走错路。我需要学习在我应该做多少调查和何时停止并向专家提问方面有一个很好的平衡。

**Aditya:**我的一些同事能够记住关于系统的非常具体的细节,有时甚至是变量名称之类的。这是我没有的超能力,有时这意味着我必须在项目开始时花点时间重新熟悉某个领域的具体细节。

缩小范围。在.NET团队中有很多不同的角色。请描述一下成功所需的广泛而定型的技能组合?

**何塞。**通常只要有一个像样的编程背景,但更重要的是要能够学习新的概念,适应和帮助别人。鉴于该框架的覆盖面如此之广,这意味着它的不同部分可能需要,每隔一段时间,从团队中随机抽出的开发人员来帮忙。在这个团队中,能够在工作中快速学习和适应是一项伟大的技能。

**雷纳。**好奇心、毅力和沟通技巧是成功的关键。要有足够的兴趣去挖掘问题,坚持不懈地找出正确的方法,并知道如何写下你学到的东西并有效地寻求帮助。

**库纳尔。**批判性思维和问题的解决是.NET的必备条件。对于软技能,我认为良好的沟通技巧是非常重要的;我们需要知道如何用简单的语言向不熟悉编译器领域的听众解释一个复杂的问题。这种技能确实有助于与社区打交道,并教育他人了解.NET中的设计决策。

**Elinor。**我不确定我是否知道如何定义一个具体的集合。在真正的高层次上,我会说沟通、协作、批判性思维,以及愿意学习/犯错。不过,我还是要对阅读和调试大加赞赏,因为它们真的很有帮助。

**Aditya:**没有特别的顺序。

  • 调试和解决问题
  • 交流
  • 对一个技术问题进行深入研究,然后将其放大,考虑客户影响、可用性等问题的能力。

**毛尼。**调试技能和坚持不懈的精神。运行系统可能非常复杂,有些问题需要很长时间才能弄清楚。另一个非常有用的技能是能够把大问题分解成更小、更容易处理的部分。

这是很重要的。

  • 持久性
  • 调试
  • 学习的欲望

**Maryam:**日常工作:调试技能,以批判性的眼光编写/审查代码,API设计,问题优先级/管理。

**坦纳。**我认为在.NET团队中,定型的一套是倾听、沟通和解决问题。特别是有了这些,我们就可以发挥各自的优势了。

**杰里米:**我认为克服困难的能力是至关重要的。事情的范围可能是压倒性的,当你开始任何特定的任务时,很容易感到挑战是不可逾越的。

相反,你能描述一下团队中的人所拥有的、你可能不具备的、对我们的共同成功很重要的小众技能吗?

**何塞。**我认为,真正使我们与众不同的是,尽管每个开发人员都有自己的个人任务和责任,而这些任务和责任在大多数情况下是非常不同的,但我们似乎都有相同的焦点,那就是建立一个伟大的.NET产品。这一点以及我们总是试图帮助对方的特点,使我们成为一个伟大的集体,是任何成功产品的关键因素之一。

**Maryam:**更多地依靠工具来提高生产力,换句话说,尽可能多地将工作项目自动化,目标是 "更聪明地工作而不是更努力地工作"

**毛尼:**能够在社区中产生能量。我认为David Fowler在这方面做得非常好,我希望我有这种技能(或者有动力去做得更好:D)。

Rainer。 PerfView的巫师们总是让我印象深刻。有很多中高级的CS技能是我不具备的(我的学校教育是机械工程),还有很多领域是我没有经验的,比如网络或汇编或Linux系统调用。

**坦纳。**有些团队成员比较外向,能够发表大量的博客文章,做讲座,提高社区的兴趣。这不是一个真正的小众技能,但它绝对是我没有的技能,它让我能更多地呆在我的舒适区,同时还能让我有一个伟大的.NET产品。

**杰里米:**拥有在技术上深入研究各种主题的人,以及对我们所涉及的各种问题有良好的高层次把握的人是至关重要的。

**Elinor。**有一些技能在一般情况下并不是小众的,但我认为有些人在这些技能上有极高的熟练度,是不常见的,对团队很重要。比如说。

  • 社区参与--令人印象深刻的是,有些人参与了行业的许多不同领域的工作
  • 倾倒调试--重建令人难以置信的复杂的步骤序列和相应的机器状态,以获得一些行为。
  • 对特定的操作系统和/或架构(及其怪癖)的深刻理解--当你在一个特定的操作系统/架构上与某些行为作斗争时,能找到人帮忙是非常好的,因为你可能并没有经常在这个操作系统/架构上工作过。

如果你在运行时团队工作,你是否需要了解汇编,知道什么是jmpeax ,或者用十六进制说话?如果你在库团队工作,你需要知道C语言吗?如果你在x团队工作,你是否需要y定型的技能?

**库纳尔。**当一个软件工程师写一个程序时,他们需要检查和了解这个程序是否产生了正确的输出。对于编译器团队(特别是codegen),输出是汇编代码。因此,在编译器团队中,你无法摆脱汇编代码。在更高的层次上,如运行时或类型系统,可能不那么需要。另外,大多数运行时都是用本地的C/C++编写的,有良好的理解力有助于你和我们的团队写出更好的、高效的代码。

**Aditya:**像.NET这样复杂的东西,在构建和运输过程中会涉及到很多东西,我认为每个人都会带来一些独特的拼图,没有这些拼图就不会完整。例如,我们的组织中有人是特定技术的专家,有人善于确定我们的客户需要什么,有人真正知道如何将我们所有的工作转化为打包的版本,并付诸实施,这样的人不胜枚举。

**何塞。**我不认为从事运行时或库的工作有任何知识方面的预先要求。你拥有的技能越多,通常意味着你需要更少的适应时间,因为你需要学习的东西更少,但一般来说,我认为唯一真正的要求是能够在工作中学习,因为随着新技术和语言功能的开发,我们需要经常这样做。

**Aditya:**我可以说说运行时方面的事情......在你加入运行时团队之前,不期望你知道汇编。不过,在你加入团队后,你很有可能会熟悉它:)。

**泰斯。**这取决于你所工作的运行时的部分,但我认为了解汇编是非常有用的。我认为如果你在图书馆团队工作,有一些C语言知识是很好的。

**Elinor。**像大多数事情一样,我相信对一种语言的了解和熟悉是 "当你需要它的时候学习它,如果你继续使用它,就能保留它 "的情况。了解汇编在运行时团队中是有帮助的,但肯定不是加入团队的必要条件。你最终是否学习/需要它,取决于你究竟从事什么工作。

**坦纳。**我在库团队工作,但作为System.Runtime.IntrinsicsSystem.Numerics 的所有者之一,意味着我做的很多工作最终都会跨越这两方面。当我在库方面工作时,我倾向于使用更多的C#,而在运行时工作时,我倾向于使用更多的C/C++和汇编(x86、x64、Arm32和Arm64)。对这两方面的了解有助于我更好地完成自己的工作,但这可能不是每个人都能做到的。

**Maoni:**如果你的意思是 "知道jmp 做什么是在运行时团队工作的先决条件",那么绝对不是;如果你在运行时工作了一段时间,我想每个人都会积累一些汇编的基本知识。

**Rainer。**构建和SDK领域是非常广泛的,需要一堆广泛的知识。你不需要知道任何特定的东西,但知道macOS和Linux文件系统的怪癖肯定能帮助解决一些类别的问题。因为每个人都在构建,所以我们会遇到很多 "我的构建坏了 "之类的问题,我们必须找出问题所在,可能是操作系统、编译器、运行时间......当然也可能是我们自己的代码(MSBuild XML或C#)。

**杰里米:**我认为你不需要这些技能,但你也不应该害怕学习这些技能。你不必成为专家,但你至少应该能够跟着学。

转向跨平台的重点一定看起来很快。人们学习Linux和Arm的速度如何?

**何塞。**我是在关注跨平台之后加入团队的,但在开始dotnet/iot资源库时,我确实不得不学习Arm架构的开发,该资源库主要关注在Raspberry Pi这样的设备上运行,这些设备通常都有ARM处理器。我想说的是,总的来说,我们都很快适应了新的工作重点,而且开源是一个巨大的帮助,因为我们有专门从事Linux和ARM的贡献者,他们在审查PR和提出建议方面很有帮助。

**泰斯。**我想,这个问题并不适用于来自mono团队的人。😉

**Aditya:**我认为每次我们把.NET带到一个新的操作系统或架构上时,首先会有一段时间,团队中的一小部分人一头扎进去,把大部分时间花在工作上,做所有繁重的工作,比如让它实际构建、运行HelloWorld,并最终运行更大的工作负载。随着新平台变得更加稳定,最终与我们支持的任何其他操作系统/架构一样,更广泛的团队逐渐参与进来。

**Rainer。**我在大学时从Windows转到Linux,在研究生院时转到Mac,然后来到微软,在Windows团队工作。跨平台是一个超级令人兴奋的机会,可以回到我真正喜欢的平台上(然后发现我已经学到了很多关于Windows的东西,却忘记了关于Linux的东西)。但是,由于我一直和一群以Linux为主的行业人士保持联系,所以我的日子并不难过。

**坦纳。**我认为每个人都以不同的速度学习,我们中的许多人仍在适当地学习。这完全取决于你在做什么,所以有时候你可能需要对一个平台有更深入的了解,而其他时候你可能根本不需要考虑。当我们发布.NET 5时,我为ARM64汇编做了很多额外的学习,因为它对于硬件的内在工作是必要的,但我仍在学习它,在它达到与我的x86/x64汇编知识相同的水平之前,可能还要学习很多年。

**Kunal。**我们的代码库和工具基础结构相当稳固,在开发过程中不需要其他操作系统/架构。然而,当涉及到在跨平台上调试问题时,这是一个很大的背景转换。每当我不得不调查一个跨平台的问题时,我必须重新回忆一下工具的bash命令、gdb、perf或者阅读Arm的使用手册。

**泰斯。**当我开始在微软工作时,我从Windows切换到Mac,我认为这不是一个问题,2个月足以让我对新的操作系统感到舒适。

**杰里米:**多年来专注于Windows确实使我在学习Unix技能时有一点额外的挑战,但这并不是不可克服的。我也不认为有必要对它们都有同等程度的了解。

**Elinor。**我没有参与转换,但我认为每个人都在不断学习如何在他们不太熟悉的平台上更好地工作,并在很大程度上依赖熟悉这些平台的其他团队成员。我想说的是,在微软之外拥有对某些平台有深入了解的贡献者对团队是有帮助的。

你所依赖的东西中,有多少是你在学校和工作中所学到的?

**Ranier:**5%在学校,40%是业余学习,大部分是在工作中。

**何塞。**我想说的是,大部分都是在工作中。在我大学四年半的时间里,当我得到我的计算机科学专业时,我从来没有听说过任何与自动化或单元测试有关的东西,也没有做过任何与源控制的概念有关的事情,而我最终在大学毕业后就得到了一份测试工作。学校对于获得编程的基础知识是很好的,但是今天它根本不是获得知识的唯一地方,通常你可以在工作中学习到同样多的知识,甚至更多。

**坦纳。**我没有上过学,通过书本和提问/实验进行了大量的自学。我认为我在.NET团队的头6个月里学到的东西比我之前所有的学习年限都要多,因为你学到的东西和你如何应用它可以有很大的不同。

**Thays:**10%在学校,90%在工作中。

**杰里米:**几乎所有的东西都是在工作中学习的。我没有完成我的CompSci学位,我在那里得到的东西并不涉及 "真实世界 "的编程。

**Elinor。**就主题而言,我所依赖的绝大部分是我在工作中所学到的东西。对我来说,学校在找出我喜欢的工作/学习风格和提供作为一个团队在各种项目上工作的经验方面更有帮助。我确实担任过各种课程的助教/评分员,这对学习如何帮助他人学习很有帮助。

**库纳尔。**我认识很多聪明人,他们没有CS学位,但作为一个软件工程师仍然做得很好。就我个人而言,我有CS学位,它为我日常工作中的概念打下了良好的基础。例如,我不认为我百分之百地依赖编译器的"龙书",但我在大学里已经读过了,如果我想为 "寄存器分配器 "这样的小众话题寻找解决方案,我知道该从哪里找。

**Maoni:**我使用的几乎所有东西都是在工作中学习的。

**Aditya:**我认为我所做的一些工作是建立在我在学校时的基础上的,但很少有直接在学校学习的课题。在我所学的课程中,操作系统和计算机结构可能是转化为我工作最多的课程。

如果你没有大学学位或者不是CS专业的,你能在团队中取得成功吗?

**何塞。**当然可以。不用看得太远,我的跳槽经理(我经理的经理)就没有学位,他非常成功。在这个团队中,成功更多的是取决于技能和能力,而不是预先存在的知识。

**莱纳。**是的,当然。诀窍是被录用。我非常幸运地在微软的面试中勉强通过,得以进入公司。

**库纳尔。**只要你有解决复杂问题的热情,有良好的沟通和协作能力,没有大学学位也能成功。

**泰斯。**是的。在微软,我知道至少有一位优秀的工程师没有大学学位,我在过去的工作中也观察到了这一点。

**杰里米:**你绝对可以获得成功。许多团队成员(包括我自己)并不是来自 "传统 "的计算机科学背景。激情和兴趣是关键,现在有了开放源码,幸好更容易证明这一点。

**坦纳。**我希望如此,因为我没有上过大学,也没有学位🙂 ,我认为很多事情都要靠热情和学习/调整的意愿。当然,实际情况可能比这要复杂得多,但当然也有可能连一般的高中文凭都没有,最后还是成为.NET库的几个领域的共同拥有者,并对运行时做出了贡献,这至少可以说是某种程度的成功。

**玛丽亚姆。**也许对于概念来说,我依靠的是在学校学习的CS学位。也许学校帮助我在这里和那里做项目,让我对所选择的编程语言更加熟悉。数据结构可能是比较重要的一个,它总是在工作中不断出现,但是,为了适应日常工作,很多东西可以从队友那里学到,也可以通过工作学习。

**埃莉诺。**绝对的。我曾与没有大学学位或没有CS学位的优秀人才共事。我没有CS方面的学位。实际上我不知道我大多数同事的教育背景,因为这对我们的合作没有任何影响。我坚信,你主要需要的是学习的能力和意愿,以及找到能给你机会的人的好运气。

**Aditya:**是的。根据你所从事的领域,如果事先没有接触过该领域,提升的难度可能会大一点,但这只是暂时的挑战。我们谈到的其他技能(沟通、协作、解决问题等)要比特定的学位重要得多。

**毛尼。**绝对的。我的学位不是CS的。没有学位可能是获得面试的一个障碍,但现在你可以有一个开放源码软件项目的组合,这也可以让你获得面试机会(也许在某些情况下甚至比有学位更好)。

在科技界有什么神话或守门人的备忘录是你想破除的吗?

**坦纳。**我当然希望能消除门禁,但它确实存在,而且经常发生,特别是对少数民族(妇女、有色人种、LGBTQ+等)。我希望我们在.NET团队中能更多地接受/理解,我只能建议积极主动地利用你自己的特权,如果你有的话,以帮助确保随着时间的推移,门禁的减少。

**杰里米:**你需要一套特定的学术证书才能获得成功。

**何塞。**任何人都可以编码:)。你真的不需要一个学位,不需要懂英语,甚至不需要知道如何使用电脑。如果你有一个分析性的思维过程,有可能你已经用你的大脑以这种或那种形式 "编程 "了,关键是不要害怕学习和尝试。编码不仅仅是为那些了解矩阵终端屏幕上显示的1和0是什么意思的人准备的。

**说法。**女性不能像男性那样编程。🙂

**Elinor。**它特别难,或者你需要特别聪明,或者自称是 "电脑呆子"。每个人都有学习和思考问题的基本能力,但可能只是没有机会将其应用于技术。

**莱纳。**我想加强 "不需要特定的证书"/"人口统计学应该不重要 "的东西,但没有任何特别有见地的评论。

你是如何保持现状的?你在工作中是否有时间学习,还是主要靠自己的时间?

**何塞。**当然,最近我们在工作时间有一些被定义为 "学习 "的时间,我们可以决定如何利用这些时间。以我为例,在过去的几年里,我一直在学习更多的网络技术,这与我的日常工作没有什么关系,但我仍然对它感兴趣。

**莱纳。**很多Twitter和阅读博客。非常喜欢@b0rk(jvns.ca/)。我在工作中抽出时间…

**库纳尔。**通常情况下,我对我正在研究的概念进行研究,通过研究我可以读到一些好的博客和文章。最近,我一直在阅读关于 "高效寄存器分配 "的学术论文,以改进我们的算法。这本身就使我很忙。为了保持现状,我依靠个人时间。

**坦纳。**我每天花一部分时间帮助做一些事情,比如主持C#社区的Discord,并保持对最新新闻和技术的了解。我很幸运,只要我还能完成我的工作,并达到我的最后期限,我就可以自由地这样做,所以我不需要花我的个人时间做同样的事。我们偶尔也会有 "学习日",专门用于专注于你想做/学习的事情,而不占用潜在的繁忙日程。

**第三天。**我通常利用被定义为 "学习 "的工作时间,我也一直在学习很多关于Javascript和Node.js的知识,作为一个实习生的导师。所以我的答案是。我利用工作时间来学习。

**杰里米:**我每天看的东西可能会有很大的变化,所以出于需要,我确实要在工作中学习很多东西。例如,我最近需要做一些关于OLE的工作。我确实通过在工作之外的事情上随心所欲地学习额外的技能。

**毛尼:**我在工作中和自己的时间里都做。我最喜欢的消遣活动之一是阅读GC论文。🙂

**埃利诺。**我很难界定与工作有关的学习是在工作中还是在我自己的时间里进行的。最近,.NET团队(也包括DevDiv)一直在强调学习是我们工作的一个关键部分,这很好。

我并不专门密切跟踪科技新闻,所以我经常依靠其他人来告知我一些有趣的发展,而这些发展并没有跨越一般的新闻,然后我再做我想做的调查。在我看来,参加一个开源项目也是有帮助的,因为各种问题/疑问都会通过这个项目指向我可能还不熟悉的东西。

开源.NET项目是如何改变你的工作方式和经验的?

**毛尼:**我喜欢我们可以把一个修复程序放进去,然后马上给客户一个构建的事实。这一点非常强大,让人很满意。

**Rainer。**我不得不使用更多基于文本的交流,迫使我必须超级超级清楚,因为我不知道对方的经验和英语水平。

Tanner:.NET是开放源码的,这让我能够积极寻求对我负责的领域感兴趣的开发者的意见和贡献。这使我能够更直接地解决客户的问题,有时还能从那些对某一特定功能特别热衷的开发者那里得到额外的功能工作,而且他们希望更快加入。这也让我能够更早地得到反馈,以帮助验证设计的正确性,并满足目标受众的需求,这反过来又能使产品更好地被交付。

**杰里米:**相对于在封闭源码中工作(我仍然在做一些工作),与社区的联系有一种更深的感觉。我肯定更喜欢在开放环境中工作。

**玛丽亚姆。**对开放源码方面真的很满意。大多数对话都可以在离线状态下进行,比如通过github,团队更容易分散在不同的时区,但仍然很有成效,我们可以从团队之外的社区的开发者那里获得专业知识和反馈,而且更容易与客户沟通,因为反馈回路更直接(在区域所有者和功能的直接使用者之间)。

**库纳尔。**在开放源码软件上工作是一种很好的体验,特别是因为你可以和这么多的外部贡献者联系,他们对解决该产品的问题同样充满热情。通过开放源码软件,我们这些开发者有机会看到我们的客户所面临的问题,并且可以通过承认和回应他们的需求来帮助社区。一个额外的好处是,我们可以随时回去参考我们的工作,即使我们不在那个团队工作了。

**泰斯。**这个问题并不适用于mono团队,但是当mono repo被转移到dotnet repo时,我觉得我有很大的责任,一个PR可以被成千上万的人看到。所以我一直努力写出我能写的最好的代码。总是试图从别人的PR和评论中学习。

**Elinor。**我真的很喜欢我们是开源的。我认为这能更好地了解社区的愿望和痛点,也能更好地了解我们工作的影响。看到社区的所有贡献也很好。我确实认为这意味着我对自己的写作或评论方式更加谨慎,因为大多数人在阅读时并不认识我,也无法理解我的信息的语气/意图。

**Aditya:**开源帮助我们更接近社区,这对我们做什么,什么时候做,以及如何做都有深远的影响。开放工作的另一个很好的副作用是,它帮助我们更好地将想法、计划、解释等以书面形式表达出来,让观察者清楚明白,甚至是那些可能没有什么背景的人。这总是一件好事,但在过去的一年里尤其如此,我们都不得不转向远程工作。

大流行病是去年的一个决定性经验。作为一个.NET开发者,这一点如何?

**何塞。**在大流行病方面,我认为自己非常幸运。作为一个开发者意味着你可以继续你的远程工作;作为一个开放源码意味着你几乎可以在任何有网络连接的地方工作;而在微软意味着你有足够的工作保障,以便专注于真正重要的事情,并取得成效。

**莱纳。**在大流行之前,我是全职的远程工作,但还是有一些大的转变,因为团队的其他成员都去了远程,我们都要兼顾家庭和家人的生活。团队和公司都非常支持我,我感到非常幸运,能够抽出我需要的时间,保证我的家人安全,并工作。

**坦纳。**最困难的部分是在家庭和工作之间取得平衡。两者之间没有一个 "自然 "的过渡期(如通勤),每个人都被困在里面,但.NET团队和管理层一直非常灵活,试图让员工为此进行调整。我认为,在许多方面,它有助于带来更好的工具和理解如何在不亲自参与的情况下进行有效的沟通,我希望在我们回来后,很多东西会持续下去。

团队中的人如何保持对其他编程语言(如Go和Rust)以及RISC-V和Wasm等架构的了解?这些是否被视为竞争威胁?

**Rainer。**我在Twitter和我的RSS订阅中关注了很多Mac/iOS的开发者和很多Rustaceans,所以我试着去了解这些生态系统。我对RISC-V和Wasm都很兴奋,但我不认为它们是威胁。我期待着有一天能在WASI的沙盒中运行构建扩展。来自具有不同设计决定的生态系统的压力将有助于推动我们做得更好。

**谭纳。**我一般只是对我感兴趣的东西保持更新,一般是通过RSS订阅相关的博客,并通过社交媒体获取一些零碎的信息。就个人而言,我不认为其他语言是威胁。多语言的存在是因为每个人都有不同的偏好和对什么是最好的看法。像RISC-V和WASM这样的其他架构代表了将.NET的力量带到一个新领域的机会,而其他语言则代表了.NET扩展其互操作支持的机会,因此用户可以为每项工作选择合适的工具,并且仍然可以建立一个工作和凝聚的程序,即使该程序只有一部分需要.NET。

.NET团队中的工程师的平均任期很高。这有什么诱惑力?

Kunal我看到编译器团队的人呆了很久,只是因为他们喜欢这个领域,而且每天都很有激情地接受挑战,解决困难的问题。

**Aditya:**我认为我们中的许多人来到.NET团队是因为有机会在有趣的技术领域工作,对现实世界有很大的影响。这些都是团队的真实情况,但也许更重要的是我们每天都能和伟大的人一起工作。

**坦纳。**虽然我只做了6年的FTE(全职员工),但在此之前我作为供应商在.NET团队中又做了将近2-3年的工作(总共将近9年)。我自己的 "诱惑 "是,我可以在我热衷的领域工作,并对整个生态系统产生很大的影响,通常是间接的。我没有被强迫只在我的领域工作,我可以自由地深入到其他领域(甚至是JIT)。总体文化也是包容的,我从来没有因为感兴趣、提出问题或讨论我的观点而得到负面的反馈或不好的对待。无论我是和另一个 "入门级 "同事,还是和一个负责人,甚至是一个建筑师交谈,这都是真实的。

结案

毅力、好奇心和对改进(包括自己和产品)的渴望,是在几乎任何领域,技术、艺术或其他领域取得成功的关键因素。在许多情况下,我们寻求的答案是已知的,只是需要适应.NET和.NET开发者的特殊需要。在更多的情况下,答案是未知的或模糊的,这时,这些个性特征就会真正发挥作用。在团队中,我们很容易看到这种情况每天都在发生。

感谢Thays, Tanner, Rainer, Maryam, Maoni, Kunal, Jose, Jeremy, Elinor, 和Aditya分享他们对学习和开发技能的见解。

The postConversation about skills and learningappeared first on.NET Blog.