I'm going to start off with a disclaimer: I teach Python courses to network engineers, so I have a vested interest in programming. Nonetheless, I regard the following as true.
In 2011, Marc Andreessen wrote an article called "Why Software is Eating the World" (subscription required). In it, he predicted:
- Companies in every industry need to assume that a software revolution is coming. This includes even industries that are software-based today. Great incumbent software companies like Oracle and Microsoft are increasingly threatened with irrelevance by new software offerings...
In some industries, particularly those with a heavy real-world component such as oil and gas, the software revolution is primarily an opportunity for incumbents. But in many industries, new software ideas will result in the rise of new Silicon Valley-style start-ups that invade existing industries with impunity. Over the next 10 years, the battles between incumbents and software-powered insurgents will be epic.
During the last few years, we have seen the rise of software-defined networking. Cisco has launched both its onePK API and its Application Centric Infrastructure, and VMware has countered with its NSX overlay-underlay networking model. Network engineers are increasingly using DevOps tools like Ansible, Puppet, and Chef. Additionally, Amazon Web Services, OpenStack, and other software platforms are making the software-defined data center a reality. Finally, white-box switches have the potential to standardize and commoditize networking hardware.
Networking has joined the software-eating-the-world buffet
But what do all these changes imply for network engineers? Is it all business as usual, and do we just need to continue pounding on our CLI? Or is this a fundamental change in the networking industry?
I think that it is a fundamental shift, and that programming skills will be increasingly important for network engineers.
Many of us have seen the great advances that server engineers have made in automating their environments; network engineers need to keep pace. But in order to keep pace, we need better methods of programmatically controlling equipment, better tools, and an increased use of network virtualization. Network engineers also need programming skills to use the new tools and the new programmatic access.
Now, I am not saying that you need to be Linus Torvalds or Guido van Rossum, but you must be fairly proficient in a general-purpose programming language. (Python and Ruby are good choices.) You need to add this important skill to your tool belt.
For many of you, this is not entirely new. Lots of network engineers have known how to program for years and years. Network engineers have been hacking together shell, Perl, and Python scripts for quite a while. But the requirements of network engineering and the job market are now requiring more -- more network engineers with programming skills and a broader and deeper understanding of programming.
Obviously, not all network engineers need to learn to program, but it is a valuable skill to have (and will be increasingly so). There are certain jobs, roles, and companies that will be immune to this, but for many of you, it's in your interest to acquire or improve programming skills.
But can't I just use the tools other people create for me?
Yes, but if these are DevOps tools like Ansible, Puppet, and Chef, then these tools themselves have numerous programming constructs built into them. For example, Ansible has lists, dictionaries, loops, and conditionals. It actually has multiple forms of these, if you consider both the main script (the playbook) and templates. Additionally, if you want to be proficient at automating tasks in your environment, you will need to write your own glue scripts and potentially add your own code to DevOps tools. These tasks require programming skills.
But can't I just buy a large network controller with a GUI that does all this for me?
I am sure vendors will be happy to sell you a very large, very expensive network management package. However, this hasn't worked very well in the past. If a vendor could accomplish this on a broad scale, that would be great.
Additionally, many of the large management programs will result in increased network virtualization (VMware NSX, OpenStack), including virtual switches, virtual routers, virtual firewalls, and virtual load balancers. These virtual network devices can be created, configured, and destroyed programmatically.
Finally, a management program would still need to integrate into your environment and workflow. This integration would often involve programming.
But can't I just think like a programmer?
Learning and doing are closely related. I doubt that you will be able to reasonably understand programming practices without learning how to program (at least to a certain extent).
By all means, use tools. Find the best tools you can. But one of these tools should be a general-purpose programming language.
Time will tell if I am right or not -- making predictions about the future is a dangerous game. If programming skills are important for network engineers, then they will allow you do your job significantly better, and your market value will increase. The evidence I see so far indicates that these skills are important, and that they will be even more important in the future.