Hacker Newsnew | past | comments | ask | show | jobs | submit | whstl's commentslogin

Agreed.

Most of the work brought to me gets done before I even think about sitting down to type.

And it's interesting to see the divide here between "pure coder" and "coder + more". A lot of people seem to be in the job to just do what the PM, designer and business people ask. A lot of work is pushing back against some of those requests. In conversations here in HN about "essential complexity" I even see commenters arguing that the spec brought to you is entirely essential. It's not.


Someone commented yesterday that managers and other higher-ups are "already ok with non-deterministic outputs", because that's what engineers give them.

As a manager/tech-lead, I've kind of been a tech priest for some time.


Which is why it's so funny to hear seasoned engineers lament the probabilistic nature of AI systems, and how you have to be hand setting code to really think about the problem domain.

They seem to all be ICs that forget that there are abstraction layers above them where all of that happens (and more).


Why would the average programmer have a problem with it?

The average programmer is already being pushed into doing a lot of things they're unhappy about in their day jobs.

Crappy designs, stupid products, tracking, privacy violation, security issues, slowness on customer machines, terrible tooling, crappy dependencies, horrible culture, pointless nitpicks in code reviews.

Half of HN is gonna defend one thing above or the other because $$$.

What's one more thing?


Say it louder.

> most web developers who learned their craftsin the last decade learned frontend React-first, and a lot of them genuinely don't have experience working without it

That's not cynical, that's the reality.

I do a lot of interviews and mentor juniors, and I can 100% confirm that.

And funny enough, React-only devs was a bigger problem 5 years ago.

Today the problem is developers who can *only* use Next.js. A lot can't use Vite+React or plain React, or whatever.

And about 50% of Ruby developers I interviewed from 2022-2024 were unable to code a FizzBuzz in Ruby without launching a whole Rails project.


My test for FE is to write a floating menu in JSFiddle with only JS, CSS, and HTML. Bonus if no JS.

If you can do that, then you can probably understand how everything else works.


Yep, that's a good test. And it's good even if it's for a React only position.

>> a lot of them genuinely don't have experience working without [react]

> Today the problem is developers who can only use Next.js. A lot can't use Vite+React or plain React, or whatever.

Do you want to hire such developers?


No, that's why I said "problem".

My job during the hiring process is to filter them.

But that's me. Other companies might be interested.

I often choose to work on non-cookie-cutter products, so it's better to have developers with more curiosity to ask questions, like yourself asked above.


> The reason we stop junior devs from going down this path is because experience teaches us that things will break and when they do, it will incur a world of pain.

Hyperbole. It's also very often a "world of pain" with a lot of senior code.


> The software engineers' body of knowledge can change 52 times in a year

Nah, those changes are only in the surface, at the most shallow level.

There's always new techniques, materials and tools in structural engineering as well.

Foundations take a lifetime to change.


> Nah, those changes are only in the surface, at the most shallow level.

Very strongly disagree.

There are limitless methods of solving problems with software (due to very few physical constraints) and there are an enormous number of different measures of whether it's "good" or "bad".

It's both the blessing and curse of software.


Once again, that's only true at the surface level.

If you dig deeper you'll realize that it's possible to categorize techniques, tools, libraries, algorithms, recipes, whatever.

And if you dig even deeper, you'll realize that there is foundational knowledge that lets you understand a lot of things that people complain about being too new.

The biggest curse of software is people saying "no" to education and knowledge.


> Once again, that's only true at the surface level.

Can you provide concrete examples of the things that you think are foundational in software? I'm thinking beyond "be organized so it's easier for someone to understand", which applies to just about everything we do (e.g. modularity, naming, etc.)

For every different approach like OOP, functional, relation DB, object DB, enterprise service bus + canonical documents, microservices, cloud, on prem, etc. etc., they are just options with pros and cons.

With each approach the set of trade-offs is dependent on the context that the approach is applied into, it's not an absolute set of trade-offs, it's relative.

A critical skill that takes a long time to develop is to see the problem space and do a reasonably good job of identifying how the different approaches fit in with the systems and organizational context.

Here's a real example:

A project required a bunch of new configuration capabilities to be added to a couple systems using the normal configuration approach found in ERP systems (e.g. flags and codes attached to entities in the system controlling functional flow and data resolution, etc.). But for some of them a more flexible "if then" type capability made sense when analyzing the types of situations the business would encounter in these areas. For these areas, the naive/simple approach would have been possible but would have been fragile and difficult to explain to the business how to get the different configurations in different places to come together to produce the desired result.

There is no simple rule you can train someone on to spot when this is the right approach and when it is not. It's heavily dependent on the business context and takes experience.


> Can you provide concrete examples of the things that you think are foundational in software?

Are you really expecting an answer here? I'll answer anyway.

• A big chunk of the CompSci curriculum is foundational.

• Making wrong states unrepresentable either via type systems or via code itself, using invariants, pre/post-conditions, etc. This applies to pretty much every tool or every language you can use.

• Error handling is a topic that goes beyond tools and languages, and even beyond whether you use try/catch, algebraic objects or values. It seeps into logging and observability too.

• Reasoning about time/space and tradeoffs of algorithms and structures, knowing what can and can't be computed, parsed, or recognized at all. Knowing why some problems don’t scale and others do.

• Good modeling of change, including ordering: immutability vs mutation, idempotency, retry logic, concurrency. How to make implicit timing explicit. Knowing which choices are cheap to undo and which are expensive, and design for those.

• Clear ownership of responsibilities and data between parts of the system via design of APIs, interfaces and contracts. This applies to OOP, FP, micro-services, modules and classes, and even to how one deals with third party-services beyond the basic.

• Computer basics (some of which goes back to 60s/70s or even back): processes, threads, green memory, scheduling, cache, instructions, memory hierarchy, threads, but races, deadlock, and ordering.

• Information theory (a lot goes to Claude Shannon, and back): compression, entropy, noise. And logic, sets, relations, proofs.

I never said there is a "simple rule" only foundational topics, but I'll say again: The biggest curse of software is people saying "no" to education and knowledge.


> Are you really expecting an answer here? I'll answer anyway.

Yes, and thanks for the examples, it's now clear what you were referring to. I agree that most of those are generally good fundamentals (e.g. wrong states, error handling, time+space), but some are already in complex territory like mutability. Even though we can see the problem, we have a massive amount of OOP systems with state all over the place. So the application of a principle like that is very far from settled or easy to have a set of rules to guide SE's.

> The software engineers' body of knowledge can change 52 times in a year

Nah, those changes are only in the surface, at the most shallow level.

I think the types of items you listed above are the shallow layer. The body of knowledge about how to implement software systems above that (the patterns and approaches) is enormous and growing. It's a large collection of approaches each with some strengths and weaknesses but no clear cut rule for application other than significant experience.


> I think the types of items you listed above are the shallow layer

They are not, by definition. You provided proof for it yourself: you mention the "body of knowledge [...] above that", so they really aren't the topmost layer.

> is enormous and growing

That's why you learn the fundamentals. So you can understand the refinements and applications of them at first glance.


> They are not, by definition. You provided proof for it yourself: you mention the "body of knowledge [...] above that", so they really aren't the topmost layer

I said "shallow", not "topmost".

> That's why you learn the fundamentals. So you can understand the refinements and applications of them at first glance.

Can you explain when (if ever) a person should use an OOP approach and when (if ever) he/she should use a functional approach to implement a system?

I don't think those fundamentals listed above help answer questions like that and those questions are exactly what the industry has not really figured out yet. We can see both pros and cons to all of the different approaches but we don't have a body of knowledge that can point to concrete evidence that one approach is preferred over the many other approaches.


I'm really sorry, but if you think those topics above are "shallow", I don't think we have much to talk about and should probably agree to disagree.

> Can you explain when (if ever) a person should use an OOP approach and when (if ever) he/she should use a functional approach to implement a system?

I can, and have done several times, actually, for different systems.

> I don't think those fundamentals listed above help me

The list I gave was not exhaustive. You asked yourself for "concrete examples" and I gave examples.

The reason I can't answer hard questions in a simple message is exactly because those foundations are not "shallow" at all.


> I can, and have done several times, actually, for different systems.

The reason I asked that question isn't to be argumentative, it's because, IMO, the answer to those types of questions are exactly what does not exist in the software engineering world.

And talking through the details of our different opinions is how we can understand where each one is coming from and possibly, maybe, incorporate some new information or new way of looking at things into our mental models of the world.

So, if you do think you have an answer, I am truly interested in when you think OOP is appropriate and when functional is better suited (or neither).

If someone asked me that question, I would say "If we're in fantasy land and it's the first system ever built and there are no variables related to existing systems and supportability and resource knowledge, etc., then I really can't answer the question. I've never built a system that was significantly functional, I've only built procedural, OOP and mixtures of those two with sprinklings of functional. I know there are significant pros to functional, but without actually building a complete system at least once, I can't really compare"


You asked whether one should use OOP or FP to implement a system.

I can answer that, and did in the past, as I have done projects in both OOP and FP. But before I answer, I ask follow-up question about the system itself, and I will be giving lots of "it depends" and conditions.

There is no quick and dirty rule that will apply to any situation, and it's definitely not something I can teach in a message board.


Respectfully, I disagree. You're correct on the facts, but any "new techniques, materials and tools" need to be communicated to the brick layers. That takes time and effort i.e. it all needs to be actively managed. The brick layers have to be able to work with those new techniques and materials. I don't want some of them using method #1 over here, and method #2 over there, unless I'm wholly conversant with the methods, and fully confident that it'll all mesh eventually. The system i.e. the whole shebang has to work coherently to serve its purpose.

> Respectfully, I disagree. You're correct on the facts, but

I'm fine with the disagreement if you say I'm correct. ¯\_(ツ)_/¯

> any "new techniques, materials and tools" need to be communicated to the brick layers

Same for software.

> That takes time and effort i.e. it all needs to be actively managed. The brick layers have to be able to work with those new techniques and materials.

Same for software.

> I don't want some of them using method #1 over here, and method #2 over there, unless I'm wholly conversant with the methods, and fully confident that it'll all mesh eventually. The system i.e. the whole shebang has to work coherently to serve its purpose.

Same for software.

Virtually every profession has a body of knowledge that's constantly getting updated. Only software engineers seem to have this faulty assumption that they must apply it all immediately. Acknowledging it's a false assumption leads to a better life.


Then we're in violent agreement.

The challenge would be to control the pace of the evolution of the body of knowledge, but more importantly, its application, to a pace that's consistent with the pace of the system you're building.

> faulty assumption that they must apply it all immediately

No truer word was ever said. Everyone is attracted to shiny things.


Ah nice, then yes, we agree!

> software that has "good" and "bad" parts in unpredictable

Software that has only "bad" parts is also very unpredictable.

(Unless "bad" means something else than "bad", it's hard to keep up with the lingo)


that's why I write the first parts of my comment

your example is just bad code that unpredictable


And I disagree.

My assertion is that software that has only bad parts is way more unpredictable than software that has both good and bad.

For multiple reasons: because "bad" is not necessarily internally consistent. Because it's buggy.

Unless, again, "bad" here means "objectively good quality but I get to call it bad because it's not in the way I like to write code".


GP is talking about "consistently bad" being worse than "inconsistently good". Not defending any inconsistency.

What you describe just sounds "inconsistent AND bad".


I didn’t really get into it, but I think that most decisions which are not consistent are made with some feeling of “I will improve upon the existing state of this ugly codebase by introducing Good Decisions”. I’m sure even the authors of the Redux section of my code felt the same way. But code with two competing standards, only one good, is almost always worse than code with one bad standard. So breaking with consistency must be carefully considered, and the developers must have the drive to push their work forward rather than just leaving behind an isle of goodness.

You're getting a lot of pushback in the comments here and I don't understand why. This is exactly right. Stay consistent with the existing way or commit to changing it all (not necessary all at once) so it's consistent again, but better.

Nobody is pushing back about "commit to changing all".

Nobody is denying that "inconsistent" can be bad on its own.

But you can't say that "inconsistent but good" is bad by providing an example of how "inconsistent and bad" is bad.


I don't know what to say.

That’s a logic error. The claim was that "inconsistent but good" can exist, not that "inconsistent == good". Responding with one example where "inconsistent" turned out badly is a totally different claim and doesn't refute what GP says.


Who said that I only had one example? I just listed one so you'd have an idea of what I was talking about. I could give you like a hundred. This is a heuristic I've developed over a lot of time working in codebases with inconsistencies and repeatedly getting burned.

I'm not disagreeing with your example and conclusion, and I've seen many of those.

I actually agree that half-assing a problem is not the best solution.

It's just that they are not examples of "inconsistent but good". They are not even "good", just "inconsistent". You said yourself that they're worse overall.


I mean, whenever the Deutsche Bahn is involved, in large parts of Germany speaking German will also get you absolutely nowhere...

As a German speaker, spoken Dutch REALLY trips me up because of small pronunciation differences in almost every word. Written Dutch is way closer.

The Dutch seem to understand German better, but my Dutch friends credit that more to education and exposure.


I don't know about the Dutch but apparently the Flemish don't understand German without having learned it at school.

I speak both some German and some Dutch (as nth languages, I can understand them fine but speaking is hit and miss) and sometimes I don't notice which is which and answer in the wrong language, to me they're almost the same language with a different accent. I translate the German into some Frenglish mess for my Flemish friends to help them understand and it works great.


Your Dutch friends have it right: In German high schools you don't get Dutch, Polish or Czech as a rule but you do get French and English. But in Dutch schools you do get German.

they have access to german tv and watch it.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: