Programming is hard
dorinlazar.ro
dorinlazar.ro
The same is more or less true for programming. A simple stack of JS, HTML, and CSS is pretty easy to get going. And if you're content to make marketing sites for advertising companies or similar, then go nuts. That's your simple jam and you rock out on it as much as you like.
Other people want to learn violin or weird keys or timings or cross rhythm. They want to woodshed some African drums and mix them into complex arrangements. And you know what? It is harder than playing a simple guitar for a simple song.
We have the same thing with software, and once you've put in the years you find a sort of series of specializations that make you stand out a bit more and get you a bit more money.
So when people say "programming is easy" what they really mean is that it's easier than most people expect it will be for the financial incentives it provides. Compared to, say, structural engineering which takes four years of focussed study then a long period of practical understudy, software is easy and it pays more. Almost any structural engineer can become a data analyst or junior data scientist and make around double the salary within a year or two.
Yes we've all had the frustrating semicolon days, but there are highlights too. Fast feedback, ease of learning new technologies, ease of scaling to millions of customers. There are many advantages and I think they make up for it.
Yet you don't tell us how old you are, so it's hard to get a grasp for how long you've been programming. As someone who first started programming in 1979, I notice that there are plenty of people who say they've "been programming a long time" who weren't even born when I started programming. This isn't a criticism, just a comment that we don't really have any idea how long you've been programming. I can picture a 29-year old saying the same thing you did. Time is relative, something that becomes more and more clear, I think, the older a person gets.
NC State was celebrating 40 years of CS in 2006 or so and they weren't the first. CS degrees have been around since the 1960s, so 50+ years at this point of CS as a separate degree program in the US. Apparently Cambridge offered their first CS degree in 1953.
I have a good friend that worked during the 60s era programming with punch cards doing applied physics work in FORTRAN (pre 77) which was already pretty big by then. You could probably go back a bit further but I don't think much was being actively taught as a sort of course one might expect today then. So I'd say you could have at most 65ish years of programming since formal use in college.
No, it was not software engineering at the time per se but I'd absolutely call it programming.
Story goes that she had a campus job cleaning, and made good friends with the guys in charge of running the mainframe by bringing them food and drinks when she stopped by. Which of course meant she could often get them to sneak her stack of cards into the queue overnight.
Details are fuzzy since I last heard the tales over a decade ago, and haven't dug the assignments out in forever.
You could easily have a CS degree and be past normal retirement age.
Was quite common to do 2-3 years then drop out and start a job. So much so that people with degrees were often looked down on. Exceptions for things like MIT.
After year 3, there was nothing left for me to take. So I took a job.
I would like to have a degree, but it was the right call at the time.
Few years ago I went back and started an Art degree. Was a blast.
Per Wikipedia, 1953. Coincidentally the same year that RMS—not exactly the youngest programmer around—was born.
But that waa a graduate degree. Undergraduate probably sometime between then and 1962 when Purdue opened the first full CS department, I would assume.
I absolutely love that there are seasoned experts like you on HN.
Would you mind sharing with us what you're working on these days?
Compared to you I'm relatively young (I've been programming around 26 years) and in my circles I don't get to mix with too many older programmers.
Would love to hear your thoughts on career trajectories.
For me personally, I'm gradually spending less time on pursuing commercial interests, and more time on pro bono projects - and I love the idea of working on open source software indefinitely once I retire.
Cheers from South Africa.
I have many authors to thank.
I've been extremely lucky to mostly have worked with mostly ordinary programmers with some extremely good[1] thrown in and luckily even with the brilliant ones all except two of them were also down to earth and nice as well.
[1]: "master of all trades", all-knowing teacher types with "saintly" patience, learns-anything-in-two-hours-and-proceeds-to-fix-hard-bugs-after-lunch
Programming became a lot easier when Visual BASIC and Delphi came out. Just drag and drop controls.
Due to ageism I am sure I don't fit the culture of a startup or relate to 20 somethings. They hire them young anyway not old. So I do tech support for family and friends to get by.
Whatever you believe, your brain, like a sentry, will find confirmation for. Be careful with that.
(And this can work on in a good way too -- if you say to yourself maybe: I like these people, I like most people, what matters is not age, but if the others are curious and want to learn new things)
Now, of course I do believe that ageism is a thing, still, I'd think there're somewhat many good workplaces that aren't much affected by it
I can learn any language on the market if I wanted to. I am a quick learner as I have the theories of computer science in my head as I learn.
Have a nice weekend tomorrow
Work on projects, not at jobs...that’s my advice.
I wasn't part of the couple waves of programmers, but I think it is fair to say I was in pretty early. Retying out programs from magazines isn't even something most programmers have considered these days, let alone programming without the internet.
But the essence of your comment is right. Of course there would be people out there that have programmed for twice as long as I have. That's a little frightening to think of.
Oof, this takes me back to the day I learned about RAM the hard way. I was typing out a program from a magazine. It seemed like it took forever, even then. About halfway through the computer rudely informed me that 4K of RAM is not, in fact, enough for everyone.
I learned originally on a VIC-20 by typing in games out of books from the public library. At some point we upgraded to an XT and a friend sold me a copy of Power C for $20. It came with a beautiful hard copy library reference and the rest, as they say, is history!
Check this out for a trip down memory lane: http://www.mixsoftware.com/product/powerc.htm
Yeah, the graphics library was great! When I moved on to Linux and gcc, I was disappointed for a while that I didn't have all those super simple primitives to work with.
I'm still retyping stuff from stack overflow instead of copying. I find it really effective to really think through the code you're borrowing from somewhere — because once it's committed under your name, you're the one responsible for it.
As Morpheus said, “Time is always against us”.. so I just made sure it followed our coding standards, checked the test cases, and moved on.
But, I am old enough to remember code listings in magazines. I like to think the typesetters introduced deliberate mistakes because they hated the work so much - not to disrespect the fine profession of typesetters, but when you set your 100th `Poke` command in a row, you might think this isn’t what you signed up for..
Numerical Recipes in C. Had the hard copy but not the disk.
Often the code was just to obscure to work out as you typed, but there was some real value to typing it in. You got some real feel for it. Additionally it offered hard lessons in writing test cases.
When I compare the skill involved with something like violin versus the skill that's needed to validate HTML forms with JavaScript or creating an application in Visual Basic, I really do not believe that people that happened to study software at a young age happen to be geniuses just because they did. Yes I'm smart, but I really believe that this path could be open to anyone that age if they have the interest and I think the internet has unlocked many people that have learned the same skills without the credentials.
If it was more practically-orientated, then I agree with you :).
> everyone seemed to think I was smarter than I believed I was. I feared I might fail miserably and finally prove how wrong they were about me
I can totally relate to that. Once everybody told you you're a genius, the pressure not to fail is incredible.
I started programming at 8. I got next to no help from my parents or my teachers, until the time I entered college, and by that point I felt I knew as much as the professors, sometimes more. I always avoided talking about programming, since that would get a me more genius calls on top of what my grades got me. And it doesn't help with making friends. Over the years I had maybe one or two friends who knew about it. Few would've believe me if I had told them what I could do.
I feel like there's nothing special about the path I took. I feel like anyone would be able to achieve the same knowledge I did given enough work and support. I must have spent thousands of hours programming in my teens. What nobody seem to realize is that the genius label is wrong, what they really should have told me was that I was "passionate". Anyone who is passionate enough can become a master.
That's what I think about when I hear people complaining about gatekeeping in our field. The books are open, the courses are there, interesting and useful applications abound. Given the same level of effort I think much of the difference between social groups would vanish.
I no longer believe that "anyone with an interest" can be at the same level as someone that can just see the answers, with little effort. Some people have fewer/shorter tendrils.
This has definitely changed the way I interact with people. I used to get frustrated when people, who I thought should be able to understand, couldn't. Now I realize that they just can't as easily. They need that picture drawn out for them, and even then, they'll never see the nuances or perceive the textures of the problem, unless you point it out to them.
I think I'm lucky for being born with the mind that I have. It has made my life easy, pulling me out of poverty, with a mostly addictive enjoyment in what I do. I think you're probably luckier than you realize.
Your ability to 'just see the answers', in this framing, stems from having a lot of data points readily available and the ability to combine them together quickly.
There are definitely people who are better at remembering things, and piecing multiple ideas together quickly, but these are also skills that can be trained. I think it's likely that a lot of 'intelligent' people are simply people who actively (though usually not consciously) train these skills because they enjoy them.
In the same way that many fit people don't have to think about exercising - they do it because they enjoy it or without any particular goal - there are people who see an interesting problem and immediately start thinking about how they might solve it or how it's similar to other problems they've seen.
In the same way that anyone can implement a training regime to improve their fitness I think anyone can implement a training regime to improve the number of data points available to them (read lots!) and their ability to combine that information together (solve puzzles, especially theoretical/not personally applicable ones like "how would I get that boat free?").
I think it's odd how many people make up their own private theories about these things :-)
When there's research available about how intelligence "happens".
If you’ve got links/references/keywords for research that invalidates (or validates!) these ideas please share them, I’d love to look them up. From what I’ve read the idea “intelligence can be (at least in part) described as having knowledge and being able to apply that knowledge to new problems” is a well trodden one.
I haven’t seen much on the idea that some people may be predisposed to engaging with stimulating situations, so anything you have on that topic would be highly appreciated. I have seen writings on how a stimulating environment is important, and on how encouraging engagement can be effective (for example asking questions of children and allowing them to answer, vs answering for them).
[edit] In my original post I should probably have written “is to frame a lot of what people call intelligence as” - I definitely don’t think this is all intelligence but I do think it has a significant role in what the gp was talking about, this ability to see answers quickly.
Ok then i understand better what you mean.
Actually there's a word for that type of intelligence:
Crystallized intelligence.
And I had another type of intelligence in mind:
Fluid intelligence.
I think we spoke past each other (or I spoke past you) thinking about different things.
Anyway, one of those, one can improve eg by reading, getting life experience. But the other one, is fixed (from what I've read) once one is grown up.
If you want to, you could websearch for those words. And also, wikipedia has a section about intelligence and inheritance (hint: life is unfair).
> I have seen writings on how a stimulating environment is important, and on how encouraging engagement can be effective (for example asking questions of children and allowing them to answer, vs answering for them).
That sounds great :-)
From what I've read, those things do work (!), when one is a kid / young. And from what I've read, it also prevents the brain from deteriorating, when one is old (using one's brain reduces the risk for dementia).
(Thanks for the reply)
I'd never say of myself that I've been programming "for a long time", let along "a long, long time".
I'm not really sure what to work on next. I was focussed on arms control for cyberweapons for a while, and I made some real progress, but I want to work on something new now. Maybe finding a way to scale up good things like trust or good will? I want to find something where I'm making the world a better place but also working on something that makes me smile. Trying to fight weapon dispersion is exhausting and discouraging and, ultimately, as I learned, futile.
Have you made any progress finding something new to work on?
Maybe I'm projecting here, but I'd imagine this is the dream of most of HN, no? But I don't know which is harder: finding such a unicorn idea, or executing on it once you've found it.
Have you considered working in the cryptocurrency space next? I think that would satisfy your desire to find ways to scale up trust. One of the key value propositions of crypto is building trust at scale on the pillars decentralization, cryptography, game theory, and economics.
Wow. Flashback. I started programming late age wise (college freshman in the 90s), because until that first student loan we didn’t have enough money to buy a computer. I would go to the local bookstore and copy code out of the programming magazines and books. I remember writing some c++ code, bumping into a problem I couldn’t solve and driving to the bookstore to look at the books for a solution.
The most horrendous application I ever worked on was a java servlet app where the original developers didn't understand thread safety. They didn't let that stop them though. Every collection was a synchronized list or concurrent hash map, every access was wrapped in a mutex or synchronized{} block. It was really really bad; lots of race conditions and deadlocks, lots of production outages and a lot of "add more locks". In the neighborhood of 200,000 lines of this. It was "artistry" of a sort.
That application got the company to IPO, so the business owners were overjoyed with it. What's the point? Gatekeepers can gatekeep, artists can create art, but even the most banal garbage can make someone a lot of money.
In terms of your example, yes. The problem with software is that a bad architecture can complete hobble it and there are plenty of cases with unbeautiful code that makes a pile of money. I think there is artistry in software, but that wasn't the primary reason I compared it to music. I was trying to express the vastness of the domain and the range of complexity and how one could find a part in the search space that is simple enough to be called easy. Hence the garage band metaphor. Not everyone is going to be writing compilers. Some people don't want to throw their brain at a heap of complexity all day long. They just want to make pretty buttons that have a satisfying snappiness to them and call it a day.
What I'm trying to say is that there isn't one "programming" and for the people that need to hear "programming is easy, anyone can do it" in order to get the courage to try to take it up, I think that message is good. It doesn't mean they'll be working for Nasa on space probes, but they can make a comfortable living on low stakes stuff and have fun while they're at it.
In my experience, even majorly successful startups that turn into companies worth 10's of billions tend to have lots of technical debt.
Honestly, I believe that at some scale its very difficult to get the caliber of experience and talent that can keep a codebase clean.
People often say accruing technical debt is a form of shortcutting to a more business focused goal, but in my experience the technical debt is almost always created by accident through lack of experience rather than a conscious tradeoff. Especially when you consider a SaaS company where your product lives forever and is meant to scale, taking on technical debt for short term gain is almost never the right decision.
Not to reopen the 10x engineer debate, but I've observed that the top 20% of engineers tend to do 80% of the total work of an org. Of course, 10x is relative... But there are definitely individuals that are 10x more productive than the median engineer. And for whatever reason, that seems more to do with an individual's personality and drive than their level of experience... Though of course experience helps.
Especially as a project scales, somebody who makes good technical decisions will only increase the productivity margin between themselves and others. What I see in a lot of these SaaS codebases is that it takes a week to do something that should take 1 day, due to amount of technical debt and spaghetti code.
Software is still a new industry. I fully believe the companies that win in the long run will be the ones that have the best codebases (assuming software is what differentiates your business). The impact that it has on velocity is just monumental.
Code quality and philosophy of well written code is not stressed at all in school... One example of how far off we are from maturity as a discipline. There is a whole school of thought that's currently neglected that will become mainstream in the future IMO. Similar to other engineering disciplines...
Until I can hold up a plaque where humanity agrees that I'm a proven 1x, 5x, or 10x engineer and I deserve money and a job according to each of those levels, it's all just posturing and debate.
The traits I see in engineers who I consider to be 10x:
Growth mentality. Always try to do things the "right way" rather than just completing a task. Educate yourself via internet/books to understand all points of view on an issue, and tradeoffs of each approach.
Setting a high bar for your work. Never solely focus on getting the job done, always question and focus on what the best way to get the job done is.
Extremely self critical. Don't get attached to your work. Always criticize yourself and question whether decisions you made were correct.
Objectivity. Always quantify objectively to yourself why you made a given design decision, why did you name your variable X vs Y? Could you justify the merits of your approach to others without relying on subjective points?
Focus on business value. Optimize for what drives business value. Don't pursue projects that are technically interesting that don't provide long run value, for example.
Work with intensity. These people legit code 8-10 hours a day straight. They aren't coding for 30m then browsing the internet.
Never give up. Regardless of how technically challenging or impossible a task seems, they will work tirelessly to find a solution.
Self managing. Can operate 100% independently without constant manager intervention. High level direction still important to align on business goals of course.
Ownership. These people take pride in their work and feel a sense of ownership over their code. They don't need to be asked to step in when something they've worked on has an issue.
It's not about specific knowledge at all, or training.
People could learn to follow these principals, but it's much easier when it's in your nature. I have not seen anyone really change their trajectory from median to superstar before, but I'm sure it's possible with a mentality shift.
That's physically impossible, unless you're performing some assembly line task like creating a frontend prototype from a marvelapp mock (tons of html, css, js).
Can you do creative work for 10 hours in a stretch, every day.
Averaging around 350k lines of code a year for a few years. This was mostly frontend/product focused work, so there is more boilerplate than in other disciplines, of course.
It's also important to note, the higher quality the codebase is, the less energy it takes to add to it. If you spend 50% of your time reverse engineering spaghetti code, it will be way more tiring than adding to a codebase where design is sound, code is very human readable/friendly etc.
It certainly takes a lot of energy, but why do you say it's impossible?
I have worked on less clean codebases where I spend hours tracing state through spaghetti-like code, and there's no way you can productively code for lengths of time in those environments.
It's always better to refactor that kind of stuff ASAP, assuming the longevity of the product matters, and the refactor is a tangible improvement over the original.
How to judge whether a codebase is high quality?
Consistency of design and abstraction. Does the code use the same abstractions and design throughout? Consistency is one of the most important things in quality. How many unique concepts and abstractions do you have to learn to understand the code? E.g. in frontend context, do you use the same pattern for managing business oriented state? How is that state updated? Are those patterns consistent throughout your codebase? The biggest problem I see with the spaghetti codebases is they lack consistency in design.
Separation of concerns. What's the blast radius of any given change? If I change render logic, can it impact business logic, and vice versa? A big problem I see is that codebases do not appropriately separate these type of things out. Meaning the code is fragile and it's easy to introduce bugs inadvertently.
Anyway, I can list many points, but I'm on mobile now.
High level indicators would be: How quickly can new devs jump into the codebase? Is it easy to diagram and explain to others how the code is structured? How many bugs come out of your codebase? How quickly can you add new features to that codebase? What is the "blast radius", or is it possible to break something seemingly unrelated to a change you're making?
How do I know my codebase was good quality? I was extremely self critical when writing it and ended up rewriting it a few times before it was in a state I was satisfied with. Number of bugs are extremely low and feature velocity is high, relative to other areas of the code.
but I should point out that long stretches of time are different from quite (context switch free) streches of time.
> One afternoon, I was bent over a program listing while Wendl was staring into space, his feet propped up on his desk. Our boss came in and asked, “Wendl! What are you doing?” Wendl said, “I’m thinking.” And the boss said, “Can’t you do that at home?”
Say I had all those traits and you decided I was a 10x and now I've got my shiny label and I'm happy.
Then I come across someone else with a stricter definition and more requirements. They say I'm not 10x. Who do I believe?
Because there's no widely accepted standard, it just ends up being a game of finding the right people who like the qualities that you possess.
But the truth is there are people who are insanely productive relative to median, and 10x is just a rough term to refer to them.
I do think it's worth paying those people 2x or more over paying 1x for two median devs. The trick is being able to identify them accurately... that relies on a well honed interview. There's risk in compensating people so highly if your judgment turns out to be wrong.
Certainly definitions won't be universal, but this type of person tends to do very well regardless of the environment/language etc.
No, I'm not talking about the BS certifications where you can spend a few hours reading a book and pass a multiple choice test... but something more "elite" and well rounded to give a quality stamp of approval.
It would be a great thing if candidates could go through one process, get that stamp of approval, and receive offers from X companies.. rather than interviewing 100 times. I understand the needs of companies are individual, but most candidates who are "strong" will do well interchangeably at these companies... if it's more of a generic development role.
The difficult thing is that the industry seems very stuck on algorithm and design problems as the sole focus of judging a candidate, which are pretty easy to game (design less so than algorithms). To identify these kind of people you really need to judge real world code and productivity... large projects with more elements of design.
Beyond technical skill, how hardworking is the person? How much will they care? Personality traits like these tend to matter a lot more than specific knowledge.
Anyway... this is kind of a meandering response, but I do believe that in the future we'll have a much better system for interviewing with less redundancy and higher accuracy. The goal is to maximize correlation between performance on the interview and performance "on-the-job".
That is actually a failure mode - the engineer that tirelessly works towards an impossible goal.
The 10x engineer has the critical heuristics/intuition/skill to avoid dead-ends, and also the engineering taste to concentrate on technically hard but possible tasks and the skills to deliver.
I more often see junior employees give up on tasks they think are impossible that aren't.
I think this was one of the most disheartening realizations of my career. I spent and still spend a lot of thought on how to improve code for readability and maintainability just to realize companies can make a lot of money with crap for a long time.
I have also done the opposite of taking an existing monolithic spaghetti code system and start isolating functionality without changing behavior. This then allows to improve and replace sub systems as needed.
All else equal, the company with the better codebase will be more competitive/make more money.
But at the same time it's just true that for most companies code quality and technical excellence are not core qualities of their culture. A lot of companies say that it is, but they don't live it... Or the original founder/technical team don't really have the chops to enforce that quality and make it a core element of the business.
Of course that doesn't meant they're not smart. I've known a huge number of highly intelligent people that don't care about code quality, or the future human reader. Needs to become embedded in culture of the org for it to trickle down and become lived in practice.
>technical debt is almost always created by accident through lack of experience rather than a conscious tradeoff.
I agree with this, at least early on in the business. But my experience is that many organizations eventually realize their technical debt. Sometimes the realization comes so far down the line that it feels like a monumental task to fix and then it does become a conscious decision. “We know the code base is shoddy and needs to be fixed, but the schedule/cost risk outweighs the quality risk.”
>Software is a new industry
In the early 1990s I heard it referred to as the “cave drawing days” of the industry. I wonder if it’s similar to how mechanical systems were in the early days of the industrial revolution. Lots of innovation, very few codified best practices related to pressure systems etc. It seems like the steam era of “move fast and break things”. Eventually, industry caught up and put together standards like ASME codes (or were regulated to do so). I’d like to see this more commonplace in software beyond its current adoption in a few industries
Maybe it has to do with being "a new industry", but by now we have accumulated decades. I think it's more because you can get away with it. In other industries, you can't. If a bridge collapses, people die. If a car's brakes fail, people die. If you administer the wrong amount of anesthesia, people die. If you write spaghetti code .. shrug and move on.
Even within the code base of the place I work in, a few hundred sw engs in total, we don't have a shared understanding of what exactly "good", "clean", ... design is. Everybody has an idea, and there are overlaps, but the criteria that people seem to optimize for, and thus the conclusions they draw about design, differ vastly. Within my company, and even more so across our industry.
For example, here are some principles I can strongly justify:
Bubble important info. Structure your code visually such that signal to noise ratio is highest. E.g. appropriately named variables should be more immediately visible than implementation details. E.g. if variable is named well, you can typically ignore the RHS of an assignment... It's an implementation detail. Don't indent such that RHS of assignment is emphasized. We can debate that point, but I'm using objective reasoning for defining why this style is beneficial.
Human readable naming. Name of variables should define exactly what they represent and nothing else. Your code should be written to read as closely to natural language as possible. E.g. if in a functional language, and all functions describe what they do exactly, RHS of assignments are indented to deemphasize them, you can understand high level of any function quickly by scanning LHS assignments and top level expressions. The more unclear your names, the more "mental recalls or lookups" the reader has to do.
Don't use anonymous functions. For anything longer than one line, always used a named function that appropriately represents what it does. Reader should not ever get implementation details pushed into their face. Pushing implementation details to the forefront is the biggest readability error I see in code. It's almost never important for business oriented code unless there's a bug in it. Majority of the time the reader is simply trying to get context and understand meaning of the code. Optimize for this.
Hide your declared functions out of sight. Reader will get high level understanding of their use where called, due to their name. If they want to reference the implementation, they can go to function declaration, but typically they won't need to. Don't declare functions sibling to your core logic. They should not break high level flow of function (does not help readability). Frustrating when people declare functions above where the core logic of the function is... See it a lot in python due to lack of inner function hoisting. Books have footnotes for a reason
Hide implementation details as much as possible behind api boundaries.
Model component apis such that implementation details are not exposed to caller or creator. Don't mix naming of business concepts and render logic. E.g. if you have a generic graph component, nothing within that component should reference your business domain. I see this mistake a lot. More generally, never name something which implies an understanding of a different context than the one you're in. By doing so you're coupling the two domains and increasing the amount of context the reader needs to understand your code.
Prefer immutable variables. The more constants and immutable state you use, the fewer things you have to track in your head as you follow code. You know once you see an assignment, that variable will never change. You don't need to scan every line between assignment and later use to determine whether that var is later modified.
Don't nest expressions too deeply, such that it's difficult to parse. If you can instead assign to appropriately named variable, reader can typically ignore the expression altogether.
Prefer named function or variable that describe the result of a computation rather than inlining an expression. If featureFlag == 1 represents isFeatureEnabled, assign that to an appropriately named variable. Anytime you make the reader "infer the name" of a variable by parsing the expression themselves, you make your code harder to read.
camelCase is superior to snake_case because a variable represents a single concept, not separate concepts represented by a string of words. Adding underscore unnecessarily makes words visually distinct when you're dealing with a single concept. They also add verbosity and length that doesn't benefit anything. Is there an objective argument for snake case being more readable other than it's the convention in some languages (not objective reasoning) (Flame war go!)
Anyway, I could go on with a number of more points. Am I suggesting there's a correct style? Not at all. But you can absolutely use strong and objective reasoning for why one style is superior to another. I don't see people typically apply this kind of rigor to their style, they tend to just prefer one approach "because".
Different people will weight things differently, so can come to different conclusion given same evidence, but there's absolutely a whole set of philosophy and logic you can use to justify style, and it's not explored at all in academia really.
Final note. There is definitely an element of cultural bias as well. People who tend to read code of one style will more readily be able to parse that style. There is no universal truth. But if we all start from the same state, we should justify which styles are best with strong reasoning.
snake_case, is obviously the more readable. In fact your point shows this cognitive dissonance we all have to a certain extent. You argued (and I agree) with a lot of details that are important for readability at "first sight", "intuitive layout" etc, and then you go to say camelCase is more readable...
We're not even taking into account people with small amounts of dyslexia in this, but
certainlyThisIsNotMoreReadable than certainly_this_is_not_more_readable
Is it? :) gzip will take care of the underscores
It took away from my overall point, as I don't have strong convictions on that one.
That one is much more subjective than the other points!
Point is that we don't have a shared, common, well-defined core in our industry. A list that everybody adheres to. Our lists are not in sync.
The variety of programming languages that people can choose from now does not help either. Standard practice in one language is a cardinal sin in another. Different patterns, different principles, different paradigms. People mix and match freely.
I provide objective and concrete reasoning for why these style elements are beneficial. In the wild I rarely see people justify their style with strong convictions.
Again, different people can reach different conclusions given the same evidence, so there will never be a universally correct way to do things.
But there's also is a lot that's done by convention that's hard to justify objectively.
The biggest faux pas I see is pushing implementation details to the forefront. There are arguments to be made that this can be beneficial in some contexts, such as algorithms where you want a "single pane of glass" into what's happening. But you can also objectively specify those contexts and when a style is more applicable to one context vs another.
So long story short, no, there is no best style. Yes, you can objectively quantify why a style is good or not, and in which contexts. Beyond specific style elements, there is a philosophy underlying the readability of code style and will eventually become a big part of education in software IMO.
Other industries/areas have firmly established standards. Our industry needs those too, badly. Not just for style, but overall for design and architecture.
Maybe it's because software development is so easily accessible that we don't have them yet. To become a surgeon, you need to go to med school for an eternity. To become a construction engineer you need training and government certification. Both areas move slowly, compared to programming. In our industry, a language that's older than 10 years is called "mature" and the hipsters leave it for a younger one. And the next 16-year old can jump right in. That's not bad, it keeps our industry exciting, but it does not allow us to establish rules everybody agrees to, applies and defends.
I'd recommend you check out Code Complete if you haven't read it. It is an excellent intro into best practices although its about 1000 pages and a bit dated. As it turns out, we as an industry do have an understanding of what makes code better, and it turns out, its mostly not very controversial - push complexity as low as it can go, simpler interfaces tend to be better, argument pass through causes errors, functions longer than 80 lines are associated with higher error counts, optimize code for human comprehension later (~70% of the effort that goes into code is maintaining it) etc etc.
> it turns out, its mostly not very controversial
I don't believe this until proven otherwise with actual data. Any programming concept on this planet eventually gets an article on the HN front page that argues for why that particular concept is really bad and then we are having a huge discussion about it.
I don't remember the last time that a piece by Uncle Bob or Martin Fowler—and they're just two examples, I've seen quite a few more who are generally met with agreement every time they're posted—was heavily criticized or disagreed with here.
And when I do see disagreements, they tend to come from people who don't seem to have nearly as much experience as those guys do or who might have misinterpreted their point (much like how the idea of agile has turned into something that only reflects the manifesto tangentially, and accidentally at that) and who are, perhaps not coincidentally, likely to fall in the "programming is easy" camp.
And even then, "controversial in hacker news" is hardly representative of what's controversial in the field at large (which I also understand goes against my own first point).
There are so many counter examples (Facebook, Microsoft to name two) to your point it simply can not be true.
When I say long run, I'm talking hundreds of years. Software as an industry is not even one generation old yet. There are countless advancements that will come.
That being said, I don't consider social networks to fall into the class of an area where your product is the main differentiator. Network effects come first, product second.
Database products are a better example. JIRA another. It's the most widely used now but extremely slow and buggy. I sincerely doubt JIRA will be the winner 100 years from now if they don't improve technically.
In fact, a lot of software companies these days are just competing with traditional companies, but with better software. That's the whole selling point. E.g. fintech replacing banks, uber replacing taxis, insurance companies that make it easy to make claims etc. The bigger the tech disparity, the bigger the advantage.
Lets see!
I suspect that there's almost nothing going on at the Ford Motor Company that has even the remotest connection to anything technical that happened during the early years of the company's founding.
Sometimes, stuff just really does age out.
Engine blocks are still cast, sheet metal is still bent, pressed, and rolled so I think there is a lot of the original years still around. Yes, I’ll give you that there have been huge advances in sophistication, but it seems to me the early years are still present.
I once saw a customer obsessed junior engineer push out features that our users really wanted, but that none of the senior engineers had time for.
Half a year or so later one of the senior engineers was complaining that he had to rewrite everything that junior engineer did due to how poorly the code was written.
End of the day? The junior engineer's code is what got shipped and made the user's happy. Was it tech debt that had to be rewritten? Sure. Was my team happy with him for being willing to work with us to make the product better? Yup.
Perfect is the enemy of the good and all that.
(I've also seen code where changes took a long time because someone invented a DI framework and layers of XML configuration files when a single if statement with 2 branches would've done the trick. Was the solution well engineered? Yes! Very reliable, good quality code. Took me a few days to get ahold of it and add that 2nd conditional...)
If you had instead hired an additional senior guy who was paid 1.5x compared to the junior guy, it would have been a better outcome for the business all around. Of course just using this contrived example, and the exact salary numbers change the outcome...
Sometimes not knowing something is supposed to be hard is what makes that hard thing possible to do.
The one re-writing touted what they had accomplish, a full re-write with a team of 15 or so people, in a couple months. I can believe that some guys are dickheads and do crap and are anti-social or don't want anyone touching their stuff and think they're the last cookie in the packet.
On the other hand, there's a real difference between writing from scratch something, with features tacked on week-in week-out, contradicting requests, no time to work through issues or problems, being the only one allocated to the problem and having no real plan or feature map laid out, during 5 years and then coming in, when all the system is laid out, all the bugs and domain knowledge have been made visible, there's a working system that can be used as base to understand the objectives, the rough edges, problems and pain points are also known, and rewriting it from scratch better.
Lastly, it's also not known if they had been the ones writing from start with the same constraints if it would have been so pristine as they claim, and it hasn't stood the time for 5 years yet. Maybe it'll end problematic as well but now it took a team of 15 or so that probably cost more than that single guy for 5 years - and still made something that helped keep the business throughout.
One can argue that White Stripes' 7 Nation Army or Andy Warhol's Campbell's Soup Cans are not feats of technical mastery by any stretch of imagination, but the key is that there is no correlation between technical difficulty and monetary value in the first place.
With that said, it's also worth mentioning that the world is vast enough that there's a bit of everything. Yes, there are companies making millions on the back of terrible excel spreadsheet hackjobs. But there's also Google's impressive infrastructure. And there's lichess.org running a hugely popular app on just a few servers. Success in itself it not one-dimensional.
I see arguments like this a lot and it think it conflates two very different kinds of "technical difficulty"—design difficulty and execution difficulty.
Given the sheet music, any guitarist can play 7 Nation Army in a few minutes. It is not physically difficult to play. Also, it's not hard to come up with a completely original melody or artistic work. Just throw a couple of random unrelated things together.
But it is extraordinarily difficult to have such a mastery of composition and understanding of what music is already familiar to people to be able to find a melody that is both original and enjoyable to a wide variety of people. The level of cultural, musical, and historical knowledge required to do that is extremely difficult and rare.
It's like taking your boat to the world's most popular fishing hole and knowing where everyone else fishes so well that you can still manage to stake out an unvisited spot that hasn't been fished out and reel in a giant.
The problem with this argument IMHO is that if it were true, one would in fact be able to just bang out hits by developing such mastery. But music hits get popular primarily on the basis of luck, survivor bias, branding, etc, not strictly based on artists' composition skills. There are plenty of very talented one-hit wonders, and even criticisms that popular music is "manufactured" (implying that it is relatively easy to just follow some vague formula of 4/4, II-V-I chord progressions and lyrics about love and end up with something that resembles a hit).
Isn't this exactly what Max Martin has been doing for last 20 years?
But given how many musicians and producers exist and how utterly small is the percentage of people who are comparable to Max Martin, I think it's reasonable to speculate that his success might be partially/majorly attributed to factors of luck/survivorship bias/branding/popular-music-as-a-mass-produced-product I mentioned.
If you have 25 programmers on a project, it is rather likely that 4-6 of them do at least half of the work. That would be a 5x developer.
Very often, productivity is linked to perseverance. If you socialize and only actually codes 1-4 hours per day, you likely are far less productive than the on-the-spectrum programmer who pounds out code for an entire work day (or longer).
The performant developer solves problems quickly, without creating problems for others, i.e. he unloads burden from the project.
This, essentially, ends up with a PR review that takes hours to complete, only to end up with at least a few "changes required". Leading to updates, and a re-review, usually with enough time lapsed that the review ends up being "from scratch" (partially due to the size of the PR, partially due to the time lapsed).
We've now mostly converged to "start with a PR just setting the skeleton up and one testable function", meaning that what used to be a single monster PR now ends up as 5-15 PRs, each one much easier to review. Amusingly, this also tends to end up with things being completed faster.
I've met a lot of folks who didn't believe it... right until they met one.
> That application got the company to IPO
They got lucky they could IPO before scaling became an issue.
Just imagine Google not being able to scale. Or Facebook.
That right there is the truth about 10x engineers. We have one in particular I will mention. Sometimes he is a 5x, and at other times he is 20x. This is true and measurable according to the number of tickets that get closed, stay closed, and test as correct. He doesn't read HN, stack overflow, fb, twitter, tiktok, blogs, or emails during work hours. He sits down and cranks out code.
10x engineers also have compounding effects. These are impossible to measure, but you'll notice them when you see them. They flat out write better code.
Better code fails gracefully, is easy to read and especially nice to extend. Juniors seems to magically be able to ship features really quickly on that particular codebase and onboard really fast. If you dig deeper you'll see the 10x giving hints and feedback.
Take a close look at various bridge designs, and you'll see the artistry.
The knowledge of thread safety is not an inborn thing nor issue of talent. It is literally issue of knowledge that you can acquire if you previously did not had it.
And companies can get away with bad code for quite a long.
The keyword is craftsmanship.
I've graduated and have done work as an electrical engineer, and have become a programmer over the years for financial reasons. Whenever I do engineering or design work, I feel they really are very similar to programming. And they probably are similar to music, although I lack comparable proficiency in that field.
And the key insight for me was: the more you do any of this stuff, the better you become. The time you spend with thoughts about it, or practicing it, it slowly changes you. It changes the way you think, the way you approach the problems. You become experienced. And it does not seem to end, there are always new revelations, and you can always find fault in yesterdays work, that you could probably do a little better today.
I never really did engineering as a career as my first job out of university was as a software developer.
What I remember from that time and why I think I picked up programming fairly easily was my engineering degree gave me the skills to think through a problem.
I never really had trouble planning out my software designs even though I had no formal training in that area.
So in that sense I agree that these two disciplines appear to be similar.
I put this down to the problem solving skills I learnt through my Engineering degree.
At scale and with long-term projects it requires knowledge, mastery of tools, foresight, experience, intuition, creativity, planning and many judgement calls.
This is not special. The same is true for many other occupations. Be it carpentry, electrical engineering, finance or, yes, even marketing.
In a lot of ways it is easier than others, because (non-architectural) mistakes can be corrected a lot more quickly, and there is a plethora of (often free) learning materials, knowledge resources, tools and and projects to build on that other fields can only dream of.
I think many programmers have minimal experience with other jobs, and assume that coding is somehow more elevated or demanding than other professions, while the reality is quite different.
There's no one true way to make a chair, it depends on who will use it and how you're feeling. Craftsmanship does include art in it.
As someone who has worked in a few different fields, this x 100. There is nothing "special" about programming.
But professions like Nursing are also quite rigorous in educational requirements, but nurses don't engage in the type of long-term planning required in engineering. I do think the plan-building aspect of engineering adds to the overall difficulty of the profession.
Following an existing flow-chart is different than building a flow-chart.
Code like the Obfuscated C Contest is art. The code that orchestrates your cloud servers is more like engineering. Prototypes in language research is science. Coding competitions are sport.
This. Very well said.
So yes programming can be easy, even the hard stuff, but we can only fleetingly tap into the subconscious which allows it to be easy.
Still can't get it right :o)
Compared to what I had to endure when I took my first CS class with Java 18 years ago, typo bugs are far fewer. Beginner programmers lives have been greatly improved by IDE enhancements. Almost too much. In code reviews, I’ve seen stuff that is a brand new language construct. When I ask the dev about it, it’s just something that the IDE suggested as an improvement. “The IDE told me to” is a little scary, but maybe not any worse than a stackoverflow post.
That's what made me choose programming as career over other options available at the time. Good reminder after many years!
For many years I've also made the comparison between programming and music. You can learn the theory (CS or music) in school, but to be truly great as either a programmer or a musician takes passion, obsession, and dedication. I'd actually rank obsession as being the most important trait, as it can drive the other two. I'm not saying obsession is always healthy, but it's clearly a key driver in the skills of elite performers in many disciplines.
I think the main reasons behind the similarities of the two is in ease of access and the rapid learning feedback loop. In both programming and music, you can buy enough gear for a few hundred bucks to experiment with your craft to your hearts content. In both, mistakes are cheap, if you play off key or write a bug you're not likely to damage anything in the real world and can get feedback to improve. In both, you can riff off the works of others easily to get inspiration and get up to speed with the latest developments. And feedback is fast, as your ear or your debugger will alert you to either successes or mistakes.
The above qualities basically make a recipe for quick and unbounded learning, which leads to exponential development of skills. This is a recipe for not only quick learning, but the building of intense obsession in the right mind, as the rapid feedback system fuels the brain's dopamine reward system. It's no wonder when we see a young person who's exposed to programming with plenty of free time that we're often amazed at what they create. The same is true of music.
A slight tangent, but my thoughts above are why I always ask people when/how they first learned to program during an interview. A new grad who's been obsessed with computers and coding since age 13 is going to run circles around someone who started in college because they thought it was kind of interesting and their friends told them how well pays. It's a simple question to ask, a nice ice breaker, and can provide a very useful signal for hiring if the interviewee exudes passion in telling you about their coding genesis story.
Software, for whatever reason, just tends to lionize and monetarily reward hackers over engineers. I'm not exactly sure why this is. Maybe we just get so much more to start with? If you wanted to put up a skyscraper or build another Brooklyn Bridge, you pretty much need to put together all of it. Only the land is there already. On the other hand, with software you can seriously stand on the backs of giants. Someone else already laid fiber cables beneath the oceans, put satellites with radios on them calibrated to deal with special relativity in space, processor makers basically use black magic to hide all of the terrible, inefficient coding we do and make it fast anyway, database engines, exponentially cheapening storage, and CDNs do so much of the heavy lifting of caching and delivering content, and we profit.
I guess skyscraper builders get some pre-existing infrastructure. They don't need to lay their own roads or build new electrical stations or steel mills.
But still, software feels like a business where a lot of people learn quickly how to build their own backyard tool sheds, then go apply to design skyscrapers and get mad when the interviewers expect them to know the principles of physics underlying how it is possible to get 100 stories of steel and glass to not fall over in the wind.
> The same is more or less true for programming. A simple stack of JS, HTML, and CSS is pretty easy to get going. And if you're content to make marketing sites for advertising companies or similar, then go nuts. That's your simple jam and you rock out on it as much as you like.
Nice point, beautifully laid out! Favourited and added to my quotes file!
Football is easy. Anyone can gather friends in a court or park and kick the ball for a while. Kids and middle aged fathers do it all the time.
However not everyone can play professionally, say in a second or third division, and earn a living wage out of it.
And still less people make it to the top teams of the first division, becoming millionaires and celebrities.
The ratios are different, but these groups roughly map to people ability to code. Probably most people can "write code" to some extent. Few of those will be able to make a career out of it as professional developers. And yet a smaller number will make it to FANG and other top companies, making 6 figure salaries like it's nothing.
For software, one sits most of the time in front of a glowing screen and the rest is drawing boxes and text on paper/whiteboards (plus meetings). Certainly doesn't sound as glamorous and one is left with imagining their work most of the time. That's why such comparisons fall flat and at least to me it seems that an attempt is being made at rubbing some "cool" on something that is typically perceived as uncool and for a regular human looks mind-numbingly boring.
So programming's not hard because it's like <arts/crafts>, but because it's abstract and mechanical and emotionless. It's an acquired taste which needs fertile ground to develop in, when most people understandably don't have that, not even for a simple stack of JS, HTML and CSS.
Does that mean you studied software when you were 11-12 years old (pre teen: before 13-19 y/o?), together with college students typically 19-25 years old? (Sorry if it's a silly question)
Yikes. What a gross, self-congratulatory rant. The author tries to defend against the term "gatekeeping" by getting out ahead of it, but that doesn't change how deeply exclusionary the result is.
It doesn't even stick to a specific complaint; it jumps around to different things that emotionally feel related in the author's mind but aren't actually. First we're talking about boot camps, then we're talking about how StackOverflow is "the scariest thing that happened to the programming community in the past 10 years", then we're talking about "diversity" speakers at conferences riling up "mobs" in some kind of conspiracy against the author and people like him?
Buried under all of this (literally, at the very end) is perhaps a poorly-executed attempt to tell beginners something of value, that it may not be easy now, but you can push through and it will get better. But I don't see any actual beginner reaching that part before getting discouraged by the rest into doubting whether they should be in this career field at all.
> I said that the programming field is a fertile ground for beginners, and it is. But what’s fertile for grain is fertile for weeds too, even moreso. And we need to talk about these people, taking advantage of the fertile ground. And where there’s plenty of beginners, there’s plenty of people taking advantage of them.
That is, I interpreted "These people, taking advantage of fertile ground" not to mean subpar newbies who can't cut it (which is how I read your interpretation), but instead to mean the snake-oil salesman/huckster types who take advantage of these newbies by sort of implying "hey, just come to our 30 day bootcamp and you'll be a programmer, just like those programmers who make top dollar at Google and Microsoft!"
I actually generally largely agreed with article, and I didn't find it gross at all. Yes, programming does have a low barrier to entry, but to become a true expert at it takes the same level of skills and preparation as, say, a doctor or scientist. But you don't see any "Become a doctor in 30 days!" bootcamps out there trying to convince people that "Hey, anyone can become a doctor!"
> There are many ways this happens; some of them are not even aware that they do it, they are just instinctive hustler that oversell their own skills. Usually you see them: two years of experience in software development, writing books and giving advice, sometimes at a hefty price. You see them at conferences, or with articles promoted, or with other types of media, sometimes playing the diversity card, at other times the beginner card, pushing their way in and taking advantage of credulous mass of beginners.
So the "weeds" are still beginners, just beginners who the author perceives as overselling their skills. That isn't much better, in my view.
If they're speaking at conferences and getting published and working on projects that are out of their depth, then it's on the conferences and publishers and employers to identify them as underqualified.
If they're "flooding the job market" and working on things that are appropriate for their skill level - which I would guess the majority are - then that's a good thing, even if their skills are at the low end.
The term "gate-keeper" is colloquially used to refer to those who needlessly prevent or discourage others from participating at all in an entire hobby/career-field/community.
Conferences and publications and employers should absolutely filter candidates by their actual ability to do the job they're being paid to do; nobody in their right mind would suggest otherwise. But this is a) a temporary condition of the individual's ability at that particular time, b) relative to the specific task at hand, and c) just one piece of what it means to participate in the field as a whole. A person might not currently be fit for programming job X but simultaneously be capable of programming job Y, and in the future they might even become capable of X. They might not even be capable of any paid programming work at all, but in the meantime should still be welcome to learn and to hack and to participate in the community.
Of course I didn't really need to explain all that, because you knew what I meant and chose to frame it differently, but there you go.
Disagreed. That term is frequently used for anyone that isn't an overly positive cheerleader.
There are different jobs labeled as programming, some easier, some harder.
Where does this narrative come from that programming at all professional levels must be easy for everyone, else you are a gatekeeper? Is it anxiety about future automation and the idea that the only remaining jobs will be programming?
AFAIK all the jobs you mentioned need a formal certification. You can't become a doctor without going to med school. You can't become a lawyer without passing the bar.
Even if you don't (not sure about a car mechanic, depending on the country), it's a lot a harder to get your hands on a car to tinker with than it is to download some framework and watch a get started video.
That's what the author said with programming is accessible. It is very easy to get started which is often misrepresented as "it's easy".
No one would say "becoming a doctor is easy" because you're never gonna be a doctor from online documentation and YouTube videos so there is no incentive to frame it that way.
Programming levels the playing field compared to gatekept jobs where you must be born into a dynasty to really make it. In that sense it's easy. But it will still only be a part of the population who are well suited to do it.
Programming has a very appealing second property: there are tons of good paying jobs out there.
And I think this combination of "you can get started super easy" and "you will earn above average" are two dangerous properties.
This analogy always comes up in relation to programming, but I think it's not quite right: you don't have to be the equivalent of a "football genius" to be an effective programmer. If there was the same market for soccer players as there were for programmers, a lot more people would be professional soccer players - there are so few, and the ones that make it are so far ahead of everybody else, because there just aren't that many spots available.
But yes, the analogy is faulty if the bottleneck in football is the availability of the spots, because in programming the bottleneck is rather the availability of good enough new hires. We may be around the point where CS programmes have grown so much over the years that the marginal additional student may not have that good potential any more (out of a combination of motivation and talent). But a potential reserve talent to tap into could be women, but attracting them to programming has been an uphill battle and is a can-of-worms topic why.
You're only allowed 11 people on the pitch per side. Believe me, if it were possible to replace Ronaldo with a thousand less-skilled players paid a fraction of his wages, somebody would have tried it.
You could even suggest hiring them for fractions of a match on an internet employment brokerage platform. Footballr.
But I do agree that spectator sports are more winner-takes-all than programming jobs.
People do create additional teams and play exciting for them matches. That is how amateur leagues work. People create whole additional sports and compete among themselves in them.
The spectator attention is really maxed out, because spectating sport is massively social thing. People do it because of excitement of who win, but massive part of it all is being part of culture, having common topic with friends, feeling like member of big fan club etc.
The same happened with other artistic endeavors. Few people these days really want to see an amateur sing or play an instrument. We have so much high quality music that doing it "okay" doesn't really cut it anymore. Before an okay player/singer might have added to a party. Today, most of the audience will be just waiting for it to end and for somebody to put on some decent, commercial music.
And just like you can watch Ronaldo on TV from half way around the world instead of watching your town's crappy teams, you can also use Google and Microsoft software and services instead of hiring someone from your town. Even very custom software needs fewer and fewer people due to existing tooling.
So the bar is going higher and higher in programming too.
I'm saying sports, arts and music got to such heights, that an ordinary person can consume nothing but the best 0.1%. This in turn means the demand for the rest has plummeted, and being the guy who can play guitar "okay" doesn't really excite anybody anymore. There's a market at the very high end, and nobody wants to pay a cent for anything below that.
Programming is going the opposite way, if anything. There's lots and lots of programming grunt work that just needs to be done by somebody and doesn't take any particular skill. There's rather less need for wizards able to squeeze every possible bit of functionality into 64K, because at this point resources are cheap.
At this point a programmer can get by with being moderately competent and doing little other than gluing frameworks together. Things like music are the opposite. Mere competence is nowhere near enough.
On other hand for that work to be useful proper software engineering and architecture is needed. And these hopefully take input from computer science.
But I think the OP (unintentionally) makes a telling point, which is that accessibility is confused with simplicity.
We're seeing this in medicine now. Anyone can Google whatever so they're go to their doctors with Dunning Kruger on max and and say things that are really really stupid.
Or they try to understand what's happening. And because they're spending hours on something the doctor spends a few minutes on, they - occasionally - manage to have an insight the doctor misses.
Either way, medicine isn't quite the ineffably mysterious occupation it used to be. Of course it's not really any less complex, but the wall has been breached a little.
The arts are similar. It's easy to buy some paint, so everyone has a go. It's easy to buy a guitar or synth and a DAW, so everyone has a go.
The skill and learning required to be an expert becomes invisible because beginners try things, get unsophisticated results that make them happy but are a long way short of the real thing, and think "Well, that's not so hard."
The problem isn't verbal gatekeeping, it's the lack of media representation of high levels of skill and professionalism. They're either portrayed as unimaginably mysterious, as soapy and trite (see most legal dramas), or as "And you can too..."
There are few realistic depictions of the skill, knowledge, and practice required to be a professional in any field. Or of the insights and perceptions that professionals experience, but which untrained people don't.
YouTube is pretty good for this, both educational channels and edutainment (like Computerphile) and candid videos of people sharing their professional experience. Or code-alongs etc.
In states where you don't need to go to Law school and anyone can pass the bar, doesn't this make the field accessible? The bar cost $100-$1300 depending on the state + travel costs which is not that far from a good laptop cost to do any meaningful programming.
You'll probably need a $200 laptop and an internet connection. You can do paralegal freelancing in the same way you can do small programming jobs.
Edit: Writing is also accessible. Accounting is also accessible, though if you are becoming a CPA you need some college credits. Online marketing is accessible. Trading is also accessible. All of these can be done from the comfort of your couch and only need a laptop with an Internet connection.
These states don't allow a random to come from nowhere and take the bar exam. They require you to be an apprentice at a law firm:
https://barprephero.com/learn/take-the-bar-exam-without-law-...
This is CA, for example:
* Four years studying in a law office
* 18 hours per week
* Five hours of direct supervision
* Monthly exams
* Bi-annual progress reports
* Supervising attorney must have five years of active law practice in California
(you can see the reqs for other states in the article)
**
According to this article: https://priceonomics.com/how-to-be-a-lawyer-without-going-to...
Only 60 apprentices in the nation took the bar in the year discussed. 17 passed.
I'm not sure if I'd call that accessible.
You're not gonna become a legal doctor, but I assure you that online you have many many information and videos that teach you the same as they teach you in university. You just need to organize them - and probably some are already part of current pandemic forced online classes
The complicated part may be to obtain corpses to make the practices... /s
You can learn to be a doctor or lawyer on the internet for sure. Can you practice it ? It depends. Some self learned programmers can't get a job in some companies too because they don't have formal education.
I guess it's probably a combination of software development not requiring a license and people believing that it's easy to learn.
It’s a thing you can “do” over the weekend, it’s fun, and it’s practical.
After writing hello world you can call yourself a programmer, which sounds impressive.
It’s much harder to even get to hello world for a doctor or a lawyer.
Of course, there’s a long road to doing it well.
I can call myself an artist for having used a paintbrush before, but I’m not actually an artist by any sane definition.
Are there? Doctors are one of the main causes of death nowadays and it doesn't appear to exist many pushbacks.
Damn right, programming is hard, and it is getting harder with every line of code people write.
Note: in this example, I bunched programming with maintaining together. If you only write code for new features without taking into account existing or legacy code, you're a lucky son of a gun.
I'd say that's an overreaction to the default presentation where coders are genius wizard wunderkind hackers from the movies. I don't know about your experience, but whenever I say I'm a programmer (or more directly translated "informatician") in a mixed group, everyone thinks that' must be rocket surgery.
Perhaps kids in specific countries now grow up being told that it's easy, but I think the 25-30+ years old cohort thinks programming is hard and only for the really smart people.
1. we tell kids it's easy in order to get them interested
2. those who are interested, learn with time that it isn't as easy but love it anyway
3. those that are not interested, which is probably the majority, still go home thinking it's easy
It's funny to see how different reactions in different cultures are.
In India, being a programmer will be looked at with exhaustion and judgement. Sorta,"Oh you too? Get in line."
Therefore you get these really silly memes such as if a factory worker's job is outsourced, you can just retrain them to be a programmer. Or the only reason why some downtrodden group is not a programmer is because they were prevented by someone from being a programmer.
The thing that is ridiculous about the memes is that programming is the only field that is completely clear of gatekeepers. You don't have to go to college to be a programmer - the top programming coursework is available online for free (or nearly free). If you want to be credible as a programmer, there are plenty of open source projects that would welcome you. Compare that to doctors or lawyers which really do need college degrees and certification.
Doesn't help that a lot of prominent figures are also drop outs (Zuckerberg, Gates, Wozniak, Jobs, Musk, the list goes on).
Doctors insist on having everyone call them "Dr" and each-others too. They get their prestige from their tittles.
Meanwhile Bill Gates is just... Bill Gates. No prefix needed!
Or is it mainly based on who they know and who recommends them?
Would be interesting to consider if it's possible to administer a whiteboarding exam on programmers once, and then consider them solid on the concepts tested if they pass. And if not, then why? Does that mean whiteboarding as it is practiced now is insufficient? Because it certainly seems like for engineers who switch jobs every 2-5 years, they have to be whiteboarded again even if they've had prior experience, even at larger corporations known for rigorous interview practices.
It's as if this industry lacks confidence in its own employment standards, unlike the medical, legal, and other accredited fields.
It may also be the fact that doctoring is more about keeping a large amount of facts and experiences in mind as condensed expertise, while programming is more about raw intelligence and solving novel problems analytically (although this sounds a bit pretentious and self-important, I know). Cardiology is very unlike logic puzzles. Now sure, day-to-day programming may also not be much like logic puzzles, hence the endless criticism of whiteboard leetcode interviews.
Depends which border they cross. Then there's a lot of red tape and regulation by the local cartel to deal with.
That's actually a pretty accurate description of what doctors have to do, at least in the UK. For the first nine years after finishing medical school, doctors have to take a series of exams, including written exams and practical tests, which are primarily diagnosing and proposing treatments for real ("mystery") patients. This is a centralised process, rather than ad-hoc tests at every interview, but doctors do have to continue demonstrating their competence during their careers.
I don't think I've head anybody say "Anyone can be a pilot!". Becoming a pilot is inaccessible. There are medical qualifications. It's expensive. A degree helps a lot (or is required) for airline jobs.
Self-limiting beliefs keep _some_ people from being pilots. So there are outreach events (Young Eagles being one) that introduce people to flying. The military recruits at events. But it's more this "maybe you could be a pilot. just consider it." vibe.
Programming is accessible (as the article points out). I spent less than $200 in materials to get a good job as a software engineer. (Throw in $500 for a computer if you want). Self limiting-beliefs make up a much larger component (but not all!) of why people can't become professional software engineers.
I think this leads to people overreaching during the outreach phase. If it's only a few hundred dollars, focus and time, then the only thing stopping you is yourself! Well, no.
Let's just start at the left end of the curve and acknowledge there are adults who can't count to five. They're humans, they're people, they're part of "anybody", but they absolutely will never be programmers. And then it's just a spectrum from there.
The reality (like most realities) is more complex than can what fit on a sticker. Some people think they can't program, but could. You don't have to be great at math, but it can help and they're similar mindsets. An expensive education isn't required, but helps with careers.
Programming is hard. But maybe you can do something harder than you think.
Recently, a non-technical executive berated me for not working faster. I wanted to tell him, "would you say that to your accountant, who just worked an 80-hour week to help you meet your obligations on time, continuing to receive new spreadsheets all the while?"
Car mechanics too, run of the mill mechanics shop doing oil changes doesn't require that much to be competent at, but that's barely scratching the surface. Within the mechanic profession and you can go all the way from oil changer to mechanical engineer. Consider motorsport workshops, specialist restoration workshops, custom fabrication, aero design, engine building, machining, performance wiring, ECU tuning. It's a huge topic.
I find that is the case with almost anything though. Very few things are all that shallow. I have to remind myself of that if I disregard something someone enjoys. Sports fans? Yeah some of it could be shallow, but sports nerds go hard, there is crazy depth to sports fandom. Same with TV shows, video games, telephone pole enthusiasts.
So I guess my overall point is, the question "Is X job hard?" isn't really answerable, since we don't know exactly what part of the job the person is targeting from the question.
This is not a criticism; in a way you need to isolate yourself from realities of human politics to be successful in the field.
So in the last decade many socially dominant people who smelled the money have invaded open source. They have realized that you can make a living by posing as team leads and not doing much.
The real workers have let them in, have given them power and are now facing the consequences (ha, finally we can use that term, too!).
Other professions like law and medicine aren't remotely as naive. They are acutely aware of power struggles, protecting their professions and won't let this happen.
These people invariably majored in something like english, dance, or music studies and then wind up doing project management because, as you pointed out, they’re after the money and no one is stopping them.
I think I am good programmer. When I was younger and considering it as a profession, I was told that it is hard and that I should think twice seriously before comitting myself to it. That som of the guys that are already coding are very good and I will compete against them.
There is gatekeeping related to claimed difficulty. There is also perception that either you know it or not, but that you should not expect learning curve.
Also, passionate people of all kinds of professions trying do this exact thing. Whether art or tech or sport, adults go out of their way to signal to kids that "you can do it too, join us doing this thing".
As a software developer, I love working with developers that are competent, and especially if I'm learning a lot just by being on projects with them. I do not love working with developers who actively decrease the quality of the code base because they do not understand what quality is. Now, that can be relative, and subjective. I'm quite open to junior developers trying things, asking questions, requesting code reviews, etc. But some people get a senior title and a confidence about their work, and charge ahead generating extra work for those around them. So I'd rather such people were, perhaps, not in the field at all!
In general, though, I would like to encourage lots of people to try programming. From my perspective, it's super empowering, interesting, deep and can be a great career choice. Try it, and if it interests you, and you find yourself driven to improve, learn new things, and seek mastery, we're really going to enjoy having you here in the field with us.
There are aspects of programming that almost anyone considering the field could try and learn and see some success at. But it helps to understand that you may discover your own limits (whether by talent, motivation, or opportunity) sooner or later in the field, because there are aspects that are much less approachable. Do you want to spend countless hours preparing for algorithmic whiteboard interviews? Do you want to bury your head in code while stepping meticulously through a debugger on a squeegee hunt for an edge case? Do you want to optimize relentlessly when the scenario requires it?
If software is eating the world, we'll need a lot of developers. And we'll want some that are happy to do grunt work while others forge into the most treacherous waters. But we don't want you to think that all software development is easy, because it's not.
We'd always go through the same thing with folks who were new to interviewing with a candidate who couldn't quite cut it.
In the following discussion they'd be hesitant to say no and maybe go into how they seemed nice or whatever. Then we'd ask "Ok, would you want them starting on your project with you tomorrow?" Well, no...
I have a friend who is a surgeon who says he hardly uses anything he learned in medical school and that he could teach a carpenter to do his job. (I think he is exaggerating a bit, but it's a funny anecdote).
I'm sure he's using the fundamentals he learned in med school more than he thinks, but yeah everything in psychiatry, pediatrics and obstetrics most likely not.
Most of medicine is relatively routine. A surgeon's skill isn't so much in the 99% of cases, but the 1% that have adverse outcomes. More importantly, their skill comes in identifying the possibility of adverse outcomes and preventing them from ever happening.
Me and you could easily be taught to do a routine surgery, like an appendectomy. However, we wouldn't be able to identify if something requires more treatment or prevent a patient from dying if things don't go perfect.
I've literally never heard anybody say this. Best I can tell it's a straw-man the author has stood up.
Part of the problem is the ambiguity of the words "easy" and "hard", which would be a valid discussion to have, but the OP didn't really seem interested in that aspect, and chose instead to interpret things in the least-charitable way possible.
Almost anyone with a basic level of intelligence and the willingness to put the efforts into it can learn any of the above professions, and programming is not different from them. It's not hard, although there are some hard areas you'd like to get done by a CS graduate or an engineer.
There are professions that are hard or simply require some special and maybe rare talent, but like most other professions programming is not one of them.
If one doesn't have drawing talent and sense of perspective, becoming an architect is almost impossible. No amount of work will fill for that.
If one gets lost while moving in 3D, no way they'll become an airline pilot, ever.
If one doesn't get mechanics and principles of how cars/engines works and has a talent for working with literally dozens of tools, they won't become a car mechanic ever.
OP could have mentioned sculptors, theoretical physicists, athletes, or singers but chose to list completely normal professions. Just like programming.
But the biggest mistake of this pretentious article and the whole thread is to talk of programming as if that was some uniform profession. It's ridiculous to assume that making an iPhone app requires the same skill set as programming a rocket guidance system. Maybe the self-proclaimed gatekeepers of "programming" like the author of this blog post should start by actually creating a profession called "programming" before they try to gate-keep it.
I think programmers are also sort of at fault for this. How many people try to increase their perceived status by talking about how some hard thing is actually super easy to them? While it might elevate their status among their peers, it reduces the status of the profession as a whole (granted in microscopic increments, but still, if a project manager hears "this is easy" all the time, they're going to start thinking these things are easy).
Finally, I also think as a profession we don't do a great job of just presenting ourselves as professionals. How many coders (myself included) tend to look like slobs all the time? If you watch TV, all the other professions look sharp, and anyone tech related tends to look like they just climbed out of bed. Just saying, perception matters a ton.
- There's too many things to remember, this is true, there's a lot of stuff you have to remember
- It's so boring, I have to sit all day at a screen, this is true - if you don't have an internal representation running in your head and enjoy doing that I can see this would be boring, the tinkerers mind I call it
- Its too hard, something happens and you have to find out what, who cares? probably related to the previous points.
- I don't like puzzles, something I've noticed, if you don't like solving puzzles, then programming probably isn't for you.
Probably more, any others people have noticed?
Edit: maybe I should say solving puzzles - not necessarily game sorts of puzzles, but more a sense of hmmm, what happened there? and the determination/ability to solve it, not just throw up your hands.
Been programming since I was 9* and it’s the best thing ever. Precisely because it’s full of problems worth solving. There’s a reward beyond “You figured it out”, maybe you’re the first ever to figure out this particular puzzle, it something starts working that wasn’t before, or you do a thing that previously was impossible.
But puzzles? Meh
* that’s a good 24 years of writing at least a little code almost every day
Maybe what you meant by "probably", but I've seen my share of fantastic developers that hate programming after hours, and hate solving puzzles if it's not part of the job.
Not sure what it speaks to. Might just be I've run into more "programming is a job" types than normal.
Programming is a creative endeavor for me, whereas puzzles seem pointless for some reason. I finished the puzzle, now what? The same goes for computer games.
With programming I often have created something that didn’t exist a few minutes prior and that is such a joy.
I can't get that with a rubik's cube.
Nearly every field requiring commitment gets a negative reaction of this sort. What fields aren't boring 'til you get them? What fields don't require memorizing things? At best, you're talking any field requiring thought but even there, lots people give up on intense thought, until they one day get it.
So my preferred games now are the fast exciting kind, and often language-related like Taboo.
People who say "huh, that's weird, I wonder why?"
These are things like:
- attention to detail
- development of a sense of when attention to detail is very important and when "just about" is reasonable
- ability to communicate a process in words, especially written words
- ability to identify patterns and recognize that one has identified a pattern (pattern recognition is automatic in animals and especially humans, but it is often occurring subconsciously)
- ability or willingness to ask "why?" and follow that answer far enough to understand the basic reason for something
- willingness to challenge status quo when the eventual benefit may be worth doing things differently
- ability to consider multiple factors at once (time, cost, effort, etc. etc.)
I could go on and on. Suffice to say, much of what makes good programmers/developers are attributes and behaviors which make good humans. Sure, if for example you have a huge inheritance, you could probably get along fine doing absolutely nothing difficult or productive or creative, but that's not really living. So human life involves a lot of the skills on this list.
Being a programmer involves understanding how computers work, what makes them interop, how networks work, perhaps some basic understanding of electronic engineering concepts, the ability to keep mental maps of insanely complex callgraphs in their head, etc.
This is not something "everyone" can just pick up and do. To reduce programming to a set of soft-skills is what got us into this mess in the first place.
On the other hand, if someone has most of my list, then they are probably quite capable of learning the more specific things that meet your requirements.
Working through complex mental maps is all you need. Thinking through all possibilities and edge cases, and logically ordering instructions to represent a mental model. It's similar to chess where you have to evaluate every possible and unexpected scenario. If you're good at chess you'll almost certainly be good at programming.
If "programming is easy" for some people it's because this one skill comes naturally, and beginners should be made aware of that before they get unrealistic expectations.
I think the problem is also compounded by people who mostly have superficial knowledge of programming (a few frameworks here and there, couple languages etc) and are in the software industry and carry the title of programmers and engineers.
In reality, it's that process * 1000 plus the addition of a few other processes those tutorials can't expose because they're only needed at the intersection of 50+ different applications. Plus an entirely unaccounted for process in the form of creative problem solving that makes up 90% of the work.
I've had a number of executives plop down at my desk, proudly proclaiming to be a python dev only to see their eyes glaze over and every other word fly above their heads only a few commands into the interpreter.
There are also a lot of resources which sound as if they would be great as they have big name authors but they actually make you more depressed. I had many such experiences most notably with Stroustrup’s books. The one called Programming - principles and practice is a hopeless soup of complicated syntax and lousy pedagogy. It’s aimed at beginners but really anyone who’s read chapter 6 of the book where he seeks to teach ‘what programming is actually about” using a calculator program as an illustrative example, he really makes it appear as if recursion is some exotic and esoteric thing, whereas it is a recurrent theme in the domain of programming. I say this because before this chapter he never used recursion and it becomes very unintuitive, unlike SICP, where from the beginning this is identified as one of the central ideas in all programming.
I was fortunate I used to read e-books and didn’t spend too much on purchasing flimsy books, turns out, as far as CS is concerned, the best stuff is actually free (and accessible as pointed above in the link)
Regardless of what my expectations are for some language or library, simply it is not there, so after banging my head and burning hours trying to solve a problem I would realize I need to use some dirty workaround (and I hate those so much I do not have enough words to describe...)
Just a few example from JS world:
- parser that is simple
- jest framework working fast
- universal planet wide date time
- SCSS compiler that does not require C++ ...
- multipart/form-data request which can be interrupted in nodejs
- ...
For each of above there is some solution, but it looks like a dirty hack ... it seems with time, instead simplifying things we are complicating things that should be simple.
The other day I was pondering, how in any other trade people becoming masters, as they becoming good with their tools, tools are becoming part of their body, so they are focusing more on art and creativity, in programming, except for those rare who are blessed with very good and fast memory, tools are always changing ... as soon as you become comfortable there will be new set of tools... and I should not even start with the whac-a-mole of method and property renaming ...
If the points you brought up were simple, it is much more likely they would already be solved. The problem with these things listed is there is a massive amount of complexity in the edge cases.
Rust is currently suffering from this in its libraries to a very great degree. Take XML for instance--the Rust alternatives are all missing quite a few features, but so is the wrapper for libxml2.
So, what do you choose when you need one of those missing features? You can 1) try to add it to the Rust libraries, 2) try to add it to the wrapper, or 3) just wrap the C library yourself with the features you need.
I find myself using Choice 3 (which I'm grateful I can do in Rust) more and more because I'm tired of incomplete Rust libraries that look like they do what I want until I start hitting those "corner cases".
It makes sense that people see a library, notice the problems, start their own - then stop at the hard stuff. And people like yourself who might have the talent to fix it will also have the talent to work around it in much less time with far higher reliability by reusing something else.
What abilities does "that someone else" has, that you don't?
When you building custom application, you are trying to do it in most optimal way for the $ paid. So, when you building something for the value $ let say 100 SP (story points), and then when you stumble on a problem in OS usually you do not end up building 100000 SP side projects (worth $$$$$$$ of your time) in order to complete 100 SP project. Especially when you crossing to someone else domain.
Everyone has its own domain, so if Google, FB, Oracle, Microsoft have the main code base for Java, C#, JavaScript, React, Angular ... or else, it is expectation that they will listen cries of users, sometimes they do other times they do not.
Few years back I was involved in Google Chrome thread about auto-fill feature, at the time I was working at the health organisation, so to cut the long story short auto-fill was populating data and causing issue, in the very long thread I gave number of cases why is automatic form fill bad (and I was proposing some one-click alternatives), at the end Chrome team was sticking with what they wanted, and justification was "Because we are Google team, and you are not, so what ever we say is the best" - end of the story.
This is true. What is meant when people generally say, "programming is hard," is that only some especially gifted people have a special talent they are born with to truly master it.
That's complete non-sense. It's the same kind of thinking that leads people to believe that programmers cannot possibly understand the deep complexities of product design, management, or any other skills a human could possess. It pigeon-holes people into a narrow vacuum of skill.
Yes, the skill of programming is technically difficult. I know many programmers, myself included, could probably write a passable implementation of binary search. But I know a good number of our solutions, when verified formally, will have errors in them.
What most people refer to as "gatekeeping," is this idea that some of us are born programmers and others... should not hold up hope that they can learn the skill.
Programming is a skill that is a commodity. The art of it is in being able to think, critically and solve problems using it.
I believe everyone who wants to train enough to program professionally can do so, but many wouldn't enjoy it. Talking to machines is really unforgiving.
It is getting easier over time though so the barriers to entry are lowering.
The skill set includes knowing what the different pieces you can use are (dove tail vs other corner connectors, etc), taking the time to plan out what pieces would be best, etc.
The aesthetics of right abstractions are at play that's for sure.
If you want to build nuclear reactors, sky scrapers or semiconductor manufacturing lines, go to college for 4+ years and follow the traditional paths.
If you want to compose a symphony or non-trivial software, skip the college and go sit in front of your instrument(s) for as long as you can stand to every day.
To call programming "Software Engineering" and building coursework around that term would be similar to developing coursework around "Music Engineering". The rigor of science/engineering (while certainly at the foundations of everything) distracts from higher-order and more human understanding once you get past the basics.
The entire game with software is managing complexity in a way that is sustainable for the participants. Effectively, this is what art seeks to accomplish as well. Capturing many raw emotions/ideas and integrating them into a single solution.
This is unrelated to the general thesis and cleaves the audience for this post in half.
Why is it unrelated to the general thesis?
I agree with the OP's premise: https://twitter.com/jfarmer/status/1361134242491633664
I also helped start https://www.missionbit.org/, donate + volunteer with orgs like Black Girls Code, Code2040, etc. Phrases like "the diversity card" serve no rational purposes other than to discourage folks who already see programming as "something for other people".
And yes, I can imagine someone replying: "If someone is discouraged by _that_ then they're going to be in for a rude awakening once them start programming." Now imagine me wondering whether that person is more interested in winning a debate or learning about the actual circumstances and perspectives of their potential students.
Programming _is_ hard. It's also one of the few careers that consistently give people power and autonomy over the trajectory of their lives.
Either the OP wants that world or he doesn't. If he doesn't, fine, say and do whatever. If he does, then he should recognize that phrases like "the diversity card" have 100% downside.
Personally, I'll chalk it up to the OP being Romanian and using words/phrases whose sense is hard to get without being in the US or Canada (maybe UK/AUS/NZ too). For example, he says:
> I’m the gatekeeper now.
Maybe he means it in the sense that most folks in the US tech world mean it, but it doesn't seem like it. The OP seems to care about beginners being more discouraged because they were led to believe programming would be easier than it was.
But the words and phrases he uses signal that he wants to make the environment inhospitable to "casuals".
It's the difference between semantics and pragmatics.
Maybe that was his intention, maybe it wasn't. Maybe he thought he was just "telling it like it is".
Maybe you disagree that the article has that tone. If so, I'd politely suggest that the way the tone presents to someone used to "programming culture" might be different than it presents to someone outside, someone unsure about their place in that culture.
Let me put it this way. I spent a lot of my time and energy finding people of all ages and backgrounds who have decided that programming is for other people and convincing them it doesn't have to be. This article makes my job harder.
Compare it to this:
> Some people will tell you programming is easy, other people will tell you programming is hard. Most of the time that's a reflection of how they felt or how they think other people should feel, not how it will feel for you.
> Forget easy or hard. Will it take a lot of effort to become really good? Yes. The question is whether that effort is worth it for you. The only way you'll find out is if you give it a shot.
> With the right effort, you _will_ learn to program. It can be for you if you want it. Let's figure out together whether this is exciting for you. If it is and you put in the work, I'll be there to help you go farther than you thought possible.
None of this "gatekeeper" or "diversity card" nonsense. Talk to the person as a person. Don't talk about your favorite abstract bugaboos as it relates to that person.
It has nothing to do with the merits of diversity, it has to do with the fact that anything valued by society will have the signal forged by hucksters. Literally anything.
And by that I mean that overselling own skills is incredibly frequent in this field and basically requirement in a lot of sub-cultures. It is just so incredibly common to read two tutorials and then claim yourself expert. It is not like consultants trading in impressions were rare or great expert developer comming in just for us to find we know more or something like that was rare.
But typically, they dont use beginner card nor diversity card, they are guys who do their best to conform to every stereotype of great programmer who play "I am expert" card.
So he googled for 6 weeks and became an "expert".
All of these are useful, easy to acquire, everyday skills that can be done at incredibly high levels of sophistication. Programming is easy in exactly the same way all of these things are easy, and hard in the same way all these things are hard.
>Do you program a computer, or do you build software?
Programming a computer is accessible to millions upon millions of people. Building and creating software is a craft for which we are well paid.
Without music, the easily distracted part of my brain starts looking for distractions, which drags the productive part of my brain along with it.
- accessible != easy
- having the hard work done for you != easy
The “easy” myth was largely started by bootcamps trying to make an easy buck (NPI). More power to them, because clearly a lot of graduates were happy with their program and the career it unlocked.
But working on hard problems- often the foundational pieces that make the “easy” stuff easy - is a different ball game.
I spent the last 15 years of my career as an engineering manager type role, and the people who shone the most were the physics PhDs, electrical engineers, mathematicians that had changed careers, and the people who had for example worked on early home computing (where your computer crashed multiple times a day).
We made it a point not to hire from bootcamps and rarely new grads - not because of gatekeeping, but we had much more success paying 50-100% more for a hard science candidate.
> Most beginners in programming eventually end up with the same ingratiating message: "Programming is easy, everyone can do it"
This was not the message when I started programming. The message was much closer to it being something that is only for extremely smart and dedicated nerds. The message has been conscientiously shifted through dedicated messaging campaigns, for better or worse.
As I learned to program, I thought the message at the time seemed wrong, that it seemed easier than the conventional wisdom suggested. But during school, that developing opinion was tempered by experiences I had working in groups with or tutoring people, some of whom just never seemed to get it; they were smart people and could understand the answer once arrived at, but never seemed able to independently get to the next answer. Some of these people are very successful with doctorates in other technical fields, but still really don't get programming.
So my conclusion is that programming is neither uniquely hard nor at all easy, but definitely has some interaction with how individual people are wired to think and learn. This doesn't lend itself to nice slogans in an ad campaign though.
Anyone can start cooking; because the entry level is really low. But mastering cooking is another thing.
Programming can be learned progressively, even at a very young age. You won't hit any real wall.
It's just a matter of steady slope.
But the issue is not bootcamps, or StackOverflow, or "positivity" about whether or not individuals can be programmers at all.
I had to flip that around from day 1. Python is not "easy". It's just "easier" than, say, C, assuming you already know C and the fundamentals of memory and stuff. If you don't, Python might even be HARDER to learn, because it automates a lot of that intuition about objects and memory away from you.
So you're not struggling because it's easy. You're struggling because it's hard! Like all programming. But also rewarding. Start from the basics, try to get a deep understanding as you go, stick at it, and you'll experience the rewards sooner than you think.
It was possible to walk through a short program and "think like the machine" to understand what it did. Frankly, even the GOTO was helpful in that aspect. There was no mystery about what GOTO did.
Today, Python is my main language and I'm quite productive with it. But I can't tell you with a straight face what a statement like x=3 actually does. In fact, to help people with Python, I'm more likely to revert to an explanation that is like what BASIC does with LET X=3. So I have to fictionalize or abstract away the computer to a greater extent.
If you instead talk about whole process of everything involved, then split it up into 50 distinct skills that all come together to 'imagine, design, mock, develop, run and support production ready software'.
To most people some of the needed skills are 'easy' and others are 'hard'.
For example just writing 'compileable code' with the help of stackoverflow is probably easy for most. That's not what i call 'programming' but pure beginners might.
I came her to say pretty much the same thing.
As far as I'm concerned, "programming" is just the art of writing instructions. For software developers, that means writing instructions for computers in a machine-readable language. But really any form of recording instructions is "programming", regardless of who the instructions are meant for.
I've taught my wife a little programming and for her the hard part is understanding how to translate instructions into a machine-readable language. Her biggest struggle is understanding how to decompose each step until it can be accomplished using the limited features and tools provided by the language.
When I think back on my education, we really didn't talk very much about the process of logically decomposing instructions. I've also had a hard time finding any resources to help me better explain the process to her. I wouldn't be surprised if that hurdle is responsible for most people giving up on programming.
I've been doing some deck building at my house and I realised that it's exactly like programming. I'm just some schlub who thinks, "I know saw. I know wood. I know screws. I can do this!" And then I discover:
- I can do this fast, and it'll look like a deck, and work, but not live long, and have a lot of really ugly things that don't quite work.
- I can do it really slow, and patiently, and make a lot of mistakes, waste material, time, and end up with a wonderful deck and a TON of lessons learned.
- I can get an expert team to do it in a weekend, using all the same tools and materials as I would, but because they've done it 100 times before they look like absolute wizards.
- And I can get a team to do it very poorly too, if I cheap out and don't hire the right people.
First, I believe “anyone can code” is true (and generally anyone can do pretty much anything, barring obvious physical incompatibilities it’s only the matter of motivation). Second, “coding isn’t hard” is meaningless, as the verb “to code” is extremely vague.
That said, understanding different subject domains is hard, and good software architecture is hard. However, the mantra repeated by startup incubators like YC applies: to paraphrase, we achieve great things because we are ignorant of how hard it would turn out to be. (I sure was ignorant when starting out as a self-taught software engineer a decade ago, and I appreciate that back then no one warned me about how difficult various aspects of it are.)
I like the experience of teaching and helping (though not through selling paid courses or anything like that), it helps me understand the fundamentals better myself. When I do that, I don’t tell people that “coding is easy”—but I might say something along the lines of “don’t mind how confusing this process looks now; with good help it’s realistic for you in N months to get to a level where you can honestly earn US$15+ per hour (I will hire you myself if no one else does, as I routinely need help) and are able to continue to study by yourself”.
I'm of the opinion that anyone that thinks you must be of some special intelligence to become a software engineer is wrong because frankly it's no harder than many other careers. However, I do side with the author that we shouldn't be dismissive and pretend it's extra easy either.
I want some nuance. As with all things, programming is easy to get into, hard to be great at. Doing it doesn't make you particularly special. Working hard and getting better at _something_ is what matters.
What frustrates me is the reputation programming has, it has somehow cultivated this image that computer code is some kind of magical and esoteric thing which you need to be some kind of genius or wizard to understand. It's reputation is such that otherwise sensible people will balk, hesitate and just completely shutdown when confronted with code. I am an engineer (the non-software type) I see this behavior in my coworkers and it frustrates me to no end there is this prevalent attitude 'I'm not a programmer, computer code is too hard to understand...'
It reminds me of the reputation Mathematics (the subject) had when I was in high school. Math had a reputation as being a 'hard' subject so a lot of people seemed to come into it with preconceived notions that it was difficult to learn and therefore they weren't smart enough to understand it so they weren't going to engage with it. I see exactly the same attitudes with 'programming' today.
I never really found reliable numbers for what percentage of bootcamp graduates actually get a job as a software developer. Their marketing mostly talks about anecdotes and a lot of bootcamps have a very strict application process so in a way they act as gatekeepers as well (not to mention that not everyone can afford them).
> print 'test'
inside the Python REPL is programming, all this is not that complicated The only issue is that we've stopped calling that sort of stuff "programming", we've started moving the goalposts more and more, and then of course "programming" has become harder and harder: if you don't write tests you're not programming, if you don't to TDD you're not programming, if you're not ready for pair-programming you're not programming, if you're not writing everything inside a container you're not programming etc.
"The group found that pass rates in introductory programming courses appear to average about 75%; that there is some evidence that they sit at the low end of the range of pass rates in introductory STEM courses; and that pass rates both in introductory programming and in other introductory STEM courses appear to have remained fairly stable over the past five years. All of these findings must be regarded with some caution, for reasons that are explained in the paper"
[Edit: Nb my perspective is that of someone who'd never used a Mac full-time before working in mobile development, had never even looked at Obj. C before, was quite familiar with Linux and to some extent Windows, and had a passing familiarity with Java, so if anything my background should have biased me toward Android, slightly. Last time I touched native on the two platforms was, oh, 2017 maybe, and it was still true.]
It is true, as the article points out, that programming is hard. But we teach lots of things in school that are hard that no one will do professionally. Calculus is hard too, but more people take AP Calculus in the US (based on https://secure-media.collegeboard.org/digitalServices/pdf/re..., around 400k) than take AP Computer Science (based on same, around 188k). I don't think Calculus is that much more valuable, nor is Computer Science that much harder, to justify such a large gap. The point is, even among STEM subject, there's a taboo around computer science and programming.
But it is equally true that it's not helpful to tell people that programming is a walk in the park, and the article does a good job explaining that. Perhaps better than saying "programming is hard," or "programming is easy," we say "programming is worth it" and leave it there.
FWIW my school didn’t offer AP Computer science till the year I graduated, where AP Calc had been a thing for much longer.
I really thought this was no longer true, but it rings true to me as someone who was in school in the 1980s and 1990s. Back then, being into computers was a social liability. It was way worse than being into math and science. Math and science weren't optional, and they were important for college admissions, so being good at them didn't prove you were a weirdo who actually liked that stuff. You were just taking advantage of your intelligence to succeed at something that everybody else wished they were better at, too. (Assuming, of course, you didn't cop to thinking calculus was SUPER COOL.)
Being good with computers, on the other hand, demonstrated a kind of stupidity that outweighed the intelligence it required.
To understand how it could be socially negative to do something that everybody assumed required a lot of intelligence, you could, from a narrow point of view, compare being good with computers to going to jail for beating up a police officer. Being strong and tough was a desirable attribute, just like intelligence was, but that particular way of proving it was way worse than not being strong at all. It showed a different kind of weakness that cemented your identity as a loser, somebody that a "good" person was better off not knowing. Even if it made you seem mysterious and fearful, at the same time, it made you "less than" and socially irrelevant.
I thought this was changing in the 21st century. When I look at people under 35 in the industry, I don't see signs of having grown up under that social stigma. I might be missing it because of other generational differences, though. I'm curious what others think.
> Perhaps better than saying "programming is hard," or "programming is easy," we say "programming is worth it" and leave it there.
Maybe "programming is necessary" or "programming is ubiquitous?" Maybe the best way to remove the stigma is to convince kids that people who struggle with programming will wish they were better at it, rather than being able to dodge it entirely. Let's turn it into something that everybody wishes they were a little bit better at, so they don't automatically look down on people who succeed with it.
The best analogy I can get with programming is to compare it with lawyers.
It takes 7 years to become a lawyer's, and it takes about the same to become a senior programmer.( Assuming 7 years of work experience with a mentor ).
Now, lawyers all have a field, family laws, international laws, constitutional laws, corporate laws. Ask a lawyer who did all his career in corporate law to have a go at a divorce hearing... He will be miserable, and fail.
Programming is similar. You can hear a good lawyer talk and win a case, and it looks easy. But it's not easy.
How many case did he lost before, how many failures.... And now many hours of study did he spent to make sure the argument is a winner?
And where I resonated with in this blog post, is the arrogance and the entitlement of some of those junior programmer, specially in the front-end web industry, who claim to be senior.
I once worked with a 22yo kid who was paid as much as I did, and couldn't write a loop.... He was just a good talker and negociator. 1000$/day to write CSS is really a failure from recruiters and the whole business in general. When juniors think they are senior, they usually take the lead, and the projects goes direction 'fucked'.
And now being good at programming also means being able to get rid of those parasites , which is not eqsy- as their capacity to argue and convince is inversely proportional to their capacity to deliver quality working code.
I randomly met some professional software engineers through a local run club and started doing online classes/coding challenges with them through edX and project Euler. The spark came back and I decided to entertain the possibility of doing this full time. I made the leap and have been quite happy with my decision.
I think I was put off because I struggled so much with programming compared to my other classes. I didn’t see other people struggling with it, because the smart kids were the only ones getting called on. In hindsight, most of the class was struggling and I fell somewhere in the middle.
I like the idea of explicitly saying programming is hard. But it’s double edged, it will put off many people who may have an aptitude for it because most beginners are full of self doubt and humility. To the authors point, we should work towards changing the connotation around the word “hard” to be more positive.
Cat McGee and her ilk, to simplify, are selling programming as a lifestyle. It's not the coding that's the point- it's the opportunities it gives in terms of good jobs, ability to live in foreign countries etc. And they gush over how programming is in fact easy. I can definitely see how programmers might feel uneasy about this trend of tons of people being interested in getting into the industry. Obviously, at some point certain areas are going to be put under a lot of pressure. Potentially.
As the above author notes it's a lot harder to work on a fully functioning 100k line webapp/software than a toy website. And from what I see on twitter, most of the drive is on html/CSS/JavaScript learning.
But in other ways it's a good thing. Even if you are not a developer - writing code can be a real joy as a hobby. And a bit of coding skills can help people in non-coding jobs. Or just to create some thing small. (disclaimer I'm a data analyst trying to become a data engineer). And the Twitter groups like #100daystocode do expose more people to the fun side of coding. Let's face it most high schools fail at that.
On a final point, like writing a novel/script (a demon I know all too well.) there is a dream bring sold that you can live in an exotic location and work remotely. Its more of a realistic dream than writing to be paid, but still people might need to be careful about fools gold.
Personally, I see things as 'programming can be easy or hard (but doable), but only if you have the type of mentality that you will never quit.'
Basically anyone can learn a language if they are exposed to it constantly, and if you are programming or debugging a lot, it is inevitable that you will learn the language you are looking at. And basically everyone could get to that point. They could also learn to communicate basics with their language. But it obviously doesn't mean you can build a rocket just because you have the ability to read language and books related to rockets.
So I think there are some easy things about programming that do apply to 'everyone', and for those things it may be appropriate to say 'anyone can do it'. However, there are certain things that require deep understanding of complex subjects generally only learned by hard work. If you are not the type of person who likes to work hard to learn, then you "can't" do those kinds of programming tasks.
So it is both easy and hard, depending on your mentality. What parts of it are easy and what parts are hard may vary based on aptitude and a variety of other factors.
Being able to marvel at the magic of code can get people through those grueling moments where nothing works and the answer isn’t on StackOverflow.
A lot of people can't do those things, and they struggle mightily; in some cases they simply cannot do it. Might as well try to be a musician if you are completely tone-deaf.
However, like cooking, programming requires years of dedication, experience, and experimentation to master.
“Easy” and “hard” are really only meaningful on a relative scale.
While I think the author individually makes some decent points, I would normally disagree with the top-line “programming is hard” message, and the further implication that “programming-is-hard” gatekeeping is a positive. (OTOH, its worth noting that much of the opposition to the gatekeeping is capital interests trying to increase supply to drive down labor costs, and much of thr gatekeeping is the reverse from incumbents—and must especially the last skilled, most at-risk from expansion of skilled labor supply segment of incumbents—and has nothing to do with the merits of the arguments.)
OTOH, on a scale where “using the right quotation marks for the language you are writing in” is prohibitively difficult, I’d agree that “programming is”, at least, “hard”.
WTF does "being a senior" even mean?
Having the word "senior" in your formal job title, e.g. https://www.levels.fyi/
And we've done it to ourselves. Every time we as a collective have complained that X is a waste of time, this persons job has no value, we don't need them, guess what? The people in charge listened. I personally don't like that this has happened for the primary reason it makes my job harder.
In these definitions, "design" refers to the overall structure of a program or system. The level where decisions like "do we hit the DB for every query or put a cache in between" are made.
Reality is, the title means hardly anything anymore except "this person has this many YoE" and whatever value the company attaches to the title in a given context. That's what has made the title so watered down.
Additionally, many graduates can make technical designs. They won't be the best. They won't think of everything. They likely don't have the foresight to think of problems happening along the way. But they are being taught how to convert requirements into a working solution during school years. I have a hard time believing "seniority" is defined by a few years of practical experience in something that was taught in school.
Right now I am doing SICP and it’s giving me the essential ideas which all CS students learn but which hardly any programming blogs recommend to beginners. Learnt so much already (I am halfway though chapter 2), I now realise it was never about the language, it’s the ideas and techniques like recursion and FP that are the core of programming.
There’s no need to say that programming is easy, just tell people what they really need to do to be good programmers. And without a strong CS foundation it’s very hard.
I think 95% of people just have not flexed their brain muscle hard enough (and often enough) to spend more than 15 minutes in intense focus trying to solve something without giving up or being consumed with self-critical thought. This is blindingly evident when trying to teach people (probably hundreds at this point over a decade) and very few manage to have intense focus without some completely self-sabotaging mechanism about their own worth, their own abilities, are they smart enough, etc.
This by far is the hugest inhibitor... on the small chances where I've found ways to move past this, people will pick up core concepts quite readily and easily, and exclaim "oh, so wait this really isn't that hard."
Things like rust data types or something might be "hard" but no one starts there. If you follow along the general path, you can have large accomplishments in learning/progress the entire way up the food chain over 10+ years and never once along the path is it really like "GOSH THIS IS HARD!"
Scripting Word or your editor of choice is not particularly hard, writing a python script to read a csv and output some text is relatively easy.
Designing and implementing a large scale Web application with metric collection, real time reporting, multitude of data integrations, aggressive availability requirements and worked on by 10s of engineers across a number of teams is hard, real hard.
You’d see the same thing if anyone who used a keyboard was called a “Writer.” You’d see hello world tutorials demonstrating that all you have to do is press these keys on your keyboard and they show up in your text editor! You can be a Typer! And then what we actually call lawyers would come in and say no, writing a good document requires a ton of work and prior knowledge. And others would say that doesn’t matter because I just need it to write work emails and that’s more typical of a Typing job. They’d argue because they’re all talking about the same job, kinda, and that lets them talk past each other. Vague terms make for discussions that go nowhere.
I hope in 50 years, being able to program hello world will be as universal as being able to type hello world, and the different parts of programming will have clear enough names that we can say the equivalent of: typing is easy, clear email communication takes some writing skill, and writing a good legal contract for your client is hard.
Being a programmer. Doing it for a living. Getting good at the craft of programming and learning the foot guns and ins and outs of your chosen language/stack/framework. That’s hard. And time consuming.
"Does everyone need to learn to program?" (https://news.ycombinator.com/item?id=1759475)
"Not Everyone Can Program: As Seen in Pixar’s Ratatouille" (https://news.ycombinator.com/item?id=10020748)
"Not Everyone Needs to Learn How to Program" (https://news.ycombinator.com/item?id=11070518)
"Everyone Should Learn To Program, But Not Everyone Should Be A Programmer" (https://news.ycombinator.com/item?id=5469812)
In my view, programming is easy, doing something useful with programming is as hard as the thing you're doing with it, such as software development. When programming is hard, it's because of the things that generally make hard things hard, in or out of programming: Complexity, domain knowledge, shifting technology landscape, organizational management, etc.
The thing that makes software development stand out is the degree of complexity that it allows for.
An indication that software development is hard, is the number of books and debates on trying to manage it.
Disclosure: I've been programming for 40+ years, but am not a software developer.
"Difficult" in the sense of mathematical elegance, algorithmic design, or other sense of academic "hard". Keep in mind the average developer probably doesn't understand big-O. Usually these programs/systems are focused on the specific algorithm and not a lot else.
"Complex" in the sense that the code may be no more than a glorified crud app in the classic database-transport-presentation architecture, but nevertheless has such a breadth of data, classes, types, frameworks, and the like that it still becomes "hard".
So a "casual" programmer will run into the hard-complex code structure, but will flounder completely at hard-difficult algorithm.
Of course SV/FAANG interview on hard-algorithm, and then make them spend all day on hard-complex crud.
The reality is that hard-algorithm requires academic smarts, but hard-crud requires social and management skills.
Programming involves having a purpose and understanding the architecture and so on. Writing code isn't, per se, about all that.
Kind of like saying "A five year old can learn to write." and someone having a cow about "A five year old cannot go from not knowing their alphabet to being an award-winning author overnight!" Well, okay, but that wasn't what was meant when someone said "Any five year old can learn to literally write."
Programming is more of a big picture thing and that fact is largely unrelated to the simple fact that, yes, if you wish to write code for some reason, you actually can just look stuff up online.
And I think for some people who are used to needing permission, socially, to do anything, it actually is a significant detail worth commenting on that You don't have to ask anyone or get permission to do the thing. You can just look stuff up and do the thing because you decided to do the thing.
I know a little HTML and CSS, but I don't self identify as a programmer. I am self taught and it's useful because I blog and it's helpful for that domain, but, no, I still can't, say, write an indie game (an actual goal of mine).
It is literally true that anyone can code by looking up stuff online and maybe for some people what they are kind of trying to say, to build on a metaphor used in this piece, is "You don't have to go talk to the head chef and fill out forms requisitioning eggs. Anyone can crack a couple of eggs and start cooking!"
Which doesn't in any way imply that cracking a couple of eggs and frying them up makes you the equivalent of a trained chef in terms of the quality of your work, the complexity you can handle and other pertinent stuff (such as ability to manage a staff in a commercial kitchen).
My own experience as a programming teacher leads me to believe that one of the main difficulties for the new programmer is the level of precision with which they must be able to articulate a concept in code in order to have it work. For example, it was much more common for a given student to grasp, say, a conditional statement and when to use it than it was for them to understand that changing the capitalization of a variable meant they weren't referring to what they wanted.
Those things are all hard if you want to master them, but not everyone needs to be a master. I can draw, get great joy out of it and benefit from it without being Rembrandt. I can use vector math to make games and not dedicate my life to mathematics. This is also true for programming.
You really don't need to be smart to be a programmer, but if you want to be good at it you need to be smart enough and tenacious. Programming is just a tool to solve problems in the modern world.
The book "The Outliers" was what gave me the confidence that I was smart enough to be a programmer and achieve great things. All it took was a positive mental adjustment. This article is rubbish.
Learning to program can be a smooth path, but it's also a long one.
CS is at the stage of building enormous bridges based on experience. No guarantees that they can sustain a specified level of stress.
We do, but no one wants to pay for it, outside of very few select industries with very high reliability requirements (space travel, medical devices, etc.).
So many of these breaches are caused by absolutely boneheaded mistakes, some of which are known bad practices dating back to the '90s like allowing SQL injection, that I'd say that, no, we darned well do know how to do this. We are simply failing to hold developers (and their employers) accountable for knowing how.
The same could be said for cooking, but I'm here to say that cooking is good and everyone who is interested should try it!
There's nothing wrong with canned software, but a bit of programming/algorithms can empower you in almost any discipline, particularly ones that have to deal with numbers or data, much as algebra and statistics can.
There's a reason we have Scipy, Octave, Matlab, Mathematica, R, SAS, Julia, etc. after all.
Not to mention that even Microsoft Office includes VBA, and every web browser includes JavaScript.
But, the thing is... programming is easy for some people. If your creative mind turns that way. Like "drawing is easy, anyone can do it", which is true provided you spend most of your waking life drawing. "Music is easy, anyone can do it" - again, true for some. Not for me, I'm almost tone deaf and have no sense of rhythm.
But programming is different from Software Development as a career, just like "drawing" is different from "commercial illustration". Being good (or successful) at Software Development doesn't necessary involve being good at programming.
And it's funny, because the article has nothing to do with whether programming is hard or not. Not idea what Wayne thinks of the matter.
[1]: https://www.hillelwayne.com/post/crossover-project/we-are-no...
When people disagree over whether something is hard, I think the disagreement usually comes down to semantic disagreement over these two definitions. Also, some people think we can get rid of the latter ("not many people could do this") because it's hard/impossible to prove. But I think both definitions are an important part of what we mean by hard, and we can't get rid of either.
On the other hand, creating and managing a large code-base is no mean feat. Making production code that does something people are willing to pay for usually takes time and effort.
And as usual, learning to program is one thing. Becoming good at it is quite another.
Quite vastly different fields. And two of the first ones are needed for good software. And the last one if something novel is being done. What is hard is to be in some intersection of these and being able to deliver value.
Programming itself might just be implementing spec or gluing code together, skilled field, but could be done by tradesman...
From my point of view, programming is a creative process, like writing, anybody can write, it's simple. But few are able to write a book, and very few are able to write a good one.
If you are relying on others code/libraries, you are not solving any problems, all the heavy lifting has been done for you, and you are only fillings the blanks and/or stitching multiple stories together to write the book.
What is hard is modeling large, complex problems and systems in code, that meets its functional and non-functional requirements.
The superior “programmer” is one who can to some degree perform the latter. Of course few organizations have any way to quantify these superior skills, resulting in the rote textbook question and IQ interviews that today defines a “programmer”
Want to be a real engineer? There's a professional body for that. Doctor, lawyer, electrician, etc.? Same. Not us programmers.
The big difference between us and them is liability. Nobody expects software to work. Thus nobody gets their pants sued off. Thus we don't need professional accreditation; we're not vetted.
Hopefully that level of interest and funding is returning. When the Chinese walk on the moon, that will be a wake-up.
software engineering, that's a completely different level of hard. you have to be a good programmer just to begin to understand how to make actually good products, not just toy leetcode puzzles or write only run once scripts.
Accessibility thus actually becomes the crucial differentiator. The opportunity to learn and be taught by the right people, to learn at the right pace and the right time, to be in a motivating environment, etc.
So I think what people mean is... Yes programming is accessible, and there is good job prospect, and if you are worried you're not smart enough, that's crap, everyone is smart enough, just give it a shot. All you need is to be interested enough to put in the time and effort. Now you might not be interested enough, but compared to a lot of other things, programming costs you nothing to try.
Same with mathematics, it's easy, but most people don't find it interesting enough to put in the time and effort. But mathematics is also less accessible, not as many blogs, free material isn't as available, there's no machine to freely assess you and grade your work, etc.
Programming needn't be hard for simple business problems.
With how rich of tools are out there, every white collar worker would benefit from putting at least some scripting tools in their toolkit.
Banging out scripts is easy. Cobbling together hacks is easy.
Software engineering is hard.
But the real world is so much more complicated and that it is the real gatekeeper. I've taught several non-technical people how to code, and the biggest first hurdles usually are: setting up their dev environment, installing dependencies, understanding the command line.
I think it's interesting that explaining why you have to add things to your $PATH is harder than explaining how an if statment works.
Modern computer systems are just very very complicated which makes teaching them challenging: nobody, even very very good programmers, knows how all software works from top to bottom. So being productive writing software requires a self-starting, deductive approach to solving problems, which is much harder to teach than basic syntax.
But despite that, they still have trouble getting anything to happen.
While not all smart people can program, professional programmers have an average IQ that is a full 24 points higher than average [0] That's one and a half standard deviations above the population average.
If you account for all the programmers you meet that seem incapable of doing anything, I suspect that the IQ of people who actually get things done skews even higher. Even if you buy into the whole "IQ doesn't measure everything" camp, the things it does measure (logic, pattern matching, memory, problem solving, etc) are exactly the same things that are critical for a career in programming. Based on this idea, it can be said quite simply that the overwhelming majority of the population are simply incapable of performing the job well.
[0] https://web.archive.org/web/20150325075720/http://www.statis...
Then why do so many self-described professional coders do horrendously on fizz buzz or equally simple problems?
Oh, no, the hardest part is to modify the poorly written complex pieces so they continue to function properly.
Programming is nothing compared to architecture though. Knowing what you want to build, in a way that meets the requirements, is a very time consuming task for all but the simplest of problems. Once you have that, and the aforementioned background in programming, the remaining work isn't very difficult.
If someone is doing the architecting for you and defining the work sufficiently, programming isn't hard. It's not easy, but it isn't hard.
Plenty of folks are just 'programmers'. They're barely software 'engineers' and definitely not computer scientists. It is perfectly reasonable to spend your entire career as a programmer, dealing with small issues in a systems you inherited from someone else.
For example, software architecture around systems design might involve thinking of different layers of responsibility, the sequentiality of development, taking into account the skillsets of the teams and existing technical tools and structures.
To me, programming is the art of transforming and ascertaining requirements and principles into executable structure.
Architecture is the art of shaping the non-functional requirements and principles. Either by writing them down or by discussing them at a whiteboard, or even by teaching the team about these requirements.
Both are like an entangled pair that can be incorporated in one single individual, in different team members or even in different organisational structures. Some architectural decisions can be championed by a random software developer. Some architectural decisions shape companies (AWS). And some architectures should just be thrown out of the window.
But, and I am speaking from experience here, as they are different modes of thinking, there should be conscious time and effort for both and they should not be mixed indiscriminately.
Programming something to produce an expected output is for the most part a very achievable goal when you have no constraints. You can do it however you want, take as long as you want and no-one else will complain how you do it.
The more layers of constraints you add in the more challenging it becomes to the point where you could say "programming well" is indeed very challenging and the majority of working devs can't achieve it reliably.
I think over time it's a fundamentally impossible task with respect to a certain piece of software because the trifecta of 1) changing industry/aging tech, 2) everyone who contributed to the codebase at a time they didn't understand the system, the domain or programming all that well, and 3) accumulating mistakes in architecture or implementation that you don't have or ever get the budget to fix.
So in the end even if you're a stellar dev, you're always working with people who aren't and most likely on a system that is not pristine.
Getting a computer to do _something_ is not so hard. Consistently getting the computer to do what you want over time in a way that is easy for your colleagues to grok such that they don't introduce mistakes and also to do it in such a way that's amenable to unforseen future requirements that may or may not arrive? It's ultra challenging.
I've learnt to not care so much. Software is an organic thing that will be born, grow, get old and die.
The left side of a quoted statement should be the quote symbol, not two commas.
Very strange...
https://www.thoughtco.com/german-zeichensetzung-punctuation-...
You'd have a hard time consuming an API if you don't understand what a request is..
P.S. Ironically, the author also writes about piracy[1] (how bad it is, copying is stealing, her personal story about how he stopped, etc), but has removed the Hugo[2] copyright from footer (can be explained) and even meta info (?). I am not a lawyer, this is probably not a violation at all, but obviusly not a good tone.
[0] https://imgs.xkcd.com/comics/impostor.png
I have not found this to be the case. My brushes with impostor syndrome come from working with peers who solve a problem or contain a body of knowledge that, on the surface, is professionally intimidating. As a senior engineer with a couple decades under his belt, I can state it is real.
This needs explanation
Edit: still no response from the server. 10th time's the charm? :)
1. Programming isn’t “easy” (whatever the definition of easy is) 2. An attempt to create categories for “easy” and “hard” programming: a toy website is the former, a large/complex piece of software is the latter 3. There are people who aren’t as technical as the others, undeserving of being called a programmer (the people with 2 years of experience who “play the diversity card” and oversell their experience, selling programming as a lifestyle, etc)
(1) and (2) pop up all the time in programming communities, and I believe it’s due to how geniune encouragement is expected to be like in certain cultures (“it’s easy! you can do it!” vs “it’s hard work, but it will pay off”). One of these sentiments wouldn’t serve its intended purpose in the anglosphere, the other wouldn’t work in Eastern Europe. There is a definite cultural aspect that we’re not considering in these discussions, and it applies to most communication online. However, it’s especially apparent when more abstract issues are discussed, such as whether or not programming is easy, what exactly is programming (also touched upon by the author when he ranted about HTML), and who exactly is a programmer.
This opens a whole other can of worms: programming gives people a lot of power (being in demand, mobility, financial independence, opportunities, relatively safe work) at a relatively low cost (being accessible to everyone with an Internet connection, or a computer comfortable enough for programming, provided they have the time to have a hobby). As per our current dominant cultural values in the programming community - where we believe ourselves to be intelligent and rational -, it would be a taboo to believe that someone is undeserving of this autonomy or even prestige, therefore when “programming is easy” meaning “it’s accessible, in general, to everyone with a will and some free time, providing massive rewards in return” is met with criticism using an underlying disdain for the influx of “a different type” of programmer (or someone who works with programmers), it’s apparent that sometimes other programmers want to keep this prestige, freedom, and autonomy only to themselves, or a select “elite”.
The programming elite does the “harder” work; there is more prestige since there’s a higher barrier to entry/recognition (years of study of theoretical CS, mathematics, low-level stuff, etc). It seems unaesthetic, therefore, to be associated with people who can become successful through utilizing more social and marketing skills. There is no strong reason to believe that most people who promote their blogs or are “promoting” themselves using the “diversity card” are less technical than the other programmers who sit quietly behind their desk. There might be some, but overall, I belive there’s a strong bias against them from the self-proclaimed old-school, hardcore programmers.
There is a disdain for the more social, more entrepreneurial, more marketing-and-sales aligned technical person who knows how to utilize current social media trends to their benefit. It might stem from the belief that the better technical person is the more quiet one, the one who spends years programming their OS alone instead of engaging or even collaborating with other people (that’s a bit of an extreme example, though).
Another reason why more and more people are hyping themselves up is because it’s necessary. Not everyone receives a high salary or has a great boss. There’s plenty of people who work for free or very little money, having skills that would be much more valuable if they worked for someone else. But not everyone has the same network (which is incredibly important - imagine being all alone in this) or word-of-mouth recommendations. They might be acting proactively to get a better offer somewhere else. Sending in your CV without any online presence doesn’t always work for everyone. I think we should be more empathic towards people we don’t understand, instead of feeling immediate disgust and throwing them outside of the community, so to speak.
Either way, any discussion around “is the field XYZ hard or easy?” doesn’t exist in a vacuum. We’re dancing around status. If something is harder, especially intellectually, we believe it deserves more respect and perhaps even higher status, higher ranking in the professional world. If something is highly compensated, we also assign higher status to it, naturally. There can be many different types of programming that can be in either the easy or hard categories at any time - and the low barriers to entry make it much harder to judge someone’s status, and our relative standing.
Doctors and lawyers are considered to be higher-status not only because what they’re doing is “hard”, but also mostly because of the gatekeeping, the qualifications and licenses needed to be called one.
This discussion keeps popping up because a lot of programmers want the confirmation that they’re high-status, but it’s not that easy.
(From a quote in the article)
I see this dumbshit rhetoric more and more, but do people actually think this? It feels like someone on the peak of Mt. Stupid from the Dunning Kruger effect would say...