Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Programming today is easier in many ways: Information is readily available for free (I recall saving up a lot of money for a kid to buy specific programming books at the book store after exhausting my library’s offerings). Compilers and tooling are free. Salaries are much higher and developers are a respected career that isn’t just “IT”. Online programming communities are more abundant and welcoming than impenetrable IRC cliques of years past. We have a lot that makes programming today more comfortable and accessible than it was in the past.

However, everything feels vastly more complicated. My friends and I would put together little toy websites with PHP or Rails in a span of weeks and everyone thought they were awesome. Now I see young people spending months to get the basics up and running in their React front ends just to be able to think independently of hand-holding tutorials for the most basic operations.

Even business software felt simpler. The scope was smaller and you didn’t have to set up complicated cloud services architectures to accomplish everything.

I won’t say the old ways were better, because the modern tools do have their place. However, it’s easy to look back with rose-tinted glasses on the vastly simpler business requirements and lower expectations that allowed us to get away with really simple things.

I enjoy working with teams on complex projects using modern tools and frameworks, but I admit I do have a lot of nostalgia for the days past when a single programmer could understand and handle entire systems by themselves because the scope and requirements were just so much simpler.



> Spending months to get the basics up and running in their React frontends just to be able to think independently of hand-holding tutorials for the most basic operations.

Frontend devs who were present before the advent of the major web frameworks, and worked with the simplicity of js script + DOM (or perhaps jquery as a somewhat transparent wrapper) benefited from seeing the evolution of these frameworks, understanding the motivations behind the problem they solve, and knowing what DOM operations must be going on behind the curtain of these libraries. Approaching it today not from the 'ground up' but from high level down is imo responsible for a lot of jr web devs have surprising lack of knowledge on basic website features. Some, probably a minority, of student web devs may get conditioned to reach for libraries for every problem they encounter, until the kludge of libraries starts to cause bugs in and of itself or they reach a problem that no library is solving for them. I feel like this is particularly bad outcome for web devs because web I feel is uniquely accessible for aspiring developers. You can achieve a ton just piggybacking off the browser and DOM and it's API, the developer tools in the browser etc. But not if you are convinced or otherwise forced to only approach it from the other side -- running before you crawl, or trying to setup a webpack config before you even understand script loading, etc.


Looking back over my relatively short 30 year career across an assortment of tech companies (hp, google, microsoft, apple, etc) I would add that this mostly changed due to what was rewarded. Around 15 years ago when the first vestiges of OKR review processes and the idea of "impact" started to form; We shifted our designs from things that made our long term outlook better (simple) to things that were easy to explain to management how they had HUGE impact (complex).

Be right back, writing a new design doc for a messaging service and protocol spec to go with it that I can use to pad my next review cycle.


At my current company we have a take home assignment for some roles. When I have to grade one the first thing I do is check to see whether you can submit the input by pressing enter.

About half the time you can’t because it’s not actually a form, and they forgot to add handler for enter.


I’d suggest adding instructions to handle enter if that is your criteria.

When doing a take home exercise the candidate is desperate to figure out what you are judging on. The more you make that explicit the better your outcomes will be.

Right now your process biases for enter handler adders. Is that your intent?


Part of the difference between a junior and a senior role is that people in a senior role are expected to fill in missing details independently, without detailed directions. If you only test people on their ability to follow detailed directions, then you will only be able to test for junior roles.

When I give candidates prompts / questions / scenarios, I try to include some specific instructions, but also leave some details out. The idea is to come up with a prompt that junior developers can still work with by going head-on, but which has some open-ended nature to it, to see how people respond to things which are open-ended or even ambiguous. It's not a trick or trap; candidates are explicitly told what's up, and that I'm evaluating not only their ability to solve a problem, but to define the problem in the first place.


This is kind of silly. Actual senior developers get near-real-time feedback from the rest of the organization, and if their interpretation of a request is off, they get multiple attempts to satisfy the request. None of this is true of a coding exercise.

If you want to evaluate a candidate's ability to cut through ambiguity or manage sprawling scope, evaluate that and only that in a specific exercise. Don't just build a shoddy coding test and then rationalize it's weaknesses by saying that good candidates will succeed despite the flaws of the test. That's both disrespectful and un-rigorous.


> Actual senior developers get near-real-time feedback from the rest of the organization, and if their interpretation of a request is off, they get multiple attempts to satisfy the request.

Junior developers get near-real-time feedback from senior developers who are supervising them. Senior developers have to be able to give that feedback, have to be able to anticipate user needs, and have to be able to run long-term projects where you may have to work for days, weeks, or months before receiving critical pieces of feedback.

> If you want to evaluate a candidate's ability to cut through ambiguity or manage sprawling scope, evaluate that and only that in a specific exercise.

This is a common mistake that I see inexperienced interviewers make. Trying to throw more detailed and specific exercises at candidates is a fool's errand at best, and at worst it means that you're putting candidates through additional tests (and your acceptance rate will suffer).

The main problem with ambiguity is that it appears unexpectedly. If you give someone an ambiguous problem and say, "Tell me what is ambiguous about this problem," then you're not testing what you want to know. What you actually want to know is whether candidates can recognize ambiguous problems without being prompted to recognize them--and the reason for this is that ambiguous are extremely common in real-world scenarios.

An ambiguous problem is not a trick or a trap. It is explicitly part of the interview process, and interviewees are given guidance that the problems they are given may not be precisely defined.

> Don't just build a shoddy coding test and then rationalize it's weaknesses by saying that good candidates will succeed despite the flaws of the test.

Why do you say that the coding test is shoddy?

My observation is that a large percentage of candidates will succeed at coding tests if you give them an ambiguous prompt. In practice, they will either ask questions to resolve the ambiguity, or just pick a way to resolve the ambiguity for the purposes of the test. This matches real-world scenarios--you are going to often encounter ambiguous or incomplete problems in the real world.

If you want a precisely-specified coding problem, then go to Hacker Rank or Project Euler or something like that, or join a competitive programming team.


> This is a common mistake that I see inexperienced interviewers make. Trying to throw more detailed and specific exercises at candidates is a fool's errand at best, and at worst it means that you're putting candidates through additional tests

Have you tested this assertion with data? Because I’ve built interview pipelines several times now and the data I collected showed the exact opposite. The more specific a test was for the trait you wanted to select for the better results you’d get across all metrics, interviewers and candidates. It’s almost my defining characteristic of a good selection criteria after 2 decades of interviewing.


How are you giving these additional, more specific tests? I would think that your acceptance rates would start dropping once you get past five rounds or so.

My personal experience is that people new to interviewing are the ones who think that making individual interviews more precise will improve the process, but my experience is that improvements to the overall interview process aren’t done by improving how good individual interviews are.


You have between 10-16 hours of time with a candidate depending on the desire ability of your job. I like to break it into: 1 hour of pitch/expectation setting where the only screening is for ability to complete the process (language, appropriate background, etc) and to catch obviously fraudulent candidates, 4 hours of take home technical assessment (programming project), 4 hours of soft skill assessment (3 hours of prep and 1 hour of presentation is my favorite format) and 1 hour of meeting with the hiring manager.

But, the format is not really the point. The point is to have a specific thing you are trying to discern from your filter and to focus your efforts on making that the only thing you are judging on.


You have a budget for the number of hours you can make a candidate spend on work samples; it's the amount of time they'd spend in the interviews your tests are offsetting. This isn't complicated.


Unsurprisingly, I can report the same thing about the interview pipelines we're running at Fly.io. Not a week goes by where someone in our leadership team doesn't remark about how valuable the exercise we run specifically for this junior/senior scope-management/question stuff is.


You do know that handling enter by submitting the form is the default behavior if you do absolutely nothing? You actually have to go out of your way to override that and suppress it.

Sometimes it makes sense to do something else instead, but if so, you should handle it in a sane way and actually do that something else. Not just suppress it.


I always found this behavior strange. Tab often doesn’t work correctly in a browser, cycling through elements that shouldn’t be focused, sometimes in a strange order. Enter submits a form. How does one cycle through “fields” then? I have also seen premature form sends when you hit enter to autocomplete etc. It also creates multiline textarea vs input inconsistency.

Desktop frameworks “committed” input on enter and most often focused the next field, so you could skip them by enter enter enter. This worked correctly since FoxPro/TurboVision/Norton times. Only Ctrl-Enter would press a “default” button out of order.

But web has its own ways as usual.


As someone whose been learning the last few years, a lot of learning materials suggest you don’t make a proper form element and just make your own button instead of using using a form element and all the built in benefits it brings for reasons I don’t really know. I’ve probably wondered about this sort of thing for few good hours total, but I guess this comment steers me in the right direction.


Yeah, don't do that unless you have good reason to do so.

Browsers have a standard, default, expected behavior. Sometimes, in rare cases, it makes sense to break that in order to do something else instead. But you shouldn't just silently break it for no reason other than to confuse the user.


In addition to what others have mentioned, using elements for their stated/official purpose helps with accessibility. Yes, you can use the role attribute, but some accessibility technology works more completely if you use proper elements. (And just can be easier to use; I guess the best way to compare it is using VO on a site where everything is just divs is like the blind version of this[0] Or Comic Sans. Just visceral 'ugh'.).

[0] https://www.theworldsworstwebsiteever.com/


At my current company, we changed enter to stop submitting because it’s not intuitive to users. I think there are exceptions for forms with only one field.

So perhaps that isn’t the best litmus test? I wonder if it’s written down that should work as part of the assignment.


It’s intuitive to any user who has used a web form anytime for the last 2 decades.

Breaking default browser behavior because you find it unintuitive is generally a bad idea.

Now if you’re dealing with something that isn’t really a web form—as in you’re overloading input fields for some interactive non form like behavior—then I can see it.

In my case, if the person had some well thought out reason for doing it, I might let it slide. But the vast majority of times I’ve seen it, it’s because the person doesn’t even know how to use forms. Not understanding the underlying technology at at least a very basic level is a strike against you in my book.


fwiw, in my industry, I should not assume anything about technical literacy. We’ve had honest debates over whether we can even rely on people to have an email address.

Again, it’s not that I disagree with most of your premise, but in fact, as the comments (not just mine) show - people have issues with submitting too early, so it can be a good decision to break that depending on context. Fewer errors. Which is why I brought up how the problem is presented to the candidate. You might be filtering out people based on something less universally accepted and understood than you think.


Web forms have a default behavior. It doesn’t matter whether you accept it, you should understand it.

If you accidentally break it because you don’t understand it, that’s a strike against you in my book. If you consciously break it for a good reason and can coherently defend that reason, that’s a different story.


You can always find an outlier who is new to something, but you'd have to show that it's more than a majority of the users to motivate changing the default. Otherwise it's obviously more unintuitive.

At least you'd have to get a sample big enough to make a statistically significant conclusion.

And the burden of proof is on you, because you are changing the default, not the other way around.

Think of any other products, they all have established default behaviours, yet it's also very easy to find someone who's never used a product before and finds it "unintuitive".

And intuitiveness is only one part of usability anyway.


This is a good explanation.

Newbies drop directly to webpack/react and are overwhelmed or having a lot of trouble getting some details right.

Unfortunately a lot of details that are lost in time are accessible if you go through "build stuff basically from ground" so understanding first "why" we needed these frameworks and what were problems to solve.

There is also bunch of people who go to rediscover basic stuff and they claim "you don't need a framework - vanilla js is enough" - but they also miss context and did not run into problems that were pain points before we had frameworks.


> Some, probably a minority, of student web devs may get conditioned to reach for libraries for every problem they encounter

I teach an online web development course for a university as a side gig. Our students are forbidden from using any third party code, libraries, frameworks, etc. They have to do everything with native html, css, and JS.


This is true for other devs as well. I started playing around with networking code as a teenager (back when port 80 (before 443) was prominent but not the clear majority of traffic on the net.) Watching the evolution of TCP, HTTP, the C10K problem, retry storms, and event loops has made a lot of sense: clear responses to clear issues. But I've noticed a lot of junior devs grow up with the solutions (nginx, haproxy, exponential backoff, etc) but don't know the problems that necessitated the solutions. A lot of junior training is teaching juniors which solutions to apply to which problems, because unlike us they didn't watch the field evolve to where it is now.


I remember when jQuery was first released.... I wish things were that simple again


This is such an interesting perspective. I feel the exact same way as a video producer/editor. The tools we are getting are incredible, and tasks that used to take literally days can be done now in minutes. It’s kind of baffling what we have in our toolbox. But it is also radically changing the expectations of our clients and I find I don’t get to spend as much time on the nuts and bolts I really enjoy - cut, color, and baking the best possible export for the situation - and instead have to find a plug-in to solve every little issue a client thinks up (or created for me haha).

On a somewhat related but tangential note: I also now have clients demanding certain programs and ecosystems, which is absolutely ridiculous to me. The software I use to give you a final cut should in no way be determined by you. Yet somehow we have ceded that ground!


The list of things we've added in last 10 years is just staggering: https://landscape.cncf.io/

The litmus test for abstractions getting out of control is if a KPMG consultant brings it up while sipping Gin and tonic in business class.

Another problem is explosion of DSLs. Everything is yaml and you spend ages learning things like Terraform and Docker compose yaml syntax.


The opposite of using yaml to provision infrastructure in a few minutes was a months long acquisition process for new hardware.

As far as Terraform/HCL and CloudFormation/Yaml, the alternative is writing code to do the same thing in your language of choice using the CDK with either CloudFormation or the recently ported Terraform/CDK.


I'd say DSLs significantly improve specialised tasks. Someone who is working on declarative infrastructure configuration all day really doesn't benefit from classic imperative languages.

But if you do "a little bit of everything" and infrastructure on the side, you're bound to become a master of none.


On the other hand, having to learn 17 different DSLs (from crontab to AWS policy) isn't that far fetched from reality and it puts a lot of burden on people. Every product has a specialized DSL with unique restrictions and just never general enough. Stack Overflow is overflowing with such questions. People are thoroughly confused by "127.0.0.1:9090" vs. "127.0.0.1:9090:9090" or "9090:9090" or "0.0.0.0:9090"... docker network configs. Good lord, it is terrible, sorry, not to shed bad light on Docker; but to exemplify that this is a common thing.

One of the worst experiences in programming is writing CI/CD pipelines. One wonders why...


In most cases (including your examples) it's not really the DSL that is the problem, but the domain specific problem. Portmapping in docker isn't uniform because there are many options available that are all equally useful and up to the user to select. Crontabs have to describe time periodic values, and pretty much any other application that tries to solve a specific problem will not be all that generic (since they are not meant to solve all problems generically at once).

Like I wrote in my comment, how much specific things you need to know will depend on how many specific tasks you perform. If you specialise in nothing, everything will have depths unknown. It will also dilute attention/focus which in turn means you'll never be able to fully understand a specific domain or application. This was reflected in https://news.ycombinator.com/item?id=33056052 where the path it took for many developers and engineers in general to find a fitting solution is unknown to newcomers and also simply not taught in favour of delivering "reviewables" in hopes of a positive review (https://news.ycombinator.com/item?id=33056705) .

Sidenote: mapping ports used to be rather verbose, you'd have to include the address family, the address and the port, on both sides of the mapping. That's 6 elements (excluding separators). So most applications including docker made various parts optional. You can map two ports to any interface, or opt to specify one interface but not the other one etc. A novice user of a new application might be best served by not using any shorthand forms and only using the fully qualified names everywhere. By spelling out every option explicitly (including optional values) there is no more guessing what may or may not have been configured.


> My friends and I would put together little toy websites with PHP or Rails in a span of weeks and everyone thought they were awesome.

Agreed, LAMP was just so damn fun in how you could go from zero to a fully functioning site in a day or two. Having to manage all the statefulness of fetching & displaying data asynchronously from the client adds an incredible amount of complication both in theory and in practice.

Also agree that the old tech wasn't necessarily better either - but it sure would be cool if someone could replicate the developer experience from back then and produce a result that's up to modern engineering and UX standards.


Get rid of the assumption of "frontend first" and most of the complication of web development disappears instantaneously.

Something I am appreciating about Svelte/Kit and Phoenix is that they are admitting what was right about PHP and server-rendered webpages. I'm a frontend engineer and think that SPAs have their place, but frontend JS represents a kind of tyranny seen nowhere else in tech.


Its really hard to find proper learning materials to get started with the backend; its all a bunch of shortcuts glued together because the tutorial really wants to show you how to make a react frontend first and foremost.


Phoenix, do you mean the Elixir web framework? I had thought it was Elixir's counterpart to Rails.


Phoenix liveview is server rendered interactive websites.


I think things are more complicated precisely because things got easier.

The more complexity we can now handle, the more complexity we will create.


If you think we're actually handling it. Seems to me there's a whole lot of "let's just glue all these black boxes together, cross our fingers and hope they do what we want, and still do the same thing after the next update" vs. in simpler times actually writing and understanding the code.


> Even business software felt simpler.

This made me remember how acceptable a developer designed utility used to be. Now, you can barely launch an MVP without finding or paying for design and high quality UX/UI. If you do it’s likely going nowhere in terms of traction. I’m sure this has only seemed to be the new rule and there are a few exceptions. But not many.

Even Stripe all those years ago really took off after investing in design. They’ve remained rather polished. But they’re also an exceedingly well funded operation.


> Information is readily available for free (I recall saving up a lot of money for a kid to buy specific programming books at the book store after exhausting my library’s offerings).

Gave me flashbacks to when I was younger. I would work on a problem until hitting a wall I couldn't get around then go into Books A Million with pencil and paper and copy concepts/algos out of CS books. I was too poor to spend $50+ on a book at the time. Now, anything a new programmer wants to know is just a Google search away.

But, there is so much more that just diving in can be hard. Even simple things are complicated I think mainly because expectations are so much higher.


> Salaries are much higher and developers are a respected career that isn’t just “IT”.

I agree the compensation is higher. I don’t agree the respect is any higher. Software engineer is highly associated with terms like neckbeard, redditor, incel, autistic, etc.

I’m extremely hesitant to tell anyone I’m a software engineer. If anything - I’ll lie and say I do product management just to avoid the association. People treat me way better when I say I’m a PM instead of an eng.


> Information is readily available for free

As much as people decry the internet and it’s role in modern society, I’m glad that I generally have easy access to massive archives of knowledge.




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

Search: