Hey Hackers,
Anyone able to give me some direction on how to become a software developer?
Like what do I need to learn, and how?
Cheers
Hey Hackers,
Anyone able to give me some direction on how to become a software developer?
Like what do I need to learn, and how?
Cheers
How to get there depends on where youâre coming from. Judging from your posting history you seem to be a talented sysadmin, so Iâd leverage that. The âdevopsâ movement has exploded and there are tons of opportunities for people who can bridge those two worlds.
If youâre a self-motivated self-learner, all you need to do is find an open source project that you already know quite well, and start contributing. That could start off as reporting/triaging bugs, improving docs, fixing typos in comments. Follow along what the other contributors are doing, read their patches for issues you helped report, try to understand the fix. Then try fixing one yourself. Follow that path and youâll likely get a few mentors and a bunch of experience.
An easy project to start yourself is: pick an API you know well, pick a language, make a library for consuming that API. Study libraries that already exist for similar APIs, and study libraries from other languages that consume the same API. This is why I am the maintainer for PyZabbix, even though I havenât used Zabbix in years.
If youâre a social learner, then start going to our local polyglot meetup. In particular there is a Hack/Study/Mentor Night every month.
If youâre a classroom learner, well, then I dunno. I did a CS bachelors that has served me well, but thatâs a pretty big commitment. There are probably lots of great courses at VCC, online, etc.
Good luck!
Thanks @lukecyca. Iâm trying to head into the âdevopsâ direction, but my software skills are lackin.
There are a number of different ways that work to become a developer.
But the question begs more questions.
What you should do and where to start depend a lot on where you are and where youâd like to end up.
I can tell you about my personal experience which was fairly common. I went to school, got a degree in Comp-Sci and the got a job in the industry. But there are likely a number of different routes depending on what you want.
Since graduating (over a decade ago) Iâve been writing low level systems code in the video games industry. So lots of C/C++, embedded systems (fixed/cpu memory) development, performance centric work. Its a good industry in my opinion as there are few areas of the field that arenât used in some way (graphics, audio, databases, AI, machine learning, physics, network, web-tech, etc. its all in there)
Iâm sure there are a number of other developers in the hackspace in different areas of the field with useful advice.
Whatever is most employable
Yes.
Lots
Iâm a 4th year SysAdmin. I bash script.
Iâm really looking for a list of directions. Like for Sysadmining Iâd say do the following:
-set up a vmware esxi cluster
-set up a xen cluster
-setup a kvm cluster
-setup microsoft AD
-setup DNS server
-setup openLDAP
-setup zabbix
-setup openVPN
-setup pfsense firewall
etc
This is pretty broad but is sounds like youâre open to doing very different kinds work. Is DevOps something you really are interested in getting into or is it because its adjacent to what you do now and seems more achievable.
Lots is hard to quantify but it sounds like you might be pretty serious about it. The next question would be what are you willing invest in yourself (time/money)? Would you consider going back to school full-time? School is not a requirement and certainly doesnât prove you know what youâre doing. Depending on the type of work, many employers wont even consider you a candidate to interview unless you have a degree or extensive experience (and usually both). So the self-taught person not only needs superior discipline to succeed, theyâre probably facing an uphill battle in terms of convincing others even though they technically took the harder route.
If youâre going to invest years of your life in this endeavour, then it makes sense to go for some kind of accreditation as well. Good schools will have a co-op program where you get experience via work terms which I would highly recommend. That way, you can leave school with ~2 years of real world experience to get you started. Having previous related experience before going to school can give you an edge in many courses as well as landing better co-op jobs.
Obviously this would be a huge decision and there are other factors (family) to consider, but going this route would open the most doors for you.
A very rough list of what a core degree might include:
CS:
Math:
Iâm sure thereâs a bunch Iâm missing too. But some of these are just a list of things to learn about. This isnât advice on how to actually learn it. We could spend a lot more time on each point to give you more specifics on how to make that actually happen and teach it to yourself.
Maybe thatâs a lot deeper than you were planning on going into software development. Or maybe youâre interested and have more questionsâŚ
Thanks a bunch @pmcmorris.
Would be greatly appreciated if you pointed me in the right direction. Like I want to learn C, and Iâm guessing I should write something in C, but I have no idea what I should write.
Like when someone asks me about getting into networking I usually tell them to flash a couple routers with openwrt and setup a repeater.
It sounds like strange advice, but I wouldnât worry to much about deciding what to exactly write. There is usually a big disconnect between what is good for learning and what is actually useful. With the wrong attitude you could quickly become frustrated by an inability to achieve overly ambitious goals. Instead, just try to focus on enjoying the process and celebrate each thing you learn. So donât focus on things like trying to draw stuff on the screen or make sounds just yet. Choosing tasks that are at your level but still âfunâ while you learn the basics is an art form.
As for where to start, it sounds like youâre a very hands on kind of person in terms of how you learn. Thatâs a great strategy for most things and gets you up and running quickly. Just make sure that you round it out with study habits that help you succeed when faced with problems where that approach doesnât work well.
Probably the most important habit for a someone in software is to read on a regular basis. Iâm not talking about light things like blogs, tutorials, and walk-throughs. I mean more comprehensive sources (technical books, journals, white papers, etc.) and a more methodical and thorough approach. For example, pick a book at your level that contains something that you want to learn and read it. The whole thing; cover to cover.
For the purposes of learning, I would avoid making a big distinction between C and C++ (even though C is much simpler). Odds are youâll encounter objects, classes, templates, etc. as soon as you start reading code out in the wild and its better to be able to read it and understand what the code does (even if you choose not to use any OO features in a particular project).
Here is a mission for you. If youâre serious about this, go buy this book right now.
http://www.amazon.ca/Sams-Teach-Yourself-Hours-Edition/dp/0672333317
Read it cover-to-cover like a story. Preface, Appendix, everything. Eat it up. It could set things in motion and change your life. It did for me. ![]()
Pick a project, pick a programming language, and start coding up a storm.
You will need a reference manual for the language, and a tutorial to start.
Once youâve mastered one language, repeat with other languages.
Wow on the Samâs book, I still have the first edition of
Sams Teach Yourself C++ in 24 Hours
sitting on my shelf and never even read it, just got too busy with other
projects. Thatâs why I donât do any programming these days.
Harondel J. Sibble
Sibble Computer Consulting Ltd.
Creating Solutions for the small and medium business computer user.
harondel@pdscc.com (use pgp keyid 0x3CC3CFCE not 0x3AD5C11D)
http://www.pdscc.com
Blog: http://www.pdscc.com/blog
(604) 739-3709 (voice)
Not sure if that fits here or not, but hereâs 2 cents from an academic work environment.
We often have projects where we interact with biostats or bioinformatics people to develop scripts/algorithms for a specific analysis. Which is mostly done in R or Mathlab.
The single biggest challenge and bottleneck is the design and implementation of stand-alone user interfaces once scripts have been developed. Because for biostats the work is in the model/script development and not in the rest, so they move on.
There is several cases we had to hire people to take previously developed scripts and redo analysis on new data because we just donât have the programming skills in the lab. And that is usually starts at a minimum of $100/h, a least the pool of people we usually use.
@Toma I just started taking a few courses on www.edx.org including an intro to comp science. Awesome and free. I highly recommend the intro to comp sci course CS50. http://www.edx.org
I have a friend who did an 8 week learn-to-code bootcamp at Lighthouse Labs in Vancouver. They teach you the basics of how to do either web dev or iOS dev, it seems, and then you get a job. Seems sort of absurd from the perspective of someone who did the BSc route, but apparently there are companies who are happy to hire beginner programmers.
If you like online video and/or interactive training, there is pluralsight.com and itpro.tv, both of which are paid but have introductory promotions/trials that they advertise on podcasts.
There are also interactive learning sites like codecademy.com, and free online video courses from schools like Harvard. And then if you want example problems to solve, thereâs projecteuler.net (if math is your thing), topcoder.com, and uva.onlinejudge.org.
@sQuatch, if your programmer pool runs dry (or runs you dry), feel free to give me a ping! Iâve done some work for grad student friends who had a lot of analysis to do in R.
But I donât know what to write. Like Iâm stuck in a position where I lack knowledge and I donât know what can be done or canât be done. So⌠I donât know what to write. Could you list some examples of what I could try to accomplish?
What is the actually useful stuff that I should learn?
This the one? http://www4.comp.polyu.edu.hk/~csgeorge/eng2002/ref/C++in24hours.pdf
Thanks a bunch!
Learn best practices.
The last one is one that âclassicallyâ trained software devs ( ie, people with CS degrees ) seem to have the most trouble with. It doesnât matter if youâve got an idea for an elegant Factory Builder Distrubuted system that you can code from scratch if itâll take you three months past the deadline to deliver â what matters is that the code is done on time and as bug free as you can make it. Donât get me wrong, I care about technical debt and having nice easy to understand code; but if the choice is between writting a crappy hack and having it done on time or spending way more time on the âelegantâ solution, choose the crappy hack. It really helps to work somewhere that understands this, so that theyâll let you budget time to go back and clean up ugly stuff later.
Another important thing: know how to communicate. It doesnât matter if you could code an AI in your sleep; if you canât justify your decisions on why you do things they way you do, or why you chose to implement something a certain way youâll either eventually get canned or stuck on a project that is boring and doesnât matter. If your software team lead doesnât agree with the way you do things itâs up to you to convince them â remember, just because youâve written something doesnât mean that someone else can see the value in it. Learn how to convince them that the code you wrote has value, whether itâs business value or coder value ( ie, makes money or saves other coders time later ).
Lastly, remember that all the code you write as a software dev is going to be for a business. Be prepared to scrap at any point due to shifting priorities. Be prepared for non-coders to not understand the difference between a simple problem and a complex problem. Be prepared for clients not knowing what they want and complaining when you deliver exactly what they asked for ( related: be prepared for projects to drag out because clients donât understand how much time it takes to do something and keep asking for changes ). Be prepared to work with people who couldnât code their way out of a paper bag, people who think theyâre the best coder since Woz ( and arenât ), people who think theyâre okay programmers ( but are as good as Woz ), and people who are expert beginners.
Being a software dev can be super crazy frustrating, but it can also be pretty damn rewarding.
To be good at programming you need 2 things. To understand the language
grammar and programming patterns.
To really understand language grammar, you need to understand token
parsing.
Once you understand Programming Patterns / Data Structures, try
implementing the programming patterns in different languages.
Be comfortable with SQL. Nearly every useful project talks to a database, and SQL is an easy language to become competent in. Donât call yourself a Database Admin unless you have done at least some structured learning on the subject. You should know what B-Trees are, the performance characteristics of the different key types, and have some idea of how a DB system interprets and executes your query. Learning algorithms/data structures/computational complexity first is recommended.
Become a RegEx expert if you havenât already. I use it all the time, and itâs allowed me to find files, reformat data, and clean up code in a way thatâs easily 10x faster than without it. Be prepared to learn multiple variants of RegEx, and create a cheat sheet for the ones you use most. For example, grep, Notepad++, Visual Studio IDE, .NET Regex library, and MS Word all have slightly different flavours of regex. Youâll probably want to learn the grep-compatible version first.
Javascript is unavoidable if youâre doing any sort of web-based development. I donât recommend that you learn it as your first programming language (itâs very poorly designed and a shame that itâs become so pervasive), but at least learn to read and edit it. If you find that youâre using it a lot, then take the time to actually learn it. I used javascript on the side for years before actually learning it, but got into it seriously because now every computer comes with a top-notch javascript debugger preinstalled (in the web browser).
Take note that nearly every programming language where you end lines in a semicolon is an Imperative programming language. Examples are C, C++, Java, C#, Visual Basic, Python, Arduino, Processing. Chances are, if you know one of them well, youâll be able to read and understand all the others (with a little assistance from google). Becoming an expert in many imperative languages will not grow your understanding nearly as much as if you choose a language from a different paradigm. Iâd personally recommend something like Python to start with, as itâs got great community support, is legitimately useful, is cross-platform, is easier to get started in, and is harder to make a mess of. But some people feel that learning must be painful to be effective. ![]()
SQL, RegEx, HTML are all examples of Declarative programming, so youâll probably have that covered pretty well. Functional programming includes Lisp, Scheme, Haskell, F#, etc. Although these languages are rarely used in the real world, they are incredibly fun and will show you different ways of approaching and solving problems. I had a much deeper understanding of Java after taking a Scheme class, and judging from the uproar when the teacher broke it to the students that Java doesnât do pass by reference, I was not the only one. ![]()
Also, everyone has been giving a lot of good advice, but the magnitude of it is a little overwhelming. Iâd say that <5% of coders could legitimately say they have a strong grasp on 90% or more of the recommended learnings here, and the rest rely on ad-hoc learning, google searches, or their peers to fill in the gaps. If you learn 70% (of course, it needs to be the right 70%), youâll be very employable.
Also, learn to comment well. A programmer who doesnât comment well is like a sysadmin who doesnât have an inventory or instructions on how to rebuild the environment.
Personally I found it was necessary to learn tools to be a better
programmer
programmable editor such as vim, emacs
bash, regex you need to understand these be good at git
learn to use make in your bash scripts
you need to know gdb and understand how gdb effects program execution
If syadmin is your game, than bash, perl, regex, git, vim (programming)
sql, javascript, basic html, xml, jason, gdb
If firmware is your game, you will never see javascript, but you will use
jason and lisp as an api language. You will need to know how to implement a
basic database. And understand locking very well and how to avoid locking.
Awesome advice here all around. Itâs important to know what the good tools are and how to use them but I find often the WHY we use them is overlooked and is what really makes learning programming difficult for a lot of people. This sort of revolves around your questions about what to make? Purpose - the why of programming.
Fundamentally, computers and their programming languages are tools designed for the manipulation of data. These tools themselves have constraints, but also, the data problems we try to solve play an important role in shaping how we use/implement these tools. These aspects explain most of the quirks and why programming languages are the way they are. Given the fact you have extensive knowledge and experience with computers already goes a long way to more deeply understanding the way certain things are but itâs also important to understand the fundamental data problems in order to get the complete picture.
A concept you are familiar with, virtualization, is important and prevalent because the above gets very complex so we assemble these abstracted yet idealized worlds to try and control these constraints so we can focus on the data problem, not the tool constraints. There are a few programming languages that I feel do well to abstract a lot of these tool problems but donât separate you too far from the metal while at the same time implicitly and explicitly structure themselves around the data problems you are trying to solve. Java and C# are ideal languages to start learning. (C/C++ is ok too but Java/C# have less cryptic syntax and have more intuitive libraries and APIs)
That said, I would argue software development is not a sum of the tools you learn but the thinking behind how to solve problems. Focus on learning things that will better enable you to understand the problems software tries to solve.
Iâd say study, logic, maths, accounting, stats, physics and practice solving problems in those subjects with Java or C#. Once you start to get the hang of doing math and data transforming and talking to the computer via a compiler and using APIs then start to learn more about the deep relationship with the machine via C/C++ and dive deeper there if hardware itself appeals to you. (Languages like Javascript, Ruby, PHP, etc hide so much of the fundamentals from the programmer that in the early stages might do more harm than good in my opinion when it comes to learning computer sciences.)
All that said, a list of stuff to practice;
Trying to solve those above problems will make you think about which tools you might use or what programming language syntax you need, etc a software developer will either have an idea how they might solve them with which tools and if not do some research to find the right one for the job. We just keep doing that over and over and eventually start getting really good at it
Pretty much all software is related to at least one of those above items and they just get more complex the prettier (UI) and smarter (AI) they get.
If you start on one of those above tasks, just keep thinking, how can I make this more efficient? Prettier? Faster? Smarter? And thatâll take you down the right path.
In some respects I would say itâs more valuable to study software design patterns than languages themselves. Most programming languages can be learned in a few hours. Itâs learning their libraries that take time so just pick one language that you like and get a hang of the concepts it employs and what the libraries are trying to do and then learning new languages is pretty trivial.
At the end of the day, if you can afford it (time/money), go get a CompSci degree. You learn a lot, make valuable relationships and in a software devâs career things come easier and can open more doors. Just really consider the time cost, 3-4 years can be aeons in the tech world (you already know this).
Also, knowing you personally, youâre already a creative problem solver and resourceful, these are key in becoming a good dev. Just start thinking about solving those problems with software and youâre on the right path. (The thinking of how do I connect the I/O of these commands into something that does X shifts from thinking about commands and existing apps to thinking about programs you can write and using libraries. Iâd challenge you to do all of your linux CLI stuff via libraries and function interfaces instead of all the little commands you use together now. This is especially valuable in Windows environments; as a programmer you have way more control in windows via libraries).