Nowadays, joining the tech industry is like watching Stranger Things: everyone is doing it. People from all kinds of backgrounds and generations are looking to venture into tech in hopes of job security, excitement, and competitive pay. One of the most popular roles many are looking to pursue is the software developer.
While plenty of successful software developers hail from the biggest and best universities, many are self-taught. Regardless of the road taken, there’s plenty for new and up-and-coming software developers to learn still. And who better to learn from than those who have come before?
We asked some of our favorite experts about their top career advice for software developers in today’s workforce. Here’s what they had to say.
What skills do self-taught programmers commonly lack? What should a self-taught programmer study to get up to speed with his/her formally-educated peers?
Chris Newhouse, CTO at APPSTEM
“One of the biggest differences I’ve seen between self-taught programmers and their formally-educated peers is the way they approach solving problems. People who go to the effort to teach themselves new skills tend to be very self-sufficient, and often forget the benefits of collaboration. With the time and budgetary restrictions in software development, it is important to take advantage of the worldwide development community and build off of the work of others instead of reinventing the wheel.
“Self-taught programmers also tend to have a much more purpose-driven education than those who learned in school. They may have had some kind of game or web application they wanted to create, and then sought out the requisite skills to do so. Because of this, they tend to miss out on some of the theory that underscores modern software development. Any self-taught developer could benefit highly from an e-learning course on data structures and algorithms. While the concepts in such a course aren’t necessarily used every day on the job, they do teach developers to be far more thoughtful about the approaches they take to solving problems.”
With the time and budgetary restrictions in software development, it is important to take advantage of the worldwide development community and build off of the work of others instead of reinventing the wheel.
– Chris Newhouse, CTO at APPSTEM
Jesse Curry, Director of Development at Haneke Design
“The biggest deficiency that I see in junior developers, self-taught or otherwise, is poor source control. In order to work effectively in a collaborative environment, one must be very familiar with their SCM. At Haneke Design we use Git as the distributed nature makes branching and merging almost effortless. When new developers start we’ll often see code being overwritten or “lost” to an old branch, we spend at least the first six months reinforcing the importance of maintaining a sound branching strategy and working intentionally.”
Meenakshi Agarwal, Co-founder of TechBeamers
“Self-learning is a unilateral but great approach to enhance one’s skills. Most trainers and professionals recommend it. However, it is more useful when proper guidance is available along. Otherwise, it gets tough, makes people struggle. As a consequence, they may lack a few essential skills during the course.
- Coding Style: It relates to the use of poor indentation, commenting, improper variable and function naming conventions, etc. I have experienced that some of the self-taught programmers miss on applying the right coding style and give more emphasis on implementing the business logic. The code, they produce could be technically fit but gets less readable and hard to maintain in the long run.
- Unoptimized Code: It is another skill which self-taught programmers ignore to consider. Sometimes the books do not cover everything that you might need in the real-time. Writing code is one thing but doing it in an optimized manner is another.
- A less efficient code may work in the low-tier environment but can tear apart in a high-load situation. For developing an enterprise-class application, performance is critical.
- Such skills are hard to acquire by self but learning under expert supervision could fill up such gaps timely.
- Modularity: It is the art of breaking a large project into modules and sub-modules. One can do it if he is well aware of the functional and OO (Object-oriented) programming paradigms. Any solution that demands new features should adopt either of the development methods.
- Design Patterns: This skill also comes with education or experience. A single problem may have one or more than one solution. With the right set of design pattern knowledge, you can decide what is best for your application. You may make mistakes during the course and gradually select the right pattern or learn from some professional who has already passed through the same phase.”
A less efficient code may work in the low-tier environment but can tear apart in a high-load situation. For developing an enterprise-class application, performance is critical.
– Meenakshi Agarwal, Co-founder of TechBeamers
Gareth Dwyer, Python expert at Codementor
“It varies a lot depending on the self-learning process. Many self-taught programmers learn by doing, gaining practical experience in frameworks and tooling, but skip out on the less commonly used theoretical components that are covered in formal education. This means that many self-taught programmers have a weaker understanding of algorithms and data structures, and this often leads to them writing far less efficient code by not using hash tables, sets, arrays, and linked lists in appropriate contexts. They tend to use inefficient constructions such as nested loops even when this is not necessary, and may often have more trouble finding the most efficient solution to a given problem.
To mitigate this, self-taught programmers should take theoretical courses in Algorithms and Data Structures, and try to work in an environment where they can get their code reviewed regularly by someone who can mentor on these aspects.”
What are some advanced concepts in programming that most average programmers have never heard of?
“While a lot of developers have heard of cutting-edge technologies like artificial intelligence and machine learning, most haven’t explored them in a real use case. A lot of people don’t know how easy cloud computing companies like Google, Amazon, and Microsoft are making it for anybody to investigate these technologies. Every month new and exciting APIs are released that allow developers at home to try out new use cases for artificial intelligence, including natural language processing, speech translation, computer vision, document understanding, and much more.”
“Again, this varies a lot with different backgrounds. Version control tools such as git are still not used in many cases. Although there has been huge growth recently, there are still many dev teams that are using antiquated and unsafe development practices by copy-pasting source code between their local machines and servers, using names like codebase-copy-2-final.zip to keep track of new releases. This is not scalable and leads to huge issues.
“My favorite is Currying ;)”
What do I truly need to learn and do to become a successful software engineer?
“A software engineer is successful when s/he can quickly understand the functional requirements of a project, does his/her work in a structured way, can demonstrate the job done with ease and confidence.
“To achieve success, a software engineer should learn the following:
- Software Engineering Fundamentals: S/he should know about various development models like SDLC, Extreme programming, and Agile. It is essential to understand what are the key roles, responsibilities, and how to operate in such themes.
- Problem Solving: It is an ability which comes from the inside. One can strengthen it by facing problems differently and try to solve with different approaches.
- Effort Estimation: When an engineer gets some tasks, s/he needs to provide the effort estimates. It could be a regular activity for a project but is something critical for project delivery. It also involves splitting a big task into smaller parts to bring clarity. Those who learn the effort estimation techniques and do it right, win the trust of the stakeholders.
- Commitment: The last thing one would expect from a software engineer is a broken commitment. Irrespective of how dynamic the IT field is, each software engineer should prevent delays from happening. On-time delivery has two-fold benefits, first is the room for new feature addition plus the trust of customers. Such individuals get high regards and tend to become more successful in their careers.”
A software engineer is successful when s/he can quickly understand the functional requirements of a project, does his/her work in a structured way, can demonstrate the job done with ease and confidence.
– Meenakshi Agarwal, Co-founder of TechBeamers
“Every software product is a collaborative effort. Most products are created by teams, and over time all software changes hands as the makeup of development teams shift. Being a successful software engineer requires the ability to be a cooperative and flexible team player, no matter how independent your work might seem. Some of the most important skills that get overlooked are the less-technical ones: documenting code, working collaboratively with others to plan and execute projects, and reviewing the code of other engineers. These skills will serve you well in any development role.”
Being a successful software engineer requires the ability to be a cooperative and flexible team player, no matter how independent your work might seem.
– Chris Newhouse, CTO at APPSTEM
“There are many paths to success in software engineering, but the key to all of them are:
- Becoming an expert in some programming languages and tools. You should be able to write high-quality code that eloquently solves the problem you are tackling at a reasonably fast rate. You should use your tools effectively. Although it’s possible to write software in Notepad.exe while typing with 2 fingers and not following any best practices around good coding style, this is ultimately going to slow you down a lot. You should learn to type, learn to use the advanced features of your IDE or text editor of choice, and learn about the advanced features in your languages of choice.
- Grow comfortable with thinking about the bigger picture of what problem you’re really trying to solve. You can add some value by taking well-defined tickets off a queue and writing code to spec, but to advance in the field you’ll have to learn to add more value by thinking about the “real” problem. This will allow you to make appropriate tradeoffs without having to constantly ask for clarifications from others.
- Improve your communication. In the end, it’s unlikely that you’ll advance on your own. In order to work effectively with others, you should constantly improve your verbal and written communication skills — something that takes just as much as practice as coding itself and can often be as or more important.”
In the end, it’s unlikely that you’ll advance on your own. In order to work effectively with others, you should constantly improve your verbal and written communication skills — something that takes just as much as practice as coding itself and can often be as or more important.
– Gareth Dwyer, Python expert at Codementor
“Empathy is one of the most important skills that one can develop when building software for others if you cannot place yourself in the shoes of your user anything you create will only superficially solve their problem.”
Empathy is one of the most important skills that one can develop when building software for others if you cannot place yourself in the shoes of your user anything you create will only superficially solve their problem.
– Jesse Curry, Director of Development at Haneke Design
What is the best career advice for a software developer to earn a higher salary?
“Software development is a challenging field to find a place in, given the breadth of technologies, platforms, programming languages, and industries involved. It can be tricky to decide when to be a specialist and when to be a generalist.
“Every company wants to hire a versatile engineer — someone who can tackle any problem thrown at them, even if it involves new technology. It is important to not get pigeonholed into a single programming language or platform. At the same time, the highest salaries are commanded by those who have unique expertise to bring to a company. Cutting-edge technologies such as virtual and augmented reality, artificial intelligence, machine learning, and the Internet of Things are all novel and complex enough that true experts are rare, and can get quite a premium for their knowledge.”
“Take initiative. There’s a massive shortage of technically skilled people globally and no end of problems to solve. It’s also easy to become a ‘code monkey’ — someone who pulls tickets off a queue and fixes bugs, but it’s hard to grow like this. Learn how to communicate with different groups of people, understand different aspects of business such as sales, marketing, and finance, and apply your technical skills where they are most valuable.”
“Keep your technical skills sharp and learn to work effectively with others; being “right” doesn’t have much value if no one wants to work with you. Don’t worry about other people; just work to be better every day.”
“The main forte of any software developer is programming. S/he should have excellent programming skills for growing into his career. Following career advice could be useful:
- Choose an In-demand Programming Language: Instead of following the crowd pattern, one should do research and learn the programming language which is in high demand. If you have got hands-on using it, higher are your chances to get a salary hike.
- Contribute for Open Source: You can make a strong footprint online by contributing to an open-source project. Most companies prefer a candidate’s profile with such out of the box abilities. Also, if you have some innovative product to showcase, then share it on platforms like GitHub, BitBucket, etc. It could then be visible to a broad audience.
- Out of the Box Thinking: Try to think out of the box. As a developer, you are responsible for unit testing. Think about automating it. Go further, use DevOps stuff like Jenkins or Bamboo and schedule a CI job for test runs. Collect code coverage of your tests, prepare a summary, and share with the superiors. Such initiatives pay well at the time of yearly increments and influence salary hikes.
- Invest in New Technologies: Growing skill set is necessary for any software developer. S/he should be aware of the latest tech trends. For example, Data Science & Machine learning are quite popular areas in the industry these days. One can think of investing some out of office time to develop these skills. It can help in changing jobs quickly and even bring more in-house project opportunities.
- Work for the Customer: Many software developers don’t need to deal with the customer directly. However, in product companies, it happens often. If you get a chance, then give your 100% to solve such problems. These are lifetime experiences which yield high monetary benefits in the long run.”
What are some things you wish you knew when you started programming?
“That although software development is often thought about in isolation, it is more like learning to read or write than it is like medicine or accounting. Although some people read and write purely for the sake of reading and writing, more often people read and write in order to solve problems in other fields than literature. Learning to program is a great first step, but the real value lies in finding out how programming can be applied to other fields to solve problems.”
“Some of the most popular software is backed by the ugliest source code. While we always strive for technical perfection the most important thing that a software developer can do is ship. I don’t want to encourage anyone to purposely write bad code, but sometimes it’s more important to hit a deadline or get something into the marketplace than it is to spend another week refactoring (and since I didn’t mention it before, read the Refactoring book, it’s seriously one of the best books for a professional software developer to read).”
Learning from others successes and mistakes is a great way to make more informed decisions on where you want to take your own career trajectory. Follow those you want to emulate, avoid pitfalls you know you’re likely to make, and take your own risks whenever you find yourself in new territory. And most importantly: share what you learn with those around you. You never know how much it can help those to follow.