In the world of engineering, there is almost always the ultimate goal that seems impossible to reach but drives innovation and development. In the software development world, that goal could be designing a system that allows developers to simply tell a computer what kind of program that they want to create and the computer delivers. Perhaps that system is closer to reality with AI. Do these software developers want to make their job obsolete? No, what they want is the freedom to innovate, free from all the underlying necessary and messy tasks needed to create a software program. What would this system look like? I think the first steps would be to use AI to search a library of software routines, looking to build up a stack of underlying infrastructure for the program that matches the specifications of a developer. This library would exist with the developer’s company, or in open-source repositories across the globe or in a smart marketplace for purchase. Developers do not want to re-invent these routines, rather they want to assemble ready-made pieces of software to underpin their creative idea.
Most software developers will tell you that far from innovation is software maintenance or bug fixing. An article on IBM’s approach to maintenance caught my attention recently. Instead of shooting for the goal of automatic software development, IBM decided to attack maintenance with their AI solutions. Their top-level goal is to find a way to translate legacy code into a modern language so that software developers can maintain the code and perhaps add new features to it. This make sense, as IBM has long been involved with business systems and many of those legacy systems were coded in old, but still fully-functional languages like COBOL and FORTRAN. But translating from one computer language to another is not an easy task. You can’t just substitute syntax. There are semantics involved and lots of other nuances that make translation difficult.
So, IBM set lower initial goals on their journey to computer language conversion. They offer AI-driven tools to refactor legacy code. Refactoring means looking over legacy code to partition software into micro-services that are easier to maintain and to debug. This is a very difficult task to perform by hand, especially on monolithic code bases that have been developed over many years.
The IBM toolset reports the all the connections between the partitioned micro-services which are nearly impossible to find by hand. These relationships are important because altering one set of services can impact many others. Refactoring can also expose redundant or unused code. The IBM tools use deep learning to group similar code which in turn indicates how this code interacts together.
IBM is perhaps on the right track, and ideas and systems like theirs could be built out over time to the system that I described at the beginning of this post. But their efforts did bring to mind a different approach that hardware (IC) developers utilize.
The goals of hardware developers are very similar to software developers. They have an innovative design that interfaces with many common blocks like USB, Ethernet, and memory. They surround their design with IP representing those common blocks, because they certainly do not want to model those blocks themselves. They just want to connect to ready-made and tested software models of those blocks in order to test their own design within the context of a system.
In the world of hardware design, designers move their ideas through many levels of abstraction on the way to implementing a chip that contains billions of transistors. They have to, because no one can drop down billions of transistors on a schematic and have any hope of connecting them together successfully. Ironically, hardware designers specify their designs using software languages: VHDL and Verilog. Sometimes, they have to switch from one language to another for a project. Instead of trying to translate languages, they employ abstraction to define a design at a higher level than VHDL or Verilog. Siemens EDA offers two products in the Xcelerator portfolio that use abstraction as a means to support both VHDL and Verilog.
HDL Designer allows designers to define their design using block diagrams, flow charts, and state machine diagrams. The tool then generates either VHDL or Verilog based on these higher level descriptions. That way, if the team ever needs to switch languages, they simply let the tool generate the language based on the diagrams.
Catapult High Level Synthesis allows designers to capture their designs using C++ or SystemC and the tool generates all the necessary VHDL or Verilog. The tool automatically schedules the code to add timing and to meet design requirements.
Any IP blocks are connected to the generated VHDL or Verilog and they remain untouched during the use of these tools. Abstraction allows designers to target either language without making any changes to their original design.
If the ultimate goal of software development is to use AI to generate code, perhaps the starting point is push language constructs into an abstract model first and assemble the software stack required to support the developer’s innovative idea and then generate the code in the language of choice. And before you ask, yes, I have studied the Unified Modeling Language (UML) in the past and I am not sure that is the answer. Perhaps a place to start on this journey is to look at the amazing things AI has done for human language translation? In the meantime, I hope that companies continue to work on achieving the ultimate goal in software development, harnessing AI such that developers can spend all their time innovating new solutions that make their lives and our lives happier.