Today’s world is full of opportunities for software engineers and programmers. But the skills needed to be successful today are different from decades ago. Python seems to be the “hot” language, but why? Coders are expected to write code that is freer from bugs than in the past. Is that possible?
To learn more about the challenges facing modern software practitioners, Design News reached out to two veterans in the space: Larry Smithmier, Practice Lead, Consultant, at Cognizant Softvision, and Anders Holmberg, Chief Technology Officer at IAR Systems. Here is a portion of that discussion.
Design News: What skills do software engineers and programmers need to succeed now and in the near future?
Smithmier: To be successful, programmers and software engineers need to be able to decompose a problem into actionable units and then be able to reassemble them into a working product.
If you look at the history of programming, most of the impactful paradigm shifts (procedural programming, functional programming, object-oriented design, microservices, domain-driven design) have been directly or indirectly aimed at reducing the cognitive overhead of designing a solution. Even the tooling used to implement solutions has evolved to reduce the friction between the ideation and the implementation. From the highest-level enterprise architect to the entry-level programmer, the process is always ‘envision’ and then ‘implement.’
Holmberg: Software development in the embedded space is looking more and more like large-scale enterprise software development when it comes to the size of codebases, tools used, requirements, and processes. To keep up in this world, you need to work on the right abstraction levels and sensibly re-use existing code and libraries. But at the same time, you need to have a fairly good grip of how the underlying hardware is working, as that will impact how the complete system will behave. So, the key is to have a willingness to adapt (within reason) to new tools and processes while keeping the focus on the right level of abstraction. This probably sounds a bit vague but being open-minded is by far more important than proactively learning any specific language or tool, as this knowledge might be rendered obsolete in no time at all. But of course, if you want a career in writing software for embedded systems, there’s no way around C and C++.
Design News: What is the best way to minimize design and coding errors?
Smithmier: The best way to minimize errors in your solution implementation is to focus on the SOLID principles of object-oriented programming, even if you are not writing code in an OO language.
Decoupling the components in an implementation allows us to test the components in isolation. It allows us to focus on solving the problem in front of us rather than being overloaded.
Another essential part of implementing software is your tooling and toolchain. Most IDEs (integrated development environments) in use today provide CASE (computer-aided software engineering) tools that can guide us to success if we use them correctly. Adding static code analysis tools to our toolchain is crucial because they can be a second layer of defense against programming errors.
Holmberg: There’s no quick fix to these issues. Facebook internally used the ‘move fast and break things’ motto, but that does not really work for systems that cannot easily be updated due to constraints on downtime or accessibility, for example. If you want to ship quality software with reasonable predictability, you need to slow down to speed up. Design and code reviews are cornerstones in this process, and so is testing. Test-driven development is also a technique that has shown significant improvements in quality upfront. It forces you to understand the requirements on a more abstract level when creating the tests. But understanding the requirements and transforming them into working code is one thing.
Another thing is the perceived quality of the code. C and C++ are design languages that can be abused to write code that is a) more or less impossible to understand and b) not portable between different processors and compilers. To counter this, it is essential to use static analysis tools and runtime analysis tools that can help you identify code that needs to be rewritten.
In this day and age, you should also look for tools that can help pinpoint security issues.
Design News: Is Python the new “black?” Or is it over-rated?
Smithmier: Python is 30 years old; it isn’t the new anything! What is new is how we deploy and deliver solutions, and Python (and the libraries built up around it) is very well situated to provide great value with low friction. I believe it is somewhat overrated, but it excels and complements things well aligned with our current architectural aesthetics.
Design News: Do software engineers/programmers need to worry about incorporating software features into their code? Won’t that be done in the application or networking layers?
Smithmier: In terms of security, software security is not something that is bolted onto a program. It needs to be integrated from the start. Just like putting a vault door on a shed doesn’t make it safe, adding security layers to a software product does not make it secure. Information security is as much about what data you are keeping as how you are storing it. It is also about monitoring how sensitive data is used and who is accessing it.
People will go to great lengths if the data is valuable enough or can be leveraged to acquire more valuable data.
John Blyler is a Design News senior editor, covering the electronics and advanced manufacturing spaces. With a BS in Engineering Physics and an MS in Electrical Engineering, he has years of hardware-software-network systems experience as an editor and engineer within the advanced manufacturing, IoT and semiconductor industries. John has co-authored books related to system engineering and electronics for IEEE, Wiley, and Elsevier.