写代码是一回事,学习成为一名软件工程师是另一回事 - thehosk


学校是一回事;教育是另一回事  — Austin Kleon

只有当你通过考试并定期驾驶时,你才能真正学会驾驶汽车。作为一个熟练的司机,不仅仅是能够驾驶汽车而不撞车,知道理论知识。需要能够驾驭你在道路上遇到的所有情况和场景,并处理道路上所有疯狂的疯子。
作为一名软件开发人员,创造软件就像驾驶汽车一样,但要比汽车复杂一千倍,而且有两倍的疯子。

软件是开发者所创造的,技能、经验和知识是开发者所得到的。软件开发技能是你建立高质量软件和交付软件项目的方式。
做好开发者的工作,创造软件是一回事,但要在职业生涯中取得进展,你需要学习软件开发的基础知识。

开发人员的教育不仅仅是写代码。你写的代码,技术技能并不是职业生涯的坚实基础,因为在5/10年的时间里,你会需要不同的技术技能。
你创造了项目所需的软件,因为这是客户和你工作的公司所支付的东西。

  1. 一个开发人员的价值是基于他们的技能、知识和经验;
  2. 一个开发人员还需要确保他们正在学习、改进并成为一个更好的软件开发人员。

理想情况下,你会同时做这两件事,但这并不总是可能的。
当你觉得作为一个开发者太舒服时,是时候考虑转向新的东西了。

软件开发是一项你永远无法掌握的技能
软件开发人员始终是软件开发的学生,每当你认为自己知道自己在做什么时,它就会打你的脸。
好的开发者是谦虚的,因为软件开发用令人尴尬的错误粉碎了过度自信。
你无法避免错误、问题和灾难。
因此,你需要谦虚地承认错误,需要一个团队来帮助你发现和解决这些问题。

当你开始做一名开发人员时,你专注于创建代码以满足需求。
我曾经认为,作为一个开发人员,只是写代码。
软件开发还有很多其他方面,从设计、架构、单元测试到DevOps和ALM;收集需求,明确假设。
有许多最佳实践,如SOLID原则,DRY(不要重复自己),KISS和其他。
最佳实践和基本技能有长期的好处。这使得初级开发人员很难理解,因为没有短期的好处。

命名好的代码,设计成容易测试的,不是第一版代码。
这些好代码所做的不仅仅能工作起作用,它还是为了便于阅读、理解和修改而建立的。

我曾在遗留代码中工作,其中有一个2000行的方法。这个方法就像一个状态机,控制着案例的状态。这是一个改变的噩梦,因为如果你改变了一行,它可能会破坏下面的任何代码。

一个改变可能会影响到100多行的代码,而且几乎不可能进行测试。
一个简单的代码修改可能需要一个星期的时间来完成和测试。

经验是有价值的,因为通过与坏的代码打交道并看到它所造成的问题,它可以激励你在未来不犯这些错误。

坚实的基础
每个软件项目都为独特的要求创造独特的软件。它建立在软件工程的基础上。优质的开发是通过良好的流程、最佳实践、DevOps、代码审查完成的。
你需要确保你的最佳实践没有过时,并对更新它们持开放态度。会有新的工具、软件和技术,需要你更新最佳实践。
首席开发人员需要对软件开发过程的每个方面都有一个愿景。你需要谦虚,对更新你的开发流程持开放态度。

基本的软件工程技能
技术在变,但软件开发不变
技术随着新的语言、服务、工具和最佳实践而发展。
开发人员需要掌握一些基本的软件工程技能,这些技能无论在什么技术上都是有用的。

  • 命名(是简单和可读代码的关键)
  • 设计代码(设计简单,不复杂)
  • 设计模式
  • 单元测试
  • DevOps
  • 软技能
  • 文档
  • 开发的最佳实践
  • 敏捷开发
  • 错误修复

这些核心技能是软件开发的基础。如果你不知道好的代码是什么样子的,也不明白为什么它是好的,你就无法写出好的代码。反过来说,你需要知道坏的代码是什么样子的,这样你就能负担得起,并理解为什么这个代码是坏的。
如果没有人指导,或者没有意识到这些代码会造成未来的问题,初级开发人员就不会停止编写低质量的代码。坏的代码现在可以工作,但在未来会产生问题。坏的代码就像错误。如果你不承认自己犯了错误,你就无法避免错误的发生。
牛仔开发人员不了解软件开发的最佳实践或好处。如果你不理解一种方法的好处,你就不会使用它。

经验并不都是有价值的
使用你已经拥有的技能和知识从事软件项目,就像在跑步机上跑步。你付出了很多努力,但却没有任何进展。
在你已经掌握的技能上获得的经验价值有限,因为它在你的简历上为该技能增加了更多时间。
有价值的经验是在新鲜的环境中学习新的知识和技能,你可以把它带到未来的项目中。

要有好奇心--尽可能多地学习
优秀的开发人员要学会理解,而不仅仅是创造软件。理解可以帮助你在未来创建软件,避免问题,并对软件开发的工作方式有更好的理解。
作为一个软件开发者,你可以对自己和你的教育做最好的投资。在软件开发之外的学习将使你更好地进行软件开发,因为很多软件开发是与人一起解决问题的。

"每一天都要努力成为比你醒来时更有智慧的人。忠实地履行你的职责,并做好。你会有系统地取得进步,但不一定是快速突飞猛进。然而,你要通过为快速冲刺做准备来培养纪律性。日复一日,一寸一寸地努力。在一天结束时--如果你活得足够长--大多数人都会得到他们应得的东西。" 查理-芒格

作为一个软件开发人员,你要每天少吸一点,减少错误,用坏代码换取好代码。作为一个软件开发人员,每天都要有进步,那么随着你的技能、知识和经验的增长,生活会变得更容易。

软技能
软件开发是一项团队运动,所以你越能有效地与其他人类沟通和工作,就越好。
在创建软件时,所有的大问题都是由人引起的,并由人解决。
有效的沟通、说服和协作是值得投资的核心技能。

我曾经在一个我是Scrum主管的团队中展示过演示和进展。我的scrum团队工作出色,进展顺利,但客户对这个团队或我并不放心。
我从一位经理那里得到了一些反馈,他解释说我用错误和负面信息来引导,而把正面的东西留到最后。这就像用扩音器讲坏消息,低声讲好消息。这给人的感觉是我和团队没有做好工作。

感知就是现实。

从那时起,我在演讲、沟通方面做了很多工作。你没有很长的时间来沟通,你需要让它发挥作用。
所有项目、晋升和其他重要决定都是由人作出的。你需要建立关系并影响他们。

Reddit网友评论
1. 有趣的是,这个事实就是为什么即使是最好的学生程序员在进入专业环境之前也很难掌握对框架和工具的需求。

我记得我在学校里试图学习Spring,以便在实习前对它有所了解。我可以很好地跟着教程走,而且我很喜欢那些让rest apis更容易的web功能,但是整个依赖注入/应用上下文的事情对于一个刚刚自己建立项目的人来说并没有什么意义。

直到我开始看到生产级的Spring Boot微服务,标准框架的好处才变得明显。

Git也是如此。我在学校里用过它,并认为自己了解它,但现在我对版本管理的理解更加深刻了。


2. 我听到的最好的区别是,"软件工程是随着时间的推移而进行的编程"。当你第一次实现某些功能时,任何实现都可以。然而,当你随着时间的推移维护和扩展程序时,更合适的实现方式将促进你的变化和维护。这就是好的工程开始显现的地方。


3. 我维护的代码越多,我就越不相信这一点,或者至少是对它的通常理解。
通常情况下,这被理解为。

  • 灵活性。
  • 适用于未来。
  • 可配置性。

而每次我看到只做一件事的哑巴代码时,维护、扩展甚至重写它都比扩展灵活的、面向未来的可配置代码容易。
正因为如此,我倾向于认为交流和可读性要重要得多得多。
一般来说,这是因为人们把代码抽象得太远,最后实现得很差。所以你最终得到了一个超级低级的接口,如果你改变它,就会破坏整个应用程序,所以你不得不在抽象中埋下一个随机的if()变化。
  • 可读性
  • 可删减性

其他都是这些的下游。

Readability is king. 可读性为王