Preliminary notes to this article: Computer Engineer is not the same as Computer Scientist in some countries. I studied a career in Spain at the time when there was only this career available (in fact, I moved books from Mathematics to the brand new Computer Science building in my university). It was minimum 5 years long, in year 2002, and it is very very cheap. Think that it was around 1.5k dollars each year. Currently some Bachelors take 4 years in Spain too and there are many types of them. In this article I'm referring to a generic Computer Science degree with some Computer Engineering stuff on it, from software to hardware and inbetween. But this is just an idea.
Every time I work with programmers who learned Python some years ago, but didn't study a career or moved from a more artistic position into programming, or did a short course on programming Java or C++, and lack knowledge of important topics of software development, I tend to explain stuff that they don't know about in order to help them know more and work better.
But it's common to sense a little bit of frustration, passiveness, difficulty to learn and listen... or a very egocentric or defensive behavior to protect their own knowledge. Some of them feel seriously attacked when you ask them if they know a software pattern and they are forced to say no (probably because they don't even know what that is). Others learn tremendously fast and end up being better than engineers. It depends on the attitude, and the acceptance of not having studied a career and having to learn many stuff by yourself. And you can probably feel bad if you didn't. It's ok! In fact, I wish I had done that. It took 9 years for me to finish the whole process.
Anybody can learn programming. But unlike most people think, specially recruiters and people who don't know about it, being a Computer Engineer is not only being a programmer.
This is the list that I'd show people that contains all things I had to study and pass or study myself better afterwards in order to be what I am right now. Most of it is mandatory in a computer engineering career, you will not use most of it on a daily basis but it gives a background and foundations that improve the quality of your work immensely... unless you don't care about it and get stuck at the end of your career and forget most of it afterwards.
And it takes years and years to be an expert on any of these... It's funny to see how often job offers ask for "experts on c++". I don't think they seriously know what that means...
- Programming basics. Pascal programming language, or another very basic one.
- Machine code, compilation theory.
- Object Oriented Programming (OOP) theory: encapsulation, inheritance, polymorphism, etc.
- Basic Java programming language, generally used as well as Python to teach OOP theory
- Basic C++
- Linear algebra (matrices, vectors, spaces, basis, for a whole year)
- Discrete algebra (definition of numbers, groups, rings, and other mathematical items)
- Calculus (series, limits, and many many more)
- Fourier analysis, derivative and integral calculus.
- Basic Algorithmic theory (2 whole years). Big O notation, methods to convert recursive to iterative, methods to generate algorithms given a problem, methods to measure the efficiency of algorithms...etc
- Data structures: Trees, algorithms related to trees.
- Ordering algorithms (quick sort and many others)
- Data structures: Lists, Stacks, LIFOs, FIFOs, etc, and related algorithms.
- Medium C++ and programming concepts: Templates, namespaces, interfaces and a lot lot more.
- Software design or software engineering (a full year, and it's not enough)
- Software Pattens (many of them)
- Techniques for measuring times to develop apps via function points and such
- Organizational skills for software design and development. Paperwork, technical documents, etc
- Databases theory and practice (full year). Design concepts, simplification algorithms, efficiency. MySQL, Oracle.
- Operating System theory (a full year, not enough). Multithreading, internals of operating systems, and a lot more.
- UI development principles, and UX (user experience) concepts.
- 3D graphics programming (in case you're interested), like OpenGL...etc.
- Electronics principles, electricity and such.
- Physics basics.
- Analog circuit design, digital circuit design, and practical implementation (3 years non stop)
- Creation of RAM, Cache and other devices via circuit design and theory.
- Details of circuit implementation in many detail of processor history and evolution in time.
- Processors theory, memory management, heap, stack, how it is all stored and reserved, also via code.
- Hard drive memory management algorithms, ram and other type of memories too.
- Automata theory (a full year) : State machine design, algorithms on state machines and many other related things.
- Artificial intelligence algorithms, (a full year), theory. Cellular automatas, etc etc.
- Statistics and its use on algorithms.
- Robotics (in case you're interested), programming robots and inverse kinematics, direct kinematics calculations.
- Optional subjects like company management, economy principles, and such.
- I think I forgot many other things...
Maybe you will never need hardware design skills to be a good developer, but it certainly gives you a wide range of knowledge. I think everybody should at least once have a look at those things.
Apart from that, I specialized on graphics and GPUs so it took 2 more years, with a final thesis to finish my work there, learning even more programming languages and learning how to design GPUs, very hard maths, physics and such. I'll never be able to catch up on all those things...
Also you learn many other things related to human interaction while working on a very stressful environment of daily goals, like writing code that others will read, refactoring of code, working with other programmers. And also help you care about stuff like efficiency, memory management, and using many of the items you learned all through your career.
- Do you know exactly what you are doing when writing each line of code?
- Have you put time and effort to study how to do things properly instead of writing code that works?
- Have you studied and applied software patterns and good practices?
- Are you interested in learning new stuff that other of your colleagues use and you don't understand?
- Is your code efficient? if not, do you know how to write efficient code in the language you are using?
- Do you know if you are wasting too much memory on your processes? do you know how to debug and profile your code?
- Are you saturating the cpu or gpu?
- Are you designing your application or tool before writing a single line of code?
- Are you writing code that others will easily understand?
Everybody can learn what computer engineers do. In fact, you can do it more efficiently while working and I suggest you do and start working sooner. Just don't think you know more than them if you don't know or care about any of these things.
Hope it was useful for somebody. Share this to anybody who thinks they know enough but you know they don't. Feel free to leave any comment.