I’m currently taking Stanford Education’s Code in Place (CIP) online course, which I applied for while I was unemployed. This might surprise some people since I’ve used Python a lot in my Master’s research in Geology. So, why am I taking a basic coding course?
But here’s the thing: I’m really glad I did. CIP is not just about syntax; it’s about thinking like a programmer. It addressed gaps that many self-paced courses missed. One key takeaway for me has been the importance of problem decomposition—breaking a task into clear steps before coding. This habit has made my scripting cleaner and my thinking clearer.
Another important point is using libraries effectively. As our mentor Chris said, “You can toast different types of bread in a toaster without fully knowing how the toaster works.” Similarly, with Python, you can use strong libraries to tackle problems without needing to understand every line of their source code. CIP reminded me that going back to the basics is valuable, as it can enhance your understanding and rekindle your passion for the craft.
The reason I’m writing this article is that before I took the CIP course, I often felt guilty when writing Python scripts. I import a library like pandas or scikit-learn to solve a problem, and while it works, I hear a voice in my head saying:
“Do you even deserve to use this if you don’t understand how it works underneath?”
It’s a feeling many of us share, especially if we come from backgrounds where being an expert means knowing everything from the basics. After years of learning and building, I’ve realized this truth:
Using Python libraries without knowing their inner workings does not make you a bad coder. In fact, it makes you a practical one.
The Guilt of Abstraction
Let’s be honest—Python is powerful because of its libraries. These tools are created by experts and tested by communities. When I called a function from matplotlib to plot my geology data or used torch.nn to define a CNN for my thesis, I used not just code—but years of knowledge and improvement.
Yet there’s still that guilt: “Shouldn’t I at least know how this works under the hood?”
Yes, curiosity is valuable. But guilt is not a requirement for growth.
Tools Are Meant to Be Used
Imagine refusing to use a calculator just because you didn’t make it. Or saying you must grow your own cotton before sewing your clothes. We don’t expect this in other parts of life—so why do we think it’s necessary in coding?
Libraries are tools. Using them isn’t cheating; it’s what good coders do: solving problems efficiently.
Learn as You Go
When you use libraries often, you start to understand them better. You notice their features, read the documentation, and sometimes check the source code. Eventually, you might even create your own simple version for fun or clarity.
But this happens organically. Not all at once. Not before you’re “allowed” to use them.
The truth is: you learn by doing. And importing libraries is part of the doing.
Being a Good Coder Isn’t About Reinventing the Wheel
Being a good coder isn’t about writing every algorithm from scratch. It’s about:
- Knowing which tools to use
- Understanding the problem
- Solving it as clearly and efficiently as possible
- Writing code that others (including future you) can read and maintain
Using libraries doesn’t disqualify you. In many ways, it qualifies you as a modern developer.
What Helped Me Shift My Mindset
What helped me move past the guilt was asking myself: “What’s my real goal here?”
Usually, it’s not just to show basic skills. It’s to complete a data analysis project, train a model, or visualize results for a paper. The libraries assist me in achieving that, and that’s positive. I have now used it to work efficiently with data management at my current job.
In Summary
- You’re not a bad coder for using libraries without knowing every line of their internal code.
- Libraries are built so you don’t have to reinvent the wheel.
- Understanding grows with use—but it doesn’t need to come first.
- Focus on solving problems. That’s the real goal.
So yes, I still feel a twinge of guilt sometimes. But I remind myself: importing a library is not a shortcut—it’s a superpower. And using it well? That’s what makes you a good coder.
Hope this article helps you ease the guilt as someone who is using Python to make you efficient at work – whether you are a programmer, a business analyst, an engineer, or a scientist like me who started knowing nothing about any programming language.
Happy coding!
xoxo,
Grass
Discover more from The Fabulous Scientist
Subscribe to get the latest posts sent to your email.
I’m retired now, but “back in the day” the reluctance with libraries was more about speed and “bloat”. (Though I’m not THAT old, Apollo 11 is said to have had a computer with less memory than the early hand calculators I used only a decade later at high school. And XOR-ing a register with itself was faster than explicitly setting it to 0.) The typical coding environment these days makes these concerns nigh on irrelevant, and the problems being solved are correspondingly bigger and more complex. I think it’s quite right to focus on knowing there is a solution you can re-use rather than knowing the actual solution. On the other hand, good, well-structured design was/is never a bad idea! 🙂
As C.A.R. Hoare famously said: “There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”
LikeLiked by 1 person
Thank you for your insights, they are well-written. I must follow you and see what you have written on your site. 🙂 I agree about problems getting bigger and more complex these days probably because we have bigger data now. And yes, good, well-structured design is always the best idea. 🙂
LikeLike