views:

623

answers:

8

Should software engineers and computer scientists know the fundamentals electronic engineering such as circuits, capacitors, VLSI and other important concepts? Do you think that training in this area makes for a better programmer?

+3  A: 

Software engineers should be well aware of the concepts in software engineering, mathematics, logic, and algorithms. Awareness in electronics... not much needed.

Computer scientists: They should know the basics of electronics for sure.

Niyaz
+6  A: 

I don't think software engineers need to know a lot about electronics. I do think it applies the other way around however, that electronic engineers that are going to be doing anything on a microcontroller or DSP or anything remotely like a programmable computer need to know the fundamentals of software engineering.

I say this from years of experience in the embedded industry, and several code reviews which I'll never forget...

Frep D-Oronge
+1  A: 

what do you mean by 'computer scientist'? A lot of computer science can be very theoretical and in order to do well you're more closely aligned with mathematics - because thats really what it is.

I think it depends on the level you're working too, but a basic idea of what is happening e.g. registers, cache hits, memory space, etc would be useful in understanding why you might take one approach over another.

Steven Adams
+1  A: 

Should software engineers know the fundamentals of X? The answer is probably no, whatever X is.

There are many kinds of 'fundamentals of X' knowledge that make a better software engineer, but that does not mean that any one software engineer should know them all, or than any one X is always better than all of the others.

This all arises because software development is essentially a multi-disciplinary activity, where the most useful people have skills that span more than one of the technical specialisms involved, not to mention the business areas and 'soft skills'.

Peter Hilton
+1  A: 

It all depends on which field you work in.

It sure helps to know your electronics basics if you are supposed to write a Windows-based circuit simulation software, although there might not be any actual physical circuits involved. Even if you just write the GUI for this software it helps to understand how your customer (an electrical engineer?) uses it.

Most of the embedded software engineers I know are in fact electrical engineers who have to have a profound knowledge of software engineering to make things work on physical targets. Here it is important that the engineer is familiar with (software) things like task scheduling, rate groups and low-level C code etc. and (hardware) things like external watchdogs and processor support circuits.

cschol
A: 

A software engineer certainly needs to know how computers (and devices that contain computers) work from a logical view point - but I don't see how knowing the difference between a capacitor and a resistor will help write better code.

Mike Heinz
+4  A: 

As an embedded engineer with both software and hardware skills, I think it's funny that some of the software engineers say, essentially, "Software people don't need to know much about the hardware, but hardware people are better off if they know software." The truth is that both disciplines are benefited by a broad view of each other's territory.

This boils down to Jeff's question - "Should I learn C?"

And the answer is that it depends.

It is useful to know digital logic as a software engineer, as you suddenly understand what all those bit operators do, and how you can write more efficient code more quickly using instructions the computer's logic is based on.

Unless you're working on embedded systems, though, it's not terribly useful to understand analog electronics (AC & DC analysis, Capacitors, resistors, etc). It's not that these are hard or obtuse topics, it's just that you'll so rarely run into a programming problem that has a parallel.

If you're working on embedded systems, however, I strongly recommend understanding some basic fundamentals so you and the HW engineer can avoid the typical "the problem is in the hardware/the problem is in the software" discussion where no work is done and the issue isn't resolved. It's very useful in this case to know how to use a logic analyzer or oscilloscope and multimeter - you don't have to be a pro, but you need to know that the spurious pulse on the memory clock that wasn't your software's fault is something you can show to the HW gals and guys and prove using their tools. Because they sure as shooting will use software against you and push the problem into your arena.

But there are some very strong parallels between digital electronics, discrete math, and software engineering such that it can be very enlightening to understand what a logic table is, how to reduce it, how a state machine works in hardware, how the different types of memory work, the difference between processor architectures, how various communications systesm work (ethernet, CAN, RS-232, etc) at the wire level, etc.

But at the end of the day, there's only so much time for understanding, and a software engineer may be better off learning about C# gotchas than implementing a binary search in a verilog state machine.

And the Knuth shall set you free...

Adam Davis
+1  A: 

Speaking as an electrical engineer: Circuits, capacitors, VLSI : no. They aren't software-visible, even to the embedded programer. Computer architecture: yes. Caches and memory hierarchy all effect the performance of software.

Brian Carlton