← Back to Blog

Foundations

In college, computer programming was hard for me. Studying computer science in general was frustrating, time‑consuming, and a little bit scary.

I didn’t know what to study when I entered college. I ended up choosing computer information systems (CIS), which mixed computer science courses with business courses like accounting and information management. I switched from CIS to exercise science, then back to CIS. I know, dude, so wild to do that. Exercise science felt easier, but I missed the value of mathematics and solving puzzles. I decided to go for the harder path even if my grades would fall a bit. I valued it, which is what mattered to me.

Things didn’t go well at first. I took introductory calculus and I should have failed it, but I ended up getting a D‑ (60.0; a 59.9 was failing!). It was the homework grades (completion‑based) that pulled me through. I was happy I didn’t have to retake it, but I was upset with my performance.

Computer Programming I was the next semester, and I was so excited. I had all my notes ready and told myself I would lock in. I literally thought I’d be typing away at the computer fast and getting programs to work like clockwork.

Nope. Not at all.

I struggled hard. I was taking notes, but they were scattered and I didn’t even look back at them. I was just taking notes for the sake of taking notes. So I gave up on that and just listened to the professor.

Then came the labs. The first one went well, and then the challenges started. Labs used “pair programming,” where two students worked together: one typing, the other guiding and suggesting ideas. Most of the time I wanted to try solving them myself, but I was so bad that the dudes next to me would just say, “Just let me do it.” They’d finish in less than 30 minutes (the lab was 3 hours) and leave. Sure, I got an A, but I didn’t learn anything. On days when I had to work alone, I performed poorly. I tried tutors; they were kind and didn’t give answers right away, but I still couldn’t complete assignments by myself.

I ended up failing the course with a legit F on my transcript. I should have withdrawn, but my friend from class said I could still do it. Nah, dude. I had to retake it anyway, because the other CS courses required that credit.

At the end of the semester, I really thought about what I did wrong. Why was I unsuccessful? Am I dumb? Is computer science too complicated for me? Why? Why me? I went to my professor and they told me I needed a strong foundation before taking upper‑level classes. It was the usual speech: try harder, study more. I was studying. I thought I was doing everything right.

Later, I spoke with someone visiting the CS department, a senior software engineer for the government. They told me one of the most influential and pivotal ideas for learning programming:

“Many folks learning computer programming focus on the language, but it’s really the thinking process. You must think in logical, computational terms rather than just memorizing the language. This is true in every programming or computational activity. You need to build and understand the foundational logic that computers operate on.”

That meant I had to learn programming conceptually and think in terms of processes. I remembered my professor saying something similar at the beginning of the course, and I had shrugged it off like, “Eh, no big deal, I know that already.”

Clearly not.

This helped me a lot when I retook the course. I took foundations seriously and made sure I understood them before moving on to the hard stuff. Instead of going straight to the IDE (integrated development environment), I wrote everything by hand. Pencil and paper. Yes, I wrote code by hand. That helped me analyze and develop my own solutions instead of relying on the IDE to complete lines.

I started following this SDLC, and I live by it now:
Analyze the problem ⇒ determine specifications ⇒ design a solution ⇒ implement the solution ⇒ test/debug code ⇒ learn and improve.

This is my learning system now. I walk step‑by‑step toward the solution. Sometimes we don’t know what kind of solution we want, so we need to spend more time determining that before designing anything. Before, I didn’t even read the freaking problem, dude. Now I make sure I understand what the problem is and what I need at the beginning and the end so I can work toward the solution. Those questions are crucial.

I turned my grade all the way around and got an A‑ for the semester. I was so proud of myself. I thought I would never be able to program.

The same principle applies to mathematics. I realized I had gaps in my math knowledge, which is why I struggled with calculus. Now I know that, and I keep using this framework for anything I learn.

Always hammer down hard on the fundamentals. Nail the fundamentals and the rest will fall into place.

If you enjoyed this post, consider reaching out and connecting with me.

Thanks.