Ask HN: How can I become a self-taught software engineer?
But after learning Python then what? I'm not exactly sure where my interest lies or what I actually feel like building. Thus, I'm not sure if I want to go the web route, which seems common to many, or going some different area?
I looked at the Google Software Engineer minimum qualifications, just to get an idea of areas to pursue. It reads: "Experience working with two or more from the following: web application development, Unix/Linux environments, mobile application development, distributed and parallel systems, machine learning, information retrieval, natural language processing, networking, developing large software systems, and/or security software development."
I'm not so fond of mobile development, and web I'm unsure of. From those areas which are most accessible to a non-CS/Math/Engineering degree holder (bachelors in biology)? I believe Machine learning and NLP are more suited to Masters/PhDs? So maybe they are out of the question.
Any advice on how to tackle my journey in becoming a Software Engineer? Maybe an outline on how to approach my learning in steps?
99 comments
[ 7.1 ms ] story [ 210 ms ] threadI've been a self taught programmer for the last 20 years (and by self taught I mean no formal education and just learned everything from experience, books and documentation).
One thing that stands out to me is nearly everything I've ever learned came from not thinking "I should learn Python" but instead "I want to write this app because I need it".
You might want to read this post: https://nickjanetakis.com/blog/how-to-quickly-learn-a-new-pr...
There are many languages, each with their own pros and cons, but Python is a safe bet for your first one. It’s useful in its own right, and it’s also reasonably mainstream in its ideas and techniques, so you can learn a lot of transferrable programming skills. There are plenty of decent tutorials around both online or in book form.
If you’re planning to follow the self-teaching route, I suggest that the single most important thing in the early days is to just keep writing code. The theoretical foundations are useful, and important for a lot of professional work, but IMHO there is no faster or more reliable way to kill a new developer’s interest in the field than to bog them down with “doing things properly”. You have to make stuff, to experience to joy of programming and dispel the illusions about it being some sort of black magic. Everything else can wait, and this way when you do get to more advanced theory and more sophisticated tools and more carefully structured processes, you’ll have enough experience to understand why those things are helpful (or, in some cases, why they aren’t and you don’t need to get bogged down with them).
You have to start with the “Hello, world” stuff. This is trivial, but it takes the important step of writing and running real code on a real system, and therefore knowing that you have the tools you need available. Any tutorial is going to begin at that kind of level in the first hour. But then over the next few weeks and months, my recommendation is to try a few more substantial projects in different areas to see what you enjoy, and for a while, just learn by doing.
If you enjoy things like computer graphics and pretty pictures, and you’re comfortable with math, you could try something like rendering the famous Mandelbrot set, or generating a 3D landscape with mountains and lakes. As a novice, you can probably still write a program to do either of those things within a weekend with the help of online tutorials. This sort of exercise will give you a chance to exercise your basic programming skills, but it will also introduce you to essential ideas like how to use libraries of code that other people have written to do things like drawing on screen or reading data from a file or fetching data from an online source or countless other useful things.
If you’re interested in gaming, you could try something more interactive. Try implementing simple games like snake, 2048 or Tetris. Again, these are projects you can complete within a few days, following a path many have walked before so there are plenty of hints available with a bit of searching if you need an idea of how to get going. These will further exercise your basic skills and use of libraries to avoid reinventing the wheel, and in addition you’ll have to think about how to structure a non-trivial program that has some interactive input and output to deal with.
If you want to try some web development, you can write a simple database application. An address book is probably the classic exercise. You’ll need to learn about a few other tools in addition to the pure programming aspect in this case: you’ll need a server (even if it’s just your own development PC) running both web and database server software, you’ll need to figure out how your Python code fits in with those other programs, and of course you’ll need to know enough basic HTML and CSS to build a simple front-end. That’s quite a bit of non-programming knowledge, but on the other hand, again it’s something you can find your way around within a few days and the experience will be valuable if you ever wind up writing almost any sort of server software, whether it’s sitting behind a web site or not.
If you prefer native software rather than the web but want to try something more substantial, another classic exercise is to write you...
Back when I went to Polytechnic (around 1981) things were a lot easier. If you were into business type computing you did some kind of computer studies degree, which covered things like COBOL and business systems (banks, insurance companies etc). If you weren't into that scene you ended up like me in Electronic Engineering. I was fascinated by electronics to the point where I knew I had to study it. Then if you were into microcomputers you bought yourself a Z80 and a few TTL chips and built one. Now there are a multitude of things to go into to the point where your options are almost endless - which probably leads to "analysis paralysis" in many cases...
Which brings me back to - why do you want to become a software engineer?
I would start by taking a long hard look at your interests and aptitudes. Software engineering can be merciless if you don't have the aptitude for it and interest in it.
You could dip a toe in by learning Python. Actually the book you mentioned is very good as it shows you how to do practical things in Python - I have found it a useful source of reference. You wouldn't have to work through all of it. You could maybe use it to whip up a simple web scraper or process some data from Excel and just see how it feels. In some ways when you are starting out it doesn't matter too much what you do as long as you do something.
One final thing - you didn't say where you were starting from. Did you imply you had a degree in Biology? It's not fashionable to say it these days but by far the majority of software engineers I meet today have what you my call "traditional" backgrounds in that they came in through getting a degree in some kind of software/comp sci subject, and possibly a masters. Sure there are a few hot shot self-taught programmers around but in my experience they are the minority.
p.s. I shifted out of electronics and into software development by teaching myself TurboBASIC and then C and assembly language, and then went to work as a software trainer and later engineer, so it can be done.
You don't need to learn a specific language as much as you need to learn basic concepts to begin with and the Raspberry Pi project offers great resources for that along with language specific resources to play and learn with.
And don't let the "it's for kids" angle put you off. Yes, the project does focus on teaching kids to program and integrate hardware but most of those computers are sold to adults who use them to "hack" and learn and develop on, and yes, we adults use and learn with the same resources "kids" do.
https://www.raspberrypi.org
This book is co-written by Eben Upton, founder of the Raspberry Pi Foundation:
Learning Computer Architecture with Raspberry Pi: https://play.google.com/store/books/details?id=9aTkDAAAQBAJ&...
Mastering the Raspberry Pi:
https://books.google.com/books?id=1FUnCgAAQBAJ&printsec=fron...
This is a post in their user forums with links to additional resources:
https://www.raspberrypi.org/forums/viewtopic.php?f=72&t=7226...
Your link will give the direction but not the encouragement.
Good luck ;-)
The first question is: What is the sum of the numbers from 1 to 1024. Please use Python, not the Gauss/two-triangles-make-a-rectangle mathematical method.
* - “obnoxious” means it's a leading question: it's simple to state, but you might have to learn a bunch of crap to even really fully understand the question.
Sample far-future questions: - Does it seem magical that you can turn an NFA into a DFA? - How does a shell pass stdout from one process to the stdin of the next? - Why is the Frame Pointer technically unnecessary, but useful? - Why do people complain about Go's nil pointers? What's wrong with them?
What they're asking for is a syllabus.
Anyway, the author was posting google requirements. More than 80% of google developers have a master or more.
Instead, here some numbers showing that 76% of ALL Google employees have a degree. https://www.cnbc.com/2017/07/28/this-tech-company-has-the-mo...
The saying that one doesn't need a degree to get a tech job is nonsense. Do the test: Ask one guy working in one of the major tech company how many of his direct neighbors have a degree, most likely it's all of them.
> The saying that one doesn't need a degree to get a tech job is nonsense.
These statements directly contradict. 24% of ALL Google employees don't have a degree.
> Ask one guy working in one of the major tech company how many of his direct neighbors have a degree
I know that I was hired into my current role without having a CS degree at the time [1}, based solely on my open-source portfolio.
[1] I now have a BSc in CS because I work part-time and attended university in parallel.
Furthermore, that's the statistics for the whole company. It's higher for tech jobs. It's higher for younger folks. It's higher in countries where degrees are affordable.
There's definitely value, meaning, and importance in the engineering degree and certifications.
I... I never thought of that geometrically. but your way...
that makes so much sense!So, the sum of 1..1024 is: 1024 * 1025 ÷ 2 = 524800.
Your way, the doubling is obvious, so you see why you can always /2 at the end.
Hmm. Haven't thought about this stuff in years. This was a pretty pleasing thing to revisit.
Actually, I came here to post the correction rodorgas beat me to posting. But your diagram works too: 1/2 base * height… nice.
This will be slow, painful and frustrating at first, but if you spend the time banging your head against the wall now, and are truest motivated, it will take you where you want to go.
Best of luck! It will be hard, but if you program every day for a couple months you will absolutely be on your way to becoming an engineer!
Genetic algs: https://blog.sicara.com/getting-started-genetic-algorithms-p...
Boids: https://processing.org/examples/flocking.html
Neural nets and deep learning: http://neuralnetworksanddeeplearning.com/chap1.html
Second, I would just start small. Automate the boring stuff will get you in the right mindset for being able to factor out repetitive tasks by thinking about them as algorithms. In my opinion, algorithms are the original essence of what makes computer science a science: it's what Church and Turing (two google-worthy figures in our fields history) first formalized on their pursuit to define what it means for something to be computable.
Once you can break a problem down into an algorithm, you can write a computer program to solve that problem. That is the power of writing code: if you can understand it algorithmically, you can delegate the task to a machine. This takes time and lots of practice!!! I would focus on trying to do this over and over until it's natural. Once you feel comfortable in Python, try learning another language and see how much easier/harder writing programs in that new language becomes.
Third, you shouldn't feel like Machine Learing is out of the question. http://course.fast.ai is a MOOC specifically designed to prove that ML is indeed something anyone can play around with. (I'm just beginning the course, and I'd recommend it after a year of coding under your belt and have a good comfort with using a unix-like terminal).
Good luck, and keep practicing!
You'll learn faster if you follow things that are interesting to you. Don't learn something just because you think you have to (in less you absolutely cannot progress without getting past that obstacle in your understanding). This way you'll end up with a body of knowledge that relates to your interests and experiences. Use that to branch out more tendrils of knowledge. Its a very fractal-like growth process.
I follow what i call Just in Time Learning, I learn what I need to get the job done. I started with graphic design transitioned to web and application development, and currently an cloud infrastructure engineer. Leverage expertise you develop in one field to move to an adjoining field. Currently playing with cryptocurrencies and ML.
Leaning for the sake of learning is boring and imo; at least for me, not very effective.
https://github.com/ossu/computer-science
I want to preface this by saying that you do not need to be a CS expert to get started in software engineering. Do not buy into the hype. Sure, you'll need to know a few basics, but there are plenty of successful engineers out there who majored in quantitative / logical fields, who definitely do not know the equivalent of a CS degree's curriculum, and they're doing just fine. Indeed, there are a few successful engineers who didn't even go to college.
So the deep CS background is optional, but the following is not: are you the kind of person who enjoys and is good at solving puzzles? Will you persist after hours of bashing your head against the wall? You must have this character trait to succeed as a software engineer.
Assuming you have it, you should start with web development in Python / Django:
- The ecosystem is mature and beginner-friendly, meaning you can dip your toes in the water by using well-built, well-documented libraries that the community has put together over thousands of man-hours.
- The results of your programming will be concrete -- you can interact with the product, and find bugs, as a layperson.
- You can program something basic without any CS training. The libraries you will use to build your web apps will be leveraging plenty of CS concepts, but these concepts will be hidden away from you.
To learn Python syntax, there are a lot of different ways a beginner can go. I would recommend Code Combat for a complete newbie: https://codecombat.com/.
Once you have the basics of Python down, look for tutorials on the internet for building web apps in Django. Build simple web apps until you:
- Know how to think in Python.
- Understand the basics of relational databases and SQL.
- Understand the basics of HTTP / HTML / CSS.
Then, read a book on code craftsmanship, like "Clean Code," and reflect on how ugly the code is in your first few web apps. In the professional world, you'll be expected to adhere to standards of cleanliness and code organization, so refactor at least one of your web apps using the principles that you've learned from the book.
Only after you've determined that you can handle the above, you can start exploring the basics of CS. Harvard's CS50 is a lovely course, but there are more practical courses, for your purposes, on Coursera - namely Algorithms courses. I would recommend Princeton's Algorithms courses by Wayne and Sedgewick. Their courses are a bit less theoretical than the equivalent Coursera courses from Stanford, which is a good thing for someone in your position. I remember Sedgewick's instruction being very clear, yet rigorous. I believe the course requires you to learn basic Java, but given the programming experience you've built up to this point, you should be ready to dip your toes into compiled languages.
---
This entire process can take as little as a few months depending on how sharp and motivated you are, and it's only a first step. At this point, you can continue your CS education if you're really interested in the field. But if you're looking to land a job ASAP, you're better off building up your portfolio, and making sure you really understand the basics of data structures and algorithms.
Furthermore, you should network at coding meetups. Look for a potential manager who is willing to work with a relative newbie such as yourself. I was lucky enough to find one early in my career, and it helped me immensely.
From this point forward you ought to pick one thing and build stuff. When I say pick one thing, I mean one learning resource at a time. Whether it is "automate the boring stuff" (which is a great resource I haven't read) or one of the resources that I'm linking to (they are different resources that have been suggested on HN in the past), or a suggestion from another comment. Pick one and work on it. It's all about making a decision and sticking to it until you have enough information to make a better decision.
Find someone you can talk with about this stuff. It can get lonely if you don't know anyone who knows about this stuff. I'm available and would even work on some of the material or courses with you, especially the last two links.
As another user mentioned somewhere below, you will feel like bashing your head against the wall. He/she wasn't kidding. Once you get past that feeling, which will take a very, very long time, you will have overcome the hardest hurdle.
https://github.com/MichielDerhaeg/build-linux/blob/master/RE...
http://exercism.io/
https://mitpress.mit.edu/sicp/full-text/book/book.html
https://github.com/ossu/computer-science/blob/master/README....
Edit: for anyone else in OP's shoes, feel free to contact me as well.
Let's break your sentence down.
"How do you start a new/big project? Lets say I want to read a codebase on github which is written in js. How doI go through it, given that I don’t know much js yet?"
The first part about how to start a new big project has nothing to do with reading a codebase. And the part not knowing much js yet means you shouldn't be starting a big project. You could, if you wanted to. Heck, I've done it but nothing good has come out of it besides learning that, baby steps are sane steps.
So, we have two questions. 1- How to start a big project? (whatever big may mean to you). 2- How to read a codebase.
Reading a codebase will help you understand project structure. It will also help you, that is, if you find a line of code you don't understand, break it down, research what it does and continue reading, improve your coding abilities. In short, how everything ties together. That practice will help you understand how to start a new project.
But the first step you ought to take is, if you are going to go down this road, is to learn how to ask questions: https://stackoverflow.com/help/how-to-ask http://www.catb.org/esr/faqs/smart-questions.html
1. Side-projects are your route into the industry. You're looking for a company that's willing to take a risk on a non-traditional candidate and showing that you can deliver something is huge. Find a problem that you enjoy and solve it to a high level of quality. A lot of software engineering is being able to put in the effort to actually get something to a shippable quality.
2. If you're near a metro area, network. There's tons of meet-ups for various technologies, find one that interests you and attend. Your biggest barrier to getting through HR is the lack of a degree, having a direct connection to someone gives you a very good chance to bypass it.
it would help to do this in parallel with some form of employment, as working will teach you practical software engineering skills that you'll never get from reading books. but you'll be more time-constrained, so you'll have to have really good time-management skills.
also, being around good engineers is a form of education. good co-workers can help expose gaps in your knowledge and skills, which you should strive to amend.
Learning basic computer organization (through nand2tetris - highly recommend this project!), while cultivating your intuition for what's possible in the world of data processing/manipulation (by learning algorithms and data structures, and the formal language of how to reason about complexity in this domain) will give you a huge advantage over the school of people who refuse to ever delve into the "implementation details" and just abstract everything away.
Learning the fundamentals of operating systems, networking, and database theory, IMO, also pays off immensely. I can't tell you how many thousands of engineering hours I've seen wasted because of engineers I've worked with who haven't taken the time to learn these primitives making horrible decisions in either "using the wrong tool for the job" or not even having the knowledge to reason about the feasibility of a proposed solution... and this is at a "big 4" company.
It's a lot harder to buy into "hype", or be sold on bullshit in this industry when you're able to decompose a system into its most fundamental elements and have the tools to reason about them.
Pick a project. Don't spend time agonizing over what sort of project it should be, you'll find out if you like it or not once you've started doing it, and if you picked the wrong project or language you'll better internalize the reasons why by actually ramming your head against those things yourself.
I'm going to disagree with the majority here and say don't pick a small and manageable project. Pick a project that inspires you. As long as you can maintain the motivation and actually put fingers to keyboard over and over again, that's all that really matters because even when you fail you'll learn. More importantly, you'll be forced to realize how large projects must be broken down into smaller projects and tackled piece by piece, and you'll gain a much deeper appreciation for the sheer amount of work the things you want to do really take. If you're anything like me, you're going to fail your first project, and your second, and many after that, but you will learn something invaluable every time.
Consume the opinions of programmers voraciously. Not just one programmer, read as many conflicting opinions and ways of tackling problems as possible. Read HN. Read stackoverflow. Read github comments. Programmers are deeply passionate about various aspects of programming, and understanding why is an important part of growing as a programmer.
Realize that everything you could possibly seek to understand is publicly available on the internet, if you know where to look and who to ask. Everything.
I have more opinions on this, but since it seems we all do I think I'll cut my advice short there :P.
That's all very well, but until you have experience of languages and associated tool chains, libraries etc plus knowledge of OS stacks, networking and so on its difficult to know what is possible and how you'd go about achieving your goal
I'll save everyone some time. Everything software related is possible.
> how you'd go about achieving your goal
Find some code where someone did something similar, look at it, write your own implementation that does what you want.
The way I got into this field was by writing mods for games. Very narrow scope you can play with so it keeps things simple for beginners.
Not at this point for OP. These conflicts can also cause a lot of confusion
As an inspirational story, I built my first programming language at age 12. It was closer to Brainfuck than to C, but I built a compiler (in Visual Basic) that transpiled to 16-bit x86 assembler (I learned just enough from assembler tutorials on the internet) and ran that through NASM.
I remember that I worked an entire afternoon (possibly longer) on a program that was the equivalent of
because the language was so ridiculously limited, but getting it to work (and an actual .exe file to show for it) was immensely gratifying.Thinking about it, that language was actually the only one that I ever finished. As I learned more about language design etc., my designs grew much more grandiose than my freetime permitted.
Also, "most coveted" in this case may be big companies
Don't exclude yourself based on preconceptions. Here's a great resource: http://datasciencemasters.org/