Ask HN: Maybe I kind of suck as a programmer – how do I supercharge my work?
Over the past 3 years, I've released a few apps on iOS: not bad, nothing that would amaze anyone here. The code is generally messy and horrible, rife with race conditions and barely holding together in parts. (Biggest: 30k LOC.) While I'm proud of my work — especially design-wise — I feel most of my time was spent on battling stupid bugs. I haven't gained any specialist knowledge — just bloggable API experience. There's nothing I could write a book about.
Meanwhile, when I compulsively dig through one-man frameworks like YapDatabase, Audiobus, or AudioKit, I am left in awe! They're brimming with specialist knowledge. They're incredibly documented and organized. Major features were added over the course of weeks! People have written books about these frameworks, and they were created by my peers — probably alongside other work. Same with one-man apps like Editorial, Ulysses, or GoodNotes.
I am utterly baffled by how knowledgeable and productive these programmers are. If I'm dealing with a new topic, it can take weeks to get a lay of the land, figure out codebase interactions, consider all the edge cases, etc. etc. But the commits for these frameworks show that the devs basically worked through their problems over mere days — to say nothing of getting the overall architecture right from the start. An object cache layer for SQL? Automatic code gen via YAML? MIDI over Wi-Fi? Audio destuttering? Pff, it took me like a month to add copy/paste to my app!
I'm in need of some recalibration. Am I missing something? Is this quality of work the norm, or are these just exceptional programmers? And even if they are, how can I get closer to where they're standing? I don't want to wallow in my mediocrity, but the mountain looks almost insurmountable from here! No matter the financial cost or effort, I want to make amazing things that sustain me financially; but I can't do that if it takes me ten times as long to make a polished product as another dev. How do I get good enough to consistently do work worth writing books about?
125 comments
[ 3.1 ms ] story [ 194 ms ] threadhttps://hn.algolia.com/?query=better%20programmer
I'm particularly interested in this thread, "Ask HN: What habits made you a better programmer?":
https://news.ycombinator.com/item?id=1674103
The biggest thing that accelerated my growth was working with people who were much much better than I was. You'll learn so much faster, and become so much better than you can ever by just plugging away by yourself.
Just remain humble and open to learning and you'll wake up one day and realize you're actually not bad at this programming thing ;)
"Better than a thousand days of diligent study is one day with a great teacher"
– Japanese Proverb
If you're looking for something inspiring / actionable to read, checkout this collection by him http://v25media.s3.amazonaws.com/edw519_mod.html
One of my favorite answers -
71. How do you get good at programming?
I believe that there are two ways to get good at anything, "push" and "pull".
Push: You learn from books, classes, mentors, and studying examples, then apply what you have learned.
Pull: You have a problem that you must solve, then you learn what you need, any way you can, to build the solution.
I suppose there are pros and cons of each method, and I imagine that many people here have used some of both.
For the record, I am 100% Pull. I have absolutely no formal training. It took me 2 years to find my first job and then I was thrown into the deep end. It was simultaneously frustrating and exhilarating. There were so many times I didn't know what to do or didn't have enough "tools" in my box. So I had to figure it out and find sources of learning. But I always did. Any when I got that first thing working and then saw my customer's eyes light up, I was hooked.
Your CS degree may make you think that you're a "push" learner, but may I suggest that you adopt a "pull" approach. Forget what you think you know and find a job or a project or someone who has a real need. Then build what you need. You a several advantages over me: (a) It shouldn't take you long to find that job/demand/customer. Just keep looking. (b) You already have tools in your tool box, maybe not the right ones for the job, but you have "something". And (c) It's easier than ever to adopt a "pull" approach. Help is everywhere.
You may feel frustrated, but I don't think you have a problem at all. You're in a great (and very normal) situation. Just adjust you attitude, find something to build, and do it.
I would add that if you're a "pull" person, don't bother applying to the Googles and Facebooks of this world. Their hiring process is extremely oriented towards "push" learners, presumably because you need lots of those people to build something at that enormous scale.
Instead look for opportunities where you get to do something you don't really know how to do. (There's a number of reasons why people would let you do that, but often it comes down to being in the right place and being patient.) That's how you grow, not by memorizing data structure answers from "Cracking the Code Interview".
(I know, dissing the tech interview is a HN cliché... But young people seem to attach unwarranted amounts of self-worth to how well they do at interviews at the Top 4 companies, so it's worth reminding that it's really not meant for everyone and you can do well without passing that standard.)
One thing is for certain, carrying around a chip on your shoulder because you didn't go to Stanford will do you absolutely no good, and probably be a net negative for your career (and happiness in general).
For the record, no, working for Google and Facebook isn't the single only answer to life, the universe and everything, there are plenty of perfectly worthy paths that don't lead anywhere near them, and there's no shame in taking them. But they are juggernauts of our industry, they do pay very well, and for better or for worse, a stint at one of them does open a lot of doors.
> Don't make the mistake of underestimating yourself.
> I'm not suggesting that you'll go out and write Rails in 3 weekends. What I am suggesting is that the more I meet "famous" hackers and the more I meet people from this community (online and offline), the more I realize that there's not really all that much that separates us.
> Lot's of people are obviously brilliant. And even for those who are a little less brilliant, brilliance is only one part of the equation. Work habits, determination, perseverence, passion, and maybe most of all, belief, are just as important. Don't sell yourself short.
I am a regular employee with fairly well defined role in the team, which means that new problems to crack an learn from don't come that often.
On the other hand, we have knowledge-shares, lunch-n-learns, tech-talks, lightning-talks and even cooperate with local universities to teach some course-work :-)
Also, maybe some people are better suited to solo work, and others to group work where there is some rigor imposed by the team or by the employer. You may be in the latter camp.
Programming languages are just a bunch of random symbols and letters; each language has different syntax. But underlying them all is the same foundation of how languages are created. Learn to read your code like an essay rather than simply focusing on the sentence.
I've been re-writing basic algos from scratch, and eventually more complex ones (Dijkstras, Graphs, and etc.), and understanding CS fundamentals helped me get past this hurdle.
Writers realize that there are other people who can write an extremely well-structured, gripping novel in a matter of months. Artists see their colleagues do live drawing and suddenly understand that something that is painful and difficult for them comes easy for these other people. (I don't have musical talent, but I expect something similar happens there.)
Are they geniuses? Probably some are, but mostly they have just worked very hard and built a set of habits that lets them approach creative problems with that seeming ease.
Making software is really primarily a creative pursuit like these others -- it just has a bit more math and a bunch more high-tolerance engineering thrown in.
Personally I think of programming as a cross between architecture and writing: I'm making something that has a visual presence and which end users can "live in" or "visit" (very much like a building), but it's also a story because the interactive medium necessarily imposes a narrative. This way of thinking helps me figure out the elements that go into software products... But probably everybody must find their own metaphors to make sense of what they want to do in this field.
Have you seen a sculptor at work? There is nothing inherently creative about the hundreds of hours spent chipping away little bits of rock.
What you describe is true in any art - the macroscopic creative vision is supported by the microscopic repetitive work.
But there's a good side that - if there's someone better than you that means you have someone to learn from. So when you encounter good code take the time to learn from it (and from the mistakes its authors made when they were less experienced: https://codewithoutrules.com/2016/03/22/language-evolution/).
I've hung around awesome programmers too, much better than I. Some you will even have heard of.
Specialists knowledge didn't just fall out of the sky. It takes research & patience.
Some people will always be better than you.
Your focus should be on being better than you were yesterday.
But when I read the code I saw the code was really suboptimal (tech debt, and sometimes more convoluted than it strictly needed to be). That changed my perspective on code a bit. That did not change my programming rigor though.
My point is that sometimes excellent products are not necessarily excellent from an engineering perspective.
Now, to assess your engineering skills there's a book called the IEEE SWEBOK (Software engineering body of knowledge), that is an index of the different areas of software engineering. You can go through each one and assess your strength and work on some of the imbalances this assessment would reveal.
It sounds too simple, but it's true. My best, most thoughtful, and beautiful work, has been done when I've been intrinsically motivated by the sheer interest and desire to do that work.
In some ways, I was a better, faster, smarter programmer, with 3 months of experience than I am now.
That's not objectively true, but the point remains valid. If you're struggling, you may need to re-ignite that fire. Try and remind yourself why you got into this in the first place. Stop worrying about how you compare to other people, and start building something that excites you. Flow.
But for heavens sake, why? Do you actually care about how audio destuttering works, or do you just want your app to work well? Do you want to spend every waking moment thinking about a problem, or take time out to deconstruct Marvel tropes?
And yes, the programmers your talking about are the 1%. Do you think every good dev has books written about their work?
Most programmers don't have books written about their work, but I think most great programmers (of the kind I admire) could write an in-depth book about the unique things that they've written and discovered.
It's scary, to think there's a whole new generation of programmers who probably can learn faster and more fully internalize algorithms and data structures and design patterns... but we can all keep learning. There's no limit to how much you can learn in this field, so to supercharge your work the answer is simple: work 80-100 hour weeks like Elon, but make sure you're actually producing at least 80% of those hours.. meaning, writing and creating code not just reading or consuming knowledge. I don't know how many people I've met that assume poking around reddit, HN or s/o means "working." Those people will never outshine you if you continuously push your limits and are always feeling in awe. That means you're on to something.
Keep it up, you're doing exactly what you should be doing - reflecting.
It's scary, to think there's a whole new generation of programmers who probably can learn faster and more fully internalize algorithms and data structures and design patterns... but we can all keep learning. There's no limit to how much you can learn in this field, so to supercharge your work the answer is simple: work 80-100 hour weeks like Elon, but make sure you're actually producing at least 80% of those hours.. meaning, writing and creating code not just reading or consuming knowledge. I don't know how many people I've met that assume poking around reddit, HN or s/o means "working." Those people will never outshine you if you continuously push your limits and are always feeling in awe. That means you're on to something.
Keep it up, you're doing exactly what you should be doing - reflecting.
1. Quantity leads to Quality. This has been written about by a number of people and for good reason. As with any craft, quality is born from doing something in repetition and learning from your mistakes. There is a brilliant anecdote on this from a ceramics class of all things ( https://blog.codinghorror.com/quantity-always-trumps-quality... ). So try lots of things, even if they seem silly. You'd be amazed what a throwaway project in a language you will never again use can teach you professionally.
2. Be passionate about both Coding and Learning. I start to look for a new job when 2 conditions are met. First is that i have been around long enough to see the consequences of my stack/coding/architectural decisions. Second is that i am no longer having "eureka" learning moments with regularity. For me, this inflection point tends to be around 3 years with a company. It will vary for others depending on role and willingness to branch out in your codebase.
tl;dr: Force yourself to learn regularly. Move on when you start to stagnate. Find excuses to code things, even if they are junk. Above all: have fun.
All of them are super-wrong.
All of them are long, hard projects. All of them requiere specific skills, that maybe are hard to know because you don't find much info about how do them (for example, I haven't find good enough, simple material in how build a relational engine).
But do it are easy. Because the "science" behind them is more SETTLED. Is just niche.
> YapDatabase, Audiobus, or AudioKit
I don't know them, but it look the same as the things I'm talking about. I LOVED to have the time or funding to devote to this kind of projects and living from them (ie: I want to build a relational language.)
IN CONTRAST
The most "simple" apps, are HARD TO DO.
Them are easy projects, but DO THEM is harder. The specs are unclear, you can't rely in a cool algo that solve most of it, you can't relly in a big, large, solid foundation, you NEED TO BUILD AND PULL from several sources in how do them.
Rocket Science is "solved", but you can waste months trying to finally know what the hell is necessary to build that e-commerce website.
Just look at the madness with JS. Is now easier doing assembler than that.
----
So, I mean that the human factors are the uncertain nature of most software projects are a higher burden that the actual "hard" projects.
http://www.try-alf.org/blog/2013-10-21-relations-as-first-cl...
Before I found this, most talk was at the more theoretical level and about:
https://en.wikipedia.org/wiki/The_Third_Manifesto
----
However, I learn first FoxPro. Is more closer to my own idea (in fact, is what I'm after!) because is practical and is proven... yet the xbase family of languages fade in obscurity for weird reasons (http://wiki.c2.com/?ExBase talk about some and MS killing both Visual Basic and Visual FoxPro because .NET, making the the death of the most popular and practical) without any modern undertaking.
This make a huge community of developers that, I suspect, left the market (without citation because is my experience in my local market) because more "normal" languages are not as appealing as database-oriented languages. In fact, despite I love python/delphi as the most productive languages I have used, none is closer to Fox in the area of database-based apps. Is just another league.
I would suggest that you stop comparing yourself to them and their achievements. Rather, use their example as a starting point in your pursuit of improvement.
Many others offer good advice here, but one of the cornerstones is to look at what others are doing--often and deeply. Many have asked, "How do I become a great writer?" The answer invariably is, you must be a great reader. You need to read A LOT.
The same goes for math. You must solve problems. That's the other half of the coin. You need to do. So pick a problem that hasn't been addressed. Maybe there's something you haven't found a library or framework for. Take the opportunity to build it, package it, and open source it. You'll see that the set of concerns is different from that of an app developer.
Edit: typo
Wow. That alone puts you in the Top 1 to 5% of your peers. Even many experienced programmers have trouble shipping code. They (we) wait for it to be "Perfect". The code ends up languishing in some repo and never sees the light of the day.
1-man frameworks are the wrong things to look at. Don't compare yourself with them. Of course you'll feel bad and inadequate.
Maybe you need to shore up your self-esteem. I say this because your feelings about your own abilities will show through in job interviews, and when having discussions with your peers, and you will get short changed (salary, promotions etc).
So I would say, just keep at it, and try to improve everyday. And don't compete with others, compete with yourself.
I'm saddened by how thinking has become strangely uncommon. I've seen many teams where people either type code or have quick chats where they decide what to do on a whim.
For the OP, I would say the point is to be skeptical of dogmatic claims about the proper way to develop software.
On a side note, I embrace source control. It allows me to run down a rabbit hole and not worry about having to get myself out of it.
To the OP: Look at popular code bases and see how they are organized. Run your debugger through them and see how they work. Organization is the key to maintainability. DRY (Don't repeat yourself) and KISS (Keep it simple, stupid) are your friend. Like anything, the more you do, the better you will become.
Around 5-7 years ago I didn't consider my code exactly high quality, especially when building things from scratch. So I tried to understand what makes good code good, and actually how to spot it. Mostly through reading blog articles, reading actual code and thinking about code. I also got books but only 5 in these years in total. I read only 2 of them through.
So Google is your friend... Have problems with race conditions? There are solutions to that CSP (Golang), Reactor pattern, using 0mq or even STM.
Also don't forget that one things is skill/experience, the other is choosing proper tools. Are you using a simple editor or a heavy-weight IDE? When trying MIDI over Wifi do you Google and try to reproduce the first blog entry you find about. Or do you rather choose high quality components/libraries? # Github stars are a nice indicator for good libs with concise APIs.
But yeah, on the other hand you also need to ask yourself is it worth it? Do you want to be mega focussed and productive? Or do you want to create various things? Being super productive in some place sometimes feels for me a bit Zen-like but on the other hand also a bit boring.