ROUNDTABLES ★ 27 upvotes 2018

Ask HN: What's was the hardest part about starting to code?

The Founder's Submission

Direct narrative and submission text authored by @mrburton on Hacker News:

I'm trying to understand what the hardest part is for people new to programming? Is is understanding what source code means? Syntax? Was it variables or functions? How to think more like a programmer?

Retrospective Overview & Key Insights

Distilled analysis of the business dynamics, operational challenges, and strategic takeaways:

An open Ask HN community consultation from 2018 where @mrburton convened hundreds of developers and bootstrappers to share real experiences, hard numbers, and tactics.

Core Principles for Independent Builders:
1
Participants share raw revenue figures, churn rates, and stack decisions that corporate PR never publishes.
2
Recurring answers reveal that distribution, not coding skill, is almost universally the rate-limiting step in developer businesses.
3
Practical recommendations on bookkeeping, payment gateways (Stripe vs Paddle), and freelance-to-product transitions.
Community Debate Themes:

Hundreds of active indie hackers contributed case studies, pricing heuristics, and pitfalls to avoid when moonlighting on side projects.

Community Discussions & Critical Reviews

High-signal perspectives, counter-arguments, and peer founder insights debated on Hacker News (41 total discussions):

MS @mstaoru Peer Contributor

I started being interested in coding when I was 7 (in 1990). Our family was quite poor, and no way we could afford even 286DX, and 386DX was well out of our reach. Somehow my father found a half-broken Electronika BK-0011M, an old USSR computer that ran a stripped-down version of BASIC. It didn't have a memory chip, and we couldn't find any in our small and remote Siberian town. No tape either. And the power supply was faulty, so every 3-4 hours it would reboot, leaving me with a clean slate. We found some "books" that were badly translated BASIC manuals retyped on a typing machine. I was mostly coding various graphical and physical simulations then, drawing procedural images and such. Because of reboots, I had to write it in parallel on the computer and a sheet of paper, so I could type it again if power cycled before I could run and briefly enjoy it. At 11, I was skilled enough to land a first "job" for my mom's research institute: analyzing and visualizing some agricultural data. It paid enough to get a 2nd hand 80486, and my "career" went upwards from there. This whole experience taught me a valuable lesson: ignore excuses, stop complaining, make do with what you have, and move forward.

These days my biggest gripe is probably the state of the JavaScript world. I'm mostly a Python person, but having to deal with JS leaves me frustrated more often than not: new frameworks, tools crop up every year, old tools stop working, breaking changes are introduced at such pace that someone not fully dedicated to frontend has a hard time keeping up. If any JS framework had the same stability, level of documentation, and clear roadmap as Django, the frontend world would be a much better place.

I think the most valuable skill for a "real world" programmer is the ability to find and read the documentation. Also, curiosity to do that even without an immediate need. Read it like sci-fi. The more you read, the more you have the right mindset, and those "building blocks" that would come later when you're thinking about implementation.

CM @CM30 Peer Contributor

Well, understanding what source code means and how it works is definitely a big part of it. Because for many people, they learn via looking at other people's work, and where programming is concerned, that often feels overwhelming.

Which probably comes down to one thing really:

When you look at an existing codebase, you have no idea about the logic behind any of its design decisions. You think it's all a confusing mess or that a smarter person would 'just get it', without realising that most of the complexity comes down to:

1. Bug fixes that cropped up along the way. Usually extreme edge cases.

2. Code being refactored piece by piece, since throwing out the whole codebase and starting over is often not economically viable.

3. Backwards compatibility in general

4. Multiple people working on it, often without much of a style guide (or a non enforced one)

5. Or one or more people having no idea what they're doing, getting help from other people who have no idea what they're doing, and using code from donkeys years ago also by people who may or may not have known what they were doing that sort of fixes the issue if you hammer at it a bit.

There's often a huge jump between 'what the average tutorial teaches you' and the source for a major project/commercial product, and for some guy going from say, learning basic PHP to reading the Magento source code, it can just feel completely overwhelming.

Relatedly, the whole jump from 'intermediate' to 'expert' is probably one of the hardest parts too. As people said before, there are loads of tutorials for absolute beginners, a fair few for experts, and a lot less for people in between.

PA @paulrpotts Peer Contributor

To me, it's understanding how to think precisely enough about what you are trying to do.

Syntax comes pretty quickly, but it's the precision that is hard. So, for example, even writing a simple loop. Are you going to start at zero? Are you going to start at one? Should your loop condition be at the top of the loop, or at the bottom? Do you know what each of those implies about how many times the body of the loop will be executed? Do you check the termination condition with less than, equal to, or both? Are you sure the loop will terminate? Really sure? Do you know at what point any variables declared inside the loop are initialized, or re-initialized? Are you adjusting the loop variable inside the loop body in a way that is going to mess with the loop termination?

Programmers think of things like loop pre-conditions, post-conditions, and loop invariants to help them keep track of what they are doing, but beginners don't usually have tools like this that help them run the code in their heads while writing it to help ensure it will do what they intended.

As an example of just how easy this is to screw up, consider examples of unintended infinite loops:

https://en.wikipedia.org/wiki/Infinite_loop#Examples_of_unintentional_infinite_loops

CB @cbanek Peer Contributor

Being frustrated about something that no one can help you with.

Sometimes you get bugs that just are real headscratchers. This happens at the beginning of your career, at the end, and all the way through. There's some subtle thing keeping your code from working, even though you've gone through all the guides, stack overflow, and code review you can handle. Examples of issues like this are bugs in other people's code, library incompatibilities, timing issues, and generally trying to do anything.

You really need a lot of patience and a good problem solving attitude to solve these problems and keep going. Some people are lucky and look more productive because they don't run into these problems as often (though they do run into them). But you learn a lot more by solving these issues and understanding random parts of the stack.

To do this you really need to understand the entire system and use your tools. You need to understand things like how the OS might be doing things, how memory works, how threads work, how drivers work, etc.

If you just sit there and get frustrated, you can put in all the time in the world and not come up with the solution. You need an engineering/builder mentality right from the start, IMHO.

40 @40acres Peer Contributor

I would argue that it's thinking programmatically and applying that mindset to a computer.

When humans interact with each other there is a lot of subtlety and nuance that is embedded in that communication. I can say something to you but you can infer that I really mean the opposite by the tone of my communication.

All that is lost with computers, when communicating with a computer you need to be especially precise in what you want the computer to do and when you want the computer to do it. I'd argue that most bugs are a result of improper communication between the programmer and the computer. Either the actual intent was not communicated properly or there is context lacking in the communication (server status, load, etc.) that is not being accounted for.

HISTORICAL ERA Cloud & Mobile Era (2014–2019)
COMMUNITY SCORE ★ 27 points
TOTAL DISCUSSIONS 41 comments
TOPICS & TECH STACK:
More Retrospectives by @mrburton