打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
软件工程师的软实力
userphoto

2023.08.12 北京

关注
Software Engineering - The Soft Parts 是一本关于软件工程的免费书籍,作者@addyosmani,专注于探讨软件工程中的”软性”方面。这本书里介绍的软件工程师需要具备的软技能,例如沟通、协作、领导能力等,以及关于团队合作、项目管理、需求分析、用户体验设计等方面的指导和实践经验,对于软件工程之外其他领域的普通人和团队也有极好的借鉴意义。

学习新事物

第一性原理

在能够的时候尽量应用第一性原理。第一性原理是指通过从最基本的事实和基础原理出发,以逻辑推理和分析的方式进行思考和决策的方法。它涉及到将问题归结为最基本的元素或概念,并建立在这些元素或概念上构建推理链条和解决方案。使用第一性原理的方法,可以避免依赖传统的经验、常识或惯例,从而打开创造性思维和解决问题的新途径。

拆解问题

学会将问题拆解成较小的部分是生活中最重要的技能之一。通过将问题分解为更小的子问题,可以更清楚地理解每个子问题的本质和要求,并逐步解决它们。这种分解过程有助于提供清晰的指导和方向,使我们能够更系统地处理问题,并逐步逼近最终的解决方案。将问题拆解成较小的部分还可以带来以下好处:
  • 提高工作效率:小的任务更易于管理和完成,可以更快地推进工作进展。

  • 减少压力和焦虑:庞大的问题可能令人望而却步,而将其分解为小任务可以减轻心理负担,并让我们感到更有成就感。

  • 精确规划和资源分配:通过对问题进行细分,我们可以更加准确地规划工作流程和合理分配资源,从而更好地利用时间和能力。

熟练掌握的作用(Mastery)

对某项技能的数量掌握可以提高价值/时间比。技术掌握意味着价值交付与工作小时之间的高比率。熟练掌握还可以使你专注于最重要的事情。工作中通常会有很多任务可以填满你的时间,让你“感觉”自己很忙,但只有专注于重要的事情才产生价值,经常问自己以下三个问题:
  • 我的目标是什么?

  • 我关注的任务是否与这些目标吻合?

  • 是否有不同或更好的方法来完成任务?

批判性思考和形成合理的论证

批判性思考(Critical Thinking)是指通过有目的、自觉和系统地分析、评估和推理来解决问题和做出决策的思维过程。它涉及到对信息进行深入思考,而不仅仅接受表面上的表述或传统惯例。通过批判性思维,我们能够独立思考、挑战现有的观点和假设,并以理性和逻辑为基础做出明智的选择。批判性思考帮助你关注最根本的问题。一些基于批判性思考提出的问题有:
  • 正确/根本的的问题是什么?

  • 解决问题正确的方式是什么?

  • 问题产生的根本原因是什么?

  • 如何拆分关键问题?

  • 在有多个假设后如何对多个假设进行评估?

  • 在已有约束条件下如何找到完成任务的捷径而不影响分析的严谨性?

  • 证据是否充分?

  • 如何知道何时完成?

  • 如何向所有利益相关者清晰而逻辑地传达解决方案?

思考的常见误区是将相关性错认为因果关系。如日出之前公鸡会打鸣儿,但并不是打鸣儿的公鸡导致了日出。相关性只描述了变量之间的统计关系,例如它们可能同时增加或减少。然而,相关性无法证明其中的因果关系,即一个变量的变化是否直接导致了另一个变量的变化。
一般基于批判性思维解决问题的过程如下:
  • 清晰准确地描述问题。

  • 收集和评估信息,验证与问题的关系。

  • 得出有理有据的结论和方案,并采用相关标准进行测试。

  • 对其他解决问题的选择持开放性思维,并在必要时进行评估。

  • 在找到复杂问题的解决方案时保持有效沟通。

可转移的技能

通过学习基本原理,你可以获得技能和工具,然后可以忽略基本原理来实现增长。技能包括宏观层面与微观层面:
  • 宏观层面

    • 与具体语言无关

    • 数据结构

    • 算法

    • 框架

    • 性能优化

  • 微观层面

    • 变成语言,如C, Python, Java, …

    • 框架

    • 后端

效率

掌握基本原理使你能编写更高效的代码。

更好的决策

对宏观和微观层面有良好的理解可以帮助你做出更好的决策。
“只有当你明白什么时候不应该使用一种工具,你才算掌握了它。” - @kelseyhightower

关注用户,其余的自然会随之而来

以客户为先

史蒂夫·乔布斯曾说过,”你必须从客户体验出发,逆向思考技术。不能从技术开始,然后再试图找出如何销售它。” 应该关注我们正在为谁构建产品,他们遇到了什么问题,目前的选择存在哪些不足之处。
要对用户充满同理心,最好的软件是由那些对用户有同理心的工程师所构建的。要成为正在进行的项目的行业内专家,如果有机会与最终用户直接互动,试着更好地理解他们的需求和痛点。

持续提升你的技能

但记住技巧为目的服务。虽然知道使用什么很重要,但你的主要目标是交付一个优秀的最终产品。可以利用新的练手项目来学习新技术,切切不要贸然在已有产品上使用新技术。
要梳理终身学习理念。保持好奇心,永不停止学习。
学习的最好办法是输出。写下你所学到的东西。这样做会促使你更好地理解所学的主题。有时候,当你试图向他人解释事物时,你才会意识到自己知识上的不足。没有人阅读你写的内容也没关系。仅仅通过写作,你就能获得很多收获。
养成学习新知识的习惯。每天花半个小时阅读一章教材,听技术播客、阅读开发博客或学习一门新的编程语言。

技能的广度和深度

考虑一下既精通多种技能又深入掌握某一项技能是否适合你。
做T 形工程师。这些工程师对一项或少数几项技能非常熟悉(T字的竖线部分),但对于构建和运行产品所需的许多其他技能都有基本的了解(T字的横线部分)。

在实践中学习

在学习一门新语言时,用它来构建一个实际的东西,以获得第一手经验。通过编写大量相关代码或从现有代码中学习,来积累经验。阅读别人的代码是很好的学习机会。
“软件的主要价值不在于所产生的代码,而在于产生代码的人所积累的知识”。

技术复杂性

通用代码与特定代码

代码开始总是为解决眼前面临的的问题编写,但要试着发现可以扩展为更通用的地方。
两个避免过渡复杂性的原则:
  1. YAGNI. YAGNI (You Aren’t Gonna Need It) 是一个软件开发原则,意味着在编写代码时不要添加不必要的功能或复杂性。根据 YAGNI 原则,只有当确实需要某个功能时才去实现它,而不是在预测未来可能需要的功能上浪费时间和资源。YAGNI 的核心思想是专注于当前的需求和问题,避免过度设计和冗余代码。通过遵循 YAGNI 原则,开发人员可以更加敏捷和高效地完成任务,减少不必要的工作量和复杂性。

  2. “Do the simplest thing that could possibly work” 是另一个软件开发原则,强调在解决问题时应采取最简单的可行方法。该原则的核心思想是,在面对问题或需求时,寻找并实施最简单、最直接的解决方案。而不是过度设计或实现复杂且不必要的功能。这个原则有以下几个关键点:简洁性:选择简单的解决方案,避免过度工程化和复杂性;可行性:确保所选择的方案能够满足问题的基本需求,并且能够正常运行;迭代性:通过快速实施最简单的解决方案,可以更快地获取反馈并进行改进。

深度模块

编写代码以解决其他开发人员的面临的复杂问题,同时通过清晰的接口暴露功能。这个想法体现在深度模块的概念中:“最好的模块是那些效益最大、成本最低的模块。模块的效益是指其功能,而模块的成本则取决于其接口。”

在新项目上学习

实验、创新、快速失败,以更好地解决问题。敏捷方法和快速失败原则可以帮助您以较少的资源尽早验证您的想法。

定义完成的标准

定义何为“完成”有助于节省时间,因为它可以帮助您估计所需的工作量,制定开发计划,并避免不必要的修订。

分阶段推出

一个大型发布可以分为一系列风险较低且易于理解的分阶段推出。通过迭代开发的分阶段发布可以帮助您更好地管理因显著的大规模变化而带来的风险。

系统性调试

调试时,您应该尝试系统而严谨地解决问题,以解决所有测试条件。如果机器告诉你出错之处,它很可能是正确的,不要试图进行小的编辑和不断重新运行,这样能更快地解决问题。
如果编写了一个抛出异常的解决方案,但没有仔细阅读异常信息,那么可能会浪费时间。通常情况下,错误或异常信息是对实际问题的重要提示。
(以后我一定仔细读任何出错信息,而不是一遍遍地重复运行,希望奇迹出现。)

沟通

设计文档的重要性

设计文档不应该是事后的补充,而是软件工程过程中的一部分。设计文档的编写和审查在软件工程中起着重要的作用。它们帮助团队成员共享和理解设计决策、约束和目标。设计文档有助于确保每个人都对项目的设计方向和功能需求有清晰的认识,并提供一个框架来指导开发工作。

文档过程

协调设计文档的审查,并将其与原始文档进行比较,以验证是否解决了所有相关的约束条件。设计文档的审查是为了确保其中包含了正确的信息、完整的设计方案和满足项目需求的解决方案。在审查过程中,团队成员可以提出问题、提供反馈和建议,并确保设计文档与最初的设计目标一致。

沟通

要谦虚、清晰地沟通,并尊重他人。善良是不需付出代价,但影响是无价的。 有人可能会说良好的沟通需要能量和思考。同情心,值得你付出更多
作为软件工程师,我们不仅仅是编写代码,还需要与团队成员、业务方和用户进行有效的沟通。良好的沟通可以帮助我们更好地理解需求、共享知识、解决问题和促进合作。

定制化沟通

与受众沟通中使用与他们相宜的语言、概念和详细程度。在与不同的受众群体进行沟通时,需要根据他们的背景和需求自定义沟通方式。与商务人士沟通时,要强调所做工作的业务影响,避免使用过于技术化的术语。对于工程管理层,要沟通技术上的影响或挑战。与决策者沟通时,描述可用选项及其影响和风险,而不是详细讲解选项的工作原理。在提供项目状态更新时,要了解已发生的其他事情以及您的更新与项目目标的相关性。

善良和考虑他人

善良是一种超能力——请善用它。
保持冷静、友善和乐于助人的态度比对别人无礼更有益处。善良是具有传染性的。你对别人的善意行为会使他们在未来更愿意提供帮助。
(想起看到的某个旅行者的推文,他在东欧骑行,看到在一个乡村餐馆柜台上有一行提示语:Be kind, or go away.)

大力称赞

积极肯定他人的工作。不要吝啬赞美。通过给予积极的反馈和肯定,可以增强团队成员的动力和信心,促进合作和团队精神。

拒绝的力量

说“不”比过度承诺更好。作为一名资深开发人员(或任何高效率的人),懂得说“不”很重要。人们可能会请求你超出你能够负担的时间范围。你可以委婉但坚决地说“不”,将人们引导到其他地方(委派任务),或者让他们与你的经理讨论是否可以分配更多的时间来帮助他们。
你不可能取悦所有人——在说“是”和“否”时要非常谨慎。

接受和尊重

承认自己不知道某些东西,并愿意寻求帮助,甚至向初级开发人员请教。作为一个团队,共同努力,相互学习和成长。没有人是无所不知的,承认自己的不足并寻求帮助是聪明而有益的。

信息共享

利用会议和问答环节来提出正确的问题,交流知识并告知团队。会议和问答环节是沟通和共享知识的重要机会。通过提出恰当的问题,团队成员可以更好地理解和探讨问题,从而促进团队的发展和解决问题的能力。

灵活性

Strong opinions weakly held。坚定地捍卫你的观点,但也要在有新证据与之相悖时对其进行审查。Strong opinions weakly held(坚定的观点,但保持灵活)是一种指导原则,强调在面对不确定性和新证据时保持开放和灵活。这个原则意味着我们可以有坚定的观点和信念,但同时也要持开放态度,愿意接受新的信息和证据,并根据它们来调整或改变我们的观点。
我们应该保持思维的灵活性,意味着我们愿意重新评估和审视我们的观点,并根据最新的信息做出调整。这种思维方式有助于避免固执己见和盲目坚持错误的观点。它鼓励我们保持谦虚和学习的态度,认识到我们可能会犯错,并且随时准备接受并适应新的观点和思考方式。Strong opinions weakly held 的核心目标是追求真理和持续成长。通过保持开放和灵活的心态,我们能够更好地适应变化并做出明智的决策。

记录维护

在非正式会议后发送友好的电子邮件,有助于重新强调讨论中的关键要点或承诺。在会议或讨论中,我们经常会讨论重要的问题、做出承诺或达成共识。为了确保这些内容不会被遗忘或误解,我们可以在会议结束后发送一封友好的电子邮件,将讨论的要点和承诺进行总结,并向与会人员确认和记录下来。这样可以帮助团队保持一致性,并提供一个便于参考的记录。

善意行事

了解何时保持沉默,观察周围所发生的事情。
在团队合作和决策过程中,善意行事非常重要。我们应该相信团队成员不会故意进行公开的恶意行为。当出现各种问题、意见分歧或决策时,我们应该保持善意,并意识到可能存在我们没有完全了解的信息或他人有不同的优先事项。在这种情况下,我们可以提出问题、陈述观点,但不要对最终决策感到愤怒或沮丧。

资深度

资深度与战略思维

面对不确定性时,不要放弃做出决策或行动。
资深的领导者是那些拓宽了视野,能够进行战略思考并为团队规划路线图的人。在软件工程中,我们经常面临不确定性和复杂的问题。在这种情况下,不能因为不确定而犹豫不决,而是要勇于做出决策和行动,并带领团队朝着既定的目标前进。

以身作则

教会团队自食其力。不总是为他们解决问题,而是温和地引导他们培养解决问题的技能。作为资深人士,应该带领团队成员发展和成长。在解决问题时,不是替他们解决,而是温和地指导他们培养解决问题的能力。
当别人提出解决方案时,你要运用批判性思维,提出相关问题。这样的行为鼓励团队成员深入思考和挑战他们的想法。你的问题可能会促使他们进一步思考问题的各个方面,从而帮助他们完善和改进自己的解决方案。

高效团队

提高效率

如果你试图完成更多任务,或者展现出在公司中更高级的能力,通过合作和指导他人来提高你的效率。展示这种行为不仅对自己有价值,也对团队其他成员有益。学会将思维方式从“我”转变为“我们”。

冒名顶替综合症

接受犯错、不知道答案或寻求指导是克服冒名顶替综合症的关键。即使别人把你视为值得向你请教的对象,你可能仍然感到像个冒牌货。你也许永远无法完全摆脱这种综合症,但它会促使你保持好奇心并学习新事物。

建立信任

信任可以使团队成员共同为共同目标而努力,而官僚主义会使之分裂。有效的团队合作只有在团队成员之间的沟通和关系良好的情况下才可能实现。

理解商业模式

了解变革的商业影响。很多软件工程师喜欢通过技术挑战来解决问题。但理解商业方面,并能提出成本效益高的解决方案可能更有意义。记住你的用户/客户也是在努力完成工作、度过一天或一周的人,就像你一样。试着不要让他们的生活变得更困难。

提高影响力

对商业和软件之间的关系有敏锐的洞察力,可以提高你的工作影响力。全面了解业务和产品,有助于你积极地为团队和项目做出贡献。如果你了解销售或市场部门的想法,你就能更好地做出正确的决策并产生高影响力的工作。

导师角色

指导他人

通过及时提供信息,建立导师的护栏,让学习者不会误入完全错误的方向,而是通过自己的实践获得技能的精通。导师的目标是引导人们自己发现答案,而不是提供现成的解决方案。要给他们提供寻找答案所需的工具。

组织内的导师

确保导师角色是资深工程师职责的一部分,这样当某人转移到另一个团队、职位或组织时,关键领域的知识仍然可以保留。

学员的角色

导师可以给你建议,但只有你自己能够主动行动并采取建议,来实现自己的职业发展和成长。

时间与工作和生活的平衡

优化你的日历以进行深度工作。深度工作是没有干扰的高度集中的工作,可以在很短的时间内创造很大的价值。每当你从一个任务切换到另一个任务时,你的注意力中仍会残留关于前一个任务的想法。这使得很难专注于真正重要的事情。有时候把特定的地点(比如办公桌、房间或建筑物)与特定类型的任务联系起来,可以有助于深度工作。
避免碎片的工作时间。当一小时的工作被分成几分钟的块状时间,因为干扰而打断,你会感到压力和沮丧。找出干扰的原因(无论是你自己还是他人),并予以解决。否则,你的一天就不会那么有效率。时间是有限的。不要试图寻找更多的时间,而是试着去消除不必要的任务。例如你不必知道每一个消息。实际上,Twitter、Reddit、Instagram等大部分社交媒体上的信息并不那么重要。相反,尝试切换到新闻摘要视图或者设置查看频率的限制。
最好能主动避免精疲力竭,学会说不,知道何时停止,并安排工作之间的休息时间。过度工作不是好的职业道德的一部分。成功来自许多因素,而不仅仅是过度工作。没有休息和良好的工作与生活平衡,你或你的团队可能会疲惫不堪。鼓励自己和团队进行休息、假期和度假。记住,你的健康和家庭是最重要的。
不断试图超越你的标准是不现实的。知足常乐能树立一个良好的榜样。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
职场的63种能力,一定要看呀……
研究98位1000万富翁,发现“吸金体质”都有这30个习惯
提高团队绩效的三步骤:一分钟经理人
每个程序员都应该成为架构师 – 码农网
【企业管理】紧急和重要,从来都是两码事
《深度管理》突破管理困境的25条黄金法则是哪25条呢?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服