I understand that higher education isn't there to teach you VB or Java but to teach you the principles... but IMO it certainly wouldn't hurt if there was some connection to real life.
I came in as someone who had already coded a while. I was best in class in several subjects IIRC, helped others but felt like I could never have a career in Java.
We were never taught how to work efficiently. Or rather: teachers actively restricted access to sane environments.
Code was supposed to be written in an old unsupported text editor.
For many of us this very smart idea teachers has about teaching things "from ground up" has the nasty side effect of demotivating many of the best students to the point where you consider doing something else.
I never even dared to apply for a Java job and only started after being picked up. I remember telling my first boss the truth: yes, I have been coding since I was a kid and yes I have passed Java in school but I cannot program it. Luckily he gave it a try and with good colleagues Java soon became my personal favourite.
I learned the fundamentals of Ruby on Rails with Michael Hartl's tutorial and built an e-commerce application on Heroku from scratch (html/css/js/jquery/postgresql) It featured an admin panel, inventory management, user accounts and a reasonable RSpec test suite. It took me about 3 months of plowing 90hours+/week. I used it as a portfolio application to start looking for jobs. After blasting hundreds of resumes (>600), I got about 20 interviews. None of them worked out except for two unpaid internships which I financially could not accept.
I gave up Rails, but I didn't give up coding, so I asked the internet what was more likely than Rails to land me a job? iOS was probably more niche and more in demand. So I spent a month learning the basics of iOS development with Swift and released 2 apps on the App Store over the following 6 months (build-learn-build-learn cycle), both using Parse, Firebase and a panoply of 3rd party APIs. They were well architected (imo) using fundamental OOP principles, as well as the classic iOS patterns, singleton, observer etc.
This time I sent over 3 thousand resumes over the course of 5 months, all over the world: Canada, USA, Mexico, UK, Australia, Netherlands, Germany, Argentina... you name it.
I got 2 remote pair-programming sessions, which I nailed, I also got about 8 coding assignments, which I completed within hours of receiving the instructions (4 of which never even had the decency to respond or give feedback). All in all response was the same. I even got a couple of absolutely ridiculous contract offers such as building a full fledged real time web and iOS landlord/tenant management system for 2000$, solo.
Without trying to start a pity party, I am now doing manual labor on a curtain assembly line, going door to door after my shifts trying to sell Wordpress websites, which are easiest to setup and sell.
I guess I had to stop coding because I couldn't find a job, because it takes up time I don't have and even though I am passionate about it, passion doesn't pay the bills.
If you really want to code, you need to figure out what libraries/frameworks/tooling/etc are popular in your area, and spend at least a year or two working on open projects which use them; learning them inside out.
The good news is that it's possible. I, and others, have gotten jobs without a degree. The bad news is you need to be damned good to do it.
It's a marathon. Not a sprint. You're looking at 2 to 5 years spending 20 hours a week on this. It will most likely not make you money during this time; so you need to love doing it.
So if you consider that (1yr)x(70hrs/week)=3640hrs falls right into the (2-5yrs)x(20hrs/week)=2080-5200hrs bracket, then in theory I have 'paid' my dues.
Otherwise if you're the kind to factor in the notion that "it takes time for the concepts to sink in", that's another story.
Specifically focus on working with others. Find an OSS project you like and contribute to it significantly. Or, better yet, find an OSS project that companies in your area want experience with and start contributing to that.
If I saw "Active contributor to Angular/D3/Entity Framework/SignalR/Mono/Whatever" on a resume, I'd definitely be interested in talking to that person.
I went totally broke learning to code. Now I have to donate my time to OSS? Something is backwards
If I had the time to be writing code, I would be building out a backlist of ideas I personally have.
Thanks for the input though
If you don't have kids at this point, then I'd go with the Pat Rothfuss method: http://blog.patrickrothfuss.com/2010/02/fanmail-q-advice-for...
If you do have kids at this point, your situation is significantly harder.
That said, if you don't have kids, are you really working/commuting 90 hours a week and don't have 20 to spare?
You're essentially suggesting that I recluse myself even more than I did in the past year, in a low rent city (which in Canada will definitely have 0 tech scene) or far away in the burbs where the commute is long enough that I could code on it. Essentially, to become a full fledged renegade of society.
I prefer the more rational approach that involves being a city, and going to meetups, conferences and hackathons to meet other engineers that are actually working in tech.
Not fair on your part to downplay these efforts by condescendingly calling apps I built "test apps" (what just because I read a tutorial? How did you learn????). You maybe don't realize it, but the only reason you're able to get a job as a self-taught developer is because you're in the US and you have a Bachelor's. That is the way the tech industry works.
IMO I don't think Rails or Swift are the best languages to start out with if you're looking to get a job. Primarily because they are mostly used at Startups or smaller companies and those companies generally want senior coders (as they don't have time to train juniors).
I think the best languages to easily get a job are Java, PHP, C# or C++. There are many enterprises, banks and governments who can't get enough coders for those languages because the jobs are boring and routine and most coders tend to stay away from them, or quickly move on to more fun things after they've gained a few years of experience.
The fact that you know Rails or Swift too won't be a waste. It's still a huge asset to you because hiring managers at these big boring companies are used to seeing resumes of recent graduates who have taken programming for the money, not for the passion. Seeing that you've learnt languages that they don't teach in college puts you above the rest of the field.
As most resumes are screened initially by an HR person, your resume is probably being binned before anyone from engineering sees it because you don't have a degree. This completely sucks but is the reality.
Therefore, your best bet if you're looking to change strategy could be to narrow how wide you cast your net a bit and focus more attention on each individual application. Sounds like you've got passion by the bucketloads and engineers love people who love what they do. So try and find some engineers - are you going to meetups?
Meetups are a great way to get some informal time to meet people from the local community and learn what's in demand and what opportunities are going. More importantly, they're great places to learn a lot of information rapidly for free.
I also just recently started going to meetups. The engineering centric ones are much more scarce where I am than the 'startup business networking' ones unfortunately, but... doing my best!!
I really want to attend a hackathon at some point and really have high hopes that that could be my shot. Maybe I'll save up and try and sneak my way in to one in a big city....
I also suggest apply to fewer targeted companies and tailor your cv to their job spec. Staying honest of course!
Also learn technologies that are easier to market albeit less fun such as Java, JS and C#.
Get a friend who is in the industry to review your cv or attend meet ups and get people there to have a look and give honest feedback.
Having a blog, a github and giving talks would help too.
I wrote about this in article a little while ago if you're interested in the full process I went through. Note (I didn't choose the title for this) - http://www.gadgette.com/2016/02/19/how-i-learnt-to-code-in-a...
Some people can learn everything they need to on their own simply by knowing what they need to look for, if you don't know what you're looking for, the search becomes infinitely more difficult.
Edit: When I say a few other people around, I don't mean in person although that is common. Even just having people who respond quickly to messages or posts on websites will help tons.
For a lack of a better term, I'd call it researching. Expressed in another way, it is the ability to state (and constantly restate in new ways) a problem you are facing. The rest comes from pure grit in refusing to give up.
A few things I noticed from my own journey...
1. Jargon matters:
Learning the "nomenclature" (see, the jargon term for jargon) makes your life so much easier when researching. I recall reading a paper which sought to bridge the gap between biology and computer science, the author's first task was to instruct the reader on the "language of the space" and it was assumed the reader should otherwise be able to learn the concepts quite quickly. Being able to phrase your problem in the language of the field will give you much better leads when looking things up. When you encounter a new term, try to appreciate that term for what it is, avoid trying to constantly translate it back into your own terms, though this is definitely useful for gaining an understanding to begin with. A parallel to learning languages it to "learn like a baby" and to avoid translating a new term back to your mother tongue.
2. All learning is good, no time is wasted. From experience learning and teaching others, there is a mental trap that time spent "looking for a solution" is time wasted - you're not learning your solution and you're not progressing through whatever learning materials you're trying to work through.
This is not a constructive mental feedback loop as it breeds frustration. As mentioned above, research is a skill and time spent researching is practising that skill. You could even argue its more useful as its a far more general than knowing how to solve specific problem X in front of you.
Everyone has been in that stage where you were lost because you had no idea what a "mutable object" was or you read your first null pointer exception and had no idea where to start. Or worse, reading the poorly explained and formatted docs of some unfamiliar software, in an unfamiliar programming language trying to do something for the first time.
My advice to the people who are still struggling in this phase: stick with it, don't be disheartened if other people are seemingly picking it up faster or easier than you, everyone goes at their own pace and as long as you're learning, you're moving forward. Sometimes finding your way to the answer is the bigger lesson than knowing the answer itself.
1. Learned to code some C# in an attempt to distribute some of my simulations to other computers. Had a great time and managed to get something good enough up and running.
2. Tried to pick up Haskell because I liked some of the ideas, and had a few projects I was interested in trying to do in a functional language. Had a bad time and quit after ~2 weeks. The environment and tools were garbage. I thought the old by-engineers-for-engineers software I used to build research models was user-unfriendly, but I guess that was just because I had never tried to work with the software programmers build for each other.
They also include alot of cool timesaving features and are very customizable.
I am a programmer and I have a lot of patience for that stuff. But I don't why I do, because objectively speaking it's crazy to spend hours ingesting this kind of ultra-specific, non-reuseable information.
This is one of the things that I struggle with, much more than actually learning the programming language. I'm embarrassed to admit it because it's part of the DNA of programming environments, and it feels like no-one will take you seriously if you don't love or master the command line to perform tasks in your environment.
But I'll say it, I (mostly) hate the command line for the endless, excessive configuration/installation/tooling/updating tasks that are such an intrinsic (and unfriendly) part of "modern" programming setups. It also feels like there is zero interest in ever changing these things.
Anyone else want to admit they struggle or dislike this state of affairs? Or am I the only one?
But if the IDE or other tools is good enough for what you need to do, then I don't believe it makes a difference.
Along with this, I believe there is a certain amount of curiosity required to continue pursuing programming after a certain point. At first it might be fun, teaching a computer to obey commands, but once a tough enough obstacle is met, does that person want to find the answer and do they take satisfaction once that obstacle is overcome? If the satisfaction doesn't surpass the stress it took to find the solution (for most problems, not all), it seems unlikely that the programmer would like to continue when the next problem appears (which is inevitable).
My new-grad coworkers have more trouble with the build systems, version control systems, deploy systems, and servers than they do with writing code. I think it would be beneficial if more CS programs had a course focused real-world tooling as it is used in the workplace.
All that cruft, wiring, and arcane commands/configurations piled like infinite turtles one on top of the other.
I can't imagine just now jumping into web dev. It must be like archeology. You'd need to go one era-layer at a time to understand what and why things are this way.
It wasn't like this in the bad old days - we created a monster.
I don't find the struggle intellectually trivial at all. Over time you learn many ways to deal with it, and sometimes even get it right on the first try.
Those skills can be fundamentals about computing, architectures, programs, libraries or languages. Sometimes your knowledge of tooling, methodologies or coding styles get you there. After a while you can even apply some profiling to the author(s) something you're using, because "this kinda guy probably did this", "they always do that".
To me reverse engineering things, on every level, is very interesting, and part of the path to being a great (practical) engineer.
Not to mention, if there were a proven stack where everything clicked easily, and stuff just implemented itself, we'd have heard about it.
There are integrated platforms where anyone can get something up with ease, but if they added all the features you'll eventually miss, you'd end up with something as complex as starting from scratch!
I worked through ~20% of "Learn Python the Hard Way", then later, the intro CS 101 of Udacity which has a Python intro, as I wanted to be able to do more then vlookups and complex workarounds for Excel sheets.
My new career is in marketing automation, so I did some tutorials online, and bought a SQL book to pull PL/SQL queries for data segmentation. I also picked up HTML/CSS, but don't have any reason to really use Jscript. I can read it, and trouble shoot in some landing page uses, but I don't need it.
Learning to code was always a supplemental goal for career growth, and I find it fun. I was that IRC guy who loved scripting simple tasks like a music player/displayer, k/b wars, etc.
However, when I'm actually diving into learning actual code, I don't enjoy it. I don't think I'm built for it, just as I don't grok statistics, yet my sibling is a actuarial scientist, but he gets confused about things that come naturally to me.
Being in Marketing Automation, its more relevant for me to do "continued" (outside of work) education not in coding, but in platform research (Eloqua, HubSpot, Marketo), more SQL/data management (I am reading "Object Technology: a Manager Guide), and certifications in these platforms.
I don't particularly enjoy coding other than figuring out a way to automate some boring task for myself or someone else.
I also don't entertain the idea of having to spend most of my free time learning how to comprehend some particular peculiarities of a language syntax and generally keeping track of technology updates.
Also, browsing the internet I realized that with the advent of sourceforge/github/stackoverflow, no matter how hard I try to write some piece of code, it has _always_ been the case that it's already been written and, with minor modifications will solve my problem, whether in the form of a code snippet or a full desktop application.
There are many situations where structured thinking, of the sort that makes for good programming, seems a liability. Ever wondered why many programmers are poor at social interaction and big-picture decision-making?
Seriously, people devote so much time to becoming good at "structured thinking" that they spend less time talking to others, or doing big-picture decision making (the last one is easy - just start making decisions and facing the consequences of your terrible decisions, you'll get better).
Literally everything in the world can be solved through practice. (That's clearly an exaggeration, but its true enough).
I definitely don't think that "programmers" (whatever they are) are any worse at other things by virtue of their talents. They are less good at other things because they have not practiced those things.
I viewed coding as a means to an end. Learn to code-->start a business-->get investors-->pay someone else to code. I didn't care much about what I was learning, only that what I was learning could potentially fulfill other goals. That, in and of itself, wouldn't necessarily deter someone from learning how to code, only...
I struggled learning through on-line tutorials (Code Academy et al). It's not how I learn. That was unfortunate, seeing that coding community spearheads this type of learning. I realized that if I wanted to make it work, I'd have to register for a class. Then I became scared that maybe the struggles wouldn't persist past on-line and I'd be financially committed to it. I wasn't willing to take that risk.
You mention you decided registering for a class is the only way to go, I would like to know if an online video tutorial teaches you to get the basics in a day and offers 100% money back if you aren't happy would you try it and how much would you like to pay for it?
My biggest problem was, I'd get hung up on a problem in some bizarre way. Often times when I'm learning in teacher to student only environment (or machine teacher and student), the teacher will notice the mistake, but have a hard time identifying the train of thought that got me there in the first place. Students have an easier time identifying mistaken amateur thought processes and fixing them. A typical (or automated) teacher is so far removed from amateur thought processes, they have a hard time empathizing.
Where online learning systems fall short is the peer to peer. Yes, there are usually forums where students can communicate with each other. But it is lacking. The biggest problem students have with each other is misunderstanding. In a classroom, sitting next to another student, that misunderstanding usually only takes a few minutes, tops, to resolve. In an online forum, that misunderstanding could take days, frustrating students and forcing them to drop the class.
I'm not sure if a video would help for someone like me. The problem is you're trying to streamline a process in how people learn. But people learn in all different ways. Accounting for all the different ways is hard. While I'm sure your video would work for some, chances are it won't work for most.
Codecademy did a good job though and http://www.theodinproject.com/ too.
EDIT: Also, the job prospects did not look too good because of the fierce competition. What motivated me was doing my own apps/sites (lego for grown-ups), or at least work on a startup, but the required resumes were really daunting. Sysadmin just didn't have the rockstar flavour to it (I think it's a fine job, just trying to convey the fact that a certain air of adventure needed to be present to lure me to stick with it- i.e. the same reason 13 year olds learn the electric guitar).
Use tools, apps, generators, scripts, whatever, to do as much of the work for you as possible. Use a yeoman.io fullstack generator to literally make you an entire webapp with login and security, and then figure out how to fill in the blanks.
Doing it this way, you won't get bogged down in all the technical bullshit to "make something appear on the screen". Let's be honest, you're not writing code for the space shuttle, you can take lots of shortcuts, and then correct your mistakes on a later project.
If you are looking to present something to others as an interface, using tools and frameworks can help tremendously. Your success is likely somewhat based on the perceptions of others, and this requires mixing a few disciplines (design and engineering), so getting what help you can to achieve that minimal level required for people to not reject it outright is important.
If you are looking to transform or create something for yourself, just learning the tool is often better. You want to spider some sites and present some stats on what you've found? Learn Python, Perl or Ruby and that will take you most of where you want to go. You want to write a small roguelike game? Learn whatever language you want and get to it. In many of these cases, learning the intricacies of a full stack and then how you have to tweak it to make it work for your needs mught be counterproductive, unless it's aimed specifically at your need.
Something opinionated like Ruby (which strives to be expressive and terse) or Python (which is very standardised) is a better starting point for new developers.
If you think you might go on to do lots of types of programming then learning python is a great place to start
Check out reddit.com/r/dailyprogrammer if you want interesting things to work on them. A lot of those tasks are not so simple that they can be done in a couple of hours, but not so long as to be crazy hard.
I was a big fan or this one
Another cool tool for learning Python is this: https://conceptcoaster.com/course/python-tutorial/
The primary reason I gave up was that I wasn't willing to accept the amount of effort which needed to be put in to get the level of results that I wanted. I just couldn't comprehend that the skills I wanted to have required years of commitment.
The advice that I'd give would be to understand that this is a huge task. You won't learn everything quickly; even if you're very bright; even if you spend 14 hours a day on it. Those things will help, but they aren't the key.
If you want to be a good programmer you need to love learning. It's not about being clever, it's about being persistent. You constantly need to learn new tools and frameworks, and occasionally new languages. You need to understand the technologies you're interacting with and how they work. And you need to take all those tools, frameworks, languages, and technologies and use them daily.
But mostly you need to invest the time.
Don't give up if you let a big project go because it's too difficult, or don't understand something, or spend two weeks on something you thought would take an hour. Be disappointed, sure. But don't quit.
Keep going. Keep learning. Keep on picking up just a small amount of knowledge or skill each day.
In a year things that now seem complex will be obvious. And that will happen again and again every year that you continue learning. Eventually, your failed projects will turn into completed projects, but it could take years for this to start happening depending on how ambitious the projects were. You can't let that stop you. You just have to keep going despite it.
So keep going. But realize it's a long, slow, life-time commitment to constant learning. It's not easy. Even if you've been good at everything else in life, there's no exception for you. Mastery and skill will only come with significant time and effort. But they will come.
Also learn vim. That sh*t is awesome.
Through out these years it's always been a struggle to learn to code and finish something. I've done some basic problems, some Project Euler, etc. I did countless tutorials, it just doesn't stick for me. I've been through so many languages that I can't even remember them all, name it and there's good chance that I've read a book on it.
It also seems like there is so many tools and programming today is so convoluted and over engineered that I just get overwhelmed. I also don't have anyone to talk about programming, I am just spinning wheels solo and get frustrated when I get stuck.
Right now I am giving my last chance of learning to code. I found out Lisp and eventually Clojure. It seems more straightforward and simple, there are no 'design patterns' to remember and break my head with. I feel like I can slowly build something from bottom up. I have high hopes for Arachne upcoming framework. I hope it will be accessible and I'll be able to make SPAs sites.
But yeah, I feel like I've burned out on this. I just get frustrated with code most of the time when I can't come up with a simple solution.
I ask because I flew solo throughout college simply because it was difficult finding competent programmers at such a small commuter school. I spent some time learning my own things and trying to teach myself. But once I was placed on a solid team at a software company, my rate of learning increased at least by double.
What I'm saying is maybe try surrounding yourself with some folks who have more experience in what you'd like to learn. There are user groups pretty much everywhere for major languages, and meetup.com is a great way to make connections.
I progressed from there to medicore competency in PHP, rails, and c++. Then I went to university to study comp Sci...but almost immediately switched to aerospace engineering, and my coding skills plateaued.
By that I mean I can write basic stuff in all sorts of languages, but I'm miles away from writing a compete program or anything user friendly. Most of my code these days revolves around automating various things in the most sensible language. Where sensible often means something the next non-coding engineer to come along can understand.
I guess I stopped because I knew enough to do what I currently need to do. I'm content that, given time, I could learn to be a better coder. But at the same time I avoid jobs in my industry that are suited to decent coders because I know there are more suitable people for the role.
Every so often try to pick up some "hobby coding" but find that I don't really enjoy it like I did as a teenager.
If you have any trouble understanding it, go to the homepage: https://conceptcoaster.com/course/python-tutorial/ and work your way to magic methods.
and you can call them directly:
Python magic methods are not "magic" but are a very standard part of the language and are well documented.
The reason it clicked was because at the time, a colleague offered to mentor me. This helped since he would assign me cases related to my skill level, show me how to ask better questions, and explain how things worked in context to our tech stack.
I tried many of the free options out there but whenever I hit a roadblock I just quit because I had nothing to lose. I paid $30 or so for a swift course and never stopped because I had paid money. It's a tiny amount of money but I felt like I had to see it through since I paid money. I now have 2 apps in the app store, with another on the way this week likely.
Obviously people ridicule the idea of charging for basic programming tutorials.
I find myself particularly struggling when language walkthroughs get to libraries and code organization. Follow all the paths and dependencies is really tough for me.
Today I'm wondering how code is made into binary and how that flows through the processor and how the logic moves data to and from memory. I'm not sure how I'm going to code anything to represent that, but that's half the fun.
Before that it was games like cookie clicker and candy box.
I think the thing is to find something that interests you. Maybe code your own blog. Or online text adventure. Or multiplayer pong clone.
Part of your problem is that you are trying to do too much. Libraries, code organisation, etc are all fixes to problems. You need the problem first (while you are learning) so write spaghetti code and it's not until you go 'OMG this is hard to understand' then you need to look up code organisation and only then use the minimum that is needed to improve your situation.