Command Palette

Search for a command to run...

GitHub
Back to blog

From First Client to Engineering Ownership

Samith ReddyMarch 15, 20254 min read
engineeringstartupthoughts
Share:

My first client project began with a practical goal: earn some money during college. A classmate and I wanted to depend less on our parents. We chose web development before either of us understood what delivering a website required.

The brief was a bridal collection gallery. I initially tried to reconstruct another site's interface from browser tools. That failed. A generated starting codebase did not give us a result we could deliver either.

Eventually, we used v0 to build kavyareddy.in. We faced deployment and domain problems, but we launched it. The page was visible. My understanding of the system was still incomplete.

That gap became the most useful part of the project.

A working page is only one part of delivery

At first, I judged progress by what appeared in the browser. If a page looked right locally, I assumed most of the work was complete.

Deployment broke that assumption. A local preview did not explain how the domain reached the application or why a configuration change affected access. I could produce an interface before I could explain the request path that made it available.

Trouble with DNS forced me to learn beyond the component tree. I needed to understand what the configuration meant before I could make a useful change.

The lesson was about ownership. When a client cannot reach a site, the person responsible for delivery must investigate the whole path. The boundary of that responsibility extends beyond the code they wrote.

Generated code changed the starting point

Using v0 helped us reach a prototype. It also made it easy to confuse having code with understanding code.

I could ask for a page and receive a plausible implementation. That did not tell me which assumptions it made, what would fail after deployment, or how to maintain it. Those questions remained my responsibility.

I began learning JavaScript while building the Ushodaya Networks site with React. The work gave the language a context. State, events, and data flow were mechanisms I needed to understand to change the application safely.

My standard for generated code became more concrete: can I explain its inputs, follow its behavior, and verify its output? If I cannot, the implementation still needs investigation before I can depend on it.

That standard applies to copied examples and unfamiliar dependencies too. The source of the code does not change who must support the result.

Client work makes uncertainty visible

A tutorial gives the learner a defined problem and a known destination. Client work introduces questions that the brief may leave unanswered.

What does the client mean by complete? Who will maintain the content? What happens when something stops working? A visible interface answers only part of that brief.

My early mistake was to treat unknowns as details I could resolve at the end. The DNS problem showed why that approach was fragile. An unfamiliar dependency could stop delivery even when the interface looked finished.

For a small website, I now see three useful checks before calling the work complete:

  1. Trace the main user task from entry to result.
  2. Verify the deployed application through its real domain.
  3. Explain how the owner can maintain it and report a problem.

These checks make the delivery boundary concrete. They also expose work that a screenshot cannot demonstrate.

College and client work compete for the same hours

Real projects hold my attention more easily than material whose purpose I cannot yet see. That preference helps me persist through a technical problem. It can also distort how I allocate time.

My grades have often been average. Balancing coursework, exams, and client commitments has been imperfect. Shipping a project does not remove an academic deadline, and an exam does not remove a promise to a client.

I find the connection strongest when theory explains a problem I have encountered. Data structures help me reason about how work grows. Operating systems give me language for processes, resources, and concurrency. Practical experience gives those subjects context.

The scheduling lesson is less exciting: commitments need room for uncertainty. If a plan depends on every task going well, an unfamiliar deployment problem can consume the time reserved for study.

I need to account for that uncertainty when I accept work. Taking responsibility includes recognizing the limits of the time and knowledge I have.

What the first project changed

The original goal was income. The lasting result was a different definition of building software.

I started by asking whether I could make a page. I began to ask whether I understood enough of the system to deliver it, diagnose it, and maintain it.

That is the part of engineering I want to keep developing. A useful prototype creates an opportunity. Understanding the system makes it possible to accept responsibility for what happens next.

Samith Reddy
Written by Samith Reddy

Backend and AI engineer building reliable systems with careful product details.

Comments

Join the discussion on GitHub Discussions. Sign in with your GitHub account to leave a comment.