关于软件工程他们没有教你的事情

本文最后更新于:2023年1月13日 晚上

转载并翻译自Things they didn’t teach you about Software Engineering (vadimkravcenko.com),侵权立删。

关于软件工程他们没有教你的事情

与往常一样,由于这篇文章充满主观性,在开始之前我们先来个免责声明。无论您是经验丰富的专业人士还是刚刚踏足该领域的新人,我都希望这些见解将提供有价值的观点。

自 2022 年年中以来,我一直在考虑写这篇文章——但我担心写的不够全面。所以在过去的一年里,我一直在收集想法并把它们写下来,现在我有足够的观点可以与你分享。

你很少从头开始写东西

在大学里,他们教你如何编写一个 400 行的程序来解决从 A-Z 的问题。你有一张空白的画布,你可以炫耀你对那些花哨算法的了解,以找到一种生成迷宫的方法。最后,你有一个很好的解决方案来解决一个简单的问题。

听起来这就是真实世界,对吧?但事实并非如此。在现实工作中,您会面临成千上万行的代码库(屎山),并且您会情不自禁地想知道您的同事在编写这些奇异的代码时吸的到底是什么烟。您会在文档和更了解代码库的大佬之间来回穿梭。在一周结束的时候,你写了十行代码来修复一些 bug,然后不断重复这个循环,直到有人来找你解释为什么你要这样写。

开发人员的日常生活 来源: xkcd

领域知识比您的编码技能更重要

令我惊讶的是,当你理解了它如何运作的基本原则,更重要的是,为什么它需要运作时,编写他们的业务代码是多么容易。

在开发移动银行应用程序时,您最好了解交易是如何进行的、资金是如何进行结算的、账簿是如何进行的等等。

在为餐厅开发销售网点系统时,您最好弄清楚服务员是如何工作的,如何在烹饪中管理存货清单,以及信用卡授权是如何进行的。基本上,这个领域的来龙去脉就是你的软件的业务逻辑所在。

为医学、物流和记账领域开发软件也是如此。

没有这些知识,个人可能很难做出有意义的贡献,并且可能对他们的雇主没有那么有价值。例如,如果您有开发银行应用程序的经验,那么您更有可能找到另一份金融工作,因为您已经熟悉该领域。

编写文档没有得到足够的强调

大学通常为学生提供软件开发职业所需的基本技术技能,例如算法和数据结构。但是,他们通常不会优先考虑编写整洁的、文档齐全且可维护的代码。

这就是我们保存文档的房间

通常只有在处理其他人编写的代码,经历尝试理解和修改它的痛苦之后,开发人员才开始意识到编写可维护代码的重要性。哦,天哪,当我现在看到详略得当的文档时,我是多么高兴。这一般不是在课堂环境中学习到的,而是有过因为好的文档和易于理解的代码节省了时间和精力的实际经历才学习到。

业务价值高于代码本身

没有人会走过来对你说,“哦,哇,那行代码写的真好,太棒了!”他们只会说,“用户对你写的功能很满意”,或者“你的代码毁了整个网站”,这取决于你的运气。

虽然这听起来令人惊讶,但软件工程师工作的主要目标不是编写代码,而是通过使用开发的软件创造价值。代码只是实现此最终目标的工具。代码 -> 软件 -> 业务价值。

你写的软件需要满足社会上的一些需求——一些方便用户使用的工具,一些降低成本的自动化程序,人们会费时费力的事情。我们可以简化它。如果你用不成熟的技术开发了一些东西,但是为用户提供了巨大的价值——那么你已经实现了你作为软件工程师的价值。如果你用高深的技术开发了一些东西,但是为用户提供了很糟糕的体验——你就没有。

优雅的代码、充分的实践、智能的解决方案、设计模式——这些都是为了你的软件工程师同事,他们将在你之后处理代码库,而不是帮助你实现带来价值的目的。(请注意,带来价值也可能意味着构建一个不会崩溃的可扩展解决方案,这需要代码至少在某种程度上还不错。)

你需要和无能的人一起工作

在你互动的大多数工作环境中,都会有不称职的人。他可能不是你的经理;它可以是为您提供 API 的合作伙伴公司的经理,也可以是甲方的一些高管。

这处理起来非常令人懊恼和疲惫。他们创造了一个有害且低效的工作环境。他们需要很长时间才能做出决策或做出对团队和项目产生负面影响的糟糕决策。这会导致不断的延误和返工,浪费宝贵的时间和资源。

我花了相当多的时间找出有效的方法来对待无能之辈,而不是成为他们那样令人讨厌的人。我认为这是一项绝对应该在大学里教授的技能。

来源: Dataedo

我发现一种有效的方法就是不管别人怎么想,专注于自己的工作效率。我试图找到可能更有效的解决方案/替代方案来摆脱无能的人。记录一切也很有帮助。这可以提供具体的证据,证明他们的无能对工作流程的影响。

归根结底,对待无能者的最好方法是积极主动,并找到解决其局限性的方法。这可能涉及:

  1. 寻求其他资源或支持。
  2. 想方设法将任务委派给更有能力的人。其他人可以做需要做的事情吗?
  3. 实施故障保险和回退机制,避免东西在您这边损坏。
  4. 与该人设定 1:1,告诉他们他们正在阻碍这个工作进程。
  5. 再说一遍——不要同流合污。

你大部分时间都在不确定性中工作

与人打交道很难。处理不确定性也很难。与不确定的人打交道更难。这就是你作为软件开发人员要做的事情。

人们并不总是知道他们想要什么,有时他们没有意识到一个简单的改变可能非常复杂——“哦,你的意思是我们不能只是改变支付提供商?信用卡也要这样处理,对吧?

他们在大学里告诉你的一个大谎言是,你的项目经理会给你合适的、结构清晰的、简单的说明,告诉你需要做什么,然后你再编写代码。“绘制Mandelbrot(一种可以无限循环放大的程序)”或“使用环境光遮蔽渲染钢网”。在一天结束时,你解决了它们,你和你的经理击掌,然后微笑着回家。

实际发生的事情是,您的上司会向您简要概述任务“我们需要一些东西,将我们从 A 点带到 B 点,但我们还没有任何设计,第三方集成不会交付,除非我们告诉他们我们想要什么,老板 X 希望它是红色的,Y 老板希望它是绿色的。这就是软件工程师的“真正工作”开始的地方——收集需求,弄清楚需要做什么。

需求收集并不是编程中容易的部分。这并不像编写代码那么有趣。但是,作为一名程序员,这需要你花费大量的时间,因为它需要与人合作,而不是机器——打电话给提供第三方集成的机构,并与他们的开发人员聊天,以了解什么是可行的,什么是不可行的。与股东坐下来告诉他们,他们的想法没有意义,我们可以这样做,而不是那样做。

在任务上编写第一行代码可能需要数周时间。你弄清楚需求,然后你弄清楚它需要达成什么样的目标,然后你弄清楚它需要如何开发,然后你弄清楚它可能出错的地方,然后你写下你的第一行。

始终假设一切都有bug

很多开发人员对信任有一些普遍的错觉:

  1. 你很少完全信任你的代码,因为你知道你只是人类,可能会犯错误。
  2. 您使用的第三方库可能包含错误,但它们是由比您更有能力的人编写的,对吧?
  3. 标准操作系统库不应该有任何错误,对吧?它们是由更聪明的人编写的。
  4. CPU/硬件永远不会出现故障,对吧?他们花了数年时间研发这个东西;它不应该坏掉吧。
  5. 电力应该始终存在,是吧。

但事实是——我们永远无法完全确定我们的代码、库甚至硬件不会在某个时候出现故障;相反,我们需要假设它会。再聪明的人也只是人。

如果您查看任何流行库(操作系统或应用程序级别)的 GitHub issue,您将看到大量未阐明的行为等待修复。我的上帝,我的 Linux 机器因分段错误而崩溃了多少次?太疯狂了。

通过假设一切都可能中断并出现错误,我们可以采取措施防止或减轻潜在问题,这最终有助于确保我们系统的可靠性和稳定性。

这不是一份梦寐以求的工作

无论您的大学或培训班告诉您一旦开始从事 IT 工作,您将拥有什么美好的生活,这都只不过是一张空头支票。

  • 这是艰苦的工作。您一天中的大部分时间都坐在电脑后面。
  • 很难将工作与生活平衡。在其他职业中,您的工作日于 18:00 结束,然后将工作抛之脑后。但是这里不同,即使在晚上,您也很可能长期在线并检查代码。
  • 你很少在开发你喜欢的东西。通常情况下,你面对的是乏味的工作。
  • 职业发展机会有限。即使你是一个表现最好的人,可能也没有空间让你在公司里晋升。
  • 压抑的环境、交付日期、bug和满足客户期望的压力都会使你血压升高。
  • 远程工作可能有孤独感。根据公司和团队结构的不同,软件工程师可能会长时间单独工作(不包括视频通话),导致缺乏真正的社交互动。
  • 工作保障有限。随着技术的不断发展,软件工程师可能会面临被更新、更高效的技术所取代的风险。

美学是无法培养的

大学课程教我们优秀代码的基础知识,但软件开发中真正的美学不能在课堂上教授。

软件开发中的美学是指代码的整体观感。这关乎可读性、易于理解和维护的难易程度。美观的代码整洁简练、条理清晰,并且逻辑分明。好的代码让人拍案叫绝,坏的代码让人心生厌恶。

不幸的是,美学不是一个学期的课程中就能教会的。它是通过经历和阅读大量优秀代码以及维护糟糕代码获得的。

即使您不想给出评估,也会被询问

经理们喜欢数字、估算,以及在餐巾纸上写一个想法来询问估算。这就是现实世界的运作方式——企业有一些金钱目标,但在承诺之前,他们需要了解它将花费多少。

在大学里很难教这个,因为准确性在很大程度上取决于你在开发系统方面的经验。多年来您解决的问题越多样化,就越容易评估未来的工作。

来源: dilbert

我不打算讨论进行评估的最佳方式;有几十种方法可以做到。但我要说的是,估算是企业唯一能够理解的事情。如果你开始谈论“我们有长期规划,但我不知道我们什么时候会完成”,那么企业很难在这样的情况下生存。

Mindnow,我们通常对整个项目进行粗略估计,以衡量需要分配多少预算ーー这是长期优先事项。之后,我们从基于快速评估的计划开始,整个团队讨论、确定优先级并承诺——短期交付成果,使我们更接近长期目标。

并非所有会议都是糟糕的

如此看来,软件工程师的工作不仅仅是编程,那么时间会花在什么上呢?会议。

会议确保一切顺利和按计划进行。他们围绕一个共同的目标协调人们,让每个人都走上正轨。市场营销部门知道正在开发某些内容,他们可以为该功能的最终发布做准备。项目经理可以观察到开发人员的工作方向,并在需要时进行轻微的路线修正。客户支持带来最新的客户需求。质量保证部门分享他们的调查结果和找到的问题。管理层与股东分享最新资讯。

这一切都是相互关联的,会议是共享信息的地方。作为软件工程师,您要对这种共享信息的某些部分负责,因此阻碍它是不负责任的。您可能不喜欢它,但必须共享信息才能使系统保持高效。

总结

如果您正在考虑从事软件工程职业,请准备好直面这些事实,并拥抱成长的机会。你不太可能对世界产生有意义的改变,归根结底,这只是一份工作,你可以通过其他方式做出有意义的贡献。

最重要的是——记得开心。

我敢肯定还有更多我没有提到的宝贵观点,请自由地在评论区留言。


关于软件工程他们没有教你的事情
http://yorick.love/2023/01/12/career/things-they-didnt-teach-you/
作者
Yorick
发布于
2023年1月12日
许可协议