/r/ExperiencedDevs

Photograph via snooOG

For experienced developers. This community should be specialized subreddit facilitating discussion amongst individuals who have gained some ground in the software engineering world.

Any posts or comments that are made by inexperienced individuals (outside of the weekly Ask thread) should be reported.

Anything not specifically related to development or career advice that is specific to Experienced Developers belongs elsewhere. Try /r/work, /r/AskHR, /r/careerguidance, or /r/OfficePolitics.

Welcome to the /r/ExperiencedDevs subreddit! We hope you will find this as a valuable resource in your journeys down the fruitful CS/IT career paths. This community leans towards being a specialized subreddit facilitating discussion amongst individuals who have gained some ground in the IT world.

For an idea of what is encouraged in this subreddit and what is not (please report anything that does not follow the rules):

Rules

1. Do not participate unless experienced (3+ years)

If you have less than 3 years of experience as a developer, do not make a post, nor participate in comments threads except for the weekly “Ask Experienced Devs” auto-thread. No exceptions.

2. No Disrespectful Language or Conduct

Don’t be a jerk. Act maturely. No racism, unnecessarily foul language, ad hominem charges, sexism - none of these are tolerated here. This includes posts that could be interpreted as trolling, such as complaining about DEI (Diversity) initiatives or people of a specific sex or background at your company.

Do not submit posts or comments that break, or promote breaking the Reddit Terms and Conditions or Content Policy or any other Reddit policy.

Violations = Warning, 7-Day Ban, Permanent Ban.

3. No General Career Advice

This sub is for discussing issues specific to experienced developers.

Any career advice thread must contain questions and/or discussions that notably benefit from the participation of experienced developers. Career advice threads may be removed at the moderators discretion based on response to the thread."

General rule of thumb: If the advice you are giving (or seeking) could apply to a “Senior Chemical Engineer”, it’s not appropriate for this sub.

4. No "Which Offer Should I Take" Posts

Asking if you should ask for a raise, switch companies (“should I work for company A or company B”), “should I take offer A or offer B”, or related questions, is not appropriate for this sub.

This includes almost any discussion about a “hot market”, comparing compensation between companies, etc.

5. No “What Should I Learn” Questions

No questions like “Should I learn C#” or “Should I switch jobs into a language I don’t know?”

Discussion about industry direction or upcoming technologies is fine, just frame your question as part of a larger discussion (“What have you had more success with, RDBMS or NoSQL?”) and you’ll be fine.

tl;dr: Don’t make it about you/yourself.

6. No “I hate X types of interviews" Posts

This has been re-hashed over and over again. There is no interesting/new content coming out.

It might be OK to talk about the merits of an interview process, or compare what has been successful at your company, but if it ends up just turning into complaints your post might still be removed.

Related Subs

CS Career Questions

CS Career Questions: Europe

CS Interview Questions

Learn Programming

General Programming Discussion

Coding

CS Theory

CS Education

IT Career Questions

Telecommuting

General Job Discussion

Digital Nomads

Ask Network Security

NetSec Students

Career Guidance


/r/ExperiencedDevs

251,929 Subscribers

2

New job anxiety

Just started a new job after leaving a FAANG at a bank. I was in the shit for 7 years and the pressure here might be lower but I can't help having panic attacks since I don't know the systems, and I still have the FAANG mentality of GO GO FK'N GOOOOOO.

I don't know what else to say, I'm just out of my head in panic mode.

0 Comments
2025/01/15
13:36 UTC

1

Confused about team transfer

I work at my current company and team for about 1.5 years. Recently we got a news that product being built in our team is not profitable anymore, with client demanding a lot of complex functionality, but we don't have enough budget and resources for that. Manager decided to dissolve our team, with most of them transfered to his another, sister team, which has much more impact, visibility and resources. But I'm being transfered to another team, which has nothing to do with products, but building internal tools, which I never worked with. This new project is quite interesting, complex and it seems I will learn some new stuff while working there. But I feel sad that my manager didn't offer to transfer to that sister team as others... He always gave me glowing feedback, we seemed to be getting along very well, I had a raise recently as he was very content and happy with my work. I know there could be a lot of different reasons, but doesn't it look like he was disappointed with me or something. This and the fact I won't be working on product development directly made me very upset, but should I be, idk.

2 Comments
2025/01/15
12:15 UTC

5

Seeking outside perspectives on conflicting opinions about outsourcing vs in-house engineering

I’d appreciate some outside perspective from experienced engineers to help me evaluate a challenging situation.

Context:

  • I've inherited an app that's in poor shape. It was built by a single developer who is a great guy but had limited experience with certain disciplines like monitoring and scalability, and he has been working solo the whole time so there's no CI/CD etc, but the app generates significant revenue and has lots of commercial potential.
  • My role is to stabilise it and prepare for a 10x growth target. I have full authority to build a team, but recruitment takes time, and there’s immediate pressure because no one is actively maintaining it right now.
  • The app’s tech stack includes a mix of Golang and PHP. I have experience in both, and I’m currently working with one other senior engineer who has Golang expertise, but we need more capacity.
  • There is no product, design or testing functions in situ.

The Dilemma:

  • I'm the most senior technical person in the business (Director level) but there’s a fractional CTO involved (via the investment body) who is advising the CEO to outsource to three agencies:
    1. One to handle Terraforming and AWS infrastructure.
    2. One for PHP development.
    3. One for 24/7 monitoring and support.
  • I’ve already agreed to the Terraform agency as a short-term solution - it's a discrete piece of work that needs doing, and the dev doing the work seems competent so I'm OK with that, but I’m skeptical about adding more external partners, especially without proper product and testing functions in place.
  • I interviewed the agencies and found communication barriers (linguistic and technical), making it hard for me to trust they can deliver effectively.

My Advice vs. Theirs:

  • I’ve advised the CEO to either build an in-house team or hire on-shore contractors who are flexible and can adapt to the product needs. (Polyglots - since the PHP app needs rewriting anyway probably to React or similar)
  • The CTO’s preference is for external agencies due to their PHP-specific experience and low cost.

Concerns:

  • While the cost is low enough that it might not seem worth fighting over, I’m worried that the absence of a strong product management or QA function will make these agencies ineffective. I'm also worried it's going to make things even worse and that I'll inherit more of a shitshow.
  • Adding multiple agencies could create coordination chaos, and I’m not confident they’ll take ownership of the product the way an in-house team might.

Other Factors:

  • The CTO and I have different approaches: he prefers to rely on contracts and penalties for accountability, while I lean towards building a team of engineers who feel ownership and treat the product like it’s their own. We are respectful of each other and none of this is personal whatsoever. We just have different approaches.

The CEO is open to feedback but wants me to be clear and explicit about my recommendation. Perhaps I'm being too polite. I am deeply sceptical of outsourcing but I'm trying to keep an open and balanced mind.

I want to make sure I’m not letting personal biases cloud my judgment. Should I press harder on the in-house approach, or is it wiser to let the CEO go with the cheaper outsourcing option as a stopgap?

Would love to hear how others have navigated similar situations and what advice you’d offer in my position.

TL;DR:

Inherited a revenue-generating app in poor technical shape, tasked with stabilising it for 10x growth. Fractional CTO advises outsourcing to agencies for infrastructure, PHP dev, and support due to low cost, while I recommend building an in-house team or using on-shore contractors for flexibility and ownership. Concerned about communication barriers, lack of product/QA functions, and potential coordination chaos with multiple agencies. Seeking advice on whether to press harder for in-house solutions or roll with outsourcing as a short-term stopgap.

4 Comments
2025/01/15
10:28 UTC

0

How good is Conde nast in terms of product and WLB

Hi experience folks,

I am here to check how many of you aware about conde nast.

I need to know how good their product and their culture.

2 Comments
2025/01/15
10:12 UTC

1

More existential dread of a computer programmer

It’s pretty late at night and I want to complain. Not sure if this is the right subreddit but this place always seems like the best place to post negative stuff (LOL).

Oh boy, I feel pretty old now that I am no longer in my 20s. I definitely remember starting out in my career feeling excited to go to work and hang out with co-workers. We used to go out to eat after work with co-workers. Boss had low expectations of me (low salary) so I always had an easy work week.

Not really sure where the years went. Felt like the pandemic years just flew so fast. Most nights it’s hard to get a good night sleep. I work at home 3 times a week out of the 5 work days. I dread attending stand up most days. Then the work week is filled with endless work to get to a goal that senior engineering leadership vaguely defines. After which I juggle many Slack notifications and interaction with engineers and other stakeholders. I empathize, honestly, no complains from me. Everyone has different personalities and goals. I’ve noticed there are some lazy engineers that want to do the bare minimum, toxic individuals that want to make you look bad in front of others, one who wants to take all the credits, or less intelligent folks that insist on doing their way (sub-optimal). As a result, since being a programmer is a team sport, I am force to juggle interacting with different personality types and ensuring I meet my manager’s goal.

Work for most days has been a strict 9 to 5 with some days I should probably extend my work day to meet my goals. My manager will let me know he is unhappy because he will Slack me past 5 PM, 7 PM, and 9 PM complain about something or asking me a random question. The two work days I am expected to work in the office. Traffic sucks. I see my co-workers and I am not happy to see them or interact with them. I have seen the under belly of the corporate world and I frankly believe many people who work in tech are psychopath and narcissistic. The work days end and more stuck in traffic.

Promotion not in sight. Probably all a good sign I should start job hunting (LOL).

Not really sure what I am working for. Buying a nice home is probably out of reach and buying an okay home is probably a waste of my money.

No major complains from me. I am able to live comfortably and have time over the weekends for my hobby. I did get random jobs during college and was able to see the real world. There’s way more BS others are facing than me. A bit of me miss being a stupid high schooler. The adult world sucks.

13 Comments
2025/01/15
10:05 UTC

24

The way you treat yourself is important.

I've been in the game for over 11 years now, yet I still find myself occasionally plagued with anxiety-inducing imposter syndrome. The other evening, l was preparing for a progress report with my boss and having a particularly hairy barrage of anxious thoughts. I caught myself and wrote down this note:

Just refer to your dev log (a daily journal I keep to track my efforts). You've been working awful hard and have a lot to show for it. Be proud of what you have accomplished.

This immediately helped me calm down, and sure enough, my meeting the following morning went extremely well. Wanted to share this in the event it's helpful to anyone else who may feel overwhelmed by the pressure that being in a higher-level development role can bring.

5 Comments
2025/01/15
08:55 UTC

4

10 Years of Experience in Backend Development without a degree

I have 7 years of experience in Backend Development in PHP, Laravel, CI and Symfony, I switched as an Salesforce Developer 1 year ago but now I need to switch but unable to find job now due salesforce job market, what should I do? Should i go back to Backend or stick to salesforce?

14 Comments
2025/01/15
07:38 UTC

5

Speeding up testing

When I work on a feature I find I can often spend 2 or 3x the time writing tests as I did writing the actual feature, by the time I write unit tests, integration tests, and maybe an e2e test. Frontend tests with react testing library are the absolute worst for me. Does anyone have tips for speeding this process up? What do you do and what's your time ratio like?

12 Comments
2025/01/15
06:13 UTC

0

Why is there still a pay gap for equally talented developers globally?

Software developers should be hired based on their skills, not their location.

For example, a talented developer in the EU, India or Asia should be paid the same as a developer in the United States.

discuss?

IMHO, it's a difficult problem, and nobody really wants to solve it for many reasons, such as political reasons, a lack of resources, capitalism, etc.

It’s true. But I see many good companies don’t differentiate and are paying equally globally.

20 Comments
2025/01/15
06:07 UTC

0

Adding Interviewer to LinkedIn

Quick question, I’m not tech (at least on a traditional sense). Had an interview for an advanced Google position, didn’t get it. In my previous field, I always have the contact info of interviewers (but honestly I’ve only done like a couple interviews in my entire life). So don’t know the culture that well. But in my original field, it’s normal to email the interviewer to say thank you (but optional - nobody really cares). But wondering if I should add my interviewer on LinkedIn and thank him? It’s been a few weeks though. I just thought of this today. I don’t have his contact info.

I already thanked my recruiter many times.

Don’t wanna do anything cringe. Honestly my gut feeling is trying to connect to an interviewer (since it was all done at arms length through the recruiter) is weird. But not sure if I’m missing a tech culture piece?

7 Comments
2025/01/15
05:32 UTC

237

How hard do you really work during the day?

From 1 to 10, with 1 being mouse jiggling and 10 being "I just dropped a prod db and I need to get it back up before the client finds out", where abouts are you on a usual day, when not in crunch mode?

I'd say I'm at about a 4. I set that pace on purpose, because I don't want to burn myself out. I've had jobs where I had to be at a constant 9 and it was not maintainable.

The reason I ask is that I'm considering moving jobs, and I'm worried that a new place might push me to work at burnout pace again. So I'm trying to see how hard most places push people.

136 Comments
2025/01/15
04:53 UTC

36

What are the standards that people always tell you to comply but actually different in reality?

Maybe something about security, or coding guidelines, or workplace dynamics.

72 Comments
2025/01/15
02:41 UTC

24

How to deal with a coworker who only approves PRs after I do?

In our current PR process, we require a CO approval and one additional approval. Half of my team is in the US, and the other half is in the UK. When the UK team is off the clock and unable to review PRs, we handle them on the US side.

I’m not a CO, and neither is my other US coworker. Over the past six months, I’ve noticed that he only approves PRs after I’ve reviewed them. Sometimes, I don’t understand why he even approves them since he’s not a CO either. If I’ve already approved, that only leaves the CO to give final approval.

It’s becoming frustrating because he only reviews small PRs and approves them before me, but for anything over 200 lines of code, he waits for me to review it first.

What’s a good way to address this? My manager often asks me to take a look at outstanding PRs, so it feels like I’m being relied on more heavily for this work.

50 Comments
2025/01/15
02:04 UTC

0

Big company, big project, unclear and changing rules

Big rant, if you have some advices I'll take them.

I'm working as Frontend engineer. The project is okay interesting, with a big code base which is about 70% legacy, but still in active development in some areas.

I have 10yoe with experience in several aspects of the dev/tech jobs, mainly in startups. My job until now have been to ship fast, put teams together that ships fast, manage teams that ships fast, manage budgets to ship fast... Etc, you get it. Always in web dev, fullstack with large datasets to handle. When changing to my current job, the idea was to get back to an actual engineering job, even if it meant taking a drop in salary.

The issue I have with my current job, is that I'm still considered intermediate level after 3 years. This is because I am producing too much code smells, and my PRs tends to take quite a lot of back and forth to be approved. I kinda get that, code quality expected when shipping fast is not the same.

However, as I told you, the code is quite fragmented. 3 different frameworks in the same code base with js and TS, different coding styles depending on the age of the code, sometime we have even 6 different ways available to do the same thing. Because there is no written standard or tool to define/enforce them (outside of linters), it's quite difficult to follow. When working on an old code, I tend to follow the coding style of the feature I'm updating. But what's expected is to mix current ways with old ones, without refactoring (too time consuming). We have to guess what's the right "new way", as there is several as well.

One engineer in particular LOVES to implement new libs and tools, and the code moves really often. ie: he introduced a new lib to fetch data, we went from "function based fetch or axios or API classes, with or without VueX state management" (that can sometimes be used as is or composed with each other's, with or without functions to compose them together) to Tanstack Query. Tanstack is used only on new things and it's a nice addition, but in 6 months, the way to use Tanstack changed 4 times. With no warning or communication, refactors are done silently, introducing breaking changes everytime. And not everything is reactored. Atm, we have 3 ways to use it, but picking the right one is important. Details are provided in PRs tho, or not, depending on whatever.

When reviewing PRs, sometimes the reviewer changes his mind and the same stuff needs to be refactored several times to achieve different styles. I also have the case where someone approves my PR only for someone else to RFC while the PR is in QA. It happens mainly on my PRs, but also on other ppl PRs.

I made quite a lot of proposals to avoid those situations, by promoting communication frameworks, tools or the creation of guidelines. It always has been declined as not following the team's culture. Which is undefined btw. I had no mentoring when joining, and no real project to work on for several months. I had to refactor quite a lot of old code tho, with no guidelines of what was expected or references to look at. It was full remote, so I was basically trying to figure things out, team mates taking 1 to 2 days to answer questions. Usually with vague answers.

Now I'm used to it, the code I produce is mostly good, even if my past habits are strong af.

Any idea of how I could follow up to those moving standards without reading 10 PRs a day? It's a big team, so we produce around 40 PRs a day, but only a few are affecting my work. Any idea of what to promote to actually fix those "issues", either in my own practice, or to improve the team culture?

2 Comments
2025/01/15
01:04 UTC

56

Advice needed 6YOE Sacrificed Personal Development to hit deadlines only to be tossed aside like a rag

Like the title says, I was with an org up until very recently. Spent almost 2 and half years there, no raise. When I started, it was at first an early stage startup where we "wore a lot of hats" and had do a lot of things quick and dirty to land clients. For the first year and a half or so, things were fine. And then leadership changed, we got a new head of Engineering. During my 1-on-1s with him, I'm told different things, I make the necessary adjustments only to be told something else the next time. In retrospect, I should have trusted my gut and took to looking for a job post-haste, but I tried to tough it out. Fast-forward to early Q1, right after coming back from a week of PTO I'm told I'm a "good engineer" and then summarily canned. Moving on to the job search, I suspect my abilities don't match what is expected of a 6YOE Frontend Developer given the current job market. The advice I'm asking for is two-fold.

  1. Given my circumstances, does my self-assessment feel accurate?

  2. I'm split between going for a mid-level fullstack somewhere in lieu of competing for a position where I supposedly have the commiserate experience. TBH this firing has shaken me to the core of my confidence.

10 Comments
2025/01/14
23:30 UTC

1

Transitions from product to service

Hey ExperiencedDevs! I'm considering a move from a product-based company (where I've been on a single, long-term project) to a service-based company (where projects can be short and deadlines tight). If you’ve made a similar switch:

  • How did you handle going from a long-term product focus to juggling multiple short-term assignments?
  • What was the overall experience like?
  • What challenges did you face?
  • Any tips or insights you can share?

Thanks in advance!

2 Comments
2025/01/14
23:15 UTC

0

What do you look for in a recruitment pairing exercise?

As per title. Presuming that at least one of the interviewers is an Experienced Dev, what are your red and green flags in a pairing exercise with a candidate to join your org?

5 Comments
2025/01/14
23:09 UTC

4

Viable to have a job or consultancy based around helping companies take a product they acquired or was developed by a different group and integrate it better into the organization?

I'm wondering if this would be a viable career path. I'm a senior dev with ~12 years experience. 3 or 4 of those years was at a mature software company with a decent tech org. We had a great dev ops group, solid developer tools, good git practices, a mature CI/CD pipeline, did pretty by-the-book agile (say what you will about agile but it seemed to work well for us), and other stuff that really facilitated developer efficiency.

This allowed for devs to come up and face minimal friction for ramping up to making their first code change and seeing it all the way to production.

Since then I've been at a couple other organizations who very clearly did not have any of this. Most recently I joined a team working on a product that had been acquired by my employer and this product was developed entirely by a team in Asia. Those devs in Asia still pretty much own the product but my employer is working in more FTE, US-based devs onto the teams, I'm one of them.

I'm realizing all these things that are missing. For example, deployment is owned by a small subset of more senior engineers (only two or three people spread across a large dev org), QA is entirely manual, most devs have zero access to logs in hosted environments (staging and prod), and various other things like this. (think documentation, git practices, code review, etc)

I think I have a pretty good sense for what could be improved because of my background being on these more mature engineering organizations in the past. I'm also a certified SCRUM master so I can also help with the process of introducing agile practices if that is something the org wants to do.

I'm wondering if I could turn this into some sort of consultancy. Basically a company that acquired a product or built a product using scrappy devs that churned out something fast and drity and wants to integrate it more with the organization to facilitate growth. Basically bring it up to organization-level standards and not just a project that 3 guys worked on in their garage.

Now I don't really have experience actually implementing the things I would be suggesting so I would be more of a person to come in, maybe embed myself with a dev team, point out these areas of improvement and help the company get the product and tech stack to a place where it can more easily scale and onboard new devs.

Can this be a whole job or consultant gig on its own or am I just describing the role of an experienced engineer who is doing all these things plus contributing to actual development of the product?

7 Comments
2025/01/14
21:40 UTC

0

At what point do we break the unwritten rule of development and rag on somebody else’s code

I know we’ve all been there. We’ve developed a lot of poor quality code that we’re not happy with at all. We all know that the jumpy process of ticket development and out of the blue “urgent” feature requests all leads to significant technical debt. I (6YOE) look at some of the code I wrote even a year ago and I cringe so I always try my best to put myself in the shoes of other developers and usually think it was probably some external factors that resulted in the code becoming difficult to read/maintain but I was asked to look over a codebase the last few days at work and it’s honestly shocking. It is what should be a somewhat simple React app but it is completely unnecessarily using very confusing Redux code while also using standard React Context frequently. It uses state to manage all state half the time and the url to manage it the other half, perhaps this was in the middle of migration to go with the url but there are no comments whatsoever to indicate that. The prop drilling is absolutely insane even though it has a complete overuse of context.

Has anyone else run into an issue like this and what steps did you take to address it, if you became responsible for it?

35 Comments
2025/01/14
20:50 UTC

18

Tips for dealing with a large-ish set of repos & code

So I've got about 50 or so repos with a total of ~15 Mloc in them. Maybe 1 Mloc or so under active development (or within the influence sphere of the active development work). My responsibility being defining and looking after adherence to coding & quality standards, DevSecOps processes and general application level security, as well as application architecture.

Any tips on what tools y'all use to keep an eye on such a set of code & code changes?

Naturally we've got the basic toolset (SonarQube, SCA, SAST & DAST from GitLab & DynaTrace, unified deployment pipelines & base images, etc.) up & running and I've compiled a set of scripts to keep an eye on things like change velocity, commit size distribution, commit author distribution, etc. in each repo. Are there any other things I should be looking at or what other tools to use in order to stay on top of how development work is going on the code level in the organisation?

2 Comments
2025/01/14
19:22 UTC

12

How was it going back to work after a ~12 week parental leave?

I feel like I know nothing lol. Will it just magically reappear in my head after a week or two? I'm so not looking forward to all the fake daily banter and RTO

Ugh

25 Comments
2025/01/14
18:37 UTC

0

SF compensation question

I may be invited to join pre-seed start up in SF. There is half a dozen of how. I have 10 years experience and have mainly been a front end IC with some lead experience

What sort of compensation range is reasonable to ask for? Outside of SF I making 150k as a dev for IC.

16 Comments
2025/01/14
17:38 UTC

1

Commercial Licensing and Support for my Open Source project

I have an open source library ( MIT license) that a company may soon be asking me about licensing commercially and probably support options.

Aside from a base price, what kind of terms should I ask for and what kind of gotcha things should I watch out for?

An additional complication is that I'm currently an employee of this company.

I'm also interested in referrals to legal experts in this area.

8 Comments
2025/01/14
17:25 UTC

14

Best Places for Remote Devs to Network?


Hey guys,

Where do remote web developers network with others from remote companies(preferably through online events)?

I’ve checked online events from Meetupdotcom, but are there better platforms or events for connecting with like-minded devs?

Thanks!

13 Comments
2025/01/14
17:00 UTC

12

How do you balance earning and learning when the job prioritizes a non-technical focus?

I'm at a start up where I'm learning a lot of non-engineering skills. People, business, about myself and how to operate a little better, etc. All the soft skills. It's engaging but not my favorite. Comp is also good and that's the bigger upside.

I'm not bettering my technical skills. In previous roles I spent most of my time coding or solving technical problems. My current role is solving a lot of business-side problems. Sometimes with code.

I get that this is common at start ups.

My question is, how do you approach learning when your job takes you away from technical work?

Do you just lean into making it a chapter of non-technical learning? Do you do classes or self-learning outside of work? I would rather not do the latter. Do you alternate priorities when you switch jobs?

Thanks

7 Comments
2025/01/14
16:16 UTC

0

Insights on Comparing AI Code Generators

I made a small comparison between AI code generators to see how a rather objective test aligns with my personal assumptions and I thought to share my results with you because this topic seems like lava here.

Contestants

  • ChatGPT
  • JetBrains AI Pro (abbreviated as JBAI)
  • GitHub Copilot (abbreviated as Copilot)

Preface

For the sake of time constraint, they had one shot with the same input.
GPT got two chances because I forgot that I've been using o4-mini with my custom preferences at first, so I added another run and kept the original as well. Not much difference, though.

Bear in mind that this test is quite a limited one with a single request, but it seems to have aligned very much with how I felt throughout my experience with all 3 tools used in the last couple of months.

Since I suppose that not everyone is interested in the details (at first), I will first provide my conclusion, then list my points of evaluation and finally add the explicit Request and Result content.

For Context, I asked it to help me extract a component from a razor page in dotnet with some sprinkles. No rocket science, but a task most of my previous medium-sized C# teams would easily estimate to 2 hours without any further actions like testing.

Note that I've been using JetBrains IDE for Copilot as well to provide an equivalent environment.

My Conclusion is, of course, highly subjective, however, I was surprised to see how clearly different in communication style the three tools are from each other.

Overall

  • Copilot is the most simplistic and code-focused
  • ChatGPT is great for a more "scientific" feeling
    • with context and explanations, which are mostly irrelevant
  • JetBrains AI Pro seems to lag behind
    • and use a more parental tone

I think these tools should be our assistants and thus "replace junior capabilities" and not act like the know-it-all senior whom we help to achieve what it wants. JetBrains AI seems to aim for the latter.

Based on my personal experience and this quick test run, I think Copilot fits the "assistant" feeling the most, where it does exactly what is asked without superfluous commentary or laziness. It is the true Santa's little elf.

In comparison, ChatGPT proves to be the jack-of-all-trades with its quick and precise answers, but it feels more prone to hallucinate methods that would be great if they existed, except they don't. I think it is better suited for quick researches and conversational processes than immediate code generation.

Last but … well, last and least, JetBrains AI leaves no mark to desire replacing any other AI Tool at the moment when it comes to pure code generation.
Outside the test run, I managed to get JBAI to produce an actual diff commit for suggesting a code change. So, it may have some surprises once they get it working as dreamed, but Copilot's superior inline code-generations still easily beat the familiarity of the IDE API of the AI from JetBrains.
My main problem with JBAI is that it acts as a senior know-it-all, leaving out "easy" code parts and suggesting you to do the sweaty work unless requested.
For now, I would not consider JBAI even if someone already had a JetBrains account as Copilot provides a much neater licensing for similar pricing (you cannot use a business JetBrains AI license with a private JetBrains IDE license, while Copilot is totally cross-functional in that sense).

Evaluated aspects

  • prerequisites
    • ChatGPT is the only one that had no access to the source code
    • JBAI and Copilot had complete access
  • usings
    • ChatGPT added extra ComponentBase inheritance or MudBlazor using
    • JBAI and Copilot both refrained from irrelevant usings
  • localizer
    • ChatGPT successfully ignored GlobalLocalizer import
      • both other generators, albeit accessing all source code, tried to import it
    • Copilot successfully added GlobalLocalizer as an injection
    • JBAI does not recognize that it should be a `StringLocalizer`, uses a Dictionary
  • showing the inner error component
    • JBAI did not understand that we should decide HasError-based showing of the inner component outside the inner component
      • passed a solid true
    • ChatGPT also passed a HasError, but ended up still handling outside only (as should)
      • in exchange, once ChatGPT passed collapsible boolean instead to control default collapsed state
    • Copilot kept request to a minimum without unnecessary parameters
  • collapsible
    • JBAI completely ignored the additional request
    • Copilot could not sufficiently add the toggle logic at first
      • asking for a fix resulted in even adding
    • ChatGPT o4 hallucinated bind-IsOpen to avoid having to generate a property and handle IsOpen logic
  • original content
    • JBAI is the only one that did not provide complete content for the class to update
      • added 2 comments
    • both ChatGPT and Copilot provided a complete solution
  • structure
    • Copilot has the best template as "list of steps" first then steps
      • the least amount of extra text aside code
    • ChatGPT is fond of providing a summary regardless of custom preferences
      • it is easy to ignore and is otherwise useful and compact
    • JBAI appends additional useless guidance
      • "Please create a new Razor component with the content provided and update your current component accordingly. Don't forget to adjust the namespaces and injected dependencies if they're different in your application."
  • phrasing
    • JBAI
      • produces longer, more textual context
      • uses a rather "how it could be" style of phrasing
    • Copilot
      • keeps text to a minimum
    • ChatGPT
      • less textual than JBAI
      • more guidance and step-by-step style than Copilot
  • abuse
    • Nethier ChatGPT nor Copilot cares about cursing or abusive phrasing towards itself
    • JBAI goes complete bogus and returns "Cannot generate response for such query" for a caps-locked m*th****ck*r at the end of an otherwise innocent request

Request

Given the complete razor class below, I want to extract the MudCard as "GeneralErrorContent" into a separate .razor.
We need to pass the action of DoRecover into it and the collapsible rework applied to the StackTrace as well:
@using AE.Common.Domain.Exceptions
@using AE.Common.Domain.Extensions
@inherits ErrorBoundaryBase
@inject ILogger<GeneralErrorBoundary> ExceptionLogger;
@inject ILogger<LicenseException> LicenseLogger;

@if (HasUnhandledError)
{
    <MudCard>
        <MudCardContent Class="mud-elevation-3">
            <MudText Typo="Typo.h5" Color="Color.Error">
                👹 @GlobalLocalizer["UnexpectedError"]
            </MudText>
            <MudText Typo="Typo.body1">
                @CurrentException?.Message
            </MudText>
            <MudText Typo="Typo.body1" Color="Color.Info">
                🙈 @GlobalLocalizer["StackTrace"]
            </MudText>
            <MudText Typo="Typo.body2">
                @CurrentException?.StackTrace
            </MudText>
        </MudCardContent>
        <MudCardActions>
            <MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@DoRecover">
                @GlobalLocalizer["Recover"]
            </MudButton>
        </MudCardActions>
    </MudCard>
}

@ChildContent

@code {
    private bool HasUnhandledError { get; set; }

    protected override Task OnErrorAsync(Exception exception)
    {
        ExceptionLogger.LogTrace(exception, "An error occurred.");

        switch (exception)
        {
            case LicenseException le:
                Snackbar.Add(le.Message, Severity.Error);
                LicenseLogger.LogError(le, "License error occurred. Snack bar message added.");
                break;
            case AEException ae:
                Snackbar.Add($"[{ae.GetLocalizedKey(GlobalLocalizer)}] {ae.Message}", Severity.Warning);
                ExceptionLogger.LogWarning(ae, "AE error occurred. Snack bar message added.");
                break;
            default:
                HasUnhandledError = true;
                break;
        }

        return Task.CompletedTask;
    }

    private void DoRecover()
    {
        ExceptionLogger.LogTrace(CurrentException, "Error state cleared, recovery in progress.");
        HasUnhandledError = false;
        Recover();
    }

}

Responses

ChatGPT 4o-mini with custom preferences

  • To refactor the MudCard into a separate GeneralErrorContent component and pass the necessary action (DoRecover) as well as the collapsible StackTrace, follow these steps:
    1. Create the GeneralErrorContent.razor Component
    • Create a new Razor component named GeneralErrorContent.razor with the following content. This component will handle the error display, including the MudCard, the collapsible StackTrace, and the DoRecover action.

@using AE.Common.Domain.Exceptions
@using AE.Common.Domain.Extensions
@inherits ComponentBase

@parameter bool HasError { get; set; }
@parameter Exception CurrentException { get; set; }
@parameter EventCallback DoRecover { get; set; }

<MudCard>
    <MudCardContent Class="mud-elevation-3">
        <MudText Typo="Typo.h5" Color="Color.Error">
            👹 @GlobalLocalizer["UnexpectedError"]
        </MudText>
        <MudText Typo="Typo.body1">
            @CurrentException?.Message
        </MudText>
        <MudText Typo="Typo.body1" Color="Color.Info" @onclick="ToggleStackTrace">
            🙈 @GlobalLocalizer["StackTrace"]
        </MudText>

        <MudCollapse IsOpen="isStackTraceVisible">
            <MudText Typo="Typo.body2">
                @CurrentException?.StackTrace
            </MudText>
        </MudCollapse>
    </MudCardContent>

    <MudCardActions>
        <MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="DoRecover.InvokeAsync">
            @GlobalLocalizer["Recover"]
        </MudButton>
    </MudCardActions>
</MudCard>

@code {
    private bool isStackTraceVisible = false;

    private void ToggleStackTrace()
    {
        isStackTraceVisible = !isStackTraceVisible;
    }
}
    1. Update the GeneralErrorBoundary Component
    • Now, in the original GeneralErrorBoundary component (or wherever you're using this MudCard), replace the MudCard code with the new GeneralErrorContent component. You'll pass the necessary parameters (HasUnhandledError, CurrentException, and DoRecover) to this new component.

@using AE.Common.Domain.Exceptions
@using AE.Common.Domain.Extensions
@inherits ErrorBoundaryBase
@inject ILogger<GeneralErrorBoundary> ExceptionLogger;
@inject ILogger<LicenseException> LicenseLogger;

@if (HasUnhandledError)
{
    <GeneralErrorContent 
        HasError="true"
        CurrentException="@CurrentException"
        DoRecover="DoRecover" />
}

@ChildContent

@code {
    private bool HasUnhandledError { get; set; }

// METHODS PROVIDED UNCHANGED
//    protected override Task OnErrorAsync(Exception exception)
//    private void DoRecover()
}
  • Key Changes:
    • GeneralErrorContent.razor:
      • This component takes three parameters:
      • The StackTrace is collapsible using the MudCollapse component, controlled by the isStackTraceVisible boolean.
    • GeneralErrorBoundary.razor:
      • The GeneralErrorContent component is used in place of the MudCard from the original code.
      • The required parameters (HasError, CurrentException, and DoRecover) are passed to the GeneralErrorContent component.
  • Benefits:
    • Separation of Concerns: By moving the error display logic to its own component, the GeneralErrorBoundary component remains clean and focused on managing the error state.
    • Reusability: The GeneralErrorContent component can now be reused across different parts of the application.
    • Collapsible Stack Trace: The stack trace is now collapsible, improving the UI's visual appeal and reducing clutter.
    • This way, you've refactored the error handling UI into a reusable component and kept your GeneralErrorBoundary component focused on its core responsibility.

ChatGPT 4o default

  • To extract the MudCard into a separate GeneralErrorContent.razor component, you will need to move the MudCard markup and related logic to the new component. Then, you will pass the DoRecover action and the StackTrace collapsibility as parameters to this new component.
  • Here’s how you can achieve this:
    • Step 1: Create a new GeneralErrorContent.razor component
      • Create a new Razor component file, GeneralErrorContent.razor, and extract the MudCard from the original component.

@using AE.Common.Domain.Exceptions
@using MudBlazor

<MudCard>
    <MudCardContent Class="mud-elevation-3">
        <MudText Typo="Typo.h5" Color="Color.Error">
            👹 @GlobalLocalizer["UnexpectedError"]
        </MudText>
        <MudText Typo="Typo.body1">
            @Message
        </MudText>

        <MudText Typo="Typo.body1" Color="Color.Info">
            🙈 @GlobalLocalizer["StackTrace"]
        </MudText>

        <MudCollapse @bind-IsOpen="IsStackTraceCollapsed">
            <MudText Typo="Typo.body2">
                @StackTrace
            </MudText>
        </MudCollapse>
    </MudCardContent>
    <MudCardActions>
        <MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="OnRecoverClick">
            @GlobalLocalizer["Recover"]
        </MudButton>
    </MudCardActions>
</MudCard>

@code {
    [Parameter] public string Message { get; set; }
    [Parameter] public string StackTrace { get; set; }
    [Parameter] public EventCallback OnRecover { get; set; }
    [Parameter] public bool IsStackTraceCollapsed { get; set; }

    private bool IsStackTraceCollapsed { get; set; }

    protected override void OnInitialized()
    {
        IsStackTraceCollapsed = true; // Default stack trace collapse state.
    }
}
  • Step 2: Update the original Razor component to use GeneralErrorContent

@using AE.Common.Domain.Exceptions
@using AE.Common.Domain.Extensions
@inherits ErrorBoundaryBase
@inject ILogger<GeneralErrorBoundary> ExceptionLogger;
@inject ILogger<LicenseException> LicenseLogger;

@if (HasUnhandledError)
{
    <GeneralErrorContent 
        Message="@CurrentException?.Message"
        StackTrace="@CurrentException?.StackTrace"
        OnRecover="@DoRecover"
        IsStackTraceCollapsed="true" />
}

@ChildContent

@code {
    private bool HasUnhandledError { get; set; }

// METHODS PROVIDED UNCHANGED
//    protected override Task OnErrorAsync(Exception exception)
//    private void DoRecover()
}
  • Key Changes:
    • GeneralErrorContent Component:
    • Original Razor Component:
  • Step 3: Adjust the StackTrace Collapsibility (Optional)
    • If you want to make the StackTrace collapsible with the MudCollapse component, it’s already handled in the GeneralErrorContent.razor file. The collapsibility is controlled via the IsStackTraceCollapsed parameter.
    • You can expand this functionality further if needed, like adding a toggle button to control the collapse state, but for now, this should fulfill your initial request.

JetBrains AI Pro

  • ## AI Assistant
  • To separate the "MudCard" into a separate Razor component called "GeneralErrorContent", we would need to create a new file called "GeneralErrorContent.razor". Now, you should move the HTML portion under the u/if (HasUnhandledError) condition from your current file to this new component file. In addition, we have to pass the "DoRecover()" method and the "CurrentException" variable from the parent to the child component.
  • Here is what the "GeneralErrorContent.razor" component could look like:

// GeneralErrorContent.razor

@using AE.Common.Domain.Exceptions
@using AE.Common.Domain.Extensions
@parameter Action DoRecover { get; set; }
@parameter Exception CurrentException { get; set; }
@parameter bool HasUnhandledError { get; set; }
@parameter Dictionary<string, string> GlobalLocalizer { get; set; }

@if (HasUnhandledError)
{
    <MudCard>
        <MudCardContent Class="mud-elevation-3">
            <MudText Typo="Typo.h5" Color="Color.Error">
                👹 @GlobalLocalizer["UnexpectedError"]
            </MudText>
            <MudText Typo="Typo.body1">
                @CurrentException?.Message
            </MudText>
            <MudText Typo="Typo.body1" Color="Color.Info">
                🙈 @GlobalLocalizer["StackTrace"]
            </MudText>
            <MudText Typo="Typo.body2">
                @CurrentException?.StackTrace
            </MudText>
        </MudCardContent>
        <MudCardActions>
            <MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@DoRecover">
                @GlobalLocalizer["Recover"]
            </MudButton>
        </MudCardActions>
    </MudCard>
}
  • Then, within your existing "ErrorBoundary" component, you can utilize this child component like this:

// ErrorBoundaryBase.razor

@using AE.Common.Domain.Exceptions
@using AE.Common.Domain.Extensions
@inherits ErrorBoundaryBase
@inject ILogger<GeneralErrorBoundary> ExceptionLogger;
@inject ILogger<LicenseException> LicenseLogger;
<GeneralErrorContent 
    HasUnhandledError="HasUnhandledError" 
    DoRecover="DoRecover" 
    CurrentException="CurrentException" 
    GlobalLocalizer="GlobalLocalizer" />

// And the remaining original content goes here
@ChildContent

@code {
    // Existing @code block
}
  • Please create a new Razor component with the content provided and update your current component accordingly. Don't forget to adjust the namespaces and injected dependencies if they're different in your application.

GitHub Copilot

  • To extract the MudCard content into a separate .razor component named GeneralErrorContent.razor and pass the DoRecover action to it, follow these steps:
    • Create a new Razor component file named GeneralErrorContent.razor.
    • Move the MudCard content into this new component.
    • Pass the DoRecover action as a parameter to the new component.
    • Update the original GeneralErrorBoundary.razor to use the new component.
  • Here is the implementation:
    • GeneralErrorContent.razor:

@using AE.Common.Domain.Exceptions
@using AE.Common.Domain.Extensions
@inject IStringLocalizer<Global> GlobalLocalizer

<MudCard>
    <MudCardContent Class="mud-elevation-3">
        <MudText Typo="Typo.h5" Color="Color.Error">
            👹 @GlobalLocalizer["UnexpectedError"]
        </MudText>
        <MudText Typo="Typo.body1">
            @CurrentException?.Message
        </MudText>
        <MudText Typo="Typo.body1" Color="Color.Info">
            🙈 @GlobalLocalizer["StackTrace"]
        </MudText>
        <MudCollapse>
            <MudText Typo="Typo.body2">
                @CurrentException?.StackTrace
            </MudText>
        </MudCollapse>
    </MudCardContent>
    <MudCardActions>
        <MudButton Variant="Variant.Filled" Color="Color.Primary" OnClick="@DoRecover">
            @GlobalLocalizer["Recover"]
        </MudButton>
    </MudCardActions>
</MudCard>

@code {
    [Parameter] public Exception? CurrentException { get; set; }
    [Parameter] public EventCallback DoRecover { get; set; }
}
  • Update GeneralErrorBoundary.razor

@using AE.Common.Domain.Exceptions
@using AE.Common.Domain.Extensions
@inherits ErrorBoundaryBase
@inject ILogger<GeneralErrorBoundary> ExceptionLogger;
@inject ILogger<LicenseException> LicenseLogger;

@if (HasUnhandledError)
{
    <GeneralErrorContent CurrentException="CurrentException" DoRecover="DoRecover" />
}

@ChildContent

@code {
    private bool HasUnhandledError { get; set; }

// METHODS PROVIDED UNCHANGED
//    protected override Task OnErrorAsync(Exception exception)
//    private void DoRecover()
}
  • This separates the MudCard content into a new component and passes the necessary parameters and actions to it.
6 Comments
2025/01/14
14:46 UTC

239

How to handle a junior who does whatever they want?

New junior joined and was always offered help consistently. Chase him down often to see if he has any questions or need help. However this junior does whatever he wants. Goes missing sometimes, not very responsive, only does half the ticket and leaves it hanging sometimes. He tends to just push a PR without checking whether his code works so there are many reviews for the same ticket and even when you provide the solution for any errors found in his code review, he only changes whatever he feels like. When you point out issues he gets defensive. I am burnt out from cleaning up his mess. What to do, i plan to tell the manager he might not be a good fit for this role with his current skill set and work habits. Is this too much?

The other devs on the team agreed with me that this junior is an issue.

195 Comments
2025/01/14
14:33 UTC

8

What to do at a smaller company with no assistance at work?

I’m current an embedded software engineer. Having mainly hardware experience but finally broke into the C++ and Linux realm like I wanted. I got into this job during a merger and was honestly about my skill level where I wanted to break into the field and wanting to learn.

A year or so later, the treatment I get here is rough. Most people here are at retirement age and would not assist me when it comes to help on work. This causes me to look bad but I’m doing my best to pull through. Been thrown under the bus and manager is never on my side. I like the field and what I do but the constant insults and lack of support is killing me. I’ve grown to have thicker skin but just dealing with the constant insults and when defending myself they would just talk over me. My question is, what do I do if there is no support in a smaller company?

12 Comments
2025/01/14
13:09 UTC

25

What should I do in the first few months as a Staff Engineer

As I join a new company as a Staff Engineer— a role I've never held before—what should I prioritize during my first few months? What should I focus on in terms of technical leadership, team dynamics, product ownership, and any new responsibilities that may arise from stepping into a more senior role?

Additionally, what non-technical skills should I be aware of in this role?

35 Comments
2025/01/14
12:10 UTC

Back To Top