Ask HN: How do you keep improving?
301 points| Superleroy | 9 years ago | reply
As an axample, i started out with C/C++ development but am unable to keep up with the new standards. I see people write really nice code but whenever i sit down i just keep reusing what i know. The same goes for architecture, i have been building stuff for a long time but other people (with not that much experience) tend to be way better at abstracting stuff or architectual design than i am.
How do you guys keep lerning new stuff? Any techniques or tips?
[+] [-] itamarst|9 years ago|reply
2. Find a mentor. Lacking that, find e.g. talk of someone explaining some hard techniques and then try to follow the advice. Even and especially if it feels clumsy at first.
(More on those two here: https://codewithoutrules.com/2017/04/17/learning-without-a-m...).
3. Switch to a new job where you'll be exposed to new things. try to find a job where people do code review, feedback is how we learn faster.
4. Learn how to learn: https://www.youtube.com/watch?v=FKTxC9pl-WM
5. Reflect on your mistakes, try to find what cues you missed and what you should look for next time. I've been doing this on weekly basis (you can read the results at https://softwareclown.com) and I've learned a huge amount from figuring out underlying cause of what I did wrong.
[+] [-] Afforess|9 years ago|reply
I will be the first to admit I let many _months_ of complacency pass me by before I identified the signs. All the above advice - forcing yourself into the haze of discomfort, breaks this away and forces you to learn new skills. Learning is often glamorized, but in reality, the actual _learning_ phase is painful and uncomfortably hard. I still don't enjoy it, even though afterword, I appreciate the knowledge and extra skills. Instead, it's important to build habits that lead to continuous learning, rather than one-off improvements. Paradoxically, it's easier to become normalized to regular discomfort than rare, unusual discomfort. It has never stopped being uncomfortable to learn for me, but I also have built it my psyche.
[+] [-] garysieling|9 years ago|reply
A project that is visible gives you material for talks at meetups/conferences or articles for bigger blogs, which is a good way to meet people and get better at soft skills.
For people who have a experience / existing knowledge, watching conference talks can be a good way to add on new knowledge (e.g. my machine learning knowledge from school is getting dated, but seeing new tools / techniques in a talk is enough to figure out what to research).
Here's a big list of conference talks that I've been working on as a project - http://findlectures.com/?p=1&class1=Technology
[+] [-] KerryJones|9 years ago|reply
[+] [-] ziikutv|9 years ago|reply
Shout out to Aria from #node.js. What an amazing developer. The best example of a self taught/homeschooled success story. Aria taught me a lot of stuff related to Node and is also active on the channel.
[+] [-] steveeq1|9 years ago|reply
[+] [-] Joeri|9 years ago|reply
You will be terrible at this at first, but teaching is also a skill that takes lots of practice to acquire.
I would also agree with what others said: stop comparing yourself to others, no good will come of it. There is always someone better, there is always someone worse. It doesn't matter. Set a standard for yourself and meet your own standard.
P.S. If you're looking for a good resource to learn presenting from, I would recommend macsparky's presentations field guide.
[+] [-] ghubbard|9 years ago|reply
Solve simple coding problems, review the submissions of others and help them become better coders. Trying to clearly explain concepts to others is the best way to make sure you really know them yourself.
This is also something that you can do for 10-15 min every day, which will add up over time. Ask for feedback on your own solutions and find out ways others think you could improve things.
[+] [-] wallflower|9 years ago|reply
"Teach them to be better than you. That may seem counterproductive. I have a type A personality, and I have decent coding skills. I've been in your situation a number of times. I also know there's these mythical expert developers out there that I can't seem to find (or afford). So, what to do? A few years ago I realized that if I continue down this path, I'll end up with some serious health issues due to the stresses that come along with having a reputation for being a really good developer. So, I decided that instead of searching for developers better than me, I would teach developers I work with how to BE better. It's taken a lot of patience. And it's taken me quite a bit to LET GO of my way of doing things. I had to take my ego out of the picture. (VERY hard to do.) Nowadays, I realize that developers don't have to BE better than me. I simply have to ALLOW them to do what they do without being so obsessive about it. Turns out, even junior developers really CAN do good work. They just need a little guidance that only comes with experience, and then they need me to get out of their way."
https://news.ycombinator.com/item?id=8649415
[+] [-] xealgo|9 years ago|reply
Learning new languages and different paradigms can also play a huge role in how you approach future problems. Go to glot.io and play around with a handful of languages you've never touched.
Read up on various best practices and style guides. Read blogs on architecture, design patterns, etc. I read probably 5-10 hacker news articles daily, but I also watch many videos on youtube such as pretty much anything by Martin Fowler, Rob Pike or any of the other greats.
Code stuff outside of your comfort zone. If you're a web developer, try writing some games. If you're a game developer, write a web server or a blazing fast load balancer that handles TCP/UDP sockets and HTTP. I code random shit all of the time just to gain some exposure even if I'm never likely to do related work in the future. I probably have a few dozen Go programs I've developed just because I was curious how something worked.
I've been programming for over 17 years starting with C++ when I was 13. Over the years, I've developed stuff in C/C++, Python, Ruby, Lua, C#, Java, JS, TypeScript, SQL, Dart and Go for the past 3 years. Each language has given me new insights in how to tackle problems that knowing say just C++ alone would not have lead me to.
TLDR: Exposure!!, Books, Blogs and LOTS of bouncing ideas off of other developers.
[+] [-] markeroon|9 years ago|reply
This is specifically regarding the third point; I agree with the first two!
[+] [-] qaid|9 years ago|reply
[+] [-] johnfn|9 years ago|reply
I started by making a reasonably conplex TODO app, which took a few months. This taught me about the importance of declarative (popularized by React) style programming, and MVC separation.
Then I moved on to building a Vim extension for visual studio code. This took about 6 months, and taught me a bunch about programming larger apps and keeping them bug free. I also learned a lot about open source maintenance. I learned why Redux-style architectures are important.
Then I moved on to working on a fully featured pixel editor. This has been my toughest app of all. I've been working on it for about 4 months full time at this point, and I've learned so much about canvas perf, js perf, the importance of end to end testing, ... I could go on for a very long time. :)
And this is all a warmup for an even larger app I haven't started on...
This approach seems to have worked well for me, and I'd recommend a similar style approach of working your way up from smaller programs to larger apps. You learn lessons from smaller apps that will save you a lot of time when coding larger apps.
[+] [-] molloy|9 years ago|reply
[+] [-] andai|9 years ago|reply
[+] [-] beat|9 years ago|reply
Next, distinguish between depth and breadth. Are you a generalist by nature, or a specialist? I'm a total generalist. I've achieved basic competence in a truly shocking variety of different subjects, but the main thing I'm an expert at is being a generalist. I've gotten very good at picking up new skills whenever I'm interested in them.
Other people are specialists. They find something they're passionate about, and they get good at it. Really good. They go deep. They may not know a whole lot of things, but that one thing they know, they know so well it's hard to even comprehend from the outside.
So are you a generalist by nature, or a specialist? Do you want to be one or the other? Pick a direction and start walking.
[+] [-] sahilkhosla|9 years ago|reply
[+] [-] vikingcaffiene|9 years ago|reply
There are couple ways I keep up on things (keeping in mind that there are no absolutes and everyone is different).
First, I identify subjects that are both interesting to me and have traction with the developer community. Forums like this one are generally a good sniff test. I then subscribe to mailing lists that deal with that tech. I clip a lot of articles and code snippets to a datastore (Evernote in my case) where I can peruse my notes later. I install said tech and build little micro apps and generally futz around and have a good time. The key here is to be interested in the tech you are trying to learn. Maybe you are bored with C/C++? Whats the harm in looking at something totally different like Ruby or NodeJS? They might give you ideas or a different way of looking at things. Whatever it is, try to have fun. Learning doesn't have to be all drudgery.
When I want to take a deep dive (usually after a good bit of research mentioned above) I find a job working with the tech in question. Nothing will force me into gaining a deep deep understanding of a technology or concept like getting thrown into the deep end. After a year or two at that job, I emerge a ninja level dev in that area. Not a bad deal if you ask me. If that approach is too extreme maybe you can just set up a side project or contribute to open source? Anything that forces you to sit in a chair and produce functional code in the manner with which you want to learn is going to accelerate your learning in ways you never thought possible. Good luck!!
[+] [-] andai|9 years ago|reply
It might have to do with different personality types. For instance, I am prone to procrastinate on anything that doesn't interest/excite me, so when my goal is to work on stuff I don't like, the output approaches zero.
I resonate with the "do more than nothing" approach advocated by Khatzumoto of All Japanese All The Time[0]. Which is a great website by the way!
It's all about how language learning can be fun. It's like 10% language learning advice, 90% "you can do it stop beating yourself up".
[0]: http://alljapaneseallthetime.com/
[+] [-] huangc10|9 years ago|reply
To grow, one can either scale vertically or horizontally (paraphrased).
Now if we apply this to your situation , scaling horizontally would be learning new languages, ie. Objective-C, Javascript etc. I'm assuming you're not really about this but you want to scale vertically.
If scaling vertically is the case, then what you really want to focus on is doing something either 1) other people have not done before yet and/or 2) do something that is 10x better than what is already out there. I don't do too much C/C++ dev but maybe think about embedded, OS, GPU, etc.
If you accomplish 1) and/or 2), then you can truly master C/C++ dev. My 2 cents.
[+] [-] mikekchar|9 years ago|reply
In practical terms that means that you need to change the way you write code. And that means practice. Katas are good, but you have to force yourself to do it differently than you would normally.
Here's an example of something I did recently: https://github.com/ygt-mikekchar/es6-monad-challenge/blob/ma...
This code is clearly insane. You would never do it this way in production. Or would you? In reality, how do you know what the advantages and disadvantages are if you never try it?
But small toys and katas are not enough. Architecture and design requires practicing on a big scale. That means side projects that you have complete control over. It's unfortunate, but this stuff takes time. If you like programming it's not bad, though :-)
Always get ideas from other people. Read books and blogs to get more ideas. Then go nuts. The hardest part is to have to courage to absolutely suck. Picking insane things to do will help with that because you don't have the feeling that it must turn out good in the end. It's insane.
Hope that helps!
[+] [-] proximacentauri|9 years ago|reply
I focus each morning on working on the number one thing I have to do that day, in the afternoon I can attend to other less important tasks.
Josh Kaufman has some good tips (https://first20hours.com/).
Also as John Sonmez (https://simpleprogrammer.com/) would say - trust the process. Don't focus on immediate results, focus on the process of reaching your end goal
[+] [-] bsenftner|9 years ago|reply
I've been doing C/C++ for my entire career, but have also done full web stacks, embedded systems, VFX for feature films, 15 years as a game developer, OS engineer on first PlayStation team, and reaching way back 80's 3D graphics research and Macintosh beta tester and launch developer. All from simply having enthusiasm and a combination of the stupidity to try it myself and then contacting the leaders and asking them what they did about some nit picky point. Next thing, I'm working there.
That type of easy access is only at new technologies. When I was contacting people the digital entertainment industry was yet a dream. EA was maybe 1 year old. I guess my advice is to find something that you find exciting, but is not yet a reality. There are giant industries to be created around software controlled aircraft, everything from IronMan to skytrains, fer christsake. What interests you? Augmented Reality is going to be saturated, but that area is wide open. Hell, everything is interesting. Just be sure to focus. There is success in consistency.
[+] [-] telebone_man|9 years ago|reply
Personally, I used to find it tough to learn things I couldn't immediately apply. That's because I would try and commit them to memory in a way I could immediately retrieve them if required. So spawned a path of memory learning techniques... flash cards... ugh...
Then I was watching a Derren Brown show (a British 'mentalist') who taught a guy to memorise hundreds of books so that on command he could read out the content of any given book, any given page and any given number.
The individual would read the books in a particular way (picture dragging your fingers down in a v shape across the page). When asked to reiterate the content, it was very important that he just trusted his gut. And he got it right every time.
The key takeaway for me was that it's equally important to learn how to retrieve knowledge.
Slight tangent here, I also remember reading about how Steve Jobs was able to 'think outside the box' and come up with seemingly new ideas. And the suggestion was he was just good at retrieving knowledge through a confidence of confidence in himself and a non-pressured environment.
Hope that gives you something to think about!
[+] [-] jsmeaton|9 years ago|reply
By familiarizing yourself with a large codebase, you'll start to pick up the patterns in use. Having your code reviewed by project owners is a great way to get others to help you improve.
Some projects and communities are better than others. Some can be hostile or quiet, others can be welcoming and active.
Don't just start by throwing PRs at random projects and hoping someone bites. Managing an open source project is work and initially you want to be causing as little extra work for the maintainers as possible.
[+] [-] enraged_camel|9 years ago|reply
There will always be someone who knows more than you or is more skilled. Don't let that bother you. Instead, use those people as role models.
[+] [-] theparanoid|9 years ago|reply
Few people are actual experts in a domain. It takes years to do.
[+] [-] rafark|9 years ago|reply
Deeply analyse those reads without ever touching a computer. If I feel the need to write code I usually write it in a paper sheet and analyse it.
[+] [-] johnfn|9 years ago|reply
In a case where there are N incorrect approaches and 1 correct approach, by reading the code of the 1 correct approach I will get no sense of why the author dismissed the other N approaches. I feel this (understanding trade offs and judging which approach is best) is a crucial aspect of programming that is easy to miss when reviewing the solution that worked.
[+] [-] JesseAldridge|9 years ago|reply
Once in a while I go back and review some of the work I did that day and look for ways to improve.
[+] [-] inimino|9 years ago|reply
[+] [-] newnaivedev|9 years ago|reply
[0] - http://www.daedtech.com/how-developers-stop-learning-rise-of...
[+] [-] sridharmanohar|9 years ago|reply
[+] [-] kodisha|9 years ago|reply
I like somewhat different approach, I would take some project I think its done well, and where I no longer see obvious room for improvement.
Then I would to go github and find same or similar kind of projects, ideally created by companies with strong engineering culture (e.g. Google) and compare how I did stuff to how they do it.
You would be VERY surprised to learn just how much other people would differently solve same problems you have been facing, and you can learn a lot from comparing other people solutions to something you are already comfortable with.