I teach computer science at a well-known, large and mediocre university.
I see bimodal grade distributions all the time. The more technical a subject, the more bimodal the grades.
In fluff subjects like software engineering where grading relates to essay writing and group projects, grade distribution tends to be gaussian.
OTOH in technical subjects where I grade by automated test suits, basically students fail almost all tests or pass almost all tests.
These grade distributions have been constant, regardless of university, regardless of who teaches the course.
There really is a sharp threshold that separates those who get programming from those who don't. And those who get programming really are a lot more productive than those who don't get it. Moreover, once you get it, learning further parts of CS (e.g. new algorithms, new programming languages, new OSes etc) is much easier then if you don't get it, and learning new things makes you even more powerful. The mastery of doing great things is joyful and makes you want to learn more. The frustration of failure drives you away from the subject.
I find it plausible that grade distributions turn into similar income distributions later in life.
I've held this basic theory for a while, and it seems to explain a lot of things about the state of software engineering.
Most visibly, there's a wild disagreement about whether we have too many programmers, or not enough. Big tech companies consistently say that they struggle to find programmers, while contrarians at places like The Atlantic love writing pieces about how we're education way more programmers than we hire each year, and the bubble is going to burst.
The ultra-cynical take is that companies are trying to drive a crash to drop salaries. It fits with the wage-fixing collusion, but doesn't really explain things like paying massive referral bonuses for new hires.
The more interesting take is that it's about this bimodal distribution. "A degree in computer science" is a pretty amorphous thing, and thinkpiece writers who assume that every CS program produces employable CS-job-seekers aren't going to get decent data.
So I think the explanation might be that CS isn't harder than EE or chemical engineering, but rather less prescriptive. There's a huge range of programs producing "CS degrees", and jobs titled "software engineering", and they're not really describing the same things.
I think you hit the nail on the head. There isn't really a need for a lot of companies to hire a CS degree.
Wordpress management? You can hire a Jr PHP developer and be fine. They don't teach PHP in school.
Need someone to manage your non e-commerce website? Web Developer. Again, not something they seem to teach CS majors but the title could say Web Developer or Front End Engineer
When I took a glance at the job market, most jobs didn't really need anyone who studied Boolean algebra, discrete math, how digital and analog interfaces work, big O notation etc etc
With the advent of companies like Weebly, Shopify and others you don't need to have an engineer with backend experience(which most CS teach) so you end up hiring a "developer" but the same title exists at Google and they want people who understand computer science.
So we're left with this fractured market where it's not clear from job posting to job posting what is actually wanted.
(not speaking to parent poster, but instead generally)
Were you a foolish humanities student when you got your bachelors? Worse, did you take it seriously and actually learn something? Great! Now study a technical discipline and blend away. IT is increasing the depth breadth and profitability of these blends daily.
Make sure you pile on the private software projects: without the CS degree, they're gonna want either experience or some proof you can code.
Ironically, plenty of tech departments hire guys who are skilled first rather than having some intrinsic interest in the area they program for. Believe me, some old school companies will hire a CS grad who couldn't spell supply chain over you in a heart beat.
Maybe it's different outside the bay area, but it almost never comes up in interviews much about my passion/prior work experience for _____ they build. Reminds me of a guy who went to work for Tesla expecting a bunch of people pumped to expand green energy only to find guys who couldn't care less: they were hired on technical acumen first, enthusiasm for environmentalism last.
It's more about model building than out & out coding. Papers are algebra and describe clever heuristics. The main issue seems to be marrying the theory and practice.
I am building direct industry experience rather than filling GitHub.
The backend of sites like weebly or Shopify are kinda limited....and peeps who earn a ton of money on those sites have all sorts of ideas on how they could make more(usually need some extended back end work or at least buying a pricey add-on).
Let's seperate tech companies with an e-commerce side and straight up traditional vendors leveraging the internet to increase sales. Backend engineers are critical in the former and very useful mainly to those who have specific needs in ecommerce(many vendors don't even have a clue where to even start). Usually they just outsource the whole project to a third party web dev/design firm or some I.T. guy in-house.
It's worth noting, many older business folks are truly clueless about ecommerce....I tell every client to start with ebay or amazon or etsy but they insist a pot of gold awaits when their website goes live. THey'll need some type of web related worker(design, developer, etc.).
>Probably universities are dumbing down requirements for $$$.
I 100% believe this is true. When I was in college it was pretty staggering to see my fellow classmates receive passing grades and get shoveled through the programs despite never grasping the basic fundamentals of CS. These were people who, at the end of CS 101, still couldn't tell you the difference between a string and an int, who after CS 202 _still_ couldn't tell you the difference between a string and an int, and so on and so on. Yet happily through the system they continued.
I eventually became part of the lowly drop-out club (I found attending college later in life to be a maddening experience of pointless busy work, rather than a challenging mind-expanding one). However, those people who fumbled around randomly swapping out types until things compile are now CS degree holders.
It seems true even for the higher tier degrees too. It seems even a masters degree isn't a good indicator. In the past year alone I've watched several guys with masters enter and then promptly leave our startup due to having just absolutely no idea how to write software. :(
I don't think its that universities are dumbing it down for $$$. It's that they are teaching and testing on skills that are not related to 99% of software development.
I went to University of Texas, and managed to do really well on all the tests and projects without learning how to code. But that wasn't because anything was easy. There were a lot of very tough math, and logic classes that some of my class mates who had been working on open source projects since they were 16 did terribly at. It's not easier skills, it's just different skills.
99% of software development challenges are how do you write/maintain large projects without getting totally crushed by the complexity. This is a skill that no one tries to teach, and is also very hard to teach. Similar to being a good writer, it is very subjective, and CS professors are very uncomfortable grading subjectively. It's also harder to create homework for students than just building out toy projects.
Is this really true? At Berkeley and other UC schools, the programs are often "impacted", meaning they are looking for reasons to kick people out (or, more likely, deny them entry in the first place). A bad early semester with a C in physics and B- in calculus (not at all uncommon at places with less grade inflation) can spell the end of your CS major. People get bounced from this degree all the time.
Just for the record, I don't approve of this. I'm all for standards, glad they exist, but I think some UC schools are pretty callous in how they treat students. I admire those who get through, but there are plenty of people who would have made wonderful contributions if they'd had just a bit more understanding and breathing room. I think Berkeley wastes people because they know there will always be another 10 lined up to take someone's place.
Can't say I love privates in every way, but really, it's a good thing to try to work with someone who is new to college and struggling rather than kicking them straight to the curb.
"A bad early semester with a C in physics and B- in calculus (not at all uncommon at places with less grade inflation) can spell the end of your CS major." Which is terrible because the amount of physics a software engineer will use is non-existent.
Cornell was the same way, our first semester weed-out calculus class MATH 1910 was "curved" to a B- median grade.
At the end of freshman year, everyone who wanted to major in CS had to apply to gain entrance into the CS degree program.
If you got a C in weed-out calculus, you were in troubled academic standing, and you would have to retake MATH 1910 until you got the B-, otherwise you wouldn't get accepted into the CS major.
Other majors had similar, and often less-stringent, degree requirements.
I'm on the job market (I do a lot of contracting so I'm perpetually so) and I've seen a slow increase in job listings that specify a degree and exclude "or equivalent experience". Decision makers need to double check what their HR people are posting or they may, emphasize may, end up with a degreed (not in Chrome's dictionary), homogeneous group of type swappers.
Perhaps ironically, don't academic types feel they are enlightened by their education? So requiring a degree for doing the same job one has done for several decades, an exclusionary act; seems to me to be at odds with their open, enlightened views.
I was contacted yesterday by a recruiter for a startup. He said, "you have over two decades of experience doing exactly what we need but our founders are graduates of <fancy place 1> and <fancy place 2> and I think they probably will require someone with a degree.".
I thanked him, I couldn't even remember applying there, I guess he just wanted to reach out and let me know how he felt.
It's pretty silly to require a degree. Like, you only get so many job applicants, and you have to filter them down somehow into job offers, and everything that isn't "how good is their code" ends up hurting how good of a programmer you wind up with.
Granted, sometimes you want to make the tradeoff - there are some truly toxic people with zero professionalism and beautiful code, after all. It's just obvious to me that I'd rather have better code than someone with a piece of paper from a university.
>It seems true even for the higher tier degrees too. It seems even a masters degree isn't a good indicator. In the past year alone I've watched several guys with masters enter and then promptly leave our startup due to having just absolutely no idea how to write software. :(
is this a problem with degrees or the interview process? How did they get the job without ever proving they knew anything about software?
Having a degree doesn't necessarily mean you have a clue about the architecture of software, how to separate data from the GUI, or even have a full grasp of a simple language. I do not have a degree but having worked with degree holders who came to the company fresh from University, I can safely say that some of them hadn't a clue about how to write software (this was C++).
The skills required for writing software only truly come about if set your own project at home and work through it and write it fully.
Well, it's a problem with the degree as a signaling device and a problem with the interview process if it repeatedly produces false negatives of a similar type.
The group projects of 6 people with one person at computer while everyone else watches for an few hours, then it's done. Four people doing nothing, one person coding, and one person searching the internet for help. Typically the four doing nothing are having an existential panic attack because they realize how useless they are being, or maybe they don't. Who cares? They're about to get an 'A'.
> Why are people who can't code getting the CS or EE degrees?
Because neither CS nor, especially, EE are "coding" degrees.
Now, if you want to code CS (and for certain domains, EE) can help you become a much better coder, but that's not really the central focus of the degree. So they aren't irrelevant as qualifications for coding work. But neither are they, on their own, qualifications for such work.
One problem seems to be that a lot of schools have a strong emphasis on group work. Usually there's a ton of non dev work to go along with projects - documentation, whatever paperwork the project requires, so someone can make a useful contribution without being able to code.
So a weak coder can get through the program as long as he can pass the exams.
And this, I think, is why good programs tend to have a known "weed-out" course. If there's at least one course with a focus on independent, code-centered assignments, you can't fake your way through. That forces some students out, and others to shape up and actually put in the effort they might have coasted by without. Programming and hard pseudo-code tasks on exams can play a similar role.
Teaching group work for programming is great. Among other things, it gets lots of side benefits like promoting source control practice and distribution of code tasks. There just needs to be something that consists of "sit down alone and code".
> If there's at least one course with a focus on independent, code-centered assignments, you can't fake your way through.
Unfortunately this seems to be increasingly foiled by an active market in solutions. I've even seen people hire freelancers online to do their programming assignments for them.
Why are people who can't code getting the CS or EE degrees?
The short answer seems to be: because they're allowed to.
The longer answer has to do with the "$$$" part. Fundamentally, universities aren't in the business of educating people; they exist to sell credentials. Which has some thematic overlap with "educating people", but is still a step and a half removed. And with the long-term transmogrification of universities from "institutions" to profit centers, the inevitable rush toward mediocrity (and widening of the gap between perceived value of said credentials, and their actual value) results.
> .. and they're not really describing the same things
I'd apply this to the other end of your argument too. The reason there's wild disagreement, i.e. "too many programmers, or not enough" is that they're talking about very different things.
There is no linear scale between "can't code" and "great programmer". Anyone smart enough to be a great programmer should understand very well that no system is that simple; especially one involving people.
On the personality side, you have pioneers, early adopters, people who are comfortable being in the wild, out of their depth... and you have town planners, who like to optimise systems they understand already... and in the middle settlers, who are best when taking innovations and promoting them to a wider audience. In a large software organisation you need ALL THREE types, because they all fulfil important functions.
There are similar differences in terms of learning style, ambition, network, experience, confidence, bias, and luck.
Putting people into buckets like this is ill-advised.
I don't think the conclusion follows from the data. It's not implausible that in computer science you need to "get" a whole bunch of things before it clicks and you start being productive, and a bimodal distribution of grades would then be indicative only of people who are further along in the learning process vs. those that have not yet reached that critical point, rather than any huge difference in intrinsic ability. This is just speculation, of course, but so is any other explanation and I prefer giving people the benefit of the doubt.
I know plenty of people who somehow manage to make it all the way through an undergrad degree without ever really getting programming. They then managed to get a low-skill job at a low-caliber employer, where they produce bad code, poorly. But because even bad employers need code these days, they manage to maintain a job in programming despite never really understanding it on a fundamental level. Unfortunately, in such an environment it can be hard to ever improve since you rarely have competent coworkers (and the ones you do have quickly leave).
It might just be a matter of time, but only if you frame it that some people get it really quickly and others take forever. Ultimately, I think programming performance correlates very highly with IQ. Otherwise I really don't see any coherent explanation for why I should be able to out-program someone who started programming before I was born.
I work at a large corp that has recently insourced all its IT. To support this they have been vacuuming up as much mediocre IT talent as they possibly could. Every once in a while they hire a person who is curious about the field and competent. For the most part, though, the majority MIS/CIS folks who couldn't hack CS or were business until a professor told them they could make a lot more money in MIS or "experienced hires" who just want a paycheck and health insurance. Its depressing to be surrounded by such people.
What I find in in-house IT is that CS curiosity and ability to develop good software aren't the critical traits. In those environments, a "developer" spends the majority of his/her time integrating vendor solutions and writing connector code. Often they are task switching rapidly between projects, operations, and support. The critical skills belong to executive function: time planning, task switching, communications, etc. The stronger your executive function, the better work experience you have in those environments.
Of course, some companies see IT in a more strategic light so software development is robust and they do look for talented developers. A mid-sized financial company, I was employed at 12 years ago, wanted custom finance packages. At one time, Fidelity had a separate business unit that was IT R&D: I'm not sure if it still exists. Nowadays I believe they are the minority.
That vendor-integration (and vendor-relationship-management), rapid task-switching, ops / support description sounds exceptionally familiar. It's what I view as more a dev/ops role, though it's also somewhat the old-school Unix-class sysadmin model. Someone who's familiar with compiler and scripting tools, and writes a fair bit of glue, but who is mostly building systems out of component parts, rather than coding them up from scratch.
It's the task-switching and firefighting elements of that position which tend to dominate, and which I've found increasingly untenable (at least to my own personality) with time. I need the long, clear timeblocks in which I can actually think.
Thank you for writing this. This feels like this vindicates a lot of the things I like and dislike about my current job (my first developer position, in an IT department of a very large company).
Currently I'm enrolled in a grad CS program after 25 years in the field. Most students in my classes have never been in the field before. My caution to them is to understand their own likes and dislikes. If a person loves writing software and delving into a problem for many hours without interruption, then the person needs to be careful with in-house IT.
(I also caution them that some likes and dislikes won't be known until they've been in the field a few years.)
I spent too many years being frustrated by this lack of understanding and outright denial. After all, we're in IT, don't we all want to produce really great software to help people?
Recently I had to admit to myself that the answer to the above question is "No". Often a timely good solution beats out a future great solution in the minds of people who thrive in in-house IT. They accept good enough and have no qualms about a vendor providing it.
I agree, I don't think there is much difference in intrinsic ability. I'm absolutely convinced that every healthy person can become a really good programmer.
But becoming a really good programmer requires putting in a lot of time doing programming, and a lot of students don't put in that time.
I've been programming for nearly 40 years. Based on my interactions with others, programming is an intrinsic ability. People that don't have that intrinsic ability can cut'n'paste their way through simple programs, but really struggle to understand what they are doing and why their program works (or not).
Anecdata: My high school got access to a computer (dialup modem). I essentially taught myself programming and then took the official class to teach me programming. Aced it, obviously. My younger sister saw how much I enjoyed programming so she took the class and struggled tremendously. I tutored her... I recall a problem where she had to do an operation repeatedly, an obvious (to me) application of a "for" loop. She struggled with why one problem pattern required a "for" loop and one pattern required an "if" statement.
My sister is very smart and was a straight "A" student in things that she could memorize, graduated from college summa cum laude (IIRC). She became a very good elementary school teacher. Myself, I was very much not an "A" student, especially in things that required me to memorize facts, but I "got" programming instantly.
More anecdata: I am now mentoring FIRST Robotics teams. I continue to see a dichotomy in aptitude for programming... two years ago I walked a student through a program for controlling a robot. She got pretty excited and interrupted my explanations and said "wait, let me think this through"... and she (verbally) worked out the logic of a complex "if" statement. She took over programming that year, is now in college pursuing a Computer Science major, and loving every minute of it.
Still more anecdata: Last year and this year I have a student that loves computers and intends to pursue it as a carrier, but he isn't a "natural." I spent a huge amount of time last year coaching him, but he still struggles to understand what pattern he is looking at and why e.g. he needs a "for" loop to solve the problem.
I could give a lot more anecdata, but I've worked with Robotics students that can program e.g. move sequences once I coached them through the details and I've worked with Robotics students that took off and created complex programs with nothing more than a simple introduction to constants, variables, loops, and conditional statements.
My problem with these theories is that people like me just don't fit into them at all.
I've always been slow. Never did all that well in classes. When I was on a FIRST Robotics team I was phased out by the genius programmer that was already there and barely saw any code. I never really had a problem with for loops or if statements. But never really instantly got the more complex programming concepts, either. My father was a programmer so I was exposed to a lot of the things earlier, maybe that's why I missed the not getting for loops stage. I shouldn't be a programmer if many posts in this thread are to be believed. My father shouldn't be, either.
Worst of all, my programming understanding has went through several key developments in a very jagged fashion. For loops and if statements just didn't give enough to push me over the edge. And it wasn't just programming, but the general theme was that sometimes I would just not get some concept, or miss a simple concept, and after that, I would get stuck, and I could not get unstuck without some unusual event like getting the right help from the right source at the right time. One of my most important degrees of understanding did not develop until I took a certain class in the second-to-last semester of college.
After a while, it seems that enough things clicked all at once, and the problem went away. I don't get stuck anymore, I always know where to go. But that was supposed to happen earlier, so much earlier, but it just didn't.
While this was all happening I was definitely the kid who doesn't get it in the eyes of others. Maybe there's some teacher or mentor out there right now writing a blog post or a comment somewhere else about how they tried, they really tried, but I didn't get it.
And, yet, leaving for another industry would have easily been the worst decision of my life.
This is surprising. I used to be like your second student according to my father. He taught me most everything I know, and my brother used to be like your first student.
I found what personally helped me to overcome the insight bridge/gap was I had to read several different books to find the right analogy that helped achieve the "insight".
There are certain things I definitely did not get in the beginning. But after working very hard I got them.
I am curious what percentage can make the jump as I did. Clearly there are certain "epiphanies" to be had. I almost immediately understood "for" loops, but took several years to get pointers and polymorphism each. I know of people who get some or all of these concepts instantly.
There is clearly the appearance of bimodality here, even in just my experience with just how I learned things.
That's an interesting question. Programming is definitely a skill so study and practice certainly matter. But it's possible the limiting value is the same as g or at least something that includes a set of abilities highly correlated with g (e.g. working memory).
Well, if you enjoy something, it's much easier to put a lot of time in to figure it out.
For example, I became a software entrepreneur about five years ago making money from my own projects. Dealing with a lot of business related "work", I actually discovered I also really like law, in particular tax law.
A friend of mine was a pretty good lawyer (hung up his hat to do more entrepreneurial stuff) and I occasionally ask him to look over contracts I've drafted. He said some of the contracts I put together are better than what some of his colleagues put together. I've also defended myself in a few tax disputes with legal arguments, and always won. If I knew more about it before, I think I would've genuinely enjoyed being a lawyer.
If you enjoy something, it's not that hard to become really good at something. If you don't, it is extremely hard to become better than the guy who loves what he does.
>> Well, if you enjoy something, it's much easier to put a lot of time in to figure it out.
I started programming as a kid because I wanted to make games. It was fun. The problem was that I didn't get the more formal stuff until college, and it made me a much better programmer. But I could also see how boring the data structures class would be to someone with no experience because they really didn't have insight into how applicable some of the concepts could be.
I have always advocated for creating games (and other useful things) to teach programming. Most if not all the major concepts can be applied to games. Why anyone would use the fibonacci sequence to teach recursion is beyond me - it's a stupid solution to a stupid problem. Let's talk about board games and minimax search. Yeah, you have to build a lot of code before that comes into play but you'll learn a hell of a lot more and have way more fun doing it.
Doing simple games like 2D scorched earth really brings home basic vector math and physics. Any 80's arcade game with a thrust button allows you to apply that stuff.
Any kind of 3d graphics goes right along with linear algebra - a topic that is not required by all CS programs even though matrix operations run 24/7 on supercomputers.
Text processing. chat bots anyone?
I used to have an example that used trees but it escapes me right now. Chess doesn't really count because you don't store the tree. We can go back to 3d graphics of course - photon mapping, kd-trees, various BVH structures.
If you start with data structures and algorithms, peoples eyes will glaze over. If you start with simple things that are somewhat interesting you'll get people interested and then you can progress them slowly to more advanced topics by introducing problems they'll want to solve.
I agree with all that, and in my experience, students really react well to courses and coursework based on doing games.
And yet, I will use Fibonacci as introductory example tomorrow when I teach "Intro to
computational complexity" this week. The great advantage of Fibonacci over just about anything else
is that it is so short, so simple, that everybody can immediately understand it. There is no preparation needed. Just about anybody who can breath, can understand Fibonacci.
Despite this simplicity, Fibonacci is so rich:
You can use it to illustrate: Recursion, exponential complexity, going from exponential to linear
complexity by memoisation. Relationship between loops and
recursion. Tail calls. Stack space used by compilers, the limitations of compilers that do not do proper tail
call optimisation,generating functions, recurrences, solving
recurrences.
>> And yet, I will use Fibonacci as introductory example tomorrow when I teach "Intro to computational complexity" this week. The great advantage of Fibonacci over just about anything else is that it is so short, so simple, that everybody can immediately understand it. There is no preparation needed. Just about anybody who can breath, can understand Fibonacci.
Despite this simplicity, Fibonacci is so rich: You can use it to illustrate: Recursion, exponential complexity, going from exponential to linear complexity by memoisation. Relationship between loops and recursion. Tail calls. Stack space used by compilers, the limitations of compilers that do not do proper tail call optimisation,generating functions, recurrences, solving recurrences.
I agree with all you said too ;-)
I would say "Intro to computational complexity" is a more advanced course and the students should already be familiar with recursion from experience prior to learning to analyze time complexity ;-)
IMHO Fibonacci is still a poor example because the most obvious (to me) implementation has always been a loop. Pointing out how a recursive version can be simplified to a loop seems silly, and so does making it more efficient with memoization. But as a first example, sure I suppose. Then you drop the bomb on them and show how it can be done in O(log(n)) by using fast matrix exponentiation.
Thanks for reminding me of the O(log(n)) algorithm. I had forgotten about it. Just added this algorithm to the lecture slides. I <3 the internet.
I start with the recursive algorithm because it follows directly from the definition F(n+2) = F(n) + F(n+1). I also think there's a big schism in programmers: between those that think recursively, and those that are of a more iterative bend. I'm in the former camp, probably owing to the fact that my first programming language was Scheme.
This is a problem in general in math-based education, and sometimes in science also. The solution is problem-based teaching, where the problem is introduced before the solution. By establishing the need for something first, it makes it much more concrete.
It's not really surprising that good programmers are often also good at legal drafting.
When you're a programmer, you understand that the processor is dumb and has to be guided through absolutely everything. If you don't factor in the corner cases, your program is going to screw up somehow.
Legal drafting is the same thing, just replace the processor with a judge and the programming language with English. If, while writing a contract, you precisely define everything and cover all the ins and outs of what can and cannot happen and what should and should not happen in the event that any or all of the above likely or unlikely events shall happen during the lifetime of the contract. Then if you ever need to get the contract enforced by the judge, you can clearly point out exactly how the opposing party already agreed to resolve the situation in some way.
The real reason why you need to hire lawyers has more to do with making sure that the contract you draft is enforceable (considering current law and legal precedent), or else risk having the entire contract thrown out later by the judge. AKA legal system faulting.
A lot of less technical management doesn't understand how important being able to find corner caeses is. This is what separates a good and solid application from one that is routinely failing.
I think the question of whether anybody can get good at programming is very interesting. I often hear "anybody can do it, but you can only become really good if you enjoy it".
So then the question is: why do you enjoy something? Are we born that way, or is it something we do? (I don't know what the answer is)
Edit: also, it is interesting to replace "programmer" with "math professor". Can anybody become a good math professor if they enjoy doing it? If not, what is the difference (assuming it is true for programmers).
For me I think the determining factor of a good programmer is not enjoyment (although that is necessary), it's curiosity. I work with a guy who I'm pretty sure has a photographic memory and would probably run circles around me in an IQ test and with his GPA, but I'm constantly showing him more efficient ways to write code. The difference is I am forever curious about CS-related stuff. I spend hours a day reading HN and other things like it. I'm orders an of magnitude better prgrammer than he is simply because I'm curious.
I think it's a bit of both nurture/nature. In hindsight it was obvious that I would be a programmer even though I didn't have much access to a computer until college. Growing up I gravitated towards math/science, loved any sort of problem solving, and enjoyed things that many would consider tedious (building model WW2 naval ships with my grandfather for example). I did have a Nintendo that was in a constant state of being taken apart, but it did work most of the time :) When I finally had school computer time starting around middle school, they literally had to drag me off of them. Trying commands, tinkering, etc... was just...fun.
None of my friends (or parents for that matter) understood because they were mostly jocks with a few artists types mixed in. But, my friends never cared as long as they could get me out of the house to play whatever sport was in season.
To circle back around, I had a natural inclination with people like my grandfather encouraging it without really knowing.
I'm not sure but I suspect that viewpoint has a massive effect.
It's similar to the old saw about growth vs fixed mindsets.
I often describe programming as "failing 99 times and succeeding the 100th time, and counting that as success". There are a lot of people who are not wired and acculturated to that sort of "success".
That said, I don't (obviously via the growth mindset) think it's a fixed quality, it's more of a learned and acquired routine.
I think our enjoyment of an activity depends on how we see our progress.
If we keep struggling with it, we will hate it, even if we thought we would like it at first.
We could also begin to enjoy an activity if we see ourselves progressing in it. When you see your improvements, your brain probably releases dopamine (or another one of those addiction chemicals) and that makes us want to do it more (to taste that sweet taste of victory/progress).
Some subjects aren't really fun until your good at it though. I used to hate it until I forced to do it and found it was fun after I got the basics down pat.
When I think of somebody who enjoys programing, they usually have a goal or task to compel them. Just solving random CS questions and math is pretty boring to the majority of folks.
It's not fair to call people that find programming difficult lazy. You can work harder and longer, but it only pays off up to a certain point.
There are some tasks which require more intelligence, and some which are easier for more people to do. And thankfully. there's more that can be done to make the former more like the latter.
It's really not about time, it's being able to think flexibly. I have seen several freshman who never coded before where 1/3 of them get it in a few weeks and have an easy 4 years, where the second set either drops out or spends a lot of time trying to keep up.
An assembler class where the high end spent 2-3 hours and come in with 3-5 pages of code vs. the low end that spent 50x as long had 100+ pages of code that did not quite work. At first glance the difference was if you looked up how the math coprocessor worked, but more generally how much you tried to brute force the problem vs. look for a cleaner solution.
I don't think he was refering to time spent on a given program; rather, for people who don't intuit CS concepts time spent staring at the page can make the difference between a person who never gets it and one who eventually does. At that point, there isn't much functional difference that person and a person who got it from the start.
I don't think it's really about the CS concepts as it is being able to link them together flexibly. Suppose you want the median value in an array. Well sorting makes it easy, but you don't need to fully sort the array. A modified quick sort seems like a good compromise, then again using a built in sort is probably fast enough and much less code.
That's the kind of thinking that really works. Because you can look up well known probelms, but you need to start thinking in terms of trade offs instead of going with the first idea.
I would argue that in order to link them together one must first understand the CS concepts and their uses. Once a person has that understanding, it becomes trivial to know when a naive solution is no longer the right approach. Once a normal person has the ability to see problem solving like that, they've pretty much got it.
That's not to say there's not a difference between all possible solutions and the people trying to find them. Some will be able to zip together the objectively most efficient solution right from the start. These are the true "superstars." People for whom doing something once is as good as doing it a million times (ie, they don't forget things). These folks are exceedingly rare and the rest of us will have to settle with kowing enough to know when we need a better way.
I get where your coming from, but many people can get all the individual concepts and still not make the connection.
If they want to double X, they are happy to use X + X, 2 * X, or X << 2 and map them all to the same place. So, if they suddenly can't use * because the CPU does not support it they are happy to use the other 2. And somehow this is the same skill where someone hmm database is to slow, let's do X.
It's probably a learnable skill, but it's just not directly part of CS classes. Someone can learn X XOR 1 is the same as X MOD 2, it's another to use XOR when they can't recall the MOD symbol.
Maybe I'm missing something but in your two examples, what you refer to as skill is just recall. I would argue that in the context of alternative solutions, the skill would be knowing when a better alternative is needed when it isn't immediately obvious. If I knew mod wasn't available yet I neded an analogous operation finding an alternative is trivial even if I don't recall it. I wouldn't call that a skill.
It might seem obvious if A and B do the same thing then you can use A or B to move on to the next step, but many people don't think this way.
For a non programming example, you can use the handle of a shovel as a long stick. This should be more or less obvious when looking at a shovel, but I have seen people ignore shovels when looking for a stick to do something.
I had the same experience for the 3 years I was teaching assistant. Some people "clicked" very early and some didn't, but it's not set in stone. I've seen people succeed with only hard work and motivation. Once you've unlocked yourself there is not much differences between you and the ones who have unlocked themselves earlier.
I imagine you've never been the one hiring or interviewing developers, have you?
There is an amazing bit though: there are the ones that you classify as "surely worthless", but then you see they can indeed get some jobs done, so a non-technical manager or HR-person can easily confuse one of those that "can sometimes program computers to do useful stuff or keep things running" vs someone who can do "software engineering".
Oh, and then there's the infuriating third category of those extreeemly smart (IQ through the roof + wealth of knowledge) but extreeeemly unproductive (like even manifesting "negative productivity" and dragging a team down or an entire project into the ground, the "-10x programmer").
A sub-category I find is the "scientist" programmer vs the "engineer" programmer. With the scientist programmer being these category-three people. An engineer will use existing frameworks, technology, standards, etc. to solve a problem. And a scientist wants to develop new frameworks, technology, standards, etc. to solve a problem.
On larger teams, you want some commonality with your code. You want to be able to look at code written by others and at least have common style, strategy, and idioms. Engineering style devs tend to follow this nicely and it all works fairly well in a team dynamic. Whereas, scientist developers are often looking for new ways to do everything. When they see things done in a common and consistent way, they tend to look for unique solutions and tend to do more of "research" style development.
Don't get me wrong, both styles have their benefits. But on a typical largish development team, the scientist are often a more negatively-impacting developer to the overall productivity of the team.
The really scary thing happens when these scientist type developers become architects. And then you end up with what is often called an "architecture astronaut".
I think there are some infamous examples from the old days of Microsoft. Think of the programmer who insists on using an obscure dialect of Lisp because of all the "clever" things they can do in it. Even if they work, and are genuinely clever, it can be a huge pain for the less brilliant/obsessed people to interact with.
In general, this seems to be a problem that arises when smart, capable people (who are short on common sense and teamwork) become so valuable that they get to call shots no one else can accommodate.
Well; what these people have not learned is that the whole purpose of a "programming language" is NOT to tell the computer what to do. It's to tell your team mates what you've told the computer to do.
People who don't get this are really the worst to work with.
John X is assigned to project Y with team A but find it very boring for him. So he overengineers in a way so that it only works by solving a very complicated engineering problem that he wants to solve instead (think "developing your own distributed no-sql db" class overengineering).
John X leaves for a more interesting project, team A can't make modifications to the current over-engineered system so they need do a rewrite of a few key components that incurs a huge delay.
And yes, it was not John X's fault. It was the manager's who assigned it to the wrong team and project, and the team leader's that they didn't have working code review process to be able to give JX feedback early to "write code easier to maintain by a less experienced team even if it's maybe less efficient and takes him a bit longer".
So you're right in insinuating that category-three people don't really drag projects down: it happens when they are assigned to the wrong place and when you have teams with broken processes, so objectively speaking, bad management is actually what's dragging things down in this case. But isn't "bad management" close to a pleonasm anyway?
I've worked with people in the past who know just enough to hack together a front end on top of a simple database, but who would completely fall apart when presented with anything more complex than that. These are the sort of people who when asked to build an internationalised website "solve" the problem by copying an entire PHP application into directories called "english" and "german" and then proceed to change the text in the German version.
There's that XKCD about asking how novice users solve computer problems. "I save the video to iCloud, then copy the url into this video downloader, then put the download into this transcription site, then upload that to..."
I think this is a big chunk of explaining how bad programming goes, too. It's not "too incompetent to build a thing", it's "incompetent enough that everything runs on voodoo and evil".
However, it is very easy to cheat your way through college and obtain good grades. My assessed coursework regularly shows up on rentacoder.com and similar. There is an industry out there for writing dissertations. Group work is another mechanism that weak programmers use to avoid getting better: they let the good programmers do all the programming and then do documentation, or UI design, or nothing.
In addition, there is a pronounced grade inflation, so even weak students look great on paper.
Not every organisation has the know-how to filter out weak students that look great on paper.
My degree program must have been unusual, then, because my senior project class was the only one where less than 80% of my grade came from in-class tests. Many professors didn't even give a crap whether you actually did the homework or not, because you'd bomb the test anyway if you didn't.
In my experience, there is enough fluff and non-programming, abstract theory classes in a CS major that people who cannot program their way out of a wet paper bag can complete the degree, and even get high marks. These people can get jobs, and coast along for years at sub-mediocre levels of production, in most cases.
I'm going to be a bit more charitable and say that those people find non-programming jobs in the field.
One person I interviewed stood out in my mind for having completed a Master's in CS, was able to classify the problem I posed her as belonging to a certain type and told me how it should be approached. She still couldn't even begin to write the (simple) code to solve it, however.
This person was obviously smart, and also quite obviously had no programming skill.
I have a theory where the bimodal distributions comes from two sets of people: one set focused only passing the course/assignment/test, the other set focused on actually knowing the content. Appearance and substance.
I have a different one, derived from teaching 1000s of students over 2 decades. the bimodal distributions comes from two sets of people: one set working hard and putting the hours in until the master the subject, the other set being lazy, cheating, and don't put the hours in, so they never achieve mastery. Appearance and substance.
I must insist although "achieving mastery" is clearer than "knowing the content", I meant the same. It would probably help if I wrap "knowing" in asterisks like "knowing the content".
That's my experience too. There are those who want to get a degree with the least amount of work and don't really find the topic interesting. And then there are those who will discuss it and debate it before/after class, etc.
Good test to tell them apart: if the lecturer mistakenly starts to talk about stuff that he already said in the last lecture (i.e. mistakenly doing the last one again), the first group will be happy and silent because there will be less stuff to learn for the test. The second group will tell the lecturer because they want to learn. This is then often mistaken by the first kind of people as trying to please the professor or "siding" with the prof instead of the fellow students. Because they think in a school-mindset.
I did a batchelors in Molecular Biology years ago, and I noticed that some of my friends seemed to just learn the material, whereas I tended to understand the material.
> In fluff subjects like software engineering where grading relates to essay writing and group projects
How is SE a "fluff subject?" Why are they writing essays? When I took SE we had individual programming projects and a group project to write a compiler. Not fluff at all.
SE is often relegated to a "fluff" subject in schools simply because it's, well, not very challenging. Classes based around the topic of SE are often topics like "Formal Software Development Methods" where you learn about verification of concurrent programs, formal symbolic testing, contracts, explicit model checking, etc. These are all "soft skills" and hard to directly generalize into a programming assignment, so students often times write essays formalizing their logic.
Frankly, I'm surprised that your SE class did compilers at all, many schools in CS have their own "operating systems programming"/"low level programming"/"compiler design" sort of class, where the topic is fully fleshed out, rather than just a tiny project.
In my school, SE ended up weeding out quite a few people who couldn't actually program. They were fine at math and "theory," but when it came down to actually programming, they produced garbage which only eventually worked through trial and error.
For most other classes, grading was based entirely on test cases so they could still pass with their frankenstein programs. SE was the only course which required the development of a large application and where grading was substantially based on actually looking at the code.
For the record, there were 0 essays in my SE class and lots of large, in-depth projects.
Wow, things have changed since I took my SE electives (17-18 years ago). We had to write code and there were final projects that required the development of a non-trivial application. One that compiled and at least nominally worked. Granted I only took a course of about three electives at the sophomore and junior level, so maybe I missed the "fluff" in other levels.
Yeah the first "formal" sophomore SE elective I took was literally "hey isn't OO the best? Don't you love drawing UML diagrams? What word is P-O-L-Y-M-O-R-P-H-I-S-M, and can you write a 1 page essay on it?"
Once you get up to the actual SE electives, they're all about the formalization of software and how it can be represented. These classes are usually avoided by students as well, since students opt for fun (from the student's pov) classes like robotics programming, compiler design, web development, crypto, etc, which only makes the SE classes seem like more "fluff".
At my school we wrote a part of a model checker (in C, with pthreads) for concurrency, the rest of the assignments were (as I recall) a mix of questions and math proofs, so you either got it, or got to redo the questions.
In general I only recall writing one simple essay and it was, indeed, for our completely fluff project planning class, which was almost entirely about the instructors homegrown, mostly bullshit agile-like system.
Perhaps things have changed since I was in school about 15 years ago but I always called it "academics teaching you their warped view of what life as an industry programmer is like". I quickly learned that nothing which was covered in those classes were things I did in my jobs once I graduated.
Be fair. Some of it is just learning what code is, and how to think about it. They provide some practice with various dogmas. The idea is, once you are working you'll learn more/different ones and have some facility doing so.
"Nothing I learned as a toddler is anything I do now that I'm an adult"
It's been retracted, but it's the only case I've ever seen where I found the retraction unconvincing. The retraction effectively says "After this paper came out, I made a lot of wild claims about it that the data didn't support. Therefore ignore the paper, even though the results replicated successfully."
I suspect the bimodal distribution for programming and law have the same explanation: a group of highly profitable firms targeting a subset of the overall industry have imposed a de facto hiring floor that limits supply, raising wages.[1]
Why is Cravath raising salaries while 85% of legal grads are taking jobs making half or less of its old salary scale? Because it has a hiring floor. It won't hire lawyers that aren't at least one standard deviation, if not more, from the mean.[2] Their demand is high--each lawyer generates on average $1.3 million in revenue--and supply is limited to the 10-15% of the market that meets the hiring filter.
I suspect the same is true in the tech industry. Google, Facebook, etc. don't hire candidates who can "do the job." Like in law, there is this idea that it's important not just to have competent programmers, but programmers who are smarter than your competitors' programmers. These firms limit their pool of hires to those who, by their metrics, are one or even two standard deviations away from the mean.[3]
Meanwhile, everyone else is willing to hire the median programmer. They can do the job, and there isn't the same idea in that segment that it's worth paying much more to have people who can not only do the job, but do it faster/better than your competition.
[1] How this group of highly profitable firms continues to exist despite market competition is outside the scope of this post.
[2] Cravath measures that as a function of law school rank and class rank. No comment on the validity of this model.
[3] Again, no comment on whether going to CMU and acing interview puzzles makes you a top programmer. What matters is that these firms think it does.
The web-scale software segment is at a unique point in time where it is still in an "arms race" mode of growth for the best employees between its competitors AND making tremendous profits.
You created an account just to post this nonsense?
Edit: Oh, it's pretty obvious you're the work4beer guy from below, must have gotten banned already. I'm guessing you're 17 and just got some rejection letters back. Or you're expecting acceptance letters. Either way the world doesn't work at all like you're imagining.
If there's a pronounced bimodal distribution, it seems like the biggest driver of it would be the lumping of various programmer specialties into one giant bucket. It seems like the 2 sub-buckets would be:
1) $100k or less: backoffice programmers where software itself is not the product sold. Also known as enterprisey/LOB/CRUD developers working outside Silicon Valley. (E.g. programmer working on mortgage servicing software for a bank in Kansas earning $80k salary.)
2) $150k or greater: programmers for a "tech" company in Silicon Valley. (e.g. the programmers at Apple/Facebook/Google earning $150k+)
If you combine those 2 groups nationwide, you'd end up with 2 humps in your graph.
I hate these reductive COL adjustments. They're preposterous.
Even if you assume that all your expenses are linearly multiplied (hint: Amazon costs the same no matter where you live), your savings are a lot more afterwards. If you were living on $40k/yr in Kansas City, you could move to SF and suddenly be saving $80k/yr.
Would you really rather have $600k in Kansas City than $1 million in SF?
It's not preposterous within a certain income range. If your household income is $300,000 in SF (for a married couple), your net pay is about $14,800 per month. If it's $150,000 in Kansas City, MO, your net pay is about $8,600 per month. So you're talking about an $6,200 per month difference.
You can buy a 3BR, 2,000 square foot in Overland Park, a great school district, for $200-250k. You'll be about a 15-20 minute drive from your work downtown. What does a 3BR, 1,700-2,000 square foot house run you within 15-20 minutes of downtown Mountain View, in a good school district? It looks like $1.5 million+. That's the difference between a $7,200 per month mortgage and a $1,200 per month mortgage.[1]
So housing alone almost completely wipes out your extra income. Then you have other costs that scale with cost of living: house cleaning, after-school child care, etc. You'll pay more for gas, you'll pay almost double for a cocktail, etc.
Obviously, once you're up to $1 million per year, your're better off in San Francisco. But even in SF few programmers are earning that much. $300k is a solid household income in that area, and in that range you're not better off, materially, than you would be in Kansas City.
[1] A family making $300k in the Bay Area is getting close to not even being able to qualify for a mortgage big enough to buy a house close to work.
> So housing alone almost completely wipes out your extra income.
I guess it depends on ownership v. rent. Over the long term, housing is a forced savings account.
Even 20 years out, that $7,200 per month is going to be worth a lot of money. Sure, you paid $1.7M in mortgage payments, plus property tax and maintenance. But you also have a place that probably kept pace with inflation and at best, doubled in value. If value climbed at a modest (for SF) 4% per annum, that house would be worth $3.8M in 20 years.
So, in 20 years, you're looking at an additional $2MM (3.8M - 1.7M) increase in network by living in SF. This is assuming your compensation does not include stocks/options, which are rare in the midwest, but very common in SF.
I totally disagree. Housing is such an over riding cost that no amount of things you can buy on Amazon will save you. The housing prices are rising so fast in SF that it makes estimates like this one LOW. you would be unlikely to save any money at all living in SF on 150k but Kansas has such a wide variety of hosing options that range form super cheap to substantially affordable that you could easily save as much or more that if you were living in SF on double the salary.
Edit: for the record I don't live in and have never been to Kansas City.
> you would be unlikely to save any money at all living in SF on 150k
This statement is farcical. You do realize that the median wage in SF is less than $100k. How do you think those people are living?
Have you actually lived in SF or NYC? You're totally out of touch with the actual costs.
Yes, housing is expensive. But you can still easily get a solid apartment for $3k/m. Add in another $2k/m for food (high!) and that's still only $60k a year. You're still left with $10k more than the KC developer even started with.
Unlike you, I'm actually using real numbers and the reality on the ground. I made $150k/year in NYC and managed to save almost $100k/year.
You must be young, and have no dependents. Also taxes alone on 150k must be close to 1 third of your income so based on that alone I'd be skeptical of someone who claimed they could save 100k per year on 150k salary in NYC.
> Unlike you, I'm actually using real numbers and the reality on the ground. I made $150k/year in NYC and managed to save almost $100k/year.
Who does your taxes? Your take-home in NYC on a $150k/year salary is going to be like $90k. Spend $5k/month on food and rent, and you're saving like $20-30k/year.
I have a good CPA and am very aggressive with putting all my savings into tax-advantaged accounts. Admittedly my actual income ends up being more than $150k/yr thanks to capital gains and some freelance work. Looking back on the years where I was just a straight salary worker (earning $150k/yr) my annual savings were closer to $60k.
> But you can still easily get a solid apartment for $3k/m.
What does the same apartment cost elsewhere though? Cost of living calculations are not for calculating how little you can possibly spend in a given location, they are for comparing the same standard of living in various places.
It sounds like you are willing to sacrifice your standard of living to make more money, which is fine, but not comparable to the parent's calculations.
Most of them are grandfathered in via rent control. Some immigrant groups give preferential treatment to people coming from the old country, but if you are on HN, you can't access those networks, and you might be too fussy anyway.
If you're single and make $150k/year in SFO, you only have $110k post-tax income or so; a bit higher if you are putting money into a 401k. There's no way you can be saving $100k/year at that income level.
Is this pre-tax $150k? I'm also in NYC, but taxes alone are almost 50% of my salary. Plus ~$3k a month on an apartment, you can't really save much on $150k.
> I made $150k/year in NYC and managed to save almost $100k/year.
Your income after taxes in NYC would be about $100K (assuming Single filing status, no dependents, etc). That's without paying for literally anything, including rent, utilities, food, transportation, entertainment, internet, insurance, etc. Can you clarify how you managed to save so much?
Housing is generally an investment, so what I'm dumping in my mortgage, I don't have to dump in retirement funds (assuming im planning on selling the place and moving out when I no longer care about big cities). So I literally don't mind dumping a million+ in my condo.
Second, even that million+ condo only cost me a third of my salary, including property tax and HoA after tax breaks and shit. Literally everything else is essentially fixed cost (eg: while labor for renovations is a bit more expensive, the bulk of the cost is in the materials, which are shipped from out of state in most cases). Cars aren't any more expensive, etc.
So when you're borderline, big cities (I'm on the east coast, but same applies) are totally not worth it. You'd be living paycheck to paycheck. But once you reach a threshold, it's just better.
Now there's remote work that messes up with all that math, obviously.
A single property does not make a good substitute for a retirement fund. There's a reason why retirement funds allow you to invest in a diverse set of bonds with different rates of risk and across different industries. Putting all of your eggs in one basket is a stupidly risky move.
It's not my only egg. My only point is, spending a large amount of money on a home is not necessarily just a net expense, and is actually very frequently (in those cities, SF, Seattle, NYC, Cambridge/Boston, etc) a "profit", even after interests on the loan.
Even if my property was to lose 50% of its value tomorrow, its still better than renting, or getting an expensive car, or whatever. And in the best case, it will have a hell of a return.
When housing is the overriding factor in COL differential (as it tends to be in the Bay area relative to other locations), you probably need to look at something after-tax pay less mortgage/rent for a house/apartment where you're realistically going to live in the respective areas.
Clearly there are other cost and quality of life tradeoffs to consider, but the above gives you a pretty good baseline to work off.
I've been looking at a move from a very low COL area to a very high one, recently, and this is spot on. But there's one huge caveat: you have to be willing to sacrifice on housing.
Housing will swallow everything in any real apples-to-apples comparison. But if you can accept that you'll be living in a much worse apartment, then the COL differences aren't as extreme as they're generally stated to be.
That's one of the reasons that COL factors, by themselves, don't mean an awful lot. If I were to move into a city it's clearly not even meaningful to talk about the price of the equivalent property to my exurban house on a fair bit of land. The relevant comparison is to what I would/could realistically and at least somewhat contentedly live in.
As I said elsewhere you need to make that after-tax housing cost comparison. Aside from a few other potential factors like private schools, most of the other purely cost deltas are going to be relatively modest.
>If I were to move into a city it's clearly not even meaningful to talk about the price of the equivalent property to my exurban house on a fair bit of land.
To be fair, it's a lot worse than that. I live in a nice, spacious, modern loft in the middle of an urban area. We're not talking about a big, suburban house. Just a nice apartment. I'm looking at apartments in the high-COL city that resemble my current apartment's entryway in size and in conditions I wouldn't even consider here.
This adjustment is on the extreme end to be sure. If you make 80K where I am and live in the square footage I do, a comparable place in SF is around 3K* more expensive per month. So there's a very real, ~36K negative adjustment to that 120K SF salary for me.
I really think GP is oversimplifying, and I have lived in economically disparate areas with the same salary in each. I moved from southern California where I made roughly $60k. Then I move to the Southern US. I changed industries and settled in at $50k.
In terms of raw salary, I made $10k less, but my money went infinitely further in the South. I wasn't hurting for money in CA, but I had to be much smarter about my financial choices towards the end of the month. In the South, I always has leftover money at the salary. I mean, that 740 sqft apartment in CA for $1200 really sucked compared to that 2 BR house I was renting for $850 in the South.
His point is that commentary on the cost of living tends to oversimplify. Different regions don't just have a linear multiplier that applies to all expenses, but that's what these surface-level shallow surveys tend to imply.
What escalates in expensive areas is really just housing and other costs related to physical space, like parking and transit. As he said, Amazon costs the same everywhere. So do your cell phone and computer. Utilities, food, gas, clothing, medical, all of those really don't vary all that much. They might swing by 50% between the cheapest and most expensive areas in the US, but that's nowhere near multipliers like 3x that people try to claim from just the housing data point.
You must have an insanely huge apartment for rent to increase by $4k/m by moving to SF. But even assuming that -36k adjustment, you're much better off making $150k in SF than $80k in Kansas City.
Of course, you also have the option of downsizing into a smaller apartment. The amenities in a large city make it much easier to have a small apartment (for example, in NYC I drop off my laundry instead of washing it at home or hop around different coffee shops to work with a change of scenery). My quality of life is definitely higher in a small NYC apartment than a large Vermont house.
In many places in the US you could easily rent a 3 bedroom house with a 2 car garage for $1000. Guess how much a 3 bedroom house is in San Francisco.
>you're much better off making $150k in SF than $80k in Kansas City.
Don't forget state income tax and tax bracket. Also don't forget that some things like student loan interest aren't deductible above $80k. And don't forget that to get the mortgage interest deduction you have to actually own a house (easy in Kansas city on $80k, not in SF on $150k). The list goes on (price to get your kids into a decent school, etc) once you really start to dig into it.
SF is great if you don't mind rooming up with people or living in a tiny studio. To raise a family though... it's not so cut and dry.
In my case, 2000 square foot house in St Louis with a two car garage. A large enough place to have children comfortably, market value about 200K. I am working remote for a SF company, and I looked at relocation. Anything even remotely equivalent was a couple of million. That's way more than 5K difference a month right there.
I bought my house when I was making about 60k. My last local job paid 220K, working for a company that is now being bought by Bayer, so I have seen the difference between 80k and 150k. 80k in a cheaper place is far better, especially if you are renting.
As far as dropping off your laundry, then you also have to consider that you are spending more money per load of laundry than I do by using the washing machine.
Now, what is true is that cost of living calculations are not linear: A simple multiplication doesn't really capture the differences between making 30k, 60k, 80k and 150k in the same location: There is a point after which cost of living doesn't matter: In St Louis, for instance, I'd argue that anything more than 70K or so is just flat, past tax rate differentials, because you are talking luxuries that are about the same everywhere. That line, however, is way past 150k in San Francisco, because housing cots are nuts.
>You must have an insanely huge apartment for rent to increase by $4k/m
I meant to type 3K/mo (which is where my 36K adjustment came from). And yes, I've actually looked up housing in the Yay when I was considering a prospect there. Honestly, at the tiime I was looking for 2 bedrooms so my 3K adjustment may actually be under because now I need 3 bedrooms.
>Of course, you also have the option of downsizing into a smaller apartment.
No I don't. I have a wife and 2 children who if I can afford to give them their own room, I will.
That being said, I understand my calculations do not apply to everyone because we are not all at the same places in our lives (and may never be).
> No I don't. I have a wife and 2 children who if I can afford to give them their own room, I will.
Fair enough, I didn't mean you specifically. Once you have a family the advantages of a low-cost locale definitely become greater.
Of course, the advantage of working in SF/NYC is that by the time I'm ready to have kids I'll have enough money saved up to buy a house in a low-cost area in cash.
> Of course, the advantage of working in SF/NYC is that by the time I'm ready to have kids I'll have enough money saved up to buy a house in a low-cost area in cash.
That doesn't follow from the argument. If the COL adjustment means that the salary differential is not enough to cover the difference, you will be able to save more in the low cost location as well.
Of course all of those arguments are reductive as COL is not that easy to calculate and there may be other financial advantages to being local to the higher cost area (more diversity of work, less risk at job loss, or higher chance for a lottery style payout for instance).
> If the COL adjustment means that the salary differential is not enough to cover the difference, you will be able to save more in the low cost location as well.
That's assuming you are spending all of your income.
If you're saving money in KC (on $80k/yr) you should also be able save twice as much on $150k/yr—even if you assume a linear cost multiplier for all your expenses.
> Even if you assume that all your expenses are linearly multiplied
Problem is, they aren't. Income taxes are regressive, so your percentage income to taxes goes up as you get paid more. Everything else should scale linearly.
> (hint: Amazon costs the same no matter where you live)
I spend maybe 3% of my annual salary on Amazon and similar websites. It's a non-factor.
> If you were living on $40k/yr in Kansas City, you could move to SF and suddenly be saving $80k/yr.
Only if your expenses go up by the same scaling factor as your salary. As soon as they get out-of-whack even a bit in favor of expenses the math starts to break down. It also breaks down if you are saving a small-ish portion of your salary to begin with.
It isn't the things that you buy that linearly increase (as you correctly pointed out) as much as labor, and any thing/service that has a large labor component.
Because the staff delivering that labor also experiences an X multiplier in shelter costs (and for lower-wage workers, the multiplier is highly regressive and frequently much higher for them to obtain an equivalent quality of life), the labor input cost is increased. Unless you DIY everything, including not eating out (restaurants have very high labor input costs), fixing your own vehicles, do your own plumbing/electrical/HVAC, do your own dry cleaning/dentistry/vision care, etc., you'll see commensurately higher costs for any material goods and services with high proportion labor input costs.
For busy single professionals, two-income couples, or families, it is not realistic to even mitigate these costs. A big chunk will unavoidably come out in property taxes for everyone, paying for public schooling: all those administrative staff, operations staff and teachers, wanting to live as close-in as they can afford, paying those linearly-increased dirt costs, will be expressed in your property tax bill.
For the vast majority of people not connected with the real estate industry, they are far better off commoditizing their shelter cost complement, see [1] for this complements concept. This means vigorously opposing any increase of the "value" of their homes, even when selling. In the US, you will never, ever make back that "increased value" in the average time most US homeowners hold a mortgage (7 years), if you honestly accounted for all the actual costs you bear in all consumed goods and services for increased real estate prices. That increased value only benefits those who have a high churn rate on their properties.
> If you were living on $40k/yr in Kansas City, you could move to SF and suddenly be saving $80k/yr
No, because not only do we have a progressive federal tax system, but state/local taxes in San Francisco are higher than they are in Kansas City.
Just running the numbers for a simple case, say you are single and renting. You earn $80k in Kansas City. Based on http://dor.mo.gov/forms/MO-1040%20Fillable%20Calculating_201... it looks like $2100 is not taxed as a personal exemption and $5000 is not taxed if you pay at least that much in federal taxes (which we will; see below). $6300 is standard deduction. So deductions are $13,400, taxable income is $66,600. Per the table on page 25 of http://dor.mo.gov/forms/MO-1040%20Instructions_2015.pdf that gives us $3771 in MO tax. Note, not enough to make it worth itemizing federal taxes if you rent.
Federal taxes for 2015 would give you a $4000 personal exemption and $6300 standard deduction, for taxable income of $69,700. That's gives a federal tax of $13218.
Total taxes are $16,989, for after-tax income of $63,011.
OK, let's look at San Francisco. Salary is $150k. Looking at https://www.ftb.ca.gov/forms/2015_California_Tax_Rates_and_E... the standard deduction for state taxes is $4,044 (less than Missouri, which is ridiculous given cost of living). Personal exemption is $109 (really?). Taxable income is $145,847. State tax is $11040. That's enough to make it worthwhile to itemize federal deductions. I didn't bother to look into the AMT rules for CA; this is meant to be a simple estimate. By definition the AMT can only make things worse here.
Federal taxes again have a $4000 personal exemption, our $11040 itemized deduction, taxable income of $134,960. Federal tax is $30860.
Total taxes are $41900, for after-tax income of $108,100.
OK, so say you were living on $40k in expenses in Kansas city, making $80k pre-tax, saving $23k per year. You move to San Francisco, start making $150k pre-tax, expenses go to $75k (if you accept the 1.87x cost of living difference). You are now saving $33k per year. More, true, but nothing even close to $80k/year.
Note, by the way, that the cost of living difference is largely driven by housing costs in this case....
> Would you really rather have $600k in Kansas City than $1 million in SF?
It really depends on my lifestyle. Still for a single filer, the Federal marginal tax rate on that extra $400k is 39.6%. The CA marginal tax rate is 12.3%. Medicare marginal rate is 2.35%. So overall marginal tax rate is 54.25%. CA taxes on that first $600k would be about $60k while MO taxes would be about $35k. So the extra $400k is actually about $160k post-tax.
This is the part where lifestyle matters: housing in SF can eat up a large chunk of that if you let it... If you're single, SF is probably a win in the 150k vs 80k case. If you have a family, chances are it's not.
It's as though people think that a car costs 45% as much in Kansas City.
Or, to use another analogy, it's like being the wealthiest man in a developing nation. There's no amount of money that can buy you reliable infrastructure in a place that fundamentally lacks it.
I live in NYC and I cannot speak to SF. But perhaps the NYC figures will provide insight. In short YES the car DOES cost 45% as much. My monthly parking cost is $520/mo (with another per-use fee if I take my car out more than twice a week.) The $520/mo is more than my $300/mo car payment. I dont know how much parking costs in KC but i'd venture it is near-free.
Oh, and this is just the monthly cost at the apartment building, not for destination costs which are separate.
Or you can live in NJ and commute in. NYC is substantially better in the range of options across distance/cost/space than (from what I know/have heard about) SF.
Sure, and how much does your apartment cost? People in SF and NYC always seem to forget to factor in the price of admission (i.e. the efficiency apartment that costs 2x my mortgage) when bragging about how much money they're saving without a car.
I have to assume you're trolling at this point. The quality of public transport varies massively between cities.
Almost every city in America besides NYC is built under the assumption of car ownership and, for that reason, the vast majority of people have cars. NYC is the only city in the US where the majority of people go without one, because the infrastructure is in place to support it.
> NYC is the only city in the US where the majority of people go without one, because the infrastructure is in place to support it.
I think you've actually got this backwards. People in NYC would prefer to own a car, just like everybody else in America. The difference is that in NYC it's a lot more expensive and difficult (traffic, parking, etc). That, coupled with the presence of a strong transit system, results in low rates of car ownership.
In Kansas City, to take your example, there actually is decent bus transit [0]. But owning a car is also dirt-cheap and far more convenient than owning one in NYC. So people own cars. I live and work directly on a train line in St. Louis, but I still own a car, because, why not? Cost of ownership is very low -- parking is included at my apartment (and free and easy basically everywhere else) -- and it gives me more options. But I definitely don't need it.
In summary: 1) You absolutely can get around by transit in many (most?) largish Midwestern cities; 2) People own cars anyway because it's cheap and convenient; 3) People choose transit not when it's merely convenient, but when it's more convenient than car ownership.
This comment is exactly on point. I also used to think you could go without a car...then I had two children. Taking one infant or toddler on the subway was difficult. Taking two were nearly impossible. Many stations have no elevator, so you lug the stroller+child up and down stairs and hope someone helps you out. Uber? Not so much -- it is illegal to have a child in a taxi w/o a car seat. We used to carry around a child seat on our storller. Then we had two children and it is literally impossible, so we purchased the car.
I'm not trying to argue over the merits of living in a city vs a suburb. The parent stated that cars cost the same in KC and SF and I'm providing a realistic alternative -- they do not because of parking and ancillary costs. At this point it is obvious we need to move out of the city and it is down to an optimization problem of how much space we want vs how many hours a week i can see my child (e.g., I can live in NJ, but i wont be back home in time to see kids 4+ days out of the week.) I imagine the calculus is the same in SF, but I cannot say firsthand.
> I think you've actually got this backwards. People in NYC would prefer to own a car, just like everybody else in America.
What a weird remark. Have you considered that there might be people who don't fetishize cars like you do?
I very specifically hate driving. I specifically choose which cities I live in so I can avoid driving.
I've tried transport in most cities outside of NYC. It's really not on the level of NYC. Yes, there is a bus system but it's hardly comparable to a subway system where I can get anywhere in the city throughout the night with minimal waits.
>Have you considered that there might be people who don't fetishize cars like you do?
I feel like you might have this loaded as a sort of generic thing you say to people, but it doesn't apply here. I'm talking about the tradeoffs people make in general. Calling me a car fetishist is a non sequitur.
You literally just assumed that millions of people would rather own a car but are forced not to instead of considering the possibility that some people simply don't want to drive.
That doesn't make me a car fetishist anymore than noticing that most people are religious makes me a believer in the afterlife.
What I'm actually saying, though, is far more benign, which is that just as many people would own a car in NYC as in Kansas City if it were equally convenient and inexpensive [0]. People (in general) don't choose public transit merely because it's convenient. They choose transit when it's more convenient than car ownership.
The flip side of this is that high car ownership rates aren't necessarily evidence of nonexistent or inadequate transit. Where car ownership is cheap and convenient, people almost universally choose to own a car (even if other options exist).
[0] Well, clearly not just as many. I don't like driving, either, and New York is attractive to me, too, because it enables that preference. But, still, consider that nearly half of all New Yorkers do own a car, despite how wildly inconvenient that is. Consider also that even in cities like Detroit and St. Louis something like 25% of people are carless, so there's some baseline level of poverty (even in very inexpensive cities) that prevents ownership. All of which is to say that a 50% ownership rate in NYC actually strikes me as pretty high (and as evidence, again, that people really will put up with a lot to keep driving).
Maybe--depending upon your commuting and family situation and what compromises you're willing to make. However, NYC (esp. Manhattan/parts of Brooklyn) is a qualitatively different situation with respect to car ownership and public transportation--and just the culture associated with them--than pretty much any other US city.
I think generally when people respond with COL they are attempting to make themselves feel better about their life's insecurities. --- Such as the fact they don't live in SF or make that much. Best to ignore it, or state that the COL around SF is not as high, such as in Fremont.
It doesn't cost me any more money to by shares in an index fund from Seattle than it does from Kansas City, or Minneapolis where I graduated.
My job offers in Minneapolis and Seattle were similar from a COL adjusted perspective (70k/yr in Minneapolis vs. 130k/yr in Seattle). However, after two years in Seattle my cost of living has stayed flat while my income has grown by about 20%.
Every single penny of that 20% is going into investments, and that makes a massive difference to my expected net worth in 10 years. And I can take that net worth and move back to Minnesota if I want (there are certainly universes in which that's an attractive option).
edit: I do acknowledge that life situations in which COL adjustments eat up or exceed 100% of the income difference between Seattle/Minneapolis could exist, but they are an edge case and certainly not the rule.
I really think it's location, location, location, not necessarily whether or not the software is the product.
I've worked for consulting companies, product companies, and right now I work for a sort-of back-office organization. The best I've been able to do, despite several years of experience, good references, inside connections, a graduate degree, and being pretty (I think, anyway) personable is...75k. And I don't know anyone doing much better unless they moved to SV or NYC.
My long-term plan is to see if somehow I can find the time to find a side-project or contribute to something open source, so my ability is out there and highly visible to anyone considering me, but that is going to be very difficult for where I am now. I'd love to make low six figures, it seems difficult to believe even in SV there are new grads making 150k, and it's frustrating to me because I know I perform at the level of people making that much money.
EDIT: In case anyone was curious, new grads hired for development in my area of the US get paid from about 35-45k.
I'm a self taught developer who have roughly 1 year exp. and moved to Tennessee(40th poorest state in the union, ultra low cost of living) for a software gig last year. I'm black, 30 year old male, and have a resume with more job/career hopping than a con-artist.
I'm not really that great at programming(got fired after 6 months!).....first offer(I took it) was low ball....at 55k!! Next job I took over paid me and offered $92k with zero negotiation to lower it: All within one year.
I've worked prior tech jobs offering $25k-40k and they were usually some unholy mash up of lite programming and I.T. help desk/system admin roles.
From talking to companies, the non-sexy locations have to pay up the ass and fly in talent for open source. The .Net guys around me make bank too.
If you have several years of programming experience and can only get $75k, I wonder if you program in VB or some obscure academic language....I usually have to argue with recruiters to lower their pay requests per hour...in the south.
I mostly have done enterprisey stuff, webdev and desktop, so C#, Python, Java, C++, Javascript, and then a long tail of other stuff. Really good at SQL. No IT stuff.
I can't explain the .NET world, but I think what could hurt me with open-source type companies is my lack of a Github. Nothing I've done for work has been public, my personal projects are nothing I'd be willing to share and, quite simply, the very last thing I want to do when I get home at the end of a ten-hour day is program, especially when I have many, many other things that need to be done - around the house, with the family, etc.
Like I said, my plan is to somehow find the time and contribute, so there's something out there, but it's going to be rough and take a while. But if that's what I've gotta do, that's what I've gotta do.
Overall, I think the biggest factor is my unwillingness to move. I do live in a very poor state. I am very confident that if I went elsewhere I could make a lot more. There are maybe a dozen and a half employers here. Generally the rule seems to be the commercial companies pay nothing, and the government contractors pay by what you can negotiate plus years of seniority.
Maybe I should go the recruiter route - I never have. That's one reason I posted, to see what other experiences are. Thank you.
Slight counter, I'm working remotely (I live in small town in the Philadelphia suburbs) for a company with the US office outside of Boston, making 135k right now.
Target companies who are based in SF/NYC and are otherwise bought into the "expensive engineer" mindset (good signals: using modern tech, top-tier VC funding, etc.). Or just go the consulting route and earn even more.
I hit $85k in DC in under a year of experience without a CS degree (MS in math though). Many places in the country it is easy to hit six figures, and $200k is not out of the realms of possibility outside of the Bay Area or NYC either.
You're the first person in this thread who I think has an ounce of reality about this situation. I looked at this article, saw the proposed income distribution, and immediately realized whoever was writing the article doesn't have any awareness of what things are like outside of the largest urban tech centers.
Isn't that pretty much the O-ring model from the article?
There are companies which value software engineering and those that don't. Eventually all the good developers migrate towards the former (where they are paid well) and the bad developers are stuck in the latter (where they are paid poorly).
I definitely think the bimodal distribution is between firms, not within them. That being said, it's not as simple as geography or sector. There are plenty of remote gigs which will pay 6 figures, and there are plenty of non-tech companies which value software enough to pay $150k+. And there are, amazingly, some "tech" companies who still pay relatively poorly.
It depends on how you define "tech" I guess. There are lots of companies I'd call tech companies that are either headquartered elsewhere or have branch offices elsewhere that include programmers.
Which of these don't have programming jobs at "tech" companies? Seattle (Microsoft and Amazon)? San Francisco isn't technically in the valley... Phoenix (GoDaddy)? Austin (Blizzard, a bunch of non-HQ offices like eBay, Google, Amazon, HP...)? San Antonio (Rackspace)? Armonk (IBM)? Malta, NY (Global Foundries)? Lockport, NY (Yahoo)? Amsterdam (Booking.com)? Houston (cPanel, Practice Insight, AlertLogic)? NYC (Fog Creek, regional offices for Google, Amazon, Facebook, etc)? Raleigh, NC (RedHat)? London (Canonical, Avanti Communications)? Portland (Puppet, some jobs for nVidia, Wacom, Mozilla...)? Boston / Cambridge ( Carbonite, Akamai, LogMeIn, Draft Kings, Wayfair, TripAdvisor ... with offices for Amazon, IBM, Google, Apple, Microsoft, Twitter, PayPal... )? Dallas / Fort Worth and their metro sprawl ( Texas Instruments, AT&T, MetroPCS, Ericsson, Intuit, Match.com, offices of ZTE, US headquarters of Blackberry ...)?
I think you and your siblings misunderstand. I meant, in the bimodal distribution of the post I was responding to, where do the programmers who work for these companies fall? I am one of them, after all.
I suspect even more so. Top school, law review, good federal clerkship, white shoe New York firm and everyone else.
(Of course, that's a gross oversimplification. There are lots of lawyers with, e.g. solid in-house corporate counsel jobs. But the overall "commodity" market for lawyers isn't great these days.)
it's really difficult to get good salary information. glassdoor.com is nice but getting data from them will be pain (you probably cant crawl them). I was thinking about writing some spider parsing Stack Overflow careers or "who is hiring" HN threads. But if you get data in this way you only get salaries offered and not salaries actually paid. I guess salaries paid might differ from what is offered. There was a spreadsheet so maybe OP could check this https://docs.google.com/spreadsheets/d/1a1Df6dg2Pby1UoNlZU2l...https://news.ycombinator.com/item?id=11331223 I wonder if this will confirm ideas about bimodality.
The most important thing to remember about developer compensation, especially when comparing to more "traditional" roles, is scale.
A programmer working at a large internet company may be impacting millions upon millions of people.
Building a feature that lets you collect (or save) a penny from a user every month is worth $240K a year when spread out over 2 million users.
$120M when spread out over 1 billion users.
That's really my answer to the common question at the end of the post:
"I don’t understand this at all and would love to hear a compelling theory for why programming “should” pay more than other similar fields, or why it should pay as much as fields that have much higher barriers to entry."
Scale is not the most important factor. It really is about supply and demand. If employers could get away with paying their developers 30K a year, they would (... and they do whenever possible).
The actual scale of the work certainly informs the compensation, like it might for other jobs like journalists for example, but that is only part of the story. If you need developers, you simply gotta pay them salaries the are competitive with what others pay for that particular role.
Scale is part of the demand side of the supply and demand equation.
Using dkopi's example, at a company with 2M users, it's worth hiring a developer for each "penny per user per month" problem. A company with 1B users, it's worth hiring a developer for each "0.002 pennies per user per month" problem.
Or similarly, if you look at developers who work on internal tools that save other developers time. At a startup with 40 employees, each new tools developer must save everyone else two days per year. At a large company with 20 000 developers, each new tools developer must be able to save everyone else 6 minutes per year.
As the scale gets bigger, smaller and smaller problems become worth hiring people for.
Scale IS the most important factor, because it controls the "demand" side of "supply and demand". So long as hiring someone makes the company more than they cost, the company will be willing to pay that price. Because software is so well leveraged in creating profits, it means there are nearly infinite spots where companies could make a profit by hiring a developer at current rates. The rates will continue to rise, and the supply will continue to increase, until it has hit equilibrium.
That's hardly the most important thing about developer compensation. The value a worker provides is a ceiling on their compensation, not a floor. As long as the "large internet companies" are receiving applications from more than one developer, they are unlikely to be paying $240K / year for developers who produce $240K / year of benefits. If the same people can handle building that feature for 2 million users and for 6 million users, the developers who get hired to build it for 6 million users will make 1x as much as the ones who build for 2 million users, not 3x.
How much impact does a laborer repairing a Dutch dike have? How much of that impact do they earn?
Construction workers are traditionally resources, They can be quickly replaced. With software this becomes tricky. You need to spend considerable time, amount and energy to find the correct replacement who can drive it with same efficiency. The 2 reasons why companies like Google, Facebook etc pay so much is because:
1) They want to attract the top talent, top 1%, 5% may be.
2) They want to keep people happy so that the key people working on most important features don't leave the company.
And this is where the supply side of the equation comes into play. Many people can build the road and there shouldn't be any differentiation in how it is built (assuming they have common engineering standards). Thus, the supply is almost perfectly competitive causing low wages.
However, there are infinite ways a developer can make something. 1 developer can make design a system that can save/make their company millions that most other developers would miss. The supply side of developers is more like a monopolistically competitive market. Thus, they can extract some of those savings/profits in wages.
I was thinking along that line too. In traditional more "human" field, a good lawyer/ doctor can just do that much, regardless of how good you would be.
It would be interesting to compare revenue or profit per employee for tech company, comparing to law firms and the like.
Another thing is that we believe (ie. The Mythical Man Month) in software, there is a limit of programmers per task before you just can't throw any more body into it anymore. Is this true (or still true), and does this apply to other fields of comparison?
Immigration could likely be a bigger factor than we thought. How long has developer compensation been skyrocketing? The immigration situation to the US has only been getting shittier for the past 5-7 years mostly (although it wasn't flower and pleasant before that, if you wanted to do startup or worked in the US with a job offer, it's several folds easier back then). And seeing that it takes like 5-7 years for a startup to mature, even longer for immigration "market" to catch up with reality (it takes a long time for people to decide or to immigrate in general), it wouldn't be a surprised that compensation is still lopsided for the US.
> there is a limit of programmers per task before you just can't throw any more body into it anymore
This is important. The effect is that to complete the task you have to effectively scale the team up, you can't scale horizontally, which increases demand on top talent.
It means that if a programmer is (theoretically) 10x more effective than an average programmer he may get much much more than 10x the pay.
Funny thing that I was having a discussion with one of my friend who is in the middle of salary negotiation. The company is pushing him hard to accept the offer well below than his expectations and he was expecting more hike as he was relocating to bay area. He was quite disappointed that he didn't get the salary figure he was expecting but still wanted to accept the offer as he didn't want to loose the opportunity. We discussed at length about how the salaries in software ended up like this. Why are they not transparent like finance guys, lawyers, doctors etc. This is also the standard structure across the world for all software industries irrespective of the country. The salaries are not transparent and the developers are kept in dark.
How did we end up like this? Is it not a bad thing for the company that employees are demotivated when their pay sucks? I feel it is a very basic thing. To make more profits you need to build better products and sell better. How much can you save on operating costs by paying employees less?
I feel the companies & HR needs to modernize itself. There was a time, you could get away by paying a particular employee less and he may never find out. This is an Information age!! Information freely flows. There are many sites like Glassdoor, Paysa where people can go and find out more about salaries that you are paying to your employees. It is no longer a well kept secret. What is required here is that companies and HR's understand this and make salaries open and relevant to the value produced/added to the company.
Since the early managers probably didn't understand the dynamics they went with what they could do best at their time. I feel this model of negotiating a salary based on previous salary should be deprecated. It should be replaced with a more open model.
It doesn't hurt much to know that the next guy is getting paid more than me, if that guy truly deserves it and produces much better code or is adding more value to the company than me. What hurts more is that to know that the company values the other guy more and pays him more just because he is straight out of college or gets lucky at salary negotiation.
I think it is time Developers & Engineers talk more freely about their salary.
> Why are they not transparent like finance guys, lawyers, doctors etc.
The average banker or lawyer is an order of magnitude better at negotiation and valuation than the average developer. It's literally their job. For a finance guy, not optimizing your compensation package is sacrilegious.
Meanwhile we have still have lots of developers who think it's absurd that they'd even be paid $100k and don't want to think about money at all. [0] They drag down compensation for themselves and for others.
Unfortunately it's not simply a matter of information. You can tell people that the market rate for their position is $200k/yr but they'll tell you that's absurd, that they think it's too much, or that they'd rather just focus on code.
Doctors solved this by sharply restricting supply and making it illegal to practice without being part of their cartel.
[0] Seriously, on HN people regularly complain about making too much. Even in this very thread you can find people who are skeptical of high salaries: https://news.ycombinator.com/item?id=12588504
I was interviewing in Spain a while ago, the salaries are fairly poor here. Some guys with ten years experience were asking for very little. I should have told them to up their requirements.
At the same time none of them seemed very enthusiastic at all.
> Why are they not transparent like finance guys, lawyers, doctors etc
In the world of top-tier law firms the "transparency" actually works against the incoming lawyers. You notice the quote in TFA: "Cravath announced that it would pay first-year associates $180k, and many other firms followed suit"? I see that as an implicit agreement to fix prices among these top law firms. I'm sure they're not foolish enough to actually collude on salaries, but Cravath knows exactly what it's doing when it says to the world "this is what we're paying our employees, sound good?"
Between me and my friends we are readily open up about salary and rates. Not just that we also are open about bills, benefits we pay etc. It's not the salary, but what you take home after all the bills are calculated.
I'm in a similar situation, and have had this happen so many times. I explicitely state when starting the process I'm a contractor. I lose wages when I interview, so I want to ensure we're on the same page. It's also an allocation of your companies time, and resources interviewing me. This is my minimum, are you able to meet it. Because between software projects, phone screens, and on sites. That's alot of time sunk into an application, and again your resources interviewing me. I've had so many times, after all the work get to the offer stage and it's 20k to 50k short, after they ensured me they could meet the minimum. I've renegotiated at times, but it's like pulling teeth. One company even tried shaming me, for not putting enough value into the awesome company culture. I'm here because I love your company, but if you don't want me worrying about bills and retirement during working hours then pay me a decent rate.
I just got an offer 10k shy of what I asked. I already took 30k off my current rate, because it was a less populated area. I can cross counter negotiate or come up with other ideas. What got me was that it's based on me being a "junior" in the stack they use. I don't like the inflated use of senior. But a good techie/programmer can move from stack to stack.
If we were more open about rates and what's avaialble. I think it would do more good.
i think there is a lot of embarrassment discussing salary because it shows how you're valued by the company. I get uncomfortable discussing mine because i don't want to provoke jealousy. However, if i was paid less than most i'd find it embarrassing to admit the company found me less valuable than others.
Discussing with your peers how much you are being paid is the only way you figure out your value.
Companies are quite opaque and it's hard to know what you are worth to them, that's why they don't disclose this sort of thing. (and get angry when workers discuss it)
You would do yourself (and the people in your world around you) a whole lot better service if you worked together, rather than worrying about embarrassment.
> The company is pushing him hard to accept the offer well below than his expectations
That sounds like leverage. Did he ask for more? Depends on the company. Lots of small companies can't pay what Google does. Also possible that your friend's expectations aren't realistic.
> How much can you save on operating costs by paying employees less?
In a software business, a lot. Employees are the primary operating cost in many software businesses.
> Why are they not transparent like finance guys, lawyers, doctors etc.
I could be wrong, but I believe most employees in all industries in the US are either asked or implicitly expected to keep their compensation to themselves. I also believe that salary-transparent organizations outside of public institutions (government, universities, etc) are fairly rare. Salary is default private AFAIK, has been for a long time, and has nothing to do with software vs other industries.
There is a big difference between back-office and front office or finance pay. I'm sure back-office monkeys get jockeyed around for at little as possible in salary negotiations with promises of a huge bonus to help them ignore it.
Law pay is great on the upper on end and a shit show on the lower end. Many lawyers are self employed for a reason.
Doctor pay IDK much about but given the small pool of applicants, it makes sense to be transparent.
Does anybody else think the salaries are a little high? Perhaps the sample size is skewed? I'm somewhat senior in software engineering, but I literally don't know a single person making over 200k. Nada. Not one. I also don't know any college grads who started making 150k. That seems absurd, unless you're only looking at certain companies and top performers or something.
I do know two people making over 200 k$/yr in base salary as pure programmers. They're very good at their jobs (Interestingly, as far as I can tell, neither of them are "brilliant" technically, merely "good". They just combine that with incredible work efficacy and solid communication skills.)
That said, I know bunches who will make over 200 k$ in total liquid comp this year. And before you pooh-pooh the equity part, if you've been at a public company for more than a year, equity's pretty much the same as cash (albeit a slightly unpredictable quantity thereof.)
Where do you live? The numbers you are mentioning sound sound very realistic in the Bay Area, if you are talking about total compensation (salary + bonus + equity).
I'm going to be pretty upset if these salaries aren't at least a little high, because I'm nowhere near that even after 25 years experience and a master's degree.
> Programming also doesn’t have a licensing body limiting the number of programers,
> nor is there the same prestige filter where you have to go to a top school to
> get a well paying job.
This is my favorite quote from this article. I went to a great school and even though it wasn't Berkley, Stanford, MIT, or CMU, that qualification has never limited my ability to get great opportunities.
While it's true that a prestigious degree is not strictly necessary for obtaining a good job, in my experience, it helps a lot in getting your resume nearer the top of the stack for those job openings.
My experience so far is, i've made more opportunities for myself going to the bar/pub/coffee shop after a meet up to shoot the shit with my peers than anything i've ever put on my resume.
Your degree is largely just a way to break the ice with some companies, hiring manager x went to school y so he knows that you must be as good as him. Simplified greatly obviously (you still have to know your stuff), but networking is hugely important
However, there are reasons for this. It's quite difficult to gain admission to a top law school, but the people who apply tend to come from very low attrition majors like history or literature. Furthermore, attrition rates from elite law schools are vanishingly low - less than one half of one percent. Lastly, interviews in law firms are actually interviews, not a series of oral exams.
You don't need a degree to be a programmer, but it helps. Think about what you had to go through to get that degree. The curriculum is relatively standard and is highly rigorous at all "reputable" schools - and by that, I don't mean elite, I just mean real CS departments. Attrition rates for CS majors is very high. At the graduate level, attrition rates remain quite high - PhD programs have an attrition rate of 35%-50%, depending on the field - and that is true of elite programs. Athough MS attrition rates are lower and I've found less data on them, what I did find suggested about 30% - and keep in mind, you have to make it through a high attrition major to apply.
On to interviews. I actually did go to Berkeley for an MS, though not in CS (I did the MS in IEOR and as a cs-ish math major for undergrad), and maybe that was instrumental in getting an interview at Google, but it sure didn't exempt me from the same technical grilling everyone else goes through! It was about 5 hours of what I considered to be genuinely difficult whiteboard exams. I actually felt OK (not great) about my performance, though it was ultimately a no-hire.
This is why I don't agree that programming has a low barrier of entry, especially if we're going to talk about a bimodal distribution. Where you went to school is less important, but that's because getting through is so difficult - we don't have these vanishingly low attrition rates in our field, even at elite programs. And the interview process is very, very difficult.
Great analysis from this post, and very interesting data, but I think it does miss the mark when discussing why programmers are well paid at the elite level. The claim that "U.S. immigration laws act as a protectionistic barrier to prop up programmer compensation" is indisputably true, but I don't think it explains much - if this is true for programmers in the US, it's just as true for every other field. In fact, it may be the reverse - programming does have the H1B visa, so if anything I'd say programming is subjected to a higher level of international competition for jobs located in the US than other fields that require "current right to live and work in the US".
Ultimately, I think people confuse the absence of formal barriers backed with the force of law with the absence of barriers in general. Considering what I went through to get my degrees (in high attrition rate fields), and the kind of problem solving, math, programming chops, poise under pressure, and presentation ability it takes to get through google-style interviews - you know, I really don't think we face considerably lower barriers to entry than law. Different, more porous in many ways, more fluid. In law, you must (in general) attend a law school, whereas in programming, there are multiple paths toward getting that knowledge and those top jobs. But it's actually not at all easy to break into the elite level of this field. I'd say barriers to entry are actually quite high.
Developer compensation is high because developers produce more valuable work, and in the short term the labor market isn't that efficient. People don't make very efficient initial choices of career, and their initial choices are fairly sticky.
In the middle of a gold rush, how does it happen that people change their plans, and go out and mine the gold, sell the pick-axes etc? Dropping your plans generally sucks. All else being equal, you'd rather not. And you probably know less about the opportunity than the one you're pursuing. Because not everyone is going to drop everything and go mine gold, if the gold mining is profitable, the people who do pursue the opportunity are going to do very well. And that'll continue to be true for a long time — because people just don't respond to these opportunities that efficiently.
As a comparison: in Australia during the mining boom, the salaries available for work in the mining industry compared very favourably to other industries. And yet I knew lots of smart high-school grads starting degrees in fields like chemical engineering, aerospace engineering, computer engineering...Smart kids would eagerly enroll to study fields where there was no industry to speak of in Australia; even though a lot of them weren't planning to move overseas. In the meantime, salaries for mining-related fields were sky high.
My hand-wavey, empathic read on this is that following price signals into a field you don't have a particular affinity for feels somehow wrong. I think smart kids are very vulnerable to this sensation. They feel like simply going into the high-paying field is somehow too "obvious". It's an affront to their sense of individuality. I think the small/large company thing is in part a similar effect.
It's say it's the "smart but not intelligent" kids that are vulnerable to that. The "smart kids" ride the wave to get their foot in the door and pivot into something more stable.
Being the local subject matter expert on a relevant topic or straddling the management/technical line goes a long way. Look at what happened in the defense industry in the 1990s and tech in the 2000s.
Being able to code well and having domain specific knowledge is more valuable than just being able to be a rock-star. When times get tight companies shed weight (people) and carrying around a splitting maul is a better deal than a sledge and wedge because it even if it's a little less powerful overall.
The discussion about bimodal pay distribution is interesting, but I think there's a much more parsimonious explanation to it. Most of the companies that are going to be paying software developers $150k+ are based in or around SV, where rent is abnormally high.
But what's even more interesting to me is another question the author discusses halfway through the article:
> How is it possible that programmers are paid so well without these other barriers to entry that similarly remunerative fields have?
The author posits three hypotheses: 1) supply of programmers is naturally low, 2) immigration laws keep the supply artificially low, and 3) the overall relative efficiency of American companies create a productivity force multiplier for everyone at the company, including programmers.
I want to introduce a fourth hypothesis, which is that programming skills are highly commoditized, which causes demand for those skills to increase.
If I work for OmniCorp using 100% proprietary OmniCorp technologies, they have no reason to pay me more than the bare minimum because I'm effectively married to them. If I work for OpenCorp on a 100% open-source stack, then the buzzwords listed on my resume prove I can be productive at thousands of other companies, giving them all incentive to compete for me.
But isn't OmniCorp married to their devs too? Those devs probably took a while to get up to speed on the proprietary stack, and outside devs would have a ramp up time. Not to mention outside devs would be hesitant to take the job seeing as they'd get stuck learning proprietary technology making them less mobile.
There's actually a practical case study in this. Epic Systems, which uses MUMPS, is reasonably well known for hiring naive college grads, teaching them MUMPS, and then exploiting the crap out of them.
Tech is a vast field. We are having trouble finding a Django developer where we are. Project managers decision to hire based on this, my opinion is we should look for a good all rounder, as Django knowledge only makes up around 25% of the knowledge that is needed. Someone that knows HTML, some JavaScript, any other framework, how to set up remote servers and use a database effectively. If your only skill is Omnicore, your suggestion makes sense, but there are so many different things to learn, that having a wide knowledge base makes sense.
I agree with all of that. It's a complex issue. And it's compounded by the general "we have no idea how to hire developers" that is found throughout the industry.
Do they? If you're the one developer in the world keeping their tech going, and the nearest next developer is 6 months of ramp up time away (plus the time for the hiring process), you'd have some leverage.
In this hypothetical scenario, the developer has no leverage to renegotiate, because they have no job options outside of OmniCorp, hence, no BATNA (best alternative to negotiated agreement). If the developer was homeless or independently wealthy, and not in need of a job, they might have the ability to terminate the agreement without reaching a new one. Then the company would truly have something to lose.
But OmniCorp knows that the developer has to pay rent, and no other company is going to offer them anything but an entry level job, because the only experience they have is OmniCorp this, OmniCorp that.
It may seem far-fetched, but believe me, this discussion is hitting close to home for me. My team is currently moving to a highly customized tech stack that is open-source, but has zero or near-zero adoption outside of the company. It's scary; I've been in software for eight years and I feel like I'm fresh out of college. If you're in software I hope it never happens to you.
It happened to me. I got out of it by studying open source tech stacks and building side projects until I could get a job away from the proprietary stuff. It wasn't ideal, but I managed to pull it off.
I'm mostly playing devil's advocate with my replies. It's generally better to stick with mainstream -- and ideally open source -- tech. But I don't entirely agree that proprietary tech is only beneficial to the company in these scenarios. They are taking risks that the employee can take advantage of. Heck, for me, that proprietary company still contacts me on occasion to see if I'll come back.
dont forget, when you can easily apply for 1000s of other jobs, they can also easily find 1000s of ppl out there to replace you. and as far as OmniCorp goes, you know how much IBM is paying now for one of their mainframe programmer? those guys... you lose one, you wont get another.
The assortive matching is very real, but whether that's related to salaries is another matter. I live in a far smaller tech market than the valley, and it's plain as day. We might have about 20 large employers that use the JVM. Out of those, it's so easy to see the good from the bad that many of the good places are skeptical about even giving an interview to someone working in one of the bad ones without a reference. Interestingly, places can transform by altering the way they hire and who they retain: I have worked for a place that was known as a terrible place to be, and changed their fate by building a very good interview process and laying off the weakest side of their staff.
I remember doing the climb from the bottom myself: Few places hired new grads, but the ones that did hired pretty much everyone. it only took a few weeks for teams to realize who knew how to program and who didn't: inter team communication quickly became a network of the people that could get things done. Eventually, as people came in and left, the high performers started taking other high performers with them to better companies, where similar sorting happened again, but with a higher floor.
What I have seen instead of big salary differences is that the best firms have better management and treat developers better: Given that outside of consulting, the market has relatively well defined maximums, the good developers congregate in places where the work is more rewarding and doesn't put high tolls on peoples' lives.
In the valley there are companies that get so much more value out of developers that they can pay more, but even that has a ceiling, and when we get to that ceiling, being good companies to work for becomes the next differentiatior.
Being a physician or attorney confers additional compensation in the form of social status and prestige which I think it's fair to say we don't get by virtue of working on code. I also think that as a general rule there is a fairly small percentage of people who like programming, and can sit in front of a computer and focus on code for hours at a time and consider that a fulfilling way to make a living. I doubt that percentage is ever going to be much higher than it is now.
Social status and prestige is all in our minds. You can code and be very respected in society if you act that way. The problem is that the type of work attracts (filters?) for introverted behavior. The folks that aren't going out and being flashy.
You can find salaries data by looking at Swedish IRS, the numbers are public, but may not be in digital form/easy API yet.
But you can order a catalogue from a redistributor, containing every persons income from work and income from capital and taxes payed, for previous year. Would not take much to scan it and analyze.
This is nice, and should give a good picture of the industry as a whole.
The data probably masks those who are self-employed subcontractors and take a lower salary in order to lower taxes at profit time, which should effectivly double or tripple the reported salary.
Ofcourse, it does get a bit difficult to compare this data vs USA, because we have social necessities already payed for by the high tax of the collective workforce, such as health care, pensions, safety, and many other insurances.
So, say average is 42 000sek per month, that gives about 59 000USD per year salary. Which may seem low compared to USA, but behind those 59 000USD, is 31.49% in taxes for things we enjoy.
FTA: "One possibility is that we have a shortage of programmers. If that’s the case, you’d expect more programmers to enter the field, bringing down compensation."
This is imo a big part of why high-end salaries have skyrocketed, but the author's reasoning is total "let them eat cake."
It's not that there's a shortage of programmers overall. There are lots of programmers working non-industry jobs for relatively piddly salaries who would leap at the opportunity to double or triple their compensation at a big name tech company - if they were qualified to do so.
The problem is that there's a shortage of people who have the aptitude and skills to work in a big tech company with very high expectations for even their entry-level engineers. I don't doubt that there are intangibles at play: soft skills, "cultural fit" biases, to a lesser extent academic pedigree, but none of that trumps needing to be an actual honest-to-goodness engineer, rather than a "programmer".
Plenty of other pieces (citation needed) have been written about the growing chasm between the two classifications of development jobs - engineers who can create software, vs. programmers who can write code - and I think the salary differences are just an aspect of that.
My working hypothesis is that there's more programmers in the "very good" bucket that don't care all that much about monetary compensation than in other domains. As long as a certain X that is deemed fair is reached they are way more interested in interesting problems/an opportunity to learn new things/access to hardware or data they couldn't otherwise get etc.
Or in other words, (good) programmers care a lot more about motivating factors than hygiene factors than other employees.
I have no data to back this up, only a gut feeling.
I think this is true to at least some degree. I have noticed that the better paying jobs here are Java or Microsoft stacks, probably more corporate style jobs. Personally I prefer working in a smaller place in Python, and feeling genuinely valuable to the company, having done some corporate stints earlier in my career.
I do not have US data but in India a few friends and relatives living in same city have 5:1 ratio in compensation for same no of years as experience. The lower ones are in traditional IT job others in mobile app / big data.
I think in US it will be same cutting edge skill vs traditional skills.
I work for a large, well-known tech company and they just re-titled all of their front-end engineers to "Software Engineer" (probably to stop creating a pay divide between front-end and back-end engineers). If you have a "Software Engineer" doing basic wordpress stuff, another "Software Engineer" doing PHP/Zend framework stuff, another doing pure JS/React/Angular stuff, and another doing backend services (concurrency/spring boot/API, etc) - the pay scales of all these "Software Engineers" should be different.
Having been in the hiring and compensation path at a few companies both north and south of the boarder, this seems to only apply to the US, and in particular silicon valley.
Up in Canada, the compensation seems to be more of a normal distribution.
Tier 1: Those who solely re-implement. You can do a lot copying and pasting. It's just not worth as much money.
Tier 2: Those who re-implement while creating anew, typically in specialized areas or occasionally very well over a wide range of tasks.
Note the importance of re-implementation to both job tiers.
> Problem with coding is that there are 1st,2nd,3rd, and 4th level programmers.
I'm a star-guy-from-big-name-cs-school, and I'm developing complex systems from scratch. However, few people from my promotion are actually doing that, most of them will work on mobile/front-end or small webservices in a random B2C startup (something that will fall into the hacking category?).
Your school and your degree will only matter for your first and maybe your second job. After that, experience is more appreciated.
> Then there is the issue that after 40 you can't get hired unless your connected,
Well that's not been my experience on the east coast. Most developers are over 35 in certain companies: finance, defence, high-status non-profits.
Sure, there's a clusters of 20 year olds without degrees slaving away in the same vertical, but they're not in the same companies.
I think for a young person, its harder to get a job unless you have a 'hot' skill because hot skills are typically in new strategies and technologies where the hiring pool is shallow.
For an older person, your experience means that you can get a job in even a 'dead' skill. Some people work using Java 1.2, some people work using Django/Rails instead of SPA Javascript. Some people get hired solely for their ability to write competent Fortran.
I don't think you need to be well connected to have these jobs. Most of those I know who got hired into them it was due to a recruiter, and not a personal invite.
> Well the first rule in developing is 'lifestyle', I agree with you 100% that if you willing to work in a shit-hole be that east-coast or houston, or any shit-hole in USA, sure there will be a job
Did you just call an entire continental coastline a 'shit hole'? An entire coastline of 112.6 million people, dozens of cities and weather ranging from cold-temperate to near-tropical?
Well, I must say I'm surprised. I knew people liked San Fran, but I never thought I'd meet someone who loved the place so much to the point their rose coloured goggles lead them to denigrate 1/3rd of the US population.
I see bimodal grade distributions all the time. The more technical a subject, the more bimodal the grades.
In fluff subjects like software engineering where grading relates to essay writing and group projects, grade distribution tends to be gaussian. OTOH in technical subjects where I grade by automated test suits, basically students fail almost all tests or pass almost all tests.
These grade distributions have been constant, regardless of university, regardless of who teaches the course.
There really is a sharp threshold that separates those who get programming from those who don't. And those who get programming really are a lot more productive than those who don't get it. Moreover, once you get it, learning further parts of CS (e.g. new algorithms, new programming languages, new OSes etc) is much easier then if you don't get it, and learning new things makes you even more powerful. The mastery of doing great things is joyful and makes you want to learn more. The frustration of failure drives you away from the subject.
I find it plausible that grade distributions turn into similar income distributions later in life.