5g对嵌入式软件工程师
It took time to build the desk setup visible in the picture above. Quite similar to how I have developed as a software engineer in the last 5 years. It took patience and hard work to grow and work with various organizations. I have been part of a wide spectrum of projects and technologies along the way and have recently completed 5 years.
这需要时间来建立台安装在上面的图片中可见。 与过去五年我作为软件工程师的发展非常相似。 与各种组织一起成长和合作需要耐心和辛勤的工作。 我参与了一系列项目和技术,最近完成了5年。
Notice that I am using the term “Software Engineer” and not “Software Developer”. According to Udacity, there is a strong separation:
请注意,我使用的是术语“ 软件工程师”,而不是“ 软件开发商” 。 根据Udacity ,有很强的分离:
“T
“ T
Abiding by the above definition, I call myself a software engineer. In essence, it does not matter so much. All of these roles have loose definitions which for some reason is quite fascinating to me. But the kind of work that I have done and continue to do resonates well with a software engineer. I thought it might be good to take a break and reflect on some of the main lessons I’ve learned in that time that continue to benefit me today.
遵守以上定义,我称自己为软件工程师。 本质上,它并不重要。 所有这些角色都有松散的定义,出于某种原因,这让我非常着迷。 但是,我已经完成并将继续做的工作与软件工程师产生了很好的共鸣。 我认为,休息一下并反思一下我当时所学的一些主要教训,这可能会继续使我今天受益,这可能是个好习惯。
您和您的工作应该可以更换 (You and your work should be replaceable)
Wait, what?
等一下
Did I just say that?
我只是这么说吗?
This might sound counter-intuitive but in reality, this is something you should always have in mind while developing software. The software industry is fast-paced and you will soon get a better opportunity that will force you to switch jobs. The person who is going to replace you will thank you if you have designed the system considering that. SOLID principles are solid for a reason. You should always try to abide by them. Also when the system grows it becomes hard to keep track of decisions. That is why It is important to share and write what you know so that the other person doesn’t have to spend a significant amount of time decrypting information from the code.
这听起来可能违反直觉,但实际上,在开发软件时,您应该始终牢记这一点。 软件行业发展Swift,您很快就会获得更好的机会,这将迫使您转换工作。 如果您考虑到这一点而设计了系统,那么将要替换您的人将感谢您。 SOLID原则之所以扎实是有原因的。 您应该始终遵守它们。 而且,随着系统的发展,很难跟踪决策。 这就是为什么共享和编写您知道的内容很重要,这样其他人就不必花费大量时间从代码解密信息了。
质疑一切,不承担任何责任 (Question everything, assume nothing)
Remember this rule of thumb, whenever in doubt, ask questions about it. It means being knowledgeable about what it really means. Few of the biggest mistakes I’ve made was due to misunderstanding. Sometimes it’s as small as missing out on one of the edge cases thinking that will never occur in real life. Other times its bigger, like expecting another team to fix a specific problem or assuming an entire system works a certain way. In these cases, there is only one mistake and that is making assumptions. Being more explicit and elaborate about problems and solutions will help you curb smaller bugs and issues from the beginning.
请记住这一经验法则,如有疑问,请提出疑问。 这意味着要了解其真正含义。 我犯的最大错误很少是由于误解。 有时,它就像错过了其中一种在现实生活中永远不会发生的极端案例一样小。 其他时候更大,例如期望另一个团队解决特定问题或假设整个系统以某种方式工作。 在这些情况下,只有一个错误,那就是假设。 对问题和解决方案进行更明确和详尽的介绍将帮助您从一开始就遏制较小的错误和问题。
不要沉迷于技术/框架,而沉迷于核心概念 (Don’t dwell into technologies/frameworks, dwell into core concepts)
Technologies and frameworks will come and go, there are so many of them in the market and it can be overwhelming. But they are all built on the core concepts. And if you understand the concepts switching between frameworks, languages and tools, will be effortless. Consider an example of Relational databases, there are so many of them, but if you understand the underlying principles, like ACID properties, indexes, transaction management, concurrency, you will not have to worry about the number of databases that are available.
技术和框架会来来去去,市场上有太多的技术和框架,它们可能会让人不知所措。 但是它们全都基于核心概念。 并且,如果您了解在框架,语言和工具之间进行切换的概念,那将很轻松。 考虑一个关系数据库的例子,其中有很多,但是如果您了解诸如ACID属性,索引,事务管理,并发之类的基本原理,则不必担心可用数据库的数量。
你周围的人很重要 (People around you matter a lot)
For a full-time job, you spend at least eight hours a day working, five days a week. That is a significant amount of your life. That means the people you work with have an incredible amount of influence over you and your overall happiness. The best teams I’ve worked with are the teams who I genuinely enjoy spending time with regardless of what we were working on. This means that I care a lot about who is getting hired to work in the team, who would eventually become my team-mate.
对于全职工作,您每天至少要花八个小时,一周要花五天。 那是你一生的重要时间。 这意味着与您一起工作的人会对您和您的整体幸福感产生不可思议的影响。 与我们合作过的最好的团队是我真正喜欢与他们共处的团队,无论我们在做什么。 这意味着我非常在乎谁被雇用来团队工作,谁最终会成为我的队友。
“Work with people where you feel a bit insecure” — Sundar Pichai, CEO of Alphabet and Google
“与您感到有些不安全感的人一起工作” – Alphabet和Google首席执行官Sundar Pichai
When we’re open to learning from others, we benefit from their experience as well as our own and we can inherit their wisdom and knowledge. The people we surround ourselves with are the biggest influence on our behaviour, attitudes, and results. When we stay with someone for a while, we tend to inherit their habits. Sometimes deliberately and sometimes automatically. And that is why it is very important to take that into consideration when switching jobs. Not just title and salary.
当我们愿意向他人学习时,我们将从他们的经验以及我们自己的经验中受益,我们可以继承他们的智慧和知识。 我们周围的人对我们的行为,态度和结果影响最大。 当我们与某人呆一段时间时,我们倾向于继承他们的习惯。 有时是故意的,有时是自动的。 这就是为什么在切换工作时将其考虑在内非常重要的原因。 不只是头衔和薪水。
成为问题解决者,而不仅仅是程序员 (Be a problem solver, not just a programmer)
Growing as a software engineer requires you to understand that programming is just a tool. Recognize that your ability to write code is a tool in your toolbox as a problem solver. Because you are a problem solver first. Learn to recognize the most important problems in front of you, and be ready to apply different perspectives to solve the problem. Do not only apply the programmer’s perspective. You have to learn to take a holistic view of the system in front of you!
随着软件工程师的成长,您需要了解编程只是一种工具。 认识到您编写代码的能力是工具箱中的工具,可以解决问题。 因为您首先是问题解决者。 学习认识到面前最重要的问题,并准备运用不同的观点来解决问题。 不仅要应用程序员的观点。 您必须学会在您面前全面了解系统!
Referring to the definition of “Software Engineer” described in the beginning, you have to take a lot of things into consideration so that your user/client can benefit from the application/solution that you are providing.
参考开头所述的“软件工程师”的定义,您必须考虑很多因素,以便您的用户/客户端可以从所提供的应用程序/解决方案中受益。
按自己的节奏工作 (Work at your own pace)
Jeff Bezos’ view on work-life balance:
杰夫·贝佐斯(Jeff Bezos)关于工作与生活平衡的观点:
“If I am happy at home, I come into the office with tremendous energy. And if I am happy at work, I come home with tremendous energy.”
“如果我在家很开心,我会充满力量地走进办公室。 而且,如果我在工作中感到高兴,我就会充满力量。”
Don’t bite off more than you can chew. Everybody is different and is motivated for different things in life. You have to figure out your motivation. Do not follow what others are doing around you. Find your balance in life and work towards achieving that. It is important if you want to stay here for long. You have to consider this as a marathon. Run at your pace, take breaks and enjoy the journey.
咬不超过你可以咀嚼的东西。 每个人都是不同的,并且对生活中的不同事物有动力。 您必须弄清楚自己的动机。 不要跟着别人在你身边做什么。 在生活中找到平衡,并努力实现这一目标。 如果您想在这里呆很长时间很重要。 您必须将其视为马拉松比赛。 以您的步调奔跑,休息一下,享受旅途。
避免破坏性的心态 (Avoid destructive mindsets)
There are plenty of things that can stifle you on your path to becoming a good software engineer, and often they are states of mind that can be difficult to recognize because they are internal and part of you. And there’s one thing I learned since I started programming, it’s that all unsuccessful developers typically share similar traits. Sometimes knowing what to avoid is more important than knowing what to do. For example, saying yes to everything.
有很多事情会扼杀您成为一名优秀的软件工程师的道路,而且它们往往是一种心态,很难识别,因为它们是您的内部和一部分。 自从我开始编程以来,我学到的一件事是,所有不成功的开发人员通常都具有相似的特征。 有时知道要避免什么比知道要做什么更重要。 例如,对所有内容说“是”。
I have elaborated on those traits in another one of my blog posts.
我在另一篇博客文章中详细介绍了这些特征。
未经测试的代码是您的最大敌人 (Code without test is your biggest enemy)
Writing tests is very important and better yet, learning to write tests before code is a cherry on top of that. A lot of programmers find the idea of writing tests before writing code absurd. They think that it is not useful and slows down the development process. In a sense, that is correct and it does impact the speed of development. But the speed of development would hardly matter if your system is not resilient.
编写测试非常重要而且更好,在代码编写之前学习编写测试是最重要的。 许多程序员发现在编写荒谬的代码之前先编写测试的想法。 他们认为它没有用,并且会拖慢开发过程。 从某种意义上说,这是正确的,并且确实影响了开发速度。 但是,如果您的系统不具有弹性,则开发速度几乎没有关系。
An engineer’s job is to deliver code that is not only functional but readable and maintainable. And Test-driven development helps you do that.
工程师的工作是提供不仅功能正常而且可读可维护的代码。 测试驱动的开发可以帮助您做到这一点。
According to Martin Fowler, TDD is:
根据Martin Fowler的说法,TDD为:
- Writing a test for the next bit of functionality you want to add. 为您要添加的下一个功能编写测试。
- Writing the functional code until the test passes. 编写功能代码,直到测试通过。
- Refactoring both new and old code to make it well structured. 重构新旧代码以使其结构良好。
One of the most important aspects of TDD is that it shifts the focus to WHAT of a problem from HOW. And that is a mindset that will help you grow as a software engineer. Consider reading this if you are looking for an example implementation of TDD.
TDD最重要的方面之一是,它将问题的焦点从HOW转移到WHAT。 这是一种心态,可以帮助您成长为软件工程师。 如果您正在寻找TDD的示例实现,请考虑阅读此内容 。
成为收藏家 (Become a collector)
Well, this is going out of context, but hear me out. I mean collecting the resources that you stumble upon. Blog posts, videos, talks, and everything in between, save them and organise them in a way that can be used at a later point in time.
好吧,这是脱离上下文的,但是请听我说。 我的意思是收集您偶然发现的资源。 博客文章,视频,对话以及介于两者之间的所有内容,都可以保存并组织起来,以便以后使用。
The above image is just an example. You can find better ways of managing it. You will definitely solve a problem multiple times, or implement the same solution multiple times, instead of looking around the internet on how you solved it in the first place, this will come in very handy. I have written more about this in one of my blogs.
上面的图像只是一个例子。 您可以找到更好的管理方式。 您肯定会多次解决一个问题,或者多次实施相同的解决方案,而不是一开始就在互联网上四处寻找解决问题的方法,这将非常方便。 我在我的一个博客中写了更多有关此的内容。
深入挖掘,细节决定成败 (Dig deeper, the devil is in the details)
Recently I was working with Hibernate and Kotlin. I bumped into a problem where it was not possible to use data classes to create entities. I struggled for sometime before actually finding a nice article that explains the problem and the possible solution. And instead of jumping quickly to the solution and implementing it to my problem, I started digging deeper. I observed that there are a lot of libraries that have similar problems because of the compatibility issues with Kotlin. Next time when I see something like that I can quickly go through that article to refresh my memory and be done with the solution.
最近,我正在与Hibernate和Kotlin一起工作。 我遇到了一个问题,即无法使用数据类创建实体。 经过一段时间的努力,我才真正找到一篇不错的文章来解释问题和可能的解决方案。 我没有快速跳到解决方案并将其实施到我的问题上,而是开始深入研究。 我观察到很多库由于与Kotlin的兼容性问题而存在类似问题。 下次当我看到类似的内容时,我可以快速浏览该文章以刷新我的记忆,并完成解决方案。
Try to dedicate your time towards understanding the internal working of different libraries and frameworks that you use. This will help you relate different frameworks, and understand why one is better than the other. You will start forming opinions on which one to use in a given situation. And when you see some new framework, you will be able to learn it quicker. The pace at which the industry is evolving this habit will help you stay relevant for years to come.
尝试花费时间来理解所使用的不同库和框架的内部工作。 这将帮助您关联不同的框架,并理解为什么一个框架比另一个框架更好。 您将开始就在给定情况下使用哪种意见形成意见。 而且,当您看到一些新框架时,您将能够更快地学习它。 行业逐渐养成这种习惯的速度将帮助您在未来几年保持相关性。
最后的想法 (Final Thoughts)
Being a good software engineer is hard, and it takes time to understand why. I have shared insights from my experience. There is no perfect recipe for success and you have to keep evaluating different options and ways to achieve it. But one thing to keep in mind is that you have to be very critical about yourself. Ask for feedback from people around you and change what is not working. You have to continuously redefine yourself.
成为一名优秀的软件工程师很困难,而且花时间了解原因。 我分享了我的经验。 没有完美的成功秘诀,您必须不断评估获得成功的不同选择和方法。 但是要记住的一件事是,您必须对自己非常挑剔。 征求周围人的反馈,并改变不起作用的地方。 您必须不断重新定义自己。
You can find me on LinkedIn and Twitter.
您可以在LinkedIn和Twitter上找到我。
其他有趣的文章 (Other Interesting Articles)
翻译自: https://levelup.gitconnected.com/lessons-ive-learned-in-5-years-as-a-software-engineer-ee483f12d83a
5g对嵌入式软件工程师