I'm a fourth-year B.Tech CSE student specializing in AI and machine learning, but I feel I have almost no practical programming ability. I've studied Python, Java, SQL, DBMS, OOP, DSA, web development, and AI/ML through classes, courses, and tutorials, yet I struggle when given a blank file and a real task. I can often understand existing code after someone explains it, but I don't know how to break down a problem, choose the right concepts, write the first version, debug it, or test it independently.
I've repeatedly tried restarting with programming courses, roadmaps, and tutorial-based projects. Each attempt begins with motivation, but I eventually become impatient or stuck and abandon it. My main problem isn't a lack of resources; it's not knowing what to prioritize, how deeply to study each topic, which projects to build, or how to measure whether I actually understand something. Since I'm already in my final year, I also don't have much time to experiment with many technologies.
I'm willing to work hard, but I need a realistic sequence rather than generic advice such as "learn DSA, development, and build projects." If you were in my position, what language or stack would you choose, how would you rebuild your fundamentals, learn DSA, select projects, and divide time between placement preparation and development? What would you deliberately postpone? I'd especially appreciate practical advice for finishing projects instead of repeatedly getting stuck and starting over.
4 Answers
The biggest change is accepting that you have to finish things even when the code is messy and you feel stuck. Courses and tutorials can make you comfortable with recognition, but they don’t build the ability to create from a blank page. Choose one small project—something like a command-line expense tracker, a basic CRUD app, or a simple data-analysis tool—and finish it without switching stacks. Break each feature into tiny tasks, search for specific errors when needed, and keep going until it works. A finished imperfect project will teach you more than another abandoned course.
For placement preparation, keep the plan narrow. Use one language—Python or Java are both reasonable—then practice core programming, arrays, strings, hash maps, recursion, sorting, and basic trees through problems you can mostly solve yourself. Alongside that, complete one small application with a database and a simple interface, preferably without following a tutorial line by line. Spend most of your time actually coding, with a smaller portion on reviewing theory and solving interview problems. Put advanced frameworks, multiple languages, and specialized machine-learning topics on hold until you can reliably finish ordinary programs.
You may be putting too much pressure on yourself. A new graduate is not expected to perform like an experienced developer; junior roles assume that you’ll learn a lot on the job. You should still build enough fundamentals and a couple of demonstrable projects to show that you can learn and work independently, but you don’t need to master every framework or become an AI/ML expert before applying. Pick one practical direction, build a small portfolio around it, and apply while continuing to improve.
It would help to separate the problem into two possibilities: struggling to write even basic constructs from memory, or struggling to design a larger program from a vague requirement. If basic syntax and control flow are weak, spend a short, fixed period writing small programs without tutorials. If the basics are fine, practice decomposition instead: write down the inputs and outputs, solve the simplest case manually, divide the task into functions, implement one function at a time, and test each piece. Don’t restart your entire education every time you encounter difficulty; identify the specific missing skill and practice only that.

That makes sense. I think worrying about choosing the perfect starting point has been another way of avoiding the actual work, so I’m going to choose something small and complete it.