The field of software engineering is one known for technical complexity, creativity, and innovation. With the job of software developer currently ranking #1 in the US, competition has been drastically increasing, especially in the midst of COVID-19 layoffs and hiring freezes. While technical skills are essential to success in this field, here are five skills that will supercharge both your career and life trajectory:
1.学习能力 (1. The ability to learn)
The domain of computer science and software engineering is one that is both massive and in constant flux. Moore’s Law states that the number of transistors on a densely integrated circuit doubles every two years. This means that the software that runs on said circuits can become increasingly complex, and this is further bolstered by the existence of massive distributed systems via cloud computing. New libraries and frameworks seem to be popping up daily, with NPM (Node Package Manager) now containing over 1 million packages.
计算机科学和软件工程领域是一个既庞大又不断变化的领域。 摩尔定律指出，密集集成电路上的晶体管数量每两年翻一番。 这意味着在所述电路上运行的软件可能会变得越来越复杂，并且通过云计算的大规模分布式系统的存在进一步增强了这一点。 新的库和框架似乎每天都在弹出，而NPM(节点程序包管理器)现在包含超过一百万个程序包。
Whether trying to learn a new programming language, mastering a framework, or studying for technical interviews, it’s very easy to become overwhelmed just by the sheer amount of material available or required. Before diving head-first into these studies, I’d recommend taking the free Coursera course — Learning How to Learn: Powerful mental tools to help you master tough subjects.
无论是尝试学习一种新的编程语言，掌握一个框架，还是学习技术面试，仅因可用或需要的大量材料而变得不知所措。 在进行这些研究之前，我建议您先参加免费的Coursera课程- 学习如何学习：强大的心理工具来帮助您掌握艰巨的主题 。
This course is one that has helped me immensely in building good study habits and presenting me with many helpful tools to help myself with studying new material for both university and my professional career. Examples of these tools are spaced repetition, taking advantage of both the focused and diffuse modes of thinking, the concept of einstellung, and active recall.
2.毅力 (2. Perseverance)
There are two inevitabilities when working in the world of software engineering: failure and tedium. It’s no secret that getting a good job at a competitive tech company is incredibly difficult. It’s been reported that Google hires 0.2% of those who apply for positions there. Whether working on projects or interviewing for jobs, if you work in this field for any amount of time, you are all but guaranteed to encounter failure. However, failure itself is normal, and often a catalyst to better learning. Failing means that you’re trying to accomplish something new and outside of your comfort zone, which is a massive step towards success.
在软件工程界工作时，有两个必然性：失败和乏味。 在竞争激烈的科技公司找到一份好工作非常困难，这已经不是什么秘密了。 据报道， 谷歌雇用了0.2％的应聘者 。 无论是从事项目工作还是面试工作，如果您在此领域工作了任何时间，都可以保证您会遇到失败。 但是，失败本身是正常现象，通常是更好学习的催化剂。 失败意味着您正在尝试在舒适区域之外完成新的工作，这是迈向成功的重要一步。
Successful people don’t fear failure but understand that it’s necessary to learn and grow from. — Robert Kiyosaki
Albert Einstein once stated, “It’s not that I’m so smart, it’s just that I stay with problems longer.” Anyone who has worked in the software engineering field for a decent amount of time can relate to the issue of starting multiple projects and struggling to see them to completion. Starting on new projects is often exciting, but as the project lifecycle continues, the difficult and tedious work often begins to wear on the developer(s). After all, the Pareto Principle, when applied to software projects, conjectures that 20% of the work will take 80% of the time, and this is often the last 20%.
爱因斯坦(Albert Einstein)曾说过：“并不是我那么聪明，而是我待得更长久。” 在软件工程领域工作了相当长的时间的任何人都可能与启动多个项目并努力使其完成有关。 开始新项目通常很令人兴奋，但是随着项目生命周期的继续，艰巨而繁琐的工作通常开始对开发人员造成影响。 毕竟，当帕累托原理应用于软件项目时，可以推测20％的工作将花费80％的时间，而这通常是最后20％的时间。
To deal with both failure and tedium, one must have the perseverance in seeing a project or goal through. While this sounds like it’s a matter of willpower, humans have limited willpower to draw from each day. My suggestion is to instead focus on building self-discipline through the use of good habits. The topic of creating good habits is covered extensively in the Learning How to Learn course linked above, but in essence, instead of focusing on goals and other outputs, focus on the process. Tools like the Pomodoro Technique are invaluable for splitting up work sessions into manageable pieces of time while still maintaining the focus on the process (useful tool — https://tomato-timer.com/).
为了应对失败和乏味，必须有毅力看透项目或目标。 虽然这听起来像是意志力的问题，但人类每天汲取的意志力有限。 我的建议是，相反，应着重于通过养成良好的习惯来建立自律。 上面链接的“学习方法”课程中广泛涵盖了养成良好习惯的主题，但从本质上讲，与其关注目标和其他输出，不如关注过程。 诸如Pomodoro技术之类的工具对于将工作会议划分为可管理的时间，同时仍然保持对流程的关注，是无价的( 有用的工具-https: //tomato-timer.com/ )。
3.解决问题 (3. Problem Solving)
Contrary to some of the notions I’ve heard, the most difficult part of software engineering isn’t coding — it’s solving problems. All of programming is essentially composed of algorithms and data structures, and knowing how to recognize patterns and solve issues using the appropriate tool at the proper time is essential.
One common pattern for solving problems is the “read, search, ask” workflow. When you’re trying to find a solution to a programming problem, it’s often best to start with reading the documentation for either the APIs or the technical specifications. If the answer isn’t located there, searching on Google or StackOverflow will often result in something useful. Once those resources are spent, then you can ask coworkers or seniors — they will greatly appreciate that you did research first.
解决问题的一种常见模式是“阅读，搜索，询问”工作流程。 当您试图找到编程问题的解决方案时，通常最好先阅读有关API或技术规范的文档。 如果答案不在此处，则在Google或StackOverflow上搜索通常会产生有用的信息。 一旦花掉了这些资源，您就可以问同事或前辈-他们将非常感谢您首先进行研究。
In regards to the problem solving process itself, it’s often helpful to have a repeatable process for whatever product/task you’re working on. Here’s a workflow that I find handy whether working on algorithm/data structure problems (a la programming interviews) or designing systems:
- Understand the task at hand 了解手头的任务
- Clarify inputs and outputs 澄清输入和输出
- List edge cases 列出边缘案例
- Create a brute force design 创建蛮力设计
- Optimize the design 优化设计
- Code out the optimized implementation 列出优化的实现
- Write and run tests (if doing TDD, this can be done after step 3) 编写并运行测试(如果执行TDD，则可以在步骤3之后完成)
- Reflect on the results 反思结果
4.沟通 (4. Communication)
Contrary to the all-to-common stereotype of the cave troll living in the server room cowering whenever sunlight touches them, a software engineer requires proficient communication skills to succeed in this career field. Software engineering is a team endeavor, and any large product will require coordination and teamwork between engineers, engineering managers, product managers, and project stakeholders. Communication includes (but is not limited to) written, verbal, and non-verbal communication.
与生活在服务器机房中的洞穴巨魔的刻板印象相反，只要阳光直射它们，它们就会退缩，因此软件工程师需要精通的沟通技巧才能在这个职业领域取得成功。 软件工程是团队的工作，任何大型产品都需要工程师，工程经理，产品经理和项目利益相关者之间的协调和团队合作。 交流包括(但不限于)书面，口头和非语言交流。
In regards to written communication, it’s generally best to keep things as concise as possible. When writing emails or messages, try and have the main question or update as close to the beginning of the email as possible. Research shows that up to 28% of an office worker’s week is spent on emails, which is a staggering amount of time. The more clear the purpose of and to the point the email is, the less time needs to be taken to digest or even write it. However, tone is still very important, and extra caution must be taken not to come across as overly terse when more formal language is called for.
关于书面交流，通常最好保持简洁。 在编写电子邮件或消息时，请尝试使主要问题或更新尽可能靠近电子邮件的开头。 研究表明，上班族每周最多有28％的时间都花在电子邮件上，这是一个惊人的时间。 电子邮件的目的和意义越明确，则消化甚至编写电子邮件所花费的时间就越少。 但是，语气仍然非常重要，当需要更正式的语言时，必须格外小心，以免显得过于简洁。
The interpretation of a message is 7 percent verbal, 38 percent vocal and 55 percent visual
In-person communication is another matter entirely. A study by Dr. Albert Mehrabian, a Professor Emeritus of Psychology at the University of California, Los Angeles, has shown that “The interpretation of a message is 7 percent verbal, 38 percent vocal and 55 percent visual” (Read more here). While this study was directly related to expressing emotions, thus rendering the percentages less precise for general conversation, the point remains that nonverbal communication is massively important. Mastering non-verbal communication will have a massive impact on your overall communication skills.
面对面的交流完全是另一回事。 加利福尼亚大学洛杉矶分校心理学名誉教授阿尔伯特·梅赫拉比安(Albert Mehrabian)博士进行的一项研究表明，“信息的解释是7％的口头表达，38％的声音和55％的视觉效果”( 在此处了解更多 )。 尽管这项研究与表达情绪直接相关，从而使普通对话的百分比降低了精确度，但重点仍然是非语言交流非常重要。 掌握非语言交流将对您的整体交流技巧产生重大影响。
One method that I have personally found to improve my nonverbal communication patterns is to practice presence. Being present in the conversation and giving it ones full attention will often result in one automatically having better eye contact, more engaged posture, and even less nervous patterns. By solely focusing on the person(s) speaking, you’ll be able to read their nonverbal cues better and pick up on the undertones of what they are trying to express (also known as active listening). As an additional bonus, heightened presence can also help one become more aware of their posture as they engage with the rest of the world.
我个人发现可以改善我的非语言交流模式的一种方法是练习在场感。 出现在对话中并给予全神贯注，通常会导致一个人自动具有更好的眼神交流，更加专注的姿势，甚至更少的紧张情绪。 通过仅关注说话的人，您将能够更好地阅读他们的非语言暗示，并了解他们试图表达的内容(也称为主动聆听 )。 作为额外的好处，增强的存在感也可以帮助他们在与世界各地互动时更加了解自己的姿势。
Here’s a good article for some steps to improve presence:
5.适应性 (5. Adaptability)
While this skill is quite similar to the ability to learn, adaptability also has to do with being able to adjust to various scenarios thrown ones way. When working on any large software project, requirements are bound to change at some point. Being able to roll with this and pivot as requirements change is essential to being able to execute well during the implementation of a product or infrastructure design. This is a non-trivial part of what is meant by Agile.
尽管该技能与学习能力非常相似，但适应性还与能够适应以各种方式抛出的情景有关。 在处理任何大型软件项目时，需求一定会有所变化。 能够顺应这一需求并随需求变化而变化，这对于在产品或基础架构设计的实施过程中能够良好执行至关重要。 这是敏捷的重要部分。
There are also other variables at play that myself and many other engineers/developers have had to work through. There can be anything from a teammate moving to a different position or company, a budget cut related to your assigned project, or even being shifted to an entirely different project based on priority. A perfect example of unexpected changes would be the move to primarily remote work due to COVID-19. Being able to adjust to these changes effectively and efficiently will give you a leg up in this field.
本人和许多其他工程师/开发人员还必须努力解决其他变量。 从队友搬到其他职位或公司，与您分配的项目相关的预算削减，甚至根据优先级转移到完全不同的项目，都可能有什么。 出乎意料的变化的一个完美例子是由于COVID-19而转向主要是远程工作。 能够有效，高效地适应这些变化将使您在这一领域有所建树。
Here’s a great article from Drexel University on how to practice adaptability.