Launching a Software Engineering Content Series

TLDR: I’m launching a video tutorial series channel on youtube, and other platforms to teach programming, from my prospective the way it should be done, (start low level, build a solid foundational knowledge, then work the individual up to higher level concepts).with a long rant of the sate of reality concerning programmers fresh out of college, looking for suggestions for additional content to cover

Hey Folks,
I’m a FIRST Alumni, been out of the community for a few years, and I thought I would give back to the community, in a bigger way than just mentoring one team and few software kids. After working in automotive industry for 8 years and in the robotics, automotive, and software industry in general for over 10 years, I have found there is a huge lack of knowledge each year that goes by with more and more software related majors exiting college.
I cant count how many times I have interviewed candidates and are amazed at how il-prepared college has made people. Huge lack of IMO foundational software skills of which are key. I.E how a compiler, linker works, pointers, interrupts, real time event systems, communication protocols, etc. Way too many candidates exit college, want to become a software engineer in embedded systems and have very little knowledge regarding low level items, most of the knowledge they seem to have is in regards to high level languages like java, python and c#.
The issue I see is yes they many know some of the syntax and can write a program in java or whatever but they dont really understand the concepts, were talking encapsulation, polymorphism, inheritance; something i would expect someone who has studied high level languages specifically OOP like java to understand, but yet they don’t. And its concerning considering i look back and consider where I was at their age, and what type of software i was writing and what I understood back then, Times have changed in the wrong direction and this makes me fearful of the future we will have as a consumer, especially when many of these folks don’t have a clue on memory management and rely solely on a garbage collector. Seems like all consumer products will have to be built around super high end processors just so they can be programmed in Java, because that seems to be the only thing anyone out of college knows these days. This will defiantly cause the cost of products to increase.

There is a huge difference between being able to write a program in any language that satisfy a compiler and functions as needed, verses engineering software for a solution and having a deeper understanding why the language was chosen and what design patterns to use, and how to continuously improve the software and How to Engineer the software to be portable, and scale-able.

These folks defiantly lack that. But please understand I in no way blame them. I blame the curriculum and big business interjecting to lobby funds in order for their product to be taught (in the end creating users rather than engineers) .

My goal is to fix that, That is why I’m creating a video series, going back to basics, starting from scratch and working up the pyramid of abstraction. Sure some folks want to be web devs, mobile app or pc application developers and believe they don’t need to understand or be taught these things as they believe they will never use them. I say NAY NAY… a mechanical engineer better know how to use a hammer and names, better also know how use a drill, mill and lathe. If not how could they effectively create something that is Manufacturable??? “it could be built in theory… but not practically”.

My method of teaching is the same way i was taught by my software mentor over a decade ago. This method was normal 30+ years ago as there really wasn’t any other way. But yet the things they build imo was way more efficient as they did more with less. They didn’t have 16gbs of ram, and 2tb of hard-drive space. They weren’t running at 3GHz+. They were disciplined engineers, something that is strongly lacking today.

Its more about how one things rather than the language they write it in. BUT understanding the where it boils down to (machine code) and unavailing the layers of abstraction where concepts and principles can be applied at any layer of the pyramid IMO is the key to building disciplined software engineers.

Many of these students including first students first are exposed to programming via labview, java, or python. this is bad, it causes these students to build bad habits that are shrouded away by the compiler only to be revealed as an issue later in their career when the project and its requirements are much more complex than a first robot. Does it get kids exposed? YES of course… can it be improved absolutely, focus on quality not quantity. the worst thing we can do is dumb down educational tools to increase the numbers of people involved, this causes two things to occur some of the group receives a false sense of confidence into what the industry is really like until the real-world hits and its a disaster for them as they are il-prepared. This is also why college curriculum dont expose students to C as their first programming course as too many in the past go to the pointers lesson and failed and dropped out. What did the colleges do to increase numbers? Dumbed down the courses, flew past pointers and started teaching python and java as first languages just to keep the numbers up… again QUALITY OVER QUANTITY is what we should be striving for… instead of simplifying the whole group, why not focus on the group that doesn’t get it bring them up.

Anyway rant of the current state of things is over. Again, I’m creating this series to give back to the community of which I wouldn’t be where I am now without. It will be very in-depth and isn’t a hey learn programming in 6 hours and be on your way type thing. I will be trying to “download” everything I know into these videos. I also plan to dedicate another series specific to FRC programming. But my goal isn’t for the first students to just watch the FRC programming course and be done. They defiantly should go thru the entire series when it is posted as it will only make them better at what they do in FRC.

I suspect the videos will begin posting around Mid June early July.

I would like suggestions from Software Mentors or anyone on things I should put emphasis on in these videos, suggestions for topics. etc.

(hopefully there are other “old timers” like my self whom feel the same way) any feedback is good feedback in my opinion.


I don’t mean to distract from the point of the thread (the content you’re providing), but I disagree a bit with some of the things you’ve said. I agree that performance and discipline are not a big enough focus, but you can learn about these things and they are indeed important with high level languages. I’m a front end engineer, and I can tell you that performance is key on websites if you want to keep visitors from leaving. Half of mobile phone users abandon a website if it takes longer than 3 seconds to load, and given that internet speeds are all over the place and it’s in the best interest of businesses to keep as many customers on their site as long as possible, you can be sure that they try to optimize their sites to load as fast as possible on even poor connections.

At my job, discipline is very important too, despite mostly using high level languages such as java and javascript. We have strict policies enforcing high code coverage for testing, we document our code carefully, every change needs to be put in a pull request in github and reviewed by several people, and they must pass continuous integration tests that checks code coverage and quality.

So quality and performance are still very important in jobs that use high level languages, and you can definitely teach students how to create fast, well-written code in a more modern language.

I also don’t think quality and speed should be taught for their sake alone. Teachers should focus on what the students are there to learn. If that means skimming over some concepts such as compilers and the low level features of languages and operating systems, then so be it if they’re there to become web developers. Their focus should be to become quality web developers, not quality developers in the most performant, low level language possible.

I also don’t think starting at a high level is necessarily a bad thing. My philosophy as a teacher is to get students as enthusiastic as possible. For me that means showing them that they can do pretty cool things without much effort. High level languages and tools can do more with less (even at the cost of performance and quality sometimes) so they are better suited for this goal. If students are enthusiastic and feel like they’re capable of doing advanced things on their own, they will work on projects that interest them and learn what they need on their own.

Anyway, I still think low level concepts, performance and quality are very important to teach, and I appreciate the content and perspective you’re providing. I’m looking forward to seeing what you come up with!


Having seen similar deficiencies in people claiming to be experienced software developers in a similar industry , I very much understand the struggle.

Having been one of those difficent people myself, my general impression is that the true struggle is with folks who aren’t willing to learn and expand their knowledge to fit their job role. That is greatly helped by the availability of accessable, entertaining, and accurate content.

For any problem that’s getting solved, there are two components: the process of deducing the solution, and the “hard facts” utilized along the way. The latter is a textbook thing, but the former is much more abstract. Content created can address one, the other, or both… But keep in mind which one you are trying to attack as you create your content.

Yep, this. There’s a common problem where people who know some facts about a random subset of a field tend to think that knowledge is vital and a checklist for success in that field. Be careful not to fall prey to that kind of thinking.

Remember, the goal of software is to get stuff done. Some people take pleasure in micro-optimizing various parts of that software in ways that typically make no difference to the end result. If that’s what keeps one motivated that’s a great thing to know about yourself. But again, be careful not to confuse it with the only way to do things.

They’re also really useful for the 95% of cases where performance matters far less than quickly getting a bug-free implementation of a process working in software.


Some might call this a minimum viable product (MVP).

The process of optimization and feature addition comes later.


I think you are expecting too much specialized training from a college degree. For a parallel, consider doctors. After normal college, they go to medical school, become residents, and have years of training before being fully trained doctors. Learning specialized skills - cancer, heart surgery, etc - takes continuing education, dedication to learning, and such.

As a senior programmer today, one of my tasks is to teach, inspire, and guide newer programmers. My goal is not to make them into clones of myself, but to help each use their skills and talents in positive ways, and become better at their craft over time.

The baseline for me is not whether a RCG is going to be a master of their task in 1 month, but that they have a net positive contribution in their first year.

There are so many specializations in the programming world, I would never expect a college grad to be production ready in any of them.

p.s. Yes, I’m an old timer that has written in assembly, made custom graphics primitives, debugged seg faults AND page faults. All starting from a Math BA.


If those are your needs you may be looking at the wrong candidates in the CS grads of today — you might consider looking at Computer Engineering grads instead.


Bluntly - what makes you qualified to say any of this? You’re an anonymous account created today making claims that you know the “one true way”.

So, who are you and why should anyone listen to you?

I have other impressions that are substantially more blunt and if you’d like me to share them I will.


OP, This is definitely the vibe I got from your post. I read a lot of emotion from it too, but even taking that out, you may need to consider what’s really needed from an engineering degree.

I’m pretty solidly of the belief that no person will ever walk into an engineering job day 1 and know what to do. No degree program can never prepare you for that. The absolute best you can hope for is knowledge of the problem-solving process, the ability to learn new things quickly. A bit of industry-relevant knowledge is a plus, as it helps start the knowledge framework from which efficient questions can be asked. But it’s always assumed there will be significant learning during the first few months. The faster you get through this learning, the better for both you and the company.

Again, it’s awesome to invest in explaining some of the key technical aspects of embedded software development. But, this isn’t a replacement for good problem solving process. And, whenever I’m evaluating a potential candidate’s resume, proven ability to problem-solve efficiently is what I’m really looking for.

FWIW I’ve been attempting to do something similar through my blog. Can’t say I have any idea how successful it’s been. But I personally feel better knowing I’ve put a lot of my thoughts to paper, and have a consistent and public reference I can point students to for the most common questions I get. Feel free to reference as a previous work in a similar space.

Self cognition disclosure: I’m heavily skewed by my 7 years in industry, at a company with many well-established internal systems that are taught in exactly zero educational institutions.


I think you may not be correctly attributing the lack of knowledge/experience here. As a current CS major college student, I can confidently say that there are definitely people out there who understand the “foundational software skills” you mention who are currently in college. The issue is, you’re comparing yourself (someone who took part in FIRST and therefore already has a leg up on most people going into college) to the average person you’re interviewing.

I would be willing to bet a lot that the proportion of people who truly understand the software they’re writing coming out of college now is not significantly different than it was 5-10 years ago. There may be some differences due to how quickly the field has grown, leading to some newer CS programs not teaching in the most effective way, but this is likely countered by the development of great online resources that people now have access to.

I would also be careful to figure out what exactly the target audience for these types of tutorials is. I think the usefulness of the types of videos you’re talking about hinges on there being a lot of people who don’t understand low level programming and the behind-the-scenes stuff in CS, who 1) need to learn more about this stuff and 2) want to learn more about this stuff.

I have no idea how representative my experience is, but at the University of Maryland, the required courses for CS cover all of the examples of things you think students should know (you talked about how compilers work, object-oriented principles, learning C, etc). However, there are still a lot of students who passed these classes who I would argue don’t truly understand these concepts. The problem isn’t that these things aren’t taught – it’s that a lot of students don’t care to properly learn them because they don’t see them as important enough to spend time and effort on. By the way, a lot of them probably aren’t wrong – they’re in it for the salary and knowing how a compiler works won’t pay the bills when your job is front-end development.

If the issue is that people don’t really care to learn these low level concepts, then a video series won’t solve the problem. A video series will only help those who really want to learn, for example, how a compiler works.

With all of that said, if you can actually get the target audience (who are puttering along in CS by just copying StackOverflow answers and asking TAs to do their CS projects for them) to truly understand what they’re doing, it would certainly be valuable in my opinion.


I suspect then OP is an old timer like me. And I think it is certainly the case that the typical CS student of today gets a more superficial experience with “low-level” concepts than they did on my day (the 80’s). And for most this makes sense — in today’s market they’re going to be far better served learning java patterns and data analysis in python than writing a compiler, a database system, and tcp/ip implementations from the ground up in C — which are the sorts of things we did in the 80s. If you’re a business that needs “on the iron” programmers, as I said above, you probably should be looking at Engineering students not CS. And you’re still going to need to train them.

Back in my day we loaded programs in to our PDP-11 in binary via front panel switches, and we liked it! :rofl:

Okay, I’ll bite, I was going to keep quite as the “atmosphere” of this community hasn’t changed much, very narrowed minding shown in this post by the replies, especially the one regarding only wanting to be a web dev so doesn’t care about compilers doesn’t need to be taught that. Or the java app guy who just writes the app gets it functional and calls it a day, “the rest will come via experience or training at the job”.
Oh and the whole compiler knowledge only needed by computer engineering??!
And the notion that needing to write tcpip stacks and custom protocols and other things aren’t common any more??!

So here we go my next soap box

Let’s take a step back share some facts… the embedded microcontroller(silicon) alone is a multi billion dollar industry… that’s not including the multi billion dollar industry built around microcontrollers… I’m talking 8bit micros, and 32bit micros(which by the way is still relatively newer as it’s still grabbing a foothold in the market). Let’s see… every automobile uses microcontrollers, from the center stack display to the engine control module. It’s a microcontroller running Assembly, C/C++… some running Delphi but that’s another story. It ain’t running java…
Every aeroplane of the aerospace industry… it’s got hundreds of microcontrollers and FPGAs in them… the microcontrollers are running C/C++ And ADA… which is basically a safety Version C… It ain’t running java…
Your mobile phone… behind the OS and apps… it’s a microcontroller specifically 32bit Arm comes in recent years… guess what… it’s ran by C/C++ … it ain’t running java…
your smart TV, smart fridge, oven etc… MICROCONTROLLERS… running assembly/C/C++… you know who’s writing the majority of this microcontroller code?? People age 40-60 WHY? Because at this point there ain’t enough college kids with the knowledge to and no company is going pay engineer wages for a recent college grad to teach them what was the status quo and standard knowledge 30 years ago… now forgotten.

Sure you can put Java, C# or Swift apps on these things but that code is ran in “user space” your little app does nothing if the lower level code running doesn’t allow it…

Everyone is soo hyped about java cuz it’s cross platform and “easy” … that comes at a big cost of performance and resources. Java code can only be ran in the java runtime environment… COOL… who writes the java runtime environment that the app is ran in??? ORACLE … they write the architectural specfic implementation of the runtime environment so that your app can run… ohhh and what language is the java runtime environment that oracle writes written in??? It’s written in C of course!!! Oracle writes the C code so your Java code can run… meaning TWO things… 1 your java code doesn’t do anything without C essentially … and 2 your app and development and profits are at the mercy handcuffed to the company oracle… AND that’s if your just writing java apps for the pc … you become shackled to the wall when you decide to make mobile application for android… one you are shackled to the android store … and two you are again shackled to oracle … same for iOS apps but just to Apple. Which is no different.

Oh you like c# that’s cool, well replace Oracle with Microsoft and Java runtime environment with .net framework common runtime language and BOOM! Same story. Different company.

Why am I saying this? Because there seems to be this notion that goes around thinking that you can do far more with these high level languages, and it’s totally incorrect… as you are limited by the Abstraction environment … anything a high level language can do the low level languages can do aswell… is it pretty to look at no, is it two lines of highly abstracted code?? No… but it’s possible… the opposite is not true. And many of the kids today don’t realize what is possible with that they deem as “less” or “old”

Regarding I should be looking for Comp Eng students not Comp Sci… when did this begin???

Also, I look for both… I’ve seen on resumes, Comp Sci degree, and it say skips C/C++, Java, microcontrollers the whole nine yards… don’t get me started on people embellishing their resume to get past filters or just get to an interview … another story for another day… but the point is the resume looks valid for the skills and experience I’m looking for … but when you question the person they know buzzwords and can’t have a deep conversation about say compilers or interrupts or Com protocols … they are so use to just pushing Green run arrow in their IDE, they have no idea about the world outside the syntax… all they know is does it run and do what I want… and when it doesn’t they copy and paste to stack overflow… or flounder around, shot gun debugging, as they are just “cargo cult programmers” doing “things” because they say it done or it worked in the past but have zero idea or understanding why it worked only know that it worked. That isn’t engineering. That really isn’t programming… at that point it’s more hacking, or configuring especially when most of these apps now a days are soo abstracted it’s just configuring pre defined APIs into essentially an input output script and calling it a day.

Look I’m not asking for everyone to go out and write a compiler or write a new language… and I don’t expect everyone to be writing embedded code… but I do expect there to be an agreed about foundational set of skills anyone touching the keyboard in effort to write code should have… that’s it… and this video series was more about focusing on those “re programming” those kids erasing their bad habits and establish a common set of agreed upon knowledge, that programmers across the board should know. Period… if you don’t understand why a compiler does to your core, and don’t understand how to debug code without a breakpoint debugger and other things we are setting the future up for failure.

Also to the person that said I should be trying to make clones of myself, get them enough info to learn theirselfs…people are lazy most people don’t put effort in to going beyond what is needed so I don’t see that happening number 2… I better be making clones of myself… all mentors and professors should… if you don’t you are essentially creating a dumber future… this might explain why we were capable of reaching the moon 50 years ago… and 50 years later we still arnt on Mars … we better be at minimal “creating knowledge clones” of ourselves in our students … if we don’t they are doomed to repeat the same mistakes we did… IF are lucky and are even capable of getting that far.

Also to go back to the age thing with the folks writing the actual code that makes everything work… I have a friend… was actually my Mentor… still a first mentor… who told me a story that happened to him recently… and it should hit home to reality of the problem we face right now… it hit him and it has hit me. He was out in San Jose for a business trip, visiting a few new startup… that was in the microcontroller product industry. Rooms filled with foreign nationals and younger college grads very “google” esquire etc… lots of people looking like they are busy and doing things. Later that evening they went back to the CTOs house for dinner. The CTO was surprised to see my mentor as he was same age as him, in his early 60s still involved and writing code …not retired yet…my mentor said yeah can’t retire, because he can’t hire anyone to pass the torch on his products… none the college kids know enough or have any clue it’s all high level… the CTO in San Jose laughed and said we are having the same problem here… that’s why he’s still involved him and his friends write the actual code for the product … the people at the office are just their for “show” and venture capital. “We keep them busy” and then we let them go and they move on to the next startup with the similar situation… apparently there are a lot of these companies like this… people who should be retiring can’t because there is no one to pass the torch to AND if they did retire, most of the worlds tech would stop advancing or functioning because THE OLD TIMERS ARE WRITTING THE CODE THAT RUNS THE YOUNGSTERS HIGH ABSTRACTION!

1 Like

Some were ment for C


Dude. I think it would be good if software developers gave a little more thought to the CE underlying their algorithms.

I am also grateful to high-level languages like Python that make it possible to teach algorithms without having to fuss with memory management.

P.S.: My first job out of college was doing DO-178C V&V on C code written for PICs. I learned a tremendous amount about CE and low-level software. Still, I recognize that that’s a specialty, and I understand that one can be a good software engineer without having tackled the read-modify-write problem on uCs.

TL;DR please stop making me regret agreeing with you.


This thread now reminds me of one of my other favorite all time CD threads: Phone Policy

Some people, are so caught up in what they believe about themselves, to see anything else.

Either that or the imminent threat of death with trying to keep up with all of the technical skills required is causing me PTSD flashbacks.

But hey, OP, you keep on using your Rorschach test of if prospective candidates see code they can optimize at compile time or not. Solid staffing strategy.


You’re right. The lack of desire to improve, and satisfaction with shoddy work, implies a poor employee. Which garners the question, why would such a person have gotten hired, or kept around once their inabilities were manifest? And, why would any level of instruction be helpful to a person who has no desire to improve their own skills?

I sympathize with this story. I’ve lived it more than once. But I can’t see how it’s relevant here: Folks that are being described are already beyond the ability to be helped to improve. They’ve chosen to stick with what they know and move no further, and their career growth will (usually) reflect that choice.

I would only respond by saying the kids have not been properly instructed in the nature of abstraction in engineering. Simply because something is lower-level does not mean it is “less” or “old”.

Solid disagree here. Let me offer my experiences:

Simultaneous debugging of PowerPC Assembly, C, AND Python is a normal day for me. I’m surrounded by young engineers who thoroughly understand the inner workings of processors. These youngsters work in all levels of the “stack”, web applications to electronics hardware designs. They’ve all got their specialties, but they all know more than enough to know when to ask the right questions.

And ya know what? More than half of them are FIRST alumni. Correlation? I think so. Causation? I’d even be willing to entertain the thought.

Keep in mind that Silicon Valley is a relatively specialized engineering area. It’s known for its web and mobile app development companies, and that’s the crowd of talent it draws. It in no way surprises me that there are some low-level-processor knowledge deficiencies in an area where the best salaried jobs focus heavily on java/php/js/et al. But this doesn’t prove the rule. Try other areas like Pittsburg, Detroit, really anywhere in the Midwest. You’ll find a much more hardware-oriented workforce.

It is a gross oversimplification to draw a knowledge divide based on age alone. Maybe it’s just the bold yelling text, maybe it’s my own personal biases… but the last line makes me feel many emotions.

I’m hoping to be able to build some sort of a consensus, not throw a match into a vat of gasoline. Let’s ratchet back to the common ground we agree on, and see if we can’t figure out where the differences are really at. Here’s the ground truth I can sign up for:

Choose the right tool for the job at hand. Sometimes that mean C. Sometimes that means Java. Sometimes it means bash scripts.

Always, it means learning something new.


Sometimes it has more to do with a business case than it does with any technology fit. Business outcomes are the key drivers in my world.


yes yes yes yes for sure.

This starts to bleed into a different but related discussion. For better or worse, in the corporate engineering world, the “job at hand” is usually “make more money”. It’s just the reality of doing engineering a setting where your income is tied to convincing people to give your company money.

Good colleges and research institutions add business layers of abstraction to provide more technical freedom. But it’s not boundless. I can’t think of a single example where “job at hand” didn’t involve some notion of “get it done quickly”. There are some beautiful parallels here…


I think you’ve mischaracterized my post a bit, I never said I only wanted to be a web dev guy (I program robots as a hobby after all), and I never said students shouldn’t be taught about compilers and low level languages. I said these topics should be “skimmed over” (maybe not the best choice of words) IF they’re there to become web developers or something that almost always uses high level languages to do the job. I never meant they shouldn’t be taught about low level things, only that they shouldn’t have to dive deep into these things if that’s not what they’re there to learn.

And I think you’re overestimating the need for students to know so much right after college. I learned most of what I know now on the job, because the start up that first hired me knew that for recent grads that don’t have a lot of experience, being able to adapt and learn different technologies you’re not familiar with on the job is much more valuable than what you already know. If your company is having trouble finding college kids with the knowledge they need to work with embedded systems, then they should be looking for kids with qualities that enable them to learn on the job quickly and INVEST in them. Train them to do the things you need them to do, and be a mentor to them. Don’t just rely on the experiences they’ve had in college to get you to where you need to be.

And if the industry is ever in desperate need of people with the knowledge that most college grad students now lack, you can be sure the high demand and low supply of people with that knowledge will push colleges to create concentrations with a focus on low level systems again.

Most are arm64 now. You would be hard pressed to find a 32-bit ARM on a new phone.

I don’t believe that’s true.

I would look into your hiring process then?

We do a lot of reverse engineering and “cyber” security. We don’t come across lots of college grads with in depth experience (although some places do offer specialized degree, and with a boom in some free tools it is making it more accessible, but I digress), especially since there is a large number of processors/architectures/hardware to take a look at. So we look for smart people who seem capable of learning. We’ve gotten better at the process over the years, but it still doesn’t always work out.

I don’t think you remember how little you knew coming out of college.

You’re not shackled to the Android store. You’re not shackled to Android either in most cases and haven’t been in forever. (cyanogemod->LinogeOS). iOS is a little more shackled but there are options…

I’m not sure what you’re getting at though. We should be building and programming our own phones? Why stop there? Like an idiot I’ve been shackled to the language/features that the processor manufacturers provide. I need to make my own from scratch with my own custom machine code/assembly.

Unless you’re always building absolutely everything, including all hardware, there’s always a limiting factor. I don’t think there’s really the notion that everything can be done with high level languages. But they are useful (in different ways) just like low level languages.

You know where all the sweetest vulnerabilities are right? It’s not in that high level abstraction that does bounds checking (although there are a few). Tell those old timers thanks for me! Their code is keeping us in business.

But seriously, that is certainly not true. Oracle, Google, and Apple hire plenty of college level grads to write the same low level abstraction code you’ve been ranting about. Intel, AMD, TI, Atmel, etc also have intern programs, and hire directly out of college to do some even lower level programming.

1 Like