
Ask HN: Learning Engineering - xel02
I understand many people here are either from an engineering background or (like me) from a computer science background. In a lot of discussions people claim that engineering is a better background to have when it comes to problem solving.<p>I was wondering what are some good resources for computer scientists (or anyone) to learn the principles of engineering?
======
mooneater
I kinda like: <http://www.alankennington.com/philo/eng.html> after a quick
skim.

I have a computer eng undergrad degree from a solid canadian school. I cant
say we were explicitly taught "engineering principles", I wish we were. We
learned mostly domain-specific principles, but there are some deeper cross-
domain principles that are worth learning (like the link above includes).

I would add to the above, a very central concept is the "engineering trade-
off" -- there is no free lunch, etc.

Another smaller one I like is "visibility", seeing clearly into your system
and its state is critical to debugging/design and clear thinking.

There are also things you kind of learn by osmosis from doing projects and in
the workforce. Like, dont overestimate how hard it is to do some custom work
to create something new (a good FPGA programmer or C programmer can do amazing
things in a week). And also, dont underestimate how hard it is to maintain
said custom work (most university projects dont give a sense of maintenance
cost, the overriding cost in the real world).

------
drblast
I've got a B.S. in Comp Sci, and like you, heard that engineering would be a
more valuable degree, so when I had the opportunity to get my masters, I got
it in E.E.

I don't think there are many aspects of EE, if any, that prepare you more for
"problem solving" than CS. That's not to say it's not worthwhile. EE is more
difficult and broader than CS; it's also expensive and time consuming to learn
it all on your own.

The nice thing about engineering is that the math is extremely similar between
fields. Mechanical engineering uses a lot of the same techniques that
electrical engineering does, as many of the principles are the same (stability
is important in both).

You can use a lot of your CS skills to do engineering experiments. There are a
lot of EE fields that are nearly all done in software now. Software Radio is a
big one and Digital Signal Processing is another.

So, get an introductory Circuits textbook and learn the math. Learn
differential equations. Play around with robots and try to get them to do
things extremely accurately; this will introduce you to control systems.

Also, learn to love math and be able to read and understand formulas and
equations with a lot of Greek letters.

~~~
vecter
I'm not sure whether one can say that EE is harder than CS, or vice versa. For
starters, which subfields of EE and CS are you comparing? If, for CS, you pick
Theory of Computation, Algorithms, or Machine Learning, then those are pretty
difficult fields. If you pick programming languages, databases, or user
interface design, those are "easier" than the aforementioned (although still
challenging in their own right).

In EE, if you pick some of thee classes that Stephen Boyd
[<http://www.stanford.edu/~boyd/>] teaches at Stanford, I would imagine those
are difficult.

How much more difficult is convex optimization than complexity theory? I'm not
sure, but I don't think one's necessarily easier than the other.

~~~
drblast
I can only speak from my own experience but in general I found EE to be much
more challenging, particularly in the sub-fields like DSP that involved a lot
of probability.

I think what makes CS more tractable is that the theory is easily testable and
you can write a program and see things work. Many times when you're working
with signals and antennas all you have is the theory and there's very little
you can do to visualize what's actually going on, not to mention working in
the analog domain always throws you some surprises.

Never in CS will you hear "Well that's due to relativistic effects."

Additionally there's the practical problem in EE that you rarely encounter in
CS of actually building physical things. How many times has a program given
you bad results because someone somewhere turned on the microwave? :-)

------
MicahStevens
Learn by doing, taking things apart, exploring. A good school helps too. And
legos.. I'm not sure it matters whether you're an EE, or SE, or CS major. It
hasn't in my experience, I know crappy engineers from each faith as well as
good ones.

------
deniscales
I'm a VP of IT at my company and I have an Aerospace Engineering degree. The
only distinction that I can say between problem solving with an engineering
background versus a CS background might be the breadth of the tools you have
to solve your problems. Many times, I noticed programmers do a great job of
solving problems, but they are only able to use the languages they know best
to solve them. As an engineer, I felt that I was, mentally, more free to solve
problems with out-of-the-box ideas. I don't believe there is a book or write-
up that can help you there though, other than experience and the willingness
to open up your mind and research solutions outside of your normal expertise.

------
physcab
heh, I'm exactly the opposite. I was a physics engineering major with an
emphasis on electrical and materials engineering before I switched to more
computer-sciency stuff for graduate school.

Having seen both sides, I don't think either discipline prepares you more for
problem solving more than the other. It's all about your mindset.

What I will say though is that engineering problems are rooted in practical
issues. e.g "This suspect is approaching security, do we have a machine that
can spot them far enough away to interrogate them safely?" Science problems by
contrast are more concerned with the phenomena, e.g "Does the suspect reflect
enough light for our detector to pick them up at extended ranges given
atmospheric turbulence?"

tl;dr If you want to be a good engineer, seek out everyday problems and solve
them practically with a given budget and timeline. If you want to be a good
scientist, learn to ask better questions.

------
tel
For my major (Biomedical Engineering) we had an intro to engineering class
that did a pretty good job of laying down some basics. It was taught using a
chemical engineering book (which I won't actually recommend) and we spent the
lectures learning how to do mass/momentum/heat/energy balances using Chem E
block-flow diagrams (<http://en.wikipedia.org/wiki/Process_flow_diagram>).

 _Then there were the tests._ How would you lift an elephant? How many liters
of syrup are used in a Waffle House each day? Design a dishwasher. Explain why
you think implanted blood glucose meters are difficult to design. All in an
hour and with demands for equations, pictures, assumptions and models. These
aren't just Fermi Questions.

You couldn't study for it. You were graded like a kindergartener for "points
achieved" instead of percentage correct and yet you still somehow failed the
tests all semester long.

But at some point during the semester you start to enumerate assumptions,
apply math as a tool to create and communicate an engineering model of the
world, and then make designs and conclusions with error bounds and a good
understanding of your personal confidence in them. It was pure survival-
motivated.

In short, the class did exactly as advertised and we took one step closer to
thinking like engineers. I'm not sure that CS degrees cover something like
that, but I'm curious to know if I'm wrong.

So try that kind of thing. You're already used to modeling (building)
information processes. See how good you can get at building/modeling/analyzing
physical processes. Not knowing things won't hold you back from learning the
philosophy. It'll just make you less accurate.

------
amishandroid
What I have to say is probably more of a meta-response -- a few things to
think about / look for when you're learning.

One of the first things I was told when beginning my E.E. degree was that I'd
be _learning how to learn_. Many years later (after obtaining a master's), I
see that it is true.

Others here have stated, and I agree, you need to try _doing_ stuff. There
seem to be two sides to engineering: understanding/developing theory, and
implementing it. Both are worlds unto themselves.

Also, learn the tool of the trade: Math. Even if you don't learn a particular
subject, at least familiarize yourself with it enough to be able to later on
say to yourself "hey, I think this type of math is what I need to solve this
problem" then go and learn it.

(And, relating back to doing things, try looking at example problems and
connecting the concepts involved to their equational counter-parts -- this
will make connecting the math to the context easier when you try to come up
with solutions or understand something else).

I'd recommend starting out with these branches:

Differential Equations - as most physical systems adhere to these types of
rules

Linear Algebra - as this is useful for taking differential equations and
turning them into computations a computer can perform (via state-space) as
well as many many other things -- I've found a lot of the ideas I learned from
linear algebra were helpful in understanding other branches of math, such as
differential equations (e.g. basis vectors/functions)

and

Laplace/Fourier Transforms - lots and lots of engineering will look at things
in different domains (esp. these two), so it'd be a good idea for you to get
used to doing that.

Again, the best way to learn this stuff is by doing.

[EDIT: Grammar]

------
wwortiz
I can only speak from a more physical engineering (ME) persspective but the
best way to become better at problem solving is by solving problems. To add to
that you must also continue to solve harder and harder problems to improve at
a steady pace.

~~~
golwengaud
Terry Tao, a mathematician, agrees: [http://terrytao.wordpress.com/career-
advice/continually-aim-...](http://terrytao.wordpress.com/career-
advice/continually-aim-just-beyond-your-current-range/)

------
lleger
I'm going to give you an unpopular answer, but as an engineer I have enough
credence to say this:

You cannot become an engineer or learn engineering without going to college to
become one.

You have to understand: engineering is far different from computer science.
Even computer engineering — which is my field. It's a field that you can't
practice in without a degree. It's not like computer science where you can get
a job programming without a degree. No engineering firm will even consider you
without a degree.

And that's because engineering requires formal training from certified
teachers according to a standardized curriculum. The skills, thought
processes, problem solving strategies and specific knowledge of the individual
engineering fields is highly tailored. And, most importantly, extremely
arduous. If an engineer has ever scoffed at your degree in college, it's
because compared to his workload — no matter your degree — you have an easy
time. (Because of this, we're also all arrogant :)

But, to answer your question: the best place to learn the principles of
engineering is in an engineering class. In fact, it's the only place. Even if
you read online articles or textbooks, you won't ever get the full engineering
perspective. Only professors, uniquely qualified to endow the sacred
profession, can teach the principles.

If you're currently studying CS at school, I highly recommend sitting in an
introduction to engineering class. Speaking from experience, engineering has
helped me immensely in computer science. I'm a much better programmer from the
problem solving skills I learned in my engineering classes.

I hope this helps. Engineering is such a wonderful major, and I love every
minute of it. Good luck!

------
_delirium
I was CS for undergrad, but my school had everyone take an intro-to-
engineering-principles class that used digital signal processing (DSP) as the
domain. There are pros and cons to that, but it provides one view on a lot of
things that come up in many areas of engineering: mathematical modeling (and
validating and knowing the limits of mathematical models), analyzing systems
in frequency and time domains, different tools for characterizing the
aggregate response of systems (resonant frequency, impulse frequency response,
etc.), different ways of visualizing or analyzing the behavior of systems
(mostly in Matlab), solving mathematical models in reverse (e.g. finding a
physical system that will produce the desired behavior), and so on.

There are a bunch of good DSP introductions, and it's a useful thing to know
in itself, so I think you could do worse than working through one of them.

------
bpourriahi
My advice for learning CS, from someone who is completely self-taught, learn
ad hoc and strive to completely understand - trying to just understand stuff
built on top of other things without understanding the bottom layer is not
very good for learning.

------
r3570r3
Principles of engineering is machine building. Then, it takes off as your
interest. The funda of Machine building in Computer engineering is called
Automata Theory. So, you can start with Formal Language and Automata. That
along with mathematics forms the principle of any form of engineering.

------
schn
Lego.

~~~
yurisagalov
This is actually not far from the truth. Engineering is an art and a science,
and you can only get better at the art part by doing (the science can be
taught, and then reinforced by 'doing' as well).

------
krf
MIT OpenCourseWare - ocw.mit.edu - has a lot of engineering courses.

~~~
CountSessine
So does Berkeley - in fact Berkeley seems to have more core-engineering
courses on the web and iTunes-u than anyone else.

~~~
elg0nz
And Stanford even has iPhone Programming classes. But MIT was the one who
started it all, so some credit is due.

