When I first started learning to program, one thing irked me above all: the amount of goddamn time it seemed to take me to get the smallest thing to work.
I dreaded each hands-on assignment at first — not because I didn’t enjoy coding, but because I knew that it would take me twice as long as I’d wanted, and that I’d spend at least 60% of the time looking at a screen full of errors.
In cases like these, it’s easy to get discouraged or think that you’re not smart enough for whatever task you set out to accomplish. Oftentimes, though, it isn’t a lack of intelligence but rather a lack of foundational knowledge that causes you to seem “slower” than others at picking up a new concept or skill.
A cryptography and cybersecurity class I took as a sophomore comes to mind when I think of this. God, how I struggled — memories of sitting in the front row, dutifully paying attention, taking notes, giving up entire weekends to do homework, and still having to clarify the core concepts are vividly imprinted into my mind.
My code only worked after I’d spent at least eight hours on it and had someone else look over it. I hated being “the incompetent kid in the class who always needed help.” 
But I wasn’t looking at the whole picture. This course was an advanced elective for upper-year students. I was taking it as a sophomore who only had one introductory class in Python under my belt. The bulk of the course focused on number theory and mathematical concepts; I hadn’t taken a single math course in college.
Thus, in order for me to fully comprehend a concept and implement it in code, I had to not only teach myself the actual content, but also the mathematical background required to understand it. No wonder it took me so long — I was building my foundation the same time I was using it to do something completely novel. 
There are a lot of reasons for being slow at things, and “not being smart enough” is most likely not one of them.  Next time you get frustrated because something seems to be taking you longer than it takes anyone else: stop and think. Are you only teaching yourself the concept/skill at hand, or are there additional, hidden things you had to learn?
 Being a CS student at an honors college with no mathematical or programming background whatsoever was by far the most ego-crushing experience of my life, and I wouldn’t trade it for the world. I learned plenty of technical things, but my biggest takeaways were an unshakeable sense of true confidence/lack of impostor syndrome (i.e., not being afraid to admit that I don’t know something) and a solid work ethic.
 This also serves as a good reason why it’s important to know some foundational theory in whatever you plan on doing, even though immediate applications may not be so obvious. A lot of more advanced topics depend on basics. After I knew my core data structures and algorithms, for example, the Facebook API became a lot easier to understand because I knew about graphs, nodes, and edges; after I understood the rule of thirds, my Instagram photos got a lot better because I was conscious of image composition.
 If someone purposefully makes you feel stupid for not knowing something or being slow to grasp it, then they are an asshole. Others’ opinions and actions do not define you and your abilities. Keep on keeping on.
This article is part of the Morning Content Challenge, where I write a blog post each morning before going to work. It’s an exercise in imperfection, timing, and self-discipline. If you have any questions or topic suggestions, don’t hesitate to reach out!