A question that we hear regularly at Maven is “How can I get into tech?” Before we try to answer that question it’s worth examining what a career in technology means. It’s commonly said that the average career involves 80,000 hours at work, which is around 40 years of working life. One of the best insights into the life of those currently working in tech can be found in the form of Stack Overflow’s annual developer surveys. Within the technology section, it’s enlightening to see the most popular programming languages used within the industry. Going back just a few years, something that quickly becomes apparent is just how quickly things can change. We only have to go back to the middle of the last decade to see that Java and C# were 2 of the most dominant languages but are now dropping down the ranking (note the difference between professional developers and all respondents here). Alongside this, newcomers such as Rust and Kotlin are climbing the rankings.
This epitomises one of the major challenges of working in tech, that the landscape is constantly changing in terms of programming languages, technologies, operating systems and underlying hardware architectures. As a result, the skills required for these subjects must constantly be worked on just to stay current. The very idea of “getting into tech” suggests that there is some end goal to be achieved, but this is the wrong mindset for working in tech.
So what is the right mindset? The book Mastery, by George Leonard is a treatise to the experience of mastering skills. In this, the process of learning is summarised by the mastery curve. This describes learning skills as relatively brief periods of progress, each of which is followed by a slight decline to a plateau, which is somewhat higher in most cases than that which preceded it.
The plateaus have their dips and rises along the way but the general progression is always similar. At each step along the process, we must continue practising skills so that we take them from the place of conscious thought and effort to be part of our habitual behaviour, where much of the process is autonomous. Once completed, any conscious thoughts can be directed towards other areas of concern. To master a skill, the inexorable fact is you have to be willing to spend most of your time on a plateau. That is to love the journey, the process of practice and learning, and not focus solely on the goal of attaining new skills. This is a common theme we see in successful candidates at Maven, quite simply; they love coding.
However, even with a healthy mindset in place, we must still work on practising the required skills regularly. One skill that seems unavoidable in the industry nowadays is the coding interview. This takes the form of an interactive coding exercise using an online coding platform focusing on aspects of competitive coding. While you are unlikely to secure a position on your performance in one of these alone, they act as an important screener step in the interview process for companies. There are many resources available to aid you in practising this specific skill set, but a great starting point is ‘Cracking The Coding Interview’. There are a huge number of websites targeted at practising this skill or even focusing on mock technology interviews. To name a few;
There are also numerous competitive coding events aimed at the promotion of these skills, such as the Advent of Code, which takes place yearly and provides a set of coding challenges daily across the period of the event.
However, while competitive coding is useful to learn, the specific aspects of programming such as algorithms or the syntax of a language, focus on programming in an artificially constrained environment. Thus, its applications are largely useful for those wishing to learn a particular programming skill or for companies to screen applicants for specific skills.
This is only a small part of the skillset required by a successful technologist. Where can we get these other skills? Or more importantly, how can we learn what the other skills are we should focus on learning?
People have long pondered on what leads to success, dating back as early as the 1920s with authors such as Napoleon Hill who wrote about what leads to success in his book The Law Of Success, and later expanded upon it in his book Think And Grow Rich. In his books, Hill studied and conducted interviews with a range of titans in the industry at the time, including Thomas Edison, John D. Rockefeller, Henry Ford and Alexander Bell. A common theme across these individuals was what Hill termed the “Mastermind Group”, which is a network of supportive individuals who come together in a peer to peer mentoring network to solve problems. The idea of a supportive network of mentorship is one we use internally at Maven, and it is one you can use too. With the advent of the internet, such networks of mentorship do not need to be physical, they can be entirely virtual and do not necessarily even require two-way communication.
Let’s consider some of the ways in which you might gain exposure to the ideas, experience and mentorship of more experienced developers. Before we do, a quick point on languages. At Maven we use C++ for our performance-critical system, but we are never married to a specific technology. Programming languages are toolkits, and for any job, we must consider what the correct tool to use is.
At Maven, we also use Rust, C#, Python, Julia, Javascript and Typescript, to name a few. Part of being an experienced technologist is becoming a polyglot with programming languages. To become a successful one, you need to develop T-shaped skills and specialise in one. Different languages have different strengths and weaknesses, thus supporting particular paradigms is suited to certain languages. The rest of this article will focus on building a mentorship network within the context of C++ largely. This is because C++ is a multiple paradigm language that allows exposure to a wider range of techniques than almost any other language. For instance, within C++ we can write code to exploit object-oriented programming, generics, functional programming, data-oriented programming, compile-time programming & metaprogramming, to name just a few. Many of these skills are transferable to other languages, but few are so widely supported across other languages. However, the ideas presented here do apply to other languages.
1. Find an online community and participate.
The C++ Alliance has a mission statement to empower the C++ community through educational resources, expertly maintain C++ libraries and support growing the C++ community and educational environment. As such, they maintain the CppLang Slack channel that contains groups covering a wide range of topics important to the C++ ecosystem. Here, you will find a vibrant community of enthusiasts, library authors, C++ Standard Committee members or even groups dedicated to open discussion for official study groups within the Committee, C++ book authors, and more. Are you trying to learn a particular skill, meta-programming in C++ perhaps? If so, join the meta-programming channel and you will find lots of people happy to discuss some of the trickier aspects of meta-programming, including maintainers of some of the most popular open-source meta-programming libraries.
In addition, there are also lots of C++ groups on Discord servers focusing on specific subtopics of the industry, for example, the #include <C++> group, focusing on diversity and inclusion within the industry.
2. Attend C++ Conferences
Most programming languages have international conferences dedicated to education and knowledge sharing, and C++ is no exception. The largest of these are CppCon and CppNow. As an extension of these, there are also a host of smaller conferences focusing on country user groups, such as C++Russia, Cppp (in France) and C++ On Sea (in England). It’s common for there to be a representation from the C++ Standards Committee at these conferences, discussing the future direction of the language and covering many of the features targeted at future versions of the language.
Of course, the idea of flying to conferences around the world sounds expensive, which is why many conferences allocate a portion of their tickets to be either student or supportive tickets aimed at making tickets available to those without the financial means. If you can’t find any details on their website, it is still worth emailing their support team and asking if this is supported by the conference organisers.
3. Watch C++ Conferences Online
Of course, in the current situation, mid-pandemic, even with financial support, travel to conferences may be difficult, which is why it is so encouraging to see many conferences making their talks available online for free after the event. Many conferences now have their channels dedicated to hosting these conference talks, such as:
4. Attend C++ User Group Meetups
Many cities have C++ user groups that arrange talks and meetups regularly, for instance, London has CppLondon, Amsterdam has the Dutch C++ Group, and Munich has MUC++. Even if you don’t live near one of these groups, many of them have moved online since the pandemic, and going forward, the format will likely remain part in person and part virtual. Should your timezone not make it possible to attend, many of them are kind enough to post their talks to a youtube channel to be watched at your leisure. Of course, if you can attend in person, many of them host a social event afterwards and there is the opportunity to meet people from the industry and talk about coding over a pizza and a drink.
5. Follow Domain Experts On Social Media
Many experts in a technical domain enjoy working in their domain so much that they want to talk about it and share their knowledge. Social media has made a wealth of talented technologists’ thoughts accessible to you. Many of the same technical experts that participate in the C++ Standard Committee or who speak at C++ user groups and conferences are on Twitter and regularly post their ideas to technical blogs. Top C++ twitter accounts include individual authors and organisations in the C++ ecosystem. There are also many excellent blogs to follow and podcasts including a wide range of guest speakers.
6. Participate in a Standards Process
The standards process is the process of bringing together independent technical experts to coordinate in the development of a technical specification, and coming to an agreed consensus via a voting process. ISO is the International Organization for Standardisation that acts as a facilitating organisation in the development of a technical standard. In doing so, they ensure a code of conduct is adhered to and the publication of a standard follows a rigorous process. The C++ Standard is the technical document that describes the working of the C++ language and standard libraries for implementers such as compiler vendors, who provided the tools that allow software developers to write and develop C++.
Getting involved in the standardisation process is a fantastic way to learn about the coordinated work and effort of a huge number of technical experts on a subject, as well as learning about a formalised and structured way of working.
The C++ standard is an open process, which means that you can attend and participate (albeit without voting rights) without being a member of the ISO committee. The ISO committee is composed of national standardisation bodies from across the globe. Meaning you can also get involved with the committee by being a member of your country’s national body. For example, in the UK, that means being a member of the British Standards Institute, and in America, a member of the American National Standards Institute.
Standards processes do not just apply to language. For instance, if you are interested in graphics or high-performance computing then you might also be interested in the Khronos Standards Group which manages standardisation of APIs such as OpenCL, Vulkan and WebGL.
7. Contribute to Open Source projects
The best way to learn to program is by doing it, but this will only useful take you so far. Working on new codebases with ideas from people with different backgrounds and experiences to your own is a great way to broaden your technical knowledge. Many open-source projects have gotten where they are by the passion of those working on them, many of whom have day jobs and are short of the time required to take the project through to the conclusion they may have envisaged for them. As such, many projects on Github will have issues open with tags such as “help wanted” that are openly inviting new people to contribute. By doing so, any contribution you make will go through a pull request which involves a code review where the original authors will provide you with feedback on your changes. This is a proven model used throughout the industry and allows you to get detailed reviews of your contributions from experts in the field.
Even if time does not allow you to contribute to open source projects, there is a wealth of knowledge and techniques on display in the open-source world, and it’s well worth studying projects to get exposure to new techniques and ideas.
Conclusions
Nowadays there is a wealth of information and resources available to learn the skills of successful technologists. Perhaps the more challenging aspect is narrowing down the information to the correct resource for you and your style of learning. However, leveraging the experience of those more experienced than yourself, and finding mentor figures for their areas of your interest, can help you overcome the plateaus in your mastering of the varying and ever-changing skillset required for success in technology.