程序员最重要的非编程技能
关于“软技能”的命名
关于“同理心”
关于社区参与
综上所述
当我思考自己想和什么样的程序员一起工作时,我更多地考虑非技术技能,而不是技术技能,因为这些技能能够让一个人成为优秀的同事。事实上,本文中提到的所有技能都有助于编写优秀的代码,从而改进技术项目。其中大多数技能对编程以外的职业也非常有帮助,但我将重点讨论为什么它们对程序员尤其有用。
共情
要打造一款优秀的产品,你必须设身处地为用户着想。他们会如何使用你的产品?哪些功能对他们有帮助?你的程序如何帮助他们或改善他们的生活?反过来说,它又会如何伤害他们或对他们的生活产生负面影响?你的应用程序的伦理道德隐患是什么?
同理心对于你的程序的许多部分都至关重要——如果它们不安全,你的用户信息可能会被第三方恶意利用。如果它们无法访问,那么你就限制了可以使用你项目的人数。如果它们运行缓慢或需要大量带宽才能运行,那么用户就会离开,而网速慢的地区的用户或移动用户将无法运行它们。似乎每天都会有一篇文章报道某家公司实施的有害算法,比如YouTube算法激化了另类右翼,亚马逊创建了性别歧视的招聘算法(他们最终没有使用),或者人工智能对黑人女性进行了性别歧视。编写代码时,请考虑每个人!
此外,同理心对于团队成员和导师都很有帮助。设身处地为你的经理或其他开发人员着想。他们为什么做出这样的决定?你能做些什么来帮助他们?拥有同理心无疑会提升你成为高效团队成员的能力。如果你是雇主,展现同理心,就能让员工留任更长时间,他们也会成为更高效的员工。(src)
对其他程序员要有耐心,尤其是那些正在学习新知识的程序员。回想一下你曾经学过哪些非常难的东西,以及当时的感受。他们可能也有类似的感受。对他们粗鲁无礼、贬低他们的进步或吹毛求疵只会适得其反,让他们的学习过程更加艰难。
你的言行举止会产生真正的后果——你可以利用这些后果来促成积极的改变,也可以伤害他人。这不仅限于面对面的交流——在线交流也同样重要。你可能以为自己只是在开玩笑,或者只是在发泄情绪,但实际上你可能对某人的生活造成了非常负面的影响。如果你伤害了某人,你该如何行动,以及如何道歉来弥补部分伤害,这些都取决于你。
解决问题
当我教别人编程时,我看到很多人在解决问题上比在编程本身上遇到的困难要多得多。将一个问题分解成几个小问题,然后解决所有这些小问题的能力需要大量的练习。掌握解决问题的能力可以帮助你成为一名更优秀的程序员。
此外,大多数问题都有不止一个解决方案。作为软件开发人员,我们的很大一部分工作就是仔细思考这些不同的解决方案,并选择最佳方案。哪个方案实施起来更快?运行效率更高?还是成本更低?所有这些都是重要的问题,而选择正确的解决方案是软件开发中一个充满挑战但又至关重要的部分。
合作
作为一名程序员,你很可能会与其他人合作。即使你是自由职业者或企业家,你也需要与其他开发人员、商务人士、经理、开源贡献者、利益相关者以及无数其他人合作。学习如何与不同的人以及他们的性格良好地合作至关重要。
促成良好合作的因素有很多。首先,要明白一个人不可能包办所有事情,或者至少不可能把所有事情都做好。不同的人拥有不同的技能、观点和生活经历,这些结合在一起比单打独斗更有力量。不要觉得你总是需要“背负团队重担”,或者满足所有人的需求。如果你允许其他人也参与进来,你会做得更好。
向他人寻求帮助,并乐于助人。你无需事事精通,不同的人擅长的领域也不同。要依靠他人,如果遇到困难,一定要主动寻求帮助,这样才不会卡壳太久。当有人向你寻求帮助时,要乐于助人。清晰地解释问题可以让你学到很多东西,并且能够巩固你对相关主题的理解。如果你身处管理岗位,一定要给予他人时间进行指导和有效合作!
同样,不要打断别人说话,也不要立即否定他们的观点。如果他们的意见不被重视或采纳,他们将来可能就不太可能做出贡献。当人们分享想法时,要积极倾听——与其在他们说话时思考你的回应或为什么你的想法更好,不如试着思考为什么他们的方法也很好,或者如何实施。
然后,一旦你实施了他们出色的想法,就要给予他们相应的认可。没有什么比我的想法被团队里的其他人忽视、低估和不认可更让我效率低下的事情了。
沟通
与他人合作时,无论对方是同事、客户、使用你项目的人、经理还是你管理的人,良好的沟通都至关重要。要诚实地汇报进展情况、项目现状以及你对事情的看法,并且要诚实而友善。如果你态度粗鲁或缺乏建设性,人们就不太容易接受反馈。但是,如果你不诚实或粉饰事实,那么你可能看不到积极的改变。这其中肯定存在一个微妙的界限。
我身边就有这么一个真实的例子:有人读了我的一篇博文,然后写了一封很长的信,说我说话的语气听起来很蠢。我通常会在文章里用很多感叹号,尽量让语气听起来更激动人心——我这样做是有意为之,目的是让那些可能令人生畏或无聊的话题变得更有趣。这封邮件里,这个人的性别歧视色彩很浓,说了一些很伤人的话。话虽如此,我或许可以少用一些感叹号,但仍然可以让人们对编程感到兴奋。如果对方能用更有建设性的语气来表达批评,我会更容易接受他的观点。
如果事情进展不顺利,一定要说出来。坦诚地说出需要推迟截止日期,或者工作中有些事情进展不顺利。如果你敢于说出来,你将更有可能改变现状,并为自己创造更好的环境。
包容性
我曾经在一个夏令营担任攀岩教练和辅导员,我接触最多的是初中女生。她们是我接触过的最喜爱的人群之一,但话说回来,初中生通常不太能接受差异,也不太抗拒小圈子。我们曾经玩过一个游戏:一开始大家围成一个大圈,然后一位辅导员会告诉大家他们“出圈了”,根据一些他们不了解且无法控制的特征,他们必须离开游戏。仍然在圈内的人会玩游戏,而圈外的人则被排除在外,只能远远地观看。
这项活动非常有效地向这些女孩展示了因为无法控制的原因而被排除在外是什么感觉,我仍然经常回想起这件事。作为成年人,我们仍然会因为某些他们无法控制的特征而将他们排除在圈子之外或排斥他们,但如果我们让他们回到圈子里,允许他们做出贡献,那么我们的产品就会借鉴更多样化的经验,变得更好。有很多研究表明,更多样化的团队表现更好,但从个人的角度来看,想想被排除在圈子之外是什么感觉,并尝试扩大你的圈子,而不是缩小它。很有可能,你的很多用户都是传统上被排除在科技圈子之外的人。从我自己的经历来看,作为一个在编程生涯中大约 5% 的时间里与另一位女性在一个团队中工作的人,成为团队中唯一像你这样的人真的很难。
这也与同理心息息相关——确保你的程序面向各种各样的用户。而不仅仅是那些身体健全的人,或者那些拥有尖端互联网或技术的人。这样你就能接触到更多的人。
耐心
编程时,你首先需要耐心的人就是你自己。编程很难,有时会遇到 bug 或难以克服的问题。如果总是一帆风顺,那么你就没有挑战自己,作为一名程序员,你也无法成长。要有毅力,坚持解决问题,遇到困难时不放弃。但也要记住,你可以休息一会儿,过一会儿再回来处理这个问题。也许休息一下能帮助你更有效地解决问题,或者当你再次面对问题时,能以不同的视角看待它。
另外,对他人要有耐心。学习需要一段时间,人无完人。犯错和失败可能是学习过程中最重要的经历之一,所以要允许这种情况发生,而不是营造一个不安全的环境,不让冒险或成长。要明白,不同的人更容易接受不同的事物,学习需要一段时间。
创造力
作为一名程序员,我最喜欢的一点是,我可以运用我的创造力去创造一些东西,然后让其他人受益。你可以打破思维定式,创造出非常酷的东西。
拥有创意对于开发新功能、新界面和新应用至关重要。我为一家公司开发的产品很大程度上因为其富有创意的界面而获得了用户的许可,而我的作品集网站也因其创意而备受关注。
除此之外,很多问题都需要创造力才能解决。几乎每个编程问题都有不止一个解决方案,而想出创造性的解决方法通常能带来最优的解决方案。
谦逊
你可以从其他程序员身上学到很多东西——在代码的世界里,一个人不可能无所不知,甚至无所不能。要乐于接受建设性的批评,而不是采取防御性态度。你可以通过反馈来改进你的代码和自身,但固执己见并不能带来成长。你并非总是正确的,你应该乐于接受别人的想法。
信心
另一方面,也要保持自信。我承认,作为一个有“冒名顶替综合症”的人,这对我来说可能是最难的一点,而且在我的职业生涯中,每次绩效评估中,我都把改进作为首要任务。我可以(而且很可能会)就这个话题写一整篇博客文章,但相信自己并对自己的能力充满信心真的很重要。
首先,要对自己能够承担的项目充满信心。不要把自己交给比较容易的项目,也不要因为接到困难的任务而怀疑自己。尽量多解决问题,然后寻求帮助来克服最困难的部分。
另外,不要觉得有必要把所有东西都研究一遍。相信自己在谷歌搜索答案之前,先尝试一些方法。或者,谷歌搜索问题的一部分,而不是全部。在开发过程中尝试一些方法,看看它们是否有效,对你没有任何坏处。你可能会惊讶于自己掌握的知识量。
我做的另一件事是记录我的成功。我的电脑里有一个文档,里面记录着我做过的很酷的事情,以及人们对我的赞美。每当我遇到困难或对自己产生怀疑时,我就会回顾它,通常这样我就会对自己正在做的事情更有信心。
适应性
编程仍然是一个崭新的世界,它正在飞速发展。能够适应变化至关重要。当一个新的框架、库或语言出现并占据主导地位时,能够学习它至关重要(当然是在合理范围内)。如果我们仍然用 Fortran 编写代码,我们的行业将会截然不同;我们需要能够不断发展并适应变化。
此外,项目的目标和功能经常会发生变化,尤其是在客户工作方面。当这种情况发生时,我们必须调整并融入这些要求(同样,在合理范围内)。
社区参与
社区对于编程至关重要——会议、博客文章、社交媒体和聚会对于学习和成长至关重要。此外,开源软件及其周边社区是这个行业的命脉。能够与人建立联系,对于学习、分享经验以及寻找新机会至关重要。
即使你性格内向或不爱面对面社交,也有很多很棒的在线社区可以让你学到很多东西。即使在公司内部,拥有一个凝聚力强的团队也能帮助人们更好地合作。
结论
这些技能通常被称为“软技能”,但我觉得这种说法过于简单了。这些技能对编写代码和成为一名优秀的同事都有很大帮助。它们比了解一门特定的语言、库或框架重要得多,甚至在技术领域之外也发挥着重要作用。
所有这些技能对于程序员和普通人来说都至关重要。话虽如此,没有人是完美的,每个人都有成长的空间。所以,请继续成长,努力在这些非编程技能上一点一点进步,我也会的!