Computer Engineer vs. Computer Scientist

July 11th, 2009 · 39 Comments ·

Which one are you? I am an engineer. But maybe we should first define the differences between the two. Engineer cares about how the system is put together whereas CS cares about how it works. Do you care about the technology or the algorithm?

The Interview

Since I am on engineer, these are the kind of questions I ask in an interview:

  • Imagine you are an evil developer, how do you make code hard to test?
  • How would you store a math expression tree, such that you would have an evaluate() method and a toString() method which would print the tree in an infix notation placing the parenthesis only when necessary.

On the other hand a CS asks these “algorithmic” questions:

  • Write a merge sort method which merges ‘n’ files into one.
  • Write a method to reverse a string in place.

The solution to engineer’s question is a set of classes interacting to define a system. Whereas a solution to a CS question is a single method doing something complex. Now, I don’t know about you but when was the last time when your application consisted of a single method. When was the last time when your system broke down because someone did not know how to write one of these algorithmic methods? When was the last time when your system broke down because the interaction between classes has gone too complex? I believe that most people are asking the wrong questions in the interview.

Algorithms

Now there is a time and place when an algorithm is exactly what the doctor ordered. Video/voice codecs, image compression, revision control, database optimization, and so on. But notice that all of these are nothing without some “application” around it. Video codec is nothing without YouTube around it, and DB engine is nothing without countless utilities, and database drivers which go with it. Chances are, when you are building an application, you will fail because  your class interaction will go out of hand, not because you did not know how to solve some algorithmic problem. Libraries have already been written for the most (80%) of the algorithmic problems out there. So why do you insist that an interview candidate knows how to sort integers. Is that what he/she will be doing all day long? While building your web application?

Engineer vs CS

The thing is you need both, and preferably in one person. It is also true that no one is 100% engineer or 100% CS, there is a blend in all of us. Algorithms require raw brain power, whereas engineering requires prior knowledge (best practices) which you cannot get by thinking about the problem harder. You can only get “engineering” knowledge by learning from others. I have seen too many people focusing too much on brain power alone. We hire young kids and we let them loose on a code-base, and than we wonder why we can’t change anything because everything is tightly coupled. Hint, it is not because they are stupid.

The Reality

The truth is in the ten years or so I have been out of school I have been fighting bad code every step of the way. I can’t remember when was the last time I had to solve an algorithmic problem. The most complex/algorithmic intensive code I have written was Testability Explorer, which is a byte code analysis engine which tries to determine how testable your code is. I have written it in my free time, and the thing which enabled me to write such a complex “algorithm” were unit tests, and lots of them! I had to rely on “best-engineering-practices” to build something which is “algorithm intensive”. In other words it is my engineering background not my CS which made it possible. I think CS, is required but insufficient.

Going Forward

I would love for the industry to reflect on itself and realize that its problems is not lack of CS majors, or a the lack of bright people, but a lack of good old fashion engineers, thetn maybe we may start asking a lot more questions, to which the answer is not a single method, but a collection of classes interacting together. It took a handful of scientist to come up with an atom bomb, but it took countless of engineers to work out everything else, and software is no different. You need a handful of CS, and an army of engineers.

Tags: Uncategorized

39 responses so far ↓

  • Tomas Mikula // Jul 11, 2009 at 9:54 pm

    > I believe that most people are asking the wrong questions in the interview.

    I think that CS knowledge is better acquired by study, while engineering skills are better acquired by practice/experience. Now when you are interviewing these kids who just finished the school you cannot expect them to have this experience. So what else will you question them other than CS knowledge?

  • Dennis Gorelik // Jul 12, 2009 at 1:01 am

    Misko — you consistently use “than” instead of “then”…

  • misko // Jul 12, 2009 at 8:49 am

    thanks, I think I fixed it..

  • misko // Jul 12, 2009 at 9:01 am

    @Tomas,

    kids out of collage will have less engineering knowledge than an industry veteran, but they will have some. It is not a binary thing. Most people don’t ask anything outside of CS. Then the college grads hang around few years and they assume that the question which they were asked on the interview are the questions which they should be asking. So they ask CS regardless of who they are interviewing.

    I personally, refuse to ask CS questions. I want to know how is your intuition about class interaction, because even as a new collage grad that is what you will be doing all day long. Especially as a new college grad, I am NOT going to let you do anything algorithmically intensive. Many times I bring a computer into the interview and we pair on something simple so that I can see how comfortable they are with the IDE, working with others.

    To me, it feels like we are hiring musicians into an orchestra and instead of asking them to play a piece of music and decide on the quality we hear, we talk music theory and then you get hired because you know a lot about theory. I realize that a new college grad will be worse than a seasoned musician but, I want to make my decision based on what they will be doing all day, and that is playing music not explaining music theory. The position is for musician not for music teacher.

  • bank kus // Jul 12, 2009 at 11:44 am

    I often see it as the “why” vs “how” debate. Asking detailed algorithmic question IMO is not much different than asking what the 3rd parameter to POSIX lstat is. “why” can be a mix of engineering and “CS” since it requires thinking ability ( not quoting some dead scientist’s work blindly ) *AND* background information in the area of relevance (engineering perhaps?). Why is paging reqd. What problem does it solve. How did we as CS get into this business. Can the fundamental problem be solved by some other means and so forth.. rather than how does Linux do page swapping.

  • Dan // Jul 12, 2009 at 5:10 pm

    I’d say that I’m a software engineer, but my qualifications say “Computer Science” on them. While there are clear distinctions between Computer Science and Software Engineering, I don’t think we need to pick sides.

    Practicing Software Engineering without understanding the fundamentals of computer science is dangerous. I wouldn’t employ a programmer who didn’t understand recursion or who wasn’t at least aware of the different complexity classes for algorithms.

    On the other hand, Computer Science isn’t particularly useful without Software Engineering to put the theory into practice.

  • Kieron Wilkinson // Jul 13, 2009 at 2:09 am

    Interesting reading. I think another aspect to this is that Computer Science is a science in that it is exploring the boundaries of computation. I was taught CS at University, but only a small part of it I would call actually *practicing* science.

    I think of myself far more as an engineer. As much as I would like to consider myself a scientist, I just don’t. What I am really doing is applying the priciples and work by real computer scientists. The little novel concepts I come up with are far too specific to a problem domain (and not published) to be considered real science IMO.

  • Sridhar visvanath // Jul 13, 2009 at 2:38 am

    Misko, u always beat me to it…I had this thought for a while…and I want to start my own blog with this entry…:-( grrrrrrr….

    Anyway, to me the question is about emphasis. I mean, if there is a place where they just “ask” about experience, then we need to write a blog and spread word about that and emphasize on “fundamentals” .

    Now unfortunately the reaction to that has been to ask the person to write an algorithm in the interview. I agree with Misko that I had never gotten much out of an algorithmic questions either. And hence I guess the emphasis to go back to engineering. So we need a balance and I think Misko is right about this.

    Another thought: People feel real good about asking and answering algorithmic qns (me included) , which is ok, it is just that they belittle engineering qns totally. The answer is to take their logic to extreme: Oh u want fundamentals…let us go back to Abstract algebra, Quantum physics etc…Do u think it would be ok to just hire a guy for the role of S/W engineer just because he answers some physics qns right. I would not and it would be not fair to my organization or to the physics wizard if I tried to do that. …ooof…long comment…:-(

  • Adam Gordon // Jul 13, 2009 at 10:45 am

    So, does this mean you feel that some of Google’s infamous “problem solving” questions are not really relevant?

    I felt that one of the two I was asked during my first (and only) interview was very irrelevant. The second, however, was not (but I bombed it because I had no thorough experience in that area).

  • Brendan Miller // Jul 13, 2009 at 11:09 am

    I agree that the bulk of work that an engineer does is not CS… however the difference between the code written by someone with a good math and CS background and someone who does not is *palpable*.

    The kinds of problems that can be approached and the means by which they can be approached are determined by understanding of theory and of how the OS, malloc, GC, etc work. A lot of problems can be solved by a brute force approach, but few can be solved *well* that way, and many not at all.

    I recognize that most new people out of school write sucky code that is hard to read or maintain, and that is a problem. However, I don’t think that sacrificing CS standards is the right way to solve that problem. If anything I think that standards need to come up across the board.

    Also, I think libraries are simply not a silver bullet for algorithmic and datastructure problems. Fundamentally, using libraries means counting on someone else to solve problems for you. From a business perspective, using third party libraries means never being able to do better than competitors that use the same library. Using third party libraries also means not being able to get to market ahead of your competitors, because you are waiting for library releases on the same schedule as them.

    I don’t mean that we should not be using libraries. Obviously, there’s not much point in rewriting basic datastructures in Java (not that it’s difficult at all though) but that libraries that deliver core functionality for a given application, like codecs for a video player, or register allocation for a compiler probably shouldn’t be farmed out if you are working on a commercial project.

    Of course the rules for open source are fundamentally different, as those projects are cooperative, not competitive.

  • misko // Jul 13, 2009 at 11:37 am

    @Adam,

    Google has many areas where true CS is exactly what you need. Search, Adsense, to name a few. But, I think my suggestion in the blog post was not one vs the other. It was more of we (as the industry) focus way too much on CS where what we do most of the time is Engineering.

  • Sarthak // Jul 13, 2009 at 12:01 pm

    I agree, both of them are needed. However, when we are just assembling various pieces of code into an application, then more of Engineering is required. Lot of the primitive algorithms are available to reuse. In a majority of projects, proper ‘Engineering’ is required to wire the pieces together and still keep the design testable.

  • tinou // Jul 13, 2009 at 5:06 pm

    you can be a great “computer scientist” and a horrible “software engineer”. that is very true. but you cannot be a great “software engineer” without being a decent “computer scientist”. how many times do you see code like this:

    List myList = new LinkedList();
    ….
    myList.get(99999)

    an engineer without a decent understanding of some basic CS-ish stuff won’t know why this can be problematic.

    i would not hire someone *just* because they can write a merge sort, but if they are clueless about what a merge sort is, that would scare me. one day they might decide to use a bubble sort library w/o knowing it.

  • vyadh // Jul 14, 2009 at 12:48 am

    I can’t see how we are scientists if we do not use the scientific method. At least, not in any formal way that would be recognisable by science. Certainly there are scientists in computer science, but I cannot seem to think of myself as a real scientist if I do not formally hypothesise, form theories, and state the tests that will either confirm or falsify those theories.

    Somebody suggested a similar situation with math on DZone – and in the same way I do not see maths as a science. There *is* science done in maths, but most of the people who apply the concepts of mathematics do not actually do “science” themselves IMO. I wonder if applied mathematitions consider themselves as scientists?

    Interestingly a friend of mine who trained as a biologist, worked as a scientist for a while, and now works in genetics does not think of themselves as a scientist now for the same reasons – I suppose the crucial difference is between application vs. research.

  • Tim // Jul 14, 2009 at 2:01 am

    Why is there so much discrimination between the two. Every day Eng vs CS issue gets worse and has almost become racist.

  • Adam Griffiths // Jul 14, 2009 at 4:08 am

    For a prospective student, would you recommend a joint degree CS/Sofeware Engineering vs just CS or just SW/Eng?

    Thanks.

  • tek // Jul 14, 2009 at 6:26 am

    Really interesting read, some good comments as well. I’d lean towards agreeing with Dan.

    One needs to other and people can be a good slice of both given the time and chance to gain experience, especially if they have the want for it.

  • misko // Jul 14, 2009 at 7:16 am

    @Tim, All I am saying is that we need to focus more on engineering. We are neglecting it.

  • misko // Jul 14, 2009 at 7:17 am

    @Adam,

    for prospective students I would recommend building some software in free time. Too many students I interview have the theory, but never done anything with it.

  • Maintenance Man // Jul 14, 2009 at 7:48 am

    I am a CS. So tell me. How does an evil developer make code hard to test?
    Are we talking about choosing poor variable names so unit test is difficult? Or is this something utterly evil such that black box testing gets tough?

  • misko // Jul 14, 2009 at 9:23 am

    @Maintenance Man,
    poor choice of variables are least of my worries. see: http://misko.hevery.com/2008/07/30/top-10-things-which-make-your-code-hard-to-test/ Not exactly a list you were thought in school.

  • Brendan Miller // Jul 14, 2009 at 10:59 am

    @vyadh What makes science science is empiricism in conjunction with analytical thought. You are correct, mathematics is purely analytical, so it does not qualify as a science. However, that’s not a mark against it, as it is a *component* of any science.

    Computer science is science because it combines mathematics (algorithmic analysis, theory of computability) with empirical and statistical testing (performance testing, and uh… software testing?).

    It’s true, a lot of engineering doesn’t require a lot of tricky algorithmic analysis, or formal proofs, so it is weak on the analytical side.

    On the other hand, I think there’s a lot of room for application of the empirical aspect of science, which has historically been ignored in computer science because of the influence of people like Dijkstra. In fact, I think that is exactly what this blog is about.

    Probably at some point software testing will need to become more formal and developer a stronger basis in statistics. Right now, a lot of what happens in practice is very “seat of the pants” based testing, but that has a lot to do with computer science being a young discipline.

  • Brendan Miller // Jul 14, 2009 at 11:11 am

    @vyadh A related point. A lot of people seem to think that there is some concise and universal”scientific method.” I think this was mentioned to me in high school?

    There is no ISO Science Certification Program. Science actually composes a number of schools of philosophy, came into existence fairly recently, and is evolving fairly rapidly. For instance, logical positivism was popular early in the 20th century, because has been replaced with more nuanced views.

  • Adam Gordon // Jul 14, 2009 at 11:22 am

    @Misko, thanks for the reply.

    I guess then I’d have to agree. If one’s goal as an interviewer is to challenge the interviewee and have him/her think outside the box – at least make it relevant to the position for which s/he happens to be interviewing.

    That said, the position for which I was interviewing was in the Zurich office doing web application development, so the first question regarding an egg drop wasn’t relevant as far as I could tell. The second, dealt with database design and storage and I was clearly out of my league – but for a web application position, was very relevant.

  • vyadh // Jul 15, 2009 at 5:58 am

    Brendan: That has given me a lot to think about. Thanks!

    I wasn’t knocking science btw. It is my great respect for science that makes we wonder how software development can really compare to those ideals. You put well when you said “seat of the pants” based testing. I think this is true even when doing something like TDD. I’m not craving something more formal mind, I’d like to concentrate on getting work done.

    I agree there is no formally recognised standard for the scientific method. However, I would argue that it’s basic concepts (accumulating evidence, creating hypotheses + formation of theories, peer review) are agreed by most scientists, and it is those concepts that I see little of in software development.

    Oh, and what is wrong with logical positivism? ;)

  • alepuzio // Jul 16, 2009 at 10:04 am

    Hi,
    I’m an Italian java developer and my thesis is about software engineering. In my experience the jobs of developer and software engineer are confused and any softwar eengineer must be able to solve a tipical problem of CS poeple, simply because a team have’nt the budget for a strong separation of roles.

    >library and algorithms
    the idea “Not coding because sure there’s a library” is very terrible for the sector: the value of IT people is’nt only to understand the functional view, but translator this view in computer world. I see a lot of problems by uncorrect algorithms that lower the performance and throws exception for an exagerate use of memory.
    I think the software engineer is mor important for testing, but the testing is matter only when the manager see the monetary value, and a lot of software engineers are unable to express this.

    bye

  • Val Karpov // Jul 28, 2009 at 7:58 am

    I very much have to disagree with Misko. When I’m interviewing a potential hire, I don’t care much about asking engineering questions. Why? Testing-related questions like ‘what makes code untestable?’ basically ask people to recite from memory. While I agree with you that asking somebody to write out a simple CS101-style algorithm that they’ve seen a hundred times is also counterproductive, if all you ask are essay questions, a well-trained parrot could pass your interview.

    In an interview I’m screening for intelligence, problem-solving ability, open-mindedness, and the ability to fail gracefully. Teaching a person with these qualities to write good code is considerably easier than dealing with somebody who can talk all day about good engineering practice but lacks intelligence or flips out when they don’t know how to do something.

  • andre // Aug 17, 2009 at 11:04 am

    Interesting article. From where I graduated as a computer scientist (UBC), the engineers who specialized in software development took the same courses (and them some more in engineering).

    So there was no distiction, we both learned CS concepts of algorithms and less about the real issues at hand of composing systems.

    I agree, it’s not very common to have to create algorithms and I think CS degrees focus too much on this. It’s more of a mathematical problem/exercise that has applications down the road if you do a masters/PHD. Real world problems involve composing systems that are reusable (which you learn about), that can scale well, easy to adopt, and can be developed at a reasonable cost/time.

  • Uzma // Aug 19, 2009 at 6:56 pm

    Great read! Completely agree about libraries being available for intense tasks and that concentration should be on well designed and maintained systems.

  • jemsking // Mar 5, 2010 at 4:16 am

    hi to all, i want to inter into the university studying computer.please i will like and expert to orientate me on what to do.i will be very grateful if someone could help me.i equally want to know the clear distingtion between a computer ingeener and a computer science.plz help

  • st oliver // May 23, 2010 at 10:16 am

    what to be a computer engineer

  • reginald // Jul 13, 2010 at 12:52 pm

    what are the relevant of science to the recent development to computer engineer

  • Krupal // Sep 20, 2011 at 11:23 pm

    Engineering is like building a house. You know a few good models, know the pros and cons of each and so given a situation you select a model and QUICKLY implement it with little or no customizations/modifications/innovation. Clearly its a RESULT ORIENTED strategy with the emphasis being on achieving the TARGET QUICKLY. Where as a computer scientist, for that matter any scientist, takes more pleasure in the fact that he was able to innovate an aspect or two of the house rather than completing the house itself! In short the scientist makes models and the engineer put those models to use. So as misko said we need a handful of scientists and an army of engineers.

    On an other note, I think the transition from computer graduate to a software employee drastically narrows down the CS domain we deal with and so when you’re a scientist in a much broader domain in college becoming an engineer in a smaller domain is easier and the CS skills work hand in hand with your engineering skills and believe me they really do make a difference. Where as the other transition from engineer to scientist is difficult specially when CS skills are a small part of your day to day job and you’ve to meet deadlines you can’t afford to spend lots of time in research and technical know how . So i think this might be one of the reasons for asking such questions in interviews but i still believe there should be an adequate test of both the skills.

  • pongo louis // Nov 12, 2011 at 10:07 am

    am a computer scientist bt i think we should not think of the name bt the out come.i love cs

  • jess // Aug 1, 2012 at 9:06 am

    Computer Scientist is really interchangeable, because of cross courses being taught at universities between engineering and computer. Nowadays both are consider engineers because complex models being use in industries.

  • Billy // Nov 16, 2012 at 3:09 pm

    I have degrees in both engineering and computer science. In my opinion, you can’t call yourself an engineer unless you have an engineering degree. Engineering is the application of science to build things and make things work. An engineer takes many courses in basic science including Chemistry, Physics, Mathematics, Biology, Materials Science/Mechanics of Materials/Fluid Mechanics, Electronics, etc. A computer science degree normally doesn’t provide enough of any of these topics for someone to call themselves an engineer. I think most computer scientists like to call themselves engineers because in their own mind they think is sounds better to the public and because engineering degrees bring more money than computer science. Having done both, I can say that obtaining an engineering degree from an accredited university is much tougher than a CS degree. Just my humble opinion.

  • john // Jan 2, 2013 at 6:00 am

    great artcle. Brilliant comments…am aspiring to study a course in the university about computer….software enginnering to be specific cos i have background and basic knowledge about programming especially in java….i love to create theories and hypotesis….yet i enjoy to build and construct. So i was a bit confuse in chosing either CS or Comp. Engin. But thanks to to u guys (the author and those who commented) am definatly going for Comp. Eng.

  • Wilson // Jan 3, 2013 at 10:28 pm

    @Billy: Engineering degrees in general are harder, so I would not doubt it.

  • CE & CS « rotesbrot // Jan 11, 2013 at 3:17 pm

    [...] http://misko.hevery.com/2009/07/11/computer-engineer-vs-computer-scientist/ [...]

Leave a Comment