Most active commenters
  • iamflimflam1(3)

235 points mad2021 | 35 comments | | HN request time: 2.021s | source | bottom
1. tomhow ◴[] No.45535489[source]
Previously:

My approach to building large technical projects - https://news.ycombinator.com/item?id=36161397 - June 2023 (27 comments)

2. davidkunz ◴[] No.45535491[source]
I have huge respect for Mitchell, it's impressive what he achieved.

I agree with all the points of this article and would like to add one: Have a quick feedback loop. For me, it's really motivating to be able to make a change and quickly see the results. Many problems just vanish or become tangible to solve when you playfully modify your source code and observe the effect.

replies(3): >>45535582 #>>45536232 #>>45536261 #
3. ◴[] No.45535555[source]
4. amenghra ◴[] No.45535582[source]
If you have the time, what Bret Victor’s talk Inventing on Principal. The talk covers feedback loops. https://www.youtube.com/watch?v=PUv66718DII
5. geokon ◴[] No.45535687[source]
I feel there is a balance to strike with rushing to a demo. .. (maybe it's an implicit tension between the satisfaction of finishing a component and getting a demo)

I think this is where the choice of language makes a big difference. In Clojure, the difference between a "component" and a separate library/application is literally just adding a `deps.edn` file and then pointing to the directory from the parent project.

I think breaking the project in to small achievable goals is very sensible. But if you take the extra time to make the component stand on its own as a mini-lib .. it's very satisfying. For instance I had to write a "component" that would read some GeoJSON and segment it (it's took me a couple of days and was mostly a wrapped around GDAL or something). I could have hacked together a solution to rush to a demo - but instead I made a small little library out of it. When I was done with it, I had a sense of "I made a thing". To be clear.. it's still kind of ugly and I would be horrified if someone else tried to use it and submitted PRs.. but it's also not a coupled tangle of code in my larger codebase.

as he says "Build for yourself" - the library/application should only do what you need

By contrast, if I was working in C++ making an API and decoupled library would be such a chore that'd never bother

The most important aspect is that this all ends up not just much more satisfying at every step - but it makes your code incredibly decoupled and refactorable. The more you rush to a demo the more your code is coupled and hard to refactor.

6. ArcHound ◴[] No.45535771[source]
This is how agile should look like. Focused, iterative and always functional.
7. Copenjin ◴[] No.45535896[source]
One of the few people that has done consistently good open source projects, with very clean and clear vision of what the project should accomplish.
8. iamflimflam1 ◴[] No.45535901[source]
For me just starting is the best way. So many people see a big project and get trapped in analysis paralysis.
replies(1): >>45536650 #
9. ramon156 ◴[] No.45536232[source]
Would you say that testcases help here? I've been thinking about applying e2e tests on any bugs I find so I know they're fixed
replies(1): >>45536427 #
10. mhaberl ◴[] No.45536261[source]
This perfectly aligns with my experience. Every large project I have worked on showed a clear correlation between the ease of setup and running and the number of problems on the project, like bugs and missed deadlines.
11. mrheosuper ◴[] No.45536268[source]
>This is an area where I think experience actually hurts. I've seen senior engineers get bogged down building the perfect thing and by the time they get a demo, they realize it sucks. The implementation doesn't suck, but the product or feature itself actually sucks.

This resonates with me. Sometime i want to "turn off" my brain and write shitty code.

Back in the day, i made a lot of toy project. Sometime all the source code is in single file. No respect to modularity. But it was fun, and it worked. Now just try to finish a toy project seem much harder than ever.

replies(4): >>45536290 #>>45536381 #>>45538017 #>>45538457 #
12. Bukhmanizer ◴[] No.45536290[source]
I think this is why often new languages get so hyped early on. A bunch of inexperienced people get to leave all the boring “best practices” back in their old languages
13. lordnacho ◴[] No.45536381[source]
Isn't this called the second system problem? When you've done it before, you feel like you need all the bells and whistles?
replies(1): >>45536465 #
14. zingar ◴[] No.45536427{3}[source]
E2E tests in a high ratio to other tests will cause problems. They’re slow and brittle and become a job all on their own. It’s possible that they might help at the start of debugging, but try to isolate the bugs to smaller units of code (or interactions between small pieces of code).
replies(2): >>45538661 #>>45539464 #
15. mrheosuper ◴[] No.45536465{3}[source]
You are right, this is the first time i've heard about "second system problem". Never know it has its own term.
replies(1): >>45538491 #
16. hk__2 ◴[] No.45536650[source]
Oh, starting is easy. It’s finishing that’s hard.
replies(1): >>45538726 #
17. meander_water ◴[] No.45536766[source]
Great read, but I was expecting something different based on the title.

This sounds like his approach working on personal projects. I'm really curious about large technical team projects though. What's the best approach to getting stuff done and making sure everyone is working towards the same goal etc.

After 15 years I have yet to see a technical project that hasn't run over budget, over time, under delivered or burnt people out.

I'm sure there are people out there with counter examples who know exactly how to deliver projects at a massive scale. Any links/suggested reading would be appreciated!

replies(1): >>45537079 #
18. makeitdouble ◴[] No.45537079[source]
> over budget, over time, under delivered

TBH these are fine in my book.

"over budget" is only an issue if there's really no more money, and I think it's pretty rare for IT projects. Most of the time it's just someone complaining the estimate was off.

"Over time" is the same, it's an issue if there was a real deadline, but the best practice is not plan unflexible events (e.g. do a huge PR campaign with the date on it) before it's basically done.

"under delivered" is a matter of expectations, the real pointis that it was delivered at all.

> or burnt people out.

This one is not like the others. People shouldn't burn out over bullshit deadlines.

19. SteveLauC ◴[] No.45537241[source]
Really enjoy the post, thanks for sharing.

> My goal with the early sub-projects isn't to build a *finished* sub-component, it is to build a good enough sub-component so I can move on to the next thing on the path to a demo.

This is so enlightening. And I realized that to do this, one has to "skip" something. Other folks mention they ignore code modularity when doing this, I don't think I will do that, keeping code clean and reading/working in such a codebase actually make me satisfied and motivated. For me, I am going to "skip" algorithms, data strucuture and performance.

So the point here is probably, we should skip things, but if a thing motivates you, it should not skipped?

20. Vipsy ◴[] No.45537622[source]
An interesting consideration is how the chosen modularization approach can impact onboarding time for new contributors. A well structured breakdown might not just aid initial development speed, but also reduce ramp up friction for future team members or external collaborators. This is an impartant factor often under-estimated in solo-driven projects.
21. piltdownman ◴[] No.45537905[source]
//Decompose a large problem into smaller problems. Only solve the smaller problem enough to progress on a demo... ...then continue to iterate on more functionality. Make demos as frequently as you can. Prioritize functionality that enables you to adopt your own software Go back and iterate on each component as needed for future improvements//

So in essence we have: Empirical Process Control, Self-Organization, Collaboration, Value-Based Prioritization, Time-Boxing, and Iterative Development.

Is this just solo-SCRUM or am I missing something here?

22. Cthulhu_ ◴[] No.45538017[source]
I think you can practice it; do some coding excercises, e.g. Advent of Code is coming up again, usually it's only the later ones that require some optimization or clever algorithms (...I never got that far). Or a constrained environment, you can't write long code in pico-8. Or time limited, like a hackathon or game jam.
replies(1): >>45538043 #
23. CaptainOfCoit ◴[] No.45538043{3}[source]
Game jams and hackathons are a fun and easy way to get a lot better at scoping and saying no, and being able to predict what works or not once everything is in place.

It's a playful environment with low stakes too, compared to working in a startup, so really advice new programmers to participate in order to learn faster.

24. jiggunjer ◴[] No.45538275[source]
For me the best demo is a test module lighting up all green.

How do make this into a sexy image for management. Sure, business logic is stubbed, but my carefully crafted strongly typed interfaces all mesh together! Imagine the future dividends!

25. saaspirant ◴[] No.45538457[source]
LLMs (Cursor) have pretty much solved this problem for me. I design the DB tables manually and let it run somewhat wild with implementation.
26. poszlem ◴[] No.45538479[source]
This isn't an "everyone who struggles to finish projects or is a perfectionist has it" kind of post, but if this has been a long-term pattern for you, one that's caused real suffering, lost jobs or contracts, or kept you from finishing important work - please consider getting checked for ADHD. It took me 42 years to get diagnosed, and starting on stimulants genuinely changed my life and pretty much solved those issues for me.
27. theryan ◴[] No.45538491{4}[source]
The Mythical Man-Month by Fred Brooks is still a good read today and goes into depth about this topic. He called it the second system effect and considered it to be the most dangerous system an experienced developer will create.

His 'No Silver Bullet' theory may or may not stand up to what AI is doing today as well.

replies(1): >>45539103 #
28. skydhash ◴[] No.45538661{4}[source]
And I would add that e2e tests should be more about the businesses rules. Making sure everything is there for a specific flow and not caring that much about the intricacy of things. And such, it should really be part of Ops, not Dev.

Quick feedback with unit tests can help. It can be a pain to decouple stuff so you can test them better, but it’s worth it IMO.

29. iamflimflam1 ◴[] No.45538726{3}[source]
Well yes - best to make that part somebody else’s problem :)
replies(1): >>45540126 #
30. skeeter2020 ◴[] No.45539103{5}[source]
From what I've seen it's standing up. His original statement/hypothesis is often misrepresented.

"there is no single development, in either technology or management technique, which by itself promises even one order of magnitude [tenfold] improvement within a decade in productivity, in reliability, in simplicity."

If he had also included "volume" then AI would have disproved him! More anecdotally, the hands-on experiences of senior+ developers seem to firmly fall into the accidental camp, with the essence of software problem solving getting marginally easier as you'd expect with a new, powerful tool, but far from "solved".

31. MoreQARespect ◴[] No.45539464{4}[source]
Hermetic e2e tests (i.e. ones that can run offline and fake apis/databases) dont have that problem so much.

They also have the advantage that you can A) refactor pretty much everything underneath them without breaking the test, B) test realistically (an underrated quality) and C) write tests which more closely match requirements rather than implementation.

replies(1): >>45539848 #
32. sjdjsin ◴[] No.45539848{5}[source]
> i.e. ones that can run offline and fake apis/databases

I can see a place for this, but these are no longer e2e tests. I guess that’s what “hermetic” means? If so it’s almost sinister to still call these e2e tests. They’re just frontend tests.

> A) refactor pretty much everything underneath them without breaking the test

This should always be true of any type of tests unless it’s behavior you want to keep from breaking.

> B) test realistically (an underrated quality)

Removing major integration points from a test is anything but realistic. You can do this, but don’t pretend you’re getting the same quality as a colloquial e2e tests.

> C) write tests which more closely match requirements rather than implementation

If you’re ever testing implementation you’re doing it wrong. Tests should let you know when a requirement of your app breaks. This is why unit tests are often kinda harmful. They test contracts that might not exist.

33. iamflimflam1 ◴[] No.45540126{4}[source]
Joking obviously!
34. dorianniemiec ◴[] No.45540347[source]
Interesting, especially the "Build for Yourself" section!

Building software for yourself can help you solve a problem you have. If you're also using the software yourself, you can fix bugs in the software. I found some bugs in a web server I'm building by trying to use it myself.