
How did you go from being an adequate to exceptional programmer? - lunarprose
I&#x27;m new to web development and am primarily self-taught. I know enough to get my own site live, make it look good, and make somewhat nuanced decisions about its architecture and the best method for accomplishing X task.<p>But now I feel stuck. I just started working full-time as a software developer (!) and was hoping this experience would help me learn a ton--however, for whatever reason, work is relatively slow and I end up doing what I already know or am left out of any &quot;teaching&quot; going on.<p>I&#x27;m a little nervous I&#x27;m stuck when it comes to my skills and don&#x27;t know what to look&#x2F;ask for next. What experience&#x2F;situation allowed you to learn the most? Was it an awesome mentor, a great freelance project, some course you took? Is it something I could find at work or does real learning come when you&#x27;re working on your own projects?
======
codegeek
I will give you one general advice about getting exceptional at anything which
should also apply to programming. When you learn something, try to learn the
"why" of it and not just the "what and "how". Once you master the "whys" of a
topic, you will realize you have got really good at it already. Challenge
yourself and others about conventions and understand why things are done a
certain way. What if you try to do it differently ? Does that make sense ?
Does it make it better or worse ?

When it comes to programming,learn to break things. In programming, it is
easy. Put bad code on purpose and see how and why it breaks ? I remember one
of our excellent CS professors who told us that the best way to learn pointers
in C/C++ is to write pointers that don't work. Leak some memory. Create null
references. I never understood that for a while but now I do.

Oh and the common advice: practice practice, practice. Do the same thing over
and over again even if it is repetitive. Again to give you an example, I was
really good at Math as a kid and I remember I got even better when one of the
teachers gave me a book in which for every topic, there were 50+ questions
that were very similar. he wanted me to do all 50 of them. I was like "why
cannot I just do 3-4 of each type and move on to next". But again, after doing
the 50, I mastered it.

Having said all this, I don't think I am exceptional at most of the things
(certainly not programming) but I am so sure that these are some of the
actions that makes one exceptional.

~~~
lunarprose
This is really helpful advice--being primarily self-taught, I've probably
missed out on a lot of the "whys." Thank you. :)

------
logan5
Work environment doesn't necessarily always help. It comes down to how
experienced and brilliant co-workers are plus whether they care deeply about
clean design and clean code. In some places, there are A programmers from
which you will learn a lot. In other places, it's broken windows, so the
attitude of the people is 'it works, so why bother.'

To answer your questions, I find awesome code and techniques through books and
from the internet. Keep reading new books even if you have become familiar
with the language. Try working on your own projects because different problem
sets demand different way of solving things which will not be offered through
normal work environment. Write small games, puzzle solvers, etc. Understand
how things work and be familiar with the tools which you can then incorporate
back to your work.

Another way of improving your programming skills is by learning a completely
different programming paradigm. That will make you think differently when
solving problems even if you don't end up using that particular language.

~~~
lunarprose
Thanks for this--I think the guys I work with do care about clean design and
code. However, as soon as we start to discuss bigger concepts like that the
lingo changes from practical to highly technical. Having little computer
science background, I definitely end up missing some of it.

Thanks for your thoughts. :) I think I definitely need to focus more on
building my own projects if just to keep practicing what I do know and have
the opportunity to build something more complex.

------
zkar
Programming is more than just writing code. Programmers must also assess
tradeoffs, choose among design alternatives, debug and test, improve
performance, and maintain software written by themselves and others. At the
same time, they must be concerned with compatibility, robustness, and
reliability, while meeting specifications.

It is important for a Software developer you must be willing to work outside
of their comfort zone. Technologies are constantly changing, and as developers
we must execute integration or updates that we have never done before. By
pushing yourself to try new things, you end up being exposed to more code and
alternative ways of tackling issues. This drive to constantly learn and do new
things that makes the difference between a good developer and a great
developer.

Don't be afraid to break stuff. Breaking things is an important part of
learning process.

Don't try to be great. Being great involves luck and other circumstances
beyond your control. The less you think about being great, the more likely it
is to happen.

------
EnderMB
I think being great at something isn't really something that you can teach. I
also think that very few people hit a brick wall and stop being able to learn
how to be an exceptional programmer. If you ask people that are REALLY good at
something how they are so good, more often than not they'll shrug their
shoulders and will probably tell you they don't know.

For me, the only way to become really good at something is to keep learning,
and to ensure that you know of your own failings. If you don't know what you
don't know, you won't try and fix those holes in your knowledge.

If you are aware of what you suck at, it's easy to pick that knowledge up
through experience. If you are going through the motions and aren't finding
yourself challenged, it's extremely easy to not learn anything of use. An
exceptional programmer will have probably spent most of their careers working
on problems they didn't know the answer to, and as a result have built up a
huge body of knowledge.

------
wturner
Learn in a manner where you would have to teach it. The bad part about this
approach is it forces you to confront how little you really know. The good
part is...well, the same. If the cool kids at work won't let you into the
'teaching' then you will be forced to make your own way. This is a good lesson
because companies generally don't care about you. So make sure you care about
yourself. I should add I'm not "exceptional" , but for how little time I've
been doing it I'm good with regard to my subset of interests. If it wasn't for
the the above methodology this would not have happened.

------
ACow_Adonis
I don't really think I'm "great" per se, but there's several things that
really "upped" my abilities beyond someone who was just comfortable with ifs,
loops and arrays.

Now I should state that all these things are with respect to how to learn
things, not with what makes the best employee/product.

1) Getting a job where I could program/learn full time. Once I picked up the
skill that other people hadn't learnt, then I became "the SKILL guy", which
means that you get more work based on that skill, which lets you learn even
more.

2) To learn things, I would set myself the goal of trying to do every task in
one language. And I mean every task, including tasks that it sucked at.
Whereas other people just took the pre-written tool/software and used it, I
wanted to see if i could do it from scratch. Its not the best way to do
business, but its the best way to learn something inside and out.

3) Plain stubborn persistence and realizing there are no hard
problems/theories/techniques, just ones you haven't spent enough time studying
and getting familiar with. Its ok not to know or understand things. What's not
ok is to run away from them because you don't know or understand them. There's
a lot of fragile egos in programming/academics/business where people try to
insinuate that because they don't understand something its "not worth
knowing/is useless", or that you are stupid for not understanding what they
understand. Forget all that and just keep bashing away at a topic, looking for
different opinions and perspectives on how to pick it up, and when you
understand something on your 8th go, you're now on equal footing with the
person who understood it on the 1st go (if there ever was such a person, and
there often isn't).

4) Always pushing my self into the things that I can't do. This is a bit
weird, because most of our school systems condition one to do the things you
score well at and avoiding the things you fail at. Screw that. You might get
good grades and a job but you will never grow as a person that way. If you're
only given projects you "can do" at work, try to mix it up by doing it in a
way, or with a language, or with a perspective that you can't currently do.

~~~
lunarprose
These are all really helpful points. I've been trying to do #1 over the past
few months but I'm not sure if what I'm good at is valued in this environment.
I think I have a little bit of processing to do to understand if that's a
problem with me or them.

I especially appreciate #3. Thank you. :)

------
lmm
The three great virtues of a programmer are laziness, impatience and hubris. I
picked up some skills from the first guy I worked with out of college (pair-
programming is great), but more important than that was the attitude.
Cultivate a sense for when you're doing something by hand that the computer
should be able to do for you, then figure out (or ask someone) how to get the
computer to do that. Keep doing that and in a few years what you do looks like
magic to your previous self.

~~~
brudgers
_Once you understand how to write a program, get someone else to write it._
\--Alan J. Perlis, Epigram 27

------
wglb
Practice, try new things, learn more languages.

Check out [http://blog.jenniferdewalt.com/post/56319597560/im-
learning-...](http://blog.jenniferdewalt.com/post/56319597560/im-learning-to-
code-by-building-180-websites-in-180).

------
robotwholearned
not saying that I know anything, but from what I can tell it is time and
practice. Don't think that something is "beneath" you, just keep building
stuff. Read books, talk to other people that know something. Talk to people
who don't. I am not sure if you should ever reach being an exceptional
programmer, because there is always more to learn. Also: depending on the
language, try to solve problems without looking up how to solve it, and then
compare your solution to other peoples. You may solve the problem, but
sometimes you can be quite surprised about how much more someone knows, so
they can teach you little things that really deepen your understanding of a
language.

------
bliti
You just gotta put in the time. Experienced programmers still get stuck and
will feel like you do a lot of times.

------
eetduddet
Teach yourself more about the tools you use, like frameworks, servers, OSes,
editors, etc.

~~~
lunarprose
Well, what do you mean by "teach yourself?" It's one thing to read up/use
trivially vs becoming fully competent at speaking about it and using it. Or is
it normal to be googling things every day until it sticks?

~~~
ACow_Adonis
I think its perfectly normal to be googling things every day for the rest of
your life in programming.

The notion of there being a wizened old man who just sits there and "knows
everything about it" is, if not a myth, exceptionally rare.

Sure over time, bits stick and foundations build and you grow to be relatively
expert on some topic. But if you stand still or grow too comfortable with what
you've got, these days the world will move past and leave you behind.

------
makerops
I'll let you know when I get there.

