Context: Searching for a new senior level software development job over a 9 week period in summer 2025.

  • Focused mostly on data engineering and backend roles that are in-person or hybrid in the SF Bay Area.
  • Leads from recruiters on LinkedIn were much more likely to lead to interviews+offers.
  • The winning offer came through my personal network.
  • I mostly used Hiring.cafe for prospecting. They're a scraper with an interface I didn't hate.
Sankey diagram of job search

all 23 comments

sorted by: hot top controversial new old
[–] 37 points 1 year ago (1 child)

Interesting breakdown. Its a hard market.

My last Two jobs were both referrals.

  • source
  • hideshow 1 child comment
  • [–] 12 points 1 year ago

    Tell me about it. Took me 3x as many applications to land two interviews, and I wasn't even looking for a specific field. My only requirement was $20/hr or more, the bare minimum needed to survive.

    Finally settled on a $19/hr job after a six month struggle. I can't afford groceries but at least I won't go homeless.

  • source
  • parent
  • [+] 29 points 1 year ago (4 children)
  • [–] 13 points 1 year ago (3 children)

    We get 100s of automated applications per day for a position we recently opened. 99% are automated and no where near meeting the requirements. We try to give everyone a review and a reply but it is a massive task, unfortunately. We do not have dedicated personel to handle these matters so it costs engineering time. The current situation for online software dev job application sucks for everyone.

    I guess what I am trying to say is: If you don't get a reply to an application it is likely because you are drowning in noise and someone at the other end is struggling to keep up.

  • source
  • parent
  • hideshow 3 child comments
  • [–] 2 points 1 year ago (2 children)

    automated applications

    What are these things exactly?
    Do you mean someone has a bot to apply to stuff no matter whether they are interested in the job?
    Or even worse, that there is no real applicant on the other side?

    I have only taken technical rounds, so have no idea of what the HR experiences.

  • source
  • parent
  • hideshow 2 child comments
  • [–] 2 points 1 year ago (1 child)

    I don't know precisely how they are automated, but a pile of applications came in seconds after opening the position. I think I heard talk about online services that you can pay to do the bottling, but cannot remember the name(s). I personally know people who wrote their own bot to do this.

    It looks like most applications are from real people, but impossible to tell without a deep vetting honestly. Malicious people running several "fake developer accounts" (for remote work, which is all we do) collecting paychecks until fired, or simply spying, is a known problem in the industry, but not something I have experienced first hand. Yet.

  • source
  • parent
  • hideshow 1 child comment
  • [–] 0 points 1 year ago

    “fake developer accounts” (for remote work, which is all we do) collecting paycheques until fired,

    I remember reading a story on such an incident. But honestly, I thought it would be something extremely rare.
    Because, how does someone get money without providing work? And if they are giving actual work, then does it really matter if they are doing it themselves or making a bot do it? (despite it possibly requiring much greater effort to make a bot do a person's job well enough)

    On the other hand, I see it being possible in case managing party doesn't care about whether or not the work is being done, for a long enough time, but can't the fake worker be caught and dismissed before the payment period in that case?
    I mean, in my case, after working for the month, I have to submit a time-sheet and get it approved by the project manager and if they say that the work I have done doesn't justify the time I state, they can simply refrain from paying up and ask me to reduce the claimed time (and still keep the work I have given them (ok this part would be illegal if they don't pay me at all, but it's not like I can prove that they used my work)).

    spying

    This seems more viable. Industrial espionage and what-not. No idea how many sectors are competitive enough for anyone to consider this, though.

    And then comes the point of interviews. Either it would be that the person has enough domain knowledge to clear the interview, or they are somehow getting lucky and not having to clear the interview (??feels weird saying that in the comments section of a post showing how hard it is to even get to an interview).
    I feel it difficult to understand how someone would be able to get anything more than an entry level job, when they don't even care to work in the field. Some kind of master con-artist, maybe.

  • source
  • parent
  • It seems like personal networks are still, by far, the most likely way to get a job. Having an internal reference helps you bypass so many filters.

    It makes sense for employers, too, because a confirmed human that really wants the job is already better than the majority of the crap they have to sift through.

  • source
  • [–] 12 points 1 year ago

    man.... over 400 applications, something like 5 interviews, no offers, i gave up ._. entry level is fucked

  • source
  • [–] 9 points 1 year ago

    Hey, congratulations on the employment!

  • source
  • [–] 6 points 1 year ago (2 children)

    Is the SF Bay Area still the place to be? It looks kinda cursed lately.

  • source
  • hideshow 2 child comments
  • [–] 6 points 1 year ago*

    Interesting. I recently was job hunting in 2025, January to June. In US. I was looking for remote only jobs.

    My stats:

    • Number of jobs applied to: 53
    • Number of rejections: 52
    • Number of jobs that rejected me with an internal referral: 4
    • Number of offers: 1
    • Search duration: 24 weeks

    I guess I was applying to 2.2 per week. I was also mixing in studying and preparing for interviews during that time. Still slow though.

    16 applications per week. Nice! Good job!

  • source
  • [–] 2 points 1 year ago (1 child)

    It only takes 1 opportunity to change your life.

  • source
  • hideshow 1 child comment
  • [–] 4 points 1 year ago (6 children)

    I find this kind of graph a bit misleading/ambiguous. I intuitively want to follow horizontal association between in and out. For example, Recruiter at the bottom splits into three at the bottom.

    Not sure if there's a better way to do this. Disconnect in-bar and out-bar with a condensed point/circle to indicate non-conformity?

  • source
  • hideshow 6 child comments
  • [–] [S] 2 points 1 year ago (5 children)

    If you know something better I’d like to give it a spin.

  • source
  • parent
  • hideshow 5 child comments
  • [–] 2 points 1 year ago (4 children)

    The better option is to keep colors from the original input stream for the flows instead of making the flows an uniform color.

    In the input on the left you have pink, green and blue.

    Keep these colors throughout the graph.

    Except of the input, all of the other stages only ever split up and never merge, so keeping this single set of colors is enough.

    The other option would be to get rid of the "leads" stage, since it actually doesn't change any state. All the other stages are an action that happens (e.g. "Applied" changes the state of the application from being just a lead to being an open application and it also filters out data for being e.g. abandoned). But the "leads" stage means the same thing as the first stage. So drop the "leads" stage and instead make flows go from all three input stages directly into "bad lead", "abandoned" or "applied".

    Combine both to get the best result.

  • source
  • parent
  • hideshow 4 child comments
  • [–] [S] 2 points 1 year ago (3 children)

    Is there any site that does this?

  • source
  • parent
  • hideshow 3 child comments
  • [–] 1 point 1 year ago (2 children)

    Don't know if there's a ready-made site for stuff like that, but it's not hard to do.

    Here's a quick and dirty AI generated piece of trash code as a proof of concept:

    # sankey_hiring_funnel_direct.py
    # Requires: plotly
    # Install: pip install plotly
    
    import plotly.graph_objects as go
    
    # Node labels (unique)
    labels = [
        "Network",            # 0
        "Hiring.cafe",        # 1
        "Abandoned Lead",     # 2
        "Applied",            # 3
        "Rejected",           # 4
        "No Response",        # 5
        "Screener",           # 6
        "Rejected by Screen", # 7
        "Full Round",         # 8
        "Rejected by Panel",  # 9
        "Offer",              #10
        "Accepted",           #11
        "Declined"            #12
    ]
    
    # Colors for the two source groups (consistent)
    network_color = "rgba(31,119,180,0.8)"      # blue-ish
    hiring_color  = "rgba(255,127,14,0.8)"      # orange-ish
    
    sources = []
    targets = []
    values  = []
    link_colors = []
    
    def add_link(src_idx, tgt_idx, val, color):
        sources.append(src_idx)
        targets.append(tgt_idx)
        values.append(val)
        link_colors.append(color)
    
    # Direct flows from Network and Hiring.cafe into Abandoned Lead and Applied
    add_link(0, 2, 1, network_color)    # Network -> Abandoned Lead (1)
    add_link(1, 2, 58, hiring_color)    # Hiring.cafe -> Abandoned Lead (58)
    add_link(0, 3, 11, network_color)   # Network -> Applied (11)
    add_link(1, 3, 70, hiring_color)    # Hiring.cafe -> Applied (70)
    
    # Applied -> Rejected, No Response, Screener (split by original group)
    add_link(3, 4, 5, network_color)    # Applied -> Rejected (network 5)
    add_link(3, 4, 40, hiring_color)    # Applied -> Rejected (hiring 40)
    add_link(3, 5, 3, network_color)    # Applied -> No Response (network 3)
    add_link(3, 5, 15, hiring_color)    # Applied -> No Response (hiring 15)
    add_link(3, 6, 4, network_color)    # Applied -> Screener (network 4)
    add_link(3, 6, 15, hiring_color)    # Applied -> Screener (hiring 15)
    
    # Screener -> Rejected by Screen, Full Round
    add_link(6, 7, 1, network_color)    # Screener -> Rejected by Screen (network 1)
    add_link(6, 7, 5, hiring_color)     # Screener -> Rejected by Screen (hiring 5)
    add_link(6, 8, 3, network_color)    # Screener -> Full Round (network 3)
    add_link(6, 8, 10, hiring_color)    # Screener -> Full Round (hiring 10)
    
    # Full Round -> Rejected by Panel, Offer
    add_link(8, 9, 1, network_color)    # Full Round -> Rejected by Panel (network 1)
    add_link(8, 9, 7, hiring_color)     # Full Round -> Rejected by Panel (hiring 7)
    add_link(8, 10, 2, network_color)   # Full Round -> Offer (network 2)
    add_link(8, 10, 3, hiring_color)    # Full Round -> Offer (hiring 3)
    
    # Offer -> Accepted, Declined
    add_link(10, 11, 1, network_color)  # Offer -> Accepted (network 1)
    add_link(10, 12, 1, network_color)  # Offer -> Declined (network 1)
    add_link(10, 12, 3, hiring_color)   # Offer -> Declined (hiring 3)
    
    # Sanity check
    assert len(sources) == len(targets) == len(values) == len(link_colors)
    
    # Node colors (visual guidance)
    node_colors = [
        "rgba(31,119,180,0.9)",   # Network
        "rgba(255,127,14,0.9)",   # Hiring.cafe
        "rgba(220,220,220,0.9)",  # Abandoned Lead
        "rgba(200,200,200,0.9)",  # Applied
        "rgba(220,180,180,0.9)",  # Rejected
        "rgba(200,200,220,0.9)",  # No Response
        "rgba(200,220,200,0.9)",  # Screener
        "rgba(255,200,200,0.9)",  # Rejected by Screen
        "rgba(210,210,255,0.9)",  # Full Round
        "rgba(240,200,220,0.9)",  # Rejected by Panel
        "rgba(200,255,200,0.9)",  # Offer
        "rgba(140,255,140,0.9)",  # Accepted
        "rgba(255,140,140,0.9)"   # Declined
    ]
    
    fig = go.Figure(data=[go.Sankey(
        node=dict(
            pad=18,
            thickness=18,
            line=dict(color="black", width=0.5),
            label=labels,
            color=node_colors
        ),
        link=dict(
            source=sources,
            target=targets,
            value=values,
            color=link_colors,
            hovertemplate='%{source.label} → %{target.label}: %{value}<extra></extra>'
        )
    )])
    
    fig.update_layout(
        title_text="Hiring funnel Sankey — direct source flows (no Leads node)",
        font_size=12,
        height=700,
        margin=dict(l=20, r=20, t=60, b=20)
    )
    
    fig.show()
    
    # To save as interactive HTML:
    # fig.write_html("sankey_hiring_funnel_direct.html", include_plotlyjs='cdn')
    

    Couldn't be bothered to write this by hand for just an online comment. There's enough that can be improved with this, but I think it's ok to show how it can be done quite easily.

  • source
  • parent
  • hideshow 2 child comments
  • 22 comments in c/dataisbeautiful@lemmy.world view that post
    [–] 30 points 1 year ago (8 children)

    This, but 28 months and remove that blue line at the top right.

  • source
  • hideshow 8 child comments
  • [–] 21 points 1 year ago* (5 children)

    My partner with two masters and tons of experience in management has sent over 400 applications in the past year. She even learned appscript and made a smart spreadsheet to track them all. She's still unemployed.

    She just got rejected from a dentist receptionist job because they were worried they were gonna have to pay her too much

  • source
  • parent
  • hideshow 5 child comments
  • [–] 8 points 1 year ago (4 children)

    Formatting, fonts, and file format are very important. Certai. formats like PDF are harder to scrape. 2 or more colums cause the A.I. to get confused. Sometimes the scanners have trouble with fo ta with heavy kerning.

    i would suggest ms word, with the default font, and a single colum. Dont get fancy with the formatting.

    Also, there are a couple of online services that will use a.i. to score your resume. Find a service that uses the same ranking algo as the popular recruiting tools such as greenhouse and workday.

    It sucks, but your resume has to get past the a.i. screener before it ever reaches a human.

  • source
  • parent
  • hideshow 4 child comments
  • [–] 1 point 1 year ago (1 child)

    Ms word recommended really? I went through markdown resume route for simple formatting, but still went with PDF as the norm

  • source
  • parent
  • hideshow 1 child comment
  • [–] 2 points 1 year ago

    PDF is a typesetting format. Behind the scenes, every letter is placed on the page at a specific x,y coordinate. parsing text out of a pdf is essentially a series of guesses. sometimes the algorithm guesses wrong. PDF was invented for perfect layouts for printing.

    Word docs are a text-based format. It's very easy to correctly pull text from a Word doc.

    Why risk an ai parsing a pdf incorrectly? There is no upside.

  • source
  • parent
  • [–] 6 points 1 year ago (1 child)

    I feel like a separate breakdown per lead source would be interesting - was one source complete junk?

  • source
  • hideshow 1 child comment
  • [–] [S] 13 points 1 year ago*

    No sources were junk, but in-network and recruiter leads were much more likely to pan out.

    If I had to call one thing ‘junk’ it would be any job openings that use Workday to apply. Big fucking waste of time to reenter everything on your resume and satisfy their picky but stupid form validators.

    Ashby and Greenhouse are much nicer ATSs.

  • source
  • parent
  • [–] 6 points 1 year ago

    That's pretty good! Only 9 weeks and less than 200 applications, with that many interview rounds and offers? A lot better than what I've seen other people do

  • source
  • [–] 5 points 1 year ago (2 children)

    Gj OP. What's you're work experience? You application process seems so easy (not to put down your work or anything). I've done a lut triple if not cuadruple your applications, and no offers. I have a lit 2 years of software experience though and would not apply to a senior position.

  • source
  • hideshow 2 child comments
  • [–] 7 points 1 year ago (1 child)

    Any of the screening or application through AI? From what I've seen that is more a slap in the face than being rejected or ignored.

    I find it not surprising the final success was through networking - my son got into his work because he happened to run into someone who helped get his foot in the door, and would probably not be at his level now had he gone through the usual process.

  • source
  • hideshow 1 child comment
  • [–] [S] 10 points 1 year ago

    There was one application where the first reply was asking me to do a 2hr coding test solo using their secure coding environment.

    If I had spoken with a recruiter and they said I seemed like a worthwhile candidate and asked me to complete it as a screener, sure thing.

    Instead I got the impression no human had looked at me and that I was being jerked around by automation. No way I’m going to be to waste 2 hours pouring effort into a black hole.

    I’m sure the ATSs are using AI for early screening, but all I can see is the responses or lack thereof.

  • source
  • parent
  • [–] 10 points 1 year ago (4 children)

    Usually these sorts of results are an issue with your resume or cover letter.

    As someone on the other end, the sheer amount of applications I get means any resume that isn't setup correctly can just go straight into the bin and I still have hundreds of good resumes to work with.

    If the majority of your applications get rejected/ignored BEFORE a screener that means your resume or cover letter is improperly formatted or something is wrong with them that triggers an auto reject

  • source
  • hideshow 4 child comments
  • [–] 10 points 1 year ago (1 child)

    This sounds like it might be true for you but isn't for others. I'd hesitate to say this is the norm.

    I've put my resume through multiple parsers and made it as best as I can. I've gone through phases where I've tailored my cover letter down to every single miniscule details and saw the same results as OP, or pretty similar.

    so you're either talking bs or you're in a different field where it does matter

  • source
  • parent
  • hideshow 1 child comment
  • [–] 5 points 1 year ago (1 child)

    What are the things that would be wrong?

  • source
  • parent
  • hideshow 1 child comment
  • [–] -3 points 1 year ago

    Formatting is honestly a big part. Left align what matters.

    Too wordy, missing key details, too big, too small, etc

    Missing they key words the job posting covers. If the job posting talks about Node and angular and your resume doesn't explicitly namedrop them, then it loses a tonne of points.

    Usually the majority of resumes that pass the sanity check then go to screening. You'd be surprised how many people just screw up basic stuff.

    Every single time I've had someone complain to me about job offers, I'll grab a random job posting I find and ask em to send me the version of their resume + cover letter they would send to that specific posting.

    Quite often within a min or two I can find several reasons why their resume would've gotten bin'd

  • source
  • parent