TOC:
- "Why Should I join CS When Code Can Be Easily Vibed ๐โโ๏ธ ?"
- "What You're Saying is a Little Bit Abstract. Examples, Plz?"
- Footnotes and References
- If you Have Any Questions/Suggestions...
- And If I made a mistake
ย
This post acts a survival guide for devs. (with a focus on CS students) who are currently in the middle of the "Vibe Coding" wave ๐. [1]
Actually, I'll phrase this post in a question-answer format while assuming that you are a pessimistic dev. who is not vibing with the current AI trends.
ย
"Why Should I join CS When Code Can Be Easily Vibed ๐โโ๏ธ ?"
First of all, what "code" are you talking about?
You "code" to accomplish a "task". I.e., a "problem" that you want to solve.
These problems
can be categorized into multiple levels of complexity
...
ย
"Problem Complexity? Huh?"
Yes, here's a simple categorization of the problems that any developer faces in terms of complexity/scope [fn.1]:
(Shown in this order: lvl1
-> lvl2
-> lvl3
-> lvl4
)
Details of each level [fn.1]:
(Explained in this order: lvl4
-> lvl3
-> lvl1
-> lvl2
)
-
Simple isolated problems (
lvl4
): These are the problems that can be usually solved using a single function.- For example, reading an audio file from a local file path into RAM.
-
Complex isolated problems (
lvl3
): These are the problems that can be solved using a workflow of multiple logically-connected steps. Usually, in a series of function calls.- For example, downloading audio files from a website, concatenating them, and then converting them to a single audio file.
- Concretely, a
lvl3
problem can be broken down tolvl4
problems that are connected together.
-
Abstract connected problems (
lvl1
): These are big picture problems by understanding the big picture of a system. These are the problems that made you want to develop the system in the first place.- Also known as: "high level design (hld)" / "system design" / "system architecture".
- For example, a system that allows users to get audio files from a website, then download them as a single audio file.
- These are "solved" by having a mental model of:
- The exact requirements of the system (i.e., the problem).
- The system architecture (i.e., the solution). E.g., "a web app, where the frontend requests the audio files, and backend processes them, and then returns the final audio file to the frontend".
- Optionally: We create a prototype with placeholders for the functions that we will implement later (just to mentally visualize the flow of the system).
-
Concrete connected problems (
lvl2
): These are the problems that are solved by specifying the details of the system architecture then implementing them.- Also known as: "low level design (lld)"."
- E.g., react/fastapi for frontend/backend, streamlit for both, etc. python as main language, uv for managing dependencies, etc.
- Concretely, a
lvl1
problem is basically a series oflvl3
problems that are connected together.
ย
"Ok, So Does The AI Vibe โจ With All of These Levels?"
Let's visualize how our brains process these different problem levels and when AI assistance is most effective:
Side note: Open the above image here if it's appearing blurry on dev.to
Now let's break it down:
(In this order: lvl4
-> lvl3
-> lvl1
-> lvl2
)
ย
- For
lvl4
problems: Yes, AI can easily vibe with them.
ย
- For
lvl3
problems: Usually, yes. But...- If the problem is related to a tech stack that the AI is not familiar with, then its vibeage will be limited.
- E.g., if you ask the AI to write a function that uses a library that it doesn't know about.
- This can be mitigated by providing the library's docs yes... but this will not always be a possible option. Examples:
- Library has outdated docs.
- Library has no docs at all.
- Library is not open-source, so you can't even clone it and tell AI to read it.
- etc.
- If you phrase your request in a very strict way, then the AI could overcomplicate the solution.
- E.g., you ask AI to do A/B/C to get D, but if you've just asked it to do D, then it would have done it in a simpler away.
- I.e., under-trusting your AI buddy
:[
.
- I.e., under-trusting your AI buddy
- E.g., you ask AI to do A/B/C to get D, but if you've just asked it to do D, then it would have done it in a simpler away.
- If you phrase your request in a very vague way, then the AI could over-simplify the solution while neglecting important corner cases.
- E.g., you ask AI to return D, but you forgot to mention that D should be in a specific format, or that it should be sorted in a specific way, etc.
- I.e., Over-trusting your AI buddy
:[
.
- I.e., Over-trusting your AI buddy
- E.g., you ask AI to return D, but you forgot to mention that D should be in a specific format, or that it should be sorted in a specific way, etc.
- If the problem is related to a tech stack that the AI is not familiar with, then its vibeage will be limited.
ย
- For
lvl1
problems: depending on the complexity of the problem you're trying to solve:- For commonly known problems (e.g., "write a full web-based todo app"), it can provide a big picture solution (e.g., it will whip up a possible system architecture for you).
- For less commonly known problems, the provided big picture solution will be less accurate than the previous example.
- E.g., if you want to create a app for Islamic prayer times, then it might propose using an outdated GitHub library that calculates prayer times offline, even though your solution might be better off using an online API service instead.
- Well then how do you know which system architecture is more well suited?
- You look at your requirements and constraints. For example, if you know that this prayer times app will be mostly working offline, then prefer a calculation library over an online API service, etc.
- Therefore, you need to have a good understanding of the problem you're trying to solve, and the requirements/constraints of the system you're trying to build.
- This is where your CS knowledge comes in handy!
:]
- This is where your CS knowledge comes in handy!
- Then and only then can you ask the AI to help you with the big picture solution.
ย
- For
lvl2
problems: Similar situation tolvl1
problems;- If you just give it a high level design (i.e., a
lvl1
solution) and tell it to suggest the suitable tech stack and provide detailed implementation without giving it proper requirements/constraints/context, then it may choose libraries that are not suitable for your use case down the road.- For example, in the prayer times app, it may suggest an API library that has a monthly limit of 1000 requests, while your app may need to make 2000 requests per month, etc.
- Well then how should you have tackled this problem?: By having a prior experience on using APIs, so that you can ask questions like "API's rate limit?", "API's server availability?", "API's response time?", etc., and accordingly have an explicit requirement/constraint for the AI to work with.
- If you just give it a high level design (i.e., a
ย
"What You're Saying is a Little Bit Abstract. Examples, Plz?"
Let me map these levels using a real project I recently built: ayahs-audio-downloader - a tool that downloads and concatenates Quranic audio verses.
ย
First - Strategic Thinking (lvl1
)
My journey started with a high-level problem: "I want to create a tool that lets users select a range of Quranic verses, download their audio files, and combine them into a single file."
In my initial prompt, I wrote:
"I input an ayah range (e.g., 2:2 - 2:8), then that API gives me these ayahs with audios, and I then concatenate them together to a single audio file."
I was thinking at the highest abstraction level - what the system should accomplish, not how it would work.
ย
Next - Technical Decision Making (lvl2
)
After exploring available APIs, I made architectural decisions:
- Use the Quran API for audio files
- Build a Streamlit web application for the interface
- Structure the project with separate modules for downloading and processing
- Use Python with
uv
for dependency management - Include FFmpeg via
packages.txt
for Streamlit Cloud deployment
I outlined these requirements in detail:
"3.1 The user chooses the starting ayah (e.g., 2:1) and the ending ayah (e.g., 2:8)
3.2 the user then chooses the reciter of choice...
3.3 the user clicks on get audio file..."
ย
Then - Tactical Problem Solving (lvl3
)
Next, I broke down the main functionality into discrete problems:
- Downloading audio files for a range of verses
- Concatenating audio files into a single MP3
- Handling the UI flow with Streamlit
Each of these needed a specific implementation strategy. For example, the audio concatenation process required:
- Loading each audio file with PyDub
- Joining them sequentially
- Handling errors if any file failed to process
ย
Finally - Function Implementation (lvl4
)
At the lowest level, I had individual functions like:
-
parse_ayah_reference()
- Parse an input like "2:5" into surah and ayah numbers -
get_reciter_id_by_name()
- Map reciter names to their IDs -
download_ayah_audio()
- Download a single audio file -
generate_output_filename()
- Create a standardized filename
These are simple, isolated functions that each do one thing well.
This workflow - starting with the big picture (lvl1), making architectural choices (lvl2), breaking it into major components (lvl3), and finally writing individual functions (lvl4) - represents a much more efficient approach than jumping straight to coding without proper planning.
Final Product
The Streamlit ๐ app can be accessed here: https://ayahs-audio-downloader.streamlit.app/
App demo:
App's architecture:
(source)
ย
Lessons Learned From This Journey
-
Importance of Planning: If I had taken more time to plan the project, I could have avoided some of the pitfalls I encountered. Examples:
- I didn't think which audio-processing library I should choose. Instead, I relied on the AI model (i.e., copilot) to suggest one for me.
- It chose
pydub
which is a great library, but it internally usesffmpeg
, which isn't a python library. So I had to install it separately. - If I had just thought about it, I would have realized that most audio-processing libraries use
ffmpeg
under the hood anyways, so I would've indicated to copilot a new constraint:- "I want to use a library that doesn't require any external dependencies".
- Or: "I'm later uploading this to streamlit cloud, so read the streamlit docs to see how it handles external dependencies and act accordingly"
- Etc.
- It chose
- I didn't think which audio-processing library I should choose. Instead, I relied on the AI model (i.e., copilot) to suggest one for me.
-
Think of Dependencies That The AI Might Want to Know About: Examples:
- Stating that the solution will be eventually deployed to streamlit cloud would have helped copilot act accordingly on how to install
ffmpeg
. - Stating that the solution will use Python 3.13 could have helped copilot choose libraries that are compatible with it.
- For example, it chose
pydub
, which turned out to have issues with Python 3.13, so I had to downgrade to 3.11. - However, I'm skeptical about this tip. I.e., I'm skeptical that copilot is trained enough to know that certain python libraries have issues with certain python versions. So I wouldn't rely on this tip too much.
- For example, it chose
- Stating that the solution will be eventually deployed to streamlit cloud would have helped copilot act accordingly on how to install
-
Ride The Vibe Tech Wave: There is so many tools/websites out there that can help you with your workflow/docs. Examples:
- GitHub Copilot: Enough said.
- Deep Wiki: A website that indexes your public GitHub repos and provide nice docs for it.
- Generate mermaid diagrams with AI.
- Details: Medium article.
- Even the diagrams in this article are generated using mermaid
:]
.
-
SpecStory Extension: An IDE extension that tracks/saves your conversation's with the IDE's AI model (e.g., copilot).
- For example, check out the markdown files here to see how I made this article
;]
.
- For example, check out the markdown files here to see how I made this article
- Use AI as your "friendly neighbourhood plumber" [2].
- Updated your codebase and now you're dreading the README.md and docs/*.md documentation? Just ask the AI to do it for you.
- Need to manually change file references? Let the AI create a VSCode task that will automatically do this for you <3.
- and so on...
- See the pattern here? The 2 problems above are
lvl2
, so prompt the AI succinctly, and the AI will return a mostly working solution:]
.
-
Just Because You Can Vibe, Doesn't Mean You Should:
- I did some problem-solving by myself (e.g.,
lvl3
, parts oflvl4
). - Yet, I still relied on the AI for most of the implementation (e.g., majority of
lvl4
, which is a series oflvl2
/lvl1
problems that the AI defined and solved). - However, what helped me is that I already had a mental big picture on how a problem like this can be solved and what tech stack is suitable for it.
- I did some problem-solving by myself (e.g.,
What I'm trying to say is this: Only when you're comfortable with problem solving, system designing, and experiencing different tech stacks hands-on, then you can start relying on the AI to do the vibing for you ๐โโ๏ธโ :
Otherwise, you will be lost in the middle of the vibe waves, and you won't know how to swim back to shore ๐โโ๏ธโ:
ย
Footnotes and References
[fn.1]: These levels of complexity are completely subjective, and they are not based on any scientific research. They are just a way for me to mentally categorize a problem when I see it.
[1]: Cover art by Pete Sena: "Cracking the code of vibe coding" medium article. Side logos by flaticon.com (computer science, problem solving)
[2]: The Bulk of Software Engineering is Just Plumbing, by Karl Hughes
ย
If you Have Any Questions/Suggestions...
Your participation is most welcome! ๐ฅ๐
ย
And If I made a mistake
Then kindly correct me by:
See ya! :]
๐
Top comments (0)