Engineering Masterclass: Resources that teach you more than college - Digital Design and Embedded systems
Many times in history there have been inventions and innovations that were expected to revolutionize the field of education, be it television, the internet, or the MOOC platforms. But none of them successfully did that, at least not to the extent anticipated. Public education sucks beyond repair and fails to impart employable skills to this day. Part of the reason is the fact that all these tech innovations made the target audience to a particular piece of knowledge larger and larger while it should have been the opposite.
Why you ask?
Because apprenticeship was the closest to perfection any tool of pedagogy ever got. This method essentially involved a single teacher dealing with a single student (at a time) to teach him or her in a way that was most comfortable for them and matched their abilities. Every other method forced the teachings of one teacher on several students at a time making it either too hard for the slow kids or too easy/boring for the smart and fast kids, essentially destroying the efficiency of learning, and most often destroying the child's interest in the lesson itself.
The internet, as it stands today has given us another unique opportunity by coming full circle. It lets the apprentice be his own teacher. There are so many great teachers out there accessible via the internet and so many forms of learning, most of them free. Anyone can devise their own learning method with these resources and teach themselves at their own comfortable pace. The goal of the 'Engineering Masterclass' series is to document some great sources of knowledge in the world of electrical engineering.
I find such a thing particularly necessary for this area of engineering owing to the extremely wide variety of concepts it can encompass. Most concepts in Analog design, hardly coincide with the day-to-day activities of a digital design engineer. A seasoned digital engineer might never have worked with a lot of DSP or Information Theory concepts that form the bread and butter of someone like say an audio design or communications engineer who might in turn have never done anything remotely close to antennas or control systems. Despite this mind-boggling variety, all of these and several other topics come to mind when someone mentions EE.
Electrical engineering is different in that everything is not reducible to thought experiments and takes effort, time, and often lots of money to see ideas and principles materialize in front of your eyes instead of just reading about it in a book. The same isn't true for something like software engineering owing to the virtually non-existent barrier to entry. This is probably the biggest reason software has eaten up the world and in many ways also fucked core engineering by dragging most of the smart people and prospective students to its side. Having studied and practiced this area of engineering has taught me how fun it can be and how different the real world is from the simplified view presented to a student. The goal is to help others like me who love this area of Engineering.
Sometimes it is not the topic of study that's boring, it is the way that topic is thought to us that de-motivates us from exploring further. This is doubly true of anything related to EE because of the aforementioned barrier to entry. A good teacher is the greatest yet the scarcest resource in this world. It is, however, not the best strategy to let yourself be at the mercy of this reality and choose your life path based on the teachers you found. With the internet, we do not have to suffer the fate of those before us who didn't have access to good teachers.
I write this article in response to one important question that I ask myself, ' If I could go back in time and go back to school, what all would I have learned from the internet so that I would not have to be at the mercy of my teacher to give me enough real project experience to get a job after school? '
I, personally have only worked in the areas of digital design and embedded systems and hence I'd like to limit my advice to these areas. However, I really hope someone else takes the cue and creates an Engineering Masterclass article for their own area of engineering general. It would be amazing if we could all link all these articles on all these pages, to create a timeless resource for the generations to come. Because however tall we build, we shall always be limited by the strength of our foundations.
Also, this article only aims to mention projects and experimental methods that teach you more than a lecture. Of course, it assumes that you have taken the basic courses (or read the relevant books) that have already thought you the basic concepts needed to handle these projects. If you're just starting out as a student of engineering, I'll mention some books to read but I'm not sure if skipping college altogether is a great idea. That's something the comments section knows better.
The approach of course, matters a lot while learning a skill. Many students give up in their pursuit of mastering a skill in engineering thinking they're not smart enough except the only reason they fell into the negative feedback loop is due to an overambitious target or a purely unguided method of learning. Here's a great article about having the right balance of guided and unguided approach to learning things on the internet.
In essence though, the best approach that I have found for effective and quick learning is a Tutorial -> Project -> Tutorial method. You watch a tutorial made by someone knowledgeable about the topic. You quickly start a project that applies the skills you just learnt. As and when you struggle to make progress in the project, you go back to your tutorial and fill in the gaps in your knowledge. Don't forget the role of online (and offline) communities of other people in the same boat. If you have ever been to college, you understand the importance of a friend who can explain stuff to you the night before an exam. Online communities like stack exchange, reddit, github and several other specific forums serve exactly this purpose. Learn to ask clear and good questions in these communities in a way that clears your block.
That's the motivation to write about this. This article will keep changing (read evolving) over time as I evolve as an electrical engineer.
DIGITAL DESIGN AND EMBEDDED SYSTEMS
Both the subjects mentioned above are expansive and in their own right and are standalone areas of Electrical Engineering. Yet, I choose to believe in a holistic approach towards engineering or work in general. I find it hard to separate these two areas since they are really different sections of the same vertical that stand on the foundation of semiconductor theory and boolean logic. Yes, most jobs will ask you to work only on one of these two things, but talking to enough people and digging into discussion forums will tell you why a well-rounded engineer generalizing in a variety of closely coupled skills can go much farther than someone specializing in just one thing.
Designing for embedded systems is essentially understanding how the different underlying pieces of hardware are working and gluing them up with the right software to realize a working application. Working on FPGA design will expose you to the other side of this coin. It is essentially the art of starting from a black slate, a bunch of logic gates and programmable interconnect to create hardware that can perform certain computations or communication. Upon this hardware comes the layer of software mentioned above. Having the knowledge and experience of all these layers of the stack can make you a hot cake in the job market and give you the mental models to build great stuff in the future. Lacking the knowledge of either of these will limit you to a small part of a large project.
Why FPGAs are the best and most robust learning tool for embedded systems and logic design...
FPGAs have come a long way since the times when only large companies with huge budgets could purchase boards and test their designs on programmable fabric. Today's FPGAs come at all sizes and prices enabling even absolute beginners to design any logic they wish and test it on these devices. Not just that, they let you go a step upward too, combine FPGA fabric with a processor core and you have a complete system that you can modify at the lowest level possible, you can practice writing your own firmware and interface with all sorts of sensors and modify everything right from the smallest flip-flop. FPGAs are a bit on the expensive side even today and might be too overwhelming for an absolute beginner starting to learn about electronics, but once you have a good idea about what you're doing, a single good FPGA-based development board can keep you busy for a very long time.
NOTE: I shall link to sources wherever possible but overall this is a list of projects that I believe when done sincerely at the undergraduate (or even high-school) stage can teach you way more than a classroom course will ever do and put you in the path for a successful industry job.
The importance of programming:
- Yes, you're an electrical engineer, coding isn't mandatory or even a part of your job description. I get that. But one simply cannot ignore the mindset shift a habit of programming computers gives you. It is the first step in the top-down approach of learning about the inner workings of the computer world. Also if you're going to take on an embedded systems job, you're going to get drilled with programming-related questions.
- I strongly suggest you get started with something like the C language, or maybe C++ (if you don't want to pull your hair out too often), and then learn more about C if need be. Yes, there are lots of articles out there that say something to the effect of 'C is history. Learn Python/Julia/JS/whatever'. This might be partially true for software developers who might never work on the lower levels of abstractions that C provides, but for you, it's going to be the opposite. If you wish to understand computers at a deeper level, which is a prerequisite for any embedded systems job, you'll need to start with C.
- The go-to approach for the CS kids is to spend their days and nights solving challenges in competitive coding websites. Which honestly is a strategy you can follow too. But if you think it's too much of a rat race, one more interesting way to practice programming is to write games or try to automate things in your daily work. That should keep you interested. Python is also a good language that EEs use all the time for scripting and automation. So if you have the time, explore that as well.
- MATLAB is not a programming language. You can learn it in minutes wherever you need it. Don't bother unless your coursework needs you to.
- A PC is to an engineer what a workbench is to a mechanic. Over time, as you work on various things that require you to perform small repetitive tasks as a part of your job, you realize that a major chunk of an engineer's time is taken up in performing boring repetitive tasks. It is inevitable that you'll search for ways to automate your daily tasks and reduce the time it takes you to do a particular task.
- By switching to any operating system that significantly cuts down on the Graphical User Interface and forces you to use the command line, you develop strong intuition about how an operating system facilitates the process of gluing together really minimal and simple tasks to end up with a heavyweight desktop application that saves you tons of time. This intuition is harder to develop while working with something like windows since you tend to work on a higher level instead of working with really small and simple commands and scripts. Additionally, any experienced Linux user will tell you why one should always strive to reduce the number of times they touch the mouse, pointing and clicking is a waste of time and breaks your flow of thought.
- Pick a Linux distribution. If you're unsure, just go with Ubuntu, either dual boot your PC or if you're feeling adventurous, make it your primary OS. It's going to be hard in the beginning and you'll face a lot of friction doing the simplest of things, but eventually, you'll thank me for this advice.
- Resources: Learning to use Linux as a beginner: https://www.coursera.org/learn/unix
- Learning to use Vim Editor: https://www.youtube.com/watch?v=IiwGbcd8S7I&t=1792s
Take your digital Electronics and Embedded Systems courses seriously
- Much of what's used in the actual hardware that runs our world, is not very different from the basics these courses teach you, for example, the theory of state machines is extremely popular in any industry application and is applied to everything from pattern detection to networking protocols. The basics of processor design, often thought to students by analyzing the architecture of 8085 like processors, guide your intuition even when you analyze the state-of-the-art SOCs.
- The fundamental mental models that these courses build are the foundation on which you shall develop real world stuff. The very reason Electrical Engineering has a higher barrier to entry relative to software engineering is these wide range of fundamental concepts that are usually best thought in a university setting over a period of time. Only when you are familiarized with the abstraction that begins at the semiconductor stage involving transistors and diodes and continues to build on the basic pieces till the point of microcontrollers executing abstract instructions, that you can comfortably use the modern tools and practices of designing electronic applications. Many may disagree on the necessity of these wide ranging concepts when most people end up working in one specific area of engineering for the rest of their lives, but I believe in being a generalist, at least in the initial stages of your education and career.
- Resources: 1.FPGA Design: https://www.coursera.org/learn/intro-fpga-design-embedded-systems
- Embedded Systems 2: https://www.bharatacharyaeducation.com/
PROJECTS: (Section Incomplete)
- Get started with the C language and practice as much as you can on competitive coding sites.
- Arduino Based big project
- Rpi based big project
- Pick up a basic FPGA board and build an SPI interface between your Arduino and the FPGA.
- Use state machines to build a UART interface between the Rpi and the FPGA.
- Implement a CORDIC core in the FPGA to implement all the trigonometric functions. This will teach you how logical-mathematical ideas are mapped onto digital hardware.
- Implement a simple game like pong on an FPGA and map it onto the actual hardware. Play the game on an HDMI display. This will teach you the complexities of putting stuff actually on the hardware as opposed to just simulating it. It will also teach you about timing constraints.
- resources: Timequest's user guide, Xilinx timing constraints user guide.