Preface
Software is continually eating the world, programming is a required skill for many people in the future.
Programming also contains much of fun if you mastered it.
In my career as a software engineer, I met some really great programmers and learned lots from them.
This post will give you some tips for the journey of being a great programmer, especially from the sides of mindset and learning strategy.
Master programming costs much of time, Peter Norvig said ten years may be enough, so please keep patience and let’s get started.
The mental model
Everyone can code, several years old boy could also produce some code which runnable.
However, being a great programmer requires much time and energy to polish skills, also requires you have the correct mindset, I summarized it as below:
Lifelong learning
“Self-education is, I firmly believe, the only kind of education there is” — Isaac Asimov
Everything is changing very quickly, some technologies died away and some famed up every year. You don’t need to learn every fancy and fresh stuff, but you need to know the trends. And also have base skills to get up quickly when necessary.
John Carmack, the creator of Doom series games, was still trying to learn a new programming language and trying to apply it into products, he had got in programming several decades. To be a good programmer, we must keep the belief of life long learning, and get ready for the quick pace of the computer industry.
The Passion and Persistent
Programming is not easy, with the dark side of undocumented code, long time working day, large pressure from a product release. If you are not passionate, debugging will flush your brain cells down the toilet.
In some sense, programming is creating a whole new world. A programmer who loves programming does not feel boring even with too much time spent on the keyboard, on the opposite, he will be enjoyable and satisfied.
The Curiosity
To be a good software engineer, you need to be curious about many things.
There are many questions need to be answered. For example:
- How a function is implemented in a library, what are the drawbacks and limitations of it?
- How Operating System’s memory management in Linux is implemented, how process and thread are implemented?
- What happens when you are sending an HTTP request with a browser?
The curiosity will push you to get the details of each corner, polish your skills and push you to a higher level.
Keep standards high
Normally, writing code that is just workable will cost not so much try, sometimes you find code snippets from the Internet, and paste it into the editor, luckily it works. But ….., workable code is a low standard, you need to keep it high. Keep a high standard for your work means you need to polish your work to perfection.
Try to ask yourself these kinds of questions:
- Do you know the meaning of each line of code in the project?
- Could your architecture is flexible for different requirements?
- Does it work for a much bigger data volume?
- Does it readable and easy enough for other people to maintenance it?
There are many problems need to be solved for keeping a high standard, which will ultimately lead to complex problems, this is also why big tech giant such as Google will employ engineer in a high standard.
Collaboration
“Any fool can write code that a computer can understand. Good programmers write code that humans can understand. — Martin Fowler”
Coding is just communicating with the machine with code, but your code will also be read by others, which means you are communicating with other people through code!
When you get into an open-source project or if you work for some companies, you need to discuss the requirements, exchange ideas with others, present yourself to others, write documents, etc. Of course, some superstar can just ignore these, because they can produce great code to law the world!
For most programmers, expression skills will be a big plus for all the interaction. This is the most important soft skills for collaboration with others.
You can create a tech blog for practicing writing, this is a very detail guide: How to Start Your Programming Blog?. I also inspired by afternerd.com to start this site.
How to learn
As a programmer you need to study all the time, so the first import lesson is to learn how to learn, learn efficiently. If you got the pattern of how to learning new things quickly. you will be got quicker and deeper for many fields, and become a better programmer.
The Feynman Technique provides a deep, fundamental, intuitive way for mastering new knowledge, It is designed as a technique to help you learn anything faster.
There are many common concepts in computer science. For almost everything, if you can explain it to others in plain words, means you have mastered it totally, in your own way. In other words, learning by teaching is an effective method. Don’t fool yourself.
Learning by doing is another important strategy, writing software is not rocket science, it’s more like a craft of skills, such as painting, dancing, playing basketball or piano.
To be an expert, you need to keep practice every day, especially when you are a beginner, you need to spend much time to get the feeling of coding and debugging.
And then, you need to do some real projects for some practical usages, to make sure you understand writing code is to solve the problems from the real world.
The steps
Master the basics
Like Chinese Kung Fu, the beginner will spend much time to get the basic strength before he studies some fancy things.
Computer science is about 50 years old, tools(programming languages, editors, platforms) and computing power changed drastically during the years, but fundamental theory develops slower. Virtually all programming languages today are Turing complete.
Here are the subjects you must master them:
- Data structure and algorithms
- Operation system
- Compiler and programming languages
- Computer Networking
- Database
Go to get a CS degree in college if possible, it’s beneficial for applying for a job, but it’s not required.
A programmer is not a role like a scientist, which needs more formal academic training. On the opposite, many good programmers just graduate from high school.
For self-taught learners, you could find lots of helpful resources, books for studying computer science and programming. There are so many open-source projects, tutorials, and open courses.
As a self-taught beginner, don't do it all alone, try to connect with others, try to find a mentor. This will speed things up and help you avoid mistakes.
Make a plan for your learning path, you don’t need to make a very details plan. Be patient to follow it, it maybe costs almost one year for finishing a classic book such as SICP.
By the way, Structure and Interpretation of Computer Programs(SICP) is a book every real programmer should have a try.
Find your own track
There are many fields in the computer industry, during your career your maybe just focused on several fields. Game programming? Web development? System programming? Robot? So when you are young, try to find the hole you what to dig in. If you don’t know currently, keep looking, don't settle.
Your target is the one in which you enjoy yourself and satisfied mostly.
Make sure you have enough depth in one field, this will give you confidence and your own learning patterns.
Create some valuable thing
Create a Github account if you didn’t have one, run!
Github is the place where programmers share projects and ideas, it currently hosts many famous projects’ code.
You should also learn how to push your code to the server, and clone other’s code.
Reviewing other’s code is helpful for yourself, and contributing to other open-source projects also help when you begin to apply for a job.
Find a Job
The top programmer doesn’t have many opportunities to apply for a job, because the job will find them. Some other great coders don’t need to apply for a job because their open-source projects could make enough money to live. But most programmers need to apply for a job in normal cases.
The candidate needs to pass several rounds before getting the offer. The good news is that software engineers and other IT positions are still in very high demand.
For the interview process, the book: Cracking The Coding Interview will save you much time, it is a very detail guide for applying for jobs as a programmer.
As for the resume, owning or contributions to great open-source projects will be a spot, some Kernel programmers will just list the patch number in resume.
The referral is an effective channel to apply for a job because many companies trust employee’s recommendations and pay some bonuses for a successful referral.
Jump and expand yourself
During the starting years of your career, if you don’t get improving on yourself on working hours, just jump out and try to find a new job.
Your time is valuable, especially in your early career years, don’t hesitate.
Always be the worst guy in every band you’re in. – so you can learn. The people around you affect your performance. Choose your crowd wisely. –Chad Fowler
When you got offers from big companies and small companies, consider it seriously. Remember to find the company which fits your target in a long time, don’t consider the salary only, your career is a very long journey. Normally, the small company implies high risks and also potential high rewards.
One more thing
Keep healthy is ultimately important, some aged programmers have serious pains after long years sitting. Finger injuries, heart disease, and fat are mainly heathy issues for programmers.
Keep a good lifestyle is the first advice for young programmers, keep enough time for exercise and rest. Coding is not the whole life, find a hobby and enjoy your spare time.
Top comments (15)
You are so wrong on so many levels it is scary. Where to begin? Let's see, you wrote: 'A programmer who loves programming does not feel boring even with too much time spent on the keyboard, on the opposite, he will be enjoyable and satisfied.'
This sentence alone is total horsesh*t. I love programming. But if I do too much of it, I start hating it, just as much as anything else that I do too much. It's not about how much one can do in one day, it's about balance between work and life, and if your work requires so much effort and energy and time that you only have time left to sleep and eat, then this is no life, it is a slave's nightmare!
The fact that I love programming, does that mean I love to spend most of my waking hours at work? Does that mean I love making the company owner(s) rich with my sweat and toil and in return get a salary that will not even allow me to retire comfortably? Does that mean just because I can bring my dog to work, or telecommute, or have a fridge stacked with all sorts of drinks paid for by the company that it justifies selling my free time in exchange for a salary?
The answer is a resounding NO!
Instead of trying to make IT work look like something it is not, you'd better be truthful about it:
The answer is work in finance, quantitative finance/analysis for a hedge fund (experts in AI get paid >= $1M/yr), or start your own business and be the owner to whom all the rewards come. Anything else is just a slave's life, beholden to someone else's desires and vision.
And that is exactly why I quit Silicon Valley and all the nonsense and delusions that came with it. I am my own boss now, make more money than any stupid tech job would have paid me, and get to code what I want, when I want, using the tech I love, not what some dumbass manager thinks I should be using. And that, my friend, is the beginning of freedom, ie self-responsility.
@phasedephase I think you make some good points, but you should consider refactoring the tone of voice you used to present them: the current state comes off more like a complaint of your own experience than a helpful critique of the OP's thoughts, and so may not have the impact or interpretation you hoped for.
These are my takeaways from your reply: are they accurate?
Programming may be your only love in life, but it doesn't have to be: you might enjoy spending your time and energy in other ways, too, and that's okay. "Variety is the spice of life," as they say.
Burnout is real, but you don't have to accept it. If you start to feel a slave to your employer, leave: IT is an industry with opportunities everywhere.
IT is a choice to dedicate your life (not just your work) to continuous improvement and learning. The industry and technology landscape is constantly changing, and the pace of change can be dizzying: you don't have to keep up (that's impossible) but you can't expect to thrive by staying still.
If for you "retiring" means "ceasing to work," IT may be the wrong choice to make, as there are very few paths to that goal. In this space, the goal is not to eventually stop working, but rather to reach a point in life where working is optional and on your own terms.
Avoid employers who are not willing to compensate you for learning what you need to do the job they're paying you to do: spending your money and free time on professional development should be a choice, not a necessity.
Always be asking yourself, "Am I in rich soil?" Not all companies provide good-enough environments to satisfy your needs as a person. Optimize for your values, and no one else's: if life after work is important to you, find your balance.
Point taken. Reading the article made me angry by reminding me of so many things that need fixing with our society (was listening to NPR yesterday and there was a report on this retired lady in Detroit who worked since she was 18, who only gets $1,200 in social security, and now lost her home because of some bureaucratic BS... man, I was thinking, you work your whole life and this is what you get in the end? Now that's messed up.)... anyway, hence the tone as the article was reminding me of so many other related social situations.
But yeah, you got most of the points alright, although the gist, without going on a rant ;) is this:
the demands put on the IT workforce are excessive and there seems to be a cottage industry out there trying to normalize that state of affairs as if acceptance were THE solution or even in the best interest of the workforce (everyone please watch the movie In Time, if you haven't--it explores the themes evoked by the article and ensuing discussion);
we should remember that we work to live, and not live to work, at least this is the sane worldview in my book (ok, granted, a workaholic will see it the opposite way); so, it's not so much about the fact that life after work is important, it's more about not sacrificing most of one's time to work related activities, because in the end, it's about freedom to do as one pleases with one's time, and one isn't free if one's life is set to another's schedule and demands (hence the whole 'slave' metaphor);
and IT works isn't all that it's cracked up to be, so i took issue with what i still consider too much of an upbeat tone of voice in the article: it's one thing to be passionate about your FOSS pet project you commit every night to github, and another altogether working for some corporation where you end up reading and maintaining a codebase 80% of the time, and working on something more creative that you truly enjoy only 20% of the time, to use the cliche example about the corporate life we all heard about (ofc startup life or working at Google changes the parameters but TL;DW now applies); so to keep studying and practicing for that kind of a job makes very little sense to me since it takes time away from other things more important in life.
and in a clumsy way, I was also trying to remind the reader that unfortunately we live in an economic system still rife with discrimination (in IT, ageism) and thus the whole 'retiring' thing was not meant to mean 'cease to work' but being able to do whatever one wants and not have to fear for one's survival once the company does not exist anymore, or after they laid you off because anyone > 30 is too old in the IT world and should be replaced (I paraphrase the Zuck's famous quip); and this requires attaining financial freedom, hence hopefully matching passion with an activity where the $ is (but if you don't like AI or hedge funds, then that's not the way ofc), which a regular job is very unlikely to provide enough of, and so, in the spirit of the article, one needs to keep learning... but how much will you be able to or willing to learn once past 50? (hence the quantum computing example).
Speaking of working, I worked too much these past couple days. Man, am tired, so apologies for the less than stellar prose. I'll give it a rest now. Just hope millenials will see what's really important, and it ain't work! Unless it's in the service of humankind and the biosphere, but that's another discussion.
@phasedephase
I was thinking, maybe it's because of my not so well English writing skills delivered the wrong messages. Since English is not my first language.
But I finally got the reason is we have a different value system.
Let me explain it:
'A programmer who loves programming does not feel boring even with too much time spent on the keyboard, on the opposite, he will be enjoyable and satisfied.'
The meaning I want to express is: If some people get huge interests in one thing, they don't care to spend too much time and energy on it. I saw some great programmer build an OS from scratch, they coding more than 10 hours a day, feel not tired. Why? It's just because they love it, they want to know the details of creating an OS, they don't consider what the value of recreating a new OS(without any actual user). No one forces them to do so, it's all the choices of themselves.
Maybe I need a more accurate expression in my post about this.
Yes, the balance between work and life is important, I also wrote some about this at the end of this post.
As for your following points, please note this, my subject of this post is not: "To be a RICH programmer: The mindset and learning Strategy".
What's you are talking about is a totally different subject.
Why some great programmers still working for companies?
Maybe they just love the job, and their skills of IT are their strength, and their jobs already make enough money for life.
Please note, not everyone has all the skills, ability, determination to be a founder of some startup or business. Building a successful startup also need some luck, you know 99% startups die.
Even someone doesn't have any interest in AI, but it's getting a well paid these days, should he move to this field and try to be a so-called expert in AI?
No, I don't think it's the right choice for everyone. I think it's better to follow the heart, try to create value for the others and wealth will follow.
If you think getting rich will be the only freedom for you(working for companies is just a slave's life), go to pursue it, try to get rich. It's your choice, we can not say it's wrong or right.
Btw, be a programmer is not the only way to get rich, even not the best way.
@dabrady have a good explanation, thanks.
PS: The Moon and Sixpence, by W. Somerset Maugham is a awesome book!
OK I get it. If you have that kind of passion for something, then yes, you won't feel bored or tired until you collapse from exhaustion. I remember the days when I used to code 24 hours straight before passing out. Anyway, that was some crazy time. But this level of intensity is OK if you do it for your own company, not the company of someone else who doesn't care about you and your family. That's what I was trying to say.
And also clumsily, trying to say that the goal is to be free, and free in this society where we depend on a company for a paycheck, means financial freedom. So the goal is not necessarily to become rich, but to make enough so that you do not need to depend on an employer or boss and not need to fear of being let go because you don't want to or can't learn the latest language or framework--I am writing this with the following in mind: if it's something cool, then no problem, but OMG, if I had to learn Javascript and JQuery, I'd shoot myself.
And before anyone starts telling me how wonderful JS is, this guy, Kenneth Eng, explains much better than I ever will: medium.com/@richardeng .
But to go back to your point: I guess I am taking issue with what you wrote because to me it appears you are advocating self-sacrifice for something that is not worth it, not at the levels you mention, because as you say, it is not the best way to get rich, if that were the goal, and it certainly is also not the best way to be able to save enough money to get out of the race financially secure 20 years later, unless as in my examples, you work a job that pays you what is called f*ck-you-money.
If on the other hand, you have a vision and are so passionate about it that you will commit everything to it, just as in the case of Jobs or Gates, then yes, I have no problem with that.
But busting my ass for years and 20 years later struggling (because now you are older and you have to fight the age bias at all the Silicon Valley startups you apply to, the guy interviewing you probably is even at least 20 years younger than you!) to find another job because either the company doesn't exist anymore, or they promoted you to a managerial position when all you want to do really is coding and you quit because you can't see yourself live like this for the rest of your life, and you still don't have enough money saved to retire--retire as in escape the grind and be able to work on your own stuff when and where you please--then that is what I call insanity.
Unfortunately, like you said, it is not given to everyone to find a way out. But I believe, this is the higher goal that will enable you to dedicate all your energy and passion to some higher cause, just as Bill Gates does (but am not saying it means you need to join the 3 comma club, although it would not hurt ;) )
Anyway, nuff said, I think we get the gist now.
Totally. Been in the industry for 15 years. 80/20 is so true. Unless you really get put into a team with good developers (which are hard to find) you end up reading sh*t code every day. It eats up the brain cell so much that you feel frustrated every day. It's really exhausting. Being a really passionate developer in the past to where I am now, it's really a shame to say that I'm no longer passionate.
Finance industry is probably by far the best industry to retire safely. Developers probably 10 to 20 years. You won't be passionate by that time. You will have other commitments. People don't see us developers as gurus or Saints. They see us as machines who just loves to talk to computers.
I can wholeheartedly relate to this sentiment.
My 2019 has been a pretty sh*t year in that regard: I started the year in a great environment on a team with three fantastic people were also good developers that were passionate about improving the quality of our code and the product it was being sold as. I was in good soil, and was excited to solve problems with them.
But churn happened, and over the year, in addition to the impact of business health issues, those other engineers left my team, and I ended the year in this pretty passionless state, exhausted from trying so hard to maintain the same level of value production when I no longer cared. I definitely need to make some changes to my trajectory in 2020. 💪
This seems to echo a bit of @phasedephase 's thoughts. Can you elaborate on why financial tech stands out so much, and what "retiring safely" means to you?
fintech stands out because the salaries are stratospheric, although AI jobs now command even higher paychecks (talking 7 figures here). Used to be only the best of the best financial traders would make 7 figures.
by 'retiring safely' i only meant that one never knows when the next financial downturn will hit like in 2008, when the mass layoffs will start... so (1) it'd be good to have enough to weather such an event comfortably and (2) therefore have accumulated enough wealth before a major economic meltdown so that one won't have to depend on an employer to put food on the table and truly be free to decide what to do with one's time.
if you haven't already, watch the movie In Time. a great summary of what i was driving at so clumsily.
atvb
Amen. Reading this brings back some nightmarish memories ;)
atvb
There are too many grammatical errors in the article to read it, even though the material maybe good. The author would do well to address this to get more readership.
Thanks for your feedback!
English is not my first language, I am practicing with it by blogging.
As for the spelling errors, I tried to use Grammarly to check it, but errors still can not be avoided, native readers will find some obvious ones.
Could you give me advice on improving English writing?
for sure, but hey! if english is not his first language... we should cut him so slack.
As with most professions and sports etc there will be natural programmers who have that natural flair and ability to create new things. For the majority of the rest it is all about having that sense of purpose..asking constantly what can be done in this new programming language differently or efficiently than the one you already know.
Thanks for writing this detailed and informative blog for all programmer.. experienced as well as newbee.
Really its very amazing and helpfull articl. I enjoy to read it. Thanks for sharing your ecperience.