Coding. Programming. C++. Java.
These are some of the words commonly used as being synonymous with software engineers. Those who could write more code or better code per day were called better software engineers. They code according to the design made by other guys, who are supposed to know better – the “real” software engineers.
As the world gets more complex, products become more complex, services become more complex, features become more complex, it is imperative that the developers also should equip themselves with more knowledge to handle things. It is no longer good enough if you know your coding. Knowledge about the environmental conditions in which the software is expected to be executed is critical – the processor architecture, the bus speeds, the memory speeds, the memory available, network capacity, noise in the environment, address space, etc.
The hardware vendors develop IDEs too, and these are getting better. They help the software programmers by abstracting the hardware environment and providing an interface which allows the software guys to put their minds more to software, and not to hardware. Yet, software engineers need to be educated enough about how things happen under the hood. You need to know more to get more out of the platform, even with the IDEs in place. Optimization for memory, for speed, for power-consumption and even for cost – all are critical. Otherwise, there will be better software engineers around who will write more optimized code and eventually threaten your jobs.
Hardware capabilities change frequently and the programs which worked like magic a few months ago seem out-done today. To make our software future-proof, it is important to keep an eye about the hardware trends, and keep our software updated and optimized all the time.
The one common attribute in all great software engineers is their passion to know things, the curiosity, passion to excel in whatever they develop. This needs to be brought in to the schooling itself and institutionalized. It is important for software engineers to know the insides of the PC, the mobile phone, the TV, the Set-top box, the various ports, the various types of memory, the capabilities of the touch-screen, the various types of networks and their capabilities, etc. and even the insides of the Operating systems.
Below are some key-words about the various aspects in the hardware environment that I believe software engineers should know well. I don’t intend to actually describe them all here, but limit myself to the list.
- Processors: While it is important to be aware of popular processors, their architectures, their capabilities, etc., don’t forget the advanced ones like the Multi-core processors, the GPUs, the Systems-on-chip, etc.
- 32-bit and 64-bit architectures.
- Memory: All the way from Main memory, secondary memory, flash, L1/L2 cache, etc. … to Cloud storage.
- Ports: AV Ports, USB, SD, Serial (COM), Parallel (LPT).
- (Wireless) Network: Bluetooth, WiFi are the popular ones, now ubiquitous; 3G is joining the list – even in machines other than mobile phones.
- Ethernet and Buses like RS-232, and the newer technologies like SATA (Serial ATA), PATA (Parallel ATA).
- Touch-screen, Stylus: With every other engineer working for gadgets with touch-screens, it is imperative for us to know about them and the associated stylus.
- Sensors: The world is now full of these sensors, in every gadget, appliance, device, … everywhere. Motion sensors (Accelerometers, Gravity sensors, Gyroscopes, Rotational vector sensors), Environmental sensors (Temperature, Pressure, Illumination, Humidity), Position sensors (Orientation, Magnetometer), Proximity, Geomagnetic field sensors, Touch-sensors, Health-related sensors (BP, ECG, Blood sugar, etc.), and so many newer ones appearing every other day.
In addition to the above, domain-specific hardware knowledge is needed. For example, if one is a software engineer in the automobile industry, he should know in detail about the automobiles. If one is a software engineer in the consumer electronics industry, he should know about the products like Cameras, TVs, Appliances, etc.
The more your software is embedded, more it is critical for you to know your hardware. It is well established that delays in defect correction are much more expensive in embedded software than in other software types, due to close interactions with hardware. When things get more critical, there is a practice of hardware-software co-design. And that is the route for software engineers to graduate into system engineers and system architects, and earn more salaries.
In my own experience I found that those software engineers who knew their hardware far out-performed those who didn’t – in the quality of work, in the speed of work, in their presentations, in their visibility, in their confidence, and in their growth. And in this competitive world, only the fittest survive. It is in therefore for the common good, that software students and engineers should be educated in hardware matters systematically.
Some references I found very useful:
- Computer Architecture (Coursera lectures)
- High Performance Scientific Computing (Coursera lectures)
- Parallel and Multi-core programming: Part 1 and Part 2 of MIT lectures
- Computer Hardware, Memory, Buses, etc., Ports
- Sensors in Gadgets – from the Android world
- Many very useful links from companies like Intel, ARM, NVIDIA, Texas Instruments, etc. Example: ARM Processors, Intel Processors and Optimization manual
- Christof Ebert, Capers Jones, Embedded Software: Facts, Figures, and Future